Add new stuff

This commit is contained in:
ViktorBarzin 2018-02-14 00:00:02 +00:00
parent 69661de82f
commit 07744f6823
333 changed files with 1989 additions and 6 deletions

View file

@ -0,0 +1,101 @@
This is a mirror of http://www.vim.org/scripts/script.php?script_id=1879
Repository:
https://bitbucket.org/ns9tks/vim-autocomplpop/
Issues:
http://bitbucket.org/ns9tks/vim-autocomplpop/issues/
Download latest(development) version
https://bitbucket.org/ns9tks/vim-autocomplpop/get/tip.zip
==============================================================================
INTRODUCTION *acp-introduction*
With this plugin, your vim comes to automatically opens popup menu for
completions when you enter characters or move the cursor in Insert mode. It
won't prevent you continuing entering characters.
==============================================================================
INSTALLATION *acp-installation*
Put all files into your runtime directory. If you have the zip file, extract
it to your runtime directory.
You should place the files as follows:
>
<your runtime directory>/plugin/acp.vim
<your runtime directory>/doc/acp.txt
...
<
If you disgust to jumble up this plugin and other plugins in your runtime
directory, put the files into new directory and just add the directory path to
'runtimepath'. It's easy to uninstall the plugin.
And then update your help tags files to enable fuzzyfinder help. See
|add-local-help| for details.
==============================================================================
USAGE *acp-usage*
Once this plugin is installed, auto-popup is enabled at startup by default.
Which completion method is used depends on the text before the cursor. The
default behavior is as follows:
kind filetype text before the cursor ~
Keyword * two keyword characters
Filename * a filename character + a path separator
+ 0 or more filename character
Omni ruby ".", "::" or non-word character + ":"
(|+ruby| required.)
Omni python "." (|+python| required.)
Omni xml "<", "</" or ("<" + non-">" characters + " ")
Omni html/xhtml "<", "</" or ("<" + non-">" characters + " ")
Omni css (":", ";", "{", "^", "@", or "!")
+ 0 or 1 space
Also, you can make user-defined completion and snipMate's trigger completion
(|acp-snipMate|) auto-popup if the options are set.
These behavior are customizable.
*acp-snipMate*
snipMate's Trigger Completion ~
snipMate's trigger completion enables you to complete a snippet trigger
provided by snipMate plugin
(http://www.vim.org/scripts/script.php?script_id=2540) and expand it.
To enable auto-popup for this completion, add following function to
plugin/snipMate.vim:
>
fun! GetSnipsInCurrentScope()
let snips = {}
for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
call extend(snips, get(s:snippets, scope, {}), 'keep')
call extend(snips, get(s:multi_snips, scope, {}), 'keep')
endfor
return snips
endf
<
And set |g:acp_behaviorSnipmateLength| option to 1.
There is the restriction on this auto-popup, that the word before cursor must
consist only of uppercase characters.
*acp-perl-omni*
Perl Omni-Completion ~
AutoComplPop supports perl-completion.vim
(http://www.vim.org/scripts/script.php?script_id=2852).
To enable auto-popup for this completion, set |g:acp_behaviorPerlOmniLength|
option to 0 or more.
==============================================================================

View file

@ -0,0 +1,431 @@
"=============================================================================
" Copyright (c) 2007-2009 Takeshi NISHIDA
"
"=============================================================================
" LOAD GUARD {{{1
if exists('g:loaded_autoload_acp') || v:version < 702
finish
endif
let g:loaded_autoload_acp = 1
" }}}1
"=============================================================================
" GLOBAL FUNCTIONS: {{{1
"
function acp#enable()
call acp#disable()
augroup AcpGlobalAutoCommand
autocmd!
autocmd InsertEnter * unlet! s:posLast s:lastUncompletable
autocmd InsertLeave * call s:finishPopup(1)
augroup END
if g:acp_mappingDriven
call s:mapForMappingDriven()
else
autocmd AcpGlobalAutoCommand CursorMovedI * call s:feedPopup()
endif
nnoremap <silent> i i<C-r>=<SID>feedPopup()<CR>
nnoremap <silent> a a<C-r>=<SID>feedPopup()<CR>
nnoremap <silent> R R<C-r>=<SID>feedPopup()<CR>
endfunction
"
function acp#disable()
call s:unmapForMappingDriven()
augroup AcpGlobalAutoCommand
autocmd!
augroup END
nnoremap i <Nop> | nunmap i
nnoremap a <Nop> | nunmap a
nnoremap R <Nop> | nunmap R
endfunction
"
function acp#lock()
let s:lockCount += 1
endfunction
"
function acp#unlock()
let s:lockCount -= 1
if s:lockCount < 0
let s:lockCount = 0
throw "AutoComplPop: not locked"
endif
endfunction
"
function acp#meetsForSnipmate(context)
if g:acp_behaviorSnipmateLength < 0
return 0
endif
let matches = matchlist(a:context, '\(^\|\s\|\<\)\(\u\{' .
\ g:acp_behaviorSnipmateLength . ',}\)$')
return !empty(matches) && !empty(s:getMatchingSnipItems(matches[2]))
endfunction
"
function acp#meetsForKeyword(context)
if g:acp_behaviorKeywordLength < 0
return 0
endif
let matches = matchlist(a:context, '\(\k\{' . g:acp_behaviorKeywordLength . ',}\)$')
if empty(matches)
return 0
endif
for ignore in g:acp_behaviorKeywordIgnores
if stridx(ignore, matches[1]) == 0
return 0
endif
endfor
return 1
endfunction
"
function acp#meetsForFile(context)
if g:acp_behaviorFileLength < 0
return 0
endif
if has('win32') || has('win64')
let separator = '[/\\]'
else
let separator = '\/'
endif
if a:context !~ '\f' . separator . '\f\{' . g:acp_behaviorFileLength . ',}$'
return 0
endif
return a:context !~ '[*/\\][/\\]\f*$\|[^[:print:]]\f*$'
endfunction
"
function acp#meetsForRubyOmni(context)
if !has('ruby')
return 0
endif
if g:acp_behaviorRubyOmniMethodLength >= 0 &&
\ a:context =~ '[^. \t]\(\.\|::\)\k\{' .
\ g:acp_behaviorRubyOmniMethodLength . ',}$'
return 1
endif
if g:acp_behaviorRubyOmniSymbolLength >= 0 &&
\ a:context =~ '\(^\|[^:]\):\k\{' .
\ g:acp_behaviorRubyOmniSymbolLength . ',}$'
return 1
endif
return 0
endfunction
"
function acp#meetsForPythonOmni(context)
return has('python') && g:acp_behaviorPythonOmniLength >= 0 &&
\ a:context =~ '\k\.\k\{' . g:acp_behaviorPythonOmniLength . ',}$'
endfunction
"
function acp#meetsForPerlOmni(context)
return g:acp_behaviorPerlOmniLength >= 0 &&
\ a:context =~ '\w->\k\{' . g:acp_behaviorPerlOmniLength . ',}$'
endfunction
"
function acp#meetsForXmlOmni(context)
return g:acp_behaviorXmlOmniLength >= 0 &&
\ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' .
\ g:acp_behaviorXmlOmniLength . ',}$'
endfunction
"
function acp#meetsForHtmlOmni(context)
return g:acp_behaviorHtmlOmniLength >= 0 &&
\ a:context =~ '\(<\|<\/\|<[^>]\+ \|<[^>]\+=\"\)\k\{' .
\ g:acp_behaviorHtmlOmniLength . ',}$'
endfunction
"
function acp#meetsForCssOmni(context)
if g:acp_behaviorCssOmniPropertyLength >= 0 &&
\ a:context =~ '\(^\s\|[;{]\)\s*\k\{' .
\ g:acp_behaviorCssOmniPropertyLength . ',}$'
return 1
endif
if g:acp_behaviorCssOmniValueLength >= 0 &&
\ a:context =~ '[:@!]\s*\k\{' .
\ g:acp_behaviorCssOmniValueLength . ',}$'
return 1
endif
return 0
endfunction
"
function acp#completeSnipmate(findstart, base)
if a:findstart
let s:posSnipmateCompletion = len(matchstr(s:getCurrentText(), '.*\U'))
return s:posSnipmateCompletion
endif
let lenBase = len(a:base)
let items = filter(GetSnipsInCurrentScope(),
\ 'strpart(v:key, 0, lenBase) ==? a:base')
return map(sort(items(items)), 's:makeSnipmateItem(v:val[0], v:val[1])')
endfunction
"
function acp#onPopupCloseSnipmate()
let word = s:getCurrentText()[s:posSnipmateCompletion :]
for trigger in keys(GetSnipsInCurrentScope())
if word ==# trigger
call feedkeys("\<C-r>=TriggerSnippet()\<CR>", "n")
return 0
endif
endfor
return 1
endfunction
"
function acp#onPopupPost()
" to clear <C-r>= expression on command-line
echo ''
if pumvisible()
inoremap <silent> <expr> <C-h> acp#onBs()
inoremap <silent> <expr> <BS> acp#onBs()
" a command to restore to original text and select the first match
return (s:behavsCurrent[s:iBehavs].command =~# "\<C-p>" ? "\<C-n>\<Up>"
\ : "\<C-p>\<Down>")
endif
let s:iBehavs += 1
if len(s:behavsCurrent) > s:iBehavs
call s:setCompletefunc()
return printf("\<C-e>%s\<C-r>=acp#onPopupPost()\<CR>",
\ s:behavsCurrent[s:iBehavs].command)
else
let s:lastUncompletable = {
\ 'word': s:getCurrentWord(),
\ 'commands': map(copy(s:behavsCurrent), 'v:val.command')[1:],
\ }
call s:finishPopup(0)
return "\<C-e>"
endif
endfunction
"
function acp#onBs()
" using "matchstr" and not "strpart" in order to handle multi-byte
" characters
if call(s:behavsCurrent[s:iBehavs].meets,
\ [matchstr(s:getCurrentText(), '.*\ze.')])
return "\<BS>"
endif
return "\<C-e>\<BS>"
endfunction
" }}}1
"=============================================================================
" LOCAL FUNCTIONS: {{{1
"
function s:mapForMappingDriven()
call s:unmapForMappingDriven()
let s:keysMappingDriven = [
\ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
\ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
\ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
\ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
\ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
\ '-', '_', '~', '^', '.', ',', ':', '!', '#', '=', '%', '$', '@', '<', '>', '/', '\',
\ '<Space>', '<C-h>', '<BS>', ]
for key in s:keysMappingDriven
execute printf('inoremap <silent> %s %s<C-r>=<SID>feedPopup()<CR>',
\ key, key)
endfor
endfunction
"
function s:unmapForMappingDriven()
if !exists('s:keysMappingDriven')
return
endif
for key in s:keysMappingDriven
execute 'iunmap ' . key
endfor
let s:keysMappingDriven = []
endfunction
"
function s:setTempOption(group, name, value)
call extend(s:tempOptionSet[a:group], { a:name : eval('&' . a:name) }, 'keep')
execute printf('let &%s = a:value', a:name)
endfunction
"
function s:restoreTempOptions(group)
for [name, value] in items(s:tempOptionSet[a:group])
execute printf('let &%s = value', name)
endfor
let s:tempOptionSet[a:group] = {}
endfunction
"
function s:getCurrentWord()
return matchstr(s:getCurrentText(), '\k*$')
endfunction
"
function s:getCurrentText()
return strpart(getline('.'), 0, col('.') - 1)
endfunction
"
function s:getPostText()
return strpart(getline('.'), col('.') - 1)
endfunction
"
function s:isModifiedSinceLastCall()
if exists('s:posLast')
let posPrev = s:posLast
let nLinesPrev = s:nLinesLast
let textPrev = s:textLast
endif
let s:posLast = getpos('.')
let s:nLinesLast = line('$')
let s:textLast = getline('.')
if !exists('posPrev')
return 1
elseif posPrev[1] != s:posLast[1] || nLinesPrev != s:nLinesLast
return (posPrev[1] - s:posLast[1] == nLinesPrev - s:nLinesLast)
elseif textPrev ==# s:textLast
return 0
elseif posPrev[2] > s:posLast[2]
return 1
elseif has('gui_running') && has('multi_byte')
" NOTE: auto-popup causes a strange behavior when IME/XIM is working
return posPrev[2] + 1 == s:posLast[2]
endif
return posPrev[2] != s:posLast[2]
endfunction
"
function s:makeCurrentBehaviorSet()
let modified = s:isModifiedSinceLastCall()
if exists('s:behavsCurrent[s:iBehavs].repeat') && s:behavsCurrent[s:iBehavs].repeat
let behavs = [ s:behavsCurrent[s:iBehavs] ]
elseif exists('s:behavsCurrent[s:iBehavs]')
return []
elseif modified
let behavs = copy(exists('g:acp_behavior[&filetype]')
\ ? g:acp_behavior[&filetype]
\ : g:acp_behavior['*'])
else
return []
endif
let text = s:getCurrentText()
call filter(behavs, 'call(v:val.meets, [text])')
let s:iBehavs = 0
if exists('s:lastUncompletable') &&
\ stridx(s:getCurrentWord(), s:lastUncompletable.word) == 0 &&
\ map(copy(behavs), 'v:val.command') ==# s:lastUncompletable.commands
let behavs = []
else
unlet! s:lastUncompletable
endif
return behavs
endfunction
"
function s:feedPopup()
" NOTE: CursorMovedI is not triggered while the popup menu is visible. And
" it will be triggered when popup menu is disappeared.
if s:lockCount > 0 || pumvisible() || &paste
return ''
endif
if exists('s:behavsCurrent[s:iBehavs].onPopupClose')
if !call(s:behavsCurrent[s:iBehavs].onPopupClose, [])
call s:finishPopup(1)
return ''
endif
endif
let s:behavsCurrent = s:makeCurrentBehaviorSet()
if empty(s:behavsCurrent)
call s:finishPopup(1)
return ''
endif
" In case of dividing words by symbols (e.g. "for(int", "ab==cd") while a
" popup menu is visible, another popup is not available unless input <C-e>
" or try popup once. So first completion is duplicated.
call insert(s:behavsCurrent, s:behavsCurrent[s:iBehavs])
call s:setTempOption(s:GROUP0, 'spell', 0)
call s:setTempOption(s:GROUP0, 'completeopt', 'menuone' . (g:acp_completeoptPreview ? ',preview' : ''))
call s:setTempOption(s:GROUP0, 'complete', g:acp_completeOption)
call s:setTempOption(s:GROUP0, 'ignorecase', g:acp_ignorecaseOption)
" NOTE: With CursorMovedI driven, Set 'lazyredraw' to avoid flickering.
" With Mapping driven, set 'nolazyredraw' to make a popup menu visible.
call s:setTempOption(s:GROUP0, 'lazyredraw', !g:acp_mappingDriven)
" NOTE: 'textwidth' must be restored after <C-e>.
call s:setTempOption(s:GROUP1, 'textwidth', 0)
call s:setCompletefunc()
call feedkeys(s:behavsCurrent[s:iBehavs].command . "\<C-r>=acp#onPopupPost()\<CR>", 'n')
return '' " this function is called by <C-r>=
endfunction
"
function s:finishPopup(fGroup1)
inoremap <C-h> <Nop> | iunmap <C-h>
inoremap <BS> <Nop> | iunmap <BS>
let s:behavsCurrent = []
call s:restoreTempOptions(s:GROUP0)
if a:fGroup1
call s:restoreTempOptions(s:GROUP1)
endif
endfunction
"
function s:setCompletefunc()
if exists('s:behavsCurrent[s:iBehavs].completefunc')
call s:setTempOption(0, 'completefunc', s:behavsCurrent[s:iBehavs].completefunc)
endif
endfunction
"
function s:makeSnipmateItem(key, snip)
if type(a:snip) == type([])
let descriptions = map(copy(a:snip), 'v:val[0]')
let snipFormatted = '[MULTI] ' . join(descriptions, ', ')
else
let snipFormatted = substitute(a:snip, '\(\n\|\s\)\+', ' ', 'g')
endif
return {
\ 'word': a:key,
\ 'menu': strpart(snipFormatted, 0, 80),
\ }
endfunction
"
function s:getMatchingSnipItems(base)
let key = a:base . "\n"
if !exists('s:snipItems[key]')
let s:snipItems[key] = items(GetSnipsInCurrentScope())
call filter(s:snipItems[key], 'strpart(v:val[0], 0, len(a:base)) ==? a:base')
call map(s:snipItems[key], 's:makeSnipmateItem(v:val[0], v:val[1])')
endif
return s:snipItems[key]
endfunction
" }}}1
"=============================================================================
" INITIALIZATION {{{1
let s:GROUP0 = 0
let s:GROUP1 = 1
let s:lockCount = 0
let s:behavsCurrent = []
let s:iBehavs = 0
let s:tempOptionSet = [{}, {}]
let s:snipItems = {}
" }}}1
"=============================================================================
" vim: set fdm=marker:

View file

@ -0,0 +1,298 @@
*acp.txt* 補完メニューの自動ポップアップ
Copyright (c) 2007-2009 Takeshi NISHIDA
AutoComplPop *autocomplpop* *acp*
概要 |acp-introduction|
インストール |acp-installation|
使い方 |acp-usage|
コマンド |acp-commands|
オプション |acp-options|
SPECIAL THANKS |acp-thanks|
CHANGELOG |acp-changelog|
あばうと |acp-about|
==============================================================================
概要 *acp-introduction*
このプラグインは、インサートモードで文字を入力したりカーソルを動かしたときに補
完メニューを自動的に開くようにします。しかし、続けて文字を入力するのを妨げたり
はしません。
==============================================================================
インストール *acp-installation*
ZIPファイルをランタイムディレクトリに展開します。
以下のようにファイルが配置されるはずです。
>
<your runtime directory>/plugin/acp.vim
<your runtime directory>/doc/acp.txt
...
<
もしランタイムディレクトリが他のプラグインとごた混ぜになるのが嫌なら、ファイル
を新規ディレクトリに配置し、そのディレクトリのパスを 'runtimepath' に追加して
ください。アンインストールも楽になります。
その後 FuzzyFinder のヘルプを有効にするためにタグファイルを更新してください。
詳しくは|add-local-help|を参照してください。
==============================================================================
使い方 *acp-usage*
このプラグインがインストールされていれば、自動ポップアップは vim の開始時から
有効になります。
カーソル直前のテキストに応じて、利用する補完の種類を切り替えます。デフォルトの
補完動作は次の通りです:
補完モード filetype カーソル直前のテキスト ~
キーワード補完 * 2文字のキーワード文字
ファイル名補完 * ファイル名文字 + パスセパレータ
+ 0文字以上のファイル名文字
オムニ補完 ruby ".", "::" or 単語を構成する文字以外 + ":"
オムニ補完 python "."
オムニ補完 xml "<", "</" or ("<" + ">"以外の文字列 + " ")
オムニ補完 html/xhtml "<", "</" or ("<" + ">"以外の文字列 + " ")
オムニ補完 css (":", ";", "{", "^", "@", or "!")
+ 0個または1個のスペース
さらに、設定を行うことで、ユーザー定義補完と snipMate トリガー補完
(|acp-snipMate|) を自動ポップアップさせることができます。
これらの補完動作はカスタマイズ可能です。
*acp-snipMate*
snipMate トリガー補完 ~
snipMate トリガー補完では、snipMate プラグイン
(http://www.vim.org/scripts/script.php?script_id=2540) が提供するスニペットの
トリガーを補完してそれを展開することができます。
この自動ポップアップを有効にするには、次の関数を plugin/snipMate.vim に追加す
る必要があります:
>
fun! GetSnipsInCurrentScope()
let snips = {}
for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
call extend(snips, get(s:snippets, scope, {}), 'keep')
call extend(snips, get(s:multi_snips, scope, {}), 'keep')
endfor
return snips
endf
<
そして|g:acp_behaviorSnipmateLength|オプションを 1 にしてください。
この自動ポップアップには制限があり、カーソル直前の単語は大文字英字だけで構成さ
れていなければなりません。
*acp-perl-omni*
Perl オムニ補完 ~
AutoComplPop は perl-completion.vim
(http://www.vim.org/scripts/script.php?script_id=2852) をサポートしています。
この自動ポップアップを有効にするには、|g:acp_behaviorPerlOmniLength|オプション
を 0 以上にしてください。
==============================================================================
コマンド *acp-commands*
*:AcpEnable*
:AcpEnable
自動ポップアップを有効にします。
*:AcpDisable*
:AcpDisable
自動ポップアップを無効にします。
*:AcpLock*
:AcpLock
自動ポップアップを一時的に停止します。
別のスクリプトへの干渉を回避する目的なら、このコマンドと|:AcpUnlock|
を利用することを、|:AcpDisable|と|:AcpEnable| を利用するよりも推奨しま
す。
*:AcpUnlock*
:AcpUnlock
|:AcpLock| で停止された自動ポップアップを再開します。
==============================================================================
オプション *acp-options*
*g:acp_enableAtStartup* >
let g:acp_enableAtStartup = 1
<
真なら vim 開始時から自動ポップアップが有効になります。
*g:acp_mappingDriven* >
let g:acp_mappingDriven = 0
<
真なら|CursorMovedI|イベントではなくキーマッピングで自動ポップアップを
行うようにします。カーソルを移動するたびに補完が行われることで重いなど
の不都合がある場合に利用してください。ただし他のプラグインとの相性問題
や日本語入力での不具合が発生する可能性があります。(逆も然り。)
*g:acp_ignorecaseOption* >
let g:acp_ignorecaseOption = 1
<
自動ポップアップ時に、'ignorecase' に一時的に設定する値
*g:acp_completeOption* >
let g:acp_completeOption = '.,w,b,k'
<
自動ポップアップ時に、'complete' に一時的に設定する値
*g:acp_completeoptPreview* >
let g:acp_completeoptPreview = 0
<
真なら自動ポップアップ時に、 'completeopt' へ "preview" を追加します。
*g:acp_behaviorUserDefinedFunction* >
let g:acp_behaviorUserDefinedFunction = ''
<
ユーザー定義補完の|g:acp_behavior-completefunc|。空ならこの補完は行わ
れません。。
*g:acp_behaviorUserDefinedMeets* >
let g:acp_behaviorUserDefinedMeets = ''
<
ユーザー定義補完の|g:acp_behavior-meets|。空ならこの補完は行われません
*g:acp_behaviorSnipmateLength* >
let g:acp_behaviorSnipmateLength = -1
<
snipMate トリガー補完の自動ポップアップを行うのに必要なカーソルの直前
のパターン。
*g:acp_behaviorKeywordCommand* >
let g:acp_behaviorKeywordCommand = "\<C-n>"
<
キーワード補完のコマンド。このオプションには普通 "\<C-n>" か "\<C-p>"
を設定します。
*g:acp_behaviorKeywordLength* >
let g:acp_behaviorKeywordLength = 2
<
キーワード補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
ード文字数。負数ならこの補完は行われません。
*g:acp_behaviorKeywordIgnores* >
let g:acp_behaviorKeywordIgnores = []
<
文字列のリスト。カーソル直前の単語がこれらの内いずれかの先頭部分にマッ
チする場合、この補完は行われません。
例えば、 "get" で始まる補完キーワードが多過ぎて、"g", "ge", "get" を入
力したときの自動ポップアップがレスポンスの低下を引き起こしている場合、
このオプションに ["get"] を設定することでそれを回避することができます。
*g:acp_behaviorFileLength* >
let g:acp_behaviorFileLength = 0
<
ファイル名補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
ード文字数。負数ならこの補完は行われません。
*g:acp_behaviorRubyOmniMethodLength* >
let g:acp_behaviorRubyOmniMethodLength = 0
<
メソッド補完のための、Ruby オムニ補完の自動ポップアップを行うのに必要
なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
*g:acp_behaviorRubyOmniSymbolLength* >
let g:acp_behaviorRubyOmniSymbolLength = 1
<
シンボル補完のための、Ruby オムニ補完の自動ポップアップを行うのに必要
なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
*g:acp_behaviorPythonOmniLength* >
let g:acp_behaviorPythonOmniLength = 0
<
Python オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキ
ーワード文字数。負数ならこの補完は行われません。
*g:acp_behaviorPerlOmniLength* >
let g:acp_behaviorPerlOmniLength = -1
<
Perl オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキー
ワード文字数。負数ならこの補完は行われません。
See also: |acp-perl-omni|
*g:acp_behaviorXmlOmniLength* >
let g:acp_behaviorXmlOmniLength = 0
<
XML オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキーワ
ード文字数。負数ならこの補完は行われません。
*g:acp_behaviorHtmlOmniLength* >
let g:acp_behaviorHtmlOmniLength = 0
<
HTML オムニ補完の自動ポップアップを行うのに必要なカーソルの直前のキー
ワード文字数。負数ならこの補完は行われません。
*g:acp_behaviorCssOmniPropertyLength* >
let g:acp_behaviorCssOmniPropertyLength = 1
<
プロパティ補完のための、CSS オムニ補完の自動ポップアップを行うのに必要
なカーソルの直前のキーワード文字数。負数ならこの補完は行われません。
*g:acp_behaviorCssOmniValueLength* >
let g:acp_behaviorCssOmniValueLength = 0
<
値補完のための、CSS オムニ補完の自動ポップアップを行うのに必要なカーソ
ルの直前のキーワード文字数。負数ならこの補完は行われません。
*g:acp_behavior* >
let g:acp_behavior = {}
<
これは内部仕様がわかっている人向けのオプションで、他のオプションでの設
定より優先されます。
|Dictionary|型で、キーはファイルタイプに対応します。 '*' はデフォルト
を表します。値はリスト型です。補完候補が得られるまでリストの先頭アイテ
ムから順に評価します。各要素は|Dictionary|で詳細は次の通り:
"command": *g:acp_behavior-command*
補完メニューをポップアップするためのコマンド。
"completefunc": *g:acp_behavior-completefunc*
'completefunc' に設定する関数。 "command" が "<C-x><C-u>" のときだけ
意味があります。
"meets": *g:acp_behavior-meets*
この補完を行うかどうかを判断する関数の名前。この関数はカーソル直前の
テキストを引数に取り、補完を行うなら非 0 の値を返します。
"onPopupClose": *g:acp_behavior-onPopupClose*
この補完のポップアップメニューが閉じられたときに呼ばれる関数の名前。
この関数が 0 を返した場合、続いて行われる予定の補完は抑制されます。
"repeat": *g:acp_behavior-repeat*
真なら最後の補完が自動的に繰り返されます。
==============================================================================
あばうと *acp-about* *acp-contact* *acp-author*
作者: Takeshi NISHIDA <ns9tks@DELETE-ME.gmail.com>
ライセンス: MIT Licence
URL: http://www.vim.org/scripts/script.php?script_id=1879
http://bitbucket.org/ns9tks/vim-autocomplpop/
バグや要望など ~
こちらへどうぞ: http://bitbucket.org/ns9tks/vim-autocomplpop/issues/
==============================================================================
vim:tw=78:ts=8:ft=help:norl:

View file

@ -0,0 +1,512 @@
*acp.txt* Automatically opens popup menu for completions.
Copyright (c) 2007-2009 Takeshi NISHIDA
AutoComplPop *autocomplpop* *acp*
INTRODUCTION |acp-introduction|
INSTALLATION |acp-installation|
USAGE |acp-usage|
COMMANDS |acp-commands|
OPTIONS |acp-options|
SPECIAL THANKS |acp-thanks|
CHANGELOG |acp-changelog|
ABOUT |acp-about|
==============================================================================
INTRODUCTION *acp-introduction*
With this plugin, your vim comes to automatically opens popup menu for
completions when you enter characters or move the cursor in Insert mode. It
won't prevent you continuing entering characters.
==============================================================================
INSTALLATION *acp-installation*
Put all files into your runtime directory. If you have the zip file, extract
it to your runtime directory.
You should place the files as follows:
>
<your runtime directory>/plugin/acp.vim
<your runtime directory>/doc/acp.txt
...
<
If you disgust to jumble up this plugin and other plugins in your runtime
directory, put the files into new directory and just add the directory path to
'runtimepath'. It's easy to uninstall the plugin.
And then update your help tags files to enable fuzzyfinder help. See
|add-local-help| for details.
==============================================================================
USAGE *acp-usage*
Once this plugin is installed, auto-popup is enabled at startup by default.
Which completion method is used depends on the text before the cursor. The
default behavior is as follows:
kind filetype text before the cursor ~
Keyword * two keyword characters
Filename * a filename character + a path separator
+ 0 or more filename character
Omni ruby ".", "::" or non-word character + ":"
(|+ruby| required.)
Omni python "." (|+python| required.)
Omni xml "<", "</" or ("<" + non-">" characters + " ")
Omni html/xhtml "<", "</" or ("<" + non-">" characters + " ")
Omni css (":", ";", "{", "^", "@", or "!")
+ 0 or 1 space
Also, you can make user-defined completion and snipMate's trigger completion
(|acp-snipMate|) auto-popup if the options are set.
These behavior are customizable.
*acp-snipMate*
snipMate's Trigger Completion ~
snipMate's trigger completion enables you to complete a snippet trigger
provided by snipMate plugin
(http://www.vim.org/scripts/script.php?script_id=2540) and expand it.
To enable auto-popup for this completion, add following function to
plugin/snipMate.vim:
>
fun! GetSnipsInCurrentScope()
let snips = {}
for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
call extend(snips, get(s:snippets, scope, {}), 'keep')
call extend(snips, get(s:multi_snips, scope, {}), 'keep')
endfor
return snips
endf
<
And set |g:acp_behaviorSnipmateLength| option to 1.
There is the restriction on this auto-popup, that the word before cursor must
consist only of uppercase characters.
*acp-perl-omni*
Perl Omni-Completion ~
AutoComplPop supports perl-completion.vim
(http://www.vim.org/scripts/script.php?script_id=2852).
To enable auto-popup for this completion, set |g:acp_behaviorPerlOmniLength|
option to 0 or more.
==============================================================================
COMMANDS *acp-commands*
*:AcpEnable*
:AcpEnable
enables auto-popup.
*:AcpDisable*
:AcpDisable
disables auto-popup.
*:AcpLock*
:AcpLock
suspends auto-popup temporarily.
For the purpose of avoiding interruption to another script, it is
recommended to insert this command and |:AcpUnlock| than |:AcpDisable|
and |:AcpEnable| .
*:AcpUnlock*
:AcpUnlock
resumes auto-popup suspended by |:AcpLock| .
==============================================================================
OPTIONS *acp-options*
*g:acp_enableAtStartup* >
let g:acp_enableAtStartup = 1
<
If non-zero, auto-popup is enabled at startup.
*g:acp_mappingDriven* >
let g:acp_mappingDriven = 0
<
If non-zero, auto-popup is triggered by key mappings instead of
|CursorMovedI| event. This is useful to avoid auto-popup by moving
cursor in Insert mode.
*g:acp_ignorecaseOption* >
let g:acp_ignorecaseOption = 1
<
Value set to 'ignorecase' temporarily when auto-popup.
*g:acp_completeOption* >
let g:acp_completeOption = '.,w,b,k'
<
Value set to 'complete' temporarily when auto-popup.
*g:acp_completeoptPreview* >
let g:acp_completeoptPreview = 0
<
If non-zero, "preview" is added to 'completeopt' when auto-popup.
*g:acp_behaviorUserDefinedFunction* >
let g:acp_behaviorUserDefinedFunction = ''
<
|g:acp_behavior-completefunc| for user-defined completion. If empty,
this completion will be never attempted.
*g:acp_behaviorUserDefinedMeets* >
let g:acp_behaviorUserDefinedMeets = ''
<
|g:acp_behavior-meets| for user-defined completion. If empty, this
completion will be never attempted.
*g:acp_behaviorSnipmateLength* >
let g:acp_behaviorSnipmateLength = -1
<
Pattern before the cursor, which are needed to attempt
snipMate-trigger completion.
*g:acp_behaviorKeywordCommand* >
let g:acp_behaviorKeywordCommand = "\<C-n>"
<
Command for keyword completion. This option is usually set "\<C-n>" or
"\<C-p>".
*g:acp_behaviorKeywordLength* >
let g:acp_behaviorKeywordLength = 2
<
Length of keyword characters before the cursor, which are needed to
attempt keyword completion. If negative value, this completion will be
never attempted.
*g:acp_behaviorKeywordIgnores* >
let g:acp_behaviorKeywordIgnores = []
<
List of string. If a word before the cursor matches to the front part
of one of them, keyword completion won't be attempted.
E.g., when there are too many keywords beginning with "get" for the
completion and auto-popup by entering "g", "ge", or "get" causes
response degradation, set ["get"] to this option and avoid it.
*g:acp_behaviorFileLength* >
let g:acp_behaviorFileLength = 0
<
Length of filename characters before the cursor, which are needed to
attempt filename completion. If negative value, this completion will
be never attempted.
*g:acp_behaviorRubyOmniMethodLength* >
let g:acp_behaviorRubyOmniMethodLength = 0
<
Length of keyword characters before the cursor, which are needed to
attempt ruby omni-completion for methods. If negative value, this
completion will be never attempted.
*g:acp_behaviorRubyOmniSymbolLength* >
let g:acp_behaviorRubyOmniSymbolLength = 1
<
Length of keyword characters before the cursor, which are needed to
attempt ruby omni-completion for symbols. If negative value, this
completion will be never attempted.
*g:acp_behaviorPythonOmniLength* >
let g:acp_behaviorPythonOmniLength = 0
<
Length of keyword characters before the cursor, which are needed to
attempt python omni-completion. If negative value, this completion
will be never attempted.
*g:acp_behaviorPerlOmniLength* >
let g:acp_behaviorPerlOmniLength = -1
<
Length of keyword characters before the cursor, which are needed to
attempt perl omni-completion. If negative value, this completion will
be never attempted.
See also: |acp-perl-omni|
*g:acp_behaviorXmlOmniLength* >
let g:acp_behaviorXmlOmniLength = 0
<
Length of keyword characters before the cursor, which are needed to
attempt XML omni-completion. If negative value, this completion will
be never attempted.
*g:acp_behaviorHtmlOmniLength* >
let g:acp_behaviorHtmlOmniLength = 0
<
Length of keyword characters before the cursor, which are needed to
attempt HTML omni-completion. If negative value, this completion will
be never attempted.
*g:acp_behaviorCssOmniPropertyLength* >
let g:acp_behaviorCssOmniPropertyLength = 1
<
Length of keyword characters before the cursor, which are needed to
attempt CSS omni-completion for properties. If negative value, this
completion will be never attempted.
*g:acp_behaviorCssOmniValueLength* >
let g:acp_behaviorCssOmniValueLength = 0
<
Length of keyword characters before the cursor, which are needed to
attempt CSS omni-completion for values. If negative value, this
completion will be never attempted.
*g:acp_behavior* >
let g:acp_behavior = {}
<
This option is for advanced users. This setting overrides other
behavior options. This is a |Dictionary|. Each key corresponds to a
filetype. '*' is default. Each value is a list. These are attempted in
sequence until completion item is found. Each element is a
|Dictionary| which has following items:
"command": *g:acp_behavior-command*
Command to be fed to open popup menu for completions.
"completefunc": *g:acp_behavior-completefunc*
'completefunc' will be set to this user-provided function during the
completion. Only makes sense when "command" is "<C-x><C-u>".
"meets": *g:acp_behavior-meets*
Name of the function which dicides whether or not to attempt this
completion. It will be attempted if this function returns non-zero.
This function takes a text before the cursor.
"onPopupClose": *g:acp_behavior-onPopupClose*
Name of the function which is called when popup menu for this
completion is closed. Following completions will be suppressed if
this function returns zero.
"repeat": *g:acp_behavior-repeat*
If non-zero, the last completion is automatically repeated.
==============================================================================
SPECIAL THANKS *acp-thanks*
- Daniel Schierbeck
- Ingo Karkat
==============================================================================
CHANGELOG *acp-changelog*
2.14.1
- Changed the way of auto-popup for avoiding an issue about filename
completion.
- Fixed a bug that popup menu was opened twice when auto-popup was done.
2.14
- Added the support for perl-completion.vim.
2.13
- Changed to sort snipMate's triggers.
- Fixed a bug that a wasted character was inserted after snipMate's trigger
completion.
2.12.1
- Changed to avoid a strange behavior with Microsoft IME.
2.12
- Added g:acp_behaviorKeywordIgnores option.
- Added g:acp_behaviorUserDefinedMeets option and removed
g:acp_behaviorUserDefinedPattern.
- Changed to do auto-popup only when a buffer is modified.
- Changed the structure of g:acp_behavior option.
- Changed to reflect a change of behavior options (named g:acp_behavior*)
any time it is done.
- Fixed a bug that completions after omni completions or snipMate's trigger
completion were never attempted when no candidate for the former
completions was found.
2.11.1
- Fixed a bug that a snipMate's trigger could not be expanded when it was
completed.
2.11
- Implemented experimental feature which is snipMate's trigger completion.
2.10
- Improved the response by changing not to attempt any completion when
keyword characters are entered after a word which has been found that it
has no completion candidate at the last attempt of completions.
- Improved the response by changing to close popup menu when <BS> was
pressed and the text before the cursor would not match with the pattern of
current behavior.
2.9
- Changed default behavior to support XML omni completion.
- Changed default value of g:acp_behaviorKeywordCommand option.
The option with "\<C-p>" cause a problem which inserts a match without
<CR> when 'dictionary' has been set and keyword completion is done.
- Changed to show error message when incompatible with a installed vim.
2.8.1
- Fixed a bug which inserted a selected match to the next line when
auto-wrapping (enabled with 'formatoptions') was performed.
2.8
- Added g:acp_behaviorUserDefinedFunction option and
g:acp_behaviorUserDefinedPattern option for users who want to make custom
completion auto-popup.
- Fixed a bug that setting 'spell' on a new buffer made typing go crazy.
2.7
- Changed naming conventions for filenames, functions, commands, and options
and thus renamed them.
- Added g:acp_behaviorKeywordCommand option. If you prefer the previous
behavior for keyword completion, set this option "\<C-n>".
- Changed default value of g:acp_ignorecaseOption option.
The following were done by Ingo Karkat:
- ENH: Added support for setting a user-provided 'completefunc' during the
completion, configurable via g:acp_behavior.
- BUG: When the configured completion is <C-p> or <C-x><C-p>, the command to
restore the original text (in on_popup_post()) must be reverted, too.
- BUG: When using a custom completion function (<C-x><C-u>) that also uses
an s:...() function name, the s:GetSidPrefix() function dynamically
determines the wrong SID. Now calling s:DetermineSidPrefix() once during
sourcing and caching the value in s:SID.
- BUG: Should not use custom defined <C-X><C-...> completion mappings. Now
consistently using unmapped completion commands everywhere. (Beforehand,
s:PopupFeeder.feed() used mappings via feedkeys(..., 'm'), but
s:PopupFeeder.on_popup_post() did not due to its invocation via
:map-expr.)
2.6:
- Improved the behavior of omni completion for HTML/XHTML.
2.5:
- Added some options to customize behavior easily:
g:AutoComplPop_BehaviorKeywordLength
g:AutoComplPop_BehaviorFileLength
g:AutoComplPop_BehaviorRubyOmniMethodLength
g:AutoComplPop_BehaviorRubyOmniSymbolLength
g:AutoComplPop_BehaviorPythonOmniLength
g:AutoComplPop_BehaviorHtmlOmniLength
g:AutoComplPop_BehaviorCssOmniPropertyLength
g:AutoComplPop_BehaviorCssOmniValueLength
2.4:
- Added g:AutoComplPop_MappingDriven option.
2.3.1:
- Changed to set 'lazyredraw' while a popup menu is visible to avoid
flickering.
- Changed a behavior for CSS.
- Added support for GetLatestVimScripts.
2.3:
- Added a behavior for Python to support omni completion.
- Added a behavior for CSS to support omni completion.
2.2:
- Changed not to work when 'paste' option is set.
- Fixed AutoComplPopEnable command and AutoComplPopDisable command to
map/unmap "i" and "R".
2.1:
- Fixed the problem caused by "." command in Normal mode.
- Changed to map "i" and "R" to feed completion command after starting
Insert mode.
- Avoided the problem caused by Windows IME.
2.0:
- Changed to use CursorMovedI event to feed a completion command instead of
key mapping. Now the auto-popup is triggered by moving the cursor.
- Changed to feed completion command after starting Insert mode.
- Removed g:AutoComplPop_MapList option.
1.7:
- Added behaviors for HTML/XHTML. Now supports the omni completion for
HTML/XHTML.
- Changed not to show expressions for CTRL-R =.
- Changed not to set 'nolazyredraw' while a popup menu is visible.
1.6.1:
- Changed not to trigger the filename completion by a text which has
multi-byte characters.
1.6:
- Redesigned g:AutoComplPop_Behavior option.
- Changed default value of g:AutoComplPop_CompleteOption option.
- Changed default value of g:AutoComplPop_MapList option.
1.5:
- Implemented continuous-completion for the filename completion. And added
new option to g:AutoComplPop_Behavior.
1.4:
- Fixed the bug that the auto-popup was not suspended in fuzzyfinder.
- Fixed the bug that an error has occurred with Ruby-omni-completion unless
Ruby interface.
1.3:
- Supported Ruby-omni-completion by default.
- Supported filename completion by default.
- Added g:AutoComplPop_Behavior option.
- Added g:AutoComplPop_CompleteoptPreview option.
- Removed g:AutoComplPop_MinLength option.
- Removed g:AutoComplPop_MaxLength option.
- Removed g:AutoComplPop_PopupCmd option.
1.2:
- Fixed bugs related to 'completeopt'.
1.1:
- Added g:AutoComplPop_IgnoreCaseOption option.
- Added g:AutoComplPop_NotEnableAtStartup option.
- Removed g:AutoComplPop_LoadAndEnable option.
1.0:
- g:AutoComplPop_LoadAndEnable option for a startup activation is added.
- AutoComplPopLock command and AutoComplPopUnlock command are added to
suspend and resume.
- 'completeopt' and 'complete' options are changed temporarily while
completing by this script.
0.4:
- The first match are selected when the popup menu is Opened. You can insert
the first match with CTRL-Y.
0.3:
- Fixed the problem that the original text is not restored if 'longest' is
not set in 'completeopt'. Now the plugin works whether or not 'longest' is
set in 'completeopt', and also 'menuone'.
0.2:
- When completion matches are not found, insert CTRL-E to stop completion.
- Clear the echo area.
- Fixed the problem in case of dividing words by symbols, popup menu is
not opened.
0.1:
- First release.
==============================================================================
ABOUT *acp-about* *acp-contact* *acp-author*
Author: Takeshi NISHIDA <ns9tks@DELETE-ME.gmail.com>
Licence: MIT Licence
URL: http://www.vim.org/scripts/script.php?script_id=1879
http://bitbucket.org/ns9tks/vim-autocomplpop/
Bugs/Issues/Suggestions/Improvements ~
Please submit to http://bitbucket.org/ns9tks/vim-autocomplpop/issues/ .
==============================================================================
vim:tw=78:ts=8:ft=help:norl:

View file

@ -0,0 +1,45 @@
:AcpDisable acp.txt /*:AcpDisable*
:AcpEnable acp.txt /*:AcpEnable*
:AcpLock acp.txt /*:AcpLock*
:AcpUnlock acp.txt /*:AcpUnlock*
acp acp.txt /*acp*
acp-about acp.txt /*acp-about*
acp-author acp.txt /*acp-author*
acp-changelog acp.txt /*acp-changelog*
acp-commands acp.txt /*acp-commands*
acp-contact acp.txt /*acp-contact*
acp-installation acp.txt /*acp-installation*
acp-introduction acp.txt /*acp-introduction*
acp-options acp.txt /*acp-options*
acp-perl-omni acp.txt /*acp-perl-omni*
acp-snipMate acp.txt /*acp-snipMate*
acp-thanks acp.txt /*acp-thanks*
acp-usage acp.txt /*acp-usage*
acp.txt acp.txt /*acp.txt*
autocomplpop acp.txt /*autocomplpop*
g:acp_behavior acp.txt /*g:acp_behavior*
g:acp_behavior-command acp.txt /*g:acp_behavior-command*
g:acp_behavior-completefunc acp.txt /*g:acp_behavior-completefunc*
g:acp_behavior-meets acp.txt /*g:acp_behavior-meets*
g:acp_behavior-onPopupClose acp.txt /*g:acp_behavior-onPopupClose*
g:acp_behavior-repeat acp.txt /*g:acp_behavior-repeat*
g:acp_behaviorCssOmniPropertyLength acp.txt /*g:acp_behaviorCssOmniPropertyLength*
g:acp_behaviorCssOmniValueLength acp.txt /*g:acp_behaviorCssOmniValueLength*
g:acp_behaviorFileLength acp.txt /*g:acp_behaviorFileLength*
g:acp_behaviorHtmlOmniLength acp.txt /*g:acp_behaviorHtmlOmniLength*
g:acp_behaviorKeywordCommand acp.txt /*g:acp_behaviorKeywordCommand*
g:acp_behaviorKeywordIgnores acp.txt /*g:acp_behaviorKeywordIgnores*
g:acp_behaviorKeywordLength acp.txt /*g:acp_behaviorKeywordLength*
g:acp_behaviorPerlOmniLength acp.txt /*g:acp_behaviorPerlOmniLength*
g:acp_behaviorPythonOmniLength acp.txt /*g:acp_behaviorPythonOmniLength*
g:acp_behaviorRubyOmniMethodLength acp.txt /*g:acp_behaviorRubyOmniMethodLength*
g:acp_behaviorRubyOmniSymbolLength acp.txt /*g:acp_behaviorRubyOmniSymbolLength*
g:acp_behaviorSnipmateLength acp.txt /*g:acp_behaviorSnipmateLength*
g:acp_behaviorUserDefinedFunction acp.txt /*g:acp_behaviorUserDefinedFunction*
g:acp_behaviorUserDefinedMeets acp.txt /*g:acp_behaviorUserDefinedMeets*
g:acp_behaviorXmlOmniLength acp.txt /*g:acp_behaviorXmlOmniLength*
g:acp_completeOption acp.txt /*g:acp_completeOption*
g:acp_completeoptPreview acp.txt /*g:acp_completeoptPreview*
g:acp_enableAtStartup acp.txt /*g:acp_enableAtStartup*
g:acp_ignorecaseOption acp.txt /*g:acp_ignorecaseOption*
g:acp_mappingDriven acp.txt /*g:acp_mappingDriven*

View file

@ -0,0 +1,44 @@
!_TAG_FILE_ENCODING utf-8 //
:AcpDisable acp.jax /*:AcpDisable*
:AcpEnable acp.jax /*:AcpEnable*
:AcpLock acp.jax /*:AcpLock*
:AcpUnlock acp.jax /*:AcpUnlock*
acp acp.jax /*acp*
acp-about acp.jax /*acp-about*
acp-author acp.jax /*acp-author*
acp-commands acp.jax /*acp-commands*
acp-contact acp.jax /*acp-contact*
acp-installation acp.jax /*acp-installation*
acp-introduction acp.jax /*acp-introduction*
acp-options acp.jax /*acp-options*
acp-perl-omni acp.jax /*acp-perl-omni*
acp-snipMate acp.jax /*acp-snipMate*
acp-usage acp.jax /*acp-usage*
acp.txt acp.jax /*acp.txt*
autocomplpop acp.jax /*autocomplpop*
g:acp_behavior acp.jax /*g:acp_behavior*
g:acp_behavior-command acp.jax /*g:acp_behavior-command*
g:acp_behavior-completefunc acp.jax /*g:acp_behavior-completefunc*
g:acp_behavior-meets acp.jax /*g:acp_behavior-meets*
g:acp_behavior-onPopupClose acp.jax /*g:acp_behavior-onPopupClose*
g:acp_behavior-repeat acp.jax /*g:acp_behavior-repeat*
g:acp_behaviorCssOmniPropertyLength acp.jax /*g:acp_behaviorCssOmniPropertyLength*
g:acp_behaviorCssOmniValueLength acp.jax /*g:acp_behaviorCssOmniValueLength*
g:acp_behaviorFileLength acp.jax /*g:acp_behaviorFileLength*
g:acp_behaviorHtmlOmniLength acp.jax /*g:acp_behaviorHtmlOmniLength*
g:acp_behaviorKeywordCommand acp.jax /*g:acp_behaviorKeywordCommand*
g:acp_behaviorKeywordIgnores acp.jax /*g:acp_behaviorKeywordIgnores*
g:acp_behaviorKeywordLength acp.jax /*g:acp_behaviorKeywordLength*
g:acp_behaviorPerlOmniLength acp.jax /*g:acp_behaviorPerlOmniLength*
g:acp_behaviorPythonOmniLength acp.jax /*g:acp_behaviorPythonOmniLength*
g:acp_behaviorRubyOmniMethodLength acp.jax /*g:acp_behaviorRubyOmniMethodLength*
g:acp_behaviorRubyOmniSymbolLength acp.jax /*g:acp_behaviorRubyOmniSymbolLength*
g:acp_behaviorSnipmateLength acp.jax /*g:acp_behaviorSnipmateLength*
g:acp_behaviorUserDefinedFunction acp.jax /*g:acp_behaviorUserDefinedFunction*
g:acp_behaviorUserDefinedMeets acp.jax /*g:acp_behaviorUserDefinedMeets*
g:acp_behaviorXmlOmniLength acp.jax /*g:acp_behaviorXmlOmniLength*
g:acp_completeOption acp.jax /*g:acp_completeOption*
g:acp_completeoptPreview acp.jax /*g:acp_completeoptPreview*
g:acp_enableAtStartup acp.jax /*g:acp_enableAtStartup*
g:acp_ignorecaseOption acp.jax /*g:acp_ignorecaseOption*
g:acp_mappingDriven acp.jax /*g:acp_mappingDriven*

View file

@ -0,0 +1,170 @@
"=============================================================================
" Copyright (c) 2007-2009 Takeshi NISHIDA
"
" GetLatestVimScripts: 1879 1 :AutoInstall: AutoComplPop
"=============================================================================
" LOAD GUARD {{{1
if exists('g:loaded_acp')
finish
elseif v:version < 702
echoerr 'AutoComplPop does not support this version of vim (' . v:version . ').'
finish
endif
let g:loaded_acp = 1
" }}}1
"=============================================================================
" FUNCTION: {{{1
"
function s:defineOption(name, default)
if !exists(a:name)
let {a:name} = a:default
endif
endfunction
"
function s:makeDefaultBehavior()
let behavs = {
\ '*' : [],
\ 'ruby' : [],
\ 'python' : [],
\ 'perl' : [],
\ 'xml' : [],
\ 'html' : [],
\ 'xhtml' : [],
\ 'css' : [],
\ }
"---------------------------------------------------------------------------
if !empty(g:acp_behaviorUserDefinedFunction) &&
\ !empty(g:acp_behaviorUserDefinedMeets)
for key in keys(behavs)
call add(behavs[key], {
\ 'command' : "\<C-x>\<C-u>",
\ 'completefunc' : g:acp_behaviorUserDefinedFunction,
\ 'meets' : g:acp_behaviorUserDefinedMeets,
\ 'repeat' : 0,
\ })
endfor
endif
"---------------------------------------------------------------------------
for key in keys(behavs)
call add(behavs[key], {
\ 'command' : "\<C-x>\<C-u>",
\ 'completefunc' : 'acp#completeSnipmate',
\ 'meets' : 'acp#meetsForSnipmate',
\ 'onPopupClose' : 'acp#onPopupCloseSnipmate',
\ 'repeat' : 0,
\ })
endfor
"---------------------------------------------------------------------------
for key in keys(behavs)
call add(behavs[key], {
\ 'command' : g:acp_behaviorKeywordCommand,
\ 'meets' : 'acp#meetsForKeyword',
\ 'repeat' : 0,
\ })
endfor
"---------------------------------------------------------------------------
for key in keys(behavs)
call add(behavs[key], {
\ 'command' : "\<C-x>\<C-f>",
\ 'meets' : 'acp#meetsForFile',
\ 'repeat' : 1,
\ })
endfor
"---------------------------------------------------------------------------
call add(behavs.ruby, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForRubyOmni',
\ 'repeat' : 0,
\ })
"---------------------------------------------------------------------------
call add(behavs.python, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForPythonOmni',
\ 'repeat' : 0,
\ })
"---------------------------------------------------------------------------
call add(behavs.perl, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForPerlOmni',
\ 'repeat' : 0,
\ })
"---------------------------------------------------------------------------
call add(behavs.xml, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForXmlOmni',
\ 'repeat' : 1,
\ })
"---------------------------------------------------------------------------
call add(behavs.html, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForHtmlOmni',
\ 'repeat' : 1,
\ })
"---------------------------------------------------------------------------
call add(behavs.xhtml, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForHtmlOmni',
\ 'repeat' : 1,
\ })
"---------------------------------------------------------------------------
call add(behavs.css, {
\ 'command' : "\<C-x>\<C-o>",
\ 'meets' : 'acp#meetsForCssOmni',
\ 'repeat' : 0,
\ })
"---------------------------------------------------------------------------
return behavs
endfunction
" }}}1
"=============================================================================
" INITIALIZATION {{{1
"-----------------------------------------------------------------------------
call s:defineOption('g:acp_enableAtStartup', 1)
call s:defineOption('g:acp_mappingDriven', 0)
call s:defineOption('g:acp_ignorecaseOption', 1)
call s:defineOption('g:acp_completeOption', '.,w,b,k')
call s:defineOption('g:acp_completeoptPreview', 0)
call s:defineOption('g:acp_behaviorUserDefinedFunction', '')
call s:defineOption('g:acp_behaviorUserDefinedMeets', '')
call s:defineOption('g:acp_behaviorSnipmateLength', -1)
call s:defineOption('g:acp_behaviorKeywordCommand', "\<C-n>")
call s:defineOption('g:acp_behaviorKeywordLength', 2)
call s:defineOption('g:acp_behaviorKeywordIgnores', [])
call s:defineOption('g:acp_behaviorFileLength', 0)
call s:defineOption('g:acp_behaviorRubyOmniMethodLength', 0)
call s:defineOption('g:acp_behaviorRubyOmniSymbolLength', 1)
call s:defineOption('g:acp_behaviorPythonOmniLength', 0)
call s:defineOption('g:acp_behaviorPerlOmniLength', -1)
call s:defineOption('g:acp_behaviorXmlOmniLength', 0)
call s:defineOption('g:acp_behaviorHtmlOmniLength', 0)
call s:defineOption('g:acp_behaviorCssOmniPropertyLength', 1)
call s:defineOption('g:acp_behaviorCssOmniValueLength', 0)
call s:defineOption('g:acp_behavior', {})
"-----------------------------------------------------------------------------
call extend(g:acp_behavior, s:makeDefaultBehavior(), 'keep')
"-----------------------------------------------------------------------------
command! -bar -narg=0 AcpEnable call acp#enable()
command! -bar -narg=0 AcpDisable call acp#disable()
command! -bar -narg=0 AcpLock call acp#lock()
command! -bar -narg=0 AcpUnlock call acp#unlock()
"-----------------------------------------------------------------------------
" legacy commands
command! -bar -narg=0 AutoComplPopEnable AcpEnable
command! -bar -narg=0 AutoComplPopDisable AcpDisable
command! -bar -narg=0 AutoComplPopLock AcpLock
command! -bar -narg=0 AutoComplPopUnlock AcpUnlock
"-----------------------------------------------------------------------------
if g:acp_enableAtStartup
AcpEnable
endif
"-----------------------------------------------------------------------------
" }}}1
"=============================================================================
" vim: set fdm=marker:

View file

@ -0,0 +1,188 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Plugin which bootstraps the eclim environment.
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Command Declarations {{{
if !exists(":EclimValidate")
command EclimValidate :call <SID>Validate()
endif
" }}}
" Global Variables {{{
let g:NUMBER_TYPE = 0
let g:STRING_TYPE = 1
let g:FUNCREF_TYPE = 2
let g:LIST_TYPE = 3
let g:DICT_TYPE = 4
let g:FLOAT_TYPE = 5
" }}}
" Script Variables {{{
let s:required_version = 700
" }}}
" Validate() {{{
" Validates some settings and environment values required by eclim.
" NOTE: don't add command-line continuation characters anywhere in the
" function, just in case the user has &compatible set.
function! s:Validate()
" Check vim version.
if v:version < s:required_version
let ver = strpart(v:version, 0, 1) . '.' . strpart(v:version, 2)
echom "Error: Your vim version is " . ver . "."
echom " Eclim requires version 7.x.x"
return
endif
call s:Validate7()
endfunction " }}}
" exit early if unsupported vim version
if v:version < s:required_version
finish
endif
function! s:Validate7() " {{{
let errors = []
" Check 'compatible' option.
if &compatible
call add(errors, "Error: You have 'compatible' set:")
call add(errors, " Eclim requires 'set nocompatible' in your vimrc.")
call add(errors, " Type \":help 'compatible'\" for more details.")
endif
" Check filetype support
redir => ftsupport
silent filetype
redir END
let ftsupport = substitute(ftsupport, '\n', '', 'g')
if ftsupport !~ 'detection:ON' || ftsupport !~ 'plugin:ON'
echo " "
let chose = 0
while string(chose) !~ '1\|2'
redraw
echo "Filetype plugin support looks to be disabled, but due to possible"
echo "language differences, please check the following line manually."
echo " " . ftsupport
echo "Does it have detection and plugin 'ON'?"
echo "1) Yes"
echo "2) No"
let chose = input("Please Choose (1 or 2): ")
endwhile
if chose != 1
call add(errors, "Error: Eclim requires filetype plugins to be enabled.")
call add(errors, " Please add 'filetype plugin indent on' to your vimrc.")
call add(errors, " Type \":help filetype-plugin-on\" for more details.")
endif
endif
" Print the results.
redraw
echohl Statement
if len(errors) == 0
echom "Result: OK, required settings are valid."
else
for error in errors
echom error
endfor
endif
echohl None
endfunction " }}}
" exit early if compatible is set or eclim is disabled.
if &compatible || exists("g:EclimDisabled")
finish
endif
" EclimBaseDir() {{{
" Gets the base directory where the eclim vim scripts are located.
function! EclimBaseDir()
if !exists("g:EclimBaseDir")
let savewig = &wildignore
set wildignore=""
let file = findfile('plugin/eclim.vim', escape(&runtimepath, ' '))
let &wildignore = savewig
if file == ''
echoe 'Unable to determine eclim basedir. ' .
\ 'Please report this issue on the eclim user mailing list.'
let g:EclimBaseDir = ''
return g:EclimBaseDir
endif
let basedir = substitute(fnamemodify(file, ':p:h:h'), '\', '/', 'g')
let g:EclimBaseDir = escape(basedir, ' ')
endif
return g:EclimBaseDir
endfunction " }}}
function! s:Init() " {{{
" add eclim dir to runtime path.
let basedir = EclimBaseDir()
if basedir == ''
return
endif
exec 'set runtimepath+=' .
\ basedir . '/eclim,' .
\ basedir . '/eclim/after'
" Alternate version which inserts the eclim path just after the currently
" executing runtime path element and puts the eclim/after path at the very
" end.
"let paths = split(&rtp, ',')
"let index = 0
"for path in paths
" let index += 1
" if tolower(path) == tolower(basedir)
" break
" endif
"endfor
"let tail = paths[index :]
"for path in tail
" exec 'set runtimepath-=' . escape(path, ' ')
"endfor
"exec 'set runtimepath+=' . basedir . '/eclim'
"for path in tail
" exec 'set runtimepath+=' . escape(path, ' ')
"endfor
"exec 'set runtimepath+=' . basedir . '/eclim/after'
" load settings before any calls to register them.
call eclim#LoadVimSettings()
" need to be manually sourced
runtime! eclim/plugin/*.vim
runtime! eclim/after/plugin/*.vim
endfunction " }}}
call <SID>Init()
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,596 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Plugin that integrates vim with the eclipse plugin eclim (ECLipse
" IMproved).
"
" This plugin contains shared functions that can be used regardless of the
" current file type being edited.
"
" License:
"
" Copyright (C) 2005 - 2015 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:echo_connection_errors = 1
let s:command_ping = '-command ping'
let s:command_settings = '-command settings'
let s:command_settings_update = '-command settings_update -s "<settings>"'
let s:command_shutdown = "-command shutdown"
let s:command_jobs = '-command jobs'
let s:connect= '^connect: .*$'
let s:vim_settings = {}
let s:vim_settings_defaults = {}
let s:vim_settings_types = {}
let s:vim_settings_validators = {}
" }}}
function! eclim#Execute(command, ...) " {{{
" Optional args:
" options {
" One of the following to determine the eclimd instance to use, honored in
" the order shown here:
" instance: dictionary representing an eclimd instance.
" project: project name
" workspace: workspace path
" dir: directory path to use as the current dir
" exec: 1 to execute the command using execute instead of system.
" raw: 1 to get the result without evaluating as json
" }
if exists('g:EclimDisabled')
" if we are not in an autocmd or the autocmd is for an acwrite buffer,
" alert the user that eclimd is disabled.
if expand('<abuf>') == '' || &buftype == 'acwrite'
call eclim#util#EchoWarning(
\ "eclim is currently disabled. use :EclimEnable to enable it.")
endif
return
endif
if !eclim#EclimAvailable()
return
endif
let command = '-editor vim ' . a:command
" encode special characters
" http://www.w3schools.com/TAGS/ref_urlencode.asp
let command = substitute(command, '\*', '%2A', 'g')
let command = substitute(command, '\$', '%24', 'g')
let command = substitute(command, '<', '%3C', 'g')
let command = substitute(command, '>', '%3E', 'g')
" determine the eclimd instance to use
let options = a:0 ? a:1 : {}
let instance = get(options, 'instance', {})
if len(instance) == 0
let project = get(options, 'project', '')
if project != ''
let workspace = eclim#project#util#GetProjectWorkspace(project)
if type(workspace) == g:LIST_TYPE
let workspaces = workspace
unlet workspace
let response = eclim#util#PromptList(
\ 'Muliple workspaces found, please choose the target workspace',
\ workspaces, g:EclimHighlightInfo)
" user cancelled, error, etc.
if response < 0
return
endif
let workspace = workspaces[response]
endif
else
let workspace = ''
endif
if workspace == ''
let workspace = get(options, 'workspace', '')
endif
let dir = workspace != '' ? workspace : get(options, 'dir', '')
let chosen = eclim#client#nailgun#ChooseEclimdInstance(dir)
if type(chosen) != g:DICT_TYPE
return
endif
let instance = chosen
endif
let exec = get(options, 'exec', 0)
let [retcode, result] = eclim#client#nailgun#Execute(instance, command, exec)
let result = substitute(result, '\n$', '', '')
" not sure this is the best place to handle this, but when using the python
" client, the result has a trailing ctrl-m on windows. also account for
" running under cygwin vim.
if has('win32') || has('win64') || has('win32unix')
let result = substitute(result, "\<c-m>$", '', '')
endif
" an echo during startup causes an annoying issue with vim.
"call eclim#util#Echo(' ')
" check for errors
let error = ''
if result =~ '^[^\n]*Exception:\?[^\n]*\n\s\+\<at\> ' ||
\ result =~ '^[^\n]*ResourceException(.\{-})\[[0-9]\+\]:[^\n]*\n\s\+\<at\> '
if g:EclimLogLevel != 'trace' && !&verbose
let error = substitute(result, '\(.\{-}\)\n.*', '\1', '')
else
let error = result
endif
elseif retcode
let error = result
endif
if retcode || error != ''
if s:echo_connection_errors
if error =~ s:connect
" if we are not in an autocmd or the autocmd is for an acwrite buffer,
" alert the user that eclimd is not running.
if expand('<abuf>') == '' || &buftype == 'acwrite'
call eclim#util#EchoWarning(
\ "unable to connect to eclimd (port: " . instance.port . ") - " . error)
endif
else
let error = error . "\n" .
\ 'while executing command (port: ' . instance.port . '): ' . command
" if we are not in an autocmd or in a autocmd for an acwrite buffer,
" echo the error, otherwise just log it.
if expand('<abuf>') == '' || &buftype == 'acwrite'
call eclim#util#EchoError(error)
else
call eclim#util#EchoDebug(error)
endif
endif
endif
return
endif
let raw = get(options, 'raw', 0)
return result != '' && !raw ? eval(result) : result
endfunction " }}}
function! eclim#Disable() " {{{
if !exists('g:EclimDisabled')
let g:EclimDisabled = 1
endif
endfunction " }}}
function! eclim#Enable() " {{{
if exists('g:EclimDisabled')
unlet g:EclimDisabled
endif
endfunction " }}}
function! eclim#EclimAvailable(...) " {{{
" Optional args:
" echo: Whether or not to echo an error if eclim is not available
" (default: 1)
let instances = eclim#UserHome() . '/.eclim/.eclimd_instances'
let available = filereadable(instances)
let echo = a:0 ? a:1 : 1
if echo && !available && expand('<abuf>') == ''
call eclim#util#EchoError(printf(
\ 'No eclimd instances found running (eclimd created file not found %s)',
\ eclim#UserHome() . '/.eclim/.eclimd_instances'))
endif
return available
endfunction " }}}
function! eclim#PingEclim(echo, ...) " {{{
" If echo is non 0, then the result is echoed to the user.
" Optional args:
" workspace
let workspace = a:0 ? a:1 : ''
if a:echo
let result = eclim#Execute(s:command_ping, {'workspace': workspace})
if type(result) == g:DICT_TYPE
call eclim#util#Echo(
\ 'eclim ' . result.eclim . "\n" .
\ 'eclipse ' . result.eclipse)
endif
else
let savedErr = s:echo_connection_errors
let savedLog = g:EclimLogLevel
let s:echo_connection_errors = 0
let g:EclimLogLevel = 'off'
let result = eclim#Execute(s:command_ping, {'workspace': workspace})
let s:echo_connection_errors = savedErr
let g:EclimLogLevel = savedLog
return type(result) == g:DICT_TYPE
endif
endfunction " }}}
function! eclim#ParseSettingErrors(errors) " {{{
let errors = []
for error in a:errors
let message = error.message
let setting = substitute(message, '^\(.\{-}\): .*', '\1', '')
let message = substitute(message, '^.\{-}: \(.*\)', '\1', '')
if error.line == 1 && setting != error.message
let line = search('^\s*' . setting . '\s*=', 'cnw')
let error.line = line > 0 ? line : 1
endif
call add(errors, {
\ 'bufnr': bufnr('%'),
\ 'lnum': error.line,
\ 'text': message,
\ 'type': error.warning == 1 ? 'w' : 'e',
\ })
endfor
return errors
endfunction " }}}
function! eclim#SaveSettings(command, project) " {{{
" don't check modified since undo seems to not set the modified flag
"if &modified
let tempfile = substitute(tempname(), '\', '/', 'g')
" get all lines, filtering out comments and blank lines
let lines = filter(getline(1, line('$')), 'v:val !~ "^\\s*\\(#\\|$\\)"')
" convert lines into a settings dict
let index = 0
let settings = {}
let pattern = '^\s*\([[:alnum:]_.-]\+\)\s*=\s*\(.*\)'
while index < len(lines)
if lines[index] =~ pattern
let name = substitute(lines[index], pattern, '\1', '')
let value = substitute(lines[index], pattern, '\2', '')
while value =~ '\\$'
let index += 1
let value = substitute(value, '\\$', '', '')
let value .= substitute(lines[index], '^\s*', '', '')
endwhile
let settings[name] = value
endif
let index += 1
endwhile
call writefile([string(settings)], tempfile)
if has('win32unix')
let tempfile = eclim#cygwin#WindowsPath(tempfile)
endif
let command = a:command
let command = substitute(command, '<project>', a:project, '')
let command = substitute(command, '<settings>', tempfile, '')
if exists('b:eclimd_instance')
let result = eclim#Execute(command, {'instance': b:eclimd_instance})
else
let result = eclim#Execute(command)
endif
if type(result) == g:LIST_TYPE
call eclim#util#EchoError
\ ("Operation contained errors. See location list for details.")
let errors = eclim#ParseSettingErrors(result)
call eclim#util#SetLocationList(errors)
else
call eclim#util#ClearLocationList()
call eclim#util#Echo(result)
endif
setlocal nomodified
"endif
endfunction " }}}
function! eclim#Settings(workspace) " {{{
let instance = eclim#client#nailgun#ChooseEclimdInstance(a:workspace)
if type(instance) != g:DICT_TYPE
return
endif
let settings = eclim#Execute(s:command_settings, {'instance': instance})
if type(settings) != g:LIST_TYPE
return
endif
let content = ['# Global settings for workspace: ' . instance.workspace, '']
let path = ''
for setting in settings
if setting.path != path
if path != ''
let content += ['# }', '']
endif
let path = setting.path
call add(content, '# ' . path . ' {')
endif
let description = split(setting.description, '\n')
let content += map(description, "'\t# ' . v:val")
call add(content, "\t" . setting.name . '=' . setting.value)
endfor
if path != ''
call add(content, '# }')
endif
call eclim#util#TempWindow("Workspace_Settings", content)
setlocal buftype=acwrite
setlocal filetype=jproperties
setlocal noreadonly
setlocal modifiable
setlocal foldmethod=marker
setlocal foldmarker={,}
let b:eclimd_instance = instance
augroup eclim_settings
autocmd! BufWriteCmd <buffer>
exec 'autocmd BufWriteCmd <buffer> ' .
\ 'call eclim#SaveSettings(s:command_settings_update, "")'
augroup END
endfunction " }}}
function! eclim#ShutdownEclim() " {{{
call eclim#Execute(s:command_shutdown)
endfunction " }}}
function! eclim#LoadVimSettings() " {{{
" Set some initial logging variables for the case where eclim#UserHome needs
" to make a system call
if !exists('g:EclimLogLevel')
let g:EclimLogLevel = 'info'
let g:EclimHighlightTrace = 'Normal'
endif
let settings_file = eclim#UserHome() . '/.eclim/.eclim_settings'
if filereadable(settings_file)
let lines = readfile(settings_file)
if len(lines) == 1 && lines[0] =~ '^{.*}$'
let settings = eval(lines[0])
for [key, value] in items(settings)
let name = 'g:Eclim' . key
if !exists(name)
exec 'let ' . name . ' = ' . string(value)
endif
unlet value
endfor
endif
endif
" Handle legacy sign/log level values
let legacy = {0: 'off', 1: 'error', 2: 'error', 3: 'warning', 4: 'info', 5: 'debug', 6: 'trace'}
if exists('g:EclimLogLevel') && type(g:EclimLogLevel) == g:NUMBER_TYPE
let g:EclimLogLevel = get(legacy, g:EclimLogLevel, 'info')
endif
if exists('g:EclimSignLevel') && type(g:EclimSignLevel) == g:NUMBER_TYPE
let g:EclimSignLevel = get(legacy, g:EclimSignLevel, 'info')
endif
endfunction " }}}
function! eclim#AddVimSetting(namespace, name, default, desc, ...) " {{{
" Optional args:
" regex: regular expression used to validate the setting's value.
if !has_key(s:vim_settings, a:namespace)
let s:vim_settings[a:namespace] = {}
endif
let name = substitute(a:name, 'g:Eclim', '', '')
let s:vim_settings[a:namespace][name] = {'desc': a:desc}
let s:vim_settings_defaults[name] = a:default
let s:vim_settings_types[name] = type(a:default)
let regex = a:0 ? a:1 : ''
if regex != ''
let s:vim_settings_validators[name] = regex
if exists(a:name)
exec 'let value = ' . a:name
if value !~ '^' . regex . '$'
echo a:name . ' must match ' . regex
exec 'unlet ' . a:name
endif
endif
endif
if !exists(a:name)
exec 'let ' . a:name . ' = ' . string(a:default)
endif
endfunction " }}}
function! eclim#VimSettings() " {{{
let content = [
\ "# Eclim's global vim settings",
\ "# The settings here allow you to configure the vim side behavior of eclim.",
\ "# You can use <cr> on a setting name to open the eclim docs for that setting.",
\ "#",
\ "# Note: If you have g:EclimXXX variables set in your .vimrc, those will take",
\ "# precedence over any changes you make here.",
\ ]
for namespace in sort(keys(s:vim_settings))
let content += ['', '# ' . namespace . ' {{{']
for name in sort(keys(s:vim_settings[namespace]))
let setting = s:vim_settings[namespace][name]
let desc = split(setting.desc, '\n')
let content += map(desc, "'\t# ' . v:val")
exec 'let value = string(g:Eclim' . name . ')'
call add(content, "\t" . name . '=' . value)
endfor
let content += ['# }}}']
endfor
call eclim#util#TempWindow("Vim_Settings", content)
setlocal buftype=acwrite
setlocal filetype=jproperties
setlocal noreadonly
setlocal modifiable
setlocal foldmethod=marker
setlocal foldmarker={{{,}}}
nnoremap <buffer> <cr> :call <SID>VimSettingHelp()<cr>
augroup eclim_settings
autocmd! BufWriteCmd <buffer>
autocmd BufWriteCmd <buffer> call eclim#SaveVimSettings()
augroup END
endfunction " }}}
function! s:VimSettingHelp() " {{{
let pos = getpos('.')
try
call cursor(0, 1)
normal! w
let syntax = synIDattr(synID(line('.'), col('.'), 1), 'name')
finally
call setpos('.', pos)
endtry
if syntax == 'jpropertiesIdentifier'
let line = getline('.')
let name = substitute(line, '^\s*\(\w\+\)=.*', '\1', '')
if name != line
exec 'EclimHelp g:Eclim' . name
endif
endif
endfunction " }}}
function! eclim#SaveVimSettings() " {{{
" get all lines, filtering out comments and blank lines
let lines = filter(getline(1, line('$')), 'v:val !~ "^\\s*\\(#\\|$\\)"')
" convert lines into a settings dict
let index = 0
let settings = {}
let pattern = '^\s*\([[:alnum:]_.-]\+\)\s*=\s*\(.*\)'
let errors = []
while index < len(lines)
try
if lines[index] =~ pattern
let name = substitute(lines[index], pattern, '\1', '')
if !has_key(s:vim_settings_types, name)
continue
endif
let value = substitute(lines[index], pattern, '\2', '')
while value =~ '\\$'
let index += 1
let value = substitute(value, '\\$', '', '')
let value .= substitute(lines[index], '^\s*', '', '')
endwhile
let value = substitute(value, "\\(^['\"]\\|['\"]$\\)", '', 'g')
if has_key(s:vim_settings_validators, name)
let regex = s:vim_settings_validators[name]
if value !~ '^' . regex . '$'
let [line, col] = searchpos('^\s*' . name . '=', 'nw')
call add(errors, {
\ 'filename': expand('%'),
\ 'message': name . ': must match ' . regex,
\ 'line': line,
\ 'column': col,
\ 'type': 'error',
\ })
continue
endif
endif
if s:vim_settings_types[name] != g:STRING_TYPE
try
let typed_value = eval(value)
unlet value
let value = typed_value
catch /E121\|E115/
let [line, col] = searchpos('^\s*' . name . '=', 'nw')
call add(errors, {
\ 'filename': expand('%'),
\ 'message': name . ': ' . v:exception,
\ 'line': line,
\ 'column': col,
\ 'type': 'error',
\ })
continue
endtry
endif
let default = s:vim_settings_defaults[name]
if value != default
let settings[name] = value
endif
endif
finally
let index += 1
unlet! value typed_value default
endtry
endwhile
if len(errors)
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries(errors))
call eclim#util#EchoError(
\ len(errors) . ' error' . (len(errors) > 1 ? 's' : '') . ' found.')
return
endif
call eclim#util#ClearLocationList()
if !isdirectory(eclim#UserHome() . '/.eclim')
call mkdir(eclim#UserHome() . '/.eclim')
endif
let settings_file = eclim#UserHome() . '/.eclim/.eclim_settings'
if writefile([string(settings)], settings_file) == 0
call eclim#util#Echo('Settings saved. You may need to restart vim for all changes to take affect.')
else
call eclim#util#Echo('Unable to write settings.')
endif
setlocal nomodified
endfunction " }}}
function! eclim#UserHome() " {{{
if exists('g:EclimUserHome')
let home = g:EclimUserHome
elseif has('win32unix')
let home = eclim#cygwin#WindowsHome()
elseif has('win32') || has('win64')
let home = expand('$USERPROFILE')
else
let home = $HOME
endif
return substitute(home, '\', '/', 'g')
endfunction " }}}
function! eclim#WaitOnRunningJobs(timeout) " {{{
" Args:
" timeout: max time to wait in milliseconds
let running = 1
let waited = 0
while running && waited < a:timeout
let jobs = eclim#Execute(s:command_jobs)
if type(jobs) == g:LIST_TYPE
let running = 0
for job in jobs
if job.status == 'running'
call eclim#util#EchoDebug('Wait on job: ' . job.job)
let running = 1
let waited += 300
sleep 300m
break
endif
endfor
endif
endwhile
if running
call eclim#util#EchoDebug('Timeout exceeded waiting on jobs')
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,177 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
if !exists("g:EclimNailgunKeepAlive")
" keepAlive flag - can be re-defined in the user ~/.vimrc .
" Read once, on client initialization. Subsequent changes of
" this flag in run-time has no effect.
let g:EclimNailgunKeepAlive = 0
endif
" }}}
function! eclim#client#nailgun#ChooseEclimdInstance(...) " {{{
" Function which prompts the user to pick the target workspace and returns
" their choice or if only one workspace is active simply return it without
" prompting the user. If the optional 'dir' argument is supplied and that dir
" is a subdirectory of one of the workspaces, then that workspace will be
" returned.
" Optional args:
" dir
if !eclim#EclimAvailable()
return
endif
let instances = eclim#client#nailgun#GetEclimdInstances()
if len(instances) == 1
return instances[keys(instances)[0]]
endif
if len(instances) > 1
let path = a:0 && a:1 != '' ? a:1 : expand('%:p')
if path == ''
let path = getcwd() . '/'
endif
let path = substitute(path, '\', '/', 'g')
" when we are in a temp window, use the initiating filename
if &buftype != '' && exists('b:filename')
let path = b:filename
endif
" project inside of a workspace dir
for workspace in keys(instances)
if path =~ '^' . workspace
return instances[workspace]
endif
endfor
" project outside of a workspace dir
let project = eclim#project#util#GetProject(path)
if len(project) > 0
return get(instances, project.workspace, 0)
endif
let workspaces = keys(instances)
let response = eclim#util#PromptList(
\ 'Muliple workspaces found, please choose the target workspace',
\ workspaces, g:EclimHighlightInfo)
" user cancelled, error, etc.
if response < 0
return
endif
return instances[workspaces[response]]
endif
call eclim#util#Echo('No eclimd instances found running.')
endfunction " }}}
function! eclim#client#nailgun#GetEclimdInstances() " {{{
" Returns a dict with eclimd instances.
let instances = {}
if eclim#EclimAvailable()
let dotinstances = eclim#UserHome() . '/.eclim/.eclimd_instances'
let lines = readfile(dotinstances)
for line in lines
if line !~ '^{'
continue
endif
let values = eval(line)
let instances[values.workspace] = values
endfor
endif
return instances
endfunction " }}}
function! eclim#client#nailgun#Execute(instance, command, ...) " {{{
let exec = a:0 ? a:1 : 0
if !exec
if g:EclimNailgunClient == 'python' && has('python')
return eclim#client#python#nailgun#Execute(a:instance.port, a:command)
endif
endif
let [retcode, result] = eclim#client#nailgun#GetEclimCommand(a:instance.home)
if retcode != 0
return [retcode, result]
endif
let command = a:command
if exec
let command = escape(command, '%#')
endif
" on windows/cygwin where cmd.exe is used, we need to escape any '^'
" characters in the command args.
if has('win32') || has('win64') || has('win32unix')
let command = substitute(command, '\^', '^^', 'g')
endif
let eclim = result . ' --nailgun-server localhost --nailgun-port ' . a:instance.port . ' ' . command
if exec
let eclim = '!' . eclim
endif
let result = eclim#util#System(eclim, exec, exec)
return [v:shell_error, result]
endfunction " }}}
function! eclim#client#nailgun#GetEclimCommand(home) " {{{
" Gets the command to exexute eclim.
let command = a:home . 'bin/eclim'
if has('win32') || has('win64') || has('win32unix')
let command = command . '.bat'
endif
if !filereadable(command)
return [1, 'Could not locate file: ' . command]
endif
if has('win32unix')
" in cygwin, we must use 'cmd /c' to prevent issues with eclim script +
" some arg containing spaces causing a failure to invoke the script.
return [0, 'cmd /c "' . eclim#cygwin#WindowsPath(command) . '"']
endif
return [0, '"' . command . '"']
endfunction " }}}
function! eclim#client#nailgun#CommandCompleteWorkspaces(argLead, cmdLine, cursorPos) " {{{
" Custom command completion for available workspaces.
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
let instances = eclim#client#nailgun#GetEclimdInstances()
let workspaces = sort(keys(instances))
if cmdLine !~ '[^\\]\s$'
call filter(workspaces, 'v:val =~ "^' . argLead . '"')
endif
return workspaces
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,214 @@
"""
Copyright (C) 2005 - 2011 Eric Van Dewoestine
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
@author: Anton Sharonov
@author: Eric Van Dewoestine
"""
import socket
try:
from cStringIO import StringIO
except:
from StringIO import StringIO
class Nailgun(object):
"""
Client used to communicate with a nailgun server.
"""
def __init__(self, **kwargs):
self.socket = None
self.port = kwargs.get('port')
self.keepAlive = int(kwargs.get('keepAlive', 0))
self.reconnectCounter = 0
def send(self, cmdline):
"""
Sends a complete command to the nailgun server. Handles connecting to the
server if not currently connected.
@param cmdline command, which is sent to server, for instance
"-command ping".
@return tuple consisting of:
- retcode from server (0 for success, non-0 for failure)
- string response from server
"""
if not self.isConnected():
# with keepAlive do only first reconnect
if not self.keepAlive or self.reconnectCounter == 0:
(retcode, result) = self.reconnect()
if retcode:
return (retcode, result)
if not self.isConnected(): # Only for keepAlive
return (-1, "connect: ERROR - socket is not connected (nailgun.py)")
try: # outer try for pre python 2.5 support.
try:
for arg in self.parseArgs(cmdline):
self.sendChunk("A", arg)
if self.keepAlive:
self.sendChunk("K")
self.sendChunk("C", "org.eclim.command.Main")
(retcode, result) = self.processResponse()
if self.keepAlive and retcode:
# force reconnect on error (may not be necessary)
self.reconnect()
return (retcode, result)
except socket.error, ex:
args = ex.args
if len(args) > 1:
retcode, msg = args[0], args[1]
elif len(args):
retcode, msg = 1, args[0]
else:
retcode, msg = 1, 'No message'
return (retcode, 'send: %s' % msg)
finally:
if not self.keepAlive:
try:
self.close()
except:
# don't let an error on close mask any previous error.
pass
def connect(self, port=None):
"""
Establishes the connection to specified port or if not supplied,
uses the default.
"""
port = port or self.port
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', port))
except socket.error, ex:
args = ex.args
if len(args) > 1:
retcode, msg = args[0], args[1]
elif len(args):
retcode, msg = 1, args[0]
else:
retcode, msg = 1, 'No message'
return (retcode, 'connect: %s' % msg)
self.socket = sock
return (0, '')
def reconnect(self):
if self.socket != None:
self.close()
self.reconnectCounter += 1
return self.connect()
def close(self):
self.socket.close()
self.socket = None
def isConnected(self):
return self.socket != None
def parseArgs(self, cmdline):
# FIXME: doesn't handle escaping of spaces/quotes yet (may never need to)
args = []
arg = ''
quote = ''
for char in cmdline:
if char == ' ' and not quote:
if arg:
args.append(arg)
arg = ''
elif char == '"' or char == "'":
if quote and char == quote:
quote = ''
elif not quote:
quote = char
else:
arg += char
else:
arg += char
if arg:
args.append(arg)
return args
def sendChunk(self, chunkType, text=''):
"""
Sends a nailgun 'chunk' to the server.
"""
#print("sendChunk " + chunkType + " " + text)
length = len(text)
str = "%c%c%c%c%c" % (
(length / (65536*256)) % 256,
(length / 65536) % 256,
(length / 256) % 256,
length % 256,
chunkType)
nbytes = self.socket.sendall(str)
nbytes = self.socket.sendall(text)
def processResponse(self):
result = StringIO()
exit = 0
exitFlag = 1 # expecting 1 times exit chunk
while exitFlag > 0:
answer = self.recvBlocked(5)
if len(answer) < 5:
print("error: socket closed unexpectedly\n")
return None
lenPayload = ord(answer[0]) * 65536 * 256 \
+ ord(answer[1]) * 65536 \
+ ord(answer[2]) * 256 \
+ ord(answer[3])
#print("lenPayload detected : %d" % lenPayload)
chunkType = answer[4]
if chunkType == "1":
# STDOUT
result.write(self.recvToFD(1, answer, lenPayload))
elif chunkType == "2":
# STDERR
result.write(self.recvToFD(2, answer, lenPayload))
elif chunkType == "X":
exitFlag = exitFlag - 1
exit = int(self.recvToFD(2, answer, lenPayload))
else:
print("error: unknown chunk type = %d\n" % chunkType)
exitFlag = 0
return [exit, result.getvalue()]
def recvBlocked(self, lenPayload):
"""
Receives until all data is read - necessary because usual recv sometimes
returns with number of bytes read less then asked.
"""
received = ""
while (len(received) < lenPayload):
received = received + self.socket.recv(lenPayload - len(received))
return received
def recvToFD(self, destFD, buf, lenPayload):
"""
This function just mimics the function with the same name from the C
client. We don't really care which file descriptor the server tells us to
write to - STDOUT and STDERR are the same on VIM side (see eclim.bat,
"2>&1" at the end of command).
"""
received = self.recvBlocked(lenPayload)
return received

View file

@ -0,0 +1,115 @@
" Author: Anton Sharonov
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2010 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:python_dir = expand("<sfile>:h")
" }}}
" Execute(port, command) {{{
" Sends to the eclimd server command, supplied as argument string.
" Returns server's respond.
function! eclim#client#python#nailgun#Execute(port, command)
call s:InitClient(a:port)
let result_viml = ""
let retcode = 0
let begin = localtime()
try
python << PYTHONEOF
command = vim.eval('a:command')
(retcode, result) = client.send(command)
vim.command('let retcode = %i' % retcode)
vim.command("let result = '%s'" % result.replace("'", "''"))
PYTHONEOF
finally
call eclim#util#EchoTrace(
\ 'nailgun.py (port: ' . a:port . '): ' . a:command, localtime() - begin)
endtry
return [retcode, result]
endfunction " }}}
" Reconnect(port) {{{
" Does unconditional reconnect of the python_if
" (useful to manual recover from errors in the python_if)
function! eclim#client#python#nailgun#Reconnect(port)
call s:InitClient(a:port)
python << PYTHONEOF
client.reconnect()
PYTHONEOF
endfunction " }}}
" SetKeepAlive(port, value) {{{
" Updates the in runtime value of the keepAlive flag.
function! eclim#client#python#nailgun#SetKeepAlive(port, value)
call s:InitClient(a:port)
python << PYTHONEOF
client.keepAlive = int(vim.eval('a:value'))
PYTHONEOF
endfunction " }}}
" GetKeepAlive(port) {{{
" Retrieves the value of the keepAlive flag.
function! eclim#client#python#nailgun#GetKeepAlive(port)
call s:InitClient(a:port)
let result = 0
python << PYTHONEOF
vim.command("let result = %s" % client.keepAlive)
PYTHONEOF
return result
endfunction " }}}
" GetReconnectCounter(port) {{{
" Retrieves the value of the reconnect counter.
function! eclim#client#python#nailgun#GetReconnectCounter(port)
call s:InitClient(a:port)
let result = 0
python << PYTHONEOF
vim.command("let result = %d" % client.reconnectCounter)
PYTHONEOF
return result
endfunction " }}}
" s:InitClient(port) {{{
" Initializes the python interface to the nailgun server.
function! s:InitClient(port)
python << PYTHONEOF
if not vars().has_key('clients'):
import sys, vim
sys.path.append(vim.eval('s:python_dir'))
import nailgun
clients = {}
port = int(vim.eval('a:port'))
if not clients.has_key(port):
clients[port] = nailgun.Nailgun(
port=port,
keepAlive=vim.eval('g:EclimNailgunKeepAlive'),
)
client = clients[port]
PYTHONEOF
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,379 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" ScriptVariables {{{
let s:eclim_tab_id = 0
" }}}
function! eclim#common#buffers#Buffers(bang) " {{{
" Like, :buffers, but opens a temporary buffer.
let options = {'maxfilelength': 0}
let buffers = eclim#common#buffers#GetBuffers(options)
if g:EclimBuffersSort != ''
call sort(buffers, 'eclim#common#buffers#BufferCompare')
endif
let lines = []
let buflist = []
let filelength = options['maxfilelength']
let tabid = exists('*gettabvar') ? s:GetTabId() : 0
let tabbuffers = tabpagebuflist()
for buffer in buffers
let eclim_tab_id = getbufvar(buffer.bufnr, 'eclim_tab_id')
if a:bang != '' || eclim_tab_id == '' || eclim_tab_id == tabid
" for buffers w/ out a tab id, don't show them in the list if they
" are active, but aren't open on the current tab.
if a:bang == '' && buffer.status =~ 'a' && index(tabbuffers, buffer.bufnr) == -1
continue
endif
call add(lines, s:BufferEntryToLine(buffer, filelength))
call add(buflist, buffer)
endif
endfor
call eclim#util#TempWindow('[buffers]', lines)
setlocal modifiable noreadonly
call append(line('$'), ['', '" use ? to view help'])
setlocal nomodifiable readonly
let b:eclim_buffers = buflist
" syntax
set ft=eclim_buffers
hi link BufferActive Special
hi link BufferHidden Comment
syntax match BufferActive /+\?active\s\+\(\[RO\]\)\?/
syntax match BufferHidden /+\?hidden\s\+\(\[RO\]\)\?/
syntax match Comment /^".*/
" mappings
nnoremap <silent> <buffer> <cr> :call <SID>BufferOpen(g:EclimBuffersDefaultAction)<cr>
nnoremap <silent> <buffer> E :call <SID>BufferOpen('edit')<cr>
nnoremap <silent> <buffer> S :call <SID>BufferOpen('split')<cr>
nnoremap <silent> <buffer> V :call <SID>BufferOpen('vsplit')<cr>
nnoremap <silent> <buffer> T :call <SID>BufferOpen('tablast \| tabnew')<cr>
nnoremap <silent> <buffer> D :call <SID>BufferDelete()<cr>
nnoremap <silent> <buffer> R :Buffers<cr>
" assign to buffer var to get around weird vim issue passing list containing
" a string w/ a '<' in it on execution of mapping.
let b:buffers_help = [
\ '<cr> - open buffer with default action',
\ 'E - open with :edit',
\ 'S - open in a new split window',
\ 'V - open in a new vertically split window',
\ 'T - open in a new tab',
\ 'D - delete the buffer',
\ 'R - refresh the buffer list',
\ ]
nnoremap <buffer> <silent> ?
\ :call eclim#help#BufferHelp(b:buffers_help, 'vertical', 40)<cr>
"augroup eclim_buffers
" autocmd!
" autocmd BufAdd,BufWinEnter,BufDelete,BufWinLeave *
" \ call eclim#common#buffers#BuffersUpdate()
" autocmd BufUnload <buffer> autocmd! eclim_buffers
"augroup END
endfunction " }}}
function! eclim#common#buffers#BuffersToggle(bang) " {{{
let name = eclim#util#EscapeBufferName('[buffers]')
if bufwinnr(name) == -1
call eclim#common#buffers#Buffers(a:bang)
else
exec "bdelete " . bufnr(name)
endif
endfunction " }}}
function! eclim#common#buffers#BufferCompare(buffer1, buffer2) " {{{
exec 'let attr1 = a:buffer1.' . g:EclimBuffersSort
exec 'let attr2 = a:buffer2.' . g:EclimBuffersSort
let compare = attr1 == attr2 ? 0 : attr1 > attr2 ? 1 : -1
if g:EclimBuffersSortDirection == 'desc'
let compare = 0 - compare
endif
return compare
endfunction " }}}
function! eclim#common#buffers#Only() " {{{
let curwin = winnr()
let winnum = 1
while winnum <= winnr('$')
let fixed = g:EclimOnlyExcludeFixed && (
\ getwinvar(winnum, '&winfixheight') == 1 ||
\ getwinvar(winnum, '&winfixwidth') == 1)
let excluded = bufname(winbufnr(winnum)) =~ g:EclimOnlyExclude
if winnum != curwin && !fixed && !excluded
if winnum < curwin
let curwin -= 1
endif
exec winnum . 'winc w'
close
exec curwin . 'winc w'
continue
endif
let winnum += 1
endwhile
endfunction " }}}
function! eclim#common#buffers#GetBuffers(...) " {{{
let options = a:0 ? a:1 : {}
redir => list
silent buffers
redir END
let buffers = []
let maxfilelength = 0
for entry in split(list, '\n')
let buffer = {}
let buffer.status = substitute(entry, '\s*[0-9]\+\s\+\(.\{-}\)\s\+".*', '\1', '')
let buffer.path = substitute(entry, '.\{-}"\(.\{-}\)".*', '\1', '')
let buffer.path = fnamemodify(buffer.path, ':p')
let buffer.file = fnamemodify(buffer.path, ':p:t')
let buffer.dir = fnamemodify(buffer.path, ':p:h')
let buffer.bufnr = str2nr(substitute(entry, '\s*\([0-9]\+\).*', '\1', ''))
let buffer.lnum = str2nr(substitute(entry, '.*"\s\+\w\+\s\+\(\d\+\)', '\1', ''))
call add(buffers, buffer)
if len(buffer.file) > maxfilelength
let maxfilelength = len(buffer.file)
endif
endfor
if has_key(options, 'maxfilelength')
let options['maxfilelength'] = maxfilelength
endif
return buffers
endfunction " }}}
function! eclim#common#buffers#TabInit() " {{{
let tabnr = 1
while tabnr <= tabpagenr('$')
let tab_id = gettabvar(tabnr, 'eclim_tab_id')
if tab_id == ''
let s:eclim_tab_id += 1
call settabvar(tabnr, 'eclim_tab_id', s:eclim_tab_id)
for bufnr in tabpagebuflist(tabnr)
let btab_id = getbufvar(bufnr, 'eclim_tab_id')
if btab_id == ''
call setbufvar(bufnr, 'eclim_tab_id', s:eclim_tab_id)
endif
endfor
endif
let tabnr += 1
endwhile
endfunction " }}}
function! eclim#common#buffers#TabEnter() " {{{
if !s:GetTabId()
call s:SetTabId()
endif
if g:EclimBuffersDeleteOnTabClose
if exists('s:tab_count') && s:tab_count > tabpagenr('$')
" delete any buffers associated with the closed tab
let buffers = eclim#common#buffers#GetBuffers()
for buffer in buffers
let eclim_tab_id = getbufvar(buffer.bufnr, 'eclim_tab_id')
" don't delete active buffers, just in case the tab has the wrong
" eclim_tab_id
if eclim_tab_id == s:tab_prev && buffer.status !~ 'a'
try
exec 'bdelete ' . buffer.bufnr
catch /E89/
" ignore since it happens when using bd! on the last buffer for
" another tab.
endtry
endif
endfor
endif
endif
endfunction " }}}
function! eclim#common#buffers#TabLeave() " {{{
let s:tab_prev = s:GetTabId()
let s:tab_count = tabpagenr('$')
endfunction " }}}
function! eclim#common#buffers#TabLastOpenIn() " {{{
if !buflisted('%')
silent! unlet b:eclim_tab_id
endif
if !s:GetTabId()
call s:SetTabId()
endif
let tabnr = 1
let other_tab = 0
let bufnr = bufnr('%')
while tabnr <= tabpagenr('$')
if tabnr != tabpagenr() &&
\ eclim#util#ListContains(tabpagebuflist(tabnr), bufnr)
let other_tab = tabnr
break
endif
let tabnr += 1
endwhile
if !exists('b:eclim_tab_id') || !other_tab
let b:eclim_tab_id = s:GetTabId()
endif
endfunction " }}}
function! eclim#common#buffers#OpenNextHiddenTabBuffer(current) " {{{
let allbuffers = eclim#common#buffers#GetBuffers()
" build list of buffers open in other tabs to exclude
let tabbuffers = []
let lasttab = tabpagenr('$')
let index = 1
while index <= lasttab
if index != tabpagenr()
for bnum in tabpagebuflist(index)
call add(tabbuffers, bnum)
endfor
endif
let index += 1
endwhile
" build list of buffers not open in any window, and last seen on the
" current tab.
let hiddenbuffers = []
for buffer in allbuffers
let bnum = buffer.bufnr
if bnum != a:current && index(tabbuffers, bnum) == -1 && bufwinnr(bnum) == -1
let eclim_tab_id = getbufvar(bnum, 'eclim_tab_id')
if eclim_tab_id != '' && eclim_tab_id != t:eclim_tab_id
continue
endif
if bnum < a:current
call insert(hiddenbuffers, bnum)
else
call add(hiddenbuffers, bnum)
endif
endif
endfor
" we found a hidden buffer, so open it
if len(hiddenbuffers) > 0
exec 'buffer ' . hiddenbuffers[0]
doautocmd BufEnter
doautocmd BufWinEnter
doautocmd BufReadPost
return hiddenbuffers[0]
endif
return 0
endfunction " }}}
function! s:BufferDelete() " {{{
let line = line('.')
if line > len(b:eclim_buffers)
return
endif
let index = line - 1
setlocal modifiable
setlocal noreadonly
exec line . ',' . line . 'delete _'
setlocal nomodifiable
setlocal readonly
let buffer = b:eclim_buffers[index]
call remove(b:eclim_buffers, index)
let winnr = winnr()
" make sure the autocmds are executed in the following order
noautocmd exec 'bd ' . buffer.bufnr
doautocmd BufDelete
doautocmd BufEnter
exec winnr . 'winc w'
endfunction " }}}
function! s:BufferEntryToLine(buffer, filelength) " {{{
let line = ''
let line .= a:buffer.status =~ '+' ? '+' : ' '
let line .= a:buffer.status =~ 'a' ? 'active' : 'hidden'
let line .= a:buffer.status =~ '[-=]' ? ' [RO] ' : ' '
let line .= a:buffer.file
let pad = a:filelength - len(a:buffer.file) + 2
while pad > 0
let line .= ' '
let pad -= 1
endwhile
let line .= a:buffer.dir
return line
endfunction " }}}
function! s:BufferOpen(cmd) " {{{
let line = line('.')
if line > len(b:eclim_buffers)
return
endif
let file = bufname(b:eclim_buffers[line - 1].bufnr)
let winnr = b:winnr
close
" prevent opening the buffer in a split of a vertical tool window (project
" tree, taglist, etc.)
if exists('g:VerticalToolBuffers') && has_key(g:VerticalToolBuffers, winbufnr(winnr))
let winnr = 1
while has_key(g:VerticalToolBuffers, winbufnr(winnr))
let winnr += 1
if winnr > winnr('$')
let winnr -= 1
break
endif
endwhile
endif
exec winnr . 'winc w'
call eclim#util#GoToBufferWindowOrOpen(file, a:cmd)
endfunction " }}}
function! s:GetTabId(...) " {{{
let tabnr = a:0 ? a:1 : tabpagenr()
" using gettabvar over t:eclim_tab_id because while autocmds are executing,
" the tabpagenr() may return the correct tab number, but accessing
" t:eclim_tab_id may return the value from the previously focused tab.
return gettabvar(tabnr, 'eclim_tab_id')
endfunction " }}}
function! s:SetTabId(...) " {{{
let tabnr = a:0 ? a:1 : tabpagenr()
let s:eclim_tab_id += 1
" using settabvar for reason explained in s:GetTabId()
call settabvar(tabnr, 'eclim_tab_id', s:eclim_tab_id)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,316 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_add = '-command history_add -p "<project>" -f "<file>"'
let s:command_list = '-command history_list -p "<project>" -f "<file>"'
let s:command_revision =
\ '-command history_revision -p "<project>" -f "<file>" -r <revision>'
let s:command_clear = '-command history_clear -p "<project>" -f "<file>"'
" }}}
function! eclim#common#history#AddHistory() " {{{
" Adds the current state of the file to the eclipse local history (should be
" invoked prior to saving to disk).
if !filereadable(expand('%')) || !eclim#project#util#IsCurrentFileInProject(0)
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_add
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
call eclim#Execute(command)
endfunction " }}}
function! eclim#common#history#History() " {{{
" Opens a temporary buffer with a list of local history revisions.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_list
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let history = eclim#Execute(command)
if type(history) != g:LIST_TYPE
return
endif
let lines = [file]
let revisions = [0]
let indent = eclim#util#GetIndent(1)
for rev in history
call add(lines, indent . rev.datetime . ' (' . rev.delta . ')')
call add(revisions, rev.timestamp)
endfor
call add(lines, '')
call eclim#util#TempWindow('[History]', lines)
setlocal modifiable noreadonly
if !g:EclimKeepLocalHistory
call append(line('$'),
\ '" Note: local history is currently disabled: ' .
\ 'g:EclimKeepLocalHistory = ' . g:EclimKeepLocalHistory)
endif
call append(line('$'), '" use ? to view help')
setlocal nomodifiable readonly
syntax match Comment /^".*/
let b:history_revisions = revisions
call s:Syntax()
command! -count=1 HistoryDiffNext call s:DiffNextPrev(1, <count>)
command! -count=1 HistoryDiffPrev call s:DiffNextPrev(-1, <count>)
augroup eclim_history_window
autocmd! BufWinLeave <buffer>
autocmd BufWinLeave <buffer>
\ delcommand HistoryDiffNext |
\ delcommand HistoryDiffPrev
augroup END
noremap <buffer> <silent> <cr> :call <SID>View()<cr>
noremap <buffer> <silent> d :call <SID>Diff()<cr>
noremap <buffer> <silent> r :call <SID>Revert()<cr>
noremap <buffer> <silent> c :call <SID>Clear(1)<cr>
" assign to buffer var to get around weird vim issue passing list containing
" a string w/ a '<' in it on execution of mapping.
let b:history_help = [
\ '<cr> - view the entry',
\ 'd - diff the file with the version under the cursor',
\ 'r - revert the file to the version under the cursor',
\ 'c - clear the history',
\ ':HistoryDiffNext - diff the file with the next version in the history',
\ ':HistoryDiffPrev - diff the file with the previous version in the history',
\ ]
nnoremap <buffer> <silent> ?
\ :call eclim#help#BufferHelp(b:history_help, 'vertical', 50)<cr>
endfunction " }}}
function! eclim#common#history#HistoryClear(bang) " {{{
" Clear the history for the current file.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call s:Clear(a:bang == '', expand('%:p'))
endfunction " }}}
function s:View(...) " {{{
" View the contents of the revision under the cursor.
if line('.') == 1 || line('.') > len(b:history_revisions)
return
endif
let current = b:filename
let entry = line('.') - 1
let revision = b:history_revisions[entry]
if eclim#util#GoToBufferWindow(current)
let filetype = &ft
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_revision
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<revision>', revision, '')
let result = eclim#Execute(command)
if result == "0"
return
endif
let cmd = len(a:000) > 0 ? a:000[0] : 'split'
call eclim#util#GoToBufferWindowOrOpen(
\ current . '_' . revision, 'keepalt ' . cmd)
setlocal modifiable
setlocal noreadonly
let temp = tempname()
call writefile(split(result, '\n'), temp)
try
silent 1,$delete _
silent read ++edit `=temp`
silent 1,1delete _
finally
call delete(temp)
endtry
exec 'setlocal filetype=' . filetype
setlocal nomodified
setlocal readonly
setlocal nomodifiable
setlocal noswapfile
setlocal nobuflisted
setlocal buftype=nofile
setlocal bufhidden=wipe
doautocmd BufReadPost
call s:HighlightEntry(entry)
return 1
else
call eclim#util#EchoWarning('Target file is no longer open.')
endif
endfunction " }}}
function s:Diff() " {{{
" Diff the contents of the revision under the cursor against the current
" contents.
let hist_buf = bufnr('%')
let winend = winnr('$')
let winnum = 1
while winnum <= winend
let bufnr = winbufnr(winnum)
if getbufvar(bufnr, 'history_diff') != ''
exec bufnr . 'bd'
continue
endif
let winnum += 1
endwhile
call eclim#util#GoToBufferWindow(hist_buf)
let current = b:filename
let orien = g:EclimHistoryDiffOrientation == 'horizontal' ? '' : 'vertical'
if s:View(orien . ' below split')
let b:history_diff = 1
diffthis
augroup history_diff
autocmd! BufWinLeave <buffer>
call eclim#util#GoToBufferWindowRegister(current)
autocmd BufWinLeave <buffer> diffoff
augroup END
call eclim#util#GoToBufferWindow(current)
diffthis
endif
endfunction " }}}
function s:DiffNextPrev(dir, count) " {{{
let winnr = winnr()
if eclim#util#GoToBufferWindow('[History]')
let num = v:count > 0 ? v:count : a:count
let cur = exists('b:history_current_entry') ? b:history_current_entry : 0
let index = cur + (a:dir * num)
if index < 0 || index > len(b:history_revisions)
call eclim#util#EchoError('Operation exceeds history stack range.')
exec winnr . 'winc w'
return
endif
call cursor(index + 1, 0)
call s:Diff()
endif
endfunction " }}}
function s:Revert() " {{{
" Revert the file to the revision under the cursor.
if line('.') == 1 || line('.') > len(b:history_revisions)
return
endif
let current = b:filename
let revision = b:history_revisions[line('.') - 1]
if eclim#util#GoToBufferWindow(current)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_revision
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<revision>', revision, '')
let result = eclim#Execute(command)
if result == "0"
return
endif
let ff = &ff
let temp = tempname()
call writefile(split(result, '\n'), temp)
try
silent 1,$delete _
silent read ++edit `=temp`
silent 1,1delete _
finally
call delete(temp)
endtry
if ff != &ff
call eclim#util#EchoWarning(
\ "Warning: the file format is being reverted from '" . ff . "' to '" .
\ &ff . "'. Using vim's undo will not restore the previous format so " .
\ "if you choose to undo the reverting of this file, you will need to " .
\ "manually set the file format back to " . ff . " (set ff=" . ff . ").")
endif
endif
endfunction " }}}
function s:Clear(prompt, ...) " {{{
" Optional args:
" filename
let response = 1
if a:prompt
let response = eclim#util#PromptConfirm(
\ 'Clear local history?', g:EclimHighlightInfo)
endif
if response == 1
let filename = len(a:000) > 0 ? a:000[0] : b:filename
let current = eclim#project#util#GetProjectRelativeFilePath(filename)
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_clear
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', current, '')
let result = eclim#Execute(command)
if result == "0"
return
endif
if filename != expand('%:p')
quit
endif
call eclim#util#Echo(result)
endif
endfunction " }}}
function! s:Syntax() " {{{
set ft=eclim_history
hi link HistoryFile Identifier
hi link HistoryCurrentEntry Constant
syntax match HistoryFile /.*\%1l.*/
syntax match Comment /^".*/
endfunction " }}}
function s:HighlightEntry(index) " {{{
let winnr = winnr()
if eclim#util#GoToBufferWindow('[History]')
let b:history_current_entry = a:index
try
" forces reset of syntax
call s:Syntax()
exec 'syntax match HistoryCurrentEntry /.*\%' . (a:index + 1) . 'l.*/'
finally
exec winnr . 'winc w'
endtry
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,58 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Initially based on vimscript 1506
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Settings {{{
let s:file_size = g:EclimLargeFileSize * 1024 * 1024
let s:events = ['BufRead', 'CursorHold', 'FileType']
" }}}
function! eclim#common#largefile#InitSettings() " {{{
let file = expand("<afile>")
let size = getfsize(file)
if size >= s:file_size || size == -2
if !exists('b:save_events')
let b:save_events = &eventignore
call s:ApplySettings()
setlocal noswapfile nowrap bufhidden=unload
autocmd eclim_largefile BufEnter,BufWinEnter <buffer> call <SID>ApplySettings()
autocmd eclim_largefile BufLeave,BufWinLeave <buffer> call <SID>RevertSettings()
endif
endif
endfunction " }}}
function! s:ApplySettings() " {{{
let &eventignore=join(s:events, ',')
if !exists('b:largefile_notified')
let b:largefile_notified = 1
call eclim#util#Echo('Note: Large file settings applied.')
endif
endfunction " }}}
function! s:RevertSettings() " {{{
if exists('b:save_events')
let &eventignore=b:save_events
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,87 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:year = exists('*strftime') ? strftime('%Y') : '2009'
" }}}
" GetLicense() {{{
" Retrieves the file containing the license text.
function! eclim#common#license#GetLicense()
let file = eclim#project#util#GetProjectSetting('org.eclim.project.copyright')
if type(file) == g:NUMBER_TYPE
return
elseif file == ''
call eclim#util#EchoWarning(
\ "Project setting 'org.eclim.project.copyright' has not been supplied.")
return
endif
let file = eclim#project#util#GetCurrentProjectRoot() . '/' . file
if !filereadable(file)
return
endif
return file
endfunction " }}}
" License(pre, post, mid) {{{
" Retrieves the license configured license and applies the specified prefix
" and postfix as the lines before and after the license and uses 'mid' as the
" prefix for every line.
" Returns the license as a list of strings.
function! eclim#common#license#License(pre, post, mid)
let file = eclim#common#license#GetLicense()
if type(file) == g:NUMBER_TYPE && file == 0
return ''
endif
let contents = readfile(file)
if a:mid != ''
call map(contents, 'a:mid . v:val')
endif
if a:pre != ''
call insert(contents, a:pre)
endif
if a:post != ''
call add(contents, a:post)
endif
call map(contents, "substitute(v:val, '${year}', s:year, 'g')")
let author = eclim#project#util#GetProjectSetting('org.eclim.user.name')
if type(author) == g:STRING_TYPE && author != ''
call map(contents, "substitute(v:val, '${author}', author, 'g')")
endif
let email = eclim#project#util#GetProjectSetting('org.eclim.user.email')
if type(email) == g:STRING_TYPE && email != ''
call map(contents, "substitute(v:val, '${email}', email, 'g')")
endif
call map(contents, "substitute(v:val, '\\s\\+$', '', '')")
return contents
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,650 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
let g:eclim_locate_default_updatetime = &updatetime
" disable autocomplpop in the locate prompt
if exists('g:acp_behavior')
let g:acp_behavior['locate_prompt'] = []
endif
" }}}
" Script Variables {{{
let s:command_locate = '-command locate_file -s "<scope>"'
let s:scopes = [
\ 'project',
\ 'workspace',
\ 'buffers',
\ 'quickfix',
\ ]
let s:help = [
\ '<esc> - close the locate prompt + results',
\ '<tab>, <down> - select the next file',
\ '<s-tab>, <up> - select the previous file',
\ '<cr> - open selected file w/ default action',
\ '<c-e> - open with :edit',
\ '<c-s> - open in a split window',
\ '<c-t> - open in a new tab',
\ '<c-l> - choose search scope',
\ '<c-h> - toggle help buffer',
\ ]
" }}}
function! eclim#common#locate#LocateFile(action, file, ...) " {{{
" Locates a file using the specified action for opening the file when found.
" action - '' (use user default), 'split', 'edit', etc.
" file - 'somefile.txt',
" '', (kick off completion mode),
" '<cursor>' (locate the file under the cursor)
" scope - optional scope to search in (project, workspace, buffers, etc.)
let project = eclim#project#util#GetCurrentProjectName()
let scope = a:0 > 0 ? a:1 : g:EclimLocateFileScope
if !eclim#util#ListContains(s:scopes, scope) &&
\ !eclim#util#ListContains(g:EclimLocateUserScopes, scope)
call eclim#util#EchoWarning('Unrecognized scope: ' . scope)
return
endif
if scope == 'project' && (project == '' || !eclim#EclimAvailable(0))
let scope = g:EclimLocateFileNonProjectScope
endif
let workspace = ''
if scope == 'project' || scope == 'workspace'
let instance = eclim#client#nailgun#ChooseEclimdInstance()
if type(instance) != g:DICT_TYPE
return
endif
let workspace = instance.workspace
if !eclim#PingEclim(0, workspace)
call eclim#util#EchoError('Unable to connect to eclimd.')
return
endif
endif
let results = []
let action = a:action
if action == ''
let action = g:EclimLocateFileDefaultAction
endif
let file = a:file
if file == ''
call s:LocateFileCompletionInit(action, scope, project, workspace)
return
elseif file == '<cursor>'
let file = eclim#util#GrabUri()
" if grabbing a relative url, remove any anchor info or query parameters
let file = substitute(file, '[#?].*', '', '')
endif
let name = fnamemodify(file, ':t')
if name == ''
call eclim#util#Echo('Please supply more than just a directory name.')
return
endif
let pattern = file
let pattern = s:LocateFileConvertPattern(pattern, 0)
let pattern = '[^/]*' . pattern
try
let b:workspace = workspace
let b:project = project
let results = s:LocateFileFunction(scope)(pattern)
finally
unlet! b:workspace
unlet! b:project
endtry
call map(results, "v:val.path")
let result = ''
" One result.
if len(results) == 1
let result = results[0]
" More than one result.
elseif len(results) > 1
let message = "Multiple results, choose the file to open"
let response = eclim#util#PromptList(message, results, g:EclimHighlightInfo)
if response == -1
return
endif
let result = results[response]
" No results
else
call eclim#util#Echo('Unable to locate file pattern "' . file . '".')
return
endif
if has('win32unix')
let result = eclim#cygwin#CygwinPath(result)
endif
call eclim#util#GoToBufferWindowOrOpen(eclim#util#Simplify(result), action)
call eclim#util#Echo(' ')
endfunction " }}}
function! eclim#common#locate#LocateFileCompletion() " {{{
let line = getline('.')
if line !~ '^> '
call setline(1, substitute(line, '^>\?\s*', '> \1', ''))
call cursor(1, 3)
let line = getline('.')
endif
let completions = []
let display = []
let name = substitute(line, '^>\s*', '', '')
if name !~ '^\s*$'
let pattern = name
let pattern = s:LocateFileConvertPattern(pattern, g:EclimLocateFileFuzzy)
let results = s:LocateFileFunction(b:scope)(pattern)
if !empty(results)
for result in results
let rel = eclim#util#Simplify(get(result, 'projectPath', result.path))
let dict = {'word': result.name, 'menu': rel, 'info': result.path}
call add(completions, dict)
call add(display, result.name . ' ' . rel)
endfor
endif
endif
let b:completions = completions
let winnr = winnr()
noautocmd exec bufwinnr(b:results_bufnum) . 'winc w'
setlocal modifiable
1,$delete _
call append(1, display)
1,1delete _
setlocal nomodifiable
exec winnr . 'winc w'
" part of bad hack for gvim on windows
let b:start_selection = 1
call s:LocateFileSelection(1)
endfunction " }}}
function! eclim#common#locate#LocateFileClose() " {{{
if bufname(bufnr('%')) !~ '^\[Locate.*\]$'
let bufnr = bufnr('\[Locate in *\]')
let winnr = bufwinnr(bufnr)
if winnr != -1
let curbuf = bufnr('%')
exec winnr . 'winc w'
try
exec 'bw ' . b:results_bufnum
bw
autocmd! locate_file_init
stopinsert
finally
exec bufwinnr(curbuf) . 'winc w'
endtry
endif
endif
endfunction " }}}
function! s:LocateFileCompletionInit(action, scope, project, workspace) " {{{
let file = expand('%')
let bufnum = bufnr('%')
let winnr = winnr()
let winrestcmd = winrestcmd()
topleft 12split [Locate\ Results]
set filetype=locate_results
setlocal nonumber nowrap
setlocal noswapfile nobuflisted
setlocal nospell norelativenumber
setlocal buftype=nofile bufhidden=delete
let results_bufnum = bufnr('%')
let locate_in = (a:scope == 'project' ? a:project : a:scope)
exec 'topleft 1split ' . escape('[Locate in ' . locate_in . ']', ' -')
setlocal modifiable
call setline(1, '> ')
call cursor(1, col('$'))
set filetype=locate_prompt
syntax match Keyword /^>/
setlocal winfixheight
setlocal nonumber
setlocal nolist
setlocal noswapfile nobuflisted
setlocal nospell norelativenumber
setlocal buftype=nofile bufhidden=delete
let b:bufnum = bufnum
let b:winnr = winnr
let b:project = a:project
let b:workspace = a:workspace
let b:scope = a:scope
let b:results_bufnum = results_bufnum
let b:help_bufnum = 0
let b:selection = 1
let b:winrestcmd = winrestcmd
set updatetime=300
augroup locate_file_init
autocmd!
autocmd BufEnter <buffer> nested startinsert! | let &updatetime = 300
autocmd BufLeave \[Locate*\]
\ call eclim#util#DelayedCommand('call eclim#common#locate#LocateFileClose()')
exec 'autocmd InsertLeave <buffer> ' .
\ 'let &updatetime = g:eclim_locate_default_updatetime | ' .
\ 'doautocmd BufWinLeave | bw | ' .
\ 'doautocmd BufWinLeave | bw ' . b:results_bufnum . ' | ' .
\ 'call eclim#util#GoToBufferWindow(' . b:bufnum . ') | ' .
\ 'doautocmd BufEnter | ' .
\ 'doautocmd WinEnter | ' .
\ winrestcmd
exec 'autocmd WinEnter <buffer=' . b:results_bufnum .'> '
\ 'exec bufwinnr(' . bufnr('%') . ') "winc w"'
augroup END
" enable completion after user starts typing
call s:LocateFileCompletionAutocmdDeferred()
inoremap <buffer> <silent> <tab> <c-r>=<SID>LocateFileSelection("n")<cr>
inoremap <buffer> <silent> <c-j> <c-r>=<SID>LocateFileSelection("n")<cr>
inoremap <buffer> <silent> <down> <c-r>=<SID>LocateFileSelection("n")<cr>
inoremap <buffer> <silent> <s-tab> <c-r>=<SID>LocateFileSelection("p")<cr>
inoremap <buffer> <silent> <up> <c-r>=<SID>LocateFileSelection("p")<cr>
inoremap <buffer> <silent> <c-k> <c-r>=<SID>LocateFileSelection("p")<cr>
exec 'inoremap <buffer> <silent> <cr> ' .
\ '<c-r>=<SID>LocateFileSelect("' . a:action . '")<cr>'
inoremap <buffer> <silent> <c-e> <c-r>=<SID>LocateFileSelect('edit')<cr>
inoremap <buffer> <silent> <c-s> <c-r>=<SID>LocateFileSelect('split')<cr>
inoremap <buffer> <silent> <c-t> <c-r>=<SID>LocateFileSelect("tablast \| tabnew")<cr>
inoremap <buffer> <silent> <c-l> <c-r>=<SID>LocateFileChangeScope()<cr>
inoremap <buffer> <silent> <c-h> <c-r>=<SID>LocateFileHelp()<cr>
startinsert!
endfunction " }}}
function! s:LocateFileCompletionAutocmd() " {{{
augroup locate_file
autocmd!
autocmd CursorHoldI <buffer> call eclim#common#locate#LocateFileCompletion()
augroup END
endfunction " }}}
function! s:LocateFileCompletionAutocmdDeferred() " {{{
augroup locate_file
autocmd!
autocmd CursorMovedI <buffer> call <SID>LocateFileCompletionAutocmd()
augroup END
endfunction " }}}
function! s:LocateFileSelection(sel) " {{{
" pause completion while tabbing though results
augroup locate_file
autocmd!
augroup END
let sel = a:sel
let prev_sel = b:selection
" bad hack for gvim on windows
let start_sel = b:start_selection
let double_defer = 0
if sel =~ '^[np]$' && (has('win32') || has('win64'))
let double_defer = b:start_selection == 1
let b:start_selection = 0
endif
let winnr = winnr()
noautocmd exec bufwinnr(b:results_bufnum) . 'winc w'
if sel == 'n'
let sel = prev_sel < line('$') ? prev_sel + 1 : 1
elseif sel == 'p'
let sel = prev_sel > 1 ? prev_sel - 1 : line('$')
endif
syntax clear
exec 'syntax match PmenuSel /\%' . sel . 'l.*/'
exec 'call cursor(' . sel . ', 1)'
let save_scrolloff = &scrolloff
let &scrolloff = 5
normal! zt
let &scrolloff = save_scrolloff
exec winnr . 'winc w'
exec 'let b:selection = ' . sel
if double_defer
augroup locate_file
autocmd!
autocmd CursorMovedI <buffer> call <SID>LocateFileCompletionAutocmdDeferred()
augroup END
else
call s:LocateFileCompletionAutocmdDeferred()
endif
return ''
endfunction " }}}
function! s:LocateFileSelect(action) " {{{
if exists('b:completions') && !empty(b:completions)
let &updatetime = g:eclim_locate_default_updatetime
let file = eclim#util#Simplify(b:completions[b:selection - 1].info)
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
let bufnum = b:bufnum
let winnr = b:winnr
let winrestcmd = b:winrestcmd
" close locate windows
exec 'bdelete ' . b:results_bufnum
exec 'bdelete ' . bufnr('%')
" reset windows to pre-locate sizes
exec winrestcmd
" open the selected result
exec winnr . "wincmd w"
" call eclim#util#GoToBufferWindow(bufnum)
call eclim#util#GoToBufferWindowOrOpen(file, a:action)
call feedkeys("\<esc>", 'n')
doautocmd WinEnter
endif
return ''
endfunction " }}}
function! s:LocateFileChangeScope() " {{{
if b:help_bufnum && bufexists(b:help_bufnum)
exec 'bdelete ' . b:help_bufnum
endif
let bufnr = bufnr('%')
let winnr = winnr()
" trigger [Locate] buffer's BufLeave autocmd before we leave the buffer
doautocmd BufLeave
noautocmd exec bufwinnr(b:results_bufnum) . 'winc w'
silent noautocmd exec '50vnew [Locate\ Scope]'
let b:locate_bufnr = bufnr
let b:locate_winnr = winnr
stopinsert
setlocal modifiable
call append(1, s:scopes + g:EclimLocateUserScopes)
1,1delete _
call append(line('$'),
\ ['', '" <cr> - select a scope', '" <c-c>, <c-l>, or q - cancel'])
syntax match Comment /^".*/
setlocal nomodifiable
setlocal winfixheight
setlocal nonumber
setlocal nolist
setlocal noswapfile nobuflisted
setlocal nospell norelativenumber
setlocal buftype=nofile bufhidden=delete
nnoremap <buffer> <silent> <cr> :call <SID>ChooseScope()<cr>
nnoremap <buffer> <silent> q :call <SID>CloseScopeChooser()<cr>
nnoremap <buffer> <silent> <c-c> :call <SID>CloseScopeChooser()<cr>
nnoremap <buffer> <silent> <c-l> :call <SID>CloseScopeChooser()<cr>
autocmd BufLeave <buffer> call <SID>CloseScopeChooser()
return ''
endfunction " }}}
function! s:ChooseScope() " {{{
let scope = getline('.')
if scope =~ '^"\|^\s*$'
return
endif
let project = ''
let locate_in = scope
if scope == 'project'
let project = ''
let names = eclim#project#util#GetProjectNames()
let prompt = 'Choose a project (ctrl-c to cancel): '
while project == ''
let project = input(
\ prompt, '', 'customlist,eclim#project#util#CommandCompleteProject')
if project == ''
echo ''
return
endif
if !eclim#util#ListContains(names, project)
let prompt = "Project '" . project . "' not found (ctrl-c to cancel): "
let project = ''
endif
endwhile
let locate_in = project
let workspace = eclim#project#util#GetProjectWorkspace(project)
if type(workspace) == g:LIST_TYPE
let workspaces = workspace
unlet workspace
let response = eclim#util#PromptList(
\ 'Muliple workspaces found, please choose the target workspace',
\ workspaces, g:EclimHighlightInfo)
" user cancelled, error, etc.
if response < 0
return
endif
let workspace = workspaces[response]
endif
elseif scope == 'workspace'
let project = ''
let instance = eclim#client#nailgun#ChooseEclimdInstance()
if type(instance) != g:DICT_TYPE
return
endif
let workspace = instance.workspace
else
let workspace = ''
endif
call s:CloseScopeChooser()
let b:scope = scope
let b:project = project
let b:workspace = workspace != '' ? workspace : b:workspace
exec 'file ' . escape('[Locate in ' . locate_in . ']', ' ')
call eclim#common#locate#LocateFileCompletion()
endfunction " }}}
function! s:CloseScopeChooser() " {{{
let winnum = b:locate_winnr
bwipeout
exec winnum . 'winc w'
" hack to make :q work like the other close mappings
doautocmd BufEnter
" if we end up in a non-Locate window, make sure everything is as it should
" be (a hack for the above hack).
augroup locate_file_chooser_hack
autocmd!
autocmd BufEnter *
\ if bufname('%') !~ '^\[Locate in .*\]$' |
\ call eclim#common#locate#LocateFileClose() |
\ endif |
\ autocmd! locate_file_chooser_hack
augroup END
endfunction " }}}
function! s:LocateFileHelp() " {{{
let winnr = winnr()
noautocmd exec bufwinnr(b:results_bufnum) . 'winc w'
let help_bufnum = eclim#help#BufferHelp(s:help, 'vertical', 50)
exec winnr . 'winc w'
let b:help_bufnum = help_bufnum
return ''
endfunction " }}}
function! s:LocateFileConvertPattern(pattern, fuzzy) " {{{
let pattern = a:pattern
if a:fuzzy
let pattern = '.*' . substitute(pattern, '\(.\)', '\1.*?', 'g')
let pattern = substitute(pattern, '\.\([^*]\)', '\\.\1', 'g')
else
" if the user supplied a path, prepend a '.*/' to it so that they don't need
" to type full paths to match.
if pattern =~ '.\+/'
let pattern = '.*/' . pattern
endif
let pattern = substitute(pattern, '\*\*', '.*', 'g')
let pattern = substitute(pattern, '\(^\|\([^.]\)\)\*', '\1[^/]*?', 'g')
let pattern = substitute(pattern, '\.\([^*]\)', '\\.\1', 'g')
"let pattern = substitute(pattern, '\([^*]\)?', '\1.', 'g')
let pattern .= '.*'
endif
return pattern
endfunction " }}}
function! s:LocateFileFunction(scope) " {{{
if eclim#util#ListContains(s:scopes, a:scope)
return function('s:LocateFile_' . a:scope)
endif
return function('LocateFile_' . a:scope)
endfunction " }}}
function! s:LocateFileCommand(pattern) " {{{
let command = s:command_locate
if g:EclimLocateFileCaseInsensitive == 'always' ||
\ (a:pattern !~# '[A-Z]' && g:EclimLocateFileCaseInsensitive != 'never')
let command .= ' -i'
endif
let command .= ' -p "' . a:pattern . '"'
return command
endfunction " }}}
function! s:LocateFile_workspace(pattern) " {{{
let command = substitute(s:LocateFileCommand(a:pattern), '<scope>', 'workspace', '')
let results = eclim#Execute(command, {'workspace': b:workspace})
if type(results) != g:LIST_TYPE
return []
endif
return results
endfunction " }}}
function! s:LocateFile_project(pattern) " {{{
let command = substitute(s:LocateFileCommand(a:pattern), '<scope>', 'project', '')
let command .= ' -n "' . b:project . '"'
let results = eclim#Execute(command, {'workspace': b:workspace})
if type(results) != g:LIST_TYPE
return []
endif
return results
endfunction " }}}
function! s:LocateFile_buffers(pattern) " {{{
redir => list
silent exec 'buffers'
redir END
let buffers = map(split(list, '\n'),
\ "substitute(v:val, '.\\{-}\"\\(.\\{-}\\)\".*', '\\1', '')")
if a:pattern =~ '/'
let buffers = map(buffers, "fnamemodify(v:val, ':p')")
endif
if len(buffers) > 0
let tempfile = substitute(tempname(), '\', '/', 'g')
call writefile(buffers, tempfile)
try
return eclim#common#locate#LocateFileFromFileList(a:pattern, tempfile)
finally
call delete(tempfile)
endtry
endif
return []
endfunction " }}}
function! s:LocateFile_quickfix(pattern) " {{{
let buffers = []
let prev = ''
for entry in getqflist()
let name = bufname(entry.bufnr)
if a:pattern =~ '/'
let name = fnamemodify(name, ':p')
endif
if name != prev
call add(buffers, name)
let prev = name
endif
endfor
if len(buffers) > 0
let tempfile = substitute(tempname(), '\', '/', 'g')
call writefile(buffers, tempfile)
try
return eclim#common#locate#LocateFileFromFileList(a:pattern, tempfile)
finally
call delete(tempfile)
endtry
endif
return []
endfunction " }}}
function! eclim#common#locate#LocateFileFromFileList(pattern, file) " {{{
let file = a:file
if has('win32unix')
let file = eclim#cygwin#WindowsPath(file)
endif
if eclim#EclimAvailable(0)
let command = substitute(s:LocateFileCommand(a:pattern), '<scope>', 'list', '')
let command .= ' -f "' . file . '"'
let results = eclim#Execute(command, {'workspace': b:workspace})
if type(results) != g:LIST_TYPE
return []
endif
else
let results = []
for result in readfile(file)
call add(results, {'name': fnamemodify(result, ':t'), 'path': result})
endfor
endif
return results
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,237 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
if !exists("g:EclimTemplateDir")
let g:EclimTemplateDir = g:EclimBaseDir . '/template'
endif
if !exists("g:EclimTemplateExtension")
let g:EclimTemplateExtension = '.vim'
endif
if !exists("g:EclimTemplateIgnore")
let g:EclimTemplateIgnore = []
endif
" }}}
" Script Variables {{{
let s:quote = "['\"]"
let s:tag_regex =
\ '<vim:[a-zA-Z]\+\(\s\+[a-zA-Z]\+\s*=\s*' . s:quote . '.*' . s:quote . '\)\?\s*/>'
let s:tagname_regex = '.\{-}<vim:\([a-zA-Z]\+\).*'
" }}}
" Template() {{{
" Main method for finding and executing the template.
function! eclim#common#template#Template()
" allow some plugins to disable templates temporarily
if exists('g:EclimTemplateTempIgnore') && g:EclimTemplateTempIgnore
return
endif
" ignore certain file patterns
for ignore in g:EclimTemplateIgnore
if expand('%') =~ ignore
return
endif
endfor
let template = s:FindTemplate()
if template != ''
let lines = readfile(template)
call s:ExecuteTemplate(lines)
1,1delete _
endif
endfunction " }}}
" s:FindTemplate() {{{
" Finds the template file and returns the location.
function! s:FindTemplate()
let templatesDir = expand(g:EclimTemplateDir)
if !isdirectory(templatesDir)
call eclim#util#EchoDebug(
\ 'Template dir not found (g:EclimTemplateDir): ' . templatesDir)
return ''
endif
let filename = expand('%:t')
let ext = ""
" template equal to the filename
if filereadable(templatesDir . '/' . filename . g:EclimTemplateExtension)
return templatesDir . '/' . filename . g:EclimTemplateExtension
endif
" template pattern
let templates = globpath(templatesDir, '*' . g:EclimTemplateExtension)
for template in split(templates, '\n')
" remove path info
let temp_template = substitute(template, '.*[/\\]', '', '')
if g:EclimTemplateExtension != ''
let temp_template =
\ strpart(temp_template, 0, stridx(temp_template, g:EclimTemplateExtension))
endif
while stridx(temp_template, '.') != -1
let ext = strpart(temp_template, stridx(temp_template, '.'))
let temp_template = strpart(temp_template, 0, stridx(temp_template, '.'))
if filename =~ '.*' . temp_template . '.*' . ext
return template
endif
endwhile
endfor
" template equal to file extension
if stridx(filename, '.') > 0
let ext = strpart(filename, stridx(filename, '.'))
while stridx(ext, '.') != -1
let ext = strpart(ext, stridx(ext, '.') + 1)
if filereadable(templatesDir . '/' . ext . g:EclimTemplateExtension)
return templatesDir . '/' . ext . g:EclimTemplateExtension
endif
endwhile
endif
" template equal to file type
if filereadable(templatesDir . '/' . &ft . g:EclimTemplateExtension)
return templatesDir . '/' . &ft . g:EclimTemplateExtension
endif
return ''
endfunction " }}}
" s:ExecuteTemplate(lines) {{{
" Executes any logic in the supplied lines and appends those lines to the
" current file.
function! s:ExecuteTemplate(lines)
for line in a:lines
if line =~ s:tag_regex
let tag = substitute(line, s:tagname_regex, '\1', '')
call s:ExecuteTemplate(s:Process_{tag}(line))
else
call append(line('$'), line)
endif
endfor
endfunction " }}}
" s:EvaluateExpression(expression) {{{
" Evaluates the supplied expression.
function! s:EvaluateExpression(expression)
exec "return " . a:expression
endfunction " }}}
" s:GetAttribute(line, tag, attribute, fail) {{{
" Gets the an attribute value.
function! s:GetAttribute(line, tag, attribute, fail)
let attribute = substitute(a:line,
\ '.\{-}<vim:' . a:tag . '.\{-}\s\+' . a:attribute .
\ '\s*=\s*\(' . s:quote . '\)\(.\{-}\)\1.*/>.*',
\ '\2', '')
if attribute == a:line
if a:fail
call s:TemplateError(
\ a:line, "syntax error - missing '" . a:attribute . "' attribute")
endif
return ""
endif
return attribute
endfunction " }}}
" s:TemplateError(line, message) {{{
" Echos an error message to the user.
function! s:TemplateError(line, message)
call eclim#util#EchoError("Template error, line " . a:line . ": " . a:message)
endfunction " }}}
" s:Process_var(line) {{{
" Process <vim:var/> tags.
function! s:Process_var(line)
let name = expand(s:GetAttribute(a:line, 'var', 'name', 1))
let value = expand(s:GetAttribute(a:line, 'var', 'value', 1))
exec "let " . name . " = \"" . s:EvaluateExpression(value) . "\""
return []
endfunction " }}}
" s:Process_import(line) {{{
" Process <vim:import/> tags.
function! s:Process_import(line)
let resource = expand(s:GetAttribute(a:line, 'import', 'resource', 1))
if resource !~ '^/\'
let resource = expand(g:EclimTemplateDir . '/' . resource)
endif
if !filereadable(resource)
call s:TemplateError(a:line, "resource not found '" . resource . "'")
endif
exec "source " . resource
return []
endfunction " }}}
" s:Process_out(line) {{{
" Process <vim:out/> tags.
function! s:Process_out(line)
let value = s:GetAttribute(a:line, 'out', 'value', 1)
let result = s:EvaluateExpression(value)
return s:Out(a:line, '<vim:out\s\+.\{-}\s*\/>', result)
endfunction " }}}
" s:Process_include(line) {{{
" Process <vim:include/> tags.
function! s:Process_include(line)
let template = expand(
\ g:EclimTemplateDir . '/' . s:GetAttribute(a:line, 'include', 'template', 1))
if !filereadable(template)
call s:TemplateError(a:line, "template not found '" . template . "'")
return []
endif
return readfile(template)
endfunction " }}}
" s:Process_username(line) {{{
" Process <vim:username/> tags.
function! s:Process_username(line)
silent! let username = eclim#project#util#GetProjectSetting('org.eclim.user.name')
if type(username) == g:NUMBER_TYPE
let username = ''
endif
return s:Out(a:line, '<vim:username\s*\/>', username)
endfunction " }}}
" s:Out(line, pattern, value) {{{
function! s:Out(line, pattern, value)
let results = type(a:value) == g:LIST_TYPE ? a:value : [a:value]
if results[0] == '' && a:line =~ '^\s*' . a:pattern . '\s*$'
return []
endif
let line = substitute(a:line, a:pattern, results[0], '')
return [line] + (len(results) > 1 ? results[1:] : [])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,258 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_read = '-command archive_read -f "<file>"'
" }}}
function! eclim#common#util#DiffLastSaved() " {{{
" Diff a modified file with the last saved version.
if &modified
let winnum = winnr()
let filetype=&ft
vertical belowright new | r #
1,1delete _
diffthis
setlocal buftype=nofile
setlocal bufhidden=wipe
setlocal nobuflisted
setlocal noswapfile
setlocal readonly
exec "setlocal ft=" . filetype
let diffnum = winnr()
augroup diff_saved
autocmd! BufUnload <buffer>
autocmd BufUnload <buffer> :diffoff!
augroup END
exec winnum . "winc w"
diffthis
" for some reason, these settings only take hold if set here.
call setwinvar(diffnum, "&foldmethod", "diff")
call setwinvar(diffnum, "&foldlevel", "0")
else
echo "No changes"
endif
endfunction " }}}
function! eclim#common#util#SwapWords() " {{{
" Initially based on http://www.vim.org/tips/tip.php?tip_id=329
" save the last search pattern
let save_search = @/
normal! "_yiw
let pos = getpos('.')
keepjumps s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
call setpos('.', pos)
" restore the last search pattern
let @/ = save_search
silent! call repeat#set(":call eclim#common#util#SwapWords()\<cr>", v:count)
endfunction " }}}
function! eclim#common#util#SwapAround(char) " {{{
if len(a:char) != 1
call eclim#util#EchoError('Arg must be a single character.')
return
endif
let pos = getpos('.')
let save_search = @/
try
let lnum = line('.')
let line = getline('.')
let start_col = 0
if line[col('.') - 1] =~ '[(\[{]'
let start_col = col('.')
normal! %
endif
let col = col('.')
exec 'normal! f' . a:char
if col('.') == col
call eclim#util#EchoError('Char not found on this line.')
return
endif
let delim_col = col('.')
let [_, end_col] = searchpos('\S', 'b', lnum)
if !start_col
if line[col('.') - 1] =~ '[)\]}]'
normal! %
let start_col = col('.')
else
let [_, start_col] = searchpos('[(\[{' . a:char . ']', 'b', lnum)
if start_col == end_col
call eclim#util#EchoError('Unable to determine the start of the first block.')
return
endif
let start_col += 1
endif
endif
let first = [start_col, end_col]
call cursor(0, delim_col)
let [_, start_col] = searchpos('\S', '', lnum)
if start_col == delim_col
call eclim#util#EchoError('Could not find item to swap with.')
return
endif
if line[col('.') - 1] =~ '[(\[{]'
normal! %
let end_col = col('.')
else
let [_, end_col] = searchpos('[)\]}' . a:char . ']', '', lnum)
if start_col == end_col
call eclim#util#EchoError('Unable to determine the end of the second block.')
return
endif
let end_col -= 1
endif
let second = [start_col, end_col]
let first_part = strpart(line, first[0] - 1, first[1] - first[0] + 1)
let second_part = strpart(line, second[0] - 1, second[1] - second[0] + 1)
" replace second with first
let prefix = strpart(line, 0, second[0] - 1)
let suffix = strpart(line, second[1])
let line = prefix . first_part . suffix
" replace first with second
let prefix = strpart(line, 0, first[0] - 1)
let suffix = strpart(line, first[1])
let line = prefix . second_part . suffix
call setline('.', line)
silent! call repeat#set(
\ ":call eclim#common#util#SwapAround(" . string(a:char) . ")\<cr>", v:count)
finally
call setpos('.', pos)
let @/ = save_search
endtry
endfunction " }}}
function! eclim#common#util#Tcd(dir) " {{{
" Like vim's :lcd, but tab local instead of window local.
let t:cwd = fnamemodify(a:dir, ':p')
" initialize the tab cwd for all other tabs if not already set
let curtab = tabpagenr()
try
let index = 1
while index <= tabpagenr('$')
if index != curtab
exec 'tabn ' . index
if !exists('t:cwd')
let t:cwd = getcwd()
" try to find a window without a localdir if necessary
if haslocaldir()
let curwin = winnr()
let windex = 1
while windex <= winnr('$')
if windex != curwin
exec windex . 'winc w'
if !haslocaldir()
let t:cwd = getcwd()
break
endif
endif
let windex += 1
endwhile
exec curwin . 'winc w'
endif
endif
endif
let index += 1
endwhile
finally
exec 'tabn ' . curtab
endtry
call s:ApplyTcd(0)
augroup tcd
autocmd!
autocmd TabEnter * call <SID>ApplyTcd(1)
augroup END
endfunction " }}}
function! s:ApplyTcd(honor_lcd) " {{{
if !exists('t:cwd')
return
endif
if a:honor_lcd && haslocaldir()
let lcwd = getcwd()
exec 'cd ' . escape(t:cwd, ' ')
exec 'lcd ' . escape(lcwd, ' ')
else
exec 'cd ' . escape(t:cwd, ' ')
endif
endfunction " }}}
function! eclim#common#util#ReadFile() " {{{
" Reads the contents of an archived file.
let archive = substitute(expand('%'), '\', '/', 'g')
let command = substitute(s:command_read, '<file>', archive, '')
let file = eclim#Execute(command)
if string(file) != '0'
let project = exists('b:eclim_project') ? b:eclim_project : ''
let bufnum = bufnr('%')
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
silent exec "keepalt keepjumps edit! " . escape(file, ' ')
if project != ''
let b:eclim_project = project
let b:eclim_file = archive
endif
exec 'bdelete ' . bufnum
" alternate solution, that keeps the archive url as the buffer's filename,
" but prevents taglist from being able to parse tags.
"setlocal noreadonly
"setlocal modifiable
"silent! exec "read " . file
"1,1delete _
silent exec "doautocmd BufReadPre " . file
silent exec "doautocmd BufReadPost " . file
setlocal readonly
setlocal nomodifiable
setlocal noswapfile
" causes taglist.vim errors (fold then delete fails)
"setlocal bufhidden=delete
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,95 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/css/complete.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command css_complete -p "<project>" -f "<file>" -o <offset> -e <encoding>'
" }}}
" CodeComplete(findstart, base) {{{
" Handles css code completion.
function! eclim#css#complete#CodeComplete(findstart, base)
if !eclim#project#util#IsCurrentFileInProject(0)
return a:findstart ? -1 : []
endif
if a:findstart
call eclim#lang#SilentUpdate(1)
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '[[:alnum:]_-]'
let start -= 1
endwhile
return start
else
let offset = eclim#util#GetOffset() + len(a:base)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 0)
if file == ''
return []
endif
let command = s:complete_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let completions = []
let results = eclim#Execute(command)
if type(results) != g:LIST_TYPE
return
endif
let filter = 0
for result in results
let word = result.completion
if word =~ '^:'
let word = strpart(word, 1)
let filter = 1
endif
let menu = result.menu
let info = result.info
let dict = {'word': tolower(word), 'menu': menu, 'info': info}
call add(completions, dict)
endfor
" eclipse doesn't filter out :results properly.
if filter
call filter(completions, 'v:val.word =~ "^" . a:base')
endif
return completions
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,51 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/css/validate.html
"
" License:
"
" Copyright (C) 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
function! eclim#css#validate#Filter(errors) " {{{
let results = []
let ignore_next_parse_error = 0
for error in a:errors
" ignore errors related to browser targeted properties
if error.text =~ '\(^\|\s\)-\(moz\|webkit\|khtml\|o\)-\w\+\>'
continue
endif
" ignore errors on IE filter property line
if getline(error.lnum) =~ '^\s*filter:\s*progid'
" next parse error will be because of this filter
let ignore_next_parse_error = 1
continue
endif
if error.text == 'Parse Error' && ignore_next_parse_error
let ignore_next_parse_error = 0
continue
endif
call add(results, error)
endfor
return results
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,60 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Utility functions for cygwin usage.
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
function! eclim#cygwin#CygwinPath(path) " {{{
return s:Cygpath(a:path, 'cygwin')
endfunction " }}}
function! eclim#cygwin#WindowsPath(path) " {{{
if type(a:path) == g:STRING_TYPE && a:path =~? '^[a-z]:'
return substitute(a:path, '\', '/', 'g')
endif
return s:Cygpath(a:path, 'windows')
endfunction " }}}
function! eclim#cygwin#WindowsHome() " {{{
if !exists('s:cygpath_winhome')
let dir = s:Cygpath('-D', 'cygwin')
let s:cygpath_winhome = dir != '-D' ? fnamemodify(dir, ':h') : ''
endif
return s:cygpath_winhome
endfunction " }}}
function! s:Cygpath(paths, type) " {{{
if executable('cygpath')
let paths = type(a:paths) == g:LIST_TYPE ? a:paths : [a:paths]
let paths = map(paths, "'\"' . substitute(v:val, '\\', '/', 'g') . '\"'")
let args = a:type == 'windows' ? '-m ' : ''
let results = split(eclim#util#System('cygpath ' . args . join(paths)), "\n")
if type(a:paths) == g:LIST_TYPE
return results
endif
return results[0]
endif
return a:paths
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,70 @@
" Author: Kannan Rajah
"
" License: {{{
"
" Copyright (C) 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
function! eclim#display#fold#GetTreeFold(lnum) " {{{
" Folding to create a tree structure
" The default VIM fold shows the first line of a block separately.
" But we want to show it with its contents. This is more compact and
" easier to read.
" Code is taken from:
" http://learnvimscriptthehardway.stevelosh.com/chapters/49.html
if getline(a:lnum) =~? '\v^\s*$'
return '-1'
endif
let this_indent = eclim#display#fold#IndentLevel(a:lnum)
let next_line = eclim#display#fold#NextNonBlankLine(a:lnum)
let next_indent = eclim#display#fold#IndentLevel(next_line)
if next_indent == this_indent
return this_indent
elseif next_indent < this_indent
return this_indent
elseif next_indent > this_indent
return '>' . next_indent
endif
endfunction " }}}
function! eclim#display#fold#IndentLevel(lnum) " {{{
return indent(a:lnum) / &shiftwidth
endfunction " }}}
function! eclim#display#fold#NextNonBlankLine(lnum) " {{{
let numlines = line('$')
let current = a:lnum + 1
while current <= numlines
if getline(current) =~? '\v\S'
return current
endif
let current += 1
endwhile
return -2
endfunction " }}}
function! eclim#display#fold#TreeFoldText() " {{{
let line = substitute(getline(v:foldstart), '▾', '▸', 'g')
return line
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,103 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Plugin to generate gvim eclim menus.
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:eclim_menus_root = []
let s:eclim_menus = {}
" }}}
" Generate() {{{
" Generate gvim menu items for available eclim commands.
function! eclim#display#menu#Generate()
" check that the menu bar is enabled or that we are running in a mac gui where
" the menu bar always exists regardless of guioptions
if &guioptions !~ 'm' && !has('gui_macvim')
if exists('b:eclim_menus')
unlet b:eclim_menus
endif
return
endif
redir => commands
silent exec 'command'
redir END
if !exists('b:eclim_menus')
let b:eclim_menus = {}
let pattern = '\<eclim#'
if len(s:eclim_menus_root) != 0
let pattern = '^..b.*\<eclim#'
endif
for cmd in split(commands, '\n')
if cmd =~ pattern
let name = substitute(cmd, '....\(\w\+\)\s.*', '\1', '')
if cmd =~ '\<eclim#[A-Z]'
if index(s:eclim_menus_root, name) == -1
call add(s:eclim_menus_root, name)
endif
else
let group = substitute(cmd, '.\{-}\<eclim#\(\w\+\)#.*', '\1', '')
let var = cmd =~ '^..b' ? 'b:eclim_menus' : 's:eclim_menus'
if !has_key({var}, group)
let {var}[group] = []
endif
if index({var}[group], name) == -1
call add({var}[group], name)
endif
endif
endif
endfor
call sort(s:eclim_menus_root)
endif
silent! unmenu &Plugin.eclim
" merge non-buffer items with buffer items
let menus = deepcopy(s:eclim_menus, 1)
for group in keys(b:eclim_menus)
if !has_key(menus, group)
let menus[group] = []
endif
for name in b:eclim_menus[group]
call add(menus[group], name)
endfor
endfor
for name in s:eclim_menus_root
exec 'menu &Plugin.eclim.' . name . ' :' . name . ' '
endfor
for group in sort(keys(menus))
for name in sort(menus[group])
exec 'menu &Plugin.eclim.' . group . '.' . name . ' :' . name . ' '
endfor
endfor
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,420 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Functions for working with vim signs.
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:sign_levels = {
\ 'trace': 5,
\ 'debug': 4,
\ 'info': 3,
\ 'warning': 2,
\ 'error': 1,
\ 'off': 0,
\ }
let s:sign_ids = {}
" }}}
function! eclim#display#signs#Define(name, text, highlight, ...) " {{{
" Defines a new sign name or updates an existing one.
" Optional arg:
" linehl: The highlight to use for the line with this sign applied.
call s:Define(a:name)
let command = "sign define " . a:name . " text=" . a:text . " texthl=" . a:highlight
if a:0
let command .= " linehl=" . a:1
endif
exec command
endfunction " }}}
function! s:Define(name) " {{{
" Defines a new sign name and assignes it a base id.
if !has_key(s:sign_ids, a:name)
let sid = 0
let index = 0
let name = 'eclim' . a:name
while index < len(name)
let sid += char2nr(name[index])
let index += 1
endwhile
let sid = sid * 1000
for [key, value] in items(s:sign_ids)
if value == sid
throw printf('Sign id for "%s" clashes with "%s".', a:name, key)
endif
endfor
let s:sign_ids[a:name] = sid
endif
endfunction " }}}
function! eclim#display#signs#Id(name, line) " {{{
return s:sign_ids[a:name] + a:line
endfunction " }}}
function! eclim#display#signs#Place(name, line) " {{{
" Places a sign in the current buffer.
call eclim#display#signs#PlaceInBuffer(a:name, bufnr('%'), a:line)
endfunction " }}}
function! eclim#display#signs#PlaceInBuffer(name, buffer_num, line) " {{{
" Places a sign in the given buffer.
if a:line > 0
let lastline = line('$')
let line = a:line <= lastline ? a:line : lastline
let id = eclim#display#signs#Id(a:name, line)
exec "sign place " . id . " line=" . line . " name=" . a:name .
\ " buffer=" . a:buffer_num
endif
endfunction " }}}
function! eclim#display#signs#PlaceAll(name, list) " {{{
" Places a sign in the current buffer for each line in the list.
let lastline = line('$')
for line in a:list
if line > 0
let line = line <= lastline ? line : lastline
exec "sign place " . line . " line=" . line . " name=" . a:name .
\ " buffer=" . bufnr('%')
endif
endfor
endfunction " }}}
function! eclim#display#signs#Undefine(name) " {{{
" Undefines a sign name.
exec "sign undefine " . a:name
endfunction " }}}
function! eclim#display#signs#Unplace(id) " {{{
" Un-places a sign in the current buffer.
call eclim#display#signs#UnplaceFromBuffer(a:id, bufnr('%'))
endfunction " }}}
function! eclim#display#signs#UnplaceFromBuffer(id, buffer_num) " {{{
" Un-places a sign from the given buffer
exec 'sign unplace ' . a:id . ' buffer=' . a:buffer_num
endfunction " }}}
function! eclim#display#signs#UnplaceAll(list) " {{{
" Un-places all signs in the supplied list from the current buffer.
" The list may be a list of ids or a list of dictionaries as returned by
" GetExisting()
for sign in a:list
if type(sign) == g:DICT_TYPE
call eclim#display#signs#Unplace(sign.id)
else
call eclim#display#signs#Unplace(sign)
endif
endfor
endfunction " }}}
function! eclim#display#signs#Toggle(name, line) " {{{
if g:EclimSignLevel == 'off'
call eclim#util#Echo('Eclim signs have been disabled.')
return
endif
" Toggle a sign on the current line.
if a:line > 0
let existing = eclim#display#signs#GetExisting(a:name)
let exists = filter(existing, "v:val['line'] == a:line")
if len(exists)
call eclim#display#signs#Unplace(exists[0].id)
else
call eclim#display#signs#Place(a:name, a:line)
endif
endif
endfunction " }}}
function! s:CompareSigns(s1, s2) " {{{
" Used by ViewSigns to sort list of sign dictionaries.
if a:s1.line == a:s2.line
return 0
endif
if a:s1.line > a:s2.line
return 1
endif
return -1
endfunction " }}}
function! eclim#display#signs#ViewSigns(name) " {{{
" Open a window to view all placed signs with the given name in the current
" buffer.
if g:EclimSignLevel == 'off'
call eclim#util#Echo('Eclim signs have been disabled.')
return
endif
let filename = expand('%:p')
let signs = eclim#display#signs#GetExisting(a:name)
call sort(signs, 's:CompareSigns')
let content = map(signs, "v:val.line . '|' . getline(v:val.line)")
call eclim#util#TempWindow('[Sign List]', content)
set ft=qf
nnoremap <silent> <buffer> <cr> :call <SID>JumpToSign()<cr>
" Store filename so that plugins can use it if necessary.
let b:filename = filename
augroup temp_window
autocmd! BufWinLeave <buffer>
call eclim#util#GoToBufferWindowRegister(filename)
augroup END
endfunction " }}}
function! s:JumpToSign() " {{{
let winnr = bufwinnr(bufnr('^' . b:filename))
if winnr != -1
let line = substitute(getline('.'), '^\(\d\+\)|.*', '\1', '')
exec winnr . "winc w"
call cursor(line, 1)
endif
endfunction " }}}
function! eclim#display#signs#GetDefined() " {{{
" Gets a list of defined sign names.
redir => list
silent exec 'sign list'
redir END
let names = []
for name in split(list, '\n')
let name = substitute(name, 'sign\s\(.\{-}\)\s.*', '\1', '')
call add(names, name)
endfor
return names
endfunction " }}}
function! eclim#display#signs#GetExisting(...) " {{{
" Gets a list of existing signs for the current buffer.
" The list consists of dictionaries with the following keys:
" id: The sign id.
" line: The line number.
" name: The sign name (erorr, warning, etc.)
"
" Optionally one or more sign names may be supplied to only retrieve signs
" for those names.
if !has('signs') || g:EclimSignLevel == 'off'
return []
endif
let bufnr = bufnr('%')
redir => signs
silent exec 'sign place buffer=' . bufnr
redir END
let existing = []
for line in split(signs, '\n')
if line =~ '.\{-}=.\{-}=' " only two equals to account for swedish output
call add(existing, s:ParseSign(line))
endif
endfor
if len(a:000) > 0
let pattern = '^\(' . join(a:000, '\|') . '\)$'
call filter(existing, "v:val['name'] =~ pattern")
endif
return existing
endfunction " }}}
function! eclim#display#signs#HasExisting(...) " {{{
" Determines if there are any existing signs.
" Optionally a sign name may be supplied to only test for signs of that name.
if !has('signs') || g:EclimSignLevel == 'off'
return 0
endif
let bufnr = bufnr('%')
redir => results
silent exec 'sign place buffer=' . bufnr
redir END
for line in split(results, '\n')
if line =~ '.\{-}=.\{-}=' " only two equals to account for swedish output
if len(a:000) == 0
return 1
endif
let sign = s:ParseSign(line)
if sign.name == a:000[0]
return 1
endif
endif
endfor
return 0
endfunction " }}}
function! s:ParseSign(raw) " {{{
let attrs = split(a:raw)
exec 'let line = ' . split(attrs[0], '=')[1]
let id = split(attrs[1], '=')[1]
" hack for the italian localization
if id =~ ',$'
let id = id[:-2]
endif
" hack for the swedish localization
if attrs[2] =~ '^namn'
let name = substitute(attrs[2], 'namn=\?', '', '')
else
let name = split(attrs[2], '=')[1]
endif
return {'id': id, 'line': line, 'name': name}
endfunction " }}}
function! eclim#display#signs#Update() " {{{
" Updates the signs for the current buffer. This function will read both the
" location list and the quickfix list and place a sign for any entries for the
" current file.
" This function supports a severity level by examining the 'type' key of the
" dictionaries in the location or quickfix list. It supports 'i' (info), 'w'
" (warning), and 'e' (error).
if !has('signs') || g:EclimSignLevel == 'off' || &ft == 'qf'
return
endif
let save_lazy = &lazyredraw
set lazyredraw
let placeholder = eclim#display#signs#SetPlaceholder()
" remove all existing signs
let existing = eclim#display#signs#GetExisting()
for exists in existing
if exists.name =~ '^\(qf_\)\?\(error\|info\|warning\)$'
call eclim#display#signs#Unplace(exists.id)
endif
endfor
let qflist = filter(g:EclimShowQuickfixSigns ? getqflist() : [],
\ 'bufnr("%") == v:val.bufnr')
let show_loclist = g:EclimShowLoclistSigns && exists('b:eclim_loclist')
let loclist = filter(show_loclist ? getloclist(0) : [],
\ 'bufnr("%") == v:val.bufnr')
for [list, marker, prefix] in [
\ [qflist, g:EclimQuickfixSignText, 'qf_'],
\ [loclist, g:EclimLoclistSignText, '']]
if s:sign_levels[g:EclimSignLevel] >= 3
let info = filter(copy(list), 'v:val.type == "" || tolower(v:val.type) == "i"')
call eclim#display#signs#Define(prefix . 'info', marker, g:EclimHighlightInfo)
call eclim#display#signs#PlaceAll(prefix . 'info', map(info, 'v:val.lnum'))
endif
if s:sign_levels[g:EclimSignLevel] >= 2
let warnings = filter(copy(list), 'tolower(v:val.type) == "w"')
call eclim#display#signs#Define(prefix . 'warning', marker, g:EclimHighlightWarning)
call eclim#display#signs#PlaceAll(prefix . 'warning', map(warnings, 'v:val.lnum'))
endif
if s:sign_levels[g:EclimSignLevel] >= 1
let errors = filter(copy(list), 'tolower(v:val.type) == "e"')
call eclim#display#signs#Define(prefix . 'error', marker, g:EclimHighlightError)
call eclim#display#signs#PlaceAll(prefix . 'error', map(errors, 'v:val.lnum'))
endif
endfor
if placeholder
call eclim#display#signs#RemovePlaceholder()
endif
let &lazyredraw = save_lazy
endfunction " }}}
function! eclim#display#signs#QuickFixCmdPost() " {{{
" Force 'make' results to be of type error if no type set.
if expand('<amatch>') == 'make'
let newentries = []
for entry in getqflist()
if entry['type'] == ''
let entry['type'] = 'e'
endif
call add(newentries, entry)
endfor
call setqflist(newentries, 'r')
endif
call eclim#display#signs#Update()
redraw!
endfunction " }}}
function! eclim#display#signs#SetPlaceholder(...) " {{{
" Set sign at line 1 to prevent sign column from collapsing, and subsiquent
" screen redraw.
" Optional args:
" only_if_necessary: if 1, only set a placeholder if there are no existing
" signs
if !has('signs') || g:EclimSignLevel == 'off'
return
endif
if len(a:000) > 0 && a:000[0]
let existing = eclim#display#signs#GetExisting()
if !len(existing)
return
endif
endif
call eclim#display#signs#Define('placeholder', '_ ', g:EclimHighlightInfo)
let existing = eclim#display#signs#GetExisting('placeholder')
if len(existing) == 0 && eclim#display#signs#HasExisting()
call eclim#display#signs#Place('placeholder', 1)
return 1
endif
return
endfunction " }}}
function! eclim#display#signs#RemovePlaceholder() " {{{
if !has('signs') || g:EclimSignLevel == 'off'
return
endif
let existing = eclim#display#signs#GetExisting('placeholder')
for exists in existing
call eclim#display#signs#Unplace(exists.id)
endfor
endfunction " }}}
" define signs for manually added user marks.
if has('signs')
call eclim#display#signs#Define(
\ 'user', g:EclimUserSignText, g:EclimHighlightUserSign)
endif
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,350 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" GlobalVariables {{{
let g:VerticalToolBuffers = {}
if !exists('g:VerticalToolWindowSide')
let g:VerticalToolWindowSide = 'left'
endif
if g:VerticalToolWindowSide == 'right'
let g:VerticalToolWindowPosition = 'botright vertical'
else
let g:VerticalToolWindowPosition = 'topleft vertical'
endif
if !exists('g:VerticalToolWindowWidth')
let g:VerticalToolWindowWidth = 30
endif
" }}}
function! eclim#display#window#VerticalToolWindowOpen(name, weight, ...) " {{{
" Handles opening windows in the vertical tool window on the left (taglist,
" project tree, etc.)
let taglist_window = -1
if exists('g:TagList_title')
let taglist_window = bufwinnr(eclim#util#EscapeBufferName(g:TagList_title))
let taglist_position = 'left'
if exists('g:Tlist_Use_Horiz_Window') && g:Tlist_Use_Horiz_Window
let taglist_position = 'horizontal'
elseif exists('g:TaglistTooPosition')
let taglist_position = g:TaglistTooPosition
elseif exists('g:Tlist_Use_Right_Window') && g:Tlist_Use_Right_Window
let taglist_position = 'right'
endif
endif
if taglist_window == -1 && exists(':TagbarOpen')
let taglist_window = bufwinnr('__Tagbar__')
let taglist_position = 'right'
if exists('g:tagbar_left') && g:tagbar_left
let taglist_position = 'left'
endif
endif
if taglist_window != -1
" don't consider horizontal taglist, or taglist configured to display
" opposite the tool windows as a tool window member.
if taglist_position != g:VerticalToolWindowSide
let taglist_window = -1
endif
endif
let relative_window = 0
let relative_window_loc = 'below'
if taglist_window != -1 || len(g:VerticalToolBuffers) > 0
if taglist_window != -1
let relative_window = taglist_window
endif
for toolbuf in keys(g:VerticalToolBuffers)
exec 'let toolbuf = ' . toolbuf
if bufwinnr(toolbuf) != -1
if relative_window == 0
let relative_window = bufwinnr(toolbuf)
if getbufvar(toolbuf, 'weight') > a:weight
let relative_window_loc = 'below'
else
let relative_window_loc = 'above'
endif
elseif getbufvar(toolbuf, 'weight') > a:weight
let relative_window = bufwinnr(toolbuf)
let relative_window_loc = 'below'
elseif getbufvar(toolbuf, 'weight') < a:weight
let relative_window = bufwinnr(toolbuf)
let relative_window_loc = 'above'
endif
endif
endfor
endif
if relative_window != 0
let wincmd = relative_window . 'winc w | keepalt ' . relative_window_loc . ' '
else
let wincmd = 'keepalt ' . g:VerticalToolWindowPosition . ' ' . g:VerticalToolWindowWidth
endif
let escaped = substitute(
\ a:name, '\(.\{-}\)\[\(.\{-}\)\]\(.\{-}\)', '\1[[]\2[]]\3', 'g')
if a:0 && a:1
let bufnum = -1
for bnr in tabpagebuflist()
if bufname(bnr) == a:name
let bufnum = bnr
break
endif
endfor
else
let bufnum = bufnr(escaped)
endif
let name = bufnum == -1 ? a:name : '+buffer' . bufnum
silent call eclim#util#ExecWithoutAutocmds(wincmd . ' split ' . name)
doautocmd BufWinEnter
setlocal winfixwidth
setlocal nonumber
setlocal nospell norelativenumber
let b:weight = a:weight
let bufnum = bufnr('%')
let g:VerticalToolBuffers[bufnum] = a:name
augroup eclim_vertical_tool_windows
autocmd!
autocmd BufDelete * call s:PreventCloseOnBufferDelete()
autocmd BufEnter * nested call s:CloseIfLastWindow()
augroup END
if exists('g:TagList_title') &&
\ (!exists('g:Tlist_Use_Horiz_Window') || !g:Tlist_Use_Horiz_Window)
augroup eclim_vertical_tool_windows_move_taglist
autocmd!
autocmd BufWinEnter * if bufname('%') == g:TagList_title | call s:MoveRelativeTo() | endif
augroup END
endif
if exists(':TagbarOpen')
augroup eclim_vertical_tool_windows_move_tagbar
autocmd!
autocmd BufWinEnter __Tagbar__ call s:MoveRelativeTo()
augroup END
endif
augroup eclim_vertical_tool_windows_buffer
exec 'autocmd BufWinLeave <buffer> ' .
\ 'silent! call remove(g:VerticalToolBuffers, ' . bufnum . ') | ' .
\ 'autocmd! eclim_vertical_tool_windows_buffer * <buffer=' . bufnum . '>'
augroup END
endfunction " }}}
function! eclim#display#window#VerticalToolWindowRestore() " {{{
" Used to restore the tool windows to their proper width if some action
" altered them.
for toolbuf in keys(g:VerticalToolBuffers)
exec 'let toolbuf = ' . toolbuf
if bufwinnr(toolbuf) != -1
exec 'vertical ' . bufwinnr(toolbuf) . 'resize ' . g:VerticalToolWindowWidth
endif
endfor
endfunction " }}}
function! eclim#display#window#GetWindowOptions(winnum) " {{{
" Gets a dictionary containing all the localy set options for the specified
" window.
let curwin = winnr()
try
exec a:winnum . 'winc w'
redir => list
silent exec 'setlocal'
redir END
finally
exec curwin . 'winc w'
endtry
let list = substitute(list, '---.\{-}---', '', '')
let winopts = {}
for wopt in split(list, '\(\n\|\s\s\+\)')[1:]
if wopt =~ '^[a-z]'
if wopt =~ '='
let key = substitute(wopt, '\(.\{-}\)=.*', '\1', '')
let value = substitute(wopt, '.\{-}=\(.*\)', '\1', '')
let winopts[key] = value
else
let winopts[wopt] = ''
endif
endif
endfor
return winopts
endfunction " }}}
function! eclim#display#window#SetWindowOptions(winnum, options) " {{{
" Given a dictionary of options, sets each as local options for the specified
" window.
let curwin = winnr()
try
exec a:winnum . 'winc w'
for key in keys(a:options)
if key =~ '^no'
silent! exec 'setlocal ' . key
else
silent! exec 'setlocal ' . key . '=' . escape(a:options[key], ' ')
endif
endfor
finally
exec curwin . 'winc w'
endtry
endfunction " }}}
function! s:CloseIfLastWindow() " {{{
if histget(':', -1) !~ '^bd'
let close = 1
for bufnr in tabpagebuflist()
if has_key(g:VerticalToolBuffers, bufnr)
continue
endif
if exists('g:TagList_title') && bufname(bufnr) == g:TagList_title
continue
endif
if exists('g:BufExplorer_title') && bufname(bufnr) == '[BufExplorer]'
let close = 0
break
endif
let buftype = getbufvar(bufnr, '&buftype')
if buftype != '' && buftype != 'help'
continue
endif
let close = 0
break
endfor
if close
if tabpagenr('$') > 1
tabclose
else
quitall
endif
endif
endif
endfunction " }}}
function! s:MoveRelativeTo() " {{{
" get the buffer that the taglist was opened from
let curwin = winnr()
let list_buffer = bufnr('%')
winc p
let orig_buffer = bufnr('%')
exec curwin . 'winc p'
for toolbuf in keys(g:VerticalToolBuffers)
exec 'let toolbuf = ' . toolbuf
if bufwinnr(toolbuf) != -1
call setwinvar(bufwinnr(toolbuf), 'marked_for_removal', 1)
let winoptions = eclim#display#window#GetWindowOptions(bufwinnr(toolbuf))
call remove(winoptions, 'filetype')
call remove(winoptions, 'syntax')
call eclim#display#window#VerticalToolWindowOpen(
\ g:VerticalToolBuffers[toolbuf], getbufvar(toolbuf, 'weight'))
call eclim#display#window#SetWindowOptions(winnr(), winoptions)
endif
endfor
let winnum = 1
while winnum <= winnr('$')
if getwinvar(winnum, 'marked_for_removal') == 1
exec winnum . 'winc w'
close
else
let winnum += 1
endif
endwhile
call eclim#display#window#VerticalToolWindowRestore()
" some window juggling so that winc p from taglist goes back to the original
" buffer
exec bufwinnr(orig_buffer) . 'winc w'
exec bufwinnr(list_buffer) . 'winc w'
endfunction " }}}
function! s:PreventCloseOnBufferDelete() " {{{
let index = 1
let numtoolwindows = 0
let numtempwindows = 0
let tempbuffersbot = []
while index <= winnr('$')
let buf = winbufnr(index)
let bufname = bufname(buf)
if index(keys(g:VerticalToolBuffers), string(buf)) != -1
let numtoolwindows += 1
elseif getwinvar(index, '&winfixheight') || getwinvar(index, '&winfixwidth')
let numtempwindows += 1
if getwinvar(index, '&winfixheight')
call add(tempbuffersbot, buf)
endif
endif
let index += 1
endwhile
if winnr('$') == (numtoolwindows + numtempwindows)
let toolbuf = bufnr('%')
if g:VerticalToolWindowSide == 'right'
vertical topleft new
else
vertical botright new
endif
setlocal noreadonly modifiable
let curbuf = bufnr('%')
let removed = str2nr(expand('<abuf>'))
let next = eclim#common#buffers#OpenNextHiddenTabBuffer(removed)
if next != 0
let curbuf = next
endif
" resize windows
exec bufwinnr(toolbuf) . 'winc w'
exec 'vertical resize ' . g:VerticalToolWindowWidth
" fix the position of the temp windows
for buf in tempbuffersbot
" open the buffer in the temp window position
botright 10new
exec 'buffer ' . buf
setlocal winfixheight
" close the old window
let winnr = winnr()
let index = 1
while index <= winnr('$')
if winbufnr(index) == buf && index != winnr
exec index . 'winc w'
close
winc p
break
endif
let index += 1
endwhile
endfor
exec bufwinnr(curbuf) . 'winc w'
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,169 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Commands view / search eclim help files.
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
let g:EclimHelpDir = g:EclimBaseDir . '/eclim/doc'
" }}}
" Help(tag) {{{
function! eclim#help#Help(tag, link)
if !filereadable(substitute(g:EclimHelpDir, '\\\s', ' ', 'g') . '/tags')
call eclim#util#Echo('indexing eclim help files...')
exec 'helptags ' . g:EclimHelpDir
let paths = split(glob(g:EclimHelpDir . '/**/*'), '\n')
call filter(paths, 'isdirectory(v:val)')
for path in paths
exec 'helptags ' . path
endfor
call eclim#util#Echo('eclim help files indexed')
endif
let savetags = &tags
exec 'set tags=' . escape(escape(g:EclimHelpDir, ' '), ' ') . '/**/tags'
try
let tag = a:tag
if tag == '' && !a:link
let tag = 'index'
elseif tag ==''
let line = getline('.')
let tag = substitute(
\ line, '.*|\(\S\{-}\%' . col('.') . 'c\S\{-}\)|.*', '\1', '')
if tag == line
return
endif
endif
call s:HelpWindow()
exec 'tag ' . tag
let w:eclim_help = 1
" needed to ensure taglist is updated if open
doautocmd BufEnter
catch /^Vim\%((\a\+)\)\=:E426/
if !exists('w:eclim_help')
close
endif
call eclim#util#EchoError('Sorry no eclim help for ' . tag)
finally
let &tags = savetags
endtry
endfunction " }}}
" HelpGrep() {{{
function! eclim#help#HelpGrep(args)
exec 'vimgrep ' a:args . ' ' . g:EclimHelpDir . '/**/*.txt'
endfunction " }}}
" s:HelpWindow() {{{
function s:HelpWindow()
let max = winnr('$')
let index = 1
while index <= max
if getwinvar(index, 'eclim_help')
exec index . 'winc w'
return
endif
let index += 1
endwhile
new
endfunction " }}}
" BufferHelp(lines, orientation, size) {{{
" Function to display a help window for the current buffer.
function! eclim#help#BufferHelp(lines, orientation, size)
let orig_bufnr = bufnr('%')
let name = expand('%')
if name =~ '^\W.*\W$'
let name = name[:-2] . ' Help' . name[len(name) - 1]
else
let name .= ' Help'
endif
let bname = eclim#util#EscapeBufferName(name)
let orient = a:orientation == 'vertical' ? 'v' : ''
if bufwinnr(bname) != -1
exec 'bd ' . bufnr(bname)
return
endif
silent! noautocmd exec a:size . orient . "new " . escape(name, ' ')
if a:orientation == 'vertical'
setlocal winfixwidth
else
setlocal winfixheight
endif
setlocal nowrap
setlocal noswapfile nobuflisted nonumber
setlocal nospell norelativenumber
setlocal buftype=nofile bufhidden=delete
nnoremap <buffer> <silent> ? :bd<cr>
nnoremap <buffer> <silent> q :bd<cr>
setlocal modifiable noreadonly
silent 1,$delete _
call append(1, a:lines)
retab
silent 1,1delete _
if len(a:000) == 0 || a:000[0]
setlocal nomodified nomodifiable readonly
endif
let help_bufnr = bufnr('%')
augroup eclim_help_buffer
autocmd! BufWinLeave <buffer>
autocmd BufWinLeave <buffer> nested autocmd! eclim_help_buffer * <buffer>
exec 'autocmd BufWinLeave <buffer> nested ' .
\ 'autocmd! eclim_help_buffer * <buffer=' . orig_bufnr . '>'
exec 'autocmd! BufWinLeave <buffer=' . orig_bufnr . '>'
exec 'autocmd BufWinLeave <buffer=' . orig_bufnr . '> nested bd ' . help_bufnr
augroup END
return help_bufnr
endfunction " }}}
" CommandComplete(argLead, cmdLine, cursorPos) {{{
function! eclim#help#CommandCompleteTag(argLead, cmdLine, cursorPos)
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let savetags = &tags
exec 'set tags=' . escape(escape(g:EclimHelpDir, ' '), ' ') . '/**/tags'
try
let tags = sort(map(taglist(argLead . '.*'), "v:val['name']"))
let results = []
for tag in tags
if index(results, tag) == -1
call add(results, tag)
endif
endfor
return results
finally
let &tags = savetags
endtry
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,59 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/html/complete.html
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command html_complete -p "<project>" -f "<file>" -o <offset> -e <encoding>'
" }}}
" CodeComplete(findstart, base) {{{
" Handles html code completion.
function! eclim#html#complete#CodeComplete(findstart, base)
"if eclim#html#util#InJavascriptBlock()
" return eclim#javascript#complete#CodeComplete(a:findstart, a:base)
"endif
if eclim#html#util#InCssBlock()
return eclim#css#complete#CodeComplete(a:findstart, a:base)
endif
if a:findstart
call eclim#lang#SilentUpdate(1)
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '[[:alnum:]_-]'
let start -= 1
endwhile
return start
else
return eclim#lang#CodeComplete(s:complete_command, a:findstart, a:base)
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,135 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Various html relatd functions.
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" HtmlToText() {{{
" Converts the supplied basic html to text.
function! eclim#html#util#HtmlToText(html)
let text = a:html
let text = substitute(text, '<br/\?>\c', '\n', 'g')
let text = substitute(text, '</\?b>\c', '', 'g')
let text = substitute(text, '</\?ul>\c', '', 'g')
let text = substitute(text, '<li>\c', '- ', 'g')
let text = substitute(text, '</li>\c', '', 'g')
let text = substitute(text, '</\?p/\?>\c', '', 'g')
let text = substitute(text, '</\?code>\c', '', 'g')
let text = substitute(text, '</\?pre>\c', '', 'g')
let text = substitute(text, '<a .\{-}>\c', '', 'g')
let text = substitute(text, '</a>', '', 'g')
let text = substitute(text, '&quot;\c', '"', 'g')
let text = substitute(text, '&amp;\c', '&', 'g')
let text = substitute(text, '&lt;\c', '<', 'g')
let text = substitute(text, '&gt;\c', '>', 'g')
return text
endfunction " }}}
" InCssBlock() {{{
" Determines if the cusor is inside of <style> tags.
function! eclim#html#util#InCssBlock()
let line = line('.')
let stylestart = search('<style\>', 'bcWn')
if stylestart > 0
let styleend = search('</style\s*>', 'bWn')
endif
if stylestart > 0 && stylestart < line &&
\ (styleend == 0 || (styleend > stylestart && line < styleend))
return stylestart
endif
return 0
endfunction " }}}
" InJavascriptBlock() {{{
" Determines if the cursor is inside of <script> tags.
function! eclim#html#util#InJavascriptBlock()
let line = line('.')
let scriptstart = search('<script\>', 'bcWn')
if scriptstart > 0
let scriptend = search('</script\s*>', 'bWn')
endif
if scriptstart > 0 && scriptstart < line &&
\ (scriptend == 0 || (scriptend > scriptstart && line < scriptend))
return scriptstart
endif
return 0
endfunction " }}}
" OpenInBrowser(file) {{{
function! eclim#html#util#OpenInBrowser(file)
let file = a:file
if file == ''
let file = expand('%:p')
else
let file = getcwd() . '/' . file
endif
let url = 'file://' . file
call eclim#web#OpenUrl(url)
endfunction " }}}
" UrlEncode(string) {{{
function! eclim#html#util#UrlEncode(string)
let result = a:string
" must be first
let result = substitute(result, '%', '%25', 'g')
let result = substitute(result, '\s', '%20', 'g')
let result = substitute(result, '!', '%21', 'g')
let result = substitute(result, '"', '%22', 'g')
let result = substitute(result, '#', '%23', 'g')
let result = substitute(result, '\$', '%24', 'g')
let result = substitute(result, '&', '%26', 'g')
let result = substitute(result, "'", '%27', 'g')
let result = substitute(result, '(', '%28', 'g')
let result = substitute(result, ')', '%29', 'g')
let result = substitute(result, '*', '%2A', 'g')
let result = substitute(result, '+', '%2B', 'g')
let result = substitute(result, ',', '%2C', 'g')
let result = substitute(result, '-', '%2D', 'g')
let result = substitute(result, '\.', '%2E', 'g')
let result = substitute(result, '\/', '%2F', 'g')
let result = substitute(result, ':', '%3A', 'g')
let result = substitute(result, ';', '%3B', 'g')
let result = substitute(result, '<', '%3C', 'g')
let result = substitute(result, '=', '%3D', 'g')
let result = substitute(result, '>', '%3E', 'g')
let result = substitute(result, '?', '%3F', 'g')
let result = substitute(result, '@', '%40', 'g')
let result = substitute(result, '[', '%5B', 'g')
let result = substitute(result, '\\', '%5C', 'g')
let result = substitute(result, ']', '%5D', 'g')
let result = substitute(result, '\^', '%5E', 'g')
let result = substitute(result, '`', '%60', 'g')
let result = substitute(result, '{', '%7B', 'g')
let result = substitute(result, '|', '%7C', 'g')
let result = substitute(result, '}', '%7D', 'g')
let result = substitute(result, '\~', '%7E', 'g')
return result
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,64 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/html/validate.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
function! eclim#html#validate#Validate(on_save) " {{{
let validate = !a:on_save || (
\ g:EclimHtmlValidate &&
\ (!exists('g:EclimFileTypeValidate') || g:EclimFileTypeValidate))
if !validate || eclim#util#WillWrittenBufferClose()
return
endif
if !eclim#project#util#IsCurrentFileInProject(!a:on_save)
return
endif
" prevent closing of sign column between validation methods
call eclim#display#signs#SetPlaceholder()
call eclim#lang#Validate('html', a:on_save)
" prevent closing of sign column between validation methods
"call eclim#display#signs#SetPlaceholder()
" disabled for now since the parser will attempt to follow all style tags
" and interprets //domain.com/styles.css as an ftp path leading to
" long validation delays due to connection timeouts.
"let html_errors = getloclist(0)
"let css_errors = []
"if search('<style', 'cnw')
" call eclim#lang#Validate('css', a:on_save)
" let css_errors = getloclist(0)
"endif
"call eclim#util#SetLocationList(html_errors + css_errors)
if search('<script', 'cnw')
call eclim#javascript#util#UpdateSrcFile(a:on_save)
endif
call eclim#display#signs#RemovePlaceholder()
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,144 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/ant/complete.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command ant_complete -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_targets = '-command ant_targets -p "<project>" -f "<file>"'
" }}}
" CodeComplete(findstart, base) {{{
" Handles ant code completion.
function! eclim#java#ant#complete#CodeComplete(findstart, base)
if !eclim#project#util#IsCurrentFileInProject(0)
return a:findstart ? -1 : []
endif
if a:findstart
call eclim#lang#SilentUpdate(1)
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
"exceptions that break the rule
if line[start - 1] == '.'
let start -= 1
endif
" always start in front of the the '<'
if line[start] == '<'
let start += 1
endif
while start > 0 && line[start - 1] =~ '\w'
let start -= 1
endwhile
" if prev char is '/' then back off the start pos, since the completion
" result will contain the '/'.
if line[start - 1] == '/'
let start -= 1
endif
return start
else
let offset = eclim#util#GetOffset() + len(a:base) - 1
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 0)
if file == ''
return []
endif
let command = s:complete_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let completions = []
let results = eclim#Execute(command)
if type(results) != g:LIST_TYPE
return
endif
" if the word has a '.' in it (like package completion) then we need to
" strip some off according to what is currently in the buffer.
let prefix = substitute(getline('.'),
\ '.\{-}\([[:alnum:].]\+\%' . col('.') . 'c\).*', '\1', '')
for result in results
let word = result.completion
" removed '<' and '>' from end tag results
let word = substitute(word, '^<\(.*\)>$', '\1', '')
" strip off prefix if necessary.
if word =~ '\.'
let word = substitute(word, escape(prefix, '*'), '', '')
endif
let menu = eclim#html#util#HtmlToText(result.menu)
let info = eclim#html#util#HtmlToText(result.info)
let dict = {'word': word, 'menu': menu, 'info': info}
call add(completions, dict)
endfor
return completions
endif
endfunction " }}}
" CommandCompleteTarget(argLead, cmdLine, cursorPos) {{{
" Custom command completion for ant targets.
function! eclim#java#ant#complete#CommandCompleteTarget(argLead, cmdLine, cursorPos)
let project = eclim#project#util#GetCurrentProjectName()
if project == ''
return []
endif
let file = eclim#java#ant#util#FindBuildFile()
if project != "" && file != ""
let file = eclim#project#util#GetProjectRelativeFilePath(file)
let command = s:command_targets
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let targets = eclim#Execute(command)
if type(targets) != g:LIST_TYPE
return []
endif
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
call filter(targets, 'v:val =~ "^' . argLead . '"')
return targets
endif
return []
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,170 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/ant/doc.html
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Varables {{{
if !exists("g:EclimAntDocDefaultUrl")
let g:EclimAntDocDefaultUrl =
\ 'http://www.google.com/search?btnI=1&q=allintitle%3A<element>+task+%7C+type+site%3Aant.apache.org'
endif
if !exists("g:EclimAntUserDocs")
let g:EclimAntUserDocs = {}
endif
" }}}
" Script Varables {{{
let s:targets = 'http://ant.apache.org/manual/targets.html'
let s:using = 'http://ant.apache.org/manual/using.html#<element>s'
let s:conditions = 'http://ant.apache.org/manual/Tasks/conditions.html#<element>'
let s:mappers = 'http://ant.apache.org/manual/Types/mapper.html'
let s:paths = 'http://ant.apache.org/manual/using.html#path'
let s:types =
\ 'http://ant.apache.org/manual/Types/<element>.html'
let s:selectors =
\ 'http://ant.apache.org/manual/Types/selectors.html#<element>select'
let s:contrib_1 =
\ 'http://ant-contrib.sourceforge.net/tasks/tasks/<element>.html'
let s:contrib_2 =
\ 'http://ant-contrib.sourceforge.net/tasks/tasks/<element>_task.html'
let s:element_docs = {
\ 'project' : s:using,
\ 'target' : s:targets,
\ 'and' : s:conditions,
\ 'checksum' : s:conditions,
\ 'checs' : s:conditions,
\ 'contains' : s:conditions,
\ 'equals' : s:conditions,
\ 'filesmatch' : s:conditions,
\ 'http' : s:conditions,
\ 'isfalse' : s:conditions,
\ 'isfileselected' : s:conditions,
\ 'isreference' : s:conditions,
\ 'isset' : s:conditions,
\ 'istrue' : s:conditions,
\ 'length' : s:conditions,
\ 'not' : s:conditions,
\ 'or' : s:conditions,
\ 'os' : s:conditions,
\ 'socket' : s:conditions,
\ 'compositemapper' : s:mappers,
\ 'filtermapper' : s:mappers,
\ 'flattenmapper' : s:mappers,
\ 'globmapper' : s:mappers,
\ 'identitymapper' : s:mappers,
\ 'mergemapper' : s:mappers,
\ 'packagemapper' : s:mappers,
\ 'regexmapper' : s:mappers,
\ 'antlib' : s:types,
\ 'description' : s:types,
\ 'dirset' : s:types,
\ 'filelist' : s:types,
\ 'fileset' : s:types,
\ 'filterchain' : s:types,
\ 'filterset' : s:types,
\ 'mapper' : s:types,
\ 'patternset' : s:types,
\ 'permissions' : s:types,
\ 'propertyset' : s:types,
\ 'redirector' : s:types,
\ 'regexp' : s:types,
\ 'xmlcatalog' : s:types,
\ 'zipfileset' : s:types,
\ 'classpath' : s:paths,
\ 'path' : s:paths,
\ 'containsregexp' : s:selectors,
\ 'date' : s:selectors,
\ 'depend' : s:selectors,
\ 'depth' : s:selectors,
\ 'different' : s:selectors,
\ 'filename' : s:selectors,
\ 'majority' : s:selectors,
\ 'modified' : s:selectors,
\ 'none' : s:selectors,
\ 'present' : s:selectors,
\ 'selector' : s:selectors,
\ 'size' : s:selectors,
\ 'type' : s:selectors,
\ 'for' : s:contrib_1,
\ 'foreach' : s:contrib_1,
\ 'if' : s:contrib_1,
\ 'outofdate' : s:contrib_1,
\ 'runtarget' : s:contrib_1,
\ 'switch' : s:contrib_1,
\ 'throw' : s:contrib_1,
\ 'timestampselector' : s:contrib_1,
\ 'trycatch' : s:contrib_1,
\ 'osfamily' : s:contrib_1,
\ 'shellscript' : s:contrib_1,
\ 'propertycopy' : s:contrib_1,
\ 'propertyselector' : s:contrib_1,
\ 'pathoffileset' : s:contrib_1,
\ 'propertyregex' : s:contrib_1,
\ 'sortlist' : s:contrib_1,
\ 'urlencode' : s:contrib_1,
\ 'forget' : s:contrib_1,
\ 'compilewithwalls' : s:contrib_1,
\ 'inifile' : s:contrib_1,
\ 'verifydesign' : s:contrib_1,
\ 'antcallback' : s:contrib_2,
\ 'antfetch' : s:contrib_2,
\ 'assert' : s:contrib_2,
\ 'post' : s:contrib_2,
\ 'stopwatch' : s:contrib_2,
\ 'match' : s:contrib_2,
\ 'variable' : s:contrib_2,
\ 'limit' : s:contrib_2,
\ 'antclipse' : s:contrib_2
\ }
" }}}
function! eclim#java#ant#doc#FindDoc(element) " {{{
" Open the url to the documentation for the supplied element name or if not
" provided, the element name under the cursor.
let element = a:element
if element == ''
let col = eclim#util#GetCurrentElementColumn()
if getline('.')[col - 2] !~ '<\|\/'
" not on an element
return
endif
let element = expand('<cword>')
endif
let element = tolower(element)
if has_key(s:element_docs, element)
let url = s:element_docs[element]
elseif has_key(g:EclimAntUserDocs, element)
let url = g:EclimAntUserDocs[element]
else
let url = g:EclimAntDocDefaultUrl
endif
"let url = escape(url, '&%#')
"let url = escape(url, '%#')
let url = substitute(url, '<element>', element, 'g')
call eclim#web#OpenUrl(url)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,31 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/classpath.html
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" SetRepo(path) {{{
" Sets the location of the ivy repository.
function! eclim#java#ant#ivy#SetRepo(path)
call eclim#java#classpath#VariableCreate('IVY_REPO', a:path)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,36 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Utility functions for working with ant.
"
" License:
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" FindBuildFile() {{{
" Finds the build file relative to the current file (like ant -find).
function! eclim#java#ant#util#FindBuildFile()
let buildFile = eclim#util#Findfile('build.xml', fnamemodify(expand('%:p'), ':h') . ';')
if filereadable(buildFile)
return substitute(fnamemodify(buildFile, ':p'), '\', '/', 'g')
endif
return ''
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,241 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/classpath.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_variables = '-command java_classpath_variables'
let s:command_variable_create =
\ '-command java_classpath_variable_create -n "<name>" -p "<path>"'
let s:command_variable_delete =
\ '-command java_classpath_variable_delete -n "<name>"'
let s:entry_project =
\ "\t<classpathentry exported=\"true\" kind=\"src\" path=\"/<path>\"/>"
let s:entry ="\t<classpathentry kind=\"<kind>\" path=\"<path>\"/>"
let s:entry_sourcepath =
\ "\t<classpathentry kind=\"<kind>\" path=\"<path>\"\n\t\t\tsourcepath=\"<src>\"/>"
let s:entry_javadoc =
\ "\t<classpathentry kind=\"<kind>\" path=\"<path>\"\n" .
\ "\t\t\tsourcepath=\"<src>\">\n" .
\ "\t\t<attributes>\n" .
\ "\t\t\t<attribute name=\"javadoc_location\" value=\"<javadoc>\"/>\n" .
\ "\t\t</attributes>\n" .
\ "\t</classpathentry>"
" }}}
function! eclim#java#classpath#NewClasspathEntry(kind, arg, ...) " {{{
" Adds a new entry to the current .classpath file.
let template_name = 's:entry'
let args = {'kind': a:kind, 'path': substitute(a:arg, '\', '/', 'g')}
if a:0
if a:0 == 1
let template_name = 's:entry_sourcepath'
let args['src'] = substitute(a:1, '\', '/', 'g')
elseif a:0 == 2
let template_name = 's:entry_javadoc'
let args['src'] = substitute(a:1, '\', '/', 'g')
let javadoc = substitute(a:2, '\', '/', 'g')
let absolute = javadoc =~? '^\([a-z]:\)\?/'
" handle absolute vs project relative javadoc location
if absolute
" windows paths need a leading slash
if javadoc =~? '^[a-z]:/'
let javadoc = '/' . javadoc
endif
let javadoc = 'file:' . javadoc
else
if !eclim#project#util#IsCurrentFileInProject(1)
return
endif
if javadoc =~? '\.jar$'
let project = eclim#project#util#GetCurrentProjectName()
let javadoc = 'platform:/resource/' . project . '/' . javadoc
else
" relative dirs must be made absolute
let project = eclim#project#util#GetCurrentProjectRoot()
let javadoc = project . '/' . javadoc
endif
endif
if javadoc =~? '\.jar$'
let javadoc = 'jar:' . javadoc . '!/'
elseif javadoc !~ '^file:'
let javadoc = 'file:' . javadoc
endif
let args['javadoc'] = javadoc
else
call eclim#util#EchoError('Too many arguments.')
return
endif
endif
if exists(template_name . '_' . a:kind)
let template = {template_name}_{a:kind}
else
let template = {template_name}
endif
for [key, value] in items(args)
let template = substitute(template, '<' . key . '>', value, 'g')
endfor
let cline = line('.')
let ccol = col('.')
call s:MoveToInsertPosition()
let line = line('.')
call append(line, split(template, '\n'))
call cursor(cline + 1, ccol)
endfunction " }}}
function! s:MoveToInsertPosition() " {{{
" If necessary moves the cursor to a valid insert position.
let start = search('<classpath\s*>', 'wn')
let end = search('</classpath\s*>', 'wn')
if line('.') < start || line('.') >= end
call cursor(end - 1, 1)
endif
endfunction " }}}
function! eclim#java#classpath#GetVariableNames() " {{{
let variables = eclim#Execute(s:command_variables)
if type(variables) != g:LIST_TYPE
return []
endif
return map(variables, "v:val.name")
endfunction " }}}
function! eclim#java#classpath#VariableList() " {{{
let variables = eclim#Execute(s:command_variables)
if type(variables) != g:LIST_TYPE
return
endif
if len(variables) == 0
call eclim#util#Echo("No variables.")
endif
let pad = 0
for variable in variables
let pad = len(variable.name) > pad ? len(variable.name) : pad
endfor
let output = []
for variable in variables
call add(output, eclim#util#Pad(variable.name, pad) . ' - ' . variable.path)
endfor
call eclim#util#Echo(join(output, "\n"))
endfunction " }}}
function! eclim#java#classpath#VariableCreate(name, path) " {{{
let path = substitute(fnamemodify(a:path, ':p'), '\', '/', 'g')
if has('win32unix')
let path = eclim#cygwin#WindowsPath(path)
endif
let command = s:command_variable_create
let command = substitute(command, '<name>', a:name, '')
let command = substitute(command, '<path>', path, '')
let result = eclim#Execute(command)
if result != '0'
call eclim#util#Echo(result)
endif
endfunction " }}}
function! eclim#java#classpath#VariableDelete(name) " {{{
let command = s:command_variable_delete
let command = substitute(command, '<name>', a:name, '')
let result = eclim#Execute(command)
if result != '0'
call eclim#util#Echo(result)
endif
endfunction " }}}
function! eclim#java#classpath#CommandCompleteVar(argLead, cmdLine, cursorPos) " {{{
" Custom command completion for classpath var relative files.
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let vars = eclim#java#classpath#GetVariableNames()
call filter(vars, 'v:val =~ "\\M^' . argLead . '"')
return vars
endfunction " }}}
function! eclim#java#classpath#CommandCompleteVarPath(argLead, cmdLine, cursorPos) " {{{
" Custom command completion for classpath var relative files.
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
let vars = eclim#Execute(s:command_variables)
" just the variable name
if argLead !~ '/'
let var_names = deepcopy(vars)
call filter(var_names, 'v:val.name =~ "^' . argLead . '"')
if len(var_names) > 0
call map(var_names,
\ "isdirectory(v:val.path) ? v:val.name . '/' : v:val.name")
endif
return var_names
endif
" variable name + path
let var = substitute(argLead, '\(.\{-}\)/.*', '\1', '')
let var_dir = ""
for cv in vars
if cv.name =~ '^' . var
let var_dir = cv.path
break
endif
endfor
if var_dir == ''
return []
endif
let var_dir = escape(substitute(var_dir, '\', '/', 'g'), ' ')
let argLead = substitute(argLead, var, var_dir, '')
let files = eclim#util#CommandCompleteFile(argLead, a:cmdLine, a:cursorPos)
let replace = escape(var_dir, '\')
call map(files, "substitute(v:val, '" . replace . "', '" . var . "', '')")
return files
endfunction " }}}
function! eclim#java#classpath#CommandCompleteVarAndDir(argLead, cmdLine, cursorPos) " {{{
" Custom command completion for classpath var relative files.
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
" complete vars for first arg
if cmdLine =~ '^' . args[0] . '\s*' . escape(argLead, '~.\') . '$'
return eclim#java#classpath#CommandCompleteVar(argLead, a:cmdLine, a:cursorPos)
endif
return eclim#util#CommandCompleteDir(a:argLead, a:cmdLine, a:cursorPos)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,169 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command java_complete -p "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding> -l <layout>'
" }}}
function! eclim#java#complete#CodeComplete(findstart, base) " {{{
if !eclim#project#util#IsCurrentFileInProject(0)
return a:findstart ? -1 : []
endif
if a:findstart
call eclim#lang#SilentUpdate(1)
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
"exceptions that break the rule
if line[start] == '.' && line[start - 1] != '.'
let start -= 1
endif
while start > 0 && line[start - 1] =~ '\w'
let start -= 1
endwhile
return start
else
let offset = eclim#util#GetOffset() + len(a:base)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 0)
if file == ''
return []
endif
let command = s:complete_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let command = substitute(command, '<layout>', g:EclimJavaCompleteLayout, '')
let completions = []
let response = eclim#Execute(command)
if type(response) != g:DICT_TYPE
return
endif
if has_key(response, 'imports') && len(response.imports)
let imports = response.imports
if exists('g:TestEclimWorkspace') " allow this to be tested somewhat
call eclim#java#complete#ImportThenComplete(imports)
else
let func = "eclim#java#complete#ImportThenComplete(" . string(imports) . ")"
call feedkeys("\<c-e>\<c-r>=" . func . "\<cr>", 'n')
endif
" prevents supertab's completion chain from attempting the next
" completion in the chain.
return -1
endif
if has_key(response, 'error') && len(response.completions) == 0
call eclim#util#EchoError(response.error.message)
return -1
endif
" if the word has a '.' in it (like package completion) then we need to
" strip some off according to what is currently in the buffer.
let prefix = substitute(getline('.'),
\ '.\{-}\([[:alnum:].]\+\%' . col('.') . 'c\).*', '\1', '')
" as of eclipse 3.2 it will include the parens on a completion result even
" if the file already has them.
let open_paren = getline('.') =~ '\%' . col('.') . 'c\s*('
let close_paren = getline('.') =~ '\%' . col('.') . 'c\s*(\s*)'
" when completing imports, the completions include ending ';'
let semicolon = getline('.') =~ '\%' . col('.') . 'c\s*;'
for result in response.completions
let word = result.completion
" strip off prefix if necessary.
if word =~ '\.'
let word = substitute(word, prefix, '', '')
endif
" strip off close paren if necessary.
if word =~ ')$' && close_paren
let word = strpart(word, 0, strlen(word) - 1)
endif
" strip off open paren if necessary.
if word =~ '($' && open_paren
let word = strpart(word, 0, strlen(word) - 1)
endif
" strip off semicolon if necessary.
if word =~ ';$' && semicolon
let word = strpart(word, 0, strlen(word) - 1)
endif
" if user wants case sensitivity, then filter out completions that don't
" match
if g:EclimJavaCompleteCaseSensitive && a:base != ''
if word !~ '^' . a:base . '\C'
continue
endif
endif
let menu = result.menu
let info = eclim#html#util#HtmlToText(result.info)
let dict = {
\ 'word': word,
\ 'menu': menu,
\ 'info': info,
\ 'kind': result.type,
\ 'dup': 1,
\ 'icase': !g:EclimJavaCompleteCaseSensitive,
\ }
call add(completions, dict)
endfor
return completions
endif
endfunction " }}}
function! eclim#java#complete#ImportThenComplete(choices) " {{{
" Called by CodeComplete when the completion depends on a missing import.
let choice = ''
if len(a:choices) > 1
let choice = eclim#java#import#ImportPrompt(a:choices)
elseif len(a:choices)
let choice = a:choices[0]
endif
if choice != ''
call eclim#java#import#Import(choice)
call feedkeys("\<c-x>\<c-u>", 'tn')
endif
return ''
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,139 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/correct.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" define Correction group based on Normal.
hi link Correction Normal
hi Correction gui=underline,bold term=underline,bold cterm=underline,bold
" Script Varables {{{
let s:command_correct =
\ '-command java_correct -p "<project>" -f "<file>" ' .
\ '-l <line> -o <offset> -e <encoding>'
let s:command_correct_apply = s:command_correct . ' -a <apply>'
" }}}
" Correct() {{{
function! eclim#java#correct#Correct()
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_correct
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<line>', line('.'), '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let window_name = file . "_correct"
let filename = expand('%:p')
call eclim#util#TempWindowClear(window_name)
let result = eclim#Execute(command)
" error executing the command.
if type(result) != g:DICT_TYPE && type(result) != g:STRING_TYPE
return
" no error on the current line
elseif type(result) == g:STRING_TYPE
call eclim#util#Echo(result)
return
" no correction proposals found.
elseif len(result.corrections) == 0
call eclim#util#EchoInfo('No Suggestions')
return
endif
let content = []
call add(content, result.message)
for correction in result.corrections
call add(content,
\ correction.index . '.' . result.offset . ': ' . correction.description)
for line in split(correction.preview, '\n')
call add(content, line != '' ? ("\t" . line) : line)
endfor
endfor
call eclim#util#TempWindow(window_name, content)
let b:filename = filename
augroup temp_window
autocmd! BufWinLeave <buffer>
call eclim#util#GoToBufferWindowRegister(filename)
augroup END
setlocal ft=java
"exec "syntax match Normal /" . escape(getline(1), '^$/\') . "/"
syntax match Correction /^[0-9]\+\.[0-9]\+:.*/
nnoremap <silent> <buffer> <cr>
\ :call eclim#java#correct#CorrectApply()<cr>
redraw | echo ""
endfunction " }}}
" CorrectApply() {{{
function! eclim#java#correct#CorrectApply()
let line = getline('.')
if line =~ '^[0-9]\+\.[0-9]\+:'
let winnr = bufwinnr('%')
let name = substitute(expand('%:p'), '_correct$', '', '')
let file_winnr = bufwinnr(bufnr('^' . b:filename))
if file_winnr != -1
let filename = b:filename
exec file_winnr . "winc w"
call eclim#lang#SilentUpdate()
let index = substitute(line, '^\([0-9]\+\)\..*', '\1', '')
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_correct_apply
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<line>', line('.'), '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let command = substitute(command, '<apply>', index, '')
call eclim#lang#Refactor(command)
call eclim#lang#UpdateSrcFile('java', 1)
exec winnr . "winc w"
close
else
call eclim#util#EchoError(name . ' no longer found in an open window.')
endif
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,783 @@
" Author: Kannan Rajah
"
" License: {{{
"
" Copyright (C) 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
" Regex used to search for any object ID
" Use a non greedy search to match the closing parenthesis using \{-}
let s:id_search_by_regex = '(id=.\{-})'
" Pattern used to search for specific object ID
let s:id_search_by_value = '(id=<value>)'
" TODO This needs to be maintained per thread. We can use debug session id +
" thread id as key
let s:debug_step_prev_file = ''
let s:debug_step_prev_line = ''
let s:breakpoint_sign = 'eclim_breakpoint'
let s:breakpoint_sign_current = 'eclim_breakpoint_cur'
let s:variable_buf_name = 'Debug Variables'
let s:thread_buf_name = 'Debug Threads'
let s:breakpoint_buf_name = 'Debug Breakpoints'
let s:command_start =
\ '-command java_debug_start -p "<project>" ' .
\ '-h "<host>" -n "<port>" -v "<vim_servername>"'
let s:command_stop = '-command java_debug_stop'
let s:command_session_suspend = '-command java_debug_thread_suspend'
let s:command_thread_suspend = '-command java_debug_thread_suspend ' .
\ '-t "<thread_id>"'
let s:command_session_resume = '-command java_debug_thread_resume'
let s:command_thread_resume = '-command java_debug_thread_resume ' .
\ '-t "<thread_id>"'
let s:command_breakpoint_toggle =
\ '-command java_debug_breakpoint_toggle -p "<project>"'
let s:command_breakpoint_remove =
\ '-command java_debug_breakpoint_remove -p "<project>"'
let s:command_breakpoints_list =
\ '-command java_debug_breakpoint_list -p "<project>"'
let s:command_step = '-command java_debug_step -a "<action>"'
let s:command_step_thread = '-command java_debug_step -a "<action>" -t "<thread_id>"'
let s:command_status = '-command java_debug_status'
let s:command_variable_expand = '-command java_debug_variable_expand -v "<value_id>"'
let s:command_variable_detail = '-command java_debug_variable_detail -v "<value_id>"'
" }}}
function! s:DefineStatusWinSettings() " {{{
" Defines settings that are applicable in any of the debug status windows.
if !exists(":JavaDebug")
command -nargs=0 -buffer JavaDebugStop :call eclim#java#debug#DebugStop()
command -nargs=0 -buffer JavaDebugStatus :call eclim#java#debug#Status()
command -nargs=+ -buffer JavaDebugStep :call eclim#java#debug#Step(<f-args>)
command -nargs=0 -buffer JavaDebugThreadSuspendAll
\ :call eclim#java#debug#DebugThreadSuspendAll()
command -nargs=0 -buffer JavaDebugThreadResume
\ :call eclim#java#debug#DebugThreadResume()
command -nargs=0 -buffer JavaDebugThreadResumeAll
\ :call eclim#java#debug#DebugThreadResumeAll()
endif
endfunction " }}}
function! s:DefineThreadWinSettings() " {{{
" Defines settings that are applicable only in thread window.
nnoremap <silent> <buffer> s :call eclim#java#debug#DebugThreadSuspend()<CR>
nnoremap <silent> <buffer> S :call eclim#java#debug#DebugThreadSuspendAll()<CR>
nnoremap <silent> <buffer> r :call eclim#java#debug#DebugThreadResume()<CR>
nnoremap <silent> <buffer> R :call eclim#java#debug#DebugThreadResumeAll()<CR>
nnoremap <silent> <buffer> B :call eclim#java#debug#BreakpointsList('!')<CR>
nnoremap <silent> <buffer> ? :call eclim#help#BufferHelp(
\ [
\ 's - suspend the thread under the cursor',
\ 'S - suspend all threads',
\ 'r - resume the thread under the cursor',
\ 'R - resume all threads',
\ 'B - view all breakpoints',
\ ],
\ 'vertical', 40)<CR>
endfunction " }}}
function! s:DefineVariableWinSettings() " {{{
" Defines settings that are applicable only in variable window.
nnoremap <silent> <buffer> <CR> :call <SID>VariableExpand()<CR>
nnoremap <silent> <buffer> p :call <SID>VariableDetail()<CR>
nnoremap <silent> <buffer> B :call eclim#java#debug#BreakpointsList('!')<CR>
nnoremap <silent> <buffer> ? :call eclim#help#BufferHelp(
\ [
\ '<CR> - expand the variable under the cursor',
\ 'p - preview toString value',
\ 'B - view all breakpoints',
\ ],
\ 'vertical', 40)<CR>
endfunction " }}}
function! s:DefineBreakpointWinSettings() " {{{
" Defines settings that are applicable only in breakpoint window.
call eclim#display#signs#Define(s:breakpoint_sign, '•', '')
nnoremap <silent> <buffer> T
\ :call <SID>BreakpointAction("java_debug_breakpoint_toggle")<CR>
nnoremap <silent> <buffer> D
\ :call <SID>BreakpointAction("java_debug_breakpoint_remove")<CR>
nnoremap <silent> <buffer> ? :call eclim#help#BufferHelp(
\ [
\ 'T - toggle breakpoint (or group of breakpoints) under cursor',
\ 'D - delete breakpoint (or group of breakpoints) under cursor',
\ ],
\ 'vertical', 40)<CR>
endfunction " }}}
function! eclim#java#debug#DebugStart(...) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
if v:servername == ''
call eclim#util#EchoError(
\ "Error: To debug, VIM must be running in server mode.\n" .
\ "Example: vim --servername <name>")
return
endif
if a:0 != 2
call eclim#util#EchoError(
\ "Please specify the host and port of the java process to connect to.\n" .
\ "Example: JavaDebugStart locahost 1044")
return
endif
let host = a:1
let port = a:2
if port !~ '^\d\+'
call eclim#util#EchoError("Error: Please specify a valid port number.")
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_start
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<host>', host, '')
let command = substitute(command, '<port>', port, '')
let command = substitute(command, '<vim_servername>', v:servername, '')
let result = eclim#Execute(command)
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#debug#DebugStop() " {{{
let command = s:command_stop
let result = eclim#Execute(command)
" Auto close the debug status window
call eclim#util#DeleteBuffer(s:variable_buf_name)
call eclim#util#DeleteBuffer(s:thread_buf_name)
" Remove the sign from previous location
if (s:debug_step_prev_line != '' && s:debug_step_prev_file != '')
call eclim#display#signs#UnplaceFromBuffer(s:debug_step_prev_line,
\ bufnr(s:debug_step_prev_file))
endif
let s:debug_step_prev_line = ''
let s:debug_step_prev_file = ''
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#debug#DebugThreadSuspend() " {{{
" Check if we are in the right window
if (bufname("%") != s:thread_buf_name)
call eclim#util#EchoError("Thread suspend command not applicable in this window.")
return
endif
" Suspends thread under cursor.
let thread_id = s:GetIdUnderCursor()
if thread_id == ""
call eclim#util#Echo("No valid thread found under cursor")
return
endif
let command = s:command_thread_suspend
let command = substitute(command, '<thread_id>', thread_id, '')
call eclim#util#Echo(eclim#Execute(command))
endfunction " }}}
function! eclim#java#debug#DebugThreadSuspendAll() " {{{
" Suspends all threads.
let command = s:command_session_suspend
call eclim#util#Echo(eclim#Execute(command))
endfunction " }}}
function! eclim#java#debug#DebugThreadResume() " {{{
" Resume a single thread.
" Even if thread_id is empty, invoke resume. If there is atleast one
" suspended thread, then the server could resume that. If not, it will
" re-run a message.
" Check if we are in the right window
if (bufname("%") == s:thread_buf_name)
let thread_id = s:GetIdUnderCursor()
else
let thread_id = ""
endif
let command = s:command_thread_resume
let command = substitute(command, '<thread_id>', thread_id, '')
let result = eclim#Execute(command)
" Remove the sign from previous location. This is needed here even though it
" is done in GoToFile function. There may be a time gap until the next
" breakpoint is hit or the program terminates. We don't want to highlight
" the current line until then.
if (s:debug_step_prev_line != '' && s:debug_step_prev_file != '')
call eclim#display#signs#UnplaceFromBuffer(s:debug_step_prev_line,
\ bufnr(s:debug_step_prev_file))
endif
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#debug#DebugThreadResumeAll() " {{{
" Resumes all threads.
let command = s:command_session_resume
let result = eclim#Execute(command)
" Remove the sign from previous location. This is needed here even though it
" is done in GoToFile function. There may be a time gap until the next
" breakpoint is hit or the program terminates. We don't want to highlight
" the current line until then.
if (s:debug_step_prev_line != '' && s:debug_step_prev_file != '')
call eclim#display#signs#UnplaceFromBuffer(s:debug_step_prev_line,
\ bufnr(s:debug_step_prev_file))
endif
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#debug#BreakpointToggle(bang) " {{{
" Adds, enables, disables, or deletes a breakpoint for current cursor
" position.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate()
let line = line('.')
let command = s:command_breakpoint_toggle . ' -f "<file>" -l <line>'
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<line>', line, '')
if a:bang == '!'
let command .= ' -d'
endif
call eclim#util#Echo(eclim#Execute(command))
let name = eclim#util#EscapeBufferName(s:breakpoint_buf_name)
if bufwinnr(name) != -1
let curwinnr = winnr()
exec bufwinnr(name) . "winc w"
call s:BreakpointsListRefresh()
exec curwinnr . "winc w"
endif
endfunction " }}}
function! eclim#java#debug#BreakpointsList(bang) " {{{
" List breakpoints in the current file or the entire workspace.
if !eclim#project#util#IsCurrentFileInProject() && a:bang == ''
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_breakpoints_list
let command = substitute(command, '<project>', project, '')
if a:bang != '!'
let file = eclim#project#util#GetProjectRelativeFilePath()
let command .= ' -f "' . file . '"'
endif
let results = eclim#Execute(command)
if (type(results) != g:LIST_TYPE)
return
endif
if empty(results)
call eclim#util#Echo('No breakpoints found.')
return
endif
" when run from one of the status windows, force the list to open above them
" if possible
if &buftype == 'nofile'
winc k
endif
call s:BreakpointsList(command, results)
endfunction " }}}
function! s:BreakpointsList(command, results) " {{{
let group_by = ['project', 'name']
if a:command =~ '\s-f\s'
let group_by = ['name']
endif
call eclim#util#FileList(s:breakpoint_buf_name, a:results, {
\ 'location': '',
\ 'group_by': group_by,
\ })
call s:DefineBreakpointWinSettings()
let b:eclim_breakpoints = a:command
" Place sign for breakpoints that are enabled
let line_num = 0
for entry in b:eclim_filelist
let line_num += 1
if get(entry, 'enabled')
call eclim#display#signs#Place(s:breakpoint_sign, line_num)
endif
endfor
endfunction " }}}
function! s:BreakpointsListRefresh() " {{{
" FIXME: restore all closed fold states
let results = eclim#Execute(b:eclim_breakpoints)
if (type(results) != g:LIST_TYPE)
return
endif
if empty(results)
call eclim#util#Echo('No breakpoints found.')
close
return
endif
let line = line('.')
let col = col('.')
" remove all existing signs first
for existing in eclim#display#signs#GetExisting(s:breakpoint_sign)
call eclim#display#signs#Unplace(existing.id)
endfor
call s:BreakpointsList(b:eclim_breakpoints, results)
if line > line('$')
let line = line('$')
endif
call cursor(line, col)
endfunction " }}}
function! eclim#java#debug#BreakpointRemove(bang) " {{{
" Removes breakpoints defined in file or the entire project.
if !eclim#project#util#IsCurrentFileInProject() && a:bang == ''
return
endif
let project = eclim#project#util#GetCurrentProjectName()
if a:bang == '!'
let command = s:command_breakpoint_remove
let command = substitute(command, '<project>', file, '')
else
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_breakpoint_remove . ' -f "<file>"'
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
endif
call eclim#util#Echo(eclim#Execute(command))
let name = eclim#util#EscapeBufferName(s:breakpoint_buf_name)
if bufwinnr(name) != -1
let curwinnr = winnr()
exec bufwinnr(name) . "winc w"
call s:BreakpointsListRefresh()
exec curwinnr . "winc w"
endif
endfunction " }}}
function! s:BreakpointAction(command) " {{{
" Removes breakpoint defined under the cursor.
let entry = b:eclim_filelist[line('.') - 1]
let command = ''
" single breakpoint
if has_key(entry, 'filename')
let file = eclim#project#util#GetProjectRelativeFilePath(entry.filename)
let command = '-command ' . a:command . ' -p "<project>" -f "<file>" -l <line>'
let command = substitute(command, '<project>', entry.project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<line>', entry.line, '')
" all breakpoints for a file
elseif has_key(b:eclim_filelist[line('.')], 'filename')
let info = b:eclim_filelist[line('.')]
let file = eclim#project#util#GetProjectRelativeFilePath(info.filename)
let command = '-command ' . a:command . ' -p "<project>" -f "<file>"'
let command = substitute(command, '<project>', info.project, '')
let command = substitute(command, '<file>', file, '')
" all breakpoints for a project
elseif has_key(b:eclim_filelist[line('.') + 1], 'filename')
let info = b:eclim_filelist[line('.') + 1]
let command = '-command ' . a:command . ' -p "<project>"'
let command = substitute(command, '<project>', info.project, '')
endif
if command != ''
let result = eclim#Execute(command)
call s:BreakpointsListRefresh()
call eclim#util#Echo(result)
endif
endfunction " }}}
function! eclim#java#debug#Step(action) " {{{
if (bufname("%") == s:thread_buf_name)
let thread_id = s:GetIdUnderCursor()
else
let thread_id = ""
endif
if thread_id != ""
let command = s:command_step_thread
let command = substitute(command, '<thread_id>', thread_id, '')
else
" Step through the currently stepping thread, if one exists
let command = s:command_step
endif
let command = substitute(command, '<action>', a:action, '')
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE
call eclim#util#Echo(result)
endif
endfunction " }}}
function! eclim#java#debug#Status() " {{{
let command = s:command_status
let results = eclim#Execute(command)
if type(results) != g:DICT_TYPE
return
endif
if has_key(results, 'state')
let state = [results.state]
else
let state = []
endif
if has_key(results, 'threads')
let threads = results.threads
else
let threads = []
endif
if has_key(results, 'variables')
let vars = results.variables
else
let vars = []
endif
call s:CreateStatusWindow(results.project, state + threads, vars)
endfunction " }}}
function! s:CreateStatusWindow(project, threads, vars) " {{{
" Creates the debug status windows if they do not already exist.
" The newly created windows are initialized with given content.
" Store current position and restore in the end so that creation of new
" window does not end up moving the cursor
let cur_bufnr = bufnr('%')
let cur_line = line('.')
let cur_col = col('.')
let thread_win_opts = {'orientation': 'horizontal'}
call eclim#util#TempWindow(s:thread_buf_name, a:threads, thread_win_opts)
setlocal foldmethod=expr
setlocal foldexpr=eclim#display#fold#GetTreeFold(v:lnum)
setlocal foldtext=eclim#display#fold#TreeFoldText()
" Display the stacktrace of suspended threads
setlocal foldlevel=5
" Avoid the ugly - symbol on folded lines
setlocal fillchars="fold:\ "
setlocal nonumber
let b:eclim_project = a:project
call s:DefineThreadWinSettings()
call s:DefineStatusWinSettings()
let var_win_opts = {
\ 'orientation': g:EclimJavaDebugStatusWinOrientation,
\ 'width': g:EclimJavaDebugStatusWinWidth,
\ 'height': g:EclimJavaDebugStatusWinHeight
\ }
call eclim#util#TempWindow(s:variable_buf_name, a:vars, var_win_opts)
setlocal foldmethod=expr
setlocal foldexpr=eclim#display#fold#GetTreeFold(v:lnum)
setlocal foldtext=eclim#display#fold#TreeFoldText()
" Avoid the ugly - symbol on folded lines
setlocal fillchars="fold:\ "
setlocal nonumber
let b:eclim_project = a:project
call s:DefineVariableWinSettings()
call s:DefineStatusWinSettings()
" Restore position
call eclim#util#GoToBufferWindow(cur_bufnr)
call cursor(cur_line, cur_col)
redraw!
endfunction " }}}
function! s:VariableExpand() " {{{
" Expands the variable value under cursor and adds the child variables under
" it in the tree.
" Check if we are in the right window
if (bufname("%") != s:variable_buf_name)
call eclim#util#EchoError("Variable expand command not applicable in this window.")
return
endif
" Return if the current line does not contain any fold
if (matchstr(getline(line('.')), "▸\\|▾") == "")
return
endif
" Make the buffer writable
setlocal modifiable
setlocal noreadonly
let id = s:GetIdUnderCursor()
if (id != "")
let command = s:command_variable_expand
let command = substitute(command, '<value_id>', id, '')
let results = eclim#Execute(command)
if (type(results) == g:LIST_TYPE && len(results) > 0)
call append(line('.'), results)
" Remove the placeholder line used to get folding to work.
" But first unfold if its folded.
foldopen
let cur_line = line('.')
let cur_col = col('.')
let empty_line = line('.') + len(results) + 1
exec 'silent ' . empty_line . ',' . empty_line . 'd'
" Restore cursor position
call cursor(cur_line, cur_col)
else
exec "normal! za"
endif
else
exec "normal! za"
endif
" Restore settings
setlocal nomodified
setlocal nomodifiable
setlocal readonly
endfunction " }}}
function! s:VariableDetail() " {{{
" Displays the detail of the variable value under cursor in status line.
" Check if we are in the right window
if (bufname("%") != s:variable_buf_name)
call eclim#util#EchoError("Variable detail command not applicable in this window.")
return
endif
let id = s:GetIdUnderCursor()
if (id == "")
return
endif
let command = s:command_variable_detail
let command = substitute(command, '<value_id>', id, '')
let result = eclim#Execute(command)
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#debug#GoToFile(file, line) " {{{
" Remove the sign from previous location
if (s:debug_step_prev_line != '' && s:debug_step_prev_file != '')
call eclim#display#signs#UnplaceFromBuffer(s:debug_step_prev_line,
\ bufnr(s:debug_step_prev_file))
endif
" Jump out of status window so that the buffer is opened in the code window
" If you are in variable window, first go to thread window
if (bufname("%") == s:thread_buf_name)
call eclim#util#GoToBufferWindow(b:filename)
endif
" If you are in thread window, go back to code window
if (bufname("%") == s:variable_buf_name)
call eclim#util#GoToBufferWindow(b:filename)
call eclim#util#GoToBufferWindow(b:filename)
endif
let s:debug_step_prev_file = a:file
let s:debug_step_prev_line = a:line
if &buftype == 'nofile'
winc k
endif
call eclim#util#GoToBufferWindowOrOpen(a:file, 'edit', a:line, '^')
" gross, but seems to be the easiest way to remove the sign from all buffers
silent! call eclim#display#signs#Undefine(s:breakpoint_sign_current)
call eclim#display#signs#Define(
\ s:breakpoint_sign_current,
\ g:EclimJavaDebugLineSignText,
\ g:EclimHighlightSuccess,
\ g:EclimJavaDebugLineHighlight)
call eclim#display#signs#PlaceInBuffer(
\ s:breakpoint_sign_current, bufnr(a:file), a:line)
endfunction " }}}
function! s:GetIdUnderCursor() " {{{
" Returns the object ID under cursor. Object ID is present in the form:
" (id=X) where X is the ID.
"
" An empty string is returned if there is no valid ID.
" Look for the substring (id=X) where X is the object ID
let id_substr = matchstr(getline("."), s:id_search_by_regex)
if (id_substr == "")
return ""
else
let id = split(id_substr, '=')[1]
" remove the trailing ) character
return substitute(id, ")","","g")
endif
endfunction " }}}
function! eclim#java#debug#ThreadViewUpdate(thread_id, kind, value) " {{{
" Updates the thread window with new thread information.
" Update kind can be one of the following:
" a: Add a new thread
" m: Modify an existing thread
" r: Remove an existing thread
" Overwrite the message containing the long list of arguments to this function
call eclim#util#Echo("Refreshing ...")
" Store current position and restore in the end
let cur_bufnr = bufnr('%')
let cur_line = line('.')
let cur_col = col('.')
let found = eclim#util#GoToBufferWindow(s:thread_buf_name)
if found == 0
return
endif
setlocal modifiable
setlocal noreadonly
let lines = split(a:value, "<eol>")
if a:kind == 'a'
" Add to the end
call append(line('$'), lines)
else
" Go to line having the thread id
call cursor(1, 1)
let pattern = substitute(s:id_search_by_value, '<value>', a:thread_id, '')
" Don't wrap search.
let match_line = search(pattern, 'W')
if match_line != 0
" Get the next thread entry. Don't wrap search.
let next_match_line = search(s:id_search_by_regex, 'W')
if next_match_line == 0
let last_line_del = line('$')
else
let last_line_del = next_match_line - 1
endif
" Delete the desired lines
let undolevels = &undolevels
set undolevels=-1
silent exec match_line . ',' . last_line_del . 'delete _'
let &undolevels = undolevels
" In case of modify, add the new values
if a:kind == 'm'
call append(match_line - 1, lines)
endif
endif
endif
setlocal nomodifiable
setlocal readonly
" Restore position
call eclim#util#GoToBufferWindow(cur_bufnr)
call cursor(cur_line, cur_col)
call eclim#util#Echo(" ")
endfunction " }}}
function! eclim#java#debug#SessionTerminated() " {{{
" Cleans up the debug status window.
" Store current position and restore in the end
let cur_bufnr = bufnr('%')
let cur_line = line('.')
let cur_col = col('.')
let found = eclim#util#GoToBufferWindow(s:thread_buf_name)
if found == 0
return
endif
setlocal modifiable
setlocal noreadonly
" Go to line having the thread id
call cursor(1, 1)
s/Connect\(ed\|ing\)/Disconnected/e
" Delete any threads that have not been cleared
if line('$') > 1
silent 2,$delete _
endif
setlocal nomodifiable
setlocal readonly
" Restore position
call eclim#util#GoToBufferWindow(cur_bufnr)
call cursor(cur_line, cur_col)
call eclim#util#TempWindowClear(s:variable_buf_name)
endfunction " }}}
function! eclim#java#debug#VariableViewUpdate(value) " {{{
" Updates the variable window with new set of values.
call eclim#util#Echo("Refreshing ...")
call eclim#util#TempWindowClear(s:variable_buf_name, split(a:value, "<eol>"))
call eclim#util#Echo(" ")
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,269 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_comment =
\ '-command javadoc_comment -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_element_doc =
\ '-command java_element_doc -p "<project>" -f "<file>" -o <offset> -l <length> -e <encoding>'
let s:command_doc_link = '-command java_element_doc -u "<url>"'
let s:command_source_dirs = '-command java_src_dirs -p "<project>"'
" }}}
function! eclim#java#doc#Comment() " {{{
" Add / update the comments for the element under the cursor.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let offset = eclim#util#GetCurrentElementOffset()
let command = s:command_comment
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let result = eclim#Execute(command)
if result != "0"
call eclim#util#Reload({'retab': 1})
write
endif
endfunction " }}}
function! eclim#java#doc#Preview() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
if !eclim#java#util#IsValidIdentifier(expand('<cword>'))
call eclim#util#EchoError
\ ("Element under the cursor is not a valid java identifier.")
return 0
endif
exec 'pedit +:call\ eclim#java#doc#PreviewOpen(' . bufnr('%') . ') [javadoc]'
endfunction " }}}
function! eclim#java#doc#PreviewOpen(bufnr_or_url) " {{{
if a:bufnr_or_url =~ '^\d\+$'
let curwin = winnr()
exec bufwinnr(a:bufnr_or_url) . 'winc w'
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 1)
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
exec curwin . 'winc w'
let command = s:command_element_doc
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<length>', length, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
else
let command = s:command_doc_link
let command = substitute(command, '<url>', a:bufnr_or_url, '')
endif
let result = eclim#Execute(command)
if type(result) == g:DICT_TYPE
if !exists('b:eclim_javadoc_stack')
let b:eclim_javadoc_stack = []
let b:eclim_javadoc_index = -1
elseif b:eclim_javadoc_index >= 0
let b:eclim_javadoc_stack = b:eclim_javadoc_stack[:b:eclim_javadoc_index]
endif
call add(b:eclim_javadoc_stack, result)
let b:eclim_javadoc_index += 1
let b:eclim_javadoc = result
setlocal modifiable
call append(0, split(result.text, '\n'))
retab
if getline('$') =~ '^\s*$'
$,$delete _
endif
call cursor(1, 1)
elseif type(result) == g:STRING_TYPE
if result == ''
call eclim#util#EchoWarning('No javadoc found.')
else
call eclim#util#EchoError(result)
endif
return
endif
setlocal wrap
setlocal nomodifiable
setlocal nolist
setlocal noswapfile
setlocal nobuflisted
setlocal buftype=nofile
setlocal bufhidden=wipe
setlocal conceallevel=2 concealcursor=ncv
set ft=javadoc_preview
hi link javadocPreviewLink Label
syntax match javadocPreviewLinkStart contained /|/ conceal
syntax match javadocPreviewLinkEnd contained /\[\d\+\]|/ conceal
syntax region javadocPreviewLink start="|" end="" concealends
syntax match javadocPreviewLink /|.\{-}\[\d\+\]|/
\ contains=JavadocPreviewLinkStart,JavadocPreviewLinkEnd
nnoremap <silent> <buffer> <cr> :call eclim#java#doc#PreviewLink()<cr>
nnoremap <silent> <buffer> <c-]> :call eclim#java#doc#PreviewLink()<cr>
nnoremap <silent> <buffer> <c-o> :call eclim#java#doc#PreviewHistory(-1)<cr>
nnoremap <silent> <buffer> <c-i> :call eclim#java#doc#PreviewHistory(1)<cr>
endfunction " }}}
function! eclim#java#doc#PreviewLink() " {{{
let line = getline('.')
let cnum = col('.')
if line[cnum - 1] == '|'
let cnum += cnum > 1 && line[cnum - 2] == ']' ? -1 : 1
endif
let text = substitute(line, '.*|\(.\{-}\%' . cnum . 'c.\{-}\)|.*', '\1', '')
if text == line || text !~ '\[\d\+]$'
return
endif
exec 'let index = ' . substitute(text, '.*\[\(\d\+\)\]$', '\1', '')
if !exists('b:eclim_javadoc') || len(b:eclim_javadoc.links) <= index
return
endif
let url = b:eclim_javadoc.links[index].href
if url =~ '^eclipse-javadoc:'
exec 'pedit +:call\ eclim#java#doc#PreviewOpen("' . url . '") [javadoc]'
else
call eclim#web#OpenUrl(url)
endif
endfunction " }}}
function! eclim#java#doc#PreviewHistory(offset) " {{{
if !exists('b:eclim_javadoc_stack')
return
endif
let index = b:eclim_javadoc_index + a:offset
if index < 0 || index > len(b:eclim_javadoc_stack) -1
return
endif
let result = b:eclim_javadoc_stack[index]
let b:eclim_javadoc = result
let b:eclim_javadoc_index = index
setlocal modifiable
1,$delete _
call append(0, split(result.text, '\n'))
retab
if getline('$') =~ '^\s*$'
$,$delete _
endif
setlocal nomodifiable
call cursor(1, 1)
endfunction " }}}
function! eclim#java#doc#Javadoc(bang, ...) " {{{
" Run javadoc for all, or the supplied, source files.
" Optional args:
" file, file, file, ...: one ore more source files.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project_path = eclim#project#util#GetCurrentProjectRoot()
let project = eclim#project#util#GetCurrentProjectName()
let args = '-p "' . project . '"'
if len(a:000) > 0 && (len(a:000) > 1 || a:000[0] != '')
let args .= ' -f "' . join(a:000, ' ') . '"'
endif
let cwd = getcwd()
try
exec 'lcd ' . escape(project_path, ' ')
call eclim#util#MakeWithCompiler('eclim_javadoc', a:bang, args)
finally
exec 'lcd ' . escape(cwd, ' ')
endtry
endfunction " }}}
function! eclim#java#doc#CommandCompleteJavadoc(argLead, cmdLine, cursorPos) " {{{
let dir = eclim#project#util#GetCurrentProjectRoot()
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
let project = eclim#project#util#GetCurrentProjectName()
let command = substitute(s:command_source_dirs, '<project>', project, '')
let result = eclim#Execute(command)
let paths = []
if result != '' && result != '0'
let paths = map(split(result, "\n"),
\ "eclim#project#util#GetProjectRelativeFilePath(v:val)")
endif
let results = []
if argLead !~ '^\s*$'
let follow = 0
for path in paths
if argLead =~ '^' . path
let follow = 1
break
elseif path =~ '^' . argLead
call add(results, path)
endif
endfor
if follow
let results = split(eclim#util#Glob(dir . '/' . argLead . '*', 1), '\n')
call filter(results, "isdirectory(v:val) || v:val =~ '\\.java$'")
call map(results, "substitute(v:val, '\\', '/', 'g')")
call map(results, 'isdirectory(v:val) ? v:val . "/" : v:val')
call map(results, 'substitute(v:val, dir, "", "")')
call map(results, 'substitute(v:val, "^\\(/\\|\\\\\\)", "", "g")')
call map(results, "substitute(v:val, ' ', '\\\\ ', 'g')")
endif
else
let results = paths
endif
return eclim#util#ParseCommandCompletionResults(argLead, results)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,135 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_hierarchy =
\ '-command java_hierarchy -p "<project>" -f "<file>" -o <offset> -e <encoding>'
" }}}
function! eclim#java#hierarchy#Hierarchy() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_hierarchy
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let result = eclim#Execute(command)
if type(result) != g:DICT_TYPE
return
endif
let lines = []
let info = []
call s:FormatHierarchy(result, lines, info, '')
call eclim#util#TempWindow('[Hierarchy]', lines)
set ft=java
setlocal modifiable noreadonly
call append(line('$'), ['', '" use ? to view help'])
setlocal nomodifiable readonly
syntax match Comment /^".*/
let b:hierarchy_info = info
call eclim#util#Echo(b:hierarchy_info[line('.') - 1])
augroup eclim_java_hierarchy
autocmd!
autocmd CursorMoved <buffer>
\ if line('.') <= len(b:hierarchy_info) |
\ call eclim#util#Echo(b:hierarchy_info[line('.') - 1]) |
\ else |
\ echo '' |
\ endif
augroup END
nnoremap <buffer> <silent> <cr>
\ :call <SID>Open(g:EclimJavaHierarchyDefaultAction)<cr>
nnoremap <buffer> <silent> E :call <SID>Open('edit')<cr>
nnoremap <buffer> <silent> S :call <SID>Open('split')<cr>
nnoremap <buffer> <silent> T :call <SID>Open("tablast \| tabnew")<cr>
" assign to buffer var to get around weird vim issue passing list containing
" a string w/ a '<' in it on execution of mapping.
let b:hierarchy_help = [
\ '<cr> - open file with default action',
\ 'E - open with :edit',
\ 'S - open in a new split window',
\ 'T - open in a new tab',
\ ]
nnoremap <buffer> <silent> ?
\ :call eclim#help#BufferHelp(b:hierarchy_help, 'vertical', 40)<cr>
endfunction " }}}
function! s:FormatHierarchy(hierarchy, lines, info, indent) " {{{
call add(a:lines, a:indent . a:hierarchy.name)
call add(a:info, a:hierarchy.qualified)
let indent = eclim#util#GetIndent(1)
for child in a:hierarchy.children
call s:FormatHierarchy(child, a:lines, a:info, a:indent . indent)
endfor
endfunction " }}}
function! s:Open(action) " {{{
let line = line('.')
if line > len(b:hierarchy_info)
return
endif
let type = b:hierarchy_info[line - 1]
" go to the buffer that initiated the hierarchy
exec b:winnr . 'winc w'
" source the search plugin if necessary
if !exists("g:EclimJavaSearchSingleResult")
runtime autoload/eclim/java/search.vim
endif
let action = a:action
let filename = expand('%:p')
if exists('b:filename')
let filename = b:filename
if !eclim#util#GoToBufferWindow(b:filename)
" if the file is no longer open, open it
silent! exec action . ' ' . b:filename
let action = 'edit'
endif
endif
if line != 1
let saved = g:EclimJavaSearchSingleResult
try
let g:EclimJavaSearchSingleResult = action
if eclim#java#search#SearchAndDisplay('java_search', '-x declarations -p ' . type)
let b:filename = filename
endif
finally
let g:EclimJavaSearchSingleResult = saved
endtry
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,353 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/impl.html
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:command_constructor =
\ '-command java_constructor -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_properties =
\ '-command java_bean_properties -p "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding> -t <type> -r <properties> <indexed>'
let s:command_impl =
\ '-command java_impl -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_impl_insert =
\ '-command java_impl -p "<project>" -f "<file>" -t "<type>" ' .
\ '-s "<superType>" <methods>'
let s:command_delegate =
\ '-command java_delegate -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_delegate_insert =
\ '-command java_delegate -p "<project>" -f "<file>" -v "<type>" ' .
\ '-s "<superType>" <methods>'
let s:no_properties =
\ 'Unable to find property at current cursor position: ' .
\ 'Not on a field declaration or possible java syntax error.'
let s:cross_type_selection = "Visual selection is currently limited to methods of one super type at a time."
" }}}
function! eclim#java#impl#Constructor(first, last, bang) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let properties = a:last == 1 ? [] :
\ eclim#java#util#GetSelectedFields(a:first, a:last)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_constructor
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
if a:bang == ''
let command .= ' -s'
endif
if len(properties) > 0
let json = substitute(string(properties), "'", '"', 'g')
if has('win32') || has('win64')
let command .= ' -r "' . json . '"'
else
let command .= " -r '" . json . "'"
endif
endif
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE && result != ''
call eclim#util#EchoError(result)
return
endif
if result != "0"
call eclim#util#Reload({'retab': 1})
write
endif
endfunction " }}}
function! eclim#java#impl#GetterSetter(first, last, bang, type) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let properties = eclim#java#util#GetSelectedFields(a:first, a:last)
if len(properties) == 0
call eclim#util#EchoError(s:no_properties)
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let indexed = a:bang != '' ? '-i' : ''
let command = s:command_properties
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let command = substitute(command, '<type>', a:type, '')
let command = substitute(command, '<properties>', join(properties, ','), '')
let command = substitute(command, '<indexed>', indexed, '')
let result = eclim#Execute(command)
if result != "0"
call eclim#util#Reload({'retab': 1})
write
endif
endfunction " }}}
function! eclim#java#impl#Impl() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let offset = eclim#util#GetCurrentElementOffset()
let command = s:command_impl
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
call eclim#java#impl#ImplWindow(command)
endfunction " }}}
function! eclim#java#impl#ImplWindow(command) " {{{
if (eclim#java#impl#Window(a:command, "impl"))
nnoremap <silent> <buffer> <cr> :call <SID>AddImpl(0)<cr>
vnoremap <silent> <buffer> <cr> :<C-U>call <SID>AddImpl(1)<cr>
endif
endfunction " }}}
function! eclim#java#impl#ImplWindowFolding() " {{{
setlocal foldmethod=syntax
setlocal foldlevel=99
endfunction " }}}
function! eclim#java#impl#Delegate() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let offset = eclim#util#GetCurrentElementOffset()
let encoding = eclim#util#GetEncoding()
let command = s:command_delegate
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', encoding, '')
call eclim#java#impl#DelegateWindow(command)
endfunction " }}}
function! eclim#java#impl#DelegateWindow(command) " {{{
if (eclim#java#impl#Window(a:command, "delegate"))
nnoremap <silent> <buffer> <cr> :call <SID>AddDelegate(0)<cr>
vnoremap <silent> <buffer> <cr> :<C-U>call <SID>AddDelegate(1)<cr>
endif
endfunction " }}}
function! eclim#java#impl#Add(command, function, visual) " {{{
let winnr = bufwinnr(bufnr('^' . b:filename))
" src window is not longer open.
if winnr == -1
call eclim#util#EchoError(b:filename . ' no longer found in an open window.')
return
endif
if a:visual
let start = line("'<")
let end = line("'>")
endif
let superType = ""
let methods = []
" non-visual mode or only one line selected
if !a:visual || start == end
" not a valid selection
if line('.') == 1 || getline('.') =~ '^\(\s*//\|package\|$\|}\)'
return
endif
let line = getline('.')
if line =~ '^\s*throws'
let line = getline(line('.') - 1)
endif
" on a method line
if line =~ '^\s\+'
call add(methods, s:MethodSig(line))
let ln = search('^\w', 'bWn')
if ln > 0
let superType = substitute(getline(ln), '.*\s\(.*\) {', '\1', '')
endif
" on a type line
else
let superType = substitute(line, '.*\s\(.*\) {', '\1', '')
endif
" visual mode
else
let pos = getpos('.')
let index = start
while index <= end
let line = getline(index)
if line =~ '^\s*\($\|throws\|package\)'
" do nothing
" on a method line
elseif line =~ '^\s\+'
call add(methods, s:MethodSig(line))
call cursor(index, 1)
let ln = search('^\w', 'bWn')
if ln > 0
let super = substitute(getline(ln), '.*\s\(.*\) {', '\1', '')
if superType != "" && super != superType
call eclim#util#EchoError(s:cross_type_selection)
call setpos('.', pos)
return
endif
let superType = super
endif
" on a type line
else
let super = substitute(line, '.*\s\(.*\) {', '\1', '')
if superType != "" && super != superType
call eclim#util#EchoError(s:cross_type_selection)
call setpos('.', pos)
return
endif
let superType = super
endif
call setpos('.', pos)
let index += 1
endwhile
if superType == ""
return
endif
endif
" search up for the nearest package
let ln = search('^package', 'bWn')
if ln > 0
let package = substitute(getline(ln), '.*\s\(.*\);', '\1', '')
let superType = package . '.' . substitute(superType, '<.\{-}>', '', 'g')
endif
let type = getline(1)
let impl_winnr = winnr()
exec winnr . "winc w"
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = a:command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<type>', type, '')
let command = substitute(command, '<superType>', superType, '')
if len(methods)
let json = substitute(string(methods), "'", '"', 'g')
let command = substitute(command, '<methods>', '-m ''' . json . '''', '')
else
let command = substitute(command, '<methods>', '', '')
endif
call a:function(command)
noautocmd exec winnr . "winc w"
call eclim#util#Reload({'retab': 1})
write
noautocmd exec impl_winnr . "winc w"
endfunction " }}}
function! eclim#java#impl#Window(command, name) " {{{
let matches = matchlist(a:command, '-o \([0-9]*\)')
let offset = len(matches) > 1 ? matches[1] : 0
let name = eclim#project#util#GetProjectRelativeFilePath() . '_' . a:name
let project = eclim#project#util#GetCurrentProjectName()
let result = eclim#Execute(a:command, {'project': project})
if type(result) == g:STRING_TYPE
call eclim#util#EchoError(result)
return
endif
if type(result) != g:DICT_TYPE
return
endif
let content = [result.type]
for super in result.superTypes
call add(content, '')
call add(content, 'package ' . super.packageName . ';')
call add(content, super.signature . ' {')
for method in super.methods
let signature = split(method, '\n')
let content += map(signature, '"\t" . v:val')
endfor
call add(content, '}')
endfor
call eclim#util#TempWindow(name, content, {'preserveCursor': 1})
setlocal ft=java
call eclim#java#impl#ImplWindowFolding()
let b:eclim_offset = offset
return 1
endfunction " }}}
function! s:AddImpl(visual) " {{{
let command = s:command_impl_insert
if g:EclimJavaImplInsertAtCursor
let command .= ' -o ' . b:eclim_offset
endif
call eclim#java#impl#Add
\ (command, function("eclim#java#impl#ImplWindow"), a:visual)
endfunction " }}}
function! s:AddDelegate(visual) " {{{
call eclim#java#impl#Add
\ (s:command_delegate_insert, function("eclim#java#impl#DelegateWindow"), a:visual)
endfunction " }}}
function! s:MethodSig(line) " {{{
let sig = substitute(a:line, '.*\s\(\w\+(.*\)', '\1', '')
let sig = substitute(sig, ',\s', ',', 'g')
let sig = substitute(sig, '<.\{-}>', '', 'g')
return sig
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,140 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/import.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_import =
\ '-command java_import -p "<project>" -f "<file>" -o <offset> -e <encoding>'
let s:command_organize =
\ '-command java_import_organize -p "<project>" -f "<file>" -o <offset> -e <encoding>'
" }}}
function! eclim#java#import#Import(...) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
if !a:0
let name = expand('<cword>')
if !eclim#java#util#IsValidIdentifier(name) ||
\ eclim#java#util#IsKeyword(name)
call eclim#util#EchoError("'" . name . "' not a classname.")
return
endif
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate()
let offset = eclim#util#GetOffset()
let command = s:command_import
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
if a:0
let command .= ' -t ' . a:1
endif
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE
call eclim#util#EchoError(result)
return
endif
if type(result) == g:DICT_TYPE
call eclim#util#Reload({'pos': [result.line, result.column]})
call eclim#lang#UpdateSrcFile('java', 1)
if result.offset != offset
call eclim#util#Echo('Imported ' . (a:0 ? a:1 : ''))
endif
return
endif
if type(result) != g:LIST_TYPE
return
endif
let choice = eclim#java#import#ImportPrompt(result)
if choice != ''
call eclim#java#import#Import(choice)
endif
endfunction " }}}
function! eclim#java#import#OrganizeImports(...) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate()
let offset = eclim#util#GetOffset()
let command = s:command_organize
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
if a:0
let command .= ' -t ' . join(a:1, ',')
endif
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE
call eclim#util#EchoError(result)
return
endif
if type(result) == g:DICT_TYPE
call eclim#util#Reload({'pos': [result.line, result.column]})
call eclim#lang#UpdateSrcFile('java', 1)
return
endif
if type(result) != g:LIST_TYPE
return
endif
let chosen = []
for choices in result
let choice = eclim#java#import#ImportPrompt(choices)
if choice == ''
return
endif
call add(chosen, choice)
endfor
if len(chosen)
call eclim#java#import#OrganizeImports(chosen)
endif
endfunction " }}}
function! eclim#java#import#ImportPrompt(choices) " {{{
" prompt the user to choose the class to import.
let response = eclim#util#PromptList("Choose the class to import", a:choices)
if response == -1
return ''
endif
return get(a:choices, response)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,264 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/junit.html
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_junit = '-command java_junit -p "<project>"'
let s:command_tests = '-command java_junit_tests -p "<project>"'
let s:command_find_test =
\ '-command java_junit_find_test -p "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding>'
let s:command_impl = '-command java_junit_impl -p "<project>" -f "<file>"'
let s:command_insert =
\ '-command java_junit_impl -p "<project>" -f "<file>" ' .
\ '-t "<type>" -s "<superType>" <methods>'
" }}}
function! eclim#java#junit#JUnit(test, bang) " {{{
let project = eclim#project#util#GetCurrentProjectName()
if project == '' && exists('b:project')
let project = b:project
endif
if project == ''
call eclim#project#util#IsCurrentFileInProject()
return
endif
Validate
if len(filter(getloclist(0), 'v:val.type == "e"')) > 0
call eclim#util#EchoError('Test case contains validation errors.')
return
endif
let command = s:command_junit
let command = substitute(command, '<project>', project, '')
if a:test != ''
if a:test == '%'
let command .= ' -f "' . eclim#project#util#GetProjectRelativeFilePath() . '"'
elseif a:test != '*'
let command .= ' -t "' . a:test . '"'
endif
else
let command .= ' -f "' . eclim#project#util#GetProjectRelativeFilePath() . '"'
let command .= ' -o ' . eclim#util#GetOffset()
let command .= ' -e ' . eclim#util#GetEncoding()
endif
let curbuf = bufnr('%')
let result = eclim#Execute(command, {'project': project, 'exec': 1, 'raw': 1})
let results = split(substitute(result, "^\n*", '', 'g'), "\n")
let statusLine = matchlist(result,
\ 'Tests run:.*Failures: \([0-9]*\), Errors: \([0-9]*\), [^\n]*sec')
if len(statusLine) >= 3 && statusLine[1] == '0' && statusLine[2] == '0'
let name = eclim#util#EscapeBufferName('[JUnit Output]')
if bufwinnr(name) != -1 && a:bang != '!'
" close existing output window; we've fixed the issue
let curwinnr = winnr()
exec bufwinnr(name) . "winc w"
quit
exec curwinnr . "winc w"
elseif a:bang == '!'
call eclim#util#TempWindow('[JUnit Output]', results)
endif
call eclim#util#EchoSuccess(statusLine[0])
elseif result != '0'
" if result == '0', then there was some error;
" results won't have anything interesting anyway
call eclim#util#TempWindow('[JUnit Output]', results)
endif
let b:project = project
if exists(":JUnit") != 2
command -bang -buffer -nargs=?
\ -complete=customlist,eclim#java#junit#CommandCompleteTest
\ JUnit :call eclim#java#junit#JUnit('<args>', '<bang>')
endif
exec bufwinnr(curbuf) . 'winc w'
endfunction " }}}
function! eclim#java#junit#JUnitFindTest() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
runtime eclim/autoload/eclim/java/search.vim
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate()
let command = s:command_find_test
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE
call eclim#util#EchoError(result)
return
endif
if type(result) != g:DICT_TYPE
return
endif
let name = substitute(result.filename, '\', '/', 'g')
call eclim#util#GoToBufferWindowOrOpen(
\ name, g:EclimJavaSearchSingleResult, result.line, result.column)
endfunction " }}}
function! eclim#java#junit#JUnitResult(test) " {{{
" Argument test can be one of the following:
" Empty string: Use the current file to determine the test result file.
" Class name of a test: Locate the results for class (ex. 'TestMe').
" The results dir relative results file name: TEST-org.foo.TestMe.xml
let path = s:GetResultsDir()
if path == ''
call eclim#util#EchoWarning(
\ "Output directory setting for 'junit' not set. " .
\ "Use :WorkspaceSettings or :ProjectSettings to set it.")
return
endif
if a:test != ''
let file = a:test
if file !~ '^TEST-'
let file = '*' . file
endif
else
let file = substitute(eclim#java#util#GetFullyQualifiedClassname(), '\.', '/', 'g')
endif
if file !~ '^TEST-'
let file = substitute(file, '\/', '.', 'g')
let file = 'TEST-' . file . '.xml'
endif
let found = eclim#util#Globpath(path, file)
" try text version if xml not found.
if found == ""
let file = fnamemodify(file, ':r') . '.txt'
let found = eclim#util#Globpath(path, file)
endif
if found != ""
let filename = expand('%:p')
exec "below split " . escape(found, ' ')
augroup temp_window
autocmd! BufWinLeave <buffer>
call eclim#util#GoToBufferWindowRegister(filename)
augroup END
return
endif
call eclim#util#Echo("Test result file not found for: " . fnamemodify(file, ':r'))
endfunction " }}}
function! eclim#java#junit#JUnitImpl() " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_impl
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
call eclim#java#junit#JUnitImplWindow(command)
endfunction " }}}
function! eclim#java#junit#JUnitImplWindow(command) " {{{
if (eclim#java#impl#Window(a:command, "impl"))
nnoremap <silent> <buffer> <cr> :call <SID>AddTestImpl(0)<cr>
vnoremap <silent> <buffer> <cr> :<C-U>call <SID>AddTestImpl(1)<cr>
endif
endfunction " }}}
function! s:AddTestImpl(visual) " {{{
call eclim#java#impl#Add
\ (s:command_insert, function("eclim#java#junit#JUnitImplWindow"), a:visual)
endfunction " }}}
function! s:GetResultsDir() " {{{
let path = eclim#project#util#GetProjectSetting("org.eclim.java.junit.output_dir")
if type(path) == g:NUMBER_TYPE
return
endif
let root = eclim#project#util#GetCurrentProjectRoot()
let path = substitute(path, '<project>', root, '')
let path = path != '' && path !~ '/$' ? path . '/' : path
if path != '' && has('win32unix')
let path = eclim#cygwin#CygwinPath(path)
endif
return path
endfunction " }}}
function! eclim#java#junit#CommandCompleteTest(argLead, cmdLine, cursorPos) " {{{
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let project = eclim#project#util#GetCurrentProjectName()
if project == '' && exists('b:project')
let project = b:project
endif
if project == ''
return []
endif
let command = s:command_tests
let command = substitute(command, '<project>', project, '')
let results = eclim#Execute(command)
if type(results) != g:LIST_TYPE
return []
endif
call filter(results, 'v:val =~ "' . argLead . '"')
return results
endfunction " }}}
function! eclim#java#junit#CommandCompleteResult(argLead, cmdLine, cursorPos) " {{{
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let path = s:GetResultsDir()
if path == ''
call eclim#util#EchoWarning(
\ "Output directory setting for 'junit' not set. " .
\ "Use :WorkspaceSettings or :ProjectSettings to set it.")
return []
endif
let results = split(eclim#util#Globpath(path, '*'), '\n')
call map(results, 'fnamemodify(v:val, ":r:e")')
call filter(results, 'v:val =~ "^' . argLead . '"')
return results
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,127 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/logging.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
function! eclim#java#logging#LoggingInit(var) " {{{
let char = nr2char(getchar())
" only execute if the user types a '.' for a method call and if the logger
" is not already present.
if char == '.' && s:InitLoggingSettings() &&
\ !search('\(final\|static\)\>.\{-}\<Log\(ger\)\?\s', 'n')
let line = line('.')
let col = col('.')
let position = eclim#java#util#GetClassDeclarationPosition(1)
if position
let logger = s:logger
let logger = substitute(logger, '\${class}', eclim#java#util#GetClassname(), '')
let logger = substitute(logger, '\${var}', a:var, '')
if strlen(logger) > &textwidth && logger !~ '\n'
let logger = substitute(logger,
\ '\(.*\)\s\(.*\)', '\1\n' . eclim#util#GetIndent(2) . '\2', '')
endif
let position = search('{')
let lines = split(logger, '\n')
let offset = len(lines) + 1
call append(position, '')
call append(position, lines)
call cursor(line + offset, col)
for import in s:logger_imports
call eclim#java#import#Import(import)
endfor
endif
endif
return char
endfunction " }}}
function! s:InitLoggingSettings() " {{{
let s:EclimLoggingImpl =
\ eclim#project#util#GetProjectSetting("org.eclim.java.logging.impl")
if type(s:EclimLoggingImpl) == g:NUMBER_TYPE || s:EclimLoggingImpl == '0'
unlet s:EclimLoggingImpl
return
endif
let indent = eclim#util#GetIndent(1)
if s:EclimLoggingImpl == "commons-logging"
let s:logger = indent .
\ "private static final Log ${var} = LogFactory.getLog(${class}.class);"
let s:logger_imports = [
\ "org.apache.commons.logging.Log",
\ "org.apache.commons.logging.LogFactory"]
elseif s:EclimLoggingImpl == "slf4j"
let s:logger = indent .
\ "private static final Logger ${var} = LoggerFactory.getLogger(${class}.class);"
let s:logger_imports = ["org.slf4j.Logger", "org.slf4j.LoggerFactory"]
elseif s:EclimLoggingImpl == "log4j"
let s:logger = indent .
\ "private static final Logger ${var} = Logger.getLogger(${class}.class);"
let s:logger_imports = ["org.apache.log4j.Logger"]
elseif s:EclimLoggingImpl == "jdk"
let s:logger = indent .
\ "private static final Logger ${var} = Logger.getLogger(${class}.class.getName());"
let s:logger_imports = ["java.util.logging.Logger"]
elseif s:EclimLoggingImpl == "custom"
let instance = eclim#client#nailgun#ChooseEclimdInstance()
if type(instance) != g:DICT_TYPE
return
endif
let name = eclim#project#util#GetProjectSetting("org.eclim.java.logging.template")
if type(name) == g:NUMBER_TYPE || name == ''
return
endif
let local = eclim#UserHome() . '/.eclim/resources/jdt/templates/' . name
let remote = substitute(instance.home, 'org.eclim_', 'org.eclim.jdt_', '') .
\ '/resources/templates/' . name
if filereadable(local)
let template = local
elseif filereadable(remote)
let template = remote
else
call eclim#util#EchoError(
\ "Custom logger template not found local or remote location:\n" .
\ " local: " . local . "\n" .
\ " remote: " . remote)
return
endif
let lines = readfile(template)
let s:logger_imports = lines[:]
call filter(s:logger_imports, "v:val =~ '^\\s*import\\>'")
call map(s:logger_imports,
\ "substitute(v:val, '^\\s*import\\>\\s*\\(.*\\);\\s*', '\\1', '')")
call filter(lines, "v:val !~ '\\(^\\s*$\\|^\\s*import\\>\\)'")
let s:logger = indent . join(lines, "\n" . indent)
elseif s:EclimLoggingImpl == ''
" no setting returned, probably not in a project, or user is attempting to
" disable this functionality for the current project.
return
else
echoe "Invalid logging implementation '" . s:EclimLoggingImpl . "' configured."
return
endif
return 1
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,118 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:update_command = '-command project_update -p "<project>" -b "<build>"'
" }}}
function! eclim#java#maven#SetClasspathVariable(cmd, variable, args) " {{{
let instance = eclim#client#nailgun#ChooseEclimdInstance()
if type(instance) != g:DICT_TYPE
return
endif
let workspace = instance.workspace
" maven 1.x
if a:cmd == 'Maven'
let prefs = workspace .
\ '/.metadata/.plugins/org.eclipse.jdt.core/pref_store.ini'
let command = a:cmd .
\ ' "-Dmaven.eclipse.workspace=' . workspace . '"' .
\ ' eclipse:add-maven-repo'
" maven 2.x
else
let prefs = workspace .
\ '/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs'
let command = a:cmd . ' ' . a:args .
\ ' "-Declipse.workspace=' . workspace . '"' .
\ ' eclipse:configure-workspace'
endif
call eclim#util#Exec(command)
if !v:shell_error
" the maven command edits the eclipse preference file directly, so in
" order to get the value in memory without restarting eclim, we read the
" value out and let the server set it again.
let winrestore = winrestcmd()
if filereadable(prefs)
silent exec 'sview ' . prefs
let line = search('org.eclipse.jdt.core.classpathVariable.' . a:variable, 'cnw')
let value = line ? substitute(getline(line), '.\{-}=\(.*\)', '\1', '') : ''
if line
call eclim#java#classpath#VariableCreate(a:variable, value)
endif
if substitute(bufname('%'), '\', '/', 'g') =~ prefs
close
exec winrestore
endif
if line
call eclim#util#Echo(a:variable . " classpath variable set to:\n" . value)
else
call eclim#util#EchoWarning(
\ "Unable to locate " . a:variable . " classpath variable.\n" .
\ "If it was successful set by maven, you may need to\n" .
\ "restart eclipse for the change to take affect.")
endif
else
call eclim#util#EchoWarning(
\ "Unable to read:\n" . prefs . "\n" .
\ "If the " . a:variable . " classpath variable was successfully set by maven\n" .
\ "you may need to restart eclipse for the change to take affect.")
endif
endif
endfunction " }}}
function! eclim#java#maven#UpdateClasspath() " {{{
" Updates the classpath on the server w/ the changes made to the current pom file.
if !eclim#project#util#IsCurrentFileInProject()
return
endif
" validate the xml first
if eclim#xml#validate#Validate(expand('%:p'), 0)
return
endif
let name = eclim#project#util#GetCurrentProjectName()
let command = s:update_command
let command = substitute(command, '<project>', name, '')
let command = substitute(command, '<build>', escape(expand('%:p'), '\'), '')
let result = eclim#Execute(command)
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
call eclim#util#SetLocationList(errors, 'r')
call eclim#util#EchoError(
\ "Operation contained errors. See location list for details (:lopen).")
else
call eclim#util#ClearLocationList()
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,96 @@
" Author: Daniel Leong
"
" License: {{{
"
" Copyright (C) 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:command_new = '-command java_new -p "<project>" -t "<type>" -n "<name>"'
let s:java_types = ['class', 'abstract', 'interface', 'enum', '@interface']
" }}}
function! eclim#java#new#Create(type, name) " {{{
" Create a new Java Type
if !eclim#project#util#IsCurrentFileInProject(0)
return
endif
let project = eclim#project#util#GetCurrentProjectName()
" strip off .java suffix if supplied.
let newName = a:name
if newName =~? '\.java$'
let newName = substitute(newName, '\.java$', '', '')
endif
" prepend current package if necessary
let myPackage = eclim#java#util#GetPackage()
if newName !~ '\.' && len(myPackage) > 0
let newName = myPackage . '.' . newName
endif
let command = s:command_new
let command = substitute(command, "<project>", project, '')
let command = substitute(command, "<type>", a:type, '')
let command = substitute(command, "<name>", newName, '')
let result = eclim#Execute(command)
if type(result) == g:LIST_TYPE
let answer = eclim#util#PromptList(
\ "Please choose the src directory to create this new package in",
\ result)
if answer == -1
return
endif
let path = eclim#Execute(command . ' -r "' . result[answer] . '"')
if type(path) != g:STRING_TYPE
return
endif
elseif type(result) == g:STRING_TYPE
let path = result
else
return
endif
call eclim#util#GoToBufferWindowOrOpen(path, g:EclimJavaNewOpenAction)
endfunction " }}}
function! eclim#java#new#CommandComplete(argLead, cmdLine, cursorPos) " {{{
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
let args = eclim#util#ParseCmdLine(cmdLine)
if len(args) < 2 || (len(args) == 2 && cmdLine !~ '\s$')
" Suggest java types
let arg = substitute(a:argLead, '@', '\\@', '')
return filter(copy(s:java_types), 'v:val =~ "^' . arg . '"')
endif
if len(a:argLead) <= 3 || a:argLead =~ '\.'
" Propose packages
return eclim#java#util#CommandCompletePackage(
\ a:argLead, a:cmdLine, a:cursorPos)
endif
return []
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,120 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2012 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:command_rename = '-command java_refactor_rename ' .
\ '-p "<project>" -f "<file>" -o <offset> -e <encoding> -l <length> -n <name>'
let s:command_move = '-command java_refactor_move ' .
\ '-p "<project>" -f "<file>" -n <package>'
" }}}
function! eclim#java#refactor#Rename(name) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let element = expand('<cword>')
if !eclim#java#util#IsValidIdentifier(element)
call eclim#util#EchoError
\ ("Element under the cursor is not a valid java identifier.")
return
endif
let line = getline('.')
let package_pattern = '^\s*package\s\+\(.*\%' . col('.') . 'c\w*\).*;'
if line =~ package_pattern
let element = substitute(line, package_pattern, '\1', '')
endif
let prompt = printf('Rename "%s" to "%s"', element, a:name)
let result = exists('g:EclimRefactorPromptDefault') ?
\ g:EclimRefactorPromptDefault : eclim#lang#RefactorPrompt(prompt)
if result <= 0
return
endif
" update the file before vim makes any changes.
call eclim#lang#SilentUpdate()
wall
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
let command = s:command_rename
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<length>', length, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let command = substitute(command, '<name>', a:name, '')
" user chose preview at the prompt
if result == 2
let command .= ' -v'
call eclim#lang#RefactorPreview(command)
return
endif
call eclim#lang#Refactor(command)
endfunction " }}}
function! eclim#java#refactor#Move(package) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let line = getline('.')
let package_pattern = '^\s*package\s\+\(.*\%' . col('.') . 'c\w*\).*;'
if line =~ package_pattern
let element = substitute(line, package_pattern, '\1', '')
endif
let name = eclim#java#util#GetClassname()
let package = eclim#java#util#GetPackage()
let prompt = printf('Move %s from "%s" to "%s"', name, package, a:package)
let result = exists('g:EclimRefactorPromptDefault') ?
\ g:EclimRefactorPromptDefault : eclim#lang#RefactorPrompt(prompt)
if result <= 0
return
endif
" update the file before vim makes any changes.
call eclim#lang#SilentUpdate()
wall
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_move
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<package>', a:package, '')
" user chose preview at the prompt
if result == 2
let command .= ' -v'
call eclim#lang#RefactorPreview(command)
return
endif
call eclim#lang#Refactor(command)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,378 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2015 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:search_src = "java_search"
let s:search_doc = "java_docsearch"
let s:search_element =
\ '-command <search> -n "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding> -l <length> <args>'
let s:search_pattern = '-command <search>'
let s:options_map = {
\ '-p': [],
\ '-i': [],
\ '-a': ['split', 'vsplit', 'edit', 'tabnew', 'lopen'],
\ '-s': ['all', 'project'],
\ '-x': ['all', 'declarations', 'implementors', 'references'],
\ '-t': [
\ 'annotation',
\ 'class',
\ 'classOrEnum',
\ 'classOrInterface',
\ 'constructor',
\ 'enum',
\ 'field',
\ 'interface',
\ 'method',
\ 'package',
\ 'type',
\ ],
\ }
let s:search_alt_all = '\<<element>\>'
let s:search_alt_references = s:search_alt_all
let s:search_alt_implementors =
\ '\(implements\|extends\)\_[0-9A-Za-z,[:space:]]*\<<element>\>\_[0-9A-Za-z,[:space:]]*{'
" }}}
function! s:Search(command, ...) " {{{
" Executes a search.
" Usage closely resebles eclim command line client usage.
" When doing a non-pattern search the element under the cursor is searched for.
" Search for declarations of element under the cursor
" call s:Search("-x", "declarations")
" Search for references of HashMap
" call s:Search("-p", "HashM*", "-t", "class", "-x", "references")
" Or all the arguments can be passed in at once:
" call s:Search("-p 'HashM*' -t class -x references")
let argline = ""
let index = 1
while index <= a:0
if index != 1
let argline = argline . " "
endif
let argline = argline . a:{index}
let index = index + 1
endwhile
" check if pattern supplied without -p.
if argline !~ '^\s*-[a-z]' && argline !~ '^\s*$'
let argline = '-p ' . argline
endif
let in_project = eclim#project#util#IsCurrentFileInProject(0)
" element search
if argline !~ '-p\>'
if &ft != 'java'
call eclim#util#EchoWarning
\ ("Element searches only supported in java source files.")
return 0
endif
if !eclim#java#util#IsValidIdentifier(expand('<cword>'))
call eclim#util#EchoError
\ ("Element under the cursor is not a valid java identifier.")
return 0
endif
if !in_project
" build a pattern search and execute it
let results = s:SearchAlternate('-p ' . s:BuildPattern() . ' ' . argline, 1)
" kind of gross. if there was no alternate result and eclimd is not
" running, then make sure a message is echoed to the user so they know
" that eclimd not running *may* be the cause of no results.
if len(results) == 0 && !eclim#EclimAvailable()
return 0
endif
return results
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
let search_cmd = s:search_element
let search_cmd = substitute(search_cmd, '<project>', project, '')
let search_cmd = substitute(search_cmd, '<search>', a:command, '')
let search_cmd = substitute(search_cmd, '<file>', file, '')
let search_cmd = substitute(search_cmd, '<offset>', offset, '')
let search_cmd = substitute(search_cmd, '<encoding>', eclim#util#GetEncoding(), '')
let search_cmd = substitute(search_cmd, '<length>', length, '')
let search_cmd = substitute(search_cmd, '<args>', argline, '')
let result = eclim#Execute(search_cmd)
" pattern search
else
let project = eclim#project#util#GetCurrentProjectName()
" pattern search
let search_cmd = s:search_pattern
let search_cmd = substitute(search_cmd, '<search>', a:command, '')
if project != ''
let search_cmd .= ' -n "' . project . '"'
endif
let file = eclim#project#util#GetProjectRelativeFilePath()
if file != ''
let search_cmd .= ' -f "' . file . '"'
endif
let search_cmd .= ' ' . argline
" quote the search pattern
let search_cmd =
\ substitute(search_cmd, '\(.*-p\s\+\)\(.\{-}\)\(\s\|$\)\(.*\)', '\1"\2"\3\4', '')
let result = eclim#Execute(search_cmd)
if !in_project && filereadable(expand('%'))
return result + s:SearchAlternate(argline, 0)
endif
endif
return result
endfunction " }}}
function! s:SearchAlternate(argline, element) " {{{
" Alternate search for non-project src files using vimgrep and &path.
call eclim#util#EchoInfo("Executing alternate search...")
if a:argline =~ '-t'
call eclim#util#EchoError
\ ("Alternate search doesn't support the type (-t) option yet.")
return []
endif
let search_pattern = ""
if a:argline =~ '-x all'
let search_pattern = s:search_alt_all
elseif a:argline =~ '-x implementors'
let search_pattern = s:search_alt_implementors
elseif a:argline =~ '-x references'
let search_pattern = s:search_alt_references
endif
let pattern = substitute(a:argline, '.*-p\s\+\(.\{-}\)\(\s.*\|$\)', '\1', '')
let file_pattern = substitute(pattern, '\.', '/', 'g') . ".java"
" search relative to the current dir first.
let package_path = substitute(eclim#java#util#GetPackage(), '\.', '/', 'g')
let path = substitute(expand('%:p:h'), '\', '/', 'g')
let path = substitute(path, package_path, '', '')
let files = split(eclim#util#Globpath(path, "**/" . file_pattern), '\n')
" if none found, then search the path.
if len(files) == 0
let files = eclim#util#FindFileInPath(file_pattern, 1)
let path = ""
endif
let results = []
if len(files) > 0 && search_pattern != ''
" narrow down to, hopefully, a distribution path for a narrower search.
let response = eclim#util#PromptList(
\ "Multiple type matches. Please choose the relevant file.",
\ files, g:EclimHighlightInfo)
if response == -1
return
endif
let file = substitute(get(files, response), '\', '/', 'g')
if path == ""
let path = eclim#util#GetPathEntry(file)
endif
let path = escape(path, '/\')
let path = substitute(file, '\(' . path . '[/\\]\?.\{-}[/\\]\).*', '\1', '')
let pattern = substitute(pattern, '\*', '.\\\\{-}', 'g')
let search_pattern = substitute(search_pattern, '<element>', pattern, '')
let command = "vimgrep /" . search_pattern . "/gj " . path . "**/*.java"
silent! exec command
let loclist = getloclist(0)
for entry in loclist
let bufname = bufname(entry.bufnr)
let result = {
\ 'filename': bufname,
\ 'message': entry.text,
\ 'line': entry.lnum,
\ 'column': entry.col,
\ }
" when searching for implementors, prevent dupes from the somewhat
" greedy pattern search (may need some more updating post conversion to
" dict results).
if a:argline !~ '-x implementors' || !eclim#util#ListContains(results, result)
call add(results, result)
endif
endfor
elseif len(files) > 0
for file in files
let fully_qualified = eclim#java#util#GetPackage(file) . '.' .
\ eclim#java#util#GetClassname(file)
" if an element search, filter out results that are not imported.
if !a:element || eclim#java#util#IsImported(fully_qualified)
call add(results, {
\ 'filename': file,
\ 'message': fully_qualified,
\ 'line': 1,
\ 'column': 1,
\ })
endif
endfor
endif
call eclim#util#Echo(' ')
return results
endfunction " }}}
function! s:BuildPattern() " {{{
" Builds a pattern based on the cursors current position in the file.
let class = expand('<cword>')
" see if the classname element selected is fully qualified.
let line = getline('.')
let package =
\ substitute(line, '.*\s\([0-9A-Za-z._]*\)\.' . class . '\>.*', '\1', '')
" not fully qualified, so attempt to determine package from import.
if package == line
let package = eclim#java#util#GetPackageFromImport(class)
" maybe the element is the current class?
if package == ""
if eclim#java#util#GetClassname() == class
let package = eclim#java#util#GetPackage()
endif
endif
endif
if package != ""
return package . "." . class
endif
return class
endfunction " }}}
function! eclim#java#search#SearchAndDisplay(type, args) " {{{
" Execute a search and displays the results via quickfix.
" if running from a non java source file, no SilentUpdate needed.
if &ft == 'java'
call eclim#lang#SilentUpdate()
endif
let argline = a:args
" check if just a pattern was supplied.
if argline =~ '^\s*\w'
let argline = '-p ' . argline
endif
" check for user supplied open action
let [action_args, argline] = eclim#util#ExtractCmdArgs(argline, '-a:')
let action = len(action_args) == 2 ? action_args[1] : g:EclimJavaSearchSingleResult
let results = s:Search(a:type, argline)
if type(results) != g:LIST_TYPE
return
endif
if !empty(results)
if a:type == 'java_search'
call eclim#lang#SearchResults(results, action)
return 1
elseif a:type == 'java_docsearch'
let window_name = "javadoc_search_results"
let filename = expand('%:p')
call eclim#util#TempWindowClear(window_name)
if len(results) == 1
let entry = results[0]
call s:ViewDoc(entry)
else
call eclim#util#TempWindow(
\ window_name, results, {'height': g:EclimLocationListHeight})
nnoremap <silent> <buffer> <cr> :call <SID>ViewDoc()<cr>
augroup temp_window
autocmd! BufWinLeave <buffer>
call eclim#util#GoToBufferWindowRegister(filename)
augroup END
endif
endif
return 1
else
if argline =~ '-p '
let searchedFor = substitute(argline, '.*-p \(.\{-}\)\( .*\|$\)', '\1', '')
call eclim#util#EchoInfo("Pattern '" . searchedFor . "' not found.")
elseif &ft == 'java'
if !eclim#java#util#IsValidIdentifier(expand('<cword>'))
return
endif
let searchedFor = expand('<cword>')
call eclim#util#EchoInfo("No results for '" . searchedFor . "'.")
endif
endif
endfunction " }}}
function! s:ViewDoc(...) " {{{
" View the supplied file in a browser, or if none proved, the file under the
" cursor.
let url = a:0 > 0 ? a:1 : substitute(getline('.'), '\(.\{-}\)|.*', '\1', '')
call eclim#web#OpenUrl(url)
endfunction " }}}
function! eclim#java#search#CommandCompleteSearch(argLead, cmdLine, cursorPos) " {{{
let options_map = s:options_map
" omit the -a args on a javadoc search since those results are opened in a
" browser
if a:cmdLine =~ '^JavaDocS'
let options_map = copy(options_map)
unlet options_map['-a']
endif
return eclim#util#CommandCompleteOptions(
\ a:argLead, a:cmdLine, a:cursorPos, options_map)
endfunction " }}}
function! eclim#java#search#CommandCompleteSearchContext(argLead, cmdLine, cursorPos) " {{{
let options_map = {'-a': s:options_map['-a']}
return eclim#util#CommandCompleteOptions(
\ a:argLead, a:cmdLine, a:cursorPos, options_map)
endfunction " }}}
function! eclim#java#search#CommandCompleteSearchScope(argLead, cmdLine, cursorPos) " {{{
let options_map = {'-s': ['all', 'project']}
return eclim#util#CommandCompleteOptions(
\ a:argLead, a:cmdLine, a:cursorPos, options_map)
endfunction " }}}
function! eclim#java#search#FindClassDeclaration() " {{{
" Used by non java source files to find the declaration of a classname under
" the cursor.
let line = getline('.')
let class = substitute(line,
\ '.\{-}\([0-9a-zA-Z_.]*\%' . col('.') . 'c[0-9a-zA-Z_.]*\).*', '\1', '')
if class != line && class != '' && class =~ '^[a-zA-Z]'
call eclim#java#search#SearchAndDisplay(
\ 'java_search', '-t classOrInterface -p ' . class)
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,88 @@
" Author: Eric Van Dewoestine
"
" License: " {{{
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:format_command =
\ '-command java_format -p "<project>" -f "<file>" ' .
\ '-h <hoffset> -t <toffset> -e <encoding>'
let s:checkstyle_command = '-command java_checkstyle -p "<project>" -f "<file>"'
" }}}
function! eclim#java#src#Format(first, last) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:format_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let begin = eclim#util#GetOffset(a:first, 1)
let end = eclim#util#GetOffset(a:last, 1) + len(getline(a:last)) - 1
let command = substitute(command, '<hoffset>', begin, '')
let command = substitute(command, '<toffset>', end, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let result = eclim#Execute(command)
if result != "0"
call eclim#util#Reload({'retab': 1})
write
endif
endfunction " }}}
function! eclim#java#src#Checkstyle() " {{{
let project = eclim#project#util#GetCurrentProjectName()
if project != ""
let config =
\ eclim#project#util#GetProjectSetting('org.eclim.java.checkstyle.config')
if type(config) == g:NUMBER_TYPE
return
endif
if config == ''
call eclim#util#EchoWarning(
\ "Before invoking checkstyle, you must first configure the " .
\ "location of your\ncheckstyle config via the setting: " .
\ "'org.eclim.java.checkstyle.config'.")
return
endif
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:checkstyle_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let result = eclim#Execute(command)
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
call eclim#util#SetLocationList(errors)
else
call eclim#util#ClearLocationList('checkstyle')
endif
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,310 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/java/tools.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_src_find = '-command java_src_find -p "<project>" -c "<classname>"'
let s:entry_match{'junit'} = 'Tests run:'
let s:entry_text_replace{'junit'} = '.*[junit] '
let s:entry_text_with{'junit'} = ''
let s:entry_match{'testng'} = 'eclim testng:'
let s:entry_text_replace{'testng'} = '.*eclim testng: .\{-}:'
let s:entry_text_with{'testng'} = ''
let s:open_console = 'Open jconsole'
let s:view_info = 'View Info'
let s:view_stacks = 'View Stacks'
let s:view_map = 'View Memory Map'
let s:args_main = 'Arguments To Main Method'
let s:args_vm = 'Arguments To JVM'
let s:supported_command = '\(' .
\ s:open_console . '\|' .
\ s:view_info . '\|' .
\ s:view_stacks . '\|' .
\ s:view_map .
\ '\)'
hi link JpsArguments Normal
hi link JpsViewAdditional Normal
hi JpsViewAdditional gui=underline,bold term=underline,bold cterm=underline,bold
" }}}
function! eclim#java#tools#MakeWithJavaBuildTool(compiler, bang, args) " {{{
augroup eclim_make_java_test
autocmd!
autocmd QuickFixCmdPost make
\ call eclim#java#tools#ResolveQuickfixResults(['junit', 'testng'])
augroup END
try
call eclim#util#MakeWithCompiler(a:compiler, a:bang, a:args)
finally
silent! autocmd! eclim_make_java_test
endtry
endfunction " }}}
function! eclim#java#tools#ResolveQuickfixResults(frameworks) " {{{
" Invoked after a :make to resolve any junit results in the quickfix entries.
let frameworks = type(a:frameworks) == g:LIST_TYPE ? a:frameworks : [a:frameworks]
let entries = getqflist()
let newentries = []
for entry in entries
let filename = bufname(entry.bufnr)
let text = entry.text
for framework in frameworks
if entry.text =~ s:entry_match{framework}
let filename = fnamemodify(filename, ':t')
let text = substitute(text,
\ s:entry_text_replace{framework}, s:entry_text_with{framework}, '')
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_src_find
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<classname>', filename, '')
let filename = eclim#Execute(command)
if filename == ''
" file not found.
continue
endif
endif
endfor
if !filereadable(filename)
continue
endif
let newentry = {
\ 'filename': filename,
\ 'lnum': entry.lnum,
\ 'col': entry.col,
\ 'type': entry.type,
\ 'text': text
\ }
call add(newentries, newentry)
endfor
call setqflist(newentries, 'r')
" vim is finicky about changing the quickfix list during a QuickFixCmdPost
" autocmd, so force a delayed reload of the quickfix results
call eclim#util#DelayedCommand('call setqflist(getqflist(), "r")')
endfunction " }}}
function! eclim#java#tools#Jps() " {{{
call eclim#util#Echo('Executing...')
let content = []
let processes = eclim#java#tools#GetJavaProcesses()
if len(processes) == 1 && string(processes[0]) == '0'
return
endif
for process in processes
if len(content) > 0
call add(content, "")
endif
call add(content, process.id . ' - ' . process.name)
if executable('jconsole')
call add(content, "\t" . s:open_console)
endif
if executable('jinfo')
call add(content, "\t" . s:view_info)
endif
if executable('jstack')
call add(content, "\t" . s:view_stacks)
endif
if executable('jmap')
call add(content, "\t" . s:view_map)
endif
call add(content, "")
call add(content, "\t" . s:args_main . " {")
let args_main = has_key(process, 'args_main') ?
\ map(split(process.args_main), '"\t\t" . v:val') : []
let content = content + args_main
call add(content, "\t}")
if has_key(process, 'args_vm')
call add(content, "")
call add(content, "\t" . s:args_vm . " {")
let args_vm = map(split(process.args_vm), '"\t\t" . v:val')
let content = content + args_vm
call add(content, "\t}")
endif
endfor
if len(content) == 0
call add(content, 'No Running Java Processes Found')
endif
call eclim#util#TempWindow('Java_Processes', content)
setlocal ft=jps_list
setlocal foldmethod=syntax
setlocal foldlevel=0
setlocal foldtext=getline(v:foldstart)
exec 'syntax match JpsViewAdditional /' . s:supported_command . '$/'
exec 'syntax region JpsArguments start=/' . s:args_main . ' {$/ end=/^\s*}$/ fold'
exec 'syntax region JpsArguments start=/' . s:args_vm . ' {$/ end=/^\s*}$/ fold'
nnoremap <silent> <buffer> <cr> :call <SID>ViewAdditionalInfo()<cr>
call eclim#util#Echo(' ')
endfunction " }}}
function! eclim#java#tools#GetJavaProcesses() " {{{
let java_processes = []
let result = eclim#util#System('jps -vV')
if v:shell_error
call eclim#util#EchoError('Unable to execute jps - ' . result)
return [0]
endif
let vm_args = split(result, '\n')
for process in split(eclim#util#System('jps -lm'), '\n')
if process =~ 'sun.tools.jps.Jps' "|| process =~ '^[0-9]\+\s*$'
continue
endif
let java_process_info = {}
let java_process_info['id'] = substitute(process, '\(.\{-}\) .*', '\1', '')
let java_process_info['name'] =
\ substitute(process, '.\{-} \(.\{-}\) .*', '\1', '')
if process =~ '.\{-} .\{-} \(.*\)'
let java_process_info['args_main'] =
\ substitute(process, '.\{-} .\{-} \(.*\)', '\1', '')
endif
let index = 0
for args in vm_args
if args =~ '^' . java_process_info.id . '\>'
if args =~ '.\{-} .\{-} \(.*\)'
let java_process_info['args_vm'] =
\ substitute(args, '.\{-} .\{-} \(.*\)', '\1', '')
endif
call remove(vm_args, index)
endif
let index += 1
endfor
call add(java_processes, java_process_info)
endfor
return java_processes
endfunction " }}}
function! s:ViewAdditionalInfo() " {{{
let line = getline('.')
if line =~ '^\s*' . s:supported_command . '$'
" get the process id.
let lnum = search('^[0-9]\+ - ', 'bn')
let id = substitute(getline(lnum), '^\([0-9]\+\) - .*', '\1', '')
if line =~ '^\s*' . s:open_console . '$'
call s:OpenConsole(id)
elseif line =~ '^\s*' . s:view_info . '$'
call s:ViewInfo(id)
elseif line =~ '^\s*' . s:view_stacks . '$'
call s:ViewStacks(id)
elseif line =~ '^\s*' . s:view_map . '$'
call s:ViewMap(id)
endif
endif
endfunction " }}}
function! s:OpenConsole(id) " {{{
call eclim#util#Echo('Executing...')
if has('win32') || has('win64')
call eclim#util#Exec('silent! !start jconsole ' . a:id)
else
call eclim#util#Exec('silent! !jconsole ' . a:id . ' &')
endif
exec "normal! \<c-l>"
call eclim#util#Echo(' ')
endfunction " }}}
function! s:ViewInfo(id) " {{{
if executable('jinfo')
call eclim#util#Echo('Executing...')
let content = split(eclim#util#System('jinfo ' . a:id), '\n')
if v:shell_error
call eclim#util#EchoError('Unable to execute jinfo.')
return
endif
call eclim#util#TempWindow('Java_Process_Info_' . a:id, content)
setlocal ft=jproperties
call eclim#util#Echo(' ')
endif
endfunction " }}}
function! s:ViewStacks(id) " {{{
if executable('jstack')
call eclim#util#Echo('Executing...')
let content = split(eclim#util#System('jstack ' . a:id), '\n')
if v:shell_error
call eclim#util#EchoError('Unable to execute jstack.')
return
endif
call map(content, 'substitute(v:val, "^ \\(\\S\\)", " \\1", "")')
call map(content, 'substitute(v:val, "^\t", " ", "")')
call eclim#util#TempWindow('Java_Process_Stacks_' . a:id, content)
setlocal ft=java
call eclim#util#Echo(' ')
endif
endfunction " }}}
function! s:ViewMap(id) " {{{
if executable('jmap')
call eclim#util#Echo('Executing...')
let content = split(eclim#util#System('jmap ' . a:id), '\n')
if v:shell_error
call eclim#util#EchoError('Unable to execute jmap.')
return
endif
call eclim#util#TempWindow('Java_Process_Map_' . a:id, content)
call eclim#util#Echo(' ')
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,355 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Utility functions for java eclim ftplugins.
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:keywords = '\(abstract\|assert\|boolean\|case\|catch\|char\|class\|do\|double\|enum\|extends\|final\|finally\|float\|for\|if\|implements\|import\|int\|interface\|long\|new\|null\|package\|private\|protected\|public\|return\|short\|static\|switch\|throw\|throws\|try\|void\|while\)'
let s:class_declaration = '^\s*\(public\|private\|protected\)\?\(\s\+abstract\)\?\s\+\(class\|interface\|enum\)\s\+[A-Z]'
let s:command_src_exists = '-command java_src_exists -f "<file>"'
let s:command_list_installs = '-command java_list_installs'
let s:command_classpath = '-command java_classpath -p "<project>"'
let s:command_read_class = '-command java_class_prototype -c <class>'
let s:command_complete_package = '-command java_complete_package -p "<project>"'
let s:import_pattern = '^\s*import\_s\+<import>\_s*;'
" }}}
function! eclim#java#util#FileExists(name) " {{{
let command = substitute(s:command_src_exists, '<file>', a:name, '')
let result = eclim#Execute(command)
return result =~ '^true$'
endfunction " }}}
function! eclim#java#util#GetClassname(...) " {{{
if a:0 > 0
return fnamemodify(a:1, ":t:r")
endif
return expand("%:t:r")
endfunction " }}}
function! eclim#java#util#GetClassDeclarationPosition(movecursor) " {{{
let pos = getpos('.')
call cursor(1,1)
let position = search(s:class_declaration)
if !a:movecursor || !position
call setpos('.', pos)
endif
return position
endfunction " }}}
function! eclim#java#util#GetFullyQualifiedClassname(...) " {{{
let package = a:0 > 0 ?
\ eclim#java#util#GetPackage(a:1) :
\ eclim#java#util#GetPackage()
let classname = a:0 > 0 ?
\ eclim#java#util#GetClassname(a:1) :
\ eclim#java#util#GetClassname()
return len(package) ? (package . '.' . classname) : classname
endfunction " }}}
function! eclim#java#util#GetPackage(...) " {{{
if a:0 > 0
let winreset = winrestcmd()
silent exec "sview " . a:1
endif
let pos = getpos('.')
call cursor(1,1)
let package = ""
let packageLine = search('^\s*\<package\>', 'w')
if packageLine > 0
let package =
\ substitute(getline('.'), '.*\<package\>\s\+\(.\{-\}\)[ ;].*', '\1', '')
endif
if a:0 > 0
close
silent exec winreset
" not necessary and may screw up display (see autoload/project.vim)
"redraw
else
call setpos('.', pos)
endif
return package
endfunction " }}}
function! eclim#java#util#GetPackageFromImport(class) " {{{
let pattern = '^\s*import\s\+\([0-9A-Za-z._]*\)\.' . a:class . '\s*;'
let found = search(pattern, 'wn')
if found
return substitute(getline(found), pattern, '\1', '')
endif
return ""
endfunction " }}}
function! eclim#java#util#GetSelectedFields(first, last) range " {{{
" normalize each field statement into a single line.
let selection = ''
let index = a:first
let blockcomment = 0
while index <= a:last
let line = getline(index)
" ignore comment lines
if line =~ '^\s*/\*'
let blockcomment = 1
endif
if blockcomment && line =~ '\*/\s*$'
let blockcomment = 0
endif
if line !~ '^\s*//' && !blockcomment
" remove quoted values.
let line = substitute(line, '".\{-}"', '', 'g')
" strip off trailing comments
let line = substitute(line, '//.*', '', '')
let line = substitute(line, '/\*.*\*/', '', '')
let selection = selection . line
endif
let index += 1
endwhile
" compact comma separated multi field declarations
let selection = substitute(selection, ',\s*', ',', 'g')
" break fields back up into their own line.
let selection = substitute(selection, ';', ';\n', 'g')
" remove the assignment portion of the field.
let selection = substitute(selection, '\(.\{-}\)\s*=.\{-};', '\1;', 'g')
" extract field names
let properties = []
let lines = split(selection, '\n')
for line in lines
if line !~ '^\s*\/\/'
let fields = substitute(line, '.*\s\(.*\);', '\1', '')
if fields =~ '^[a-zA-Z0-9_,]'
for field in split(fields, ',')
call add(properties, field)
endfor
endif
endif
endfor
return properties
endfunction " }}}
function! eclim#java#util#IsKeyword(word) " {{{
return (a:word =~ '^' . s:keywords . '$\C')
endfunction " }}}
function! eclim#java#util#IsImported(classname) " {{{
" search for fully qualified import
let import_search = s:import_pattern
let import_search = substitute(import_search, '<import>', a:classname, '')
let found = search(import_search, 'wn')
if found
return 1
endif
" search for package.* import
let package = substitute(a:classname, '\(.*\)\..*', '\1', '')
let import_search = s:import_pattern
let import_search = substitute(import_search, '<import>', package . '\\.\\*', '')
let found = search(import_search, 'wn')
if found
return 1
endif
" check if current file and supplied classname are in the same package
if eclim#java#util#GetPackage() == package
return 1
endif
" not imported
return 0
endfunction " }}}
function! eclim#java#util#IsValidIdentifier(word) " {{{
if a:word == '' || a:word =~ '\W' || a:word =~ '^\d\+$' ||
\ eclim#java#util#IsKeyword(a:word)
return 0
endif
return 1
endfunction " }}}
function! eclim#java#util#Java(classname, args) " {{{
let project = eclim#project#util#GetCurrentProjectName()
if project == '' && exists('b:project')
let project = b:project
endif
if project == ''
call eclim#project#util#IsCurrentFileInProject()
return
endif
let args = eclim#util#ParseArgs(a:args)
let classname = a:classname
if classname == '' && len(args)
let arg1 = args[0]
if arg1 == '%'
let args = args[1:]
let classname = exists('b:filename') ?
\ eclim#java#util#GetFullyQualifiedClassname(b:filename) :
\ eclim#java#util#GetFullyQualifiedClassname()
endif
endif
let command = '-command java -p "' . project . '"'
if classname != ''
let command .= ' -c ' . classname
endif
if len(args)
let command .= ' -a'
for arg in args
let arg = substitute(arg, '^-', '\\-', '')
let command .= ' "' . escape(arg, '"') . '"'
endfor
endif
let result = eclim#Execute(command, {'project': project, 'exec': 1, 'raw': 1})
let results = split(result, "\n")
call eclim#util#TempWindow('[Java Output]', results)
let b:project = project
if exists(":Java") != 2
command -buffer -nargs=* Java :call eclim#java#util#Java('', <q-args>)
endif
endfunction " }}}
function! eclim#java#util#Classpath(...) " {{{
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_classpath
let command = substitute(command, '<project>', project, '')
for arg in a:000
if arg == '\n'
let arg = "\n"
endif
let command .= " \"" . arg . "\""
endfor
let result = eclim#Execute(command)
if result == '0'
return
endif
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#java#util#ListInstalls() " {{{
let installs = eclim#Execute(s:command_list_installs)
if type(installs) != g:LIST_TYPE
return
endif
if len(installs) == 0
call eclim#util#Echo("No jdk/jre installs found.")
endif
let pad = 0
for install in installs
let name = install.name . ' ' . install.version
if install.default
let name .= ' (default)'
endif
let pad = len(name) > pad ? len(name) : pad
endfor
let output = []
let type = ''
for install in installs
if install.type != type
let type = install.type
call add(output, 'Type: ' . install.type)
endif
let name = install.name . ' ' . install.version
if install.default
let name .= ' (default)'
endif
call add(output, ' ' . eclim#util#Pad(name, pad) . ' - ' . install.dir)
endfor
call eclim#util#Echo(join(output, "\n"))
endfunction " }}}
function! eclim#java#util#ReadClassPrototype() " {{{
let file = substitute(expand('%:p'), '\', '/', 'g')
let command = s:command_read_class
let command = substitute(command, '<class>', expand('%:t:r'), '')
let command .= ' -f "' . file . '"'
let file = eclim#Execute(command)
if string(file) != '0'
let bufnum = bufnr('%')
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
silent exec "keepjumps edit! " . escape(file, ' ')
exec 'bdelete ' . bufnum
silent exec "doautocmd BufReadPre " . file
silent exec "doautocmd BufReadPost " . file
call eclim#util#DelayedCommand('set ft=java')
setlocal readonly
setlocal nomodifiable
setlocal noswapfile
endif
endfunction " }}}
function! eclim#java#util#CommandCompleteProject(argLead, cmdLine, cursorPos) " {{{
return eclim#project#util#CommandCompleteProjectByNature(
\ a:argLead, a:cmdLine, a:cursorPos, 'java')
endfunction " }}}
function! eclim#java#util#CommandCompletePackage(argLead, cmdLine, cursorPos) " {{{
let cmdTail = strpart(a:cmdLine, a:cursorPos)
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
let project = eclim#project#util#GetCurrentProjectName()
if project == ''
return []
endif
let command = s:command_complete_package
let command = substitute(command, '<project>', project, '')
if argLead != ''
let command .= ' -n ' . argLead
endif
let results = eclim#Execute(command)
return type(results) == g:LIST_TYPE ? results : []
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,37 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/javascript/complete.html
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command javascript_complete ' .
\ '-p "<project>" -f "<file>" -o <offset> -e <encoding>'
" }}}
" CodeComplete(findstart, base) {{{
" Handles code completion.
function! eclim#javascript#complete#CodeComplete(findstart, base)
return eclim#lang#CodeComplete(s:complete_command, a:findstart, a:base)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,124 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:warnings = '\(' . join([
\ 'imported but unused',
\ ], '\|') . '\)'
" }}}
function! eclim#javascript#util#UpdateSrcFile(on_save) " {{{
" Optional arg:
" validate: when 1 force the validation to execute, when 0 prevent it.
" Disabled until the jsdt matures.
"if !a:on_save
" call eclim#lang#UpdateSrcFile('javascript', 1)
"else
" call eclim#lang#UpdateSrcFile('javascript')
"endif
let validate = !a:on_save || (
\ g:EclimJavascriptValidate &&
\ (!exists('g:EclimFileTypeValidate') || g:EclimFileTypeValidate))
if validate && g:EclimJavascriptLintEnabled
call eclim#javascript#util#Jsl()
endif
endfunction " }}}
function! eclim#javascript#util#Jsl() " {{{
" Runs jsl (javascript lint) on the current file.
if eclim#util#WillWrittenBufferClose()
return
endif
let result = ''
if !executable('jsl')
if !exists('g:eclim_javascript_jsl_warn')
call eclim#util#EchoWarning("Unable to find 'jsl' command.")
let g:eclim_javascript_jsl_warn = 1
endif
else
if !exists('g:EclimJavascriptLintVersion')
call eclim#util#System('jsl --help')
let g:EclimJavascriptLintVersion = v:shell_error == 2 ? 'c' : 'python'
endif
let conf = expand(g:EclimJavascriptLintConf)
" the c version
if g:EclimJavascriptLintVersion == 'c'
let command = 'jsl -process "' . expand('%:p') . '"'
if filereadable(conf)
let command .= ' -conf "' . conf . '"'
endif
" the new python version
else
let command = 'jsl "' . expand('%:p') . '"'
if filereadable(conf)
let command .= ' --conf "' . conf . '"'
endif
endif
let result = eclim#util#System(command)
if v:shell_error == 2 "|| v:shell_error == 4
call eclim#util#EchoError('Error running command: ' . command)
return
endif
endif
if result =~ ':'
let results = split(result, '\n')
let errors = []
for error in results
if error =~ '.\{-}(\d\+): .\{-}: .\{-}'
let file = substitute(error, '\(.\{-}\)([0-9]\+):.*', '\1', '')
let line = substitute(error, '.\{-}(\([0-9]\+\)):.*', '\1', '')
let message = substitute(error, '.\{-}([0-9]\+):.\{-}: \(.*\)', '\1', '')
let dict = {
\ 'filename': eclim#util#Simplify(file),
\ 'lnum': line,
\ 'text': "[jsl] " . message,
\ 'type': error =~ ': \(lint \)\?warning:' ? 'w' : 'e',
\ }
call add(errors, dict)
endif
endfor
call eclim#display#signs#SetPlaceholder()
call eclim#util#ClearLocationList('jsl')
if &ft == 'javascript'
call eclim#util#SetLocationList(errors)
else
call eclim#util#SetLocationList(errors, 'a')
endif
call eclim#display#signs#RemovePlaceholder()
else
call eclim#util#ClearLocationList('jsl')
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,650 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:update_command = '-command <lang>_src_update -p "<project>" -f "<file>"'
let s:validate_command = '-command <type>_validate -p "<project>" -f "<file>"'
let s:undoredo_command = '-command refactor_<operation>'
" }}}
function! eclim#lang#CodeComplete(command, findstart, base, ...) " {{{
" Optional args:
" options: dict containing one or more of the following:
" temp: 1 to use a temp file, 0 otherwise
" regex: regular expression of characters to walk back over to find the
" starting position of the completion.
" layout: passed through to the eclimd completion for languages that
" support this (typically decides how overloaded method names are
" presented in the completion list).
if !eclim#project#util#IsCurrentFileInProject(0)
return a:findstart ? -1 : []
endif
let options = a:0 ? a:1 : {}
if a:findstart
call eclim#lang#SilentUpdate(get(options, 'temp', 1))
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
"exceptions that break the rule
if line[start] =~ '\.'
let start -= 1
endif
let pattern = get(options, 'regex', '\w')
while start > 0 && line[start - 1] =~ pattern
let start -= 1
endwhile
return start
else
let offset = eclim#util#GetOffset() + len(a:base)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(get(options, 'temp', 1), 0)
if file == ''
return []
endif
let command = a:command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
if has_key(options, 'layout')
let command = substitute(command, '<layout>', options.layout, '')
endif
let completions = []
let results = eclim#Execute(command)
if type(results) != g:LIST_TYPE
return
endif
let open_paren = getline('.') =~ '\%' . col('.') . 'c\s*('
let close_paren = getline('.') =~ '\%' . col('.') . 'c\s*(\s*)'
for result in results
let word = result.completion
" strip off close paren if necessary.
if word =~ ')$' && close_paren
let word = strpart(word, 0, strlen(word) - 1)
endif
" strip off open paren if necessary.
if word =~ '($' && open_paren
let word = strpart(word, 0, strlen(word) - 1)
endif
let menu = eclim#html#util#HtmlToText(result.menu)
let info = has_key(result, 'info') ?
\ eclim#html#util#HtmlToText(result.info) : ''
let dict = {
\ 'word': word,
\ 'menu': menu,
\ 'info': info,
\ 'dup': 1
\ }
call add(completions, dict)
endfor
return completions
endif
endfunction " }}}
function! eclim#lang#Search(command, singleResultAction, argline) " {{{
let argline = a:argline
"if argline == ''
" call eclim#util#EchoError('You must supply a search pattern.')
" return
"endif
" check for user supplied open action
let [action_args, argline] = eclim#util#ExtractCmdArgs(argline, '-a:')
let action = len(action_args) == 2 ? action_args[1] : a:singleResultAction
" check if pattern supplied without -p.
if argline !~ '^\s*-[a-z]' && argline !~ '^\s*$'
let argline = '-p ' . argline
endif
if !eclim#project#util#IsCurrentFileInProject(0)
let args = eclim#util#ParseArgs(argline)
let index = index(args, '-s') + 1
if index && len(args) > index && args[index] != 'all'
return
endif
let argline .= ' -s all'
endif
let search_cmd = a:command
let project = eclim#project#util#GetCurrentProjectName()
if project != ''
let search_cmd .= ' -n "' . project . '"'
endif
" no pattern supplied, use element search.
if argline !~ '-p\>'
if !eclim#project#util#IsCurrentFileInProject(1)
return
endif
" update the file.
call eclim#util#ExecWithoutAutocmds('silent update')
let file = eclim#project#util#GetProjectRelativeFilePath()
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
let encoding = eclim#util#GetEncoding()
let search_cmd .= ' -f "' . file . '"' .
\ ' -o ' . offset . ' -l ' . length . ' -e ' . encoding
else
" quote the search pattern
let search_cmd = substitute(
\ search_cmd, '\(.*-p\s\+\)\(.\{-}\)\(\s\|$\)\(.*\)', '\1"\2"\3\4', '')
endif
let search_cmd .= ' ' . argline
let results = eclim#Execute(search_cmd)
if type(results) != g:LIST_TYPE
return
endif
if !empty(results)
call eclim#lang#SearchResults(results, action)
return 1
else
if argline !~ '-p\>'
call eclim#util#EchoInfo("Element not found.")
else
let searchedFor = substitute(argline, '.*-p \(.\{-}\)\( .*\|$\)', '\1', '')
call eclim#util#EchoInfo("Pattern '" . searchedFor . "' not found.")
endif
endif
endfunction " }}}
function! eclim#lang#SearchResults(results, action) " {{{
" Function which handles processing search results.
silent let projectName = eclim#project#util#GetCurrentProjectName()
" single result
if len(a:results) == 1
let name = substitute(a:results[0].filename, '\', '/', 'g')
call eclim#util#GoToBufferWindowOrOpen(
\ name, a:action, a:results[0].line, a:results[0].column)
silent let curProjectName = eclim#project#util#GetCurrentProjectName()
if curProjectName == '' && projectName != ''
let b:eclim_project = projectName
endif
" more than one result
else
call eclim#util#SetQuickfixList(eclim#util#ParseLocationEntries(a:results))
if projectName != ''
" setbufvar seems to have the side affect of changing to the buffer's dir
" when autochdir is set.
let save_autochdir = &autochdir
set noautochdir
for item in getqflist()
call setbufvar(item.bufnr, 'eclim_project', projectName)
endfor
let &autochdir = save_autochdir
endif
exec g:EclimQuickFixOpen . ' ' . g:EclimQuickFixHeight
endif
endfunction " }}}
function! eclim#lang#IsFiletypeValidationEnabled(lang) " {{{
" global setting
if !g:EclimFileTypeValidate
return 0
endif
" per lang setting
exec 'let validate = g:Eclim' . toupper(a:lang[0]) . a:lang[1:] . 'Validate'
return validate
endfunction " }}}
function! eclim#lang#DisableSyntasticIfValidationIsEnabled(lang, ...) " {{{
"Optional arg:
" syntastic lang: The syntastic lang string if it doesn't match eclim's lang.
if exists('g:loaded_syntastic_plugin') &&
\ eclim#lang#IsFiletypeValidationEnabled(a:lang)
let lang = a:0 ? a:1 : a:lang
exec 'let syntastic_enabled = ' .
\ 'g:Eclim' . toupper(lang[0]) . lang[1:] . 'SyntasticEnabled'
if !syntastic_enabled
if !exists('g:syntastic_mode_map')
let g:syntastic_mode_map = {'passive_filetypes': []}
elseif !has_key(g:syntastic_mode_map, 'passive_filetypes')
let g:syntastic_mode_map.passive_filetypes = []
endif
if index(g:syntastic_mode_map.passive_filetypes, lang) == -1
call add(g:syntastic_mode_map.passive_filetypes, lang)
endif
endif
endif
endfunction " }}}
function! eclim#lang#UpdateSrcFile(lang, ...) " {{{
" Updates the src file on the server w/ the changes made to the current file.
" Optional arg:
" validate: when 1 force the validation to execute, when 0 prevent it.
if !a:0
let validate = eclim#lang#IsFiletypeValidationEnabled(a:lang)
else
" arg override
let validate = a:1
endif
let project = eclim#project#util#GetCurrentProjectName()
if project != ""
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:update_command
let command = substitute(command, '<lang>', a:lang, '')
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
if validate && !eclim#util#WillWrittenBufferClose()
let command = command . ' -v'
if eclim#project#problems#IsProblemsList() &&
\ g:EclimProjectProblemsUpdateOnSave
let command = command . ' -b'
endif
endif
let result = eclim#Execute(command)
if validate && !eclim#util#WillWrittenBufferClose()
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
call eclim#util#SetLocationList(errors)
else
call eclim#util#ClearLocationList('global')
endif
endif
call eclim#project#problems#ProblemsUpdate('save')
elseif validate && expand('<amatch>') == ''
call eclim#project#util#IsCurrentFileInProject()
endif
endfunction " }}}
" Validate(type, on_save, [filter]) {{{
" Validates the current file. Used by languages which are not validated via
" UpdateSrcFile (pretty much all the xml dialects and wst langs).
function! eclim#lang#Validate(type, on_save, ...)
if eclim#util#WillWrittenBufferClose()
return
endif
if !eclim#project#util#IsCurrentFileInProject(!a:on_save)
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:validate_command
let command = substitute(command, '<type>', a:type, '')
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let result = eclim#Execute(command)
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
if a:0
let errors = function(a:1)(errors)
endif
call eclim#util#SetLocationList(errors)
else
call eclim#util#ClearLocationList()
endif
endfunction " }}}
function! eclim#lang#SilentUpdate(...) " {{{
" Silently updates the current source file w/out validation.
" Optional args:
" temp: construct a temp file path for the current file and return that path
" (default is to not create a temp file)
" temp_write: when constructing a temp file path, whether or not to write
" the current file's contents to that path (default is to do so)
" i couldn't reproduce the issue, but at least one person experienced the
" cursor moving on update and breaking code completion:
" http://sourceforge.net/tracker/index.php?func=detail&aid=1995319&group_id=145869&atid=763323
let pos = getpos('.')
silent let file = eclim#project#util#GetProjectRelativeFilePath()
if file != ''
try
if a:0 && a:1 && g:EclimTempFilesEnable
" don't create temp files if no server is available to clean them up.
let project = eclim#project#util#GetProject(expand('%:p'))
let workspace = len(project) > 0 ? project.workspace : ''
if workspace != '' && eclim#PingEclim(0, workspace)
let prefix = '__eclim_temp_'
let file = fnamemodify(file, ':h') . '/' . prefix . fnamemodify(file, ':t')
let tempfile = expand('%:p:h') . '/' . prefix . expand('%:t')
if a:0 < 2 || a:2
let savepatchmode = &patchmode
set patchmode=
exec 'silent noautocmd keepalt write! ' . escape(tempfile, ' %')
let &patchmode = savepatchmode
endif
endif
else
if a:0 < 2 || a:2
silent noautocmd update
endif
endif
finally
call setpos('.', pos)
endtry
endif
return file
endfunction " }}}
" Refactor(command) {{{
" Executes the supplied refactoring command handle error response and
" reloading files that have changed.
function! eclim#lang#Refactor(command)
let cwd = substitute(getcwd(), '\', '/', 'g')
let cwd_return = 1
try
" turn off swap files temporarily to avoid issues with folder/file
" renaming.
let bufend = bufnr('$')
let bufnum = 1
while bufnum <= bufend
if bufexists(bufnum)
call setbufvar(bufnum, 'save_swapfile', getbufvar(bufnum, '&swapfile'))
call setbufvar(bufnum, '&swapfile', 0)
endif
let bufnum = bufnum + 1
endwhile
" cd to the project root to avoid folder renaming issues on windows.
exec 'cd ' . escape(eclim#project#util#GetCurrentProjectRoot(), ' ')
let result = eclim#Execute(a:command)
if type(result) != g:LIST_TYPE && type(result) != g:DICT_TYPE
return
endif
" error occurred
if type(result) == g:DICT_TYPE && has_key(result, 'errors')
call eclim#util#EchoError(result.errors)
return
endif
" reload affected files.
let curwin = winnr()
try
for info in result
let newfile = ''
" handle file renames
if has_key(info, 'to')
let file = info.from
let newfile = info.to
if has('win32unix')
let newfile = eclim#cygwin#CygwinPath(newfile)
endif
else
let file = info.file
endif
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
" ignore unchanged directories
if isdirectory(file)
continue
endif
" handle current working directory moved.
if newfile != '' && isdirectory(newfile)
if file =~ '^' . cwd . '\(/\|$\)'
while cwd !~ '^' . file . '\(/\|$\)'
let file = fnamemodify(file, ':h')
let newfile = fnamemodify(newfile, ':h')
endwhile
endif
if cwd =~ '^' . file . '\(/\|$\)'
let dir = substitute(cwd, file, newfile, '')
exec 'cd ' . escape(dir, ' ')
let cwd_return = 0
endif
continue
endif
let winnr = bufwinnr(file)
if winnr > -1
exec winnr . 'winc w'
if newfile != ''
let bufnr = bufnr('%')
enew
exec 'bdelete ' . bufnr
exec 'edit ' . escape(eclim#util#Simplify(newfile), ' ')
else
call eclim#util#Reload({'retab': 1})
endif
endif
endfor
finally
exec curwin . 'winc w'
endtry
finally
if cwd_return
exec 'cd ' . escape(cwd, ' ')
endif
" re-enable swap files
let bufnum = 1
while bufnum <= bufend
if bufexists(bufnum)
let save_swapfile = getbufvar(bufnum, 'save_swapfile')
if save_swapfile != ''
call setbufvar(bufnum, '&swapfile', save_swapfile)
endif
endif
let bufnum = bufnum + 1
endwhile
endtry
endfunction " }}}
" RefactorPreview(command) {{{
" Executes the supplied refactor preview command and opens a corresponding
" window to view that preview.
function! eclim#lang#RefactorPreview(command)
let result = eclim#Execute(a:command)
if type(result) != g:DICT_TYPE
return
endif
" error occurred
if has_key(result, 'errors')
call eclim#util#EchoError(result.errors)
return
endif
let lines = []
for change in result.changes
if change.type == 'diff'
call add(lines, '|diff|: ' . change.file)
else
call add(lines, change.type . ': ' . change.message)
endif
endfor
call add(lines, '')
call add(lines, '|Execute Refactoring|')
call eclim#util#TempWindow('[Refactor Preview]', lines)
let b:refactor_command = result.apply
set ft=refactor_preview
hi link RefactorLabel Identifier
hi link RefactorLink Label
syntax match RefactorLabel /^\s*\w\+:/
syntax match RefactorLink /|\S.\{-}\S|/
nnoremap <silent> <buffer> <cr> :call eclim#lang#RefactorPreviewLink()<cr>
endfunction " }}}
" RefactorPreviewLink() {{{
" Called when a user hits <cr> on a link in the refactor preview window,
" issuing a diff for that file.
function! eclim#lang#RefactorPreviewLink()
let line = getline('.')
if line =~ '^|'
let command = b:refactor_command
let winend = winnr('$')
let winnum = 1
while winnum <= winend
let bufnr = winbufnr(winnum)
if getbufvar(bufnr, 'refactor_preview_diff') != ''
exec bufnr . 'bd'
continue
endif
let winnum += 1
endwhile
if line == '|Execute Refactoring|'
call eclim#lang#Refactor(command)
let winnr = b:winnr
close
" the filename might change, so we have to use the winnr to get back to
" where we were.
exec winnr . 'winc w'
elseif line =~ '^|diff|'
let file = substitute(line, '^|diff|:\s*', '', '')
let command .= ' -v -d "' . file . '"'
let diff = eclim#Execute(command)
if type(diff) != g:STRING_TYPE
return
endif
" split relative to the original window
exec b:winnr . 'winc w'
if has('win32unix')
let file = eclim#cygwin#CygwinPath(file)
endif
let name = fnamemodify(file, ':t:r')
let ext = fnamemodify(file, ':e')
exec printf('silent below new %s.current.%s', name, ext)
silent 1,$delete _ " counter-act any templating plugin
exec 'read ' . escape(file, ' ')
silent 1,1delete _
let winnr = winnr()
let b:refactor_preview_diff = 1
setlocal readonly nomodifiable
setlocal noswapfile nobuflisted
setlocal buftype=nofile bufhidden=delete
diffthis
let orien = g:EclimRefactorDiffOrientation == 'horizontal' ? '' : 'vertical'
exec printf('silent below %s split %s.new.%s', orien, name, ext)
silent 1,$delete _ " counter-act any templating plugin
call append(1, split(diff, "\n"))
let b:refactor_preview_diff = 1
silent 1,1delete _
setlocal readonly nomodifiable
setlocal noswapfile nobuflisted
setlocal buftype=nofile bufhidden=delete
diffthis
exec winnr . 'winc w'
endif
endif
endfunction " }}}
" RefactorPrompt(prompt) {{{
" Issues the standard prompt for language refactorings.
function! eclim#lang#RefactorPrompt(prompt)
exec "echohl " . g:EclimHighlightInfo
try
" clear any previous messages
redraw
echo a:prompt . "\n"
let response = input("([e]xecute / [p]review / [c]ancel): ")
while response != '' &&
\ response !~ '^\c\s*\(e\(xecute\)\?\|p\(review\)\?\|c\(ancel\)\?\)\s*$'
let response = input("You must choose either e, p, or c. (Ctrl-C to cancel): ")
endwhile
finally
echohl None
endtry
if response == ''
return -1
endif
if response =~ '\c\s*\(c\(ancel\)\?\)\s*'
return 0
endif
return response =~ '\c\s*\(e\(execute\)\?\)\s*' ? 1 : 2 " preview
endfunction " }}}
" UndoRedo(operation, peek) {{{
" Performs an undo or redo (operation = 'undo' or 'redo') for the last
" executed refactoring.
function! eclim#lang#UndoRedo(operation, peek)
if !eclim#project#util#IsCurrentFileInProject()
return
endif
" update the file before vim makes any changes.
call eclim#lang#SilentUpdate()
wall
let command = s:undoredo_command
let command = substitute(command, '<operation>', a:operation, '')
if a:peek
let command .= ' -p'
let result = eclim#Execute(command)
if type(result) == g:STRING_TYPE
call eclim#util#Echo(result)
endif
return
endif
call eclim#lang#Refactor(command)
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,145 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2015 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:call_hierarchy =
\ '-command <lang>_callhierarchy -p "<project>" -f "<file>" ' .
\ '-o <offset> -l <length> -e <encoding>'
" }}}
function! eclim#lang#hierarchy#CallHierarchy(lang, default_action, bang, ...) " {{{
if !eclim#project#util#IsCurrentFileInProject(1)
return
endif
call eclim#lang#SilentUpdate()
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let position = eclim#util#GetCurrentElementPosition()
let offset = substitute(position, '\(.*\);\(.*\)', '\1', '')
let length = substitute(position, '\(.*\);\(.*\)', '\2', '')
let command = s:call_hierarchy
let command = substitute(command, '<lang>', a:lang, '')
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<length>', length, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
if a:0
" doesn't support args that need quoting or escaping, just simply flags,
" etc.
let command .= ' ' . join(a:000, ' ')
endif
" return callees
if a:bang != ''
let command .= ' -c'
endif
let result = eclim#Execute(command)
if type(result) != g:DICT_TYPE
return
endif
if len(result) == 0
call eclim#util#Echo('No results found.')
return
endif
let lines = []
let info = []
let key = a:bang != '' ? 'callees' : 'callers'
call s:CallHierarchyFormat(result, key, lines, info, '')
call eclim#util#TempWindow('[Call Hierarchy]', lines)
exec 'set ft=' . a:lang
" fold function calls into their parent
setlocal foldmethod=expr
setlocal foldexpr='>'.len(substitute(getline(v:lnum),'^\\(\\s*\\).*','\\1',''))/2
setlocal foldtext=substitute(getline(v:foldstart),'^\\(\\s*\\)\\s\\s','\\1+\ ','').':\ '.(v:foldend-v:foldstart+1).'\ lines'
setlocal modifiable noreadonly
call append(line('$'), ['', '" use ? to view help'])
setlocal nomodifiable readonly
syntax match Comment /^".*/
let b:hierarchy_info = info
exec 'nnoremap <buffer> <silent> <cr> ' .
\ ':call <SID>Open("' . a:default_action . '")<cr>'
nnoremap <buffer> <silent> E :call <SID>Open('edit')<cr>
nnoremap <buffer> <silent> S :call <SID>Open('split')<cr>
nnoremap <buffer> <silent> T :call <SID>Open("tablast \| tabnew")<cr>
" assign to buffer var to get around weird vim issue passing list containing
" a string w/ a '<' in it on execution of mapping.
let b:hierarchy_help = [
\ '<cr> - open file with default action',
\ 'E - open with :edit',
\ 'S - open in a new split window',
\ 'T - open in a new tab',
\ ]
nnoremap <buffer> <silent> ?
\ :call eclim#help#BufferHelp(b:hierarchy_help, 'vertical', 40)<cr>
endfunction " }}}
function! s:CallHierarchyFormat(result, key, lines, info, indent) " {{{
if has_key(a:result, 'position')
call add(a:info, {
\ 'file': a:result.position.filename,
\ 'line': a:result.position.line,
\ 'col': a:result.position.column
\ })
call add(a:lines, a:indent . a:result.name)
else
call add(a:info, {'file': '', 'line': -1, 'col': -1})
call add(a:lines, a:indent . a:result.name)
endif
for call in get(a:result, a:key, [])
call s:CallHierarchyFormat(call, a:key, a:lines, a:info, a:indent . "\t")
endfor
endfunction " }}}
function! s:Open(action) " {{{
let line = line('.')
if line > len(b:hierarchy_info)
return
endif
let info = b:hierarchy_info[line - 1]
if info.file != ''
" go to the buffer that initiated the hierarchy
exec b:winnr . 'winc w'
let action = a:action
call eclim#util#GoToBufferWindowOrOpen(
\ info.file, action, info.line, info.col)
" force any previous messge from else below to be cleared
echo ''
else
call eclim#util#Echo('No associated file was found.')
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,125 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script variables {{{
let s:problems_command = '-command problems -p "<project>"'
" }}}
function! eclim#project#problems#Problems(project, open, bang) " {{{
let project = a:project
if project == ''
let project = eclim#project#util#GetCurrentProjectName()
endif
if project == ''
call eclim#project#util#UnableToDetermineProject()
return
endif
let command = s:problems_command
let command = substitute(command, '<project>', project, '')
if a:bang != ""
let command .= ' -e'
endif
let result = eclim#Execute(command)
let errors = []
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
endif
let action = eclim#project#problems#IsProblemsList() ? 'r' : ' '
call eclim#util#SetQuickfixList(errors, action)
" generate a 'signature' to distinguish the problems list from other qf
" lists.
let s:eclim_problems_sig = s:QuickfixSignature()
let s:eclim_problems_bang = a:bang
if a:open
exec g:EclimQuickFixOpen . ' ' . g:EclimQuickFixHeight
endif
endfunction " }}}
function! eclim#project#problems#ProblemsUpdate(action) " {{{
if a:action == 'save' && !g:EclimProjectProblemsUpdateOnSave
return
endif
if a:action == 'build' && !g:EclimProjectProblemsUpdateOnBuild
return
endif
if !eclim#project#problems#IsProblemsList()
return
endif
" preserve the cursor position in the quickfix window
let qf_winnr = 0
let index = 1
while index <= winnr('$')
if getbufvar(winbufnr(index), '&ft') == 'qf'
let cur = winnr()
let qf_winnr = index
exec qf_winnr . 'winc w'
let pos = getpos('.')
exec cur . 'winc w'
break
endif
let index += 1
endwhile
let bang = exists('s:eclim_problems_bang') ? s:eclim_problems_bang : ''
call eclim#project#problems#Problems('', 0, bang)
" restore the cursor position
if qf_winnr
let cur = winnr()
exec qf_winnr . 'winc w'
call setpos('.', pos)
redraw
exec cur . 'winc w'
endif
endfunction " }}}
function! eclim#project#problems#IsProblemsList() " {{{
" if available, compare the problems signature against the signature of
" the current list to see if we are now on the problems list, probably via
" :colder or :cnewer.
if exists('s:eclim_problems_sig')
return s:QuickfixSignature() == s:eclim_problems_sig
endif
if exists('s:eclim_problems_bang')
unlet s:eclim_problems_bang
endif
return 0
endfunction " }}}
function! s:QuickfixSignature() " {{{
let qflist = getqflist()
let len = len(qflist)
return {
\ 'len': len,
\ 'first': len > 0 ? (qflist[0]['bufnr'] . ':' . qflist[0]['text']) : '',
\ 'last': len > 0 ? (qflist[-1]['bufnr'] . ':' . qflist[-1]['text']) : ''
\ }
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,261 @@
" Author: Daniel Leong
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_project_run = '-command project_run -p "<project>" ' .
\ '-x "<vim_executable>" -v "<vim_servername>"'
let s:command_project_run_config = '-command project_run -p "<project>" ' .
\ '-n "<config>" -x "<vim_executable>" -v "<vim_servername>"'
let s:command_project_run_list = '-command project_run -p "<project>" -l'
let s:command_project_run_terminate = '-command project_run_terminate ' .
\ '-l "<launch_id>"'
let s:command_project_run_terminate_all = '-command project_run_terminate'
let s:flag_project_run_force = ' -c'
" }}}
" Python functions {{{
" Requiring python is gross, but it's the only way to append to
" a buffer that isn't visible, and that is surely required
function! s:append(bufno, type, line) " {{{
if !has('python')
return
endif
" prepare vars so python can pick them up
let bufnr = a:bufno
let ltype = a:type
let lines = split(a:line, '\r', 1)
py << PYEOF
import vim
bufnr = int(vim.eval('bufnr')) # NB int() is crucial
buf = vim.buffers[bufnr]
if buf:
lines = vim.eval('lines')
ltype = vim.eval('ltype')
prefixed = map(lambda l: "%s>%s" % (ltype, l), lines)
oldEnd = len(buf)
buf.options['readonly'] = False
buf.options['modifiable'] = True
buf.append(prefixed)
buf.options['readonly'] = True
buf.options['modifiable'] = False
# find windows for this buffer
for tab in vim.tabpages:
for win in tab.windows:
if win.buffer.number == buf.number:
# scroll to bottom if still there
row, col = win.cursor
if row == oldEnd:
win.cursor = [len(buf), col]
break
PYEOF
redraw
endfunction " }}}
" }}}
function! eclim#project#run#ProjectRun(...) " {{{
" Option args:
" config: The name of the configuration to run for the current project
if !eclim#EclimAvailable()
return
endif
if has('win32') || has('win64')
call eclim#util#EchoError(':ProjectRun is not currently supported on Windows')
return
endif
if !has('python')
call eclim#util#EchoError(':ProjectRun requires python support')
return
endif
if v:version < 704 || (v:version == 704 && !has('patch234'))
call eclim#util#EchoError(':ProjectRun requires vim 7.4.234 or newer')
return
endif
let config = a:0 > 0 ? a:1 : ''
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_project_run
if config != ''
let command = s:command_project_run_config
endif
let force = a:0 > 1 ? a:2 != "" : 0
if force
let command = command . s:flag_project_run_force
endif
" TODO include warning about --servername?
call eclim#util#Echo("Running project '" . project . "'...")
let vim_exe = substitute(exepath(v:progpath), '\', '/', 'g')
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<config>', config, '')
let command = substitute(command, '<vim_servername>', v:servername, '')
let command = substitute(command, '<vim_executable>', vim_exe, '')
let result = eclim#Execute(command, {'project': project})
call eclim#util#EchoError(result)
endfunction " }}}
function! eclim#project#run#ProjectRunList() " {{{
if !eclim#EclimAvailable()
return
endif
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_project_run_list
call eclim#util#Echo("Fetching launch configs for project '" . project . "'...")
let command = substitute(command, '<project>', project, '')
let result = eclim#Execute(command, {'project': project})
if type(result) != g:LIST_TYPE
call eclim#util#Echo(result)
return
endif
if len(result) == 0
call eclim#util#Echo("No launch configs for project '" . project . ".")
return
endif
let pad = 0
for config in result
let pad = len(config.name) > pad ? len(config.name) : pad
endfor
let output = []
for config in result
call add(output,
\ eclim#util#Pad(config.name, pad) . ' - ' . config.type)
endfor
call eclim#util#Echo(join(output, "\n"))
endfunction " }}}
function! eclim#project#run#TerminateLaunch(launchId) " {{{
if !eclim#EclimAvailable()
return
endif
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_project_run_terminate
let command = substitute(command, '<launch_id>', a:launchId, '')
let result = eclim#Execute(command, {'project': project})
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#project#run#TerminateAllLaunches() " {{{
if !eclim#EclimAvailable()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let command = s:command_project_run_terminate_all
let result = eclim#Execute(command, {'project': project})
call eclim#util#Echo(result)
endfunction " }}}
function! eclim#project#run#onLaunchProgress(percent, label) " {{{
let totalBars = 10
let barChar = '|'
let barsCount = str2float(a:percent) * totalBars
let bars = eclim#util#Pad('', barsCount, barChar)
let bar = eclim#util#Pad(bars, totalBars, ' ')
let output = '[' . bar . '] ' . a:label
call eclim#util#Echo(output)
endfunction " }}}
function! eclim#project#run#onPrepareOutput(projectName, configName, launchId) " {{{
let name = '[' . a:launchId . ' Output]'
let bufnum = bufnr(eclim#util#EscapeBufferName(name))
if bufnum == -1
let current = winnr()
call eclim#util#TempWindow(name, [])
let bufnum = bufnr('%')
let b:launch_id = a:launchId
let b:eclim_project = a:projectName
augroup eclim_async_launch_cleanup
autocmd!
autocmd VimLeavePre * call eclim#project#run#TerminateAllLaunches()
augroup END
if g:EclimTerminateLaunchOnBufferClosed
exe 'autocmd BufWipeout <buffer> call eclim#project#run#TerminateLaunch("' .
\ b:launch_id . '")'
else
" need to keep the buffer around, then
setlocal bufhidden=hide
endif
" supply a Terminate command
exec 'command! -nargs=0 -buffer Terminate ' .
\ ':call eclim#project#run#TerminateLaunch("' . b:launch_id . '")'
" beautiful highlighting for error lines vs out> lines
syntax region Error matchgroup=Quote start=/err>/ end=/\n/ concealends oneline
syntax region Normal matchgroup=Quote start=/out>/ end=/\n/ concealends oneline
set conceallevel=3
set concealcursor=nc
exec current . "winc w"
else
call eclim#util#TempWindowClear(name)
endif
redraw!
return bufnum
endfunction " }}}
function! eclim#project#run#onOutput(bufnum, type, line) " {{{
if has('python')
if "terminated" == a:type
call s:append(a:bufnum, "out", "<terminated>")
else
call s:append(a:bufnum, a:type, a:line)
endif
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,517 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
if !exists('g:EclimProjectTreeActions')
let g:EclimProjectTreeActions = [
\ {'pattern': '.*', 'name': 'Split', 'action': 'split'},
\ {'pattern': '.*', 'name': 'VSplit', 'action': 'vsplit'},
\ {'pattern': '.*', 'name': 'Tab', 'action': 'tablast | tabnew'},
\ {'pattern': '.*', 'name': 'Edit', 'action': 'edit'},
\ ]
endif
" }}}
" Script Variables {{{
let s:project_tree_ids = 0
let s:shared_instances_by_buffer = {}
let s:shared_instances_by_names = {}
" }}}
function! eclim#project#tree#ProjectTree(...) " {{{
" Open a tree view of the current or specified projects.
" no project dirs supplied, use current project
if len(a:000) == 0
let name = eclim#project#util#GetCurrentProjectName()
let names = [name]
if name == ''
if exists('t:cwd')
let names = [t:cwd]
else
call eclim#project#util#UnableToDetermineProject()
return
endif
endif
" list of project names supplied
elseif type(a:000[0]) == g:LIST_TYPE
let names = a:000[0]
if len(names) == 1 && (names[0] == '0' || names[0] == '')
return
endif
" list or project names
else
let names = a:000
endif
let dirs = []
let index = 0
let names_copy = copy(names)
for name in names
if name == 'CURRENT'
let name = eclim#project#util#GetCurrentProjectName()
let names_copy[index] = name
endif
let dir = eclim#project#util#GetProjectRoot(name)
if dir == ''
let dir = expand(name, ':p')
if !isdirectory(dir)
if eclim#EclimAvailable(0)
call eclim#util#EchoWarning('Project not found: ' . name)
endif
call remove(names_copy, index)
continue
endif
let names_copy[index] = fnamemodify(substitute(dir, '/$', '', ''), ':t')
endif
call add(dirs, dir)
let index += 1
endfor
let names = names_copy
if len(dirs) == 0
return
endif
" for session reload
let g:Eclim_project_tree_names = join(names, '|')
let display = len(names) == 1 ?
\ 'Project: ' . names[0] :
\ 'Projects: ' . join(names, ', ')
call eclim#project#tree#ProjectTreeClose()
call eclim#project#tree#ProjectTreeOpen(display, names, dirs)
endfunction " }}}
function! eclim#project#tree#ProjectTreeToggle() " {{{
let title = s:GetTreeTitle()
let bufnum = bufnr(title)
let winnum = bufwinnr(title)
if bufnum == -1 || winnum == -1
call eclim#project#tree#ProjectTree()
else
exec winnum . 'winc w'
close
winc p
endif
endfunction " }}}
function! eclim#project#tree#ProjectTreeOpen(display, names, dirs) " {{{
let expand = len(a:dirs) == 1
let expandDir = ''
if expand && g:EclimProjectTreeExpandPathOnOpen
let expandDir = substitute(expand('%:p:h'), '\', '/', 'g')
endif
" see if we should just use a shared tree
let shared = s:GetSharedTreeBuffer(a:names)
if shared != -1 && bufloaded(shared)
call eclim#display#window#VerticalToolWindowOpen(bufname(shared), 9)
"exec 'buffer ' . shared
if line('$') > 1 || getline(1) !~ '^\s*$'
setlocal nowrap nonumber
setlocal foldmethod=manual foldtext=getline(v:foldstart)
exec 'setlocal statusline=' . escape(a:display, ' ')
if !exists('t:project_tree_name')
exec 'let t:project_tree_id = ' .
\ substitute(bufname(shared), g:EclimProjectTreeTitle . '\(\d\+\)', '\1', '')
endif
if expand && expandDir != ''
call eclim#tree#ExpandPath(s:GetTreeTitle(), expandDir)
endif
return
endif
endif
" clear the project tree id if we are replacing a shared tree instance
if g:EclimProjectTreeSharedInstance && exists('t:project_tree_id')
unlet t:project_tree_id
endif
call eclim#display#window#VerticalToolWindowOpen(s:GetTreeTitle(), 9)
" command used to navigate to a content window before executing a command.
if !exists('g:EclimProjectTreeContentWincmd')
if g:VerticalToolWindowSide == 'right'
let g:EclimProjectTreeContentWincmd = 'winc h'
else
let g:EclimProjectTreeContentWincmd = 'winc l'
endif
endif
if exists('g:TreeSettingsFunction')
let s:TreeSettingsFunction = g:TreeSettingsFunction
endif
let g:TreeSettingsFunction = 'eclim#project#tree#ProjectTreeSettings'
try
call eclim#tree#Tree(s:GetTreeTitle(), a:dirs, a:names, expand, [])
finally
if exists('s:TreeSettingsFunction')
let g:TreeSettingsFunction = s:TreeSettingsFunction
else
unlet g:TreeSettingsFunction
endif
endtry
setlocal bufhidden=hide
exec 'setlocal statusline=' . escape(a:display, ' ')
if expand && expandDir != ''
call eclim#util#DelayedCommand(
\ 'call eclim#tree#ExpandPath("' . s:GetTreeTitle() . '", "' . expandDir . '")')
endif
normal! zs
let instance_names = join(a:names, '_')
let instance_names = substitute(instance_names, '\W', '_', 'g')
" remove the old associated tree value if one exists
silent! unlet s:shared_instances_by_names[s:shared_instances_by_buffer[bufnr('%')]]
let s:shared_instances_by_buffer[bufnr('%')] = instance_names
let s:shared_instances_by_names[instance_names] = bufnr('%')
call s:Mappings()
setlocal modifiable
call append(line('$'), ['', '" use ? to view help'])
call s:InfoLine()
setlocal nomodifiable
endfunction " }}}
function! eclim#project#tree#ProjectTreeClose() " {{{
if exists('t:project_tree_name') || exists('t:project_tree_id')
let winnr = bufwinnr(s:GetTreeTitle())
if winnr != -1
exec winnr . 'winc w'
close
endif
endif
endfunction " }}}
function! eclim#project#tree#Restore() " {{{
if exists('t:project_tree_restoring')
return
endif
let t:project_tree_restoring = 1
" prevent auto open from firing after session is loaded.
augroup project_tree_autoopen
autocmd!
augroup END
let title = s:GetTreeTitle()
let winnum = bufwinnr(title)
if winnum != -1
if exists('g:Eclim_project_tree_names')
let projects = split(g:Eclim_project_tree_names, '|')
call map(projects, 'escape(v:val, " ")')
let names = join(projects, ' ')
call eclim#util#DelayedCommand(
\ 'let bufnum = bufnr("%") | ' .
\ 'exec "ProjectTree ' . names . '" | ' .
\ 'exec bufwinnr(bufnum) . "winc w" | ' .
\ 'unlet t:project_tree_restoring')
else
exec 'bd ' . bufnr(title)
endif
endif
endfunction " }}}
function! s:GetTreeTitle() " {{{
" support a custom name from an external plugin
if exists('t:project_tree_name')
return t:project_tree_name
endif
if !exists('t:project_tree_id')
let t:project_tree_id = s:project_tree_ids + 1
let s:project_tree_ids += 1
endif
return g:EclimProjectTreeTitle . t:project_tree_id
endfunction " }}}
function! s:GetSharedTreeBuffer(names) " {{{
let instance_names = join(a:names, '_')
let instance_names = substitute(instance_names, '\W', '_', 'g')
if g:EclimProjectTreeSharedInstance &&
\ has_key(s:shared_instances_by_names, instance_names)
return s:shared_instances_by_names[instance_names]
endif
return -1
endfunction " }}}
function! s:Mappings() " {{{
nnoremap <buffer> <silent> E :call <SID>OpenFile('edit')<cr>
nnoremap <buffer> <silent> S :call <SID>OpenFile('split')<cr>
nnoremap <buffer> <silent> \| :call <SID>OpenFile('vsplit')<cr>
nnoremap <buffer> <silent> T :call <SID>OpenFile('tablast \| tabnew')<cr>
nnoremap <buffer> <silent> F :call <SID>OpenFileName()<cr>
nnoremap <buffer> <silent> Y :call <SID>YankFileName()<cr>
" assign to buffer var to get around weird vim issue passing list containing
" a string w/ a '<' in it on execution of mapping.
let b:project_tree_help = [
\ '<cr> - open/close dir, open file',
\ 'o - toggle dir fold, choose file open action',
\ 'E - open with :edit',
\ 'S - open in a new split window',
\ '| (pipe) - open in a new vertical split window',
\ 'T - open in a new tab',
\ 'R - refresh directory',
\ 'i - view file info',
\ 's - open shell at directory',
\ 'p - move cursor to parent dir',
\ 'P - move cursor to last child of dir',
\ 'C - set root to dir under the cursor',
\ 'B - set root up one dir',
\ '~ - set root to home dir',
\ 'K - set root to top most dir',
\ 'F - open/create a file by name',
\ 'D - create a new directory',
\ 'Y - yank current file/dir path to the clipboard',
\ 'A - toggle hide/view hidden files',
\ ':CD <dir> - set the root to <dir>',
\ ]
nnoremap <buffer> <silent> ?
\ :call eclim#help#BufferHelp(b:project_tree_help, 'horizontal', 10)<cr>
endfunction " }}}
function! s:InfoLine() " {{{
setlocal modifiable
let pos = getpos('.')
if len(b:roots) == 1
let lnum = line('$') - 1
if getline(lnum) =~ '^"'
exec lnum . ',' . lnum . 'delete _'
endif
let info = ''
try
let info = function('vcs#util#GetInfo')(b:roots[0])
catch /E\(117\|700\)/
" fall back to fugitive
try
" fugitive calls a User autocmd, so stop if that one is triggering
" this one to prevent a recursive loop
if exists('b:eclim_fugative_autocmd')
return
endif
" make sure fugitive has the git dir for the current project
if !exists('b:git_dir') || (b:git_dir !~ '^\M' . b:roots[0])
let cwd = ''
if getcwd() . '/' != b:roots[0]
let cwd = getcwd()
exec 'lcd ' . escape(b:roots[0], ' ')
endif
if exists('b:git_dir')
unlet b:git_dir
endif
" slight hack to prevent recursive autocmd loop with fugitive
let b:eclim_fugative_autocmd = 1
silent! doautocmd fugitive BufReadPost %
if cwd != ''
exec 'lcd ' . escape(cwd, ' ')
endif
endif
let info = function('fugitive#statusline')()
if info != ''
let branch = substitute(info, '^\[\Git(\(.*\))\]$', '\1', 'g')
if branch != info
let info = 'git:' . branch
endif
endif
catch /E\(117\|700\)/
" noop if the neither function was found
finally
silent! unlet b:eclim_fugative_autocmd
endtry
endtry
" &modifiable check for silly side effect of fugitive autocmd
if info != '' && &modifiable
call append(line('$') - 1, '" ' . info)
endif
endif
call setpos('.', pos)
setlocal nomodifiable
endfunction " }}}
function! s:PathEcho() " {{{
if mode() != 'n'
return
endif
let path = eclim#tree#GetPath()
let path = substitute(path, eclim#tree#GetRoot(), '', '')
if path !~ '^"'
call eclim#util#WideMessage('echo', path)
else
call eclim#util#WideMessage('echo', '')
endif
endfunction " }}}
function! s:OpenFile(action) " {{{
let path = eclim#tree#GetPath()
if path !~ '/$'
if !filereadable(path)
echo "File is not readable or has been deleted."
return
endif
call eclim#tree#ExecuteAction(path,
\ "call eclim#project#tree#OpenProjectFile('" . a:action . "', '<file>')")
endif
endfunction " }}}
function! s:OpenFileName() " {{{
let path = eclim#tree#GetPath()
if !isdirectory(path)
let path = fnamemodify(path, ':h') . '/'
endif
let response = input('file: ', path, 'file')
if response != ''
let actions = eclim#tree#GetFileActions(response)
call eclim#tree#ExecuteAction(response, actions[0].action)
endif
endfunction " }}}
function! s:YankFileName() " {{{
let path = eclim#tree#GetPath()
let [@*, @+, @"] = [path, path, path]
call eclim#util#Echo('Copied path to clipboard: ' . path)
endfunction " }}}
function! eclim#project#tree#ProjectTreeSettings() " {{{
for action in g:EclimProjectTreeActions
call eclim#tree#RegisterFileAction(action.pattern, action.name,
\ "call eclim#project#tree#OpenProjectFile('" . action.action . "', '<file>')")
endfor
call eclim#tree#RegisterDirAction(function('eclim#project#tree#InjectLinkedResources'))
if exists('s:TreeSettingsFunction')
let l:Settings = function(s:TreeSettingsFunction)
call l:Settings()
endif
augroup eclim_tree
autocmd User <buffer> call <SID>InfoLine()
if g:EclimProjectTreePathEcho
autocmd CursorMoved <buffer> call <SID>PathEcho()
endif
augroup END
endfunction " }}}
function! eclim#project#tree#OpenProjectFile(cmd, file) " {{{
" Execute the supplied command in one of the main content windows.
if eclim#util#GoToBufferWindow(a:file)
return
endif
let file = a:file
let cmd = a:cmd
let cwd = getcwd()
exec g:EclimProjectTreeContentWincmd
" if the buffer is a no name and action is split, use edit instead.
if cmd =~ 'split' && expand('%') == '' &&
\ !&modified && line('$') == 1 && getline(1) == ''
let cmd = 'edit'
endif
" current file doesn't share same cwd as the project tree
let lcwd = getcwd()
if lcwd != cwd && !filereadable(file)
let file = escape(substitute(cwd, '\', '/', 'g'), ' &') . '/' . file
endif
try
exec cmd . ' ' file
catch /E325/
" ignore attention error since the user should be prompted to handle it.
finally
if lcwd != cwd
exec 'lcd ' . escape(cwd, ' ')
endif
endtry
endfunction " }}}
function! eclim#project#tree#InjectLinkedResources(dir, contents) " {{{
let project = eclim#project#util#GetProject(a:dir)
if len(project) == 0
return
endif
" listing the project root, so inject our project links
if len(get(project, 'links', {})) &&
\ substitute(a:dir, '/$', '', '') == project.path
if !exists('b:links')
let b:links = {}
endif
call extend(b:links, project.links)
let links = keys(project.links)
call sort(links)
let index = 0
for entry in copy(a:contents)
if !len(links)
break
endif
while len(links) && links[0] < fnamemodify(entry, ':h:t')
call insert(a:contents, a:dir . remove(links, 0) . '/', index)
endwhile
let index += 1
endfor
for link in links
call add(a:contents, a:dir . link . '/')
endfor
endif
endfunction " }}}
function! eclim#project#tree#HorizontalContentWindow() " {{{
" Command for g:EclimProjectTreeContentWincmd used when relative to a
" horizontal taglist window.
winc k
if exists('g:TagList_title') && bufname(bufnr('%')) == g:TagList_title
winc k
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,33 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#commonsvalidator#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['c', '<constant-name\s*>\s*(.*?)\s*</constant-name\s*>', 1],
\ ['f', "<form\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['v', "<validator\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,32 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#eclimhelp#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['a', '\*([^ *]+)\*', 1],
\ ['s', '\n([^\n]+)\n[=^-]{4,}', 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,39 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" ParseDocument(file, settings) {{{
function! eclim#taglisttoo#lang#forrest#ParseDocument(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['s', "<section\\s+[^>]*?id=['\"](.*?)['\"]", 1],
\ ])
endfunction " }}}
" ParseStatus(file, settings) {{{
function! eclim#taglisttoo#lang#forrest#ParseStatus(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['t', "<actions\\s+[^>]*?priority=['\"](.*?)['\"]", 1],
\ ['r', "<release\\s+[^>]*?version=['\"](.*?)['\"]", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,33 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2010 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#gant#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['t', "\\s*target\\s*\\(\\s*(?:name\\s*:)?\\s*['\"]?([^'\",: ]+)", 1],
\ ['f', "\\s*def\\s+(\\w+)\\s*\\(", 1],
\ ['f', "\\s*(?:final|def)?\\s*(\\w+)\\s*=\\s*\\{", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,37 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#hibernate#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['c', "<class\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['j', "<joined-subclass\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['t', "<typedef\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['f', "<filter-def\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['i', "<import\\s+[^>]*?class=['\"](.*?)['\"]", 1],
\ ['q', "<query\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['s', "<sql-query\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,33 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#junit#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['t', "<testcase\\s+[^>]*?\\bname=['\"](.*?)['\"]", 1],
\ ['f', "<testcase\\s+[^>]*?\\bname=['\"]([^'\"]+?)['\"]\\s+[^>]*?>\\s*<failure\\b", 1],
\ ['o', '<system-(out|err)\s*>', 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,33 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#spring#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['b', "<bean\\s+[^>]*?(?:name|id)=['\"](.*?)['\"]", 1],
\ ['i', "<import\\s+[^>]*?resource=['\"](.*?)['\"]", 1],
\ ['a', "<alias\\s+[^>]*?alias=['\"](.*?)['\"]", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,43 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
"
" License:
"
" Copyright (C) 2005 - 2010 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" ParseWebXml(file, settings) {{{
function! eclim#taglisttoo#lang#webxml#ParseWebXml(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['p', '<context-param\s*>\s*<param-name\s*>\s*(.*?)\s*</param-name\s*>', 1],
\ ['f', '<filter\s*>\s*<filter-name\s*>\s*(.*?)\s*</filter-name\s*>', 1],
\ ['i', '<filter-mapping\s*>\s*<filter-name\s*>\s*(.*?)\s*</filter-name\s*>', 1],
\ ['l', '<listener\s*>\s*<listener-class\s*>\s*(.*?)\s*</listener-class\s*>', 1],
\ ['s', '<servlet\s*>\s*<servlet-name\s*>\s*(.*?)\s*</servlet-name\s*>', 1],
\ ['v', '<servlet-mapping\s*>\s*<servlet-name\s*>\s*(.*?)\s*</servlet-name\s*>', 1],
\ ])
endfunction " }}}
" ParseTld(file, settings) {{{
function! eclim#taglisttoo#lang#webxml#ParseTld(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['t', '<tag\s*>\s*<name\s*>\s*(.*?)\s*</name\s*>', 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,48 @@
" Author: Eric Van Dewoestine
"
" License: {{{
" Copyright (c) 2005 - 2011, Eric Van Dewoestine
" All rights reserved.
"
" Redistribution and use of this software in source and binary forms, with
" or without modification, are permitted provided that the following
" conditions are met:
"
" * Redistributions of source code must retain the above
" copyright notice, this list of conditions and the
" following disclaimer.
"
" * Redistributions in binary form must reproduce the above
" copyright notice, this list of conditions and the
" following disclaimer in the documentation and/or other
" materials provided with the distribution.
"
" * Neither the name of Eric Van Dewoestine nor the names of its
" contributors may be used to endorse or promote products derived from
" this software without specific prior written permission of
" Eric Van Dewoestine.
"
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
" IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
" THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
" PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
" }}}
" Parse(file, settings) {{{
function! eclim#taglisttoo#lang#wsdl#Parse(file, settings)
return taglisttoo#util#Parse(a:file, a:settings, [
\ ['t', "<xsd:complexType\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['m', "<message\\s+[^>]*?name=['\"](.*?)['\"]", 1],
\ ['p', "<operation\\s+[^>]*?name=['\"](.*?)['\"]>\\s*<input", 1],
\ ['b', "<operation\\s+[^>]*?name=['\"]([^\n]*?)['\"]>\\s*<soap:operation", 1],
\ ])
endfunction " }}}
" vim:ft=vim:fdm=marker

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,82 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Contains any global vim side code for embedding gvim in eclipse.
"
" License:
"
" Copyright (C) 2005 - 2011 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" BufferWritten() {{{
" Invoked when a buffer opened from eclipse is saved, to notify eclipse of the
" save.
function eclim#vimplugin#BufferWritten()
if has('netbeans_enabled') && exists('g:vimplugin_running')
if exists('b:eclim_file_modified')
unlet b:eclim_file_modified
endif
nbkey unmodified
endif
endfunction " }}}
" BufferModified() {{{
" Invoked on cursor hold to check if a previously modified buffer is now
" unmodified, and vice versa, so that eclipse can be notified.
function eclim#vimplugin#BufferModified()
if has('netbeans_enabled') && exists('g:vimplugin_running')
if !exists('b:eclim_file_modified')
let b:eclim_file_modified = &modified
endif
if &modified != b:eclim_file_modified
unlet b:eclim_file_modified
exec 'nbkey ' . (&modified ? 'modified' : 'unmodified')
endif
let b:eclim_file_modified = &modified
endif
endfunction " }}}
" BufferClosed() {{{
" Invoked when a buffer is removed from a window to signal that eclipse should
" close the associated editor tab. This is only needed for external vim +
" tabbed mode.
function eclim#vimplugin#BufferClosed()
if has('netbeans_enabled') && exists('g:vimplugin_tabbed')
exec 'nbkey fileClosed ' . expand('<afile>:p')
endif
endfunction " }}}
" BufferEnter() {{{
" Invoked when switching buffers so we can update the eclipse tab title.
function eclim#vimplugin#BufferEnter()
if has('netbeans_enabled') && exists('g:vimplugin_running')
exec 'nbkey bufferEnter ' . expand('<afile>:p')
endif
endfunction " }}}
" FeedKeys(keys, [refocusGvim]) {{{
" Feeds eclipse compatible key string to eclipse if current gvim instance is
" attached via the netbeans protocol.
function eclim#vimplugin#FeedKeys(keys, ...)
if has('netbeans_enabled') && exists('g:vimplugin_running')
let refocus = a:0 > 0 && a:1 ? ',refocus' : ''
silent exec 'nbkey feedkeys ' . a:keys . refocus
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,232 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/common/web.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Global Variables {{{
if !exists("g:EclimOpenUrlInVimPatterns")
let g:EclimOpenUrlInVimPatterns = []
endif
if !exists("g:EclimOpenUrlInVimAction")
let g:EclimOpenUrlInVimAction = g:EclimDefaultFileOpenAction
endif
" }}}
" Script Variables {{{
let s:win_browsers = [
\ 'C:/Program Files/Opera/Opera.exe',
\ 'C:/Program Files/Mozilla Firefox/firefox.exe',
\ 'C:/Program Files/Internet Explorer/iexplore.exe'
\ ]
let s:browsers = [
\ 'xdg-open', 'chromium', 'opera', 'firefox', 'konqueror',
\ 'epiphany', 'mozilla', 'netscape', 'iexplore'
\ ]
" }}}
function! eclim#web#OpenUrl(url, ...) " {{{
" Opens the supplied url in a web browser or opens the url under the cursor.
if !exists('s:browser') || s:browser == ''
let s:browser = s:DetermineBrowser()
" slight hack for IE which doesn't like the url to be quoted.
if s:browser =~ 'iexplore' && !has('win32unix')
let s:browser = substitute(s:browser, '"', '', 'g')
endif
endif
if s:browser == ''
return
endif
let url = a:url
if url == ''
if len(a:000) > 2
let start = a:000[1]
let end = a:000[2]
while start <= end
call eclim#web#OpenUrl(eclim#util#GrabUri(start, col('.')), a:000[0])
let start += 1
endwhile
return
else
let url = eclim#util#GrabUri()
endif
endif
if url == ''
call eclim#util#EchoError(
\ 'No url supplied at command line or found under the cursor.')
return
endif
" prepend http:// or file:// if no protocol defined.
if url !~ '^\(https\?\|file\):'
" absolute file on windows or unix
if url =~ '^\([a-zA-Z]:[/\\]\|/\)'
let url = 'file://' . url
" everything else
else
let url = 'http://' . url
endif
endif
if len(a:000) == 0 || a:000[0] == ''
for pattern in g:EclimOpenUrlInVimPatterns
if url =~ pattern
exec g:EclimOpenUrlInVimAction . ' ' . url
return
endif
endfor
endif
let url = substitute(url, '\', '/', 'g')
let url = escape(url, '&%!')
let url = escape(url, '%!')
let command = escape(substitute(s:browser, '<url>', url, ''), '#')
silent call eclim#util#Exec(command)
redraw!
if v:shell_error
call eclim#util#EchoError("Unable to open browser:\n" . s:browser .
\ "\nCheck that the browser executable is in your PATH " .
\ "or that you have properly configured g:EclimBrowser")
endif
endfunction " }}}
function! eclim#web#SearchEngine(url, args, line1, line2) " {{{
" Function to use a search engine to search for a word or phrase.
let search_string = a:args
if search_string == ''
let search_string = eclim#util#GetVisualSelection(a:line1, a:line2, 0)
if search_string == ''
let search_string = expand('<cword>')
endif
endif
let search_string = eclim#html#util#UrlEncode(search_string)
let url = substitute(a:url, '<query>', search_string, '')
call eclim#web#OpenUrl(url)
endfunction " }}}
function! eclim#web#WordLookup(url, word) " {{{
" Function to lookup a word on an online dictionary, thesaurus, etc.
let word = a:word
if word == ''
let word = expand('<cword>')
endif
let url = substitute(a:url, '<query>', word, '')
call eclim#web#OpenUrl(url)
endfunction " }}}
function! s:DetermineBrowser() " {{{
let browser = ''
" user specified a browser, we just need to fill in any gaps if necessary.
if exists("g:EclimBrowser")
let browser = g:EclimBrowser
" add "<url>" if necessary
if browser !~ '<url>'
let browser = substitute(browser,
\ '^\([[:alnum:][:blank:]-/\\_.:"]\+\)\(.*\)$',
\ '\1 "<url>" \2', '')
endif
if has("win32") || has("win64")
" add 'start' to run process in background if necessary.
if browser !~ '^[!]\?start'
let browser = 'start ' . browser
endif
else
" add '&' to run process in background if necessary.
if browser !~ '&\s*$' &&
\ browser !~ '^\(/[/a-zA-Z0-9]\+/\)\?\<\(links\|lynx\|elinks\|w3m\)\>'
let browser = browser . ' &'
endif
" add redirect of std out and error if necessary.
if browser !~ '/dev/null'
let browser = substitute(browser, '\s*&\s*$', '&> /dev/null &', '')
endif
endif
if browser !~ '^\s*!'
let browser = '!' . browser
endif
" user did not specify a browser, so attempt to find a suitable one.
else
if has('win32') || has('win64') || has('win32unix')
" Note: this version may not like .html suffixes on windows 2000
if executable('rundll32')
let browser = 'rundll32 url.dll,FileProtocolHandler <url>'
endif
" this doesn't handle local files very well or '&' in the url.
"let browser = '!cmd /c start <url>'
if browser == ''
for name in s:win_browsers
if has('win32unix')
let name = eclim#cygwin#CygwinPath(name)
endif
if executable(name)
let browser = name
if has('win32unix')
let browser = '"' . browser . '"'
endif
break
endif
endfor
endif
elseif has('mac')
let browser = '!open "<url>"'
else
for name in s:browsers
if executable(name)
let browser = name
break
endif
endfor
endif
if browser != ''
let g:EclimBrowser = browser
let browser = s:DetermineBrowser()
endif
endif
if browser == ''
call eclim#util#EchoError("Unable to determine browser. " .
\ "Please set g:EclimBrowser to your preferred browser.")
endif
return browser
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,89 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/xml/complete.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Varables {{{
let s:complete_command =
\ '-command xml_complete -p "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding>'
" }}}
" CodeComplete(findstart, base) {{{
" Handles xml code completion.
function! eclim#xml#complete#CodeComplete(findstart, base)
if !eclim#project#util#IsCurrentFileInProject(0)
return a:findstart ? -1 : []
endif
if a:findstart
call eclim#lang#SilentUpdate(1)
" locate the start of the word
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '[[:alnum:]_-]'
let start -= 1
endwhile
return start
else
let offset = eclim#util#GetOffset() + len(a:base)
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#lang#SilentUpdate(1, 0)
if file == ''
return []
endif
let command = s:complete_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', offset, '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let completions = []
let results = eclim#Execute(command)
if type(results) != g:LIST_TYPE
return
endif
for result in results
let word = result.completion
if getline('.') =~ '\w:\w*\%' . col('.') . 'c'
let word = substitute(word, '^\w\+:', '', '')
endif
let menu = eclim#html#util#HtmlToText(result.menu)
let info = eclim#html#util#HtmlToText(result.info)
let dict = {'word': word, 'menu': menu, 'info': info}
call add(completions, dict)
endfor
return completions
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,79 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/xml/definition.html
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:element_def{'dtd'} = '<!ELEMENT\s\+<name>\>\(\s\|(\|$\)'
let s:element_def{'xsd'} =
\ '<\s*\(.\{-}:\)\?element\>\_[^>]*name\s*=\s*' .
\ g:EclimQuote . '<name>' . g:EclimQuote
" }}}
" DtdDefinition(element) {{{
" Opens the current xml file's dtd definition and optionally jumps to an
" element if an element name supplied.
function! eclim#xml#definition#DtdDefinition(element)
let dtd = eclim#xml#util#GetDtd()
let element = a:element == '' ? eclim#xml#util#GetElementName() : a:element
call s:OpenDefinition(dtd, element, 'dtd')
endfunction " }}}
" XsdDefinition(element) {{{
" Opens the current xml file's xsd definition and optionally jumps to an
" element if an element name supplied.
function! eclim#xml#definition#XsdDefinition(element)
let element = a:element == '' ? eclim#xml#util#GetElementName() : a:element
if element =~ ':'
let namespace = substitute(element, ':.*', '', '')
let element = substitute(element, '.*:', '', '')
let xsd = eclim#xml#util#GetXsd(namespace)
else
let xsd = eclim#xml#util#GetXsd()
endif
call s:OpenDefinition(xsd, element, 'xsd')
endfunction " }}}
" OpenDefinition(file, element, type) {{{
" Open the supplied definition file and jump to the element if supplied.
function! s:OpenDefinition(file, element, type)
if a:file == ''
call eclim#util#EchoWarning('Unable to locate ' . a:type . ' in current file.')
return
endif
" see if file is already open.
let winnr = bufwinnr(a:file)
if winnr != -1
exec winnr . 'winc w'
else
exec 'split ' . a:file
endif
" jump to element definition if supplied
if a:element != ''
let search = substitute(s:element_def{a:type}, '<name>', a:element, 'g')
call search(search, 'w')
endif
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,109 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" see http://eclim.org/vim/xml/format.html
"
" License:
"
" Copyright (C) 2005 - 2013 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_format =
\ '-command xml_format -f "<file>" -w <width> -i <indent> -m <ff>'
" }}}
function! eclim#xml#format#Format() " {{{
call eclim#util#ExecWithoutAutocmds('update')
let file = substitute(expand('%:p'), '\', '/', 'g')
if has('win32unix')
let file = eclim#cygwin#WindowsPath(file)
endif
let command = s:command_format
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<width>', &textwidth, '')
let command = substitute(command, '<indent>', &shiftwidth, '')
let command = substitute(command, '<ff>', &ff, '')
let result = eclim#Execute(command)
if result != '0'
silent! 1,$delete _
silent put =result
silent! 1,1delete _
endif
endfunction " }}}
function! s:SelectOuterTag(count) " {{{
let pos = getpos('.')
exec 'silent! normal! v' . a:count . 'atv'
call setpos('.', pos)
return s:VisualSelectionMap()
endfunction " }}}
function! s:SelectInnerTag() " {{{
silent! normal! vit
normal! v
call cursor(line("'<"), col("'<"))
return s:VisualSelectionMap()
endfunction " }}}
function! s:VisualSelectionMap() " {{{
let lstart = line("'<")
let cstart = col("'<")
let lend = line("'>")
let cend = col("'>")
if cstart > len(getline(lstart))
let lstart += 1
let cstart = 1
endif
if strpart(getline(lend), 0, cend) =~ '^\s*$'
let lend -= 1
let cend = len(getline(lend))
endif
return {'lstart': lstart, 'cstart': cstart, 'lend': lend, 'cend': cend}
endfunction " }}}
function! s:InsertCr(line, col) " {{{
call cursor(a:line, a:col)
exec "normal! i\<cr>\<esc>"
endfunction " }}}
function! s:GetRootLine() " {{{
let pos = getpos('.')
let line = 1
call cursor(1, 1)
while getline('.') !~ '<\w'
let line = line('.') + 1
if line > line('$')
break
endif
call cursor(line, 1)
endwhile
call setpos('.', pos)
return line
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,137 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Utility functions for xml plugins.
"
" This plugin contains shared functions that can be used regardless of the
" current file type being edited.
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:dtd = '.*' . g:EclimQuote . '\(.*\)' . g:EclimQuote . '\s*>.*'
let s:xsd = '.\{-}<ns>:schemaLocation\s*=\s*' .
\ g:EclimQuote . '\(.\{-}\)' . g:EclimQuote . '.*'
let s:element = '.\{-}<\([a-zA-Z].\{-}\)\(\s\|>\|$\).*'
" }}}
" GetDtd() {{{
" Get the dtd defined in the current file.
function! eclim#xml#util#GetDtd()
let linenum = search('<!DOCTYPE\s\+\_.\{-}>', 'bcnw')
if linenum > 0
let line = ''
while getline(linenum) !~ '>'
let line = line . getline(linenum)
let linenum += 1
endwhile
let line = line . getline(linenum)
let dtd = substitute(line, s:dtd, '\1', '')
if dtd != line
return dtd
endif
endif
return ''
endfunction " }}}
" GetXsd() {{{
" Get the schema defined in the current file, for the optionally provided
" namespace prefix, or the default namespace.
function! eclim#xml#util#GetXsd(...)
let namespace = ''
if len(a:000) > 0
let namespace = a:000[0]
endif
" if no namespace given, try 'xsi' as that is a common default.
if namespace == ''
let xsd = eclim#xml#util#GetXsd('xsi')
if xsd != ''
return xsd
endif
endif
let linenum = search(namespace . ':schemaLocation\>', 'bcnw')
if linenum > 0
let line = ''
while getline(linenum) !~ '>'
let line = line . getline(linenum)
let linenum += 1
endwhile
let line = line . getline(linenum)
let pattern = substitute(s:xsd, '<ns>', namespace, '')
let xsd = substitute(line, pattern, '\1', '')
if xsd != line
" last http definition is the schema
return strpart(xsd, strridx(xsd, 'http://'))
endif
endif
return ''
endfunction " }}}
" GetElementName() {{{
" Get name of the element that the cursor is currently on.
function! eclim#xml#util#GetElementName()
let line = getline('.')
let cnum = col('.')
if line[cnum - 1] == '<'
let cnum += 1
endif
if line[cnum - 1] == '>'
let cnum -= 1
endif
let name = substitute(line,
\ '.*</\?\s*\(.*\%' . cnum . 'c.\{-}\)\(\s.*\|\s*/\?>.*\|$\)', '\1', '')
if name == line || name =~ '<\|>' || name =~ '\S\s\S'
return ''
endif
let name = substitute(name, '\s\|/', '', 'g')
return name
endfunction " }}}
" GetParentElementName() {{{
" Get the parent element name relative to the current cursor position.
" Depends on 'at' visual selection ability.
function! eclim#xml#util#GetParentElementName()
let pos = getpos('.')
" select tags (best solution I can think of).
silent! normal! v2at
normal! v
call cursor(line("'<"), col("'<"))
let parent = eclim#xml#util#GetElementName()
call setpos('.', pos)
if eclim#xml#util#GetElementName() == parent
return ''
endif
return parent
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,75 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script Variables {{{
let s:command_validate = '-command xml_validate -p "<project>" -f "<file>"'
" }}}
function! eclim#xml#validate#Validate(on_save, ...) " {{{
" Optional args:
" bang: '!' or '', where '!' indicates that we should not jump to the
" first error.
if a:on_save && (!g:EclimXmlValidate || eclim#util#WillWrittenBufferClose())
return
endif
if eclim#EclimAvailable(0)
if !eclim#project#util#IsCurrentFileInProject()
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:command_validate
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
if search('xsi:schemaLocation', 'cnw')
let command .= ' -s'
endif
let result = eclim#Execute(command)
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
call eclim#util#SetLocationList(errors)
" bang arg supplied, but no bang, so jump to first error.
if len(a:000) > 0 && a:000[0] == ''
lfirst
endif
return 1
else
call eclim#util#ClearLocationList()
return 0
endif
else
" alternative method via xmllint
if !a:on_save && executable('xmllint')
let file = substitute(expand('%:p'), '\', '/', 'g')
call eclim#util#MakeWithCompiler('eclim_xmllint', '', file)
call eclim#display#signs#Update()
elseif !a:on_save
call eclim#util#EchoWarning("eclimd not running.")
endif
endif
return 0
endfunction " }}}
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,21 @@
#!/bin/bash
##
# Script to manually invoke a bash completion function and print the results
# one result per line.
##
. /etc/bash_completion
COMP_FUNC=$1
shift
COMP_WORDS=("${@}")
COMP_CWORD=$((${#COMP_WORDS[@]}-1))
CMD=${COMP_WORDS[0]}
CUR=${COMP_WORDS[$COMP_CWORD]}
PRE=${COMP_WORDS[$(($COMP_CWORD-1))]}
$COMP_FUNC $CMD $CUR $PRE
for reply in ${COMPREPLY[@]} ; do
echo $reply
done

View file

@ -0,0 +1,89 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Compiler for ant (enhancement to default ant compiler provided w/ vim).
"
" License:
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_ant"
if !exists('g:EclimAntCompilerAdditionalErrorFormat')
let g:EclimAntCompilerAdditionalErrorFormat = ''
endif
if !exists('g:EclimAntErrorFormat')
let g:EclimAntErrorFormat = ''
endif
if !exists('g:EclimAntErrorsEnabled')
let g:EclimAntErrorsEnabled = 0
endif
if g:EclimAntErrorsEnabled
let g:EclimAntErrorFormat .= '\%A%f:%l:\ %m,'
endif
CompilerSet makeprg=ant\ -find\ build.xml\ $*
" The two entries before the last one, are for catching ant build file names
" and error line numbers.
exec 'CompilerSet errorformat=' .
\ '\%-G%.%#[javac]\ %.%#:\ warning:\ unmappable\ character\ %.%#,' .
\ '\%A%.%#[javac]\ %f:%l:\ %m,' .
\ '\%C%.%#[javac]\ symbol\ %#:\ %m,' .
\ '\%-Z%.%#[javac]\ %p^,' .
\ '\%A%.%#[javadoc]\ %f:%l:\ %m,' .
\ '\%-C%.%#[javadoc]\ location:\ %.%#,' .
\ '\%-C%.%#[javadoc]\ %#,' .
\ '\%-Z%.%#[javadoc]\ %p^,' .
\ '\%-G%.%#[javadoc]\ Note:%.%#,' .
\ '\%-G%.%#[javadoc]\ javadoc:%.%#,' .
\ '\%.%#[javadoc]\ %f:\ %m,' .
\ '\%.%#[java]\ org\.apache\.jasper\.JasperException:\ file:%f(%l\\,%c)\ %m,' .
\ '\%.%#[java]\ %f:%l:%c:\ %m,' .
\ '\%.%#[java]\ %f:%l:\ %m,' .
\ '\%+A%.%#[junit]\ %.%#Failures:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[junit]\ Test\ %f\ FAILED,' .
\ '\%+A%.%#[junit]\ %.%#Errors:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[junit]\ Test\ %f\ FAILED,' .
\ '\%+A%.%#[cactus]\ %.%#Failures:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[cactus]\ Test\ %f\ FAILED,' .
\ '\%+A%.%#[cactus]\ %.%#Errors:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[cactus]\ Test\ %f\ FAILED,' .
\ '\%.%#[checkstyle]\ %f:%l:%c:\ %m,' .
\ '\%.%#[checkstyle]\ %f:%l:\ %m,' .
\ '\%E%.%#[scalac]\ %f:%l:\ error:\ %m,' .
\ '\%-Z%.%#[scalac]\ %p^,' .
\ '\%W%.%#[scalac]\ %f:%l:\ warning:\ %m,' .
\ '\%-Z%.%#[scalac]\ %p^,' .
\ '\%A%.%#[scalac]\ %f:%l:\ %m,' .
\ '\%-Z%.%#[scalac]\ %p^,' .
\ '\%+A%.%#eclim\ testng:\ %f:%m,' .
\ '\%.%#\ ERROR\ %.%#\ line\ %l\ in\ file:\ %.%f%.:\ %m,' .
\ g:EclimAntCompilerAdditionalErrorFormat .
\ '\%.%#[exec]\ %f:%l:%c:\ %m,' .
\ '\%.%#[exec]\ %f:%l:\ %m,' .
\ '\%f:%l:%c:\ %m,' .
\ g:EclimAntErrorFormat .
\ '\%-G%.%#'
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,50 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_javadoc"
let instance = eclim#client#nailgun#ChooseEclimdInstance()
let [retcode, result] = eclim#client#nailgun#GetEclimCommand(instance.home)
if retcode != 0
call eclim#util#EchoError(result)
finish
endif
let command = result
let command .= ' --nailgun-port ' . instance.port
let command .= ' -command javadoc $*'
if has('win32') || has('win64') || has('win32unix')
let command = 'cmd /c " ' . command . ' "'
else
let command = substitute(command, '"', '', 'g')
endif
exec 'CompilerSet makeprg=' . escape(command, ' "')
exec 'CompilerSet errorformat=' .
\ '\%A%.%#[javadoc]\ %f:%l:\ %m,' .
\ '\%-Z%.%#[javadoc]\ %p^,' .
\ '\%-G%.%#[javadoc]%.%#,' .
\ '\%-G%.%#'
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,56 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Compiler for make.
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_make"
if !exists('g:EclimMakeCompilerAdditionalErrorFormat')
let g:EclimMakeCompilerAdditionalErrorFormat = ''
endif
CompilerSet makeprg=make
" With the exception of the last two lines, this is a straight copy from the
" vim default.
exec 'CompilerSet errorformat=' .
\ '%*[^\"]\"%f\"%*\\D%l:\ %m,' .
\ '\"%f\"%*\\D%l:\ %m,'.
\ '%-G%f:%l:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,' .
\ '%-G%f:%l:\ for\ each\ function\ it\ appears\ in.),' .
\ '%f:%l:%c:%m,' .
\ '%f(%l):%m,' .
\ '%f:%l:%m,' .
\ '\"%f\"\\,\ line\ %l%*\\D%c%*[^\ ]\ %m,' .
\ "%D%*\\\\a[%*\\\\d]:\\ Entering\\ directory\\ `%f'," .
\ "%X%*\\\\a[%*\\\\d]:\\ Leaving\\ directory\\ `%f'," .
\ "%D%*\\\\a:\\ Entering\\ directory\\ `%f'," .
\ "%X%*\\\\a:\\ Leaving\\ directory\\ `%f'," .
\ '%DMaking\ %*\\a\ in\ %f,' .
\ '%f\|%l\|\ %m,' .
\ g:EclimMakeCompilerAdditionalErrorFormat .
\ '\%-G%.%#'
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,61 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Compiler for maven 1.x.
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_maven"
if !exists('g:EclimMavenCompilerAdditionalErrorFormat')
let g:EclimMavenCompilerAdditionalErrorFormat = ''
endif
CompilerSet makeprg=maven\ --find\ project.xml\ $*
" Lines 17 - 20: javac minus adornments (must be last to prevent picking up
" other errors in the wrong format).
exec 'CompilerSet errorformat=' .
\ '\%A%.%#[javac]\ %f:%l:\ %m,' .
\ '\%C%.%#[javac]\ symbol%.%#:\ %m,' .
\ '\%C%.%#[javac]\ location%.%#:\ %m,' .
\ '\%-Z%.%#[javac]\ %p^,' .
\ '\%W%.%#[javadoc]\ %f:%l:\ warning\ -\ %m,' .
\ '\%E%.%#[javadoc]\ %f:%l:\ error\ -\ %m,' .
\ '\%A%.%#[javadoc]\ %f:%l:\ %m,' .
\ '\%-C%.%#[javadoc]\ location:\ %.%#,' .
\ '\%-Z%.%#[javadoc]\ %p^,' .
\ '\%-G%.%#[javadoc]\ Note:%.%#,' .
\ '\%-G%.%#[javadoc]\ javadoc:%.%#,' .
\ '\%+A%.%#[junit]\ %.%#Failures:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[junit]%.%#\ Test\ %f\ FAILED,' .
\ '\%+A%.%#[junit]%.%#\ %.%#Errors:\ %[%^0]%.%#\ Time\ elapsed:\ %.%#,' .
\ '\%-Z%.%#[junit]\ Test\ %f\ FAILED,' .
\ g:EclimMavenCompilerAdditionalErrorFormat .
\ '\%A%f:%l:\ %m,' .
\ '\%Csymbol%.%#:\ %m,' .
\ '\%Clocation%.%#:\ %m,' .
\ '\%-Z\ %p^,' .
\ '\%-G%.%#'
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,56 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Compiler for maven 2.x.
"
" License:
"
" Copyright (C) 2005 - 2015 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_maven"
if !exists('g:EclimMvnCompilerAdditionalErrorFormat')
let g:EclimMvnCompilerAdditionalErrorFormat = ''
endif
CompilerSet makeprg=mvn\ $*
" Lines 1 - 3: javac
" Lines 4 - 7: javadoc
" Lines 8 - 12: test failures
" second set handles the case where the test emits output.
exec 'CompilerSet errorformat=' .
\ '\%A%f:[%l\\,%c]\ %m,' .
\ '\%Csymbol%.%#:\ %m,' .
\ '\%Zlocation%.%#:\ %m,' .
\ '\%AEmbedded\ error:%.%#\ -\ %f:%l:\ %m,' .
\ '\%-Z\ %p^,' .
\ '\%A%f:%l:\ %m,' .
\ '\%-Z\ %p^,' .
\ '\%ARunning\ %f,' .
\ '\%+ZTests\ run%.%#FAILURE!%.%#,' .
\ '\%ARunning\ %f,' .
\ '\%C%.%#,' .
\ '\%+ZTests\ run%.%#FAILURE!%.%#,' .
\ g:EclimMvnCompilerAdditionalErrorFormat .
\ '\%-G%.%#'
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,39 @@
" Author: Eric Van Dewoestine
"
" Description: {{{
" Compiler for xmllint.
"
" License:
"
" Copyright (C) 2005 - 2009 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
if exists("current_compiler")
finish
endif
let current_compiler = "eclim_xmllint"
CompilerSet makeprg=xmllint\ --valid\ --noout\ $*
CompilerSet errorformat=
\%E%f:%l:\ %.%#\ error\ :\ %m,
\%W%f:%l:\ %.%#\ warning\ :\ %m,
\%-Z%p^,
\%-C%.%#,
\%-G%.%#
" vim:ft=vim:fdm=marker

View file

@ -0,0 +1,32 @@
author
abstract
boolean
case
catch
char
class
double
extends
false
final
finally
float
implements
int
interface
link
new
package
param
private
protected
public
return
short
static
switch
throw
throws
true
try
version

View file

@ -0,0 +1,11 @@
*404.html*
Page Not Found
**************
The page you requested does not exist or may have been moved.
You can use the "Site" drop down or the search box in the nav bar
above to search for your desired topic.
vim:ft=eclimhelp

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,573 @@
*archive-news.html*
Eclim News Archive
******************
Nov. 25, 2012
=============
The most notable change in this release is support for Eclipse 3.8
with the Indigo release (1.7.13). Both releases also include several
small bug fixes.
- Eclim 2.2.5 (archive-changes#id1) for Eclipse 4.2 (Juno).
- Eclim 1.7.13 (archive-changes#id2) for Eclipse 3.7/3.8 (Indigo).
Nov. 18, 2012
=============
This is another bug fix release which includes support for the latest
Android development toolkit (21.0.0).
- Eclim 2.2.4 (archive-changes#id3) for Eclipse 4.2 (Juno).
- Eclim 1.7.12 (archive-changes#id4) for Eclipse 3.7 (Indigo).
Oct. 19, 2012
=============
This is a bug fix release for Windows users which fixes executing of
eclim commands from vim:
- Eclim 2.2.3 (archive-changes#id5) for Eclipse 4.2 (Juno).
- Eclim 1.7.11 (archive-changes#id6) for Eclipse 3.7 (Indigo).
Oct. 07, 2012
=============
Two new eclim updates are once again available with several bug fixes
and improvements.
- Eclim 2.2.2 (archive-changes#id7) for Eclipse 4.2 (Juno).
- Eclim 1.7.10 (archive-changes#id8) for Eclipse 3.7 (Indigo).
Sep. 09, 2012
=============
Eclim 1.7.9 (archive-changes#id9) for Eclipse 3.7 (Indigo) is now available.
This release adds initial support for scala (vim-scala-index).
Please note that the Scala IDE (http://scala-ide.org) , which eclim
uses to provide scala support, is not yet available for Eclipse 4.2
(Juno), so eclim's scala support will not be available for the eclim
2.2.x releases until sometime after the Scala IDE has been updated for
Juno.
Sep. 01, 2012
=============
Another set of releases are now available for both Juno and Indigo.
These both include several bug fixes along with new support for
creating android projects.
- Eclim 2.2.1 (archive-changes#id10) for Eclipse 4.2 (Juno).
- Eclim 1.7.8 (archive-changes#id11) for Eclipse 3.7 (Indigo).
Eclim also has a newly redesigned site using the sphinx bootstrap
theme (https://github.com/ervandew/sphinx-bootstrap-theme).
Aug. 07, 2012
=============
Two new versions of eclim have been released, one for the latest
Eclipse version, Juno, the other a bug fix release for the previous
version of Eclipse, Indigo.
- Eclim 2.2.0 (archive-changes#id12) for Eclipse 4.2 (Juno).
- Eclim 1.7.7 (archive-changes#id13) for Eclipse 3.7 (Indigo).
Jun. 07, 2012
=============
Eclim 1.7.6 (archive-changes#id14) is now available.
This is a minor bug fix release.
Jun. 03, 2012
=============
Eclim 1.7.5 (archive-changes#id15) is now available.
This is a minor release with an improved installer, some bug fixes, and a few
minor enhancements.
Apr. 22, 2012
=============
Eclim 1.7.4 (archive-changes#id16) is now available.
This is a bug fix release.
Mar. 18, 2012
=============
Eclim 1.7.3 (archive-changes#id17) is now available.
This version fixes numerious small bugs and adds a handful of small features.
Warning: Non vim users (emacs-eclim, subclim, etc.): The underlying
command response format for eclim has changed, which means that any
project relying on the old format isn't going to work. So if you are
installing eclim for use with a client other than vim, then be sure
to check with the client project to see if it has been updated for
eclim 1.7.3 or later.
2011-09-10
==========
Eclim 1.7.2 (archive-changes#id18) is now available.
This version fixes running the installer with java 7 as well as several other
small bug fixes and improvements.
I'd also like to announce the #eclim channel on freenode.
2011-07-02
==========
Eclim 1.7.1 (archive-changes#id19) is now available.
This is a bug fix release.
2011-06-26
==========
Eclim 1.7.0 (archive-changes#id20) is now available.
The most notable changes are:
- Eclim has been upgraded to support Eclipse 3.7 (Indigo).
Note: Eclim now requires Eclipse 3.7.
2011-04-16
==========
Eclim 1.6.3 (archive-changes#id21) is now available.
This is primarily a bug fix release.
2011-02-26
==========
Eclim 1.6.2 (archive-changes#id22) is now available.
This is mostly a bug fix release, but please note that a handful of vim
features have been broken out into separate projects and are no longer shipped
with eclim.
2010-10-23
==========
Eclim 1.6.1 (archive-changes#id23) is now available.
This is mostly a bug fix release with a few minor features tossed in.
2010-08-01
==========
Eclim 1.6.0 (archive-changes#id24) is now available.
The most notable changes are:
- Eclim has been upgraded to support Eclipse 3.6 (Helios).
Note: Eclim now requires Eclipse 3.6.
2010-06-26
==========
Eclim 1.5.8 (archive-changes#id25) is now available.
This is a bug fix release for the installer as well as some php and ruby
features.
2010-06-20
==========
Eclim 1.5.7 (archive-changes#id26) is now available.
The main focus of this release is bug fixes and improving the installer.
2010-03-06
==========
Eclim 1.5.6 (archive-changes#id27) is now available.
2010-02-22
==========
Eclim 1.5.5 (archive-changes#id28) is now available.
This is a bug fix release for the eclim installer.
2009-12-18
==========
Eclim 1.5.4 (archive-changes#id29) is now available.
This is primarily a bug fix release for OSX users.
2009-12-12
==========
Eclim 1.5.3 (archive-changes#id30) is now available.
2009-08-30
==========
Eclim 1.5.2 (archive-changes#id31) is now available.
2009-07-18
==========
Eclim 1.5.1 (archive-changes#id32) is now available.
This is primarily a bug fix release
2009-07-12
==========
Eclim 1.5.0 (archive-changes#id33) is now available.
The most notable changes are:
- Eclim has been upgraded to support Eclipse 3.5 (Galileo).
Note: Eclim now requires Eclipse 3.5.
- Ruby support has been added using the eclipse dltk
(http://eclipse.org/dltk/).
2009-06-14
==========
Eclim 1.4.9 (archive-changes#id34) is now available.
This is primarily a bug fix release, with a few refinements.
2009-05-30
==========
Eclim 1.4.8 (archive-changes#id35) is now available.
This is primarily a bug fix release with a few enhancements.
2009-05-02
==========
Eclim 1.4.7 (archive-changes#id36) is now available.
This is a bug fix release which resolves an installation on unix based
operating systems.
2009-05-02
==========
Eclim 1.4.6 (archive-changes#id37) is now available.
The major highlight of this release is support for c/c++ using the
eclipse cdt (http://eclipse.org/cdt/) plugin.
2009-04-04
==========
Eclim 1.4.5 (archive-changes#id39) is now available.
This is primarily a bug fix release.
2009-01-10
==========
Eclim 1.4.4 (archive-changes#id40) is now available.
Highlights of this release include:
- re-enabled php support
- added ability to run eclimd inside of eclipse gui
- added support for embedding gvim in eclipse
2008-11-15
==========
Eclim 1.4.3 (archive-changes#id41) is now available.
This release focuses on updating the installer to support ganymede's p2 for
upgrading / installing external dependencies and adding additional python
support.
2008-09-30
==========
Eclim 1.4.2 (archive-changes#id42) is now available.
This is primary a bug fix release.
2008-08-24
==========
Eclim 1.4.1 (archive-changes#id43) is now available.
This is primary a bug fix release, but there are some new features included
as well.
2008-07-27
==========
Eclim 1.4.0 (archive-changes#id44) is now available.
Please note that eclim now requires the latest version of eclipse (http://eclipse.org)
(Ganymede, 3.4.x).
Also note that the eclipse pdt plugin which serves as the base for
eclim's php support has not yet been released for the latest version
of eclipse. For this reason php support has been temporarily removed
from this release and will hopefully return soon after the pdt team
release a Ganymede (3.4) compatible version.
Another major change worth noting, is that eclim is now licensed under
the GPLv3. This was done to give eclim the freedom to integrate with
other GPL projects in the future.
2008-03-11
==========
Eclim 1.3.5 (archive-changes#id45) is now available.
You can view the release notes (archive-changes#id45) for
more info.
2008-02-05
==========
Eclim 1.3.4 (archive-changes#id46) is now available.
This release fixes a few minor bugs, improves the installer to account for
eclipse installs with per user plugin locations, and adds php support.
2007-12-15
==========
Eclim 1.3.3 (archive-changes#id47) is now available.
This release fixes some installer issues. If you have already installed
1.3.2, then there is no need to upgrade to 1.3.3.
2007-12-04
==========
Eclim 1.3.2 (archive-changes#id48) is now available.
2007-07-13
==========
Eclim 1.3.1 (archive-changes#id49) is now available.
This is only a bug fix release.
2007-07-01
==========
Eclim 1.3.0 (archive-changes#id50) is now available.
The most notable changes are:
- Eclim has been upgraded to support Eclipse 3.3.
Note: Eclim now requires Eclipse 3.3 and JDK 1.5.
- A new graphical installer (install#installer) built on the formic
(http://github.com/ervandew/formic/) installer framework.
- New functionality based on and requiring the eclipse wst
(http://eclipse.org/webtools/).
- Many more changes (archive-changes#id50).
2006-10-09
==========
All Users: A bug made its way into the initial 1.2.3 release which
prevents you from adding methods via :JavaImpl.
An updated eclim_vim_1.2.3.jar is now available to resolve this issue.
If you downloaded this file on October 8th or 9th you can either
download the updated version or execute the following within vim:
>
:PatchEclim eclim/autoload/eclim/util.vim 1.27
<
2006-10-08
==========
Eclim 1.2.3 is now available.
This is primarily a bug fix release.
Please view the release notes (archive-changes#id51) for more info.
2006-09-08
==========
Eclim 1.2.2 is now available.
The previous release introduced two new bugs that managed to slip through the
cracks. These have now been fixed including a third that had been around for
some time but went previously unnoticed.
To see a list of fixes you may view the release notes
(archive-changes#id52).
2006-09-07
==========
Eclim 1.2.1 is now available.
This is primarily a bug fix release, but some new functionality has been
added as well. This release should resolve all known issues.
To see a list of what's new / changed, be sure to take a look at the
release notes (archive-changes#id53).
2006-07-17
==========
Windows Users: Eclim 1.2.0 contained a couple issues that can
potentially prevent eclim from functioning. A new version of
eclim_vim_1.2.0.jar is now available, which fixes these issues.
Simply download the new file and extract it as explained in the <a
href="guides/install.html#step3">installation guide</a>. There is no
need to download or re-install the Eclipse plugins.
If any other issues are encountered please report them.
2006-07-16
==========
Eclim 1.2.0 is now available.
This release requires Eclipse 3.2 (http://eclipse.org/downloads).
To see a list of what's new / changed, be sure to take a look at the
release notes (archive-changes#id54).
Warning: The layout of eclim plugins within the Vim runtimepath has
changed. Please read the <a
href="changes.html#upgrade_1.2.0">details</a> in the release notes
and take the appropriate action prior to upgrading.
2006-05-07
==========
Eclim 1.1.2 is now available.
Before upgrading, you should upgrade your Vim installation to the stable
release of Vim 7.0 or greater.
To see a list of what's new / changed, be sure to take a look at the
release notes (archive-changes#id55).
2006-02-19
==========
New version of eclim (1.1.1) is now available.
This is mostly a bug fix release will a few new additions.
Please note, that this latest version requires Eclipse version 3.1.2 for some
bug fixes and improvements.
To see a list of what's new / changed, be sure to take a look at the
release notes (archive-changes#id56).
2005-12-26
==========
New version of eclim (1.1.0) is now available.
All questions, issues, suggestions are welcome and encouraged.
To see a list of what's new / changed, be sure to take a look at the
release notes (archive-changes#id57).
2005-10-16
==========
The first eclim release (1.0.0) is now available. All questions,
issues, suggestions are welcome and encouraged.
Be sure to read the docs to see what features are currently available,
and take a look at the <a href="todo.html">todo</a> to see what's
coming in future releases.
2005-09-11
==========
Several new additions over the past couple weeks:
- Java code completion: Integrated into Vim via Vim 7's new "User
Defined Completion".
- Added eclim command line support for creating and updating
projects, including Vim support for editing Eclipse .classpath files
and updating Eclipse upon writing of those files.
- Integrated nailgun (http://www.martiansoftware.com/nailgun/) to
greatly improve the command line client performance.
- Started documenting eclim and its features.
With the addition of these features I'm going to stop adding new
functionality for the time being and focus on testing and ensuring
that everything works as expected on Windows.
2005-08-21
==========
Code navigation / searching is done! Most of the Vim integration for
searching is done as well. The only thing missing is viewing code for
results that are found in a jar file that have no corresponding source
attachment. I may end up doing what Eclipse appears to do, which is
to use javap to display the class and method signatures. That or I'll
use jad to decompile the whole source. My only issue with jad, is
that it is not up to date with the 1.5 byte code.
I also have automated importing done as well. The eclim server
request just returns a list of possible results to import for a given
request and the editor (Vim in this case) handles prompting the user
and updating the code.
Note: The Vim integration now requires Vim 7. Even though Vim 7 is
still alpha, I haven't had any major issues with it and the new
additions to the Vim scripting language are just too good to pass
up.
My next step is to start documenting everything and testing on a
Windows environment to ensure there aren't any compatibility issues.
After that I should be ready to put out a preliminary release. I'm
trying to be very careful about releasing anything too soon. The last
thing I want it to scare anyone off with a broken project that doesn't
seem to work properly.
2005-08-11
==========
Sourceforge site is up! Now it's just a matter of getting the ball
rolling again.
I'm hoping to have source code navigation working by the end of next
week. This includes the ability to simply hit <enter> on a class name,
method name, method call, etc. to jump to its declaration. Basically
I want to replace my previous Vim plug-in
(http://www.vim.org/scripts/script.php?script_id=1106) with the new
Eclipse one.
Before I put out any releases though, I want to have a comprehensive
set of documentation. For the first few releases, setup will probably
be pretty manual, with most of it occurring through the Eclipse
interface. Going forward, I want to move more of that functionality
into Vim.
vim:ft=eclimhelp

View file

@ -0,0 +1,328 @@
*changes.html*
History of Changes
******************
*2.7.0*
2.7.0 (Jul. 12, 2017)
=====================
Eclim:
- Eclim now supports, and requires, Eclipse 4.7 (Oxygen)
Git Log (2.7.0) (https://github.com/ervandew/eclim/compare/2.6.0...2.7.0)
*2.6.0*
2.6.0 (Jul. 21, 2016)
=====================
Eclim:
- Eclim now supports, and requires, Eclipse 4.6 (Neon)
Git Log (2.6.0) (https://github.com/ervandew/eclim/compare/2.5.0...2.6.0)
*2.5.0*
2.5.0 (Jul. 25, 2015)
=====================
Eclim:
- Eclim now supports, and requires, Eclipse 4.5 (Mars)
Git Log (2.5.0) (https://github.com/ervandew/eclim/compare/2.4.1...2.5.0)
*2.4.1*
2.4.1 (Jan. 22, 2015)
=====================
Install:
- Fixed unattended installation.
Eclim:
- Updated the search behavior across all eclim's supported
languages to now use vim's quickfix list instead of the location
list, and to only do so if there is more than one result.
- Updated eclim's sign support for quickfix results to now be
disabled by default.
- Updated eclim's signs to use more unique ids to support
multiple different sign types on a single line and to avoid
clashing with other plugins that may be setting signs on the same
lines as eclim.
Project:
- Added a |:ProjectRun| command to invoke your project's eclipse
run configuration. Thanks to Daniel Leong
- Added |:ProjectImportDiscover| to bulk import projects from a
common parent directory. Thanks to Kannan Rajah
Java:
- Added support for java debugging (vim-java-debug). Thanks to
Kannan Rajah
- Added a |:JavaNew| command to create new classes, interfaces,
etc in your project. Thanks to Daniel Leong
- Added ability to configure :JavaImpl to insert methods at the
current cursor position (|g:EclimJavaImplInsertAtCursor|). Thanks
to Daniel Leong
- Updated :JavaSearch to support sorting
(vim-java-search#org-eclim-java-search-sort) the results by
relative path. Thanks to Kannan Rajah
Groovy:
- Added support for groovy validation (vim-groovy-validate) and
code completion (vim-groovy-complete). Thanks to Yves Zoundi
Python:
- Fixed eclim's python support to work against the pydev 3.9.1
Scala:
- Scala support has been re-enabled now that ScalaIDE 4.0.0 for
Luna has been released.
Git Log (2.4.1) (https://github.com/ervandew/eclim/compare/2.4.0...2.4.1)
*2.4.0*
2.4.0 (Aug. 24, 2014)
=====================
Eclim:
- Eclim now supports, and requires, Eclipse Luna
- :EclimSettings renamed to :WorkspaceSettings to better reflect
what is being edited.
- Added :VimSettings (|vim-core-eclim#:VimSettings|) command to
make viewing/editing of eclim's vim client settings easier.
- All eclim make based commands (:Ant, :Mvn, etc.) will now use
dispatch (https://github.com/tpope/vim-dispatch) if available. If
you would like to disable this behavior, add the following to
your vimrc:
>
let g:EclimMakeDispatchEnabled = 0
<
- Lot of bugs have also been fixed.
Scala:
- Scala support is disabled in this release. I tried waiting for
a final release of ScalaIDE 4.0.0 for Luna, but I don't want to
hold up the rest of eclim any longer. If you want to use eclim's
scala support, you'll need to install the ScalaIDE 4.0.0
milestone and build eclim from the master git branch.
Git Log (2.4.0) (https://github.com/ervandew/eclim/compare/2.3.4...2.4.0)
*1.7.19*
1.7.19 (May 07, 2014)
=====================
Indigo release which includes most of the changes from 2.3.3 and
2.3.4, excluding the new pydev support. This will most likely be the
final eclim release for indigo.
Git Log (1.7.19) (https://github.com/ervandew/eclim/compare/1.7.18...1.7.19)
*2.3.4*
2.3.4 (Apr. 12, 2014)
=====================
Project:
- Fixed the projects command result on Windows.
Git Log (2.3.4) (https://github.com/ervandew/eclim/compare/2.3.3...2.3.4)
*2.3.3*
2.3.3 (Apr. 06, 2014)
=====================
Installer:
- Fixed running of the installer with Java 8.
Eclimd:
- Starting eclimd in the background is now done using the -b flag
instead of passing a start argument.
- Eclimd debug logging can now be enabled at startup using the
--debug flag.
Ant:
- Fixed ant target completion for newer ant versions (those that
require java 5).
C/C++:
- Fixed adding of includes etc. in the C++ sections of
:CProjectConfig.
- Fixed searching to include macro results.
- TODO/FIXME markers are now ignored by validation.
Html:
- Fixed indentation after unclosed <br> and <input> tags.
Java:
- Fixed possible infinite loop when adding imports using
:JavaImport.
- Fixed an edge case which caused an additional empty line to be
added between imports that should be grouped together when using
:JavaImport.
- Fixed :Java command if the main class has no package
declaration.
- Fixed issue with large portions of code being re-formatted when
applying a correction suggestion.
- TODO/FIXME markers are now ignored by validation.
- Some of the eclipse java code completion settings are now
available via :ProjectSettings.
Javascript:
- Let tern supersede eclim's limited javascript completion.
Maven/Ivy:
- Removed dependency searching since the search provider no
longer exists.
Python:
- Eclim's python support been re-written to use pydev instead of
rope.
Note: Any exiting eclim python projects you have should be
re-created with the new python nature:>
:ProjectCreate /path/to/project -n python
<
Scala:
- Disabled use of temp files which could cause some validation
errors.
- Added support for automated imports (|:ScalaImport|).
Xml:
- Fixed validation of xml files with no dtd/schema to not raise
errors on missing dtd for non-english users.
Git Log (2.3.3) (https://github.com/ervandew/eclim/compare/2.3.2...2.3.3)
*2.3.2* *1.7.18*
2.3.2 / 1.7.18 (Sep. 12, 2013)
==============================
Installer:
- Fixed extraction of scala vim files when installing scala
support.
Php:
- Fixed completion of php namespaces.
Git Log (2.3.2) (https://github.com/ervandew/eclim/compare/2.3.1...2.3.2)
Git Log (1.7.18) (https://github.com/ervandew/eclim/compare/1.7.17...1.7.18)
*2.3.1*
2.3.1 (Jul. 27, 2013)
=====================
Installer:
- Fixed dependencies to point at the Kepler update site.
Git Log (2.3.1) (https://github.com/ervandew/eclim/compare/2.3.0...2.3.1)
*2.3.0* *1.7.17*
2.3.0 / 1.7.17 (Jul. 21, 2013)
==============================
Java:
- :NewJarEntry (|:NewJarEntry_java|) now accepts up to 3
arguments allowing you to create the jar entry with the path to
the jar, path to the source, and the path to the javadocs.
- On javadoc search, all results, including results found in jar
files, will be fully translated to usable urls to be opened by
vim instead of sending jar results back to eclipse to let it open
them. With this change your chosen brower on the vim side will
always be used.
- Fix for import grouping by package on Kepler.
Php:
Warning: Reminder: The format of the h2 database used for php
searching and code completion has changed in Kepler which may
result in searching / code completion not returning any results,
both in eclim and in the standard eclipse php editor. To fix
this you'll need to stop eclipse, remove the old index, and then
restart:>
$ rm -r <your workspace>/.metadata/.plugins/org.eclipse.dltk.core.index.sql.h2/
<
Scala:
- Updated to require 3.0.1 of the Scala IDE which now supports
Kepler (for eclim 2.3.0 only). Since this version of the Scala
IDE seems to only support Scala 2.10.x now, the option to install
2.9.x version has been removed, however the indigo release of
eclim (1.7.17) still supports the Scala 2.9.x version of Scala
IDE 3.0.0.
Xml:
- |:XmlFormat| now uses the DOM3 APIs to improve the formatted
result, honoring your textwidth and indent settings.
Git Log (2.3.0) (https://github.com/ervandew/eclim/compare/2.2.7...2.3.0)
Git Log (1.7.17) (https://github.com/ervandew/eclim/compare/1.7.16...1.7.17)
*2.2.7* *1.7.16*
2.2.7 / 1.7.16 (Jul. 14, 2013)
==============================
Java:
- Fix for some completions on Kepler.
- Fix for rare case where an invalid classpath entry could result
in the .classpath file reverted to the eclipse default.
- |:JavaCallHierarchy| added to show the caller or callee
hierarchy of a method. Thanks to Alexandre Fonseca
Php:
Warning: The format of the h2 database used for php searching and
code completion has changed in Kepler which may result in
searching / code completion not returning any results, both in
eclim and in the standard eclipse php editor. To fix this you'll
need to stop eclipse, remove the old index, and then restart:>
$ rm -r <your workspace>/.metadata/.plugins/org.eclipse.dltk.core.index.sql.h2/
<
Ruby:
- Fixed the inserted completion text for some ruby libraries.
Scala:
- The graphical installer now includes a compiled eclim sdt
bundle for both scala 2.9.x and 2.10.x for which one will be
chosen for you if you already have the scala-ide installed,
otherwise you can pick one and the appropriate version of the
scala-ide will be installed for you.
Vimplugin:
- The option to force focusing of gvim with a simulated click is
now disabled by default, but when enabled, it should be less
likely to have unintended side affects.
Cygwin:
- Performance optimization for user's with many projects.
Installer:
- The installer will now properly shutdown eclimd instances
registered using the old non-json format.
Docs:
- Expanded the developer docs (development-index) to include docs
on creating new commands (development-commands) along with some
of the basics for adding new eclim plugins (development-plugins).
Git Log (2.2.7) (https://github.com/ervandew/eclim/compare/2.2.6...2.2.7)
Git Log (1.7.16) (https://github.com/ervandew/eclim/compare/1.7.14...1.7.16)
*2.2.6* *1.7.14*
2.2.6 / 1.7.14 (May 18, 2013)
=============================
Bug Fixes:
- Fixed eclimd to prevent incorrect addition of -d32 on 64bit
systems, which prevents eclimd from starting.
- Fix potential conflicts between syntastic validation vs eclim
validation (syntastic validation will be diabled if eclim
validation is available for the current file type).
- Many more fixes.
Android:
- Updated for ADT 22.0.0
C/C++:
- |:CCallHierarchy| now support showing callee tree.
Java:
- |:JavaImpl| now supports anonymous inner classes and will also
properly handle suggesting methods from a nested superclass.
Php:
- Eclim will no longer run php files through html validation by
default (see the Php Validation (vim-php-validate) doc for
settings to enable html validation).
Scala:
- Scala support updated for Scala IDE 3.0.0.
- Scala now supported on both versions of eclim (Juno and
Indigo).
Git Log (2.2.6) (https://github.com/ervandew/eclim/compare/2.2.5...2.2.6)
Git Log (1.7.14) (https://github.com/ervandew/eclim/compare/1.7.13...1.7.14)
Eclim Changes Archive (archive-changes)
vim:ft=eclimhelp

View file

@ -0,0 +1,348 @@
*cheatsheet.html*
Cheatsheet
**********
Here you will find a comprehensive list of eclim commands that you can
use as a reference.
Global Commands
===============
- :PingEclim (|vim-core-eclim#:PingEclim|) - Pings eclimd server.
- :ShutdownEclim (|vim-core-eclim#:ShutdownEclim|) - Shuts down
eclimd server.
- :VimSettings (|vim-core-eclim#:VimSettings|) - View / edit eclim's
vim client settings.
- :WorkspaceSettings (|vim-core-eclim#:WorkspaceSettings|) - View /
edit global workspace settings.
- :EclimDisable (|vim-core-eclim#:EclimDisable|) - Temporarily
disables communication with eclimd.
- :EclimEnable (|vim-core-eclim#:EclimEnable|) - Re-enables
communication with eclimd.
- :EclimHelp (|vim-core-eclim#:EclimHelp|) [helptopic] - View eclim
documentation in vim.
- :EclimHelpGrep (|vim-core-eclim#:EclimHelpGrep|) /regex/ - Search
the eclim documentation in vim.
Project Commands
================
- |:ProjectCreate| <folder> [-p <project_name>] -n <nature> ... [-d
<project_dependency> ...] - Create a new project.
- |:ProjectImport| <folder> - Import a project from an existing
eclipse project folder.
- |:ProjectList| - List current projects.
- |:ProjectSettings| [<project>] - View / edit project settings.
- |:ProjectDelete| <project> - Delete a project.
- |:ProjectRename| [<project>] <name> - Rename a project.
- |:ProjectMove| [<project>] <dir> - Move a project.
- |:ProjectRefresh| [<project> <project> ...] - Refresh supplied
list of projects against the current files on disk. If no project
names supplied, refresh the current project.
- |:ProjectRefreshAll| - Refresh all projects.
- |:ProjectBuild| [<project>] - Build the current or supplied
project.
- |:ProjectInfo| [<project>] - Echos info for the current or
supplied project.
- |:ProjectOpen| [<project>] - Opens a project.
- |:ProjectClose| [<project>] - Closes a project.
- |:ProjectNatures| [<project>] - View the configured natures for
one or all projects.
- |:ProjectNatureAdd| <project> [<nature> ...] - Add one or more
natures to a project.
- |:ProjectNatureRemove| <project> [<nature> ...] - Remove one or
more natures from a project.
- |:ProjectProblems| [<project>] - Populates vim's quickfix with all
eclipse build errors and warnings for the current, or specified
project, and all related projects.
- |:ProjectCD| - Changes the global current working directory to the
root directory of the current file's project (executes a :cd).
- |:ProjectLCD| - Changes the current working directory of the
current window to the root directory of the current file's project
(executes a :lcd).
- |:ProjectTree| [<project> <project> ...] - Opens navigable a tree
for one or more projects.
- |:ProjectsTree| - Opens a tree containing all projects.
- |:ProjectTab| <project> - Opens a new tab containing the project
tree and the tab local working directory set to the supplied
project's root.
- |:ProjectGrep| /<pattern>/ file_pattern [file_pattern ...] -
Issues a vimgrep starting at the root of the current project.
- |:ProjectGrepAdd| /<pattern>/ file_pattern [file_pattern ...] -
Issues a vimgrepadd starting at the root of the current project.
- |:ProjectLGrep| /<pattern>/ file_pattern [file_pattern ...] -
Issues a lvimgrep starting at the root of the current project.
- |:ProjectLGrepAdd| /<pattern>/ file_pattern [file_pattern ...] -
Issues a lvimgrepadd starting at the root of the current project.
- |:ProjectTodo| - Searches project files for todo / fixme patterns
and adds them to the location list.
- |:Todo| - Searches the current file for todo / fixme patterns and
adds them to the location list.
Android Commands
================
- |:AndroidReload| - Reloads the Android SDK environment in the
running eclimd/eclipse instance. Useful if you've made changes to
the SDK outside of eclipse (installed a new target platform, etc).
Ant Commands
============
- |:Ant| [<target> ...] - Execute ant from the current project.
- |:AntDoc| [<element>] - Find and open the documentation for the
element under the cursor or the element supplied as an argument.
- :Validate (|:Validate_ant|) - Validate the current ant build file.
C/C++ Commands
==============
- :Validate (|:Validate_c|) - Validate the current file.
- |:CSearch| [-p <pattern> -t <type> -s <scope> -x <context>] -
Search for classes, functions, methods, macros, etc.
- |:CSearchContext| - Find the element under the cursor based on its
context.
- |:CProjectConfigs| [project] - Open a temp buffer to view/modify
the current projects cdt configurations.
- |:CCallHierarchy| - Display the call hierarchy for the function or
method under the cursor.
Css Commands
============
- :Validate (|:Validate_css|) - Validate the current file.
Dtd Commands
============
- :Validate (|:Validate_dtd|) - Validate the current file.
Html Commands
=============
- :Validate (|:Validate_html|) - Validate the current file.
- |:BrowserOpen| - Opens the current file in your configured
browser.
Groovy Commands
===============
- :Validate (|:Validate_groovy|) - Validate the current file.
Ivy Commands
============
- |:IvyRepo| <path> - Sets the necessary IVY_REPO classpath variable
for supporting automatic updates to .classpath files upon ivy.xml
updates.
Java Commands
=============
- |:JavaGet| - Create a java bean getter method.
- |:JavaSet| - Create a java bean setter method.
- |:JavaGetSet| - Create both a java bean getter and setter method.
- |:JavaConstructor| - Creates class constructor, either empty or
based on selected class fields.
- |:JavaCallHierarchy| [-s <scope>] - Display the call hierarchy for
the method under the cursor.
- |:JavaHierarchy| - View the type hierarchy tree.
- |:JavaImpl| - View implementable / overridable methods from super
classes and implemented interfaces.
- |:JavaDelegate| - View list of methods that delegate to the field
under the cursor.
- |:JUnit| [testcase] - Allows you to execute junit test cases.
- |:JUnitFindTest| - Attempts to find the corresponding test for the
current source file.
- |:JUnitImpl| - Similar to :JavaImpl, but creates test methods.
- |:JUnitResult| [testcase] - Allows you to view the results of a
test case.
- |:JavaImport| - Import the class under the cursor.
- |:JavaImportOrganize| - Import undefined types, remove unused
imports, sort and format imports.
- |:JavaSearch| [-p <pattern>] [-t <type>] [-x <context>] [-s
<scope>] - Search for classes, methods, fields, etc. (With pattern
supplied, searches for the element under the cursor).
- |:JavaSearchContext| - Perform a context sensitive search for the
element under the cursor.
- |:JavaCorrect| - Suggest possible corrections for a source error.
- |:JavaDocSearch| - Search for javadocs. Same usage as
:JavaSearch.
- |:JavaDocComment| - Adds or updates the comments for the element
under the cursor.
- |:JavaDocPreview| - Display the javadoc of the element under the
cursor in vim's preview window.
- |:JavaRename| [new_name] - Rename the element under the cursor.
- |:JavaMove| [new_package] - Move the current class/interface to
another package.
- |:Java| - Executes the java using your project's main class.
- |:JavaClasspath| [-d <delim>] - Echos the project's classpath
delimited by the system path separator or the supplied delimiter.
- |:Javadoc| [file, file, ...] - Executes the javadoc utility
against all or just the supplied source files.
- |:JavaListInstalls| - List known JDK/JRE installs.
- |:JavaFormat| - Formats java source code.
- |:Checkstyle| - Invokes checkstyle on the current file.
- |:Jps| - Opens window with information about the currently running
java processes.
- :Validate (|:Validate_java|) - Manually runs source code
validation.
- |:JavaNew|- Creates a new class, interface, enum, or annotation.
Java .classpath Commands
========================
- :NewSrcEntry (|:NewSrcEntry_java|) <dir> - Add a new source dir
entry.
- :NewProjectEntry (|:NewProjectEntry_java|) <project> - Add a new
project entry.
- :NewJarEntry (|:NewJarEntry_java|) <file> [<src_path>
<javadoc_path>] - Add a jar entry.
- :NewVarEntry (|:NewVarEntry_java|) <VAR/file> [<src_path>
<javadoc_path>] - Add a new var entry.
- |:VariableList| List available classpath variables and their
corresponding values.
- |:VariableCreate| <name> <path> - Creates or updates the variable
with the supplied name.
- |:VariableDelete| <name> - Deletes the variable with the supplied
name.
Javascript Commands
===================
- :Validate (|:Validate_javascript|) - Validate the current
javascript file.
Log4j Commands
==============
- :Validate (|:Validate_log4j|) - Validate the current log4j xml
configuration file.
Maven Commands
==============
- |:Maven| [<goal> ...] - Execute maven 1.x from the current
project.
- |:Mvn| [<goal> ...] - Execute maven 2.x from the current project.
- |:MavenRepo| - Sets the necessary MAVEN_REPO classpath variable
for maven's (1.x) eclipse support.
- |:MvnRepo| - Sets the necessary M2_REPO classpath variable for
maven's (2.x) eclipse support.
Php Commands
============
- |:PhpSearch| [-p <pattern> -t <type> -s <scope> -x <context>] -
Search for classes, methods, and constants.
- |:PhpSearchContext| - Find the element under the cursor based on
its context.
- :Validate (|:Validate_php|) - Manually runs source code
validation.
Python Commands
===============
- |:PythonSearch| - Find the element under the cursor or, if
requested, all references to that element.
- |:PythonSearchContext| - Find the element under the cursor or its
references based on the current context in the file.
- :Validate (|:Validate_python|) - Validates the current file.
- |:DjangoManage| - Invokes django's manage.py from any file in the
same directory as your manage.py or in any of the child directories.
- |:DjangoFind| - Available when editing a django html template
file. Finds tag/filter definition, other template files, and static
files.
- |:DjangoTemplateOpen| - Available when editing a python file.
Finds the template referenced under the cursor.
- |:DjangoViewOpen| - Available when editing a python file. When
within a django url patterns definition, finds the view referenced
under the cursor.
- |:DjangoContextOpen| - Available when editing a python file.
Executes :DjangoViewOpen, :DjangoTemplateOpen, or
:PythonSearchContext depending on the context of the text under the
cursor.
Ruby Commands
=============
- |:RubySearch| [-p <pattern> -t <type> -s <scope> -x <context>] -
Search for modules, classes, methods, etc.
- |:RubySearchContext| - Find the element under the cursor based on
its context.
- :Validate (|:Validate_ruby|) - Manually runs source code
validation.
- |:RubyInterpreterAdd| [-n <name>] <path> - Add a ruby interpreter.
- |:RubyInterpreterRemove| <path> - Remove a ruby interpreter.
- |:RubyInterpreterList| - List the available ruby interpreters.
Scala Commands
==============
- |:ScalaSearch| - Search for the definition of the element under
the cursor.
- |:ScalaImport| - Import the type under the cursor.
- :Validate (|:Validate_scala|) - Manually runs source code
validation.
WebXml Commands
===============
- :Validate (|:Validate_webxml|) - Validate the current web.xml
file.
Xml Commands
============
- |:DtdDefinition| [<element>] - Open the current xml file's dtd and
jump to the element definition if supplied.
- |:XsdDefinition| [<element>] - Open the current xml file's xsd and
jump to the element definition if supplied.
- :Validate (|:Validate_xml|) [<file>] - Validates the supplied xml
file or the current file if none supplied.
- |:XmlFormat| - Reformats the current xml file.
Xsd Commands
============
- :Validate (|:Validate_xsd|) - Validate the current file.
Misc. Commands
==============
- |:LocateFile| [file] - Locates a relative file and opens it.
- |:Tcd| dir - Like :lcd but sets the tab's local working directory.
- |:DiffLastSaved| - Performs a diffsplit with the last saved
version of the currently modifed file.
- |:SwapWords| - Swaps two words (with cursor placed on the first
word). Supports swapping around non-word characters like commas,
periods, etc.
- |:Sign| - Toggles adding or removing a vim sign on the current
line.
- |:Signs| - Opens a new window containing a list of signs for the
current buffer.
- |:SignClearUser| - Removes all vim signs added via :Sign.
- |:SignClearAll| - Removes all vim signs.
- |:QuickFixClear| - Removes all entries from the quick fix window.
- |:LocationListClear| - Removes all entries from the location list
window.
- |:Buffers| - Opens a temporary window with a list of all the
currently listed buffers, allowing you to open or remove them.
- |:BuffersToggle| - Opens the buffers window if not open, otherwise
closes it.
- |:Only| - Closes all but the current window and any windows
excluded by g:EclimOnlyExclude.
- |:History| - View the local history entries for the current file.
- |:HistoryClear| - Clear the local history entries for the current
file.
- |:HistoryDiffNext| / |:HistoryDiffPrev| - Diff the current file
against the next/previous entry in the history stack.
- |:RefactorUndo| / |:RefactorRedo| - Undo / Redo the last
refactoring.
- |:RefactorUndoPeek| / |:RefactorRedoPeek| - Display a short
description of the refactoring to be undone / redone.
- |:OpenUrl| [url] - Opens a url in your configured web browser.
vim:ft=eclimhelp

View file

@ -0,0 +1,60 @@
*contribute.html*
Contribute
**********
Eclim is a project developed entirely in my spare time, so its growth
and success can be directly impacted by contributions from the
community. There are several ways in which you can contribute:
1. Documentation: The documentation can always use improvements.
Right now it is written entirely by me, and as such, it may not be
as detailed in some areas as it should. What the documentation
could really use is some help from its users:
- Point out any grammar or spelling errors, since some always
manage to slip through.
- Point out areas of the documentation that are vague and could
use elaboration.
- Write new guides to be included in the "Guides" section of the
site.
2. Bug Reports: Some people are a bit shy about speaking up and
reporting bugs. I want to urge people not to be. If something
doesn't work, report it. It may be a bug, but even if it is just a
configuration issue on your end, a misconception on how you thought
it should work, or some other quirk specific to your environment,
speak up. These can signal that some scripts may need to validate
or account for some aspect of the user's environment, or that the
documentation may need some work to ensure the user knows what to
expect. Any issue that goes unreported, goes unfixed, so please
report all issues, big and small.
3. Feature Requests: On occasion I receive a request or two, but I
would like to encourage more people to voice their opinion on what
they think should be added or changed in eclim. Once again,
nothing is too small to suggest. Chances are, that if you have
something that you would like added or changed, there are others
out there that would benefit from the same addition or
modification.
To see what features I have already thought about, you can view my
todo list (http://github.com/ervandew/eclim/blob/master/notes.txt).
4. Code Contributions: In addition to reporting bugs or requesting
features, you can also take that next step and implement a fix or
feature yourself. I just ask that you document your patch
accordingly so that I know exactly what you are attempting to fix
or add. Also, if you plan to add a medium or large feature, please
let me know prior to beginning your work. That way I can keep a
small list of who is working on what to avoid any duplication of
effort and link people together that wish to work on the same
feature. The list would also afford me the ability to contact you
should a change to eclim possibly affect what you are working on.
If you plan on making any code contributes, please read the
developer guide (development-gettingstarted) first.
5. Monetary Contributions: I am not currently accepting any
donations. My day job pays well, and I work on eclim for the love
of it. If you have money you would like to donate, it would go to
much better use if you donated to vim
(http://www.vim.org/sponsor/index.php), where it is used to help
children in Uganda. Feel free to mention your referral from eclim
if appropriate.
vim:ft=eclimhelp

View file

@ -0,0 +1,38 @@
*development-architecture.html*
Architecture
************
The eclim architecture is pretty straight forward. Commands issued by
a user in vim are relayed via nailgun
(http://www.martiansoftware.com/nailgun/) to the running eclim daemon
and the proper command implementation is then located and executed.
Here is a diagram showing the sequence in a bit more detail:
[diagram]
The commands which are executed on the eclimd side are also fairly
simple. They accept an object containing the command line parameters
passed into the eclim invocation and then return an object (String,
Collection, etc) which is converted to a json response. Below is a
simple class diagram showing the hierarchy of a couple typical
commands.
[diagram]
Another important aspect of eclim's architecture is support for
plugins. Plugins for eclim are bundled as eclipse plugins with their
auto start attribute set to false. When the eclim daemon starts it
will locate and load any eclipse plugin with an 'org.eclim.' prefix.
When a plugin is loaded, eclim will locate the plugin's required
resources provider and invoke its initialize method which will then
inject its resources (messages, command options, etc) into eclim and
register any new commands.
Here is graphical representation of this process:
[diagram]
vim:ft=eclimhelp

View file

@ -0,0 +1,241 @@
*development-commands.html*
Commands
********
For each eclipse feature that is exposed in eclim, there is a
corresponding command on the daemon which handles calling the
appropriate eclipse APIs and returning a result back to the client.
This page will walk you through creating a simple command to
familiarize you with the process.
Creating a Command
==================
Commands are simple classes which extend AbstractCommand and are
registered using the @Command annotation. They then define an execute
method which can return any object that can be serialized
appropriately using gson (http://code.google.com/p/google-gson/).
Here is an example of a trivial command which returns a map of the
arguments it was supplied, with the supplied project and file paths
converted to absolute paths and the file byte offset converted to a
character offset (eclim's vim function eclim#util#GetOffset() returns
the offset in bytes since getting a character offset in vim with multi
byte characters is less reliable, but most eclipse APIs expect
character offsets):
Note: Eclim's source code is grouped by bundles (org.eclim,
org.eclim.core, etc), each of which has java directory containing
the java source code for that bundle.
>
package org.eclim.plugin.core.command.sample;
import java.util.HashMap;
import org.eclim.annotation.Command;
import org.eclim.command.CommandLine;
import org.eclim.command.Options;
import org.eclim.plugin.core.command.AbstractCommand;
import org.eclim.plugin.core.util.ProjectUtils;
import org.eclipse.core.resources.IProject;
@Command(
name = "echo",
options =
"REQUIRED p project ARG," +
"REQUIRED f file ARG," +
"REQUIRED o offset ARG," +
"OPTIONAL e encoding ARG"
)
public class EchoCommand
extends AbstractCommand
{
@Override
public Object execute(CommandLine commandLine)
throws Exception
{
String projectName = commandLine.getValue(Options.PROJECT_OPTION);
String file = commandLine.getValue(Options.FILE_OPTION);
IProject project = ProjectUtils.getProject(projectName);
// translates client supplied byte offset to a character offset using the
// 'project', 'file', 'offset', and 'encoding' command line args.
int offset = getOffset(commandLine);
HashMap<String,Object> result = new HashMap<String,Object>();
result.put("project", ProjectUtils.getPath(project));
result.put("file", ProjectUtils.getFilePath(project, file));
result.put("offset", offset);
if (commandLine.hasOption(Options.ENCODING_OPTION)){
result.put("encoding", commandLine.getValue(Options.ENCODING_OPTION));
}
return result;
}
}
<
When registering the command with the @Command annotation, you give it
a name and a comma separated list of options. Each option consists of
4 parts in the form of:
>
REQUIRED|OPTIONAL s longname ARG|NOARG|ANY
<
Where each part is defined as:
1. REQUIRED or OPTIONAL
2. a single letter short name for the option
3. a long name for the option
4. whether the option requires an argument, no argument, or can
have any number of additional arguments. In the case of ANY, you
should only have one option with that value and when running the
command from the command line, that option should be supplied last.
That should give you the basics on what's involved with creating a new
command, but the biggest hurdle for creating most commands is locating
and deciphering the eclipse API calls that are necessary to implement
the feature you want. Unfortunately most of the eclipse code that
you'll need to hook into will most likely have little to no
documentation so you're going to have to dig through the eclipse code.
Eclim does provide a couple ant tasks to at least help you to quickly
extract any docs or source code found in your eclipse install:
- eclipse.doc: This target will extract any doc jars from your
eclipse install to a 'doc' directory in your eclipse home (or user
local eclipse home).
- eclipse.src: This target will extract any src jars from your
eclipse install to a 'src' directory in your eclipse home (or user
local eclipse home). If you download the sdk version of eclipse then
the jdt and all the core eclipse source will be available. Some
other plugins provide sdk versions which include the source code and
this target can extract those as well, but some plugins don't seem
to have this option when installing via eclipse's update manager
(and may not include the source when installed from a system package
manager). For those you can often download a zip version of their
update site which should include source bundles. Once you've
extracted that file, you can tell this target to extract source
bundles from a specified directory. Here is an example of extracting
the source from an unpacked dltk update site:
>
$ ant -Dsrc.dir=/home/ervandew/downloads/dltk-core-5.0.0/plugins eclipse.src
<
Running a Command
=================
Once you've created your command you then need to compile the code
using eclim's ant build file. After you've done that you can then
start eclimd and execute your command from the command line to test
it:
>
$ eclim -pretty -command echo -p eclim -f org.eclim.core/plugin.properties -o 42 -e utf-8
<
Note: As you are developing your commands, you can avoid restarting
eclimd after every change by using eclim's reload command which will
reload all of eclim's plugin bundles with the exception of
org.eclim.core (so unfortunately it won't help with our example
above if we put that command in the org.eclim.core bundle):>
$ eclim -command reload
<
Adding to Vim
=============
Continuing with our echo command example, we can add the command to
vim by first defining a new vim command in
org.eclim.core/vim/eclim/plugin/eclim.vim:
Note: If the command should only be available for a specific file
type, then you'd put it in a vim/eclim/ftplugin/somefiltetype.vim
file instead.
>
command EclimEcho :call eclim#echo#Echo()
<
Now that we've created the command, we then need to define our
eclim#echo#Echo() function accordingly in
org.eclim.core/vim/eclim/autoload/eclim/echo.vim:
>
" Script Variables {{{
let s:echo_command =
\ '-command echo -p "<project>" -f "<file>" ' .
\ '-o <offset> -e <encoding>'
" }}}
function! eclim#echo#Echo() " {{{
if !eclim#project#util#IsCurrentFileInProject(0)
return
endif
let project = eclim#project#util#GetCurrentProjectName()
let file = eclim#project#util#GetProjectRelativeFilePath()
let command = s:echo_command
let command = substitute(command, '<project>', project, '')
let command = substitute(command, '<file>', file, '')
let command = substitute(command, '<offset>', eclim#util#GetOffset(), '')
let command = substitute(command, '<encoding>', eclim#util#GetEncoding(), '')
let response = eclim#Execute(command)
" if we didn't get back a dict as expected, then there was probably a
" failure in the command, which eclim#Execute will handle alerting the user
" to.
if type(response) != g:DICT_TYPE
return
endif
" simply print the response for the user.
call eclim#util#Echo(string(response))
endfunction " }}}
<
And that's all there is to it. After re-building eclim, restarting
eclimd, and restarting vim, you can now execute the command :EclimEcho
to see the response printed in vim.
Now that you know the basics, you can explore the many existing eclim
commands found in the eclim source code to see detailed examples of
how to access various eclipse features to expose them for use in vim
or the editor of your choice.
You should also take a look at the eclim Plugins (development-plugins)
documentation which documents how to create a new eclim plugin,
including information on adding new eclim settings, managing the
plugin's dependencies through its META-INF/MANIFEST.MF, etc.
vim:ft=eclimhelp

View file

@ -0,0 +1,224 @@
*development-gettingstarted.html*
Developers Guide
****************
This guide is intended for those who wish to contribute to eclim by
fixing bugs or adding new functionality.
Checking out the code and building it.
======================================
1. Check out the code:
----------------------
>
$ git clone git://github.com/ervandew/eclim.git
<
2. Build eclim:
---------------
>
$ cd eclim
$ ant -Declipse.home=/your/eclipse/home/dir
<
This will build and deploy eclim to your eclipse and vim directories.
Warning: Building eclim as root is highly discouraged. If your
eclipse install is only writable as root, you can supply the
eclipse.local property to tell eclim where your eclipse user local
directory is located and eclimd will be installed there (make sure
to replace <version> portion of the path below accordingly):>
$ ant \
-Declipse.home=/opt/eclipse \
-Declipse.local=$HOME/.eclipse/org.eclipse.platform_<version>
<
If you do not yet have a .eclipse directory in your home directory,
you can run either of the following commands to create it:>
$ ant -Declipse.home=/opt/eclipse eclipse.init
<
or>
$ /path/to/eclipse/eclipse -initialize
<
Note: If your eclipse home path contains a space, be sure to quote
it:>
> ant "-Declipse.home=C:/Program Files/eclipse"
<
Note: If your vimfiles directory is not located at the default
location for your OS, then you can specify the location using the
"vim.files" property:>
$ ant -Dvim.files=<your vimfiles dir>
<
When the build starts, it will first examine your eclipse installation
to find what eclipse plugins are available. It will then use that list
to determine which eclim features/plugins should be built and will
output a list like the one below showing what will be built vs what
will be skipped:
>
[echo] ${eclipse}: /opt/eclipse
[echo] # Skipping org.eclim.adt, missing com.android.ide.eclipse.adt
[echo] # Skipping org.eclim.dltk, missing org.eclipse.dltk.core
[echo] # Skipping org.eclim.dltkruby, missing org.eclipse.dltk.ruby
[echo] # Skipping org.eclim.pdt, missing org.eclipse.php
[echo] Plugins:
[echo] org.eclim.cdt
[echo] org.eclim.jdt
[echo] org.eclim.pydev
[echo] org.eclim.sdt
[echo] org.eclim.wst
<
In this case we can see that four eclim plugins will be skipped along
with the eclipse feature that would be required to build those
plugins.
If you don't want to supply the eclipse home directory, or any other
properties, on the command line every time you build eclim, you can
create a user.properties file at the eclim source root and put all
your properties in there:
>
$ vim user.properties
eclipse.home=/opt/eclipse
eclipse.local=${user.home}/.eclipse/org.eclipse.platform_<version>
vim.files=${user.home}/.vim/bundle/eclim
<
Note: The eclim vim help files, used by the :EclimHelp
(|vim-core-eclim#:EclimHelp|) command, are not built by default. To
build these you first need to install sphinx
(http://sphinx-doc.org), then run the following command:>
$ ant vimdocs
<
This target also supports the vim.files property if you want the
docs deployed to a directory other than the default location.
Warning: Debian/Ubuntu users: The debian version of sphinx has
unfortunately been patched to behave differently than the upstream
version, resulting in one or more eclim supplied sphinx extensions
not loading. Another issue you may run into is the docutils
package, which sphinx depends on, is outdated on debian/ubuntu,
resulting in another set of errors.So to get around these issues
you'll need to install sphinx using pip
(http://pip.readthedocs.org/en/latest/index.html) or similar.
3. Add eclim as a project:
--------------------------
Once you built eclim, you can then start the daemon
(eclimd#eclimd-start) and add eclim as a project:
>
:ProjectImport /path/to/git/checkout/of/eclim
<
*coding-style*
Coding Style
============
When contributing code please try to adhere to the coding style of
similar code so that eclim's source can retain consistency throughout.
For java code, eclim includes a checkstyle configuration which can be
run against the whole project:
>
$ ant checkstyle
<
or against the current java file from within vim:
>
:Checkstyle
<
*development-patches*
Developing / Submitting Patches
===============================
The preferred means of developing and submitting patches is to use a
github fork. Github provides a nice guide to forking
(http://help.github.com/forking/) which should get you started.
Although using a github fork is preferred, you can of course still
submit patches via email using git's format-patch command:
>
$ git format-patch -M origin/master
<
Running the above command will generate a series of patch files which
can be submitted to the eclim development group
(http://groups.google.com/group/eclim-dev).
What's Next
===========
Now that you're familiar with the basics of building and patching
eclim, the next step is to familiarize yourself with the eclim
architecture and to review the detailed docs on how new features are
added.
All of that and more can be found in the eclim development docs
(development-index).
vim:ft=eclimhelp

View file

@ -0,0 +1,24 @@
*development-index.html*
Development Docs
****************
Developers Guide (development-gettingstarted)
Architecture (development-architecture)
Explains the underlying architecture that eclim utilizes including
an overview of the call sequence from vim to eclipse.
Commands (development-commands)
Details the process of adding a new command to vim which calls to a
corresponding implementation in eclipse.
Plugins (development-plugins)
Details the process of adding a new plugin to eclim.
Building the eclim installer (development-installer)
Short guide on how to build the eclim installer.
... More To Come
vim:ft=eclimhelp

View file

@ -0,0 +1,74 @@
*development-installer.html*
Building the eclim installer
****************************
Unless you are working on improvements to the eclim installer, you
shouldn't ever need to build it, but should the need arise here are
the instructions for doing so.
To build the installer you first need a couple external tools
installed:
- sphinx (http://sphinx-doc.org): Sphinx is used to build the eclim
documentation which is included in the installer.
Eclim also uses a custom sphinx theme which is included in eclim as
a git submodule. So before you can build the installer you will need
to initialize the submodule:
>
$ git submodule init
$ git submodule update
<
- graphviz (http://www.graphviz.org/): The docs include a few uml
diagrams which are generated using plantuml
(http://plantuml.sourceforge.net/) (included in the eclim source
tree) which in turn requires graphviz (http://www.graphviz.org/).
- formic (http://github.com/ervandew/formic): The eclim installer
has been developed using the formic framework, and requires it to
build the installer distributables. Formic doesn't currently have
an official release, so you'll need to check out the source code:
>
$ git clone git://github.com/ervandew/formic.git
<
After checking out the code, you'll need to build the formic
distribution:
>
$ cd formic
$ ant dist
<
Then extract the formic tar to the location of your choice
>
$ tar -zxvf build/dist/formic-0.2.0.tar.gz -C /location/of/your/choice
<
Once you have installed the above dependencies, you can then build the
eclim installer with the following command.
>
$ ant -Dformic.home=/your/formic/install/dir dist
<
In lieu of supplying the formic home on the command line, you can
instead put it in a user.properties file at the eclim source root:
>
$ vim user.properties
formic.home=/your/formic/install/dir
<
vim:ft=eclimhelp

View file

@ -0,0 +1,226 @@
*development-plugins.html*
Plugins
*******
Note: This guide is a work in progress. If in the process of writing
a new plugin you find anything here that is unclear or missing,
please don't hesitate to post to the eclim-dev
(http://groups.google.com/group/eclim-dev) mailing list with
questions, suggestions, etc.
To allow eclim to support different languages, eclim is broken up into
eclipse plugins, each of which depend on a corresponding eclipse
feature which provides support for that language. When you install or
build eclim, it will examine your eclipse install to determine which
features are available and will add the corresponding eclim plugins to
expose those features. This page documents the core aspects of what
goes into the creation of a new eclim plugin.
Bootstrapping the plugin artifacts
==================================
Eclim includes a set of templates to help you bootstrap a new plugin.
To utilize them you can run the following ant target:
>
$ ant plugin.create
<
You will be prompted to enter a name for this plugin along with some
guidelines on choosing an appropriate name.
Once you've chosen a name, the plugin's directory structure will be
created and populated with bare bones version of the required
artifacts. Eclim's build.xml file will also be updated to include a
target to the new plugin's unit test target.
Updating the initial artifacts
==============================
After you've bootstrapped your plugin, you can now start updating the
generated artifacts:
build_<plugin_name>.gant
------------------------
The first file you'll need to modify is a gant file for your plugin.
The main eclim build.gant script will load this file during the build
process to determine what the plugin's eclipse dependency is, so it
knows whether it can be built against the target eclipse install. So
the first thing we need to do is to fill in that information by
updating the feature_<plugin_name> variable with the name of the
eclipse feature that this plugin depends on. For example, the eclim
jdt plugin has this set to 'org.eclipse.jdt'. The build script will
look in the features directory of your eclipse install (including the
dropins and your user local eclipse dir if set), to find this feature,
so the value you set, must be found in one of those locations (the
version suffixes will be removed from the features in order to match
it against the value you've set).
You'll also notice that there is a unit test target in the gant file.
You can ignore that for now.
META-INF/MANIFEST.MF
--------------------
The next file to note is the plugin's META-INF/MANIFEST.MF. This is
the file that eclipse will use to determine how to load the bundle and
what to include in its classpath. The only part of this file that you
should edit is the Require-Bundle: section. This is a comma separated
list of bundles (or plugins) which this bundle depends on. When this
bundle is loaded only those bundles listed here will be available in
the classpath. So when you start running commands you've written
later, if you receive a ClassNotFoundException, that is likely due to
the bundle containing that class not being listed in your plugin's
Require-Bundle: list. At this point you probably don't know yet what
bundles you need to add to this list. When you start writing commands
for your plugin, you'll have to find out which bundles contain the
classes imported from the eclipse plugin you are integrating with, and
you'll need to add those bundles accordingly.
It's also worth noting that eclim provides a custom classpath
container which scans the manifest of each eclim plugin and loads the
required bundles of each into the classpath. So when adding new
bundles, if you want validation, search, code completion, etc to work
with classes from those new bundles, you'll have to restart the eclim
daemon. While restarting can be annoying, this is generally better
than having to add/remove entries from the .classpath file or worrying
about one user having different bundle version numbers from another.
PluginResources.java
--------------------
At this point you'll typically need to start customizing your plugin's
org.eclim.<name>/java/org/eclim/plugin/<name>/PluginResources.java
file. Here is where you will map a short alias to the project nature,
or natures, of the plugin you are integrating with, register a project
manager for initializing project's for this plugin, register any
plugin settings that users can configure, etc. You'll be doing all
this inside of the initialize method which has been generated for you.
Project Nature
~~~~~~~~~~~~~~
You'll first need to find out where the plugin's nature id is defined.
Here are some examples that should give you an idea of where to look:
- jdt: org.eclipse.jdt.core.JavaCore.NATURE_ID
- cdt:
- org.eclipse.cdt.core.CProjectNature.CNATURE_ID
- org.eclipse.cdt.core.CCProjectNature.CC_NATURE_ID
- dltkruby: org.eclipse.dltk.ruby.core.RubyNature.NATURE_ID
- adt: com.android.ide.eclipse.adt.AdtConstants.NATURE_DEFAULT
One way to find it is to open up the .project file in a project
containing the nature, locate the fully qualified name in the
<natures> section, then grep the plugin's code for that name.
Once you have the reference to the nature id, you can then create a
public static variable called NATURE:
>
public static final String NATURE = SomeClass.NATURE_ID;
<
You'll be using this constant as the key to register features for
project containing this nature, but first we'll register a short alias
for this nature since the actual nature id tends to be long and
unstandardized, and we don't want users to have to type it out when
creating projects from eclim:
>
ProjectNatureFactory.addNature("shortname", NATURE);
<
Project Manager
~~~~~~~~~~~~~~~
The next thing you'll probably need to do is to create a project
manager for your project
(org.eclim.<name>/java/org/eclim/plugin/<name>/project/SomeProjectManager.java).
The project manager is responsible for performing any post create,
update, delete, or refresh logic required for projects of this nature.
This logic can include things such as creating an initial
classpath/buildpath, validate the classpath/buildpath on update,
forcing a full update of the search index on refresh, or any number of
other things.
Overriding the create method will almost certainly be necessary, but
the logic you'll need here varies widely. Finding what you'll need is
a matter of digging through the parent plugin's source code, typically
looking for the project creation wizard class, to see what it does to
create a project of this nature and later comparing the created
artifacts from your code against those of a project created from the
eclipse gui. This can be a difficult hurdle to get past for someone
doing this the first time, so please don't be shy about asking for
help on the eclim-dev (http://groups.google.com/group/eclim-dev)
mailing list.
Eclim does provide a couple ant tasks to at least help you to quickly
extract any docs and source code found in your eclipse install:
- eclipse.doc: This target will extract any doc jars from your
eclipse install to a 'doc' directory in your eclipse home (or user
local eclipse home).
- eclipse.src: This target will extract any src jars from your
eclipse install to a 'src' directory in your eclipse home (or user
local eclipse home). If you download the sdk version of eclipse then
the jdt and all the core eclipse source will be available. Some
other plugins provide sdk versions which include the source code and
this target can extract those as well, but some plugins don't seem
to have this option when installing via eclipse's update manager
(and may not include the source when installed from a system package
manager). For those you can often download a zip version of their
update site which should include source bundles. Once you've
extracted that file, you can tell this target to extract source
bundles from a specified directory. Here is an example of extracting
the source from an unpacked dltk update site:
>
$ ant -Dsrc.dir=/home/ervandew/downloads/dltk-core-5.0.0/plugins eclipse.src
<
Once you've created your project manager, you then map it to your
plugin's nature inside of your PluginResources.initialize method like
so:
>
ProjectManagement.addProjectManager(NATURE, new SomeProjectManager());
<
Project Settings
~~~~~~~~~~~~~~~~
At this point you should have the minimum of what is needed for a new
plugin. Hopefully you can now create new projects with your plugin's
defined nature. The next step would be to start adding commands
(development-commands) to provide validation, code completion, etc.
The remaining items in this list are not required to continue. They
provide you with the ability to setup your own preferences or to
expose the parent plugin's defined preferences inside of vim. When
you've come to the point that you need to work with preferences, then
feel free to come back here and continue reading.
To Be Continued...
vim:ft=eclimhelp

View file

@ -0,0 +1,437 @@
*eclimd.html*
The Eclim Daemon
****************
*eclimd-headless*
Headless eclipse server
=======================
The most mature usage scenario that eclim provides, is the running of
a headless eclipse server and communicating with that server inside of
vim. Starting and stopping of the headless eclipse instance is
detailed below.
*eclimd-start*
Starting eclimd
Linux / Mac / BSD (and other unix based systems): To start eclimd from
linux, simply execute the eclimd script found in your eclipse root
directory: $ECLIPSE_HOME/eclimd
Note: When starting the eclim daemon, you must start it as the same
user who will be running vim.
Windows: The easiest way to start eclimd in windows is to double click
on the eclimd.bat file found in your eclipse root directory:
%ECLIPSE_HOME%/eclimd.bat
Note: Even though an eclipse gui is not started in eclim's headless
mode, eclipse still requires a running X server to function. To run
eclimd on a truely headless server, please see the headless guide
(install#install-headless).
*eclimd-stop*
Stopping eclimd
To cleanly shutdown eclim use any one of the following.
- From Vim:
>
:ShutdownEclim
<
- From a console:
>
$ $ECLIPSE_HOME/eclim -command shutdown
<
- Lastly you can use Ctrl-C at the console if you are running eclimd
in the foreground, or issue a kill to the eclimd java process.
>
$ kill *pid*
<
You will need to kill the java process since killing the eclimd or
eclipse process will not do so. While eclim provides a shutdown
hook to support a clean shutdown when the java process is killed in
this manner, it is still recommended that you utilize one of the
first two methods instead, and reserve this as a last resort. Also
note that when killing the java process eclipse will pop up an alert
dialog notifying you that the java process was terminated underneath
it. This is nothing to be alarmed about.
*eclimd-headed*
Headed eclipse server
=====================
For users that find themselves periodically needing the eclipse gui,
or otherwise wanting to keep the gui open while using eclim, there is
support for running the eclim server inside of a headed eclipse
instance.
Starting eclimd
The eclim daemon inside of eclipse is implemented as an eclipse view
which can be found via:
Window ‣ Show View ‣ Other ‣ Eclim ‣ eclimd
The view will be opened in a new tab in the same pane as the
"Problems" tab, as shown below.
[image]
Note: By default, if you open an instance of gvim from within
eclipse, the eclimd view will be opened for you if necessary. This
behavior is configurable via the Vimplugin preferences.
Stopping eclimd
As long as the eclimd tab is open then the eclim daemon will be
running. Stopping the eclim daemon is just a matter of closing the
eclimd tab. Also note that leaving the tab open and closing eclipse
will shutdown the daemon as well, and on the next start of eclipse the
tab will be opened, but the eclim daemon will not start until the tab
is forced to display itself. In other words, the daemon will not start
until the eclimd tab is the active tab in that group.
*gvim-embedded*
Embedded gvim
=============
Note: Embedding is only supported on Windows and Unix systems (where
gvim is compiled with the gtk gui).Embedding of macvim for OSX is
not supported since macvim does not currently have the ability to be
embedded like gvim. Macvim can still be used to open files from
eclipse, but macvim will open as an external editor. Also note that
macvim snapshots 56 through 63 contain a bug
(https://github.com/b4winckler/macvim/pull/22) where opening a file
from eclipse will open an instance of macvim, but the file will not
be loaded into that instance.
Another feature provided by eclim for those who prefer to work inside
of the eclipse gui, is the embedding of gvim inside of eclipse. This
feature is provided by an eclim local fork of vimplugin
(http://vimplugin.org). The feature adds a new editor to eclipse
which allows you to open files in gvim by right clicking the file name
in the eclipse tree and then selecting:
Open With ‣ Vim
[image]
Please note that if you want to use supported eclipse features (code
completion, validation, searching, etc.) from the embedded gvim
editor, you must have the eclimd view open.
Note: If you'd like to have the embedded gvim editor as the default
for one or more file types, you can configure it to be in your
eclipse preferences:Window ‣ Preferences ‣ General ‣ Editors ‣ File
Associations
The eclim installer should take care of locating your gvim
installation for use inside of eclipse, but in the event that it could
not locate it, you can set the location and other settings via the
vimplugin preferences:
Window ‣ Preferences ‣ Vimplugin
For MacVim users on OSX, the eclim installer will attempt to locate
MacVim's mvim script on your path. If it's not found you can set the
location of that script in the Vimplugin preferences:
Eclipse ‣ Preferences ‣ Vimplugin
Note: If you have a non-eclim version of vimplugin installed you
should remove it prior to using the eclim version.
Note: Some users have reported issues with the embedded gvim's
command line being cut off or possible rendering issues when
scrolling through the file. If you experience either of these
issues, try adding the following to your vimrc file, which should
hopefully resolve those problems:>
set guioptions-=m " turn off menu bar
set guioptions-=T " turn off toolbar
<
Additionally, some users have reported that gvim's left scrollbar
may also need to be disabled:>
set guioptions-=L " turn off left scrollbar
set guioptions-=l
<
*eclim-gvim-embedded-focus*
Embedded gvim focus
In some windowing environments, the embedded gvim is treated more like
a separate window. The result of this is that clicking the eclipse tab
(or using tab focusing keyboard shortcuts) may focus that tab, but it
won't focus the embedded gvim on that tab. Eclim adds a setting to
vimplugin which when enabled, will attempt to simulate a click on the
embedded gvim window to force it to focus:
Window ‣ Preferences ‣ Vimplugin ‣ Force gvim focus via automated
click
*eclim-gvim-embedded-shortcuts*
Eclipse/Vim key shortcuts in embedded gvim
Depending on your OS and windowing system, when the embedded gvim has
focus, you will fall into one of two groups:
1. In the first group of users, all key presses are received by
eclipse prior to sending them to gvim.
For this group, when typing a possible key shortcut (ctrl-n for
example), eclipse will first evaluate that key stroke to see if
there are any eclipse key bindings registered. If there are, then
eclipse will run the associated command and the key stroke is never
sent to gvim. If no key binding is found, then eclipse will pass
the key stroke through to gvim. What this means for you is that
for any gvim key mappings that you use that have an eclipse key
binding, they will not be evaluated inside of gvim. So, if you
encounter this issue, you'll need to remap the keys in vim or
eclipse. To remove the key binding from the eclipse side, simply
open the "Keys" preferences page:
Window ‣ Preferences ‣ General ‣ Keys
Then find the entry in the list that corresponds with the key
binding you want to remove, select it, and hit the "Unbind Command"
button.
Note: By default eclim will auto-remove a couple of the standard
eclipse bindings whenever an embedded gvim editor has focus and
then restore them with a non-gvim editor gains focus:
- Ctrl+U: in eclipse this runs "Execute", but in gvim this is
needed to run code completion (ex. ctrl-x ctrl-u).
- Ctrl+N: in eclipse this runs the "New" wizard, but in gvim
this is also needed as a part of code completion, to scroll
through the results.
- Ctrl+V: in eclipse this pastes text from the clipboard
(though not into gvim), but in gvim this is needed for column
wise visual selections.
- Ctrl+W: in eclipse this closes a tab, but in gvim this is
needed to switch windows (ex. ctrl-w j).
- Ctrl+X: in eclipse this cuts a selection to the clipboard,
but in gvim this is needed to start various insert completions
(ex. ctrl-x ctrl-u).
- Delete: prevent the eclipse delete key binding from
suppressing delete attempts in the embedded gvim.
*FeedKeys*
2. In the second group, all key presses are received by gvim and
not evaluated at all by eclipse.
For this group of users, you may have an eclipse key shortcut that
you like to use (Shift+Ctrl+R for example), but when you hit that
key combination, it will be evaluated by gvim instead of eclipse.
To remedy this situation, eclim provides a means to map eclipse
shortcuts inside of gvim. To register a shortcut, simply add your
mappings to your vimrc, gvimrc, or other standard gvim file like
so:
>
" maps Ctrl-F6 to eclipse's Ctrl-F6 key binding (switch editors)
nmap <silent> <c-f6> :call eclim#vimplugin#FeedKeys('Ctrl+F6')<cr>
" maps Ctrl-F7 to eclipse's Ctrl-F7 key binding (switch views)
nmap <silent> <c-f7> :call eclim#vimplugin#FeedKeys('Ctrl+F7')<cr>
" maps Ctrl-F to eclipse's Ctrl-Shift-R key binding (find resource)
nmap <silent> <c-f> :call eclim#vimplugin#FeedKeys('Ctrl+Shift+R')<cr>
" maps Ctrl-M to eclipse's Ctrl-M binding to maximize the editor
nmap <silent> <c-m> :call eclim#vimplugin#FeedKeys('Ctrl+M', 1)<cr>
<
The value supplied to the FeedKeys function must be an eclipse
compatible key binding string as found in:
Windows ‣ Preferences ‣ General ‣ Keys
Be sure to notice the extra argument to the FeedKeys function in
the last mapping. Supplying 1 as the arg will result in the
refocusing of gvim after the eclipse key binding has been executed.
*eclimrc*
~/.eclimrc
==========
On unix platforms (linux, mac, bsd) eclim supports an optional
.eclimrc file located in your home directory. In this file you may
supply any system properties or vm args which you would like passed to
eclimd at startup. The format of this file is the same as the
standard java properties file format with the exception of any vm args
which you would like to include.
Ex.
>
# Bind eclimd to all interfaces
nailgun.server.host=0.0.0.0
# Specifies the port that nailgun / eclimd listens on for client requests.
nailgun.server.port=10012
# Specifies the workspace directory to use
# See $ECLIPSE_HOME/configuration/config.ini for other osgi properties.
osgi.instance.area.default=@user.home/myworkspace
# increase heap size
-Xmx256M
<
The eclim client will also utilize this file, but only to determine
the nailgun server port should you choose to change the default.
Note: Your system must have perl and sed available so that eclim can
process your .eclimrc file.
Both the eclim and eclimd scripts also support a -f argument allowing
you to specify an alternate location for your .eclimrc:
>
$ eclimd -f ~/.my_eclimrc
$ eclim -f ~/.my_eclimrc -command ping
<
eclimd logging
==============
Eclimd utilizes log4j for all of its logging. As such, the logging
can be configured via the
$ECLIPSE_HOME/plugins/org.eclim_version/log4j.xml file.
By default, eclimd writes all logging info to both the console and to
a log file in your workspace: <workspace>/eclimd.log
*eclimd-multiworkspace*
Multiple Workspaces
===================
Running eclim against more than one eclipse workspace can be
accomplished by running multiple eclimd instances. You must configure
each instance to run nailgun on a unique port and supply the path to
the workspace you which that instance to use. Once your eclimd
instances are up and running the vim client will automatically
determine which server to send requests to based on your context. In
some cases you may be prompted for which workspace to use if one
cannot be determined for you.
Below are some different ways in which you can configure your eclimd
instances:
1. All Users: Supply the nailgun port and eclipse workspace path
when starting eclimd:
>
$ eclimd -Dosgi.instance.area.default=@user.home/workspace1 -Dnailgun.server.port=9091
$ eclimd -Dosgi.instance.area.default=@user.home/workspace2 -Dnailgun.server.port=9092
<
If you are using the eclimd view in the eclipse gui, then you can
start the eclipse gui with the desired nailgun server port (note
that you must place the -vmargs option before the list of jvm
arguments):
>
$ eclipse -vmargs -Dnailgun.server.port=9092
<
2. Linux, OSX, BSD Users: Specify the port and workspace in eclimrc
files and start eclimd with the -f or --file argument:
>
$ vim ~/.eclimrc1
osgi.instance.area.default=@user.home/workspace1
nailgun.server.port=9091
$ vim ~/.eclimrc2
osgi.instance.area.default=@user.home/workspace2
nailgun.server.port=9092
$ eclimd -f ~/.eclimrc1
$ eclimd --file ~/.eclimrc2
<
Note: The -f/--file argument is not supported by eclipse so the
above option is only available when using a headless eclimd
instance.
3. Windows Users: Create Windows shortcuts:
- In Windows Explorer, open your eclipse folder.
- Hold down the right mouse button and drag the eclimd.bat file
to where you want the shortcut to exist (like your desktop) and
release the right mouse button.
- Choose "Create Shortcut(s) Here"
- Right click the shortcut and choose "Properties"
- On the "Shortcut" tab edit the "Target:" field and append:
-Dosgi.instance.area.default=@user.home/workspace1
-Dnailgun.server.port=9091
- Repeat this process for your other workspaces.
*eclimd-extdir*
Hosting third party nailgun apps in eclimd
==========================================
Since nailgun provides a simple way to alleviate the startup cost of
the jvm, other projects utilize it as well. However, running several
nailgun servers isn't ideal, so eclim supports hosting other nailgun
apps via an ext dir where you can drop in jar files which will be made
available to eclim's nailgun server.
The ext dir that eclim reads from is located in your vim files
directory:
Linux / BSD / OSX:
>
~/.eclim/resources/ext
<
Windows:
>
$HOME/.eclim/resources/ext
<
vim:ft=eclimhelp

View file

@ -0,0 +1,363 @@
*faq.html*
FAQ / Troubleshooting
*********************
FAQ
===
*eclim_workspace*
How do I tell eclim which eclipse workspace to use?
---------------------------------------------------
To configure the workspace you can start eclimd like so:
>
$ eclimd -Dosgi.instance.area.default=@user.home/another_workspace
<
Note the system property osgi.instance.area.default, which is used to
specify the location of your workspace. Also note the variable
@user.home which will be replaced with your home directory at runtime.
If you are running a unix variant (linux, mac osx, bsd, etc.) then you
can specify the above system property in the .eclimrc file in your
home directory.
>
$ echo "osgi.instance.area.default=@user.home/another_workspace" >> ~/.eclimrc
<
*eclimd_options_windows*
For Windows users there are a couple alternatives to the unsupported
.eclimrc:
1. Your first option is to add a new environment variable:
- Windows 2000: Control Panel ‣ System ‣ Advanced ‣ Environment
Variables Windows XP: Control Panel ‣ Performance And Maintenance
‣ System ‣ Advanced ‣ Environment Variables
- Under "User variables..." click "New..." Variable Name:
ECLIMD_OPTS Variable Value:
-Dosgi.instance.area.default=@user.home/another_workspace
- Then you can start eclimd as normal (via the eclimd.bat file).
2. The second option is to create a shortcut to the eclimd.bat
file:
- In Windows Explorer, open your eclipse folder.
- Hold down the right mouse button and drag the eclimd.bat file
to where you want the shortcut to exist (like your desktop) and
release the right mouse button.
- Choose "Create Shortcut(s) Here"
- Right click the shortcut and choose "Properties"
- On the "Shortcut" tab edit the "Target:" field and append:
-Dosgi.instance.area.default=@user.home/another_workspace
*eclim_proxy*
How can I configure eclim to use a proxy?
-----------------------------------------
The occasional eclim feature requires network access to function
properly. For example, xml validation may require validating the file
against a dtd or xsd located remotely. If you are behind a proxy then
you may need to provide eclim with the necessary proxy settings.
>
$ eclimd -Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=8080
<
If you are running a unix variant (linux, mac osx, bsd, etc.) then you
can specify the above system property in the .eclimrc file in your
home directory.
>
$ echo -e "http.proxyHost=my.proxy\nhttp.proxyPort=8080" >> ~/.eclimrc
<
If your proxy requires authentication, you'll need to supply the
-Dhttp.proxyUser and -Dhttp.proxyPassword properties as well.
On Windows systems you can use the same steps described above, for
setting the workspace location, to also set the proxy settings.
*eclim_memory*
How do I specify jvm memory arguments for eclim (fix OutOfMemory errors).
-------------------------------------------------------------------------
If you are using the headless version of eclimd, then you have a
couple options:
1. pass the necessary jvm args to eclimd. For example, to increase
the heap size:
>
$ eclimd -Xmx256M
<
2. if you are using a unix variant, then you can add the necessary
vm args to a .eclimrc file in your home directory.
>
# increase heap size
-Xmx256M
<
On Windows systems you can use the same steps described above, for
setting the workspace location, to also specify the jvm memory
args.
If you are using the headed version of eclimd, then setting the jvm
memory arguments for eclim is the same procedure as setting them for
eclipse. Details can be found on the eclipse wiki
(http://wiki.eclipse.org/Eclipse.ini).
*eclim_troubleshoot*
How do I troubleshoot features not functioning, or errors encountered?
----------------------------------------------------------------------
For troubleshooting eclim, please see the dedicated troubleshooting
section below.
*eclim_full_headless*
How can I run eclimd on a truly headless server?
------------------------------------------------
Please see the headless guide (install#install-headless).
*eclim_encoding*
How can I set the default encoding used by eclipse/eclimd?
----------------------------------------------------------
To set the default encoding you can set the file.encoding system
property according to your setup:
1. Headless eclimd users on any unix variant (Linux, OSX, etc) can
simply add the property your .eclimrc file in your home directory:
>
# set the default file encoding
file.encoding=utf-8
<
2. Headless eclimd users on Windows can add the system property
(eg. -Dfile.encoding=utf-8) using the same steps described above,
for setting the workspace location.
3. Headed eclimd users can add the system property (eg.
-Dfile.encoding=utf-8) to your eclipse.ini file found in your
eclipse install's root directory. Be sure to add the property on a
new line after the -vmargs line:
>
...
-vmargs
...
-Dfile.encoding=utf-8
<
You can read more about the eclipse.ini file on the eclipse wiki
(http://wiki.eclipse.org/Eclipse.ini).
*troubleshooting*
Troubleshooting
===============
The purpose of this guide is to serve as a means to help troubleshoot
common issues encountered when getting start with eclim, or providing
information if you've discovered a possible bug.
The first thing to note is that as of eclim 1.6.1, errors raised by
eclimd when executing an autocmd from vim, like validating a file on
write, are no longer echoed as errors to the user. Instead these
errors are logged and only displayed if your eclim log level is set to
a relevant level. You can set the log level at any time by running:
>
:let g:EclimLogLevel = 'trace'
<
in vim, which in this case sets the logging to verbose (the default
log level is info). After setting the log level, any external commands
that are run or autocmd errors encountered will be printed (you may
need to run :messages to see them all).
Below are a series of sections broken up by the behavior (or lack of)
experienced and the steps for diagnosing the cause of that behavior.
If you can't find the answer to your question here, be sure to take a
look at the faq () to see if your question is answered there.
*ts_workspace*
Eclim does not recognize any of my existing projects.
-----------------------------------------------------
A fairly common occurrence for users new to eclim, is that after
starting eclimd and then attempting to execute some project dependent
functionality, the functionality appears to do nothing or eclim
complains that the project could not be determined. If you have
existing projects created in eclipse and eclim is not finding them,
then the likely cause is that your projects are located in a
non-default workspace location.
For the answer to how to specify the location of your workspace when
starting eclimd, please see the faq devoted to this.
*ts_completion*
I'm editing a [java, python, php, etc] file and code completion doesn't work.
-----------------------------------------------------------------------------
- If you receive the message "E764: Option 'completefunc' is not
set", please see the file type section below.
- Next step is to make sure that the current file is in an eclipse
project by running the following command in the vim windows
containing the file you are working on.
>
:ProjectInfo
<
If that returns an error that it is unable to determine the project,
then see the workspace section above or the guide on creating a new
project (gettingstarted#gettingstarted-create).
- If the correct project info is found, then try running the
completion again, if it still doesn't return any results run the
command:
>
:messages
<
This will print out any messages that you might have missed. If you
see an error regarding a java exception while running a command then
see the section on troubleshooting exceptions.
*ts_ftplugin*
I'm editing a [java, python, php, etc] file and none of the file type commands exist.
-------------------------------------------------------------------------------------
This usually indicates that you don't have file type plugins enabled
in vim. To check you can run:
>
:EclimValidate
<
If it complains about filetype plugin support not being found, then
follow its directions on adding the following to your vimrc:
>
filetype plugin indent on
<
*ts_signs_misplaced*
Code validation signs are showing up on the wrong lines.
--------------------------------------------------------
This is most likely a result of eclipse being setup to use a different
file encoding than vim, most likely cp1251 (windows-1251) vs utf-8.
You should be able to resolve this issue by setting eclipse's default
encoding accordingly.
If you're unsure what encoding to use, try using utf-8.
*ts_exception*
I received a java exception "while executing command" message.
--------------------------------------------------------------
If you receive a java exception while performing some action in vim,
it should also include a message indicating the issue. However, if
you receive something like a NullPointerException or some other
exception which doesn't include a helpful message, then you may have
encountered a bug.
Once you've encountered this type of issue, the first step it to get
more details which you can do by enabling eclim debugging in vim:
>
:let g:EclimLogLevel = 'trace'
<
Then you can perform the same action that triggered the error again.
This time you should receive the full stack trace of the error.
If the error occurs while manually running a command (:JavaSearch,
etc), then you can instead prepend verbose to the command to view the
full stack trace:
>
:verbose JavaSearch ...
<
Once you've obtained the stack trace, the next step it to send it to
the eclim-user (http://groups.google.com/group/eclim-user) mailing
list along with a description of what you were doing when the error
occurred, as well as the OS you are on, and whether you were using
eclimd headless or headed (inside of the eclipse gui).
*ts_incompatible_plugins*
Incompatible Plugins
--------------------
There are some third party eclipse plugins which currently may
interfere with eclim. Below is a list of these known plugin
incompatibilities.
- Spring IDE: At least one user has reported that eclim's java
validation no longer works after installing the Spring IDE.
- viPlugin: Attempting to open a file using the embedded gvim
support fails if viPlugin is installed. This issue has been
reported on the viPlugin site.
vim:ft=eclimhelp

View file

@ -0,0 +1,131 @@
*features.html*
Features
********
The following is a partial list of eclim features with much more still
to come. For more details please see the detailed documentation
(vim-index). For a more comprehensive list you can also visit the
cheatsheet (cheatsheet).
Eclipse Projects
================
- Create, update, and delete Eclipse projects.
- Easily manage Eclipse .classpath files (support for maven and
ivy).
- Quickly and easily manage settings globally or on a project basis.
C/C++
=====
- Context sensitive code completion.
- Searching.
- Source code validation.
Css
===
- Context sensitive code completion.
- Source code validation.
Html
====
- Context sensitive code completion.
- Automatic validation (w/ visual marking of errors and warnings).
Java
====
- Automatic source code validation (w/ visual marking of errors and
warnings).
- Context sensitive code completion.
- Code correction suggestions with option to apply a suggestion.
- Class constructor generation.
- Java Bean getter and setter generation.
- Generation of delegate methods.
- Java source and java doc searching capabilities.
- Generate stub methods from implemented interfaces or super
classes.
- Generate stub methods for junit testing.
- Quickly clean and sort imports and easily import new classes.
- Automatic generation of logging initialization code, upon first
usage of a logger.
- Javadoc generation for package, class, field, method, etc.
- Java regular expression testing.
- Support for Checkstyle.
- Validation of log4j xml files.
Android
-------
- Support for creating android projects from vim.
Ant
---
- Ant execution from any file.
- Context sensitive code completion when editing build files.
- Automatic validation of build files (w/ visual marking of errors
and warnings).
- Quick access to ant documentation.
Maven
-----
- Maven execution from any file.
- Maven repository searching and ability to add results to pom file.
JavaScript
==========
- File validation using jsl (http://www.javascriptlint.com/).
Php
===
- Context sensitive code completion.
- Searching.
- Source code validation.
Python
======
- Context sensitive code completion.
- Find element definition/references support.
- Source code validation.
- Regular expression testing.
- Django functionality.
Ruby
====
- Context sensitive code completion.
- Searching.
- Source code validation.
Vim Script
==========
- Find user defined command, function, or global variable
declarations / references.
- Quickly lookup help topic for a keyword, functions, command, etc.
Xml / Dtd / Xsd
===============
- Automatic validation (w/ visual marking of errors and warnings).
- Quickly look up element definition from the current xml file's dtd
or xsd.
- Context sensitive code completion.
Common Vim Functionality
========================
- Commands to locate a project, workspace, or current file relative
file and open it (split, edit, or tabnew).
- Much more...
vim:ft=eclimhelp

Some files were not shown because too many files have changed in this diff Show more