1
0
mirror of https://github.com/gryf/.vim.git synced 2025-12-17 11:30:29 +01:00
Files
.vim/plugin/eclim_tools.vim

1379 lines
39 KiB
VimL

" ============================================================================
" File: eclim_py.vim
" Description: vim plugin that provides some python helpers. Most of parts are
" taken from Eclim project <http://eclim.sourceforge.net>
" Maintainer: Roman 'gryf' Dobosz <gryf73@gmail.com>
" Last Change: 2010-02-10
" License: 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/>.
" ============================================================================
let s:Eclim_ver = '1.5.6'
" Further Description: {{{1
" @gryf: taglist and editor helpers taken over from Eclim project. There are
" couple of nice tools, which I want to have separately from Eclim project.
" Just for my conviniece, I've puted all of necessary things into this one file.
"
" Added:
" :Buffers
" :Sign
" :Signs
" :QuickFixClear
" :LocationListClear
" TODO:
" :taglisttoo
" :SignClearUser
" :SignClearAll
"
" }}}
" Eclim: {{{1
" files:
" - plugin/eclim.vim (global vars)
" - plugin/common.vim (commands)
" Global Variables {{{2
if has("signs")
if !exists("g:EclimSignLevel")
let g:EclimSignLevel = 5
endif
else
let g:EclimSignLevel = 0
endif
if !exists("g:EclimInfoHighlight")
let g:EclimInfoHighlight = "Statement"
endif
if !exists("g:EclimLogLevel")
let g:EclimLogLevel = 4
endif
if !exists("g:EclimTraceHighlight")
let g:EclimTraceHighlight = "Normal"
endif
if !exists("g:EclimDebugHighlight")
let g:EclimDebugHighlight = "Normal"
endif
if !exists("g:EclimInfoHighlight")
let g:EclimInfoHighlight = "Statement"
endif
if !exists("g:EclimWarningHighlight")
let g:EclimWarningHighlight = "WarningMsg"
endif
if !exists("g:EclimErrorHighlight")
let g:EclimErrorHighlight = "Error"
endif
if !exists("g:EclimFatalHighlight")
let g:EclimFatalHighlight = "Error"
endif
if !exists("g:EclimShowCurrentError")
let g:EclimShowCurrentError = 1
endif
if !exists("g:EclimShowCurrentErrorBalloon")
let g:EclimShowCurrentErrorBalloon = 1
endif
if !exists("g:EclimOpenQFLists")
let g:EclimOpenQFLists = 1
endif
" }}}
" Command Declarations {{{2
if !exists(":Buffers")
command Buffers :call s:Buffers()
endif
if has('signs')
if !exists(":Sign")
command Sign :call SignsToggle('user', line('.'))
endif
if !exists(":Signs")
command Signs :call SignsViewSigns('user')
endif
if !exists(":SignClearUser")
command SignClearUser :call SignsUnplaceAll(SignsGetExisting('user'))
endif
if !exists(":SignClearAll")
command SignClearAll :call SignsUnplaceAll(SignsGetExisting())
endif
endif
if !exists(":QuickFixClear")
command QuickFixClear :call setqflist([]) | call s:SignsUpdate()
endif
if !exists(":LocationListClear")
command LocationListClear :call setloclist(0, []) | call s:SignsUpdate()
endif
" }}}
" Auto Commands{{{2
if g:EclimSignLevel
augroup eclim_qf
autocmd QuickFixCmdPost *make* call s:SignsShow('', 'qf')
autocmd QuickFixCmdPost grep*,vimgrep* call s:SignsShow('i', 'qf')
autocmd QuickFixCmdPost lgrep*,lvimgrep* call s:SignsShow('i', 'loc')
autocmd BufWinEnter * call s:SignsUpdate()
augroup END
endif
if g:EclimShowCurrentError
augroup eclim_show_error
autocmd!
autocmd CursorMoved * call ShowCurrentError()
augroup END
endif
if g:EclimShowCurrentErrorBalloon && has('balloon_eval')
set ballooneval
set balloonexpr=Balloon(GetLineError(line('.')))
endif
" }}}
" End Eclim: }}}
" Common Buffers: {{{1
" Global Variables {{{2
if !exists('g:EclimBuffersSort')
let g:EclimBuffersSort = 'file'
endif
if !exists('g:EclimBuffersSortDirection')
let g:EclimBuffersSortDirection = 'asc'
endif
if !exists('g:EclimBuffersDefaultAction')
let g:EclimBuffersDefaultAction = 'edit'
endif
if !exists('g:EclimOnlyExclude')
let g:EclimOnlyExclude =
\ '\(NERD_tree_*\|__Tag_List__\|command-line\)'
endif
" }}}
" Buffers() eclim/autoload/eclim/common/buffers.vim {{{2
" Like, :buffers, but opens a temporary buffer.
function! s:Buffers()
redir => list
silent exec 'buffers'
redir END
let buffers = []
let filelength = 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')
exec 'let buffer.bufnr = ' . substitute(entry, '\s*\([0-9]\+\).*', '\1', '')
exec 'let buffer.lnum = ' .
\ substitute(entry, '.*"\s\+line\s\+\([0-9]\+\).*', '\1', '')
call add(buffers, buffer)
if len(buffer.file) > filelength
let filelength = len(buffer.file)
endif
endfor
if g:EclimBuffersSort != ''
call sort(buffers, 'BufferCompare')
endif
let lines = []
for buffer in buffers
call add(lines, s:BufferEntryToLine(buffer, filelength))
endfor
call TempWindow('[buffers]', lines)
let b:eclim_buffers = buffers
setlocal modifiable noreadonly
call append(line('$'), ['', '" use ? to view help'])
setlocal nomodifiable readonly
let b:eclim_buffers = buffers
" 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>BufferOpen2(g:EclimBuffersDefaultAction)<cr>
nnoremap <silent> <buffer> E :call <SID>BufferOpen2('edit')<cr>
nnoremap <silent> <buffer> S :call <SID>BufferOpen2('split')<cr>
nnoremap <silent> <buffer> T :call <SID>BufferOpen('tablast \| tabnew')<cr>
nnoremap <silent> <buffer> D :call <SID>BufferDelete()<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',
\ 'T - open in a new tab',
\ 'D - delete the buffer',
\ ]
nnoremap <buffer> <silent> ?
\ :call 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 " }}}
" BufferCompare(buffer1, buffer2) eclim/autoload/eclim/common/buffers.vim {{{2
function! 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 " }}}
" s:BufferDelete() {{{2
function! s:BufferDelete()
let line = line('.')
if line > len(b:eclim_buffers)
return
endif
let index = line - 1
exec 'bd ' . b:eclim_buffers[index].bufnr
setlocal modifiable
setlocal noreadonly
exec line . ',' . line . 'delete _'
setlocal nomodifiable
setlocal readonly
call remove(b:eclim_buffers, index)
endfunction " }}}
" s:BufferEntryToLine(buffer, filelength) eclim/autoload/eclim/common/buffers.vim {{{2
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 " }}}
" s:BufferOpen(cmd) eclim/autoload/eclim/common/buffers.vim {{{2
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
exec winnr . 'winc w'
call GoToBufferWindowOrOpen(file, a:cmd)
endfunction " }}}
" End Common Buffers: }}}
" Util: {{{1
" Script Variables eclim/autoload/eclim/util.vim {{{2
let s:buffer_write_closing_commands = '^\s*\(' .
\ 'wq\|xa\|' .
\ '\d*w[nN]\|\d*wp\|' .
\ 'ZZ' .
\ '\)'
let s:bourne_shells = ['sh', 'bash', 'dash', 'ksh', 'zsh']
let s:c_shells = ['csh', 'tcsh']
let s:show_current_error_displaying = 0
" }}}
" Balloon(message) eclim/autoload/eclim/util.vim {{{2
" Function for use as a vim balloonexpr expression.
function! Balloon(message)
let message = a:message
if !has('balloon_multiline')
" remove any new lines
let message = substitute(message, '\n', ' ', 'g')
endif
return message
endfunction " }}}
" DelayedCommand(command, [delay]) eclim/autoload/eclim/util.vim {{{2
" Executes a delayed command. Useful in cases where one would expect an
" autocommand event (WinEnter, etc) to fire, but doesn't, or you need a
" command to execute after other autocommands have finished.
" Note: Nesting is not supported. A delayed command cannot be invoke off
" another delayed command.
function! DelayedCommand(command, ...)
let uid = fnamemodify(tempname(), ':t:r')
if &updatetime > 1
exec 'let g:eclim_updatetime_save' . uid . ' = &updatetime'
endif
exec 'let g:eclim_delayed_command' . uid . ' = a:command'
let &updatetime = len(a:000) ? a:000[0] : 1
exec 'augroup delayed_command' . uid
exec 'autocmd CursorHold * ' .
\ ' if exists("g:eclim_updatetime_save' . uid . '") | ' .
\ ' let &updatetime = g:eclim_updatetime_save' . uid . ' | ' .
\ ' unlet g:eclim_updatetime_save' . uid . ' | ' .
\ ' endif | ' .
\ ' exec g:eclim_delayed_command' . uid . ' | ' .
\ ' unlet g:eclim_delayed_command' . uid . ' | ' .
\ ' autocmd! delayed_command' . uid
exec 'augroup END'
endfunction " }}}
" EchoTrace(message, [time_elapsed]) eclim/autoload/eclim/util.vim {{{2
function! EchoTrace(message, ...)
if a:0 > 0
call s:EchoLevel('(' . a:1 . 's) ' . a:message, 6, g:EclimTraceHighlight)
else
call s:EchoLevel(a:message, 6, g:EclimTraceHighlight)
endif
endfunction " }}}
" EchoWarning(message) eclim/autoload/eclim/util.vim {{{2
function! EchoWarning(message)
call s:EchoLevel(a:message, 3, g:EclimWarningHighlight)
endfunction " }}}
" EchoError(message) eclim/autoload/eclim/util.vim {{{2
function! EchoError(message)
call s:EchoLevel(a:message, 2, g:EclimErrorHighlight)
endfunction " }}}
" s:EchoLevel(message) eclim/autoload/eclim/util.vim {{{2
" Echos the supplied message at the supplied level with the specified
" highlight.
function! s:EchoLevel(message, level, highlight)
" only echo if the result is not 0, which signals that ExecuteEclim failed.
if a:message != "0" && g:EclimLogLevel >= a:level
exec "echohl " . a:highlight
redraw
for line in split(a:message, '\n')
echom line
endfor
echohl None
endif
endfunction " }}}
" Echo(message) eclim/autoload/eclim/util.vim {{{2
" Echos a message using the info highlight regardless of what log level is set.
function! Echo(message)
if a:message != "0" && g:EclimLogLevel > 0
exec "echohl " . g:EclimInfoHighlight
redraw
for line in split(a:message, '\n')
echom line
endfor
echohl None
endif
endfunction " }}}
" EscapeBufferName(name) eclim/autoload/eclim/util.vim {{{2
" Escapes the supplied buffer name so that it can be safely used by buf*
" functions.
function! EscapeBufferName(name)
let name = a:name
" escaping the space in cygwin could lead to the dos path error message that
" cygwin throws when a dos path is referenced.
if !has('win32unix')
let name = escape(a:name, ' ')
endif
return substitute(name, '\(.\{-}\)\[\(.\{-}\)\]\(.\{-}\)', '\1[[]\2[]]\3', 'g')
endfunction " }}}
" GetLineError(line) eclim/autoload/eclim/util.vim {{{2
" Gets the error (or message) for the supplie line number if one.
function! GetLineError(line)
let line = line('.')
let col = col('.')
let errornum = 0
let errorcol = 0
let index = 0
let locerrors = getloclist(0)
let qferrors = getqflist()
let bufname = expand('%')
let lastline = line('$')
for error in qferrors + locerrors
let index += 1
if bufname(error.bufnr) == bufname &&
\ (error.lnum == line || (error.lnum > lastline && line == lastline))
if errornum == 0 || (col >= error.col && error.col != errorcol)
let errornum = index
let errorcol = error.col
endif
endif
endfor
if errornum > 0
let src = 'qf'
let cnt = len(qferrors)
let errors = qferrors
if errornum > cnt
let errornum -= cnt
let src = 'loc'
let cnt = len(locerrors)
let errors = locerrors
endif
let message = src . ' - (' . errornum . ' of ' . cnt . '): '
\ . substitute(errors[errornum - 1].text, '^\s\+', '', '')
return message
endif
return ''
endfunction " }}}
" GoToBufferWindow(buf) eclim/autoload/eclim/util.vim {{{2
" Focuses the window containing the supplied buffer name or buffer number.
" Returns 1 if the window was found, 0 otherwise.
function! GoToBufferWindow(buf)
if type(a:buf) == 0
let winnr = bufwinnr(a:buf)
else
let name = EscapeBufferName(a:buf)
let winnr = bufwinnr(bufnr('^' . name))
endif
if winnr != -1
exec winnr . "winc w"
call DelayedCommand('doautocmd WinEnter')
return 1
endif
return 0
endfunction " }}}
" GoToBufferWindowOrOpen(name, cmd) eclim/autoload/eclim/util.vim {{{2
" Gives focus to the window containing the buffer for the supplied file, or if
" none, opens the file using the supplied command.
function! GoToBufferWindowOrOpen(name, cmd)
let name = EscapeBufferName(a:name)
let winnr = bufwinnr(bufnr('^' . name))
if winnr != -1
exec winnr . "winc w"
call DelayedCommand('doautocmd WinEnter')
else
let cmd = a:cmd
" if splitting and the buffer is a unamed empty buffer, then switch to an
" edit.
if cmd == 'split' && expand('%') == '' &&
\ !&modified && line('$') == 1 && getline(1) == ''
let cmd = 'edit'
endif
silent exec cmd . ' ' . escape(Simplify(a:name), ' ')
endif
endfunction " }}}
" GoToBufferWindowRegister(buf) eclim/autoload/eclim/util.vim {{{2
" Registers the autocmd for returning the user to the supplied buffer when the
" current buffer is closed.
function! GoToBufferWindowRegister(buf)
exec 'autocmd BufWinLeave <buffer> ' .
\ 'call GoToBufferWindow("' . escape(a:buf, '\') . '") | ' .
\ 'doautocmd BufEnter'
endfunction " }}}
" SetLocationList(list, [action]) eclim/autoload/eclim/util.vim {{{2
" Sets the contents of the location list for the current window.
function! SetLocationList(list, ...)
let loclist = a:list
" filter the list if the current buffer defines a list of filters.
if exists('b:EclimLocationListFilter')
let newlist = []
for item in loclist
let addit = 1
for filter in b:EclimLocationListFilter
if item.text =~ filter
let addit = 0
break
endif
endfor
if addit
call add(newlist, item)
endif
endfor
let loclist = newlist
endif
if a:0 == 0
call setloclist(0, loclist)
else
call setloclist(0, loclist, a:1)
endif
if g:EclimShowCurrentError && len(loclist) > 0
call DelayedCommand('call ShowCurrentError()')
endif
call s:SignsUpdate()
endfunction " }}}
" ClearLocationList([namespace, namespace, ...]) eclim/autoload/eclim/util.vim {{{2
" Clears the current location list. Optionally 'namespace' arguments can be
" supplied which will only clear items with text prefixed with '[namespace]'.
" Also the special namespace 'global' may be supplied which will only remove
" items with no namepace prefix.
function! ClearLocationList(...)
if a:0 > 0
let loclist = getloclist(0)
if len(loclist) > 0
let pattern = ''
for ns in a:000
if pattern != ''
let pattern .= '\|'
endif
if ns == 'global'
let pattern .= '\(\[\w\+\]\)\@!'
else
let pattern .= '\[' . ns . '\]'
endif
endfor
let pattern = '^\(' . pattern . '\)'
call filter(loclist, 'v:val.text !~ pattern')
call setloclist(0, loclist, 'r')
endif
else
call setloclist(0, [], 'r')
endif
call s:SignsUpdate()
endfunction " }}}
" SetQuickfixList(list, [action]) eclim/autoload/eclim/util.vim {{{2
" Sets the contents of the quickfix list.
function! SetQuickfixList(list, ...)
let qflist = a:list
if exists('b:EclimQuickfixFilter')
let newlist = []
for item in qflist
let addit = 1
for filter in b:EclimQuickfixFilter
if item.text =~ filter
let addit = 0
break
endif
endfor
if addit
call add(newlist, item)
endif
endfor
let qflist = newlist
endif
if a:0 == 0
call setqflist(qflist)
else
call setqflist(qflist, a:1)
endif
if g:EclimShowCurrentError && len(qflist) > 0
call DelayedCommand('call ShowCurrentError()')
endif
call s:SignsUpdate()
endfunction " }}}
" ShowCurrentError() eclim/autoload/eclim/util.vim {{{2
" Shows the error on the cursor line if one.
function! ShowCurrentError()
let message = GetLineError(line('.'))
if message != ''
" remove any new lines
let message = substitute(message, '\n', ' ', 'g')
if len(message) > (&columns - 1)
let message = strpart(message, 0, &columns - 4) . '...'
endif
call WideMessage('echo', message)
let s:show_current_error_displaying = 1
else
" clear the message if one of our error messages was displaying
if s:show_current_error_displaying
call WideMessage('echo', message)
let s:show_current_error_displaying = 0
endif
endif
endfunction " }}}
" Simplify(file) eclim/autoload/eclim/util.vim {{{2
" Simply the supplied file to the shortest valid name.
function! Simplify(file)
let file = a:file
" Don't run simplify on url files, it will screw them up.
if file !~ '://'
let file = simplify(file)
endif
" replace all '\' chars with '/' except those escaping spaces.
let file = substitute(file, '\\\([^[:space:]]\)', '/\1', 'g')
let cwd = substitute(getcwd(), '\', '/', 'g')
if cwd !~ '/$'
let cwd .= '/'
endif
if file =~ '^' . cwd
let file = substitute(file, '^' . cwd, '', '')
endif
return file
endfunction " }}}
" System(cmd, [exec]) eclim/autoload/eclim/util.vim {{{2
" Executes system() accounting for possibly disruptive vim options.
function! System(cmd, ...)
let saveshell = &shell
let saveshellcmdflag = &shellcmdflag
let saveshellpipe = &shellpipe
let saveshellquote = &shellquote
let saveshellredir = &shellredir
let saveshellslash = &shellslash
let saveshelltemp = &shelltemp
let saveshellxquote = &shellxquote
if has("win32") || has("win64")
set shell=cmd.exe
set shellcmdflag=/c
set shellpipe=>%s\ 2>&1
set shellquote=
set shellredir=>%s\ 2>&1
set noshellslash
set shelltemp
set shellxquote=
else
if executable('/bin/bash')
set shell=/bin/bash
else
set shell=/bin/sh
endif
set shell=/bin/sh
set shellcmdflag=-c
set shellpipe=2>&1\|\ tee
set shellquote=
set shellredir=>%s\ 2>&1
set noshellslash
set shelltemp
set shellxquote=
endif
if len(a:000) > 0 && a:000[0]
let result = ''
let begin = localtime()
try
exec a:cmd
finally
call EchoTrace('exec: ' . a:cmd, localtime() - begin)
endtry
else
let begin = localtime()
try
let result = system(a:cmd)
finally
call EchoTrace('system: ' . a:cmd, localtime() - begin)
endtry
endif
let &shell = saveshell
let &shellcmdflag = saveshellcmdflag
let &shellquote = saveshellquote
let &shellslash = saveshellslash
let &shelltemp = saveshelltemp
let &shellxquote = saveshellxquote
" If a System call is executed at startup, it appears to interfere with
" vim's setting of 'shellpipe' and 'shellredir' to their shell specific
" values. So, if we detect that the values we are restoring look like
" uninitialized defaults, then attempt to mimic vim's documented
" (:h 'shellpipe' :h 'shellredir') logic for setting the proper values based
" on the shell.
" Note: still doesn't handle more obscure shells
if saveshellredir == '>'
if index(s:bourne_shells, fnamemodify(&shell, ':t')) != -1
set shellpipe=2>&1\|\ tee
set shellredir=>%s\ 2>&1
elseif index(s:c_shells, fnamemodify(&shell, ':t')) != -1
set shellpipe=\|&\ tee
set shellredir=>&
else
let &shellpipe = saveshellpipe
let &shellredir = saveshellredir
endif
else
let &shellpipe = saveshellpipe
let &shellredir = saveshellredir
endif
return result
endfunction " }}}
" TempWindow(name, lines, [readonly]) eclim/autoload/eclim/util.vim {{{2
" Opens a temp window w/ the given name and contents which is readonly unless
" specified otherwise.
function! TempWindow(name, lines, ...)
let filename = expand('%:p')
let winnr = winnr()
call TempWindowClear(a:name)
let name = EscapeBufferName(a:name)
if bufwinnr(name) == -1
silent! noautocmd exec "botright 10sview " . escape(a:name, ' ')
let b:eclim_temp_window = 1
" play nice with maximize.vim
"if eclim#display#maximize#GetMaximizedWindow()
" call eclim#display#maximize#AdjustFixedWindow(10, 1)
"endif
setlocal nowrap
setlocal winfixheight
setlocal noswapfile
setlocal nobuflisted
setlocal buftype=nofile
setlocal bufhidden=delete
else
exec bufwinnr(name) . "winc w"
endif
setlocal modifiable
setlocal noreadonly
call append(1, a:lines)
retab
silent 1,1delete _
if len(a:000) == 0 || a:000[0]
setlocal nomodified
setlocal nomodifiable
setlocal readonly
endif
silent doautocmd BufEnter
" Store filename and window number so that plugins can use it if necessary.
if filename != expand('%:p')
let b:filename = filename
let b:winnr = winnr
augroup eclim_temp_window
autocmd! BufWinLeave <buffer>
call GoToBufferWindowRegister(b:filename)
augroup END
endif
endfunction " }}}
" TempWindowClear(name) eclim/autoload/eclim/util.vim {{{2
" Clears the contents of the temp window with the given name.
function! TempWindowClear(name)
let name = EscapeBufferName(a:name)
if bufwinnr(name) != -1
let curwinnr = winnr()
exec bufwinnr(name) . "winc w"
setlocal modifiable
setlocal noreadonly
silent 1,$delete _
exec curwinnr . "winc w"
endif
endfunction " }}}
" WideMessage(command, message) eclim/autoload/eclim/util.vim {{{2
" Executes the supplied echo command and forces vim to display as much as
" possible without the "Press Enter" prompt.
" Thanks to vimtip #1289
function! WideMessage(command, message)
let saved_ruler = &ruler
let saved_showcmd = &showcmd
let message = substitute(a:message, '^\s\+', '', '')
set noruler noshowcmd
redraw
exec a:command . ' "' . escape(message, '"\') . '"'
let &ruler = saved_ruler
let &showcmd = saved_showcmd
endfunction " }}}
" WillWrittenBufferClose() eclim/autoload/eclim/util.vim {{{2
" Returns 1 if the current buffer is to be hidden/closed/deleted after it is
" written, or 0 otherwise. This function is useful during a post write auto
" command for determining whether or not to perform some operation based on
" whether the buffer will still be visible to the user once the current
" command has finished.
" Note: This function only detects command typed by the user at the
" command (:) prompt, not any normal mappings which may hide/close/delete the
" buffer.
function! WillWrittenBufferClose()
return histget("cmd") =~ s:buffer_write_closing_commands
endfunction " }}}
" End Util: }}}
" Display Signs: {{{1
" Global Variables eclim/autoload/eclim/display/signs.vim {{{2
if !exists("g:EclimShowQuickfixSigns")
let g:EclimShowQuickfixSigns = 1
endif
if !exists("g:EclimUserSignText")
let g:EclimUserSignText = '#'
endif
if !exists("g:EclimUserSignHighlight")
let g:EclimUserSignHighlight = g:EclimInfoHighlight
endif
" }}}
" Define(name, text, highlight) eclim/autoload/eclim/display/signs.vim {{{2
" Defines a new sign name or updates an existing one.
function! SignsDefine(name, text, highlight)
exec "sign define " . a:name . " text=" . a:text . " texthl=" . a:highlight
endfunction " }}}
" Place(name, line) eclim/autoload/eclim/display/signs.vim {{{2
" Places a sign in the current buffer.
function! SignsPlace(name, line)
if a:line > 0
let lastline = line('$')
let line = a:line <= lastline ? a:line : lastline
exec "sign place " . line . " line=" . line . " name=" . a:name .
\ " buffer=" . bufnr('%')
endif
endfunction " }}}
" PlaceAll(name, list) eclim/autoload/eclim/display/signs.vim {{{2
" Places a sign in the current buffer for each line in the list.
function! SignsPlaceAll(name, 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 " }}}
" Unplace(id) eclim/autoload/eclim/display/signs.vim {{{2
" Un-places a sign in the current buffer.
function! SignsUnplace(id)
exec 'sign unplace ' . a:id . ' buffer=' . bufnr('%')
endfunction " }}}
" Toggle(name, line) eclim/autoload/eclim/display/signs.vim {{{2
" Toggle a sign on the current line.
function! SignsToggle(name, line)
if a:line > 0
let existing = SignsGetExisting(a:name)
let exists = len(filter(existing, "v:val['line'] == a:line"))
if exists
call SignsUnplace(a:line)
else
call SignsPlace(a:name, a:line)
endif
endif
endfunction " }}}
" CompareSigns(s1, s2) eclim/autoload/eclim/display/signs.vim {{{2
" Used by ViewSigns to sort list of sign dictionaries.
function! s:CompareSigns(s1, s2)
if a:s1.line == a:s2.line
return 0
endif
if a:s1.line > a:s2.line
return 1
endif
return -1
endfunction " }}}
" ViewSigns(name) eclim/autoload/eclim/display/signs.vim {{{2
" Open a window to view all placed signs with the given name in the current
" buffer.
function! SignsViewSigns(name)
let filename = expand('%:p')
let signs = SignsGetExisting(a:name)
call sort(signs, 's:CompareSigns')
let content = map(signs, "v:val.line . '|' . getline(v:val.line)")
call 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 GoToBufferWindowRegister(filename)
augroup END
endfunction " }}}
" JumpToSign() eclim/autoload/eclim/display/signs.vim {{{2
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 " }}}
" GetExisting(...) eclim/autoload/eclim/display/signs.vim {{{2
" 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.
function! SignsGetExisting(...)
let bufnr = bufnr('%')
redir => signs
silent exec 'sign place buffer=' . bufnr
redir END
let existing = []
for sign in split(signs, '\n')
if sign =~ 'id='
" for multi language support, don't have have regex w/ english
" identifiers
let id = substitute(sign, '.\{-}=.\{-}=\(.\{-}\)\s.*', '\1', '')
exec 'let line = ' . substitute(sign, '.\{-}=\(.\{-}\)\s.*', '\1', '')
let name = substitute(sign, '.\{-}=.\{-}=.\{-}=\(.\{-}\)\s*$', '\1', '')
call add(existing, {'id': id, 'line': line, 'name': name})
endif
endfor
if len(a:000) > 0
call filter(existing, "v:val['name'] == a:000[0]")
endif
return existing
endfunction " }}}
" HasExisting(...) eclim/autoload/eclim/display/signs.vim {{{2
" Determines if there are an existing signs.
" Optionally a sign name may be supplied to only test for signs of that name.
function! SignsHasExisting(...)
let bufnr = bufnr('%')
redir => results
silent exec 'sign place buffer=' . bufnr
redir END
for sign in split(results, '\n')
if sign =~ 'id='
if len(a:000) == 0
return 1
endif
let name = substitute(sign, '.\{-}=.\{-}=.\{-}=\(.\{-}\)\s*$', '\1', '')
if name == a:000[0]
return 1
endif
endif
endfor
return 0
endfunction " }}}
" Update() eclim/autoload/eclim/display/signs.vim {{{2
" 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).
function! s:SignsUpdate()
if !has('signs') || !g:EclimSignLevel
return
endif
let save_lazy = &lazyredraw
set lazyredraw
call SignsDefine('error', '>>', g:EclimErrorHighlight)
let placeholder = SignsSetPlaceholder()
" remove all existing signs
let existing = SignsGetExisting()
for exists in existing
if exists.name =~ '^\(error\|info\|warning\|qf_error\|qf_warning\)$'
call SignsUnplace(exists.id)
endif
endfor
let qflist = getqflist()
if g:EclimShowQuickfixSigns
let errors = filter(copy(qflist),
\ 'bufnr("%") == v:val.bufnr && (v:val.type == "" || v:val.type == "e")')
let warnings = filter(copy(qflist),
\ 'bufnr("%") == v:val.bufnr && v:val.type == "w"')
call map(errors, 'v:val.lnum')
call map(warnings, 'v:val.lnum')
call SignsDefine("qf_error", "> ", g:EclimErrorHighlight)
call SignsDefine("qf_warning", "> ", g:EclimWarningHighlight)
call SignsPlaceAll("qf_error", errors)
call SignsPlaceAll("qf_warning", warnings)
endif
let list = filter(getloclist(0), 'bufnr("%") == v:val.bufnr')
if g:EclimSignLevel >= 4
let info = filter(copy(qflist) + copy(list),
\ 'bufnr("%") == v:val.bufnr && v:val.type == "i"')
let locinfo = filter(copy(list),
\ 'bufnr("%") == v:val.bufnr && v:val.type == ""')
call extend(info, locinfo)
call map(info, 'v:val.lnum')
call SignsDefine("info", ">>", g:EclimInfoHighlight)
call SignsPlaceAll("info", info)
endif
if g:EclimSignLevel >= 3
let warnings = filter(copy(list), 'v:val.type == "w"')
call map(warnings, 'v:val.lnum')
call SignsDefine("warning", ">>", g:EclimWarningHighlight)
call SignsPlaceAll("warning", warnings)
endif
if g:EclimSignLevel >= 2
let errors = filter(copy(list), 'v:val.type == "e"')
call map(errors, 'v:val.lnum')
call SignsPlaceAll("error", errors)
endif
if placeholder
call SignsRemovePlaceholder()
endif
let &lazyredraw = save_lazy
endfunction " }}}
" Show(type, list) eclim/autoload/eclim/display/signs.vim {{{2
" Set the type on each entry in the specified list ('qf' or 'loc') and mark
" any matches in the current file.
function! s:SignsShow(type, list)
if a:type != ''
if a:list == 'qf'
let list = getqflist()
else
let list = getloclist(0)
endif
let newentries = []
for entry in list
let newentry = {
\ 'filename': bufname(entry.bufnr),
\ 'lnum': entry.lnum,
\ 'col': entry.col,
\ 'text': entry.text,
\ 'type': a:type
\ }
call add(newentries, newentry)
endfor
if a:list == 'qf'
call setqflist(newentries, 'r')
else
call setloclist(0, newentries, 'r')
endif
endif
call s:SignsUpdate()
redraw!
endfunction " }}}
" SetPlaceholder([only_if_necessary]) eclim/autoload/eclim/display/signs.vim {{{2
" Set sign at line 1 to prevent sign column from collapsing, and subsiquent
" screen redraw.
function! SignsSetPlaceholder(...)
if !has('signs') || !g:EclimSignLevel
return
endif
if len(a:000) > 0 && a:000[0]
let existing = SignsGetExisting()
if !len(existing)
return
endif
endif
call SignsDefine('placeholder', '_ ', g:EclimInfoHighlight)
let existing = SignsGetExisting('placeholder')
if len(existing) == 0 && SignsHasExisting()
call SignsPlace('placeholder', 1)
return 1
endif
return
endfunction " }}}
" RemovePlaceholder() eclim/autoload/eclim/display/signs.vim {{{2
function! SignsRemovePlaceholder()
if !has('signs') || !g:EclimSignLevel
return
endif
let existing = SignsGetExisting('placeholder')
for exists in existing
call SignsUnplace(exists.id)
endfor
endfunction " }}}
" define signs for manually added user marks. eclim/autoload/eclim/display/signs.vim {{{2
if has('signs')
let s:name = 'user'
exec "sign define " . s:name . " text=" . g:EclimUserSignText . " texthl=" . g:EclimUserSignHighlight
endif " }}}
" End Display Signs: }}}
" Eclim Help: {{{1
" BufferHelp(lines, orientation, size) eclim/autoload/eclim/help.vim {{{
" Function to display a help window for the current buffer.
function! 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 = 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, ' ')
let b:eclim_temp_window = 1
setlocal nowrap winfixheight
setlocal noswapfile nobuflisted nonumber
setlocal buftype=nofile bufhidden=delete
nnoremap <buffer> <silent> ? :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 " }}}
" }}}
" Gryf: {{{1
" GetAllBuffers {{{2
function! GetAllBuffers()
redir => list
silent exec 'buffers'
redir END
for entry in split(list, '\n')
echo entry
endfor
echo expand('%:p')
let buffers = []
let filelength = 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')
exec 'let buffer.bufnr = ' . substitute(entry, '\s*\([0-9]\+\).*', '\1', '')
exec 'let buffer.lnum = ' .
\ substitute(entry, '.*"\s\+line\s\+\([0-9]\+\).*', '\1', '')
call add(buffers, buffer)
if len(buffer.file) > filelength
let filelength = len(buffer.file)
endif
endfor
echo buffers
return buffers
endfunction " }}}
" ViewAllSigns(name) {{{2
" Open a window to view all placed signs with the given name in the all
" buffers.
function! SignsViewAllSigns(name)
for buf in GetAllBuffers()
echo buf
endfor
return
if buf.file not in ('[Quickfix List]', '[Location List]')
let filename = expand("%:p") "buf.path
let signs = SignsGetExisting(a:name)
call sort(signs, 's:CompareSigns')
let content = map(signs, "v:val.line . '|' . getline(v:val.line)")
call 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 GoToBufferWindowRegister(filename)
augroup END
endif
endfor
endfunction " }}}
" TODO: remove this
map <F4> <esc>:Signs<cr>
map <F3> <esc>:Sign<cr>
" GetAllExisting(...) {{{2
" Gets a list of existing signs for all the buffers.
" The list consists of dictionaries with the following keys:
" buffer: Buffer number
" 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.
function! SignsGetAllExisting(buffernr, mark_name)
let bufnr = bufnr('%')
redir => signs
silent exec 'sign place buffer=' . a:buffernr
redir END
let existing = []
for sign in split(signs, '\n')
if sign =~ 'id='
" for multi language support, don't have have regex w/ english
" identifiers
let id = substitute(sign, '.\{-}=.\{-}=\(.\{-}\)\s.*', '\1', '')
exec 'let line = ' . substitute(sign, '.\{-}=\(.\{-}\)\s.*', '\1', '')
let name = substitute(sign, '.\{-}=.\{-}=.\{-}=\(.\{-}\)\s*$', '\1', '')
call add(existing, {'id': id, 'line': line, 'name': name})
endif
endfor
if len(a:000) > 0
call filter(existing, "v:val['name'] == a:mark_name")
endif
return existing
endfunction " }}}
" s:BufferOpen2(cmd) {{{2
function! s:BufferOpen2(cmd)
let line = line('.')
if line > len(b:eclim_buffers)
return
endif
let bufnr = b:eclim_buffers[line - 1].bufnr
let winnr = b:winnr
close
exec winnr . 'winc w'
call GoToBufferWindowOrOpen2(bufnr, a:cmd)
endfunction " }}}
" GoToBufferWindowOrOpen2(nr, cmd) {{{2
" modified function GoToBufferWindowOrOpen. instead of buffer name it accepts
" buffer number.
function! GoToBufferWindowOrOpen2(nr, cmd)
let winnr = bufwinnr(a:nr)
if winnr != -1
exec winnr . "winc w"
call DelayedCommand('doautocmd WinEnter')
else
if a:cmd == 'edit'
silent exec 'buffer ' . a:nr
elseif a:cmd == 'split'
silent exec 'sbuffer ' . a:nr
endif
endif
endfunction " }}}
" ToggleQFonValidate() {{{2
" Nice on/off feature for open/not open qf window after save validation. To be
" mapped on convinent shortcut or called in command line.
function! ToggleQFonValidate()
if g:EclimOpenQFLists
let g:EclimOpenQFLists = 0
call Echo('QF on validate off')
else
let g:EclimOpenQFLists = 1
call Echo('QF on validate on')
endif
endfun " }}}
" }}}
" vim:ft=vim:fdm=marker