Removed eclim
This commit is contained in:
@@ -1,588 +0,0 @@
|
||||
" 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 - 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:echo_connection_errors = 1
|
||||
" }}}
|
||||
|
||||
" Script Variables {{{
|
||||
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'
|
||||
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() " {{{
|
||||
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 <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() " {{{
|
||||
let home = expand('$HOME')
|
||||
if has('win32unix')
|
||||
let home = eclim#cygwin#WindowsHome()
|
||||
elseif has('win32') || has('win64')
|
||||
let home = expand('$USERPROFILE')
|
||||
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
|
||||
@@ -1,177 +0,0 @@
|
||||
" 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 '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
|
||||
@@ -1,214 +0,0 @@
|
||||
"""
|
||||
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
|
||||
@@ -1,115 +0,0 @@
|
||||
" 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
|
||||
@@ -1,379 +0,0 @@
|
||||
" 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
|
||||
@@ -1,316 +0,0 @@
|
||||
" 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
|
||||
@@ -1,58 +0,0 @@
|
||||
" 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
|
||||
@@ -1,87 +0,0 @@
|
||||
" 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
|
||||
@@ -1,643 +0,0 @@
|
||||
" 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 winrestcmd = winrestcmd()
|
||||
|
||||
topleft 12split [Locate\ Results]
|
||||
set filetype=locate_results
|
||||
setlocal nonumber nowrap
|
||||
setlocal noswapfile nobuflisted
|
||||
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 buftype=nofile bufhidden=delete
|
||||
|
||||
let b:bufnum = bufnum
|
||||
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()
|
||||
|
||||
imap <buffer> <silent> <tab> <c-r>=<SID>LocateFileSelection("n")<cr>
|
||||
imap <buffer> <silent> <c-j> <c-r>=<SID>LocateFileSelection("n")<cr>
|
||||
imap <buffer> <silent> <down> <c-r>=<SID>LocateFileSelection("n")<cr>
|
||||
imap <buffer> <silent> <s-tab> <c-r>=<SID>LocateFileSelection("p")<cr>
|
||||
imap <buffer> <silent> <up> <c-r>=<SID>LocateFileSelection("p")<cr>
|
||||
imap <buffer> <silent> <c-k> <c-r>=<SID>LocateFileSelection("p")<cr>
|
||||
exec 'imap <buffer> <silent> <cr> ' .
|
||||
\ '<c-r>=<SID>LocateFileSelect("' . a:action . '")<cr>'
|
||||
imap <buffer> <silent> <c-e> <c-r>=<SID>LocateFileSelect('edit')<cr>
|
||||
imap <buffer> <silent> <c-s> <c-r>=<SID>LocateFileSelect('split')<cr>
|
||||
imap <buffer> <silent> <c-t> <c-r>=<SID>LocateFileSelect("tablast \| tabnew")<cr>
|
||||
imap <buffer> <silent> <c-l> <c-r>=<SID>LocateFileChangeScope()<cr>
|
||||
imap <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 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
|
||||
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 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
|
||||
@@ -1,237 +0,0 @@
|
||||
" 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
|
||||
@@ -1,257 +0,0 @@
|
||||
" 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
|
||||
s/\(\%#\w\+\)\(\_W\+\)\(\w\+\)/\3\2\1/
|
||||
exec "normal! \<C-O>"
|
||||
|
||||
" 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
|
||||
@@ -1,95 +0,0 @@
|
||||
" 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
|
||||
@@ -1,51 +0,0 @@
|
||||
" 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
|
||||
@@ -1,60 +0,0 @@
|
||||
" 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
|
||||
@@ -1,103 +0,0 @@
|
||||
" 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
|
||||
@@ -1,375 +0,0 @@
|
||||
" 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,
|
||||
\ }
|
||||
|
||||
" }}}
|
||||
|
||||
function! eclim#display#signs#Define(name, text, highlight) " {{{
|
||||
" Defines a new sign name or updates an existing one.
|
||||
exec "sign define " . a:name . " text=" . a:text . " texthl=" . a:highlight
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#display#signs#Place(name, line) " {{{
|
||||
" Places a sign in the current buffer.
|
||||
if a:line > 0
|
||||
let lastline = line('$')
|
||||
let line = a:line <= lastline ? a:line : lastline
|
||||
let id = a:name == 'placeholder' ? 999999 : line
|
||||
exec "sign place " . id . " line=" . line . " name=" . a:name .
|
||||
\ " buffer=" . bufnr('%')
|
||||
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.
|
||||
exec 'sign unplace ' . a:id . ' buffer=' . bufnr('%')
|
||||
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 = len(filter(existing, "v:val['line'] == a:line"))
|
||||
if exists
|
||||
call eclim#display#signs#Unplace(a:line)
|
||||
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 a sign name may be supplied to only retrieve signs of that name.
|
||||
|
||||
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
|
||||
call filter(existing, "v:val['name'] == a:000[0]")
|
||||
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
|
||||
@@ -1,349 +0,0 @@
|
||||
" 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'
|
||||
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!
|
||||
exec 'autocmd BufWinEnter ' . eclim#util#EscapeBufferName(g:TagList_title) .
|
||||
\ ' call s:MoveRelativeTo()'
|
||||
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
|
||||
@@ -1,196 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" see http://eclim.org/vim/php/buildpath.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 dltk_buildpath_variables'
|
||||
let s:command_variable_create =
|
||||
\ '-command dltk_buildpath_variable_create -n "<name>" -p "<path>"'
|
||||
let s:command_variable_delete =
|
||||
\ '-command dltk_buildpath_variable_delete -n "<name>"'
|
||||
" }}}
|
||||
|
||||
" NewBuildPathEntry(template) {{{
|
||||
" Adds a new entry to the current .buildpath file.
|
||||
function! eclim#dltk#buildpath#NewBuildPathEntry(arg, template)
|
||||
let args = split(a:arg)
|
||||
let cline = line('.')
|
||||
let ccol = col('.')
|
||||
for arg in args
|
||||
call s:MoveToInsertPosition()
|
||||
let line = line('.')
|
||||
call append(line, split(substitute(a:template, '<arg>', arg, 'g'), '\n'))
|
||||
call cursor(line + 1, 1)
|
||||
endfor
|
||||
call cursor(cline + 1, ccol)
|
||||
endfunction " }}}
|
||||
|
||||
" MoveToInsertPosition() {{{
|
||||
" If necessary moves the cursor to a valid insert position.
|
||||
function! s:MoveToInsertPosition()
|
||||
let start = search('<buildpath\s*>', 'wn')
|
||||
let end = search('</buildpath\s*>', 'wn')
|
||||
if line('.') < start || line('.') >= end
|
||||
call cursor(end - 1, 1)
|
||||
else
|
||||
let start = search('<buildpathentry\s*>', 'n')
|
||||
let end = search('</buildpathentry\s*>', 'cn')
|
||||
if end > start
|
||||
call cursor(end, 1)
|
||||
endif
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
" GetVariableNames() {{{
|
||||
" Gets a list of all variable names.
|
||||
function! eclim#dltk#buildpath#GetVariableNames()
|
||||
let variables = eclim#Execute(s:command_variables)
|
||||
if type(variables) != g:LIST_TYPE
|
||||
return []
|
||||
endif
|
||||
return map(variables, "v:val.name")
|
||||
endfunction " }}}
|
||||
|
||||
" VariableList() {{{
|
||||
" Lists all the variables currently available.
|
||||
function! eclim#dltk#buildpath#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 " }}}
|
||||
|
||||
" VariableCreate(name, path) {{{
|
||||
" Create or update a variable.
|
||||
function! eclim#dltk#buildpath#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 " }}}
|
||||
|
||||
" VariableDelete(name) {{{
|
||||
" Delete a variable.
|
||||
function! eclim#dltk#buildpath#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 " }}}
|
||||
|
||||
" CommandCompleteVar(argLead, cmdLine, cursorPos) {{{
|
||||
" Custom command completion for classpath var relative files.
|
||||
function! eclim#dltk#buildpath#CommandCompleteVar(argLead, cmdLine, cursorPos)
|
||||
let cmdTail = strpart(a:cmdLine, a:cursorPos)
|
||||
let argLead = substitute(a:argLead, cmdTail . '$', '', '')
|
||||
|
||||
let vars = eclim#dltk#buildpath#GetVariableNames()
|
||||
call filter(vars, 'v:val =~ "^' . argLead . '"')
|
||||
|
||||
return vars
|
||||
endfunction " }}}
|
||||
|
||||
" CommandCompleteVarPath(argLead, cmdLine, cursorPos) {{{
|
||||
" Custom command completion for classpath var relative files.
|
||||
function! eclim#dltk#buildpath#CommandCompleteVarPath(argLead, cmdLine, cursorPos)
|
||||
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 " }}}
|
||||
|
||||
" CommandCompleteVarAndDir(argLead, cmdLine, cursorPos) {{{
|
||||
" Custom command completion for classpath var relative files.
|
||||
function! eclim#dltk#buildpath#CommandCompleteVarAndDir(argLead, cmdLine, cursorPos)
|
||||
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
|
||||
let args = eclim#util#ParseCmdLine(cmdLine)
|
||||
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
|
||||
|
||||
" complete dirs for first arg
|
||||
if cmdLine =~ '^' . args[0] . '\s*' . escape(argLead, '~.\') . '$'
|
||||
return eclim#dltk#buildpath#CommandCompleteVar(argLead, a:cmdLine, a:cursorPos)
|
||||
endif
|
||||
|
||||
return eclim#util#CommandCompleteDir(argLead, a:cmdLine, a:cursorPos)
|
||||
endfunction " }}}
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,124 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" see http://eclim.org/vim/ruby/index.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_interpreters = '-command dltk_interpreters -l <nature>'
|
||||
let s:command_interpreter_addremove =
|
||||
\ '-command dltk_<action>_interpreter -l <nature> -p "<path>"'
|
||||
" }}}
|
||||
|
||||
function eclim#dltk#interpreter#GetInterpreters(nature) " {{{
|
||||
let command = s:command_interpreters
|
||||
let command = substitute(command, '<nature>', a:nature, '')
|
||||
let interpreters = eclim#Execute(command)
|
||||
if type(interpreters) != g:LIST_TYPE || len(interpreters) == 0
|
||||
return []
|
||||
endif
|
||||
|
||||
return interpreters
|
||||
endfunction " }}}
|
||||
|
||||
function eclim#dltk#interpreter#ListInterpreters(nature) " {{{
|
||||
let command = s:command_interpreters
|
||||
let command = substitute(command, '<nature>', a:nature, '')
|
||||
let interpreters = eclim#Execute(command)
|
||||
if type(interpreters) != g:LIST_TYPE
|
||||
return
|
||||
endif
|
||||
if len(interpreters) == 0
|
||||
call eclim#util#Echo("No interpreters.")
|
||||
endif
|
||||
|
||||
let pad = 0
|
||||
for interpreter in interpreters
|
||||
if interpreter.default
|
||||
let interpreter.name .= ' (default)'
|
||||
endif
|
||||
let pad = len(interpreter.name) > pad ? len(interpreter.name) : pad
|
||||
endfor
|
||||
|
||||
let output = []
|
||||
let nature = ''
|
||||
for interpreter in interpreters
|
||||
if interpreter.nature != nature
|
||||
let nature = interpreter.nature
|
||||
call add(output, 'Nature: ' . interpreter.nature)
|
||||
endif
|
||||
let name = interpreter.name
|
||||
if interpreter.default
|
||||
let name .= ' (default)'
|
||||
endif
|
||||
let name = eclim#util#Pad(interpreter.name, pad)
|
||||
call add(output, ' ' . name . ' - ' . interpreter.path)
|
||||
endfor
|
||||
call eclim#util#Echo(join(output, "\n"))
|
||||
endfunction " }}}
|
||||
|
||||
function eclim#dltk#interpreter#AddInterpreter(nature, type, path) " {{{
|
||||
return s:InterpreterAddRemove(a:nature, a:type, a:path, 'add')
|
||||
endfunction " }}}
|
||||
|
||||
function eclim#dltk#interpreter#RemoveInterpreter(nature, path) " {{{
|
||||
return s:InterpreterAddRemove(a:nature, '', a:path, 'remove')
|
||||
endfunction " }}}
|
||||
|
||||
function s:InterpreterAddRemove(nature, type, path, action) " {{{
|
||||
let path = a:path
|
||||
let path = substitute(path, '\ ', ' ', 'g')
|
||||
let path = substitute(path, '\', '/', 'g')
|
||||
let command = s:command_interpreter_addremove
|
||||
let command = substitute(command, '<action>', a:action, '')
|
||||
let command = substitute(command, '<nature>', a:nature, '')
|
||||
let command = substitute(command, '<path>', path, '')
|
||||
if a:action == 'add'
|
||||
let command .= ' -t ' . a:type
|
||||
endif
|
||||
let result = eclim#Execute(command)
|
||||
if result != '0'
|
||||
call eclim#util#Echo(result)
|
||||
return 1
|
||||
endif
|
||||
return 0
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#dltk#interpreter#CommandCompleteInterpreterAdd(argLead, cmdLine, cursorPos) " {{{
|
||||
let cmdLine = strpart(a:cmdLine, 0, a:cursorPos)
|
||||
let args = eclim#util#ParseCmdLine(cmdLine)[1:]
|
||||
let argLead = cmdLine =~ '\s$' ? '' : args[len(args) - 1]
|
||||
|
||||
if argLead == '-' && args[0] == '-'
|
||||
return ['-n']
|
||||
endif
|
||||
|
||||
if len(args) == 0 ||
|
||||
\ len(args) == 3 ||
|
||||
\ (len(args) == 1 && argLead !~ '^-\|^$') ||
|
||||
\ (len(args) == 2 && argLead == '')
|
||||
return eclim#util#CommandCompleteFile(a:argLead, a:cmdLine, a:cursorPos)
|
||||
endif
|
||||
|
||||
return []
|
||||
endfunction " }}}
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,169 +0,0 @@
|
||||
" 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
|
||||
@@ -1,59 +0,0 @@
|
||||
" 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
|
||||
@@ -1,135 +0,0 @@
|
||||
" 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, '"\c', '"', 'g')
|
||||
let text = substitute(text, '&\c', '&', 'g')
|
||||
let text = substitute(text, '<\c', '<', 'g')
|
||||
let text = substitute(text, '>\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
|
||||
@@ -1,64 +0,0 @@
|
||||
" 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
|
||||
@@ -1,144 +0,0 @@
|
||||
" 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
|
||||
@@ -1,170 +0,0 @@
|
||||
" 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
|
||||
@@ -1,31 +0,0 @@
|
||||
" 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
|
||||
@@ -1,36 +0,0 @@
|
||||
" 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
|
||||
@@ -1,241 +0,0 @@
|
||||
" 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
|
||||
@@ -1,169 +0,0 @@
|
||||
" 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
|
||||
@@ -1,139 +0,0 @@
|
||||
" 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
|
||||
@@ -1,269 +0,0 @@
|
||||
" 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
|
||||
@@ -1,135 +0,0 @@
|
||||
" 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
|
||||
@@ -1,346 +0,0 @@
|
||||
" 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 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()
|
||||
return 1
|
||||
endfunction " }}}
|
||||
|
||||
function! s:AddImpl(visual) " {{{
|
||||
call eclim#java#impl#Add
|
||||
\ (s:command_impl_insert, 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
|
||||
@@ -1,140 +0,0 @@
|
||||
" 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
|
||||
@@ -1,253 +0,0 @@
|
||||
" 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(getloclist(0)) > 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")
|
||||
call eclim#util#TempWindow('[JUnit Output]', results)
|
||||
let b:project = project
|
||||
|
||||
if exists(":JUnit") != 2
|
||||
command -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
|
||||
|
||||
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries([result]))
|
||||
let entry = getloclist(0)[0]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
if g:EclimJavaSearchSingleResult != 'lopen'
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, g:EclimJavaSearchSingleResult)
|
||||
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries([result]))
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
else
|
||||
exec 'lopen ' . g:EclimLocationListHeight
|
||||
endif
|
||||
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
|
||||
@@ -1,127 +0,0 @@
|
||||
" 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
|
||||
@@ -1,118 +0,0 @@
|
||||
" 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
|
||||
@@ -1,120 +0,0 @@
|
||||
" 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
|
||||
@@ -1,409 +0,0 @@
|
||||
" 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: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#util#SetLocationList(eclim#util#ParseLocationEntries(results))
|
||||
let locs = getloclist(0)
|
||||
" if only one result and it's for the current file, just jump to it.
|
||||
" note: on windows the expand result must be escaped
|
||||
if len(results) == 1 && locs[0].bufnr == bufnr('%')
|
||||
if results[0].line != 1 && results[0].column != 1
|
||||
lfirst
|
||||
endif
|
||||
|
||||
" single result in another file
|
||||
elseif len(results) == 1 && action != 'lopen'
|
||||
let entry = getloclist(0)[0]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, action)
|
||||
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries(results))
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
|
||||
" multiple results and user specified an action other than lopen
|
||||
elseif len(results) && len(action_args) && action != 'lopen'
|
||||
let locs = getloclist(0)
|
||||
let files = map(copy(locs), 'printf(' .
|
||||
\ '"%s|%s col %s| %s", ' .
|
||||
\ 'bufname(v:val.bufnr), v:val.lnum, v:val.col, v:val.text)')
|
||||
let response = eclim#util#PromptList(
|
||||
\ 'Please choose the file to ' . action,
|
||||
\ files, g:EclimHighlightInfo)
|
||||
if response == -1
|
||||
return
|
||||
endif
|
||||
let entry = locs[response]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, action)
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
|
||||
else
|
||||
exec 'lopen ' . g:EclimLocationListHeight
|
||||
endif
|
||||
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 && g:EclimJavaDocSearchSingleResult == 'open'
|
||||
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#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
|
||||
@@ -1,88 +0,0 @@
|
||||
" 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
|
||||
@@ -1,310 +0,0 @@
|
||||
" 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
|
||||
@@ -1,355 +0,0 @@
|
||||
" 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
|
||||
@@ -1,37 +0,0 @@
|
||||
" 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
|
||||
@@ -1,124 +0,0 @@
|
||||
" 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
|
||||
@@ -1,653 +0,0 @@
|
||||
" 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#util#SetLocationList(eclim#util#ParseLocationEntries(results))
|
||||
let locs = getloclist(0)
|
||||
" if only one result and it's for the current file, just jump to it.
|
||||
" note: on windows the expand result must be escaped
|
||||
if len(results) == 1 && locs[0].bufnr == bufnr('%')
|
||||
if results[0].line != 1 && results[0].column != 1
|
||||
lfirst
|
||||
endif
|
||||
|
||||
" single result in another file.
|
||||
elseif len(results) == 1 && action != "lopen"
|
||||
let entry = getloclist(0)[0]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, action)
|
||||
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries(results))
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
|
||||
" multiple results and user specified an action other than lopen
|
||||
elseif len(results) && len(action_args) && action != 'lopen'
|
||||
let locs = getloclist(0)
|
||||
let files = map(copy(locs), 'printf(' .
|
||||
\ '"%s|%s col %s| %s", ' .
|
||||
\ 'bufname(v:val.bufnr), v:val.lnum, v:val.col, v:val.text)')
|
||||
let response = eclim#util#PromptList(
|
||||
\ 'Please choose the file to ' . action,
|
||||
\ files, g:EclimHighlightInfo)
|
||||
if response == -1
|
||||
return
|
||||
endif
|
||||
let entry = locs[response]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, action)
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
|
||||
else
|
||||
exec 'lopen ' . g:EclimLocationListHeight
|
||||
endif
|
||||
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#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'
|
||||
if cwd_return
|
||||
exec 'cd ' . escape(cwd, ' ')
|
||||
endif
|
||||
endtry
|
||||
finally
|
||||
" 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
|
||||
@@ -1,139 +0,0 @@
|
||||
" 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: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(), '')
|
||||
" 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)
|
||||
call cursor(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
|
||||
@@ -1,41 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" see http://eclim.org/vim/php/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 php_complete -p "<project>" -f "<file>" -o <offset> -e <encoding>'
|
||||
" }}}
|
||||
|
||||
" CodeComplete(findstart, base) {{{
|
||||
" Handles php code completion.
|
||||
function! eclim#php#complete#CodeComplete(findstart, base)
|
||||
if !eclim#php#util#IsPhpCode(line('.'))
|
||||
return eclim#html#complete#CodeComplete(a:findstart, a:base)
|
||||
endif
|
||||
|
||||
return eclim#lang#CodeComplete(
|
||||
\ s:complete_command, a:findstart, a:base, {'temp': 0})
|
||||
endfunction " }}}
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,132 +0,0 @@
|
||||
" 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:search = '-command php_search'
|
||||
let s:buildpaths = '-command dltk_buildpaths -p "<project>"'
|
||||
let s:options_map = {
|
||||
\ '-a': ['split', 'vsplit', 'edit', 'tabnew', 'lopen'],
|
||||
\ '-s': ['all', 'project'],
|
||||
\ '-i': [],
|
||||
\ '-p': [],
|
||||
\ '-t': ['class', 'function', 'constant'],
|
||||
\ '-x': ['all', 'declarations', 'references'],
|
||||
\ }
|
||||
" }}}
|
||||
|
||||
function! eclim#php#search#Search(argline) " {{{
|
||||
return eclim#lang#Search(s:search, g:EclimPhpSearchSingleResult, a:argline)
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#search#FindInclude(argline) " {{{
|
||||
if !eclim#project#util#IsCurrentFileInProject(1)
|
||||
return
|
||||
endif
|
||||
|
||||
let file = substitute(getline('.'),
|
||||
\ ".*\\<\\(require\\|include\\)\\(_once\\)\\?\\s*[(]\\?['\"]\\([^'\"]*\\)['\"].*", '\3', '')
|
||||
|
||||
let project = eclim#project#util#GetCurrentProjectName()
|
||||
let command = s:buildpaths
|
||||
let command = substitute(command, '<project>', project, '')
|
||||
let paths = eclim#Execute(command)
|
||||
if type(paths) != g:LIST_TYPE
|
||||
return
|
||||
endif
|
||||
|
||||
let results = split(globpath(expand('%:h') . ',' . join(paths, ','), file), '\n')
|
||||
|
||||
if !empty(results)
|
||||
call eclim#util#SetLocationList(eclim#util#ParseLocationEntries(results))
|
||||
|
||||
let [action_args, argline] = eclim#util#ExtractCmdArgs(a:argline, '-a:')
|
||||
let action = len(action_args) == 2 ? action_args[1] : g:EclimPhpSearchSingleResult
|
||||
|
||||
" single result in another file.
|
||||
if len(results) == 1 && action != "lopen"
|
||||
let entry = getloclist(0)[0]
|
||||
call eclim#util#GoToBufferWindowOrOpen(bufname(entry.bufnr), action)
|
||||
call eclim#display#signs#Update()
|
||||
|
||||
" multiple results and user specified an action other than lopen
|
||||
elseif len(results) && len(action_args) && action != 'lopen'
|
||||
let locs = getloclist(0)
|
||||
let files = map(copy(locs), 'printf(' .
|
||||
\ '"%s|%s col %s| %s", ' .
|
||||
\ 'bufname(v:val.bufnr), v:val.lnum, v:val.col, v:val.text)')
|
||||
let response = eclim#util#PromptList(
|
||||
\ 'Please choose the file to ' . action,
|
||||
\ files, g:EclimHighlightInfo)
|
||||
if response == -1
|
||||
return
|
||||
endif
|
||||
let entry = locs[response]
|
||||
let name = substitute(bufname(entry.bufnr), '\', '/', 'g')
|
||||
call eclim#util#GoToBufferWindowOrOpen(name, action)
|
||||
call eclim#display#signs#Update()
|
||||
call cursor(entry.lnum, entry.col)
|
||||
|
||||
else
|
||||
exec 'lopen ' . g:EclimLocationListHeight
|
||||
endif
|
||||
else
|
||||
call eclim#util#EchoInfo("File not found.")
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#search#SearchContext(argline) " {{{
|
||||
if getline('.')[col('.') - 1] == '$'
|
||||
call cursor(line('.'), col('.') + 1)
|
||||
let cnum = eclim#util#GetCurrentElementColumn()
|
||||
call cursor(line('.'), col('.') - 1)
|
||||
else
|
||||
let cnum = eclim#util#GetCurrentElementColumn()
|
||||
endif
|
||||
|
||||
if getline('.') =~ "\\<\\(require\\|include\\)\\(_once\\)\\?\\s*[(]\\?['\"][^'\"]*\\%" . cnum . "c"
|
||||
call eclim#php#search#FindInclude(a:argline)
|
||||
return
|
||||
elseif getline('.') =~ '\<\(class\|function\)\s\+\%' . cnum . 'c'
|
||||
call eclim#php#search#Search('-x references')
|
||||
return
|
||||
elseif getline('.') =~ "\\<define\\s*(['\"]\\%" . cnum . "c"
|
||||
call eclim#util#EchoInfo("TODO: Search constant references")
|
||||
return
|
||||
"elseif getline('.') =~ '\<var\s\+[$]\?\%' . cnum . 'c'
|
||||
" call eclim#util#EchoInfo("TODO: Search var references")
|
||||
" return
|
||||
endif
|
||||
|
||||
call eclim#php#search#Search(a:argline . ' -x declarations')
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#search#CommandCompleteSearch(argLead, cmdLine, cursorPos) " {{{
|
||||
return eclim#util#CommandCompleteOptions(
|
||||
\ a:argLead, a:cmdLine, a:cursorPos, s:options_map)
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#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 " }}}
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,117 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" see http://eclim.org/vim/php/validate.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:update_command = '-command php_src_update -p "<project>" -f "<file>"'
|
||||
let s:html_validate_command = '-command html_validate -p "<project>" -f "<file>"'
|
||||
" }}}
|
||||
|
||||
function! eclim#php#util#IsPhpCode(lnum) " {{{
|
||||
" Determines if the code under the cursor is php code (in a php block).
|
||||
|
||||
let pos = getpos('.')
|
||||
try
|
||||
let phpstart = searchpos('<?\(php\|=\)\?', 'bcW')
|
||||
while phpstart[0]
|
||||
let synname = synIDattr(synIDtrans(synID(phpstart[0], phpstart[1], 1)), "name")
|
||||
if synname !~ '\(Comment\|String\)'
|
||||
break
|
||||
endif
|
||||
let phpstart = searchpos('<?\(php\|=\)\?', 'bW')
|
||||
endwhile
|
||||
|
||||
if phpstart[0] > 0
|
||||
call setpos('.', pos)
|
||||
let phpend = searchpos('?>', 'bW')
|
||||
while phpend[0] > phpstart[0]
|
||||
let synname = synIDattr(synIDtrans(synID(phpend[0], phpend[1], 1)), "name")
|
||||
if synname !~ '\(Comment\|String\)'
|
||||
break
|
||||
endif
|
||||
let phpend = searchpos('?>', 'bW')
|
||||
endwhile
|
||||
endif
|
||||
|
||||
return phpstart[0] > 0 && phpstart[0] <= a:lnum && (phpend[0] == 0 || phpend[0] < phpstart[0])
|
||||
finally
|
||||
call setpos('.', pos)
|
||||
endtry
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#util#UpdateSrcFile(on_save) " {{{
|
||||
" Updates the src file on the server w/ the changes made to the current file.
|
||||
|
||||
let validate = !a:on_save || (
|
||||
\ g:EclimPhpValidate &&
|
||||
\ (!exists('g:EclimFileTypeValidate') || g:EclimFileTypeValidate))
|
||||
|
||||
let project = eclim#project#util#GetCurrentProjectName()
|
||||
if project != ""
|
||||
let file = eclim#project#util#GetProjectRelativeFilePath()
|
||||
let command = s:update_command
|
||||
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()
|
||||
let command = command . ' -b'
|
||||
endif
|
||||
endif
|
||||
let result = eclim#Execute(command)
|
||||
if type(result) != g:LIST_TYPE
|
||||
return
|
||||
endif
|
||||
|
||||
let html_validate = exists('b:EclimPhpHtmlValidate') ?
|
||||
\ b:EclimPhpHtmlValidate : g:EclimPhpHtmlValidate
|
||||
if validate && html_validate && !eclim#util#WillWrittenBufferClose()
|
||||
let command = s:html_validate_command
|
||||
let command = substitute(command, '<project>', project, '')
|
||||
let command = substitute(command, '<file>', file, '')
|
||||
let result_html = eclim#Execute(command)
|
||||
if type(result_html) == g:LIST_TYPE
|
||||
let result += result_html
|
||||
endif
|
||||
endif
|
||||
|
||||
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()
|
||||
endif
|
||||
|
||||
call eclim#project#problems#ProblemsUpdate('save')
|
||||
elseif !a:on_save
|
||||
call eclim#project#util#IsCurrentFileInProject()
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
function! eclim#php#util#CommandCompleteProject(argLead, cmdLine, cursorPos) " {{{
|
||||
return eclim#project#util#CommandCompleteProjectByNature(
|
||||
\ a:argLead, a:cmdLine, a:cursorPos, 'php')
|
||||
endfunction " }}}
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,125 +0,0 @@
|
||||
" 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:EclimProjectProblemsQuickFixOpen
|
||||
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
|
||||
@@ -1,517 +0,0 @@
|
||||
" 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
@@ -1,33 +0,0 @@
|
||||
" 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
|
||||
@@ -1,32 +0,0 @@
|
||||
" 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
|
||||
@@ -1,39 +0,0 @@
|
||||
" 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
|
||||
@@ -1,33 +0,0 @@
|
||||
" 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
|
||||
@@ -1,37 +0,0 @@
|
||||
" 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
|
||||
@@ -1,33 +0,0 @@
|
||||
" 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
|
||||
@@ -1,33 +0,0 @@
|
||||
" 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
|
||||
@@ -1,43 +0,0 @@
|
||||
" 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
|
||||
@@ -1,48 +0,0 @@
|
||||
" 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
@@ -1,82 +0,0 @@
|
||||
" 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
|
||||
@@ -1,232 +0,0 @@
|
||||
" 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
|
||||
@@ -1,89 +0,0 @@
|
||||
" 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
|
||||
@@ -1,79 +0,0 @@
|
||||
" 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
|
||||
@@ -1,109 +0,0 @@
|
||||
" 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
|
||||
@@ -1,137 +0,0 @@
|
||||
" 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
|
||||
@@ -1,75 +0,0 @@
|
||||
" 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
|
||||
@@ -1,21 +0,0 @@
|
||||
#!/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
|
||||
@@ -1,87 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" Compiler for ant (enhancement to default ant compiler provided w/ vim).
|
||||
"
|
||||
" 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/>.
|
||||
"
|
||||
" }}}
|
||||
|
||||
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,' .
|
||||
\ '\%+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
|
||||
@@ -1,50 +0,0 @@
|
||||
" 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
|
||||
@@ -1,56 +0,0 @@
|
||||
" 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
|
||||
@@ -1,61 +0,0 @@
|
||||
" 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
|
||||
@@ -1,51 +0,0 @@
|
||||
" Author: Eric Van Dewoestine
|
||||
"
|
||||
" Description: {{{
|
||||
" Compiler for maven 2.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:EclimMvnCompilerAdditionalErrorFormat')
|
||||
let g:EclimMvnCompilerAdditionalErrorFormat = ''
|
||||
endif
|
||||
|
||||
CompilerSet makeprg=mvn\ $*
|
||||
|
||||
" Lines 1 - 3: javac
|
||||
" Lines 4 - 7: javadoc
|
||||
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!,' .
|
||||
\ g:EclimMvnCompilerAdditionalErrorFormat .
|
||||
\ '\%-G%.%#'
|
||||
|
||||
" vim:ft=vim:fdm=marker
|
||||
@@ -1,39 +0,0 @@
|
||||
" 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
|
||||
@@ -1,32 +0,0 @@
|
||||
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
|
||||
@@ -1,11 +0,0 @@
|
||||
*404*
|
||||
|
||||
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
@@ -1,464 +0,0 @@
|
||||
*archive-news*
|
||||
|
||||
Eclim News Archive
|
||||
******************
|
||||
|
||||
|
||||
2011-09-10
|
||||
==========
|
||||
|
||||
Eclim 1.7.2 (|1.7.2|) 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 (|1.7.1|) is now available.
|
||||
This is a bug fix release.
|
||||
|
||||
|
||||
2011-06-26
|
||||
==========
|
||||
|
||||
Eclim 1.7.0 (|1.7.0|) 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 (|1.6.3|) is now available.
|
||||
This is primarily a bug fix release.
|
||||
|
||||
|
||||
2011-02-26
|
||||
==========
|
||||
|
||||
Eclim 1.6.2 (|1.6.2|) 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 (|1.6.1|) is now available.
|
||||
This is mostly a bug fix release with a few minor features tossed in.
|
||||
|
||||
|
||||
2010-08-01
|
||||
==========
|
||||
|
||||
Eclim 1.6.0 (|1.6.0|) 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 (|1.5.8|) 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 (|1.5.7|) is now available.
|
||||
The main focus of this release is bug fixes and improving the installer.
|
||||
|
||||
|
||||
2010-03-06
|
||||
==========
|
||||
|
||||
Eclim 1.5.6 (|1.5.6|) is now available.
|
||||
|
||||
|
||||
2010-02-22
|
||||
==========
|
||||
|
||||
Eclim 1.5.5 (|1.5.5|) is now available.
|
||||
This is a bug fix release for the eclim installer.
|
||||
|
||||
|
||||
2009-12-18
|
||||
==========
|
||||
|
||||
Eclim 1.5.4 (|1.5.4|) is now available.
|
||||
This is primarily a bug fix release for OSX users.
|
||||
|
||||
|
||||
2009-12-12
|
||||
==========
|
||||
|
||||
Eclim 1.5.3 (|1.5.3|) is now available.
|
||||
|
||||
|
||||
2009-08-30
|
||||
==========
|
||||
|
||||
Eclim 1.5.2 (|1.5.2|) is now available.
|
||||
|
||||
|
||||
2009-07-18
|
||||
==========
|
||||
|
||||
Eclim 1.5.1 (|1.5.1|) is now available.
|
||||
This is primarily a bug fix release
|
||||
|
||||
|
||||
2009-07-12
|
||||
==========
|
||||
|
||||
Eclim 1.5.0 (|1.5.0|) 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 (|1.4.9|) is now available.
|
||||
This is primarily a bug fix release, with a few refinements.
|
||||
|
||||
|
||||
2009-05-30
|
||||
==========
|
||||
|
||||
Eclim 1.4.8 (|1.4.8|) is now available.
|
||||
This is primarily a bug fix release with a few enhancements.
|
||||
|
||||
|
||||
2009-05-02
|
||||
==========
|
||||
|
||||
Eclim 1.4.7 (|1.4.7|) 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 (|1.4.6|) 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 (|1.4.5|) is now available.
|
||||
This is primarily a bug fix release.
|
||||
|
||||
|
||||
2009-01-10
|
||||
==========
|
||||
|
||||
Eclim 1.4.4 (|1.4.4|) 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 (|1.4.3|) 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 (|1.4.2|) is now available.
|
||||
This is primary a bug fix release.
|
||||
|
||||
|
||||
2008-08-24
|
||||
==========
|
||||
|
||||
Eclim 1.4.1 (|1.4.1|) 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 (|1.4.0|) 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 (|1.3.5|) is now available.
|
||||
You can view the release notes (|release notes|) for
|
||||
more info.
|
||||
|
||||
|
||||
2008-02-05
|
||||
==========
|
||||
|
||||
Eclim 1.3.4 (|1.3.4|) 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 (|1.3.3|) 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 (|1.3.2|) is now available.
|
||||
|
||||
|
||||
2007-07-13
|
||||
==========
|
||||
|
||||
Eclim 1.3.1 (|1.3.1|) is now available.
|
||||
This is only a bug fix release.
|
||||
|
||||
|
||||
2007-07-01
|
||||
==========
|
||||
|
||||
Eclim 1.3.0 (|1.3.0|) 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 (|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 (|changes|).
|
||||
|
||||
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 (|release notes|) 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 (|release
|
||||
notes|).
|
||||
|
||||
|
||||
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 (|release notes|).
|
||||
|
||||
|
||||
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 (|release notes|).
|
||||
|
||||
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 (|release notes|).
|
||||
|
||||
|
||||
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 (|release notes|).
|
||||
|
||||
|
||||
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 (|release notes|).
|
||||
|
||||
|
||||
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
|
||||
@@ -1,525 +0,0 @@
|
||||
*changes*
|
||||
|
||||
History of Changes
|
||||
******************
|
||||
|
||||
*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)
|
||||
*2.2.5* *1.7.13*
|
||||
|
||||
|
||||
2.2.5 / 1.7.13 (Nov. 25, 2012)
|
||||
==============================
|
||||
|
||||
Eclim:
|
||||
- 1.7.13 and above will now support Eclipse 3.8 as well as 3.7.
|
||||
- Fix |:ProjectGrep| and |:ProjectTodo| to search in all of the
|
||||
project's links as well.
|
||||
- Other minor bug fixes.
|
||||
Git Log (2.2.5) (https://github.com/ervandew/eclim/compare/2.2.4...2.2.5)
|
||||
Git Log (1.7.13) (https://github.com/ervandew/eclim/compare/1.7.12...1.7.13)
|
||||
*2.2.4* *1.7.12*
|
||||
|
||||
|
||||
2.2.4 / 1.7.12 (Nov. 18, 2012)
|
||||
==============================
|
||||
|
||||
Eclim:
|
||||
- Updated |:ProjectTree| and |:ProjectTab| to support an
|
||||
arbitrary directory as an argument, allowing you to use the
|
||||
command for project's not managed by eclipse/eclim. :TreeTab has
|
||||
been removed since the update to :ProjectTab makes it redundant.
|
||||
- Creation of projects in nested directories in the eclipse
|
||||
workspace (vs at the root of the workspace) is now properly
|
||||
supported through eclim.
|
||||
Android:
|
||||
- Updated for ADT 21.0.0.
|
||||
C/C++:
|
||||
- Fix placement of some error markers.
|
||||
Php:
|
||||
- Some indentation fixes.
|
||||
Git Log (2.2.4) (https://github.com/ervandew/eclim/compare/2.2.3...2.2.4)
|
||||
Git Log (1.7.12) (https://github.com/ervandew/eclim/compare/1.7.11...1.7.12)
|
||||
*2.2.3* *1.7.11*
|
||||
|
||||
|
||||
2.2.3 / 1.7.11 (Oct. 19, 2012)
|
||||
==============================
|
||||
|
||||
Eclim:
|
||||
- Fixes execution of eclim commands from vim on Windows when
|
||||
using the external nailgun client (vs the python client).
|
||||
Git Log (2.2.3) (https://github.com/ervandew/eclim/compare/2.2.2...2.2.3)
|
||||
Git Log (1.7.11) (https://github.com/ervandew/eclim/compare/1.7.10...1.7.11)
|
||||
*2.2.2* *1.7.10*
|
||||
|
||||
|
||||
2.2.2 / 1.7.10 (Oct. 07, 2012)
|
||||
==============================
|
||||
|
||||
Eclimd:
|
||||
- Updated eclimd script for Linux/OSX to supply reasonable
|
||||
defaults for heap and perm gen space if not already set by
|
||||
~/.eclimrc.
|
||||
C/C++:
|
||||
- Fixed C++ project creation to auto add the required C nature.
|
||||
- Fixed C/C++ issues introduced by the eclipse 4.2.1 release
|
||||
(project create/refresh and call hierarchy).
|
||||
Java:
|
||||
- :JavaImportSort, :JavaImportClean, and :JavaImportMissing all
|
||||
removed in favor of a new command which performs the
|
||||
functionality of all three: |:JavaImportOrganize|
|
||||
- The vim option g:EclimJavaImportExclude has been replaced with
|
||||
the eclim setting org.eclim.java.import.exclude
|
||||
(|org-eclim-java-import-exclude|).
|
||||
- The vim option g:EclimJavaImportPackageSeparationLevel has been
|
||||
replaced with the eclim setting
|
||||
org.eclim.java.import.package_separation_level
|
||||
(|org-eclim-java-import-package-separation-level|).
|
||||
- g:EclimJavaBeanInsertIndexed vim variable removed in favor of
|
||||
suffixing :JavaGetSet methods with '!'.
|
||||
- :JavaCorrect, :JavaImpl, :JavaDelegate, :JavaConstructor, and
|
||||
:JUnitImpl all now perform their code manipulations using eclipse
|
||||
operations.
|
||||
- Initial support added for running :JavaSearch commands from
|
||||
source file results (library source files) not in a project.
|
||||
- g:EclimJavaCheckstyleOnSave replaced with the eclim setting
|
||||
org.eclim.java.checkstyle.onvalidate
|
||||
(|org-eclim-java-checkstyle-onvalidate|).
|
||||
- g:EclimJavaSrcValidate renamed to g:EclimJavaValidate.
|
||||
- :JUnitExecute replaced with a new and improved |:JUnit|
|
||||
command.
|
||||
- Added the command |:JUnitFindTest| to open the corresponding
|
||||
test for the current file.
|
||||
- Removed :Javac command since eclipse's continuous incremental
|
||||
builds typically make the :Javac call a no op, and in cases where
|
||||
you need to induce compilation, |:ProjectBuild| does so in a
|
||||
language agnostic way.
|
||||
- Added |:JavaMove| command to move a java source file from one
|
||||
package to another.
|
||||
- Added |:JavaDocPreview| to display the javadoc of the element
|
||||
under the cursor in vim's preview window.
|
||||
Git Log (2.2.2) (https://github.com/ervandew/eclim/compare/2.2.1...2.2.2)
|
||||
Git Log (1.7.10) (https://github.com/ervandew/eclim/compare/1.7.9...1.7.10)
|
||||
*1.7.9*
|
||||
|
||||
|
||||
1.7.9 (Sep. 09, 2012)
|
||||
=====================
|
||||
|
||||
Scala:
|
||||
- Add support for scala code completion (|vim-scala-complete|),
|
||||
code validation (|vim-scala-validate|), and element definition
|
||||
searches (|vim-scala-search|).
|
||||
Git Log (1.7.9)
|
||||
(https://github.com/ervandew/eclim/compare/1.7.8...1.7.9)
|
||||
|
||||
*2.2.1* *1.7.8*
|
||||
|
||||
|
||||
2.2.1 / 1.7.8 (Sep. 01, 2012)
|
||||
=============================
|
||||
|
||||
Documentation:
|
||||
- Redesigned the eclim website using the sphinx bootstrap theme
|
||||
(https://github.com/ervandew/sphinx-bootstrap-theme).
|
||||
- Reorganized many of the docs to consolidate similar features to
|
||||
hopefully make them easier to find and make the docs less
|
||||
sprawling.
|
||||
- Improved the translation of the docs to vim help files.
|
||||
Android:
|
||||
- Eclim now has support for creating android projects
|
||||
(|gettingstarted-android|).
|
||||
Java:
|
||||
- Fixed searching for JDK classes on OSX.
|
||||
- Added support for searching for inner classes and their
|
||||
methods.
|
||||
- Fixed remaining tab vs spaces indenting related issues with
|
||||
code added via eclipse.
|
||||
Vimplugin:
|
||||
- Fixed disabling of conflicting Eclipse keybindings on Juno
|
||||
while the embedded vim has focus (fixes usage of Ctrl+V for
|
||||
blockwise visual selections).
|
||||
Git Log (2.2.1) (https://github.com/ervandew/eclim/compare/2.2.0...2.2.1)
|
||||
Git Log (1.7.8) (https://github.com/ervandew/eclim/compare/1.7.7...1.7.8)
|
||||
*2.2.0* *1.7.7*
|
||||
|
||||
|
||||
2.2.0 / 1.7.7 (Aug. 07, 2012)
|
||||
=============================
|
||||
|
||||
Eclipse:
|
||||
- Eclim 2.2.0 and above now requires Java 6 or later.
|
||||
- Eclim 2.2.0 and above now requires the latest version of
|
||||
eclipse (Juno, 4.2).
|
||||
Eclimd:
|
||||
- Updated eclimd script to always set the jvm architecture
|
||||
argument, preventing possible issue starting eclimd on OSX if the
|
||||
default architecture order of the java executable doesn't match
|
||||
the eclipse architecture.
|
||||
C/C++:
|
||||
- Semantic errors are now included in the validation results.
|
||||
- Added folding support to C/C++ call hierarchy buffer.
|
||||
- |:ProjectRefresh| now waits on the C/C++ indexer to finish
|
||||
before returning focus to the user.
|
||||
- Fixed auto selecting of the tool chain when creating C/C++
|
||||
projects from eclim.
|
||||
- Fixed |:CCallHierarchy| from possibly using a cached version of
|
||||
the file resulting in incorrect or no results.
|
||||
Java:
|
||||
- Fixed inserted code from |:JavaCorrect| when file format is
|
||||
'dos'.
|
||||
- Fixed off by one issue prevent several code correction
|
||||
suggestions from being suggested.
|
||||
Ruby:
|
||||
- Fixed to prompt for the path to the ruby interpreter if
|
||||
necessary when importing a ruby project or adding the ruby nature
|
||||
to an existing project.
|
||||
Vimplugin:
|
||||
- Fixed executing of some operations when vim is currently in
|
||||
insert mode (opening new file from eclipse in a new external vim
|
||||
tab, using "Save As" from eclipse, and jumping to a line number
|
||||
from the project tree etc.)
|
||||
Git Log (2.2.0) (https://github.com/ervandew/eclim/compare/1.7.6...2.2.0)
|
||||
Git Log (1.7.7) (https://github.com/ervandew/eclim/compare/1.7.6...1.7.7)
|
||||
*1.7.6*
|
||||
|
||||
|
||||
1.7.6 (Jun. 07, 2012)
|
||||
=====================
|
||||
|
||||
Bug Fixes:
|
||||
- Couple other minor bug fixes.
|
||||
Installer:
|
||||
- Fixed install location of eclim's vim help files (broken in the
|
||||
previous release).
|
||||
Git Log (1.7.6)
|
||||
(https://github.com/ervandew/eclim/compare/1.7.5...1.7.6)
|
||||
|
||||
*1.7.5*
|
||||
|
||||
|
||||
1.7.5 (Jun. 03, 2012)
|
||||
=====================
|
||||
|
||||
Note: This release is not compatible with Eclipse Juno (4.2). The
|
||||
next major release of eclim (2.2.0) will be built for Juno.
|
||||
|
||||
Installer:
|
||||
- Added uninstall (|uninstall|) support to the eclim installer.
|
||||
- Updated the installer to fully embrace eclipse's provisioning
|
||||
framework (p2).
|
||||
Common:
|
||||
- Added |:ProjectTreeToggle|.
|
||||
Vimplugin
|
||||
- Fixed key binding conflict handling to not inadvertently switch
|
||||
your key binding scheme back to the default scheme.
|
||||
Java:
|
||||
- Added support for importing the necessary type during code
|
||||
completion.
|
||||
- Improved location of a project's main class for the |:Java|
|
||||
command, when not explicitly set.
|
||||
Git Log (1.7.5)
|
||||
(https://github.com/ervandew/eclim/compare/1.7.4...1.7.5)
|
||||
|
||||
*1.7.4*
|
||||
|
||||
|
||||
1.7.4 (Apr. 22, 2012)
|
||||
=====================
|
||||
|
||||
Bug Fixes:
|
||||
- Fixed possible NPE saving eclim settings.
|
||||
- Several other small bug fixes.
|
||||
C/C++:
|
||||
- Fixed code completion by disabling the use of temp files.
|
||||
Java:
|
||||
- Fixed :Java on windows as well as handling of stdin for ant
|
||||
1.8.2+.
|
||||
Git Log (1.7.4)
|
||||
(https://github.com/ervandew/eclim/compare/1.7.3...1.7.4)
|
||||
|
||||
*1.7.3*
|
||||
|
||||
|
||||
1.7.3 (Mar. 18, 2012)
|
||||
=====================
|
||||
|
||||
Bug Fixes:
|
||||
- Lots of various bug fixes.
|
||||
Common:
|
||||
- Added |:ProjectBuild| to build the current or supplied project.
|
||||
- Updated |:ProjectProblems| to support optional bang
|
||||
(:ProjectProblems!) to only show project errors.
|
||||
- Updating eclipse's local history (|vim-core-history|) when
|
||||
writing in vim is now only enabled by default when gvim is opened
|
||||
from the eclipse gui.
|
||||
C/C++:
|
||||
- Fixed project creation issue encountered on some systems.
|
||||
Java:
|
||||
- Added project settings for specifying default jvm args for
|
||||
|:Java| and default args for :Javac.
|
||||
- Code inserted by |:JavaConstructor|, |:JavaGetSet|,
|
||||
|:JavaImpl|, |:JavaDelegate|, and |:JUnitImpl| is now formatted
|
||||
according to the eclipse code formatter settings configured from
|
||||
the eclipse gui.
|
||||
Maven:
|
||||
- Now when saving your pom.xml file your .classpath will be auto
|
||||
updated (|classpath-maven-pom|) with the dependencies found in
|
||||
your pom.xml.
|
||||
Php:
|
||||
- Now handles completion from within php short tags.
|
||||
Git Log (1.7.3)
|
||||
(https://github.com/ervandew/eclim/compare/1.7.2...1.7.3)
|
||||
|
||||
Eclim Changes Archive (|archive-changes|)
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,347 +0,0 @@
|
||||
*cheatsheet*
|
||||
|
||||
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| - 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.
|
||||
|
||||
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
|
||||
@@ -1,60 +0,0 @@
|
||||
*contribute*
|
||||
|
||||
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
|
||||
@@ -1,38 +0,0 @@
|
||||
*development-architecture*
|
||||
|
||||
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
|
||||
@@ -1,242 +0,0 @@
|
||||
*development-commands*
|
||||
|
||||
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
|
||||
@@ -1,268 +0,0 @@
|
||||
*development-gettingstarted*
|
||||
|
||||
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
|
||||
|
||||
<
|
||||
|
||||
|
||||
Note: If you are still using Eclipse 3.7 (Indigo) you will need to
|
||||
checkout the eclim indigo branch before attempting to build eclim:>
|
||||
|
||||
$ cd eclim
|
||||
$ git checkout indigo
|
||||
|
||||
<
|
||||
|
||||
|
||||
|
||||
2. Build eclim:
|
||||
---------------
|
||||
|
||||
>
|
||||
|
||||
$ cd eclim
|
||||
$ ant -Declipse.home=/your/eclipse/home/dir
|
||||
|
||||
<
|
||||
|
||||
|
||||
Note: If your eclipse home path contains a space, be sure to quote
|
||||
it:>
|
||||
|
||||
> ant "-Declipse.home=C:/Program Files/eclipse"
|
||||
|
||||
<
|
||||
|
||||
|
||||
This will build and deploy eclim to your eclipse and vim directories.
|
||||
|
||||
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 see an eclipse feature in that list that you know you
|
||||
have, it may be the case that you installed it as a regular user, so
|
||||
that feature was installed in your user local eclipse directory. In
|
||||
that case you will need to notify the build of that directory so it
|
||||
can examine it as well (just replace the <version> portion below with
|
||||
the actual version found in your ~/.eclipse directory):
|
||||
|
||||
>
|
||||
|
||||
$ ant \
|
||||
-Declipse.home=/opt/eclipse \
|
||||
-Declipse.local=$HOME/.eclipse/org.eclipse.platform_<version>
|
||||
|
||||
<
|
||||
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
*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).
|
||||
|
||||
|
||||
Building the eclim installer
|
||||
============================
|
||||
|
||||
It should be rare that someone should need to build the eclim
|
||||
installer, 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
|
||||
|
||||
<
|
||||
|
||||
|
||||
|
||||
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
|
||||
@@ -1,21 +0,0 @@
|
||||
*development-index*
|
||||
|
||||
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.
|
||||
|
||||
... More To Come
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,226 +0,0 @@
|
||||
*development-plugins*
|
||||
|
||||
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
|
||||
@@ -1,437 +0,0 @@
|
||||
*eclimd*
|
||||
|
||||
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.
|
||||
|
||||
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-headless|).
|
||||
|
||||
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
|
||||
|
||||
# increase perm gen size
|
||||
-XX:PermSize=64m
|
||||
-XX:MaxPermSize=128m
|
||||
|
||||
<
|
||||
|
||||
|
||||
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
|
||||
@@ -1,356 +0,0 @@
|
||||
*faq*
|
||||
|
||||
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
|
||||
|
||||
# increase perm gen size
|
||||
-XX:PermSize=64m
|
||||
-XX:MaxPermSize=128m
|
||||
|
||||
<
|
||||
|
||||
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-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 4). 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-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.
|
||||
|
||||
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
|
||||
@@ -1,131 +0,0 @@
|
||||
*features*
|
||||
|
||||
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
|
||||
@@ -1,49 +0,0 @@
|
||||
*gettinghelp*
|
||||
|
||||
Getting Help
|
||||
************
|
||||
|
||||
|
||||
Mailing Lists
|
||||
=============
|
||||
|
||||
If at any time you have any questions or feedback, feel free to post
|
||||
to one of the eclim mailing lists:
|
||||
|
||||
- eclim-user (http://groups.google.com/group/eclim-user): For all
|
||||
questions regarding installation, usage, troubleshooting, etc.
|
||||
- eclim-dev (http://groups.google.com/group/eclim-dev): For all
|
||||
eclim development related discussions.
|
||||
|
||||
IRC (#eclim on freenode.net)
|
||||
============================
|
||||
|
||||
If you would like to get help or ask questions on IRC, then feel free
|
||||
to join #eclim on freenode.net. Please note that I (Eric Van
|
||||
Dewoestine, ervandew on irc) try to stay in the channel as much as
|
||||
possible, but I might not be available to answer questions
|
||||
immediately. It's also worth noting that I live in California, so if
|
||||
you are in Europe, Asia, or some other timezone whose normal waking
|
||||
hours don't overlap well with mine, then you may be better off getting
|
||||
help using one of the mailing lists above.
|
||||
|
||||
|
||||
Reporting Bugs
|
||||
==============
|
||||
|
||||
If you've found a bug please report the issue to either the eclim-dev
|
||||
(http://groups.google.com/group/eclim-dev) mailing list or create a
|
||||
new issue on eclim's github issue tracker
|
||||
(http://github.com/ervandew/eclim/issues).
|
||||
|
||||
When reporting a bug, please include the following information:
|
||||
|
||||
- What OS are you on?
|
||||
- Linux users: please include the distro and version.
|
||||
- What version of eclim, vim, and eclipse are you using?
|
||||
- Linux users: please indicate whether you installed eclipse via
|
||||
your distro's package manager or not, and if not, please indicate
|
||||
what distribution of eclipse you are using ("Eclipse Classic",
|
||||
"Eclipse IDE for C/C++ Developers", some other eclipse bundle).
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,323 +0,0 @@
|
||||
*gettingstarted*
|
||||
|
||||
Getting Started
|
||||
***************
|
||||
|
||||
Once you've installed (|install|) eclim, the next step is to create
|
||||
your first project after which you can then start writing code and
|
||||
familiarizing yourself with eclim's features.
|
||||
|
||||
First make sure eclimd is running (see the eclimd docs (|eclimd|) if
|
||||
you are unsure how to start eclimd).
|
||||
|
||||
*gettingstarted-create*
|
||||
|
||||
|
||||
Creating your first project
|
||||
===========================
|
||||
|
||||
Once you've got eclimd running, open an instance of vim and create
|
||||
your project like so:
|
||||
|
||||
Note: Android Users: the android section below contains additional
|
||||
info regarding the creation of android projects.Maven Users: you may
|
||||
refer to the maven section below for an alternate way to create a
|
||||
java project.
|
||||
|
||||
>
|
||||
|
||||
:ProjectCreate /path/to/my_project -n java
|
||||
|
||||
<
|
||||
|
||||
|
||||
This example creates a project with a java nature (-n java), but the
|
||||
same method can be used to create a project for other languages by
|
||||
simply changing the nature accordingly:
|
||||
|
||||
>
|
||||
|
||||
:ProjectCreate /path/to/my_java_project -n android
|
||||
:ProjectCreate /path/to/my_c_project -n c
|
||||
:ProjectCreate /path/to/my_cpp_project -n c++
|
||||
:ProjectCreate /path/to/my_groovy_project -n groovy
|
||||
:ProjectCreate /path/to/my_java_project -n java
|
||||
:ProjectCreate /path/to/my_php_project -n php
|
||||
:ProjectCreate /path/to/my_python_project -n python
|
||||
:ProjectCreate /path/to/my_ruby_project -n ruby
|
||||
:ProjectCreate /path/to/my_scala_project -n scala
|
||||
|
||||
<
|
||||
|
||||
|
||||
The path supplied to the |:ProjectCreate| command will be the path to
|
||||
the root of your project. This path may or may not exist. If it does
|
||||
not exist it will be created for you. After you've created your
|
||||
project, there will be a .project file added to your project's root
|
||||
along with another file where references to your project's source
|
||||
directories and any third party libraries your project uses reside.
|
||||
The name of this file will vary depending on your project's nature,
|
||||
but in all cases eclim will provide you with commands to manage this
|
||||
file:
|
||||
|
||||
- java, android - .classpath file (|vim-java-classpath|)
|
||||
- php, ruby - .buildpath file (|vim-dltk-buildpath|)
|
||||
- c, c++ - .cproject, managed via the |:CProjectConfigs| command
|
||||
- python - .pydevproject file (|vim-python-path|)
|
||||
Once you've created your project you can use the :ProjectList command
|
||||
to list the available projects and you should see your newly created
|
||||
one in the list.
|
||||
|
||||
>
|
||||
|
||||
my_project - open - /path/to/my_project
|
||||
|
||||
<
|
||||
|
||||
|
||||
The :ProjectList result is in the form of projectName - (open|closed)
|
||||
- /project/root/path. When you create projects, the last path element
|
||||
will be used for the project name. If that element contains any
|
||||
spaces, these will be converted to underscores.
|
||||
|
||||
|
||||
Adding project source directories
|
||||
=================================
|
||||
|
||||
Before you can start writing code, you will first need to create and
|
||||
register your project's source directories. If you created your
|
||||
project from an existing code base, then this step may have been
|
||||
perform automatically for you, but you should validate the settings to
|
||||
be sure.
|
||||
|
||||
We will use a java project in this example but the steps for other
|
||||
languages are very similar. Please see the relevant docs for your
|
||||
language for more details:
|
||||
|
||||
- java and android (|vim-java-classpath|)
|
||||
- php and ruby (|vim-dltk-buildpath|)
|
||||
- c and c++ (|:CProjectConfigs|)
|
||||
- python (|vim-python-path|)
|
||||
For the purpose of this example we will assume that you will store
|
||||
your source files at:
|
||||
|
||||
>
|
||||
|
||||
/path/to/my_project/src/java
|
||||
|
||||
<
|
||||
|
||||
|
||||
So, given that location, you will need to open the file
|
||||
/path/to/my_project/.classpath in Vim.
|
||||
|
||||
>
|
||||
|
||||
vim /path/to/my_project/.classpath
|
||||
|
||||
<
|
||||
|
||||
|
||||
To add the source directory simply execute the following
|
||||
|
||||
>
|
||||
|
||||
:NewSrcEntry src/java
|
||||
|
||||
<
|
||||
|
||||
|
||||
This will add the necessary entry to the end of your .classpath file.
|
||||
The contents of this file should now look something like this:
|
||||
|
||||
>
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
<classpathentry kind="src" path="src/java"/>
|
||||
</classpath>
|
||||
|
||||
<
|
||||
|
||||
|
||||
Now that your source directory is setup, you can proceed to edit java
|
||||
files in that directory and make use of the java functionality
|
||||
(|vim-java-index|) provided by eclim.
|
||||
|
||||
*gettingstarted-coding*
|
||||
|
||||
|
||||
Writing code in your new project
|
||||
================================
|
||||
|
||||
Now that you have a project created, you can start writing code and
|
||||
utilize the features that eclim provides.
|
||||
|
||||
Note: Below we'll walk through a trivial java example, but some of
|
||||
the steps apply to all the languages that eclim supports, although
|
||||
the command names may differ a bit. For additional docs on working
|
||||
with the language of your choice, please see the relevant section of
|
||||
the docs:
|
||||
|
||||
- c/c++ (|vim-c-index|)
|
||||
- java (|vim-java-index|)
|
||||
- php (|vim-php-index|)
|
||||
- python (|vim-python-index|)
|
||||
- ruby (|vim-ruby-index|)
|
||||
- etc. (|vim-index|)
|
||||
Lets get started writing our first java application using eclim.
|
||||
|
||||
1. First, navigate to your new project's source directory (src/java
|
||||
in this example) and create any necessary package directories:
|
||||
>
|
||||
$ cd /path/to/my_project/src/java
|
||||
$ mkdir -p org/test/
|
||||
|
||||
<
|
||||
|
||||
2. Then start editing your first java source file:
|
||||
>
|
||||
$ vim org/test/TestMain.java
|
||||
|
||||
<
|
||||
|
||||
>
|
||||
package org.test;
|
||||
|
||||
public class TestMain
|
||||
{
|
||||
public static final void main(String[] args)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
<
|
||||
|
||||
3. You can start to use some of the core features now. For
|
||||
example, lets add the following code to the main method so we can
|
||||
test eclim's source code validation:
|
||||
>
|
||||
System.
|
||||
|
||||
<
|
||||
|
||||
Then save the file and note that an error marker is placed in the
|
||||
left margin of your file and when the cursor is on that line an
|
||||
error message is printed at the bottom of your vim window. You can
|
||||
also run :lopen to view all the errors in the file at once.
|
||||
|
||||
4. Now lets try out code completion. Place your cursor on the '.'
|
||||
of 'System.' and start insert mode in vim using 'a', then follow
|
||||
the example below:
|
||||
>
|
||||
System.<ctrl-x><ctrl-u> // starts the completion mode
|
||||
System.<ctrl-n> // cycle through the completion suggestions
|
||||
System.out // assuming you chose the 'out' suggestion
|
||||
System.out.p<ctrl-x><ctrl-u> // now start completion again
|
||||
System.out.p<ctrl-n> // hit <ctrl-n> until you get 'println'
|
||||
System.out.println(
|
||||
System.out.println("Hello World"); // finish up the example code.
|
||||
|
||||
<
|
||||
|
||||
5. After saving the file you should have no more validation errors,
|
||||
so now we can run the code like so:
|
||||
>
|
||||
:Java
|
||||
|
||||
<
|
||||
|
||||
After running the :Java command in vim you should now see your
|
||||
output in a new split window.
|
||||
|
||||
This only scratches the surface on the number of java features
|
||||
(|vim-java-index|) that eclim provides, but hopefully this example was
|
||||
enough to get you started.
|
||||
|
||||
*gettingstarted-android*
|
||||
|
||||
|
||||
Android Users
|
||||
=============
|
||||
|
||||
Creating an android project is the same as creating a regular java
|
||||
project, but you use the android nature instead:
|
||||
|
||||
>
|
||||
|
||||
:ProjectCreate /path/to/my_project -n android
|
||||
|
||||
<
|
||||
|
||||
|
||||
This will result in a series of prompts for you to input your
|
||||
project's information:
|
||||
|
||||
Note: at any point in this process you can use Ctrl+C to cancel the
|
||||
project creation.
|
||||
|
||||
1. First you will be asked to choose the target android platform.
|
||||
If you have only one platform installed on your system, this prompt
|
||||
will be skipped and that platform will be used when creating the
|
||||
project. If you have no platforms installed then you will receive
|
||||
an error directing you to install a platform using the Android SDK
|
||||
Manager. If you install a new platform you will need to either
|
||||
restart eclipse/eclimd or run the eclim supplied |:AndroidReload|
|
||||
command.
|
||||
2. Next you will be asked to supply a package name (Ex:
|
||||
com.mycompany.myapp).
|
||||
3. Then you will need to supply a name for your application.
|
||||
4. The next prompt will ask you if you are creating a library
|
||||
project or not. Most likely you are not, so type 'n' here to
|
||||
proceed.
|
||||
5. Lastly, if you are not creating a library project, you will be
|
||||
asked whether or not you want to have a new android activity
|
||||
created for you and if so, you will be asked for the name of that
|
||||
activity.
|
||||
Once you've finished supplying the necessary information, your android
|
||||
project will be created. An android project is simply a specialized
|
||||
java project, so you can now leverage all the eclim provided java
|
||||
functionality (|vim-java-index|) while developing your app.
|
||||
|
||||
*gettingstarted-maven*
|
||||
|
||||
|
||||
Maven Users
|
||||
===========
|
||||
|
||||
Creating your first project with maven can be accomplished using the
|
||||
same method as any other java project, or you can utilize some of
|
||||
maven's built in features to get your project started.
|
||||
|
||||
1. Run maven's generate archetype to create the project directory
|
||||
and samples:
|
||||
>
|
||||
$ mvn archetype:generate
|
||||
|
||||
<
|
||||
|
||||
2. Once you've created the initial project directory, cd into that
|
||||
directory and run the following command to generate the necessary
|
||||
eclipse files:
|
||||
>
|
||||
$ cd <project_dir>
|
||||
$ mvn eclipse:eclipse
|
||||
|
||||
<
|
||||
|
||||
3. Now you can start an instance of vim at the project's root
|
||||
directory and run the following commands to:
|
||||
- set the necessary eclipse classpath variable to point to your
|
||||
maven repository.
|
||||
- import your new project into eclipse.
|
||||
>
|
||||
$ vim
|
||||
:MvnRepo
|
||||
:ProjectImport /path/to/new/project
|
||||
|
||||
<
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,329 +0,0 @@
|
||||
*index*
|
||||
|
||||
Welcome to Eclim
|
||||
****************
|
||||
|
||||
The power of Eclipse in your favorite editor.
|
||||
|
||||
|
||||
What is it?
|
||||
===========
|
||||
|
||||
Eclim provides the ability to access Eclipse (http://eclipse.org) code
|
||||
editing features (code completion, searching, code validation, and
|
||||
many more (|features|)) via the command line or a local network
|
||||
connection, allowing those features to be integrated with your
|
||||
favorite editor. Eclim provides an integration with Vim
|
||||
(http://www.vim.org), but third party clients (|relatedprojects|) have
|
||||
been created to add eclim support to other editors as well (emacs,
|
||||
sublime text 2, textmate).
|
||||
|
||||
There are three primary usage scenarios in which eclim is designed to
|
||||
be used:
|
||||
|
||||
[image]
|
||||
|
||||
1. The first scenario (|eclimd-headless|) is for those for which
|
||||
vim is their primary editing interface. In this scenario you run a
|
||||
headless instance of eclipse which all vim instances can then
|
||||
communicate with to provide the various eclipse features.
|
||||
2. The second scenario (|eclimd-headed|) is for those who prefer
|
||||
using vim as their main interface, but frequently end up jumping
|
||||
back to eclipse for any features not provided by eclim. In this
|
||||
case you can run the eclim server inside of the eclipse gui and
|
||||
then interact with it via external vim instances just like the
|
||||
first scenario.
|
||||
3. The last scenario (|gvim-embedded|) is for those who wish to use
|
||||
the eclipse interface full time, but want to use gvim as an
|
||||
embedded eclipse editor. Just like the previous use case, the eclim
|
||||
server is run inside of the eclipse gui and the embedded gvim will
|
||||
interact with it just like external vim instances would. This
|
||||
feature is only support on Windows and Unix systems (where gvim is
|
||||
compiled with the gtk gui).
|
||||
Note: Please be aware that the embedded vim does not behave like
|
||||
a standard eclipse editor. It's a separate program (vim) embedded
|
||||
into eclipse, so eclipse features are provided by eclim's vim
|
||||
plugins and not the usual eclipse key bindings, context menus,
|
||||
etc. For those that just want vim like key bindings in their
|
||||
eclipse editors, vrapper (http://vrapper.sourceforge.net/home/)
|
||||
is an excellent alternative which provides exactly that.
|
||||
|
||||
Eclim is released under the GPLv3
|
||||
(http://www.gnu.org/licenses/gpl-3.0-standalone.html).
|
||||
|
||||
|
||||
How do I get/install it?
|
||||
========================
|
||||
|
||||
You can follow the eclim install guide (|install|) which will walk you
|
||||
through downloading and installing eclim.
|
||||
|
||||
|
||||
How do I use it?
|
||||
================
|
||||
|
||||
After you've installed eclim, you can refer to the getting started
|
||||
(|gettingstarted|) page which will walk you through creating your
|
||||
first project.
|
||||
|
||||
|
||||
Where can I get help?
|
||||
=====================
|
||||
|
||||
|
||||
Mailing Lists
|
||||
-------------
|
||||
|
||||
If at any time you have any questions or feedback, feel free to post
|
||||
to one of the eclim mailing lists:
|
||||
|
||||
- eclim-user (http://groups.google.com/group/eclim-user): For all
|
||||
questions regarding installation, usage, troubleshooting, etc.
|
||||
- eclim-dev (http://groups.google.com/group/eclim-dev): For all
|
||||
eclim development related discussions.
|
||||
|
||||
IRC (#eclim on freenode.net)
|
||||
----------------------------
|
||||
|
||||
If you would like to get help or ask questions on IRC, then feel free
|
||||
to join #eclim on freenode.net. Please note that I (Eric Van
|
||||
Dewoestine, ervandew on irc) try to stay in the channel as much as
|
||||
possible, but I might not be available to answer questions
|
||||
immediately. It's also worth noting that I live in California, so if
|
||||
you are in Europe, Asia, or some other timezone whose normal waking
|
||||
hours don't overlap well with mine, then you may be better off getting
|
||||
help using one of the mailing lists above.
|
||||
|
||||
|
||||
How do I report a bug?
|
||||
======================
|
||||
|
||||
|
||||
Reporting Bugs
|
||||
--------------
|
||||
|
||||
If you've found a bug please report the issue to either the eclim-dev
|
||||
(http://groups.google.com/group/eclim-dev) mailing list or create a
|
||||
new issue on eclim's github issue tracker
|
||||
(http://github.com/ervandew/eclim/issues).
|
||||
|
||||
When reporting a bug, please include the following information:
|
||||
|
||||
- What OS are you on?
|
||||
- Linux users: please include the distro and version.
|
||||
- What version of eclim, vim, and eclipse are you using?
|
||||
- Linux users: please indicate whether you installed eclipse via
|
||||
your distro's package manager or not, and if not, please indicate
|
||||
what distribution of eclipse you are using ("Eclipse Classic",
|
||||
"Eclipse IDE for C/C++ Developers", some other eclipse bundle).
|
||||
|
||||
What's New?
|
||||
===========
|
||||
|
||||
[image: Rss Feed for What's New][image] (index.rss)
|
||||
|
||||
|
||||
Aug 24, 2014
|
||||
------------
|
||||
|
||||
Eclim has finally been released with Eclipse Luna support. Please note
|
||||
however that 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.
|
||||
|
||||
- Eclim 2.4.0 (|2.4.0|)
|
||||
|
||||
May 07, 2014
|
||||
------------
|
||||
|
||||
Release of eclim for indigo users.
|
||||
|
||||
- Eclim 1.7.19 (|1.7.19|)
|
||||
|
||||
Apr. 12, 2014
|
||||
-------------
|
||||
|
||||
Eclim has been updated to fix an issue on Windows that could prevent
|
||||
many features from working.
|
||||
|
||||
- Eclim 2.3.4 (|2.3.4|)
|
||||
|
||||
Apr. 06, 2014
|
||||
-------------
|
||||
|
||||
This release includes many bug fixes and refinements as well as a
|
||||
rewrite of eclim's python support to utilize pydev instead of rope.
|
||||
|
||||
- Eclim 2.3.3 (|2.3.3|)
|
||||
Warning: Any exiting eclim python projects you have should be
|
||||
re-created with the new python nature:>
|
||||
|
||||
:ProjectCreate /path/to/project -n python
|
||||
|
||||
<
|
||||
|
||||
|
||||
|
||||
Sep. 12, 2013
|
||||
-------------
|
||||
|
||||
This release fixes the extraction of the necessary vim files when
|
||||
installing scala support.
|
||||
|
||||
- Eclim 2.3.2 (|2.3.2|) for Eclipse 4.3 (Kepler).
|
||||
- Eclim 1.7.18 (|1.7.18|) for Eclipse 3.7/3.8 (Indigo).
|
||||
|
||||
Jul. 27, 2013
|
||||
-------------
|
||||
|
||||
The previous eclim installer for Kepler was still pointing at the Juno
|
||||
update site. This release remedies that.
|
||||
|
||||
- Eclim 2.3.1 (|2.3.1|) for Eclipse 4.3 (Kepler).
|
||||
|
||||
Jul. 21, 2013
|
||||
-------------
|
||||
|
||||
The focus of this release is to bring eclim fully up to date with
|
||||
Eclipse Kepler support. The installer for eclim 2.3.0 now requires
|
||||
that you install against Kepler.
|
||||
|
||||
- Eclim 2.3.0 (|2.3.0|) for Eclipse 4.3 (Kepler).
|
||||
- Eclim 1.7.17 (|1.7.17|) for Eclipse 3.7/3.8 (Indigo).
|
||||
|
||||
Jul. 14, 2013
|
||||
-------------
|
||||
|
||||
This is primarily a bug fix release with a few new features. Unless
|
||||
some critical error is found, this will be the last release targeting
|
||||
Juno. The next release will likely target Kepler though this release
|
||||
should work fine on Kepler as well, with the exception of scala
|
||||
support which has not been tested. Indigo support will continue but
|
||||
will likely end with the release of Luna, possibly sooner.
|
||||
|
||||
- Eclim 2.2.7 (|2.2.7|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.16 (|1.7.16|) for Eclipse 3.7/3.8 (Indigo).
|
||||
|
||||
May 18, 2013
|
||||
------------
|
||||
|
||||
Eclim has been updated to support the Android Development Toolkit
|
||||
version 22.0.0, scala is now supported for both Juno and Indigo, and
|
||||
there are a few other improvements and many bug fixes.
|
||||
|
||||
- Eclim 2.2.6 (|2.2.6|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.14 (|1.7.14|) for Eclipse 3.7/3.8 (Indigo).
|
||||
|
||||
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 (|2.2.5|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.13 (|1.7.13|) 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 (|2.2.4|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.12 (|1.7.12|) 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 (|2.2.3|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.11 (|1.7.11|) 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 (|2.2.2|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.10 (|1.7.10|) for Eclipse 3.7 (Indigo).
|
||||
|
||||
Sep. 09, 2012
|
||||
-------------
|
||||
|
||||
Eclim 1.7.9 (|1.7.9|) 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 (|2.2.1|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.8 (|1.7.8|) 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 (|2.2.0|) for Eclipse 4.2 (Juno).
|
||||
- Eclim 1.7.7 (|1.7.7|) for Eclipse 3.7 (Indigo).
|
||||
|
||||
Jun. 07, 2012
|
||||
-------------
|
||||
|
||||
Eclim 1.7.6 (|1.7.6|) is now available.
|
||||
This is a minor bug fix release.
|
||||
|
||||
|
||||
Jun. 03, 2012
|
||||
-------------
|
||||
|
||||
Eclim 1.7.5 (|1.7.5|) 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 (|1.7.4|) is now available.
|
||||
This is a bug fix release.
|
||||
|
||||
|
||||
Mar. 18, 2012
|
||||
-------------
|
||||
|
||||
Eclim 1.7.3 (|1.7.3|) 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.
|
||||
|
||||
Eclim News Archive (|archive-news|)
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,593 +0,0 @@
|
||||
*install*
|
||||
|
||||
Download / Install
|
||||
******************
|
||||
|
||||
|
||||
Requirements
|
||||
============
|
||||
|
||||
Before beginning the installation, first confirm that you have met the
|
||||
following requirements.
|
||||
|
||||
- Java Development Kit
|
||||
(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
|
||||
1.7 or greater
|
||||
- Vim (http://www.vim.org/download.php) 7.1 or greater
|
||||
- Eclipse eclipse_version (http://eclipse.org/downloads/index.php)
|
||||
- Mac and Linux users must also have make and gcc installed.
|
||||
Minimum Vim Settings: In order for eclim to function properly, there
|
||||
is a minimum set of vim options that must be enabled in your vimrc
|
||||
file (:h vimrc).
|
||||
|
||||
- set nocompatible
|
||||
Execute :h 'compatible' for more info. You can confirm that
|
||||
compatibliity is turned off by executing the following in vim:
|
||||
|
||||
>
|
||||
:echo &compatible
|
||||
|
||||
<
|
||||
|
||||
Which should output '0', but if not, then add the following to
|
||||
your ~/.vimrc files (_vimrc on Windows):
|
||||
|
||||
>
|
||||
set nocompatible
|
||||
|
||||
<
|
||||
|
||||
- filetype plugin on
|
||||
Execute :h filetype-plugin-on for more info. You can confirm that
|
||||
file type plugins are enabled by executing the following:
|
||||
|
||||
>
|
||||
:filetype
|
||||
|
||||
<
|
||||
|
||||
Which should output 'filetype detection:ON plugin:ON indent:ON',
|
||||
showing at least 'ON' for 'detection' and 'plugin', but if not,
|
||||
then update your ~/.vimrc (_vimrc on Windows) to include:
|
||||
|
||||
>
|
||||
filetype plugin indent on
|
||||
|
||||
<
|
||||
|
||||
|
||||
Download
|
||||
========
|
||||
|
||||
You can find the official eclim installer on eclim's sourceforge
|
||||
downloads page (https://sourceforge.net/projects/eclim/files/eclim/):
|
||||
|
||||
- eclim_2.4.0.jar
|
||||
(http://sourceforge.net/projects/eclim/files/eclim/2.4.0/eclim_2.4.0.jar/download)
|
||||
|
||||
Third Party Packages
|
||||
--------------------
|
||||
|
||||
As an alternative to the official installer, there are also some
|
||||
packages maintained by third parties:
|
||||
|
||||
- Arch: aur (eclim) (http://aur.archlinux.org/packages.php?ID=7291),
|
||||
aur (eclim-git) (http://aur.archlinux.org/packages.php?ID=33120)
|
||||
|
||||
Installing / Upgrading
|
||||
======================
|
||||
|
||||
Eclim can be installed a few different ways depending on your
|
||||
preference and environment:
|
||||
|
||||
- Graphical Installer
|
||||
- Unattended (automated) Installer
|
||||
- Build from source
|
||||
- Install on a headless server
|
||||
*installer*
|
||||
|
||||
|
||||
Graphical Installer
|
||||
-------------------
|
||||
|
||||
|
||||
Step 1: Run the installer
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Note: If you have eclipse running, please close it prior to starting
|
||||
the installation procedure.
|
||||
|
||||
- First download the installer: eclim_2.4.0.jar
|
||||
(http://sourceforge.net/projects/eclim/files/eclim/2.4.0/eclim_2.4.0.jar/download)
|
||||
- Next run the installer:
|
||||
>
|
||||
$ java -jar eclim_2.4.0.jar
|
||||
|
||||
<
|
||||
|
||||
Windows and OSX users should be able to simply double click on the
|
||||
jar file to start the installer.
|
||||
|
||||
After the installer starts up, simply follow the steps in the wizard
|
||||
to install eclim.
|
||||
|
||||
If your machine is behind a proxy, take a look at the instructions
|
||||
for running the installer behind a proxy.
|
||||
|
||||
If you encounter an error running the installer, then consult the
|
||||
known potential issues below.
|
||||
|
||||
|
||||
Step 2: Test the installation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To test eclim you first need to start the eclim daemon. How you start
|
||||
the daemon will depend on how you intend to use eclim.
|
||||
|
||||
Note: More info on running the eclim daemon can be found in the
|
||||
eclimd (|eclimd|) docs.
|
||||
|
||||
If you plan on using eclim along with the eclipse gui, then simply
|
||||
start eclipse and open the eclimd view:
|
||||
|
||||
Window ‣ Show View ‣ Other ‣ Eclim ‣ eclimd
|
||||
|
||||
By default the eclimd view will also be auto opened when you open a
|
||||
file using:
|
||||
|
||||
Open With ‣ Vim
|
||||
|
||||
If you plan on using eclim without the eclipse gui, then:
|
||||
|
||||
- start the eclimd server.
|
||||
- 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
|
||||
|
||||
<
|
||||
|
||||
- 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
|
||||
|
||||
<
|
||||
|
||||
Once you have the eclim daemon (headed or headless) running, you can
|
||||
then test eclim:
|
||||
|
||||
- open a vim window and issue the command, :PingEclim
|
||||
(|vim-core-eclim#:PingEclim|). The result of executing this command
|
||||
should be the eclim and eclipse version echoed to the bottom of your
|
||||
Vim window. If however, you receive unable to connect to eclimd -
|
||||
connect: Connection refused, or something similar, then your eclimd
|
||||
server is not running or something is preventing eclim from
|
||||
connecting to it. If you receive this or any other errors you can
|
||||
start by first examining the eclimd output to see if it gives any
|
||||
info as to what went wrong. If at this point you are unsure how to
|
||||
proceed you can view the troubleshooting guide (|troubleshooting|)
|
||||
or feel free to post your issue on the eclim-user
|
||||
(http://groups.google.com/group/eclim-user) mailing list.
|
||||
Example of a successful ping:
|
||||
|
||||
[image]
|
||||
Example of a failed ping:
|
||||
|
||||
[image]
|
||||
- Regardless of the ping result, you can also verify your vim
|
||||
settings using the command :EclimValidate. This will check various
|
||||
settings and options and report any problems. If all is ok you will
|
||||
receive the following message:
|
||||
>
|
||||
Result: OK, required settings are valid.
|
||||
|
||||
<
|
||||
|
||||
*installer-proxy*
|
||||
|
||||
|
||||
Running The Installer Behind a Proxy
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
If you are behind a proxy, you may need to run the installer like so
|
||||
(be sure to take a look at the related faq (|eclim-proxy|) as well):
|
||||
|
||||
>
|
||||
|
||||
$ java -Dhttp.proxyHost=my.proxy -Dhttp.proxyPort=8080 -jar eclim_2.4.0.jar
|
||||
|
||||
<
|
||||
|
||||
|
||||
If your proxy requires authentication, you'll need to supply the
|
||||
-Dhttp.proxyUser and -Dhttp.proxyPassword properties as well.
|
||||
|
||||
You can also try the following which may be able to use your system
|
||||
proxy settings:
|
||||
|
||||
>
|
||||
|
||||
$ java -Djava.net.useSystemProxies=true -jar eclim_2.4.0.jar
|
||||
|
||||
<
|
||||
|
||||
|
||||
*installer-issues*
|
||||
|
||||
|
||||
Potential Installation Issues
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In some rare cases you might encounter one of the following errors:
|
||||
|
||||
1. Any exception which denotes usage of gcj.
|
||||
>
|
||||
java.lang.NullPointerException
|
||||
at org.pietschy.wizard.HTMLPane.updateEditorColor(Unknown Source)
|
||||
at org.pietschy.wizard.HTMLPane.setEditorKit(Unknown Source)
|
||||
at javax.swing.JEditorPane.getEditorKit(libgcj.so.90)
|
||||
...
|
||||
|
||||
<
|
||||
|
||||
Gcj (GNU Compile for Java), is not currently supported. If you
|
||||
receive any error which references libgcj, then gcj is your current
|
||||
default jvm. So, you'll need to install the openjdk or a jdk from
|
||||
oracle to resolve the installation error.
|
||||
|
||||
2. >
|
||||
java.lang.IncompatibleClassChangeError
|
||||
at org.formic.ant.logger.Log4jLogger.printMessage(Log4jLogger.java:51)
|
||||
...
|
||||
|
||||
<
|
||||
|
||||
This is most likely caused by an incompatible version of log4j
|
||||
installed in your jave ext.dirs. To combat this you can run the
|
||||
installer like so:
|
||||
|
||||
>
|
||||
$ java -Djava.ext.dirs -jar eclim_2.4.0.jar
|
||||
|
||||
<
|
||||
|
||||
If you encounter an error not covered here, then please report it to
|
||||
the eclim-user (http://groups.google.com/group/eclim-user) mailing
|
||||
list.
|
||||
|
||||
*installer-automated*
|
||||
|
||||
|
||||
Unattended (automated) install
|
||||
------------------------------
|
||||
|
||||
As of eclim 1.5.6 the eclim installer supports the ability to run an
|
||||
automated install without launching the installer gui. Simply run the
|
||||
installer as shown below, supplying the location of your vim files and
|
||||
your eclipse install via system properties:
|
||||
|
||||
>
|
||||
|
||||
$ java \
|
||||
-Dvim.files=$HOME/.vim \
|
||||
-Declipse.home=/opt/eclipse \
|
||||
-jar eclim_2.4.0.jar install
|
||||
|
||||
<
|
||||
|
||||
|
||||
Please note that when using this install method, the installer will
|
||||
only install eclim features whose third party dependecies are already
|
||||
present in your eclipse installation. So before installing eclim, you
|
||||
must make sure that you've already installed the necessary
|
||||
dependencies (for a full list of dependencies, you can reference
|
||||
eclim's installer dependencies
|
||||
(https://github.com/ervandew/eclim/blob/master/org.eclim.installer/build/resources/dependencies.xml)
|
||||
file).
|
||||
|
||||
Required Properties:
|
||||
|
||||
- eclipse.home - The absolute path to your eclipse installation.
|
||||
- vim.files (or vim.skip=true) - The absolute path to your vim files
|
||||
directory. Or if you want to omit the installation of the vim files
|
||||
(emacs-eclim users for example) you can supply -Dvim.skip=true
|
||||
instead.
|
||||
*install-source*
|
||||
|
||||
|
||||
Building from source
|
||||
--------------------
|
||||
|
||||
|
||||
1. Check out the code:
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
>
|
||||
|
||||
$ git clone git://github.com/ervandew/eclim.git
|
||||
|
||||
<
|
||||
|
||||
|
||||
Note: If you are still using Eclipse 3.7 (Indigo) you will need to
|
||||
checkout the eclim indigo branch before attempting to build eclim:>
|
||||
|
||||
$ cd eclim
|
||||
$ git checkout indigo
|
||||
|
||||
<
|
||||
|
||||
|
||||
|
||||
2. Build eclim:
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
>
|
||||
|
||||
$ cd eclim
|
||||
$ ant -Declipse.home=/your/eclipse/home/dir
|
||||
|
||||
<
|
||||
|
||||
|
||||
Note: If your eclipse home path contains a space, be sure to quote
|
||||
it:>
|
||||
|
||||
> ant "-Declipse.home=C:/Program Files/eclipse"
|
||||
|
||||
<
|
||||
|
||||
|
||||
This will build and deploy eclim to your eclipse and vim directories.
|
||||
|
||||
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 see an eclipse feature in that list that you know you
|
||||
have, it may be the case that you installed it as a regular user, so
|
||||
that feature was installed in your user local eclipse directory. In
|
||||
that case you will need to notify the build of that directory so it
|
||||
can examine it as well (just replace the <version> portion below with
|
||||
the actual version found in your ~/.eclipse directory):
|
||||
|
||||
>
|
||||
|
||||
$ ant \
|
||||
-Declipse.home=/opt/eclipse \
|
||||
-Declipse.local=$HOME/.eclipse/org.eclipse.platform_<version>
|
||||
|
||||
<
|
||||
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
*install-headless*
|
||||
|
||||
|
||||
Installing on a headless server
|
||||
-------------------------------
|
||||
|
||||
The eclim daemon supports running both inside of the eclipse gui and
|
||||
as a "headless" non-gui server. However, even in the headless mode,
|
||||
eclipse still requires a running X server to function. If you are
|
||||
running eclim on a desktop then this isn't a problem, but some users
|
||||
would like to run the eclim daemon on a truly headless server. To
|
||||
achieve this, you can make use of X.Org's Xvfb server.
|
||||
|
||||
Note: This guide uses the Ubuntu server distribution to illustrate
|
||||
the process of setting up a headless server, but you should be able
|
||||
to run Xvfb on the distro of your choice by translating the package
|
||||
names used here to your distro's equivalents.
|
||||
|
||||
The first step is to install the packages that are required to run
|
||||
eclipse and eclim:
|
||||
|
||||
- Install a java jdk, xvfb, and the necessary build tools to compile
|
||||
eclim's nailgun client during installation (make, gcc, etc).
|
||||
>
|
||||
$ sudo apt-get install openjdk-6-jdk xvfb build-essential
|
||||
|
||||
<
|
||||
|
||||
Then you'll need to install eclipse. You may do so by installing it
|
||||
from your distro's package manager or using a version found on
|
||||
eclipse.org (http://eclipse.org/downloads/). If you choose to install
|
||||
a version from you package manager, make sure that the version to be
|
||||
installed is compatible with eclim since the package manager version
|
||||
can often be out of date. If you choose to install an eclipse.org
|
||||
(http://eclipse.org/downloads/) version, you can do so by first
|
||||
downloading eclipse using either a console based browser like elinks,
|
||||
or you can navigate to the download page on your desktop and copy the
|
||||
download url and use wget to download the eclipse archive. Once
|
||||
downloaded, you can then extract the archive in the directory of your
|
||||
choice.
|
||||
|
||||
>
|
||||
|
||||
$ wget <eclipse_mirror>/eclipse-<version>-linux-gtk.tar.gz
|
||||
$ tar -zxf eclipse-<version>-linux-gtk.tar.gz
|
||||
|
||||
<
|
||||
|
||||
|
||||
Note: Depending on what distribution of eclipse you installed and
|
||||
what eclim features you would like to be installed, you may need to
|
||||
install additional eclipse features. If you installed eclipse from
|
||||
your package manager then your package manager may also have the
|
||||
required dependency (eclipse-cdt for C/C++ support for example). If
|
||||
not, you can install the required dependency using eclipse's p2
|
||||
command line client. Make sure the command references the correct
|
||||
repository for your eclipse install (juno in this example) and that
|
||||
you have Xvfb running as described in the last step of this guide:>
|
||||
|
||||
DISPLAY=:1 ./eclipse/eclipse -nosplash -consolelog -debug
|
||||
-application org.eclipse.equinox.p2.director
|
||||
-repository http://download.eclipse.org/releases/juno
|
||||
-installIU org.eclipse.wst.web_ui.feature.feature.group
|
||||
|
||||
<
|
||||
|
||||
|
||||
For a list of eclim plugins and which eclipse features they require,
|
||||
please see the installer dependencies
|
||||
(https://github.com/ervandew/eclim/blob/master/org.eclim.installer/build/resources/dependencies.xml).
|
||||
Note that the suffix '.feature.group' must be added to the
|
||||
dependency id found in that file when supplying it to the
|
||||
'-installIU' arg of the above command.
|
||||
|
||||
Once eclipse is installed, you can then install eclim utilizing the
|
||||
eclim installer's automated install option (see the Unattended
|
||||
(automated) install section for additional details):
|
||||
|
||||
>
|
||||
|
||||
$ java \
|
||||
-Dvim.files=$HOME/.vim \
|
||||
-Declipse.home=/opt/eclipse \
|
||||
-jar eclim_2.4.0.jar install
|
||||
|
||||
<
|
||||
|
||||
|
||||
The last step is to start Xvfb followed by eclimd:
|
||||
|
||||
>
|
||||
|
||||
$ Xvfb :1 -screen 0 1024x768x24 &
|
||||
$ DISPLAY=:1 ./eclipse/eclimd -b
|
||||
|
||||
<
|
||||
|
||||
|
||||
When starting Xvfb you may receive some errors regarding font paths
|
||||
and possibly dbus and hal, but as long as Xvfb continues to run, you
|
||||
should be able to ignore these errors.
|
||||
|
||||
The first time you start eclimd you may want to omit the 'start'
|
||||
argument so that you can see the output on the console to ensure that
|
||||
eclimd starts correctly.
|
||||
|
||||
Note: When starting the eclim daemon, you must start it as the same
|
||||
user who will be running vim.
|
||||
|
||||
|
||||
Upgrading
|
||||
---------
|
||||
|
||||
The upgrading procedure is the same as the installation procedure but
|
||||
please be aware that the installer will remove the previous version of
|
||||
eclim prior to installing the new one. The installer will delete all
|
||||
the org.eclim* eclipse plugins along with all the files eclim adds to
|
||||
your .vim or vimfiles directory (plugin/eclim.vim, eclim/**/*).
|
||||
|
||||
*uninstall*
|
||||
|
||||
|
||||
Uninstall
|
||||
=========
|
||||
|
||||
To uninstall eclim you can use any eclim distribution jar whose
|
||||
version is 1.7.5 or greater by running it with the 'uninstaller'
|
||||
argument like so:
|
||||
|
||||
>
|
||||
|
||||
$ java -jar eclim_2.4.0.jar uninstaller
|
||||
|
||||
<
|
||||
|
||||
|
||||
That will open a graphical wizard much like the install wizard which
|
||||
will ask you again for the location of your vimfiles and eclipse home
|
||||
where you've installed eclim and will then remove the eclim
|
||||
installation accordingly.
|
||||
|
||||
Note: The uninstaller is backwards compatible and can be used to
|
||||
uninstall older versions of eclim.
|
||||
|
||||
*uninstall-automated*
|
||||
|
||||
|
||||
Unattended (automated) uninstall
|
||||
--------------------------------
|
||||
|
||||
Like the installer, the uninstaller also supports an unattended
|
||||
uninstall. You just need to supply your vim files and eclipse paths as
|
||||
system properties:
|
||||
|
||||
>
|
||||
|
||||
$ java \
|
||||
-Dvim.files=$HOME/.vim \
|
||||
-Declipse.home=/opt/eclipse \
|
||||
-jar eclim_2.4.0.jar uninstall
|
||||
|
||||
<
|
||||
|
||||
|
||||
Required Properties:
|
||||
|
||||
- eclipse.home - The absolute path to your eclipse installation.
|
||||
- vim.files (or vim.skip=true) - The absolute path to your vim files
|
||||
directory. Or if you never installed the vim files (emacs-eclim
|
||||
users for example) you can supply -Dvim.skip=true instead.
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,22 +0,0 @@
|
||||
*relatedprojects*
|
||||
|
||||
Related Projects
|
||||
****************
|
||||
|
||||
|
||||
Eclim clients for other editors:
|
||||
================================
|
||||
|
||||
- Emacs (emacs-eclim (http://github.com/senny/emacs-eclim))
|
||||
- Sublime Text 2 (Subclim (http://github.com/JulianEberius/Subclim))
|
||||
- Texmate (Eclim.tmbundle
|
||||
(http://github.com/JulianEberius/Eclim.tmbundle))
|
||||
|
||||
Vim emulator plugins for Eclipse:
|
||||
=================================
|
||||
|
||||
- Vrapper (http://vrapper.sourceforge.net) (free and open source)
|
||||
- viPlugin (http://www.satokar.com/viplugin/index.php)
|
||||
- Viable (http://viableplugin.com)
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,24 +0,0 @@
|
||||
*vim-c-complete*
|
||||
|
||||
C/C++ Code Completion
|
||||
*********************
|
||||
|
||||
C/C++ code completion uses the standard Vim code completion mechanism
|
||||
(|vim-code_completion|) like so:
|
||||
|
||||
>
|
||||
|
||||
#include <st<C-X><C-U>
|
||||
#include <stio.h>
|
||||
|
||||
int main(void) {
|
||||
pu<C-X><C-U>
|
||||
puts(
|
||||
puts("Hello World");
|
||||
return EX<C-X><C-U>
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
<
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,30 +0,0 @@
|
||||
*vim-c-index*
|
||||
|
||||
C/C++
|
||||
*****
|
||||
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
- C/C++ Project Configuration (vim-c-project)
|
||||
- C/C++ Code Completion (vim-c-complete)
|
||||
- C/C++ Validation (vim-c-validate)
|
||||
- C/C++ Search (vim-c-search)
|
||||
- C/C++ Code Inspection (vim-c-inspection)
|
||||
|
||||
Suggested Mappings
|
||||
==================
|
||||
|
||||
Here are some mappings for the c/c++ funtionality provided by eclim.
|
||||
To make use of these mappings, simply create a ftplugin file for c/cpp
|
||||
and place your mappings there (:help ftplugin-name).
|
||||
|
||||
- The following mapping allows you to simply hit <enter> on an
|
||||
element to perform a search to find it.
|
||||
>
|
||||
nnoremap <silent> <buffer> <cr> :CSearchContext<cr>
|
||||
|
||||
<
|
||||
|
||||
vim:ft=eclimhelp
|
||||
@@ -1,59 +0,0 @@
|
||||
*vim-c-inspection*
|
||||
|
||||
*:CCallHierarchy*
|
||||
|
||||
|
||||
C/C++ Code Inspection
|
||||
*********************
|
||||
|
||||
|
||||
Call Hierarchy
|
||||
==============
|
||||
|
||||
When viewing a c or c++ source file you can view the call hierarchy of
|
||||
a function or method by issuing the command :CCallHierarchy. This
|
||||
will open a temporary buffer with an inversed tree view of the
|
||||
hierarchy of callers of the requested function or method.
|
||||
|
||||
>
|
||||
|
||||
fun2(int)
|
||||
fun1(int)
|
||||
main()
|
||||
fun3(int)
|
||||
fun3(int)
|
||||
|
||||
<
|
||||
|
||||
|
||||
While you are in the hierarchy tree buffer, you can jump to the call
|
||||
under the cursor using one of the following key bindings:
|
||||
|
||||
- <cr> - open the type using the (default action).
|
||||
- E - open the type via :edit
|
||||
- S - open the type via :split
|
||||
- T - open the type via :tabnew
|
||||
- ? - view help buffer
|
||||
:CCallHierarchy can also be used to view the callees for a function or
|
||||
method by invoking the command with a !:
|
||||
|
||||
>
|
||||
|
||||
:CCallHierarchy!
|
||||
|
||||
<
|
||||
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Vim Settings (|vim-settings|)
|
||||
|
||||
*g:EclimCCallHierarchyDefaultAction*
|
||||
|
||||
- g:EclimCCallHierarchyDefaultAction (defaults to 'split') -
|
||||
Determines the command used to open the file when hitting <enter> on
|
||||
an entry in the hierarchy buffer.
|
||||
|
||||
vim:ft=eclimhelp
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user