Installed eclim + remved autocomplete plugins

This commit is contained in:
Dreaded_X 2014-08-31 22:16:01 +02:00
parent 9b88b794a1
commit ce98650c57
226 changed files with 32126 additions and 4 deletions

3
.gitmodules vendored
View File

@ -7,9 +7,6 @@
[submodule "vim/bundle/vim-tmux-navigator"]
path = vim/bundle/vim-tmux-navigator
url = git@github.com:christoomey/vim-tmux-navigator.git
[submodule "vim/bundle/YouCompleteMe"]
path = vim/bundle/YouCompleteMe
url = git@github.com:Valloric/YouCompleteMe
[submodule "vim/bundle/bufexplorer"]
path = vim/bundle/bufexplorer
url = git@github.com:jlanzarotta/bufexplorer.git

@ -1 +0,0 @@
Subproject commit af0fdef1b91717d74e11718eb0ce9a49b061348a

View File

@ -0,0 +1,588 @@
" 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,643 @@
" 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

View File

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

View File

@ -0,0 +1,257 @@
" 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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,375 @@
" 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

View File

@ -0,0 +1,349 @@
" 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,346 @@
" 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

View File

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

View File

@ -0,0 +1,253 @@
" 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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,409 @@
" 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,653 @@
" 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

View File

@ -0,0 +1,139 @@
" 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

View File

@ -0,0 +1,125 @@
" Author: Eric Van Dewoestine
"
" License: {{{
"
" Copyright (C) 2005 - 2014 Eric Van Dewoestine
"
" This program is free software: you can redistribute it and/or modify
" it under the terms of the GNU General Public License as published by
" the Free Software Foundation, either version 3 of the License, or
" (at your option) any later version.
"
" This program is distributed in the hope that it will be useful,
" but WITHOUT ANY WARRANTY; without even the implied warranty of
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" GNU General Public License for more details.
"
" You should have received a copy of the GNU General Public License
" along with this program. If not, see <http://www.gnu.org/licenses/>.
"
" }}}
" Script variables {{{
let s:problems_command = '-command problems -p "<project>"'
" }}}
function! eclim#project#problems#Problems(project, open, bang) " {{{
let project = a:project
if project == ''
let project = eclim#project#util#GetCurrentProjectName()
endif
if project == ''
call eclim#project#util#UnableToDetermineProject()
return
endif
let command = s:problems_command
let command = substitute(command, '<project>', project, '')
if a:bang != ""
let command .= ' -e'
endif
let result = eclim#Execute(command)
let errors = []
if type(result) == g:LIST_TYPE && len(result) > 0
let errors = eclim#util#ParseLocationEntries(
\ result, g:EclimValidateSortResults)
endif
let action = eclim#project#problems#IsProblemsList() ? 'r' : ' '
call eclim#util#SetQuickfixList(errors, action)
" generate a 'signature' to distinguish the problems list from other qf
" lists.
let s:eclim_problems_sig = s:QuickfixSignature()
let s:eclim_problems_bang = a:bang
if a:open
exec g: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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,87 @@
" 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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,51 @@
" 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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,464 @@
*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

View File

@ -0,0 +1,525 @@
*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

View File

@ -0,0 +1,347 @@
*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

View File

@ -0,0 +1,60 @@
*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

View File

@ -0,0 +1,38 @@
*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

View File

@ -0,0 +1,242 @@
*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

View File

@ -0,0 +1,268 @@
*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

View File

@ -0,0 +1,21 @@
*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

View File

@ -0,0 +1,226 @@
*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

View File

@ -0,0 +1,437 @@
*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

View File

@ -0,0 +1,356 @@
*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

View File

@ -0,0 +1,131 @@
*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

View File

@ -0,0 +1,49 @@
*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

View File

@ -0,0 +1,323 @@
*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

View File

@ -0,0 +1,329 @@
*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

View File

@ -0,0 +1,593 @@
*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

View File

@ -0,0 +1,22 @@
*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

View File

@ -0,0 +1,24 @@
*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

View File

@ -0,0 +1,30 @@
*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

View File

@ -0,0 +1,59 @@
*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

View File

@ -0,0 +1,62 @@
*vim-c-project*
*:CProjectConfigs*
C/C++ Project Configuration
***************************
The eclipse cdt provides a large set of configuration support for your
c/c++ projects. Eclim exposes a subset of these to you using the
:CProjectConfigs command:
>
:CProjectConfigs
" or if you are outside of the project
:CProjectConfigs my_c_project
<
This command will open a temporary buffer displaying some of the cdt
configuration values available to you. In this buffer you can add or
remove source directory references, include path references, and
symbols.
Here is a small example of what the contents may look like:
>
Config: Linux GCC
Sources: |add|
dir: src
Tool: GCC C Compiler
Includes: |add|
path: "${workspace_loc:/my_c_project/includes}"
Symbols: |add|
Tool: GCC Assembler
Includes: |add|
<
To add a source directory, include path, or symbol, simply move the
cursor over the relevant "|add|" link and hit <enter>. You will then
be prompted to enter an appropriate value. For your convenience, tab
completion is provided where possible.
Note: Despite the odd looking value in the includes path section
above, to add the entry you simply need to supply the project
relative path, "includes/" in this case, when prompted by the add
command.
If at any point you would like to remove a value, you can move the
cursor over the line of the value you would like to remove and hit D
(shift-d) to delete the entry.
vim:ft=eclimhelp

View File

@ -0,0 +1,129 @@
*vim-c-search*
C/C++ Search
************
*:CSearch*
Pattern Search
==============
Pattern searching provides a means to widen a search beyond a single
element. A pattern search can be executed using the command
:CSearch -p <pattern> [-t <type> -s <scope> -x <context> -i -a
<action>]
All of the results will be placed into the current window's location
list (:help location-list) so that you can easily navigate the
results.
Vim command completion is supported through out the command with the
exception of the pattern to search for.
>
:CSearch <Tab>
:CSearch -p MyClass* <Tab>
:CSearch -p MyClass* -t <Tab>
:CSearch -p MyClass* -t class <Tab>
:CSearch -p MyClass* -t class -s <Tab>
:CSearch -p MyClass* -t class -s project
:CSearch -p MyClass* -t class -s project <Tab>
:CSearch -p MyClass* -t class -s project -x <Tab>
:CSearch -p MyClass* -t class -s project -x declarations
<
- -p <pattern>: The pattern to search for.
Ex.
>
MyClass
myFunction
my*
<
- -t <type> (Default: all): The type of element to search for where
possible types include
- class_struct
- function
- variable
- union
- method
- field
- enum
- enumerator
- namespace
- typedef
- macro
- -s <scope> (Default: all): The scope of the search where possible
scope values include
- all - Search the whole workspace.
- project - Search the current project, dependent projects, and
include paths.
- -x <context> (Default: declarations): The context of the search,
where possible context values include
- all - Search for declarations and references.
- declarations - Search for declarations only.
- references - Search for all references.
- -i: Ignore case when searching.
- -a: The vim command to use to open the result (edit, split,
vsplit, etc).
Element Search
==============
Element searching allows you to place the cursor over just about any
element in a source file (method call, class name, constant) and
perform a search for that element. Performing an element search is
the same as performing a pattern search with the exception that you do
not specify the -p option since the element under the cursor will be
searched for instead.
If only one result is found and that result is in the current source
file, the cursor will be moved to the element found. Otherwise, on
single result matches, the value of |g:EclimCSearchSingleResult| will
be consulted for the action to take. If there are multiple results,
the location list will be opened with the list of results.
*:CSearchContext*
As a convenience eclim also provides the command :CSearchContext. This
command accepts only the optional -a argument described above, and
will perform the appropriate search depending on the context of the
element under the cursor.
- If the cursor is on an #include name, it will search the
configured include path for the file.
- Otherwise, it will search for the definition of the element (if
the cursor is on the definition, then it will search for the
declaration).
Configuration
=============
Vim Settings (|vim-settings|)
*g:EclimCSearchSingleResult*
- g:EclimCSearchSingleResult (Default: 'split') - Determines what
action to take when a only a single result is found.
Possible values include:
- 'split' - open the result in a new window via "split".
- 'edit' - open the result in the current window.
- 'tabnew' - open the result in a new tab.
- 'lopen' - open the location list to display the result.
This setting overrides the global default for all supported language
types which can be set using the g:EclimDefaultFileOpenAction
setting which accepts the same possible values.
- g:EclimLocationListHeight (Default: 10) - Sets the height in lines
of the location list window when eclim opens it to display search
results.
vim:ft=eclimhelp

View File

@ -0,0 +1,48 @@
*vim-c-validate*
*:Validate_c*
C/C++ Validation
****************
When saving a c/c++ source file that resides in a project, eclim will
update that source file in Eclipse and will report any validation
errors found. Any errors will be placed in the current window's
location list (:help location-list) and the corresponding lines in the
source file will be marked via Vim's :sign functionality with '>>'
markers in the left margin.
Automatic validation of c/c++ source files can be disabled via the
g:EclimCValidate variable (described below). If you choose to disable
automatic validation, you can still use the :Validate command to
manually validate the current file.
Configuration
=============
Vim Settings (|vim-settings|)
*g:EclimCValidate*
- g:EclimCValidate (Default: 1) - If set to 0, disables source code
validation.
Note: When enabled, syntastic
(https://github.com/scrooloose/syntastic) is disabled so that
eclim and syntastic don't step on each other. If you'd like to use
syntastic over eclim for validation, then simply disable eclim's
validation.If you'd like to disable eclim's source code validation
for all languages, eclim provides a global variable for that as
well:>
let g:EclimFileTypeValidate = 0
<
- g:EclimValidateSortResults (Default: 'occurrence') - If set to
'severity', the validation results will be sorted by severity
(errors > warnings > info > etc.)
vim:ft=eclimhelp

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