use vundle to manage plugins and optimize the configuration files
This commit is contained in:
parent
e488a5f256
commit
cd087ddd47
|
|
@ -1,347 +0,0 @@
|
||||||
" pathogen.vim - path option manipulation
|
|
||||||
" Maintainer: Tim Pope <http://tpo.pe/>
|
|
||||||
" Version: 2.3
|
|
||||||
|
|
||||||
" Install in ~/.vim/autoload (or ~\vimfiles\autoload).
|
|
||||||
"
|
|
||||||
" For management of individually installed plugins in ~/.vim/bundle (or
|
|
||||||
" ~\vimfiles\bundle), adding `execute pathogen#infect()` to the top of your
|
|
||||||
" .vimrc is the only other setup necessary.
|
|
||||||
"
|
|
||||||
" The API is documented inline below.
|
|
||||||
|
|
||||||
if exists("g:loaded_pathogen") || &cp
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_pathogen = 1
|
|
||||||
|
|
||||||
" Point of entry for basic default usage. Give a relative path to invoke
|
|
||||||
" pathogen#interpose() (defaults to "bundle/{}"), or an absolute path to invoke
|
|
||||||
" pathogen#surround(). Curly braces are expanded with pathogen#expand():
|
|
||||||
" "bundle/{}" finds all subdirectories inside "bundle" inside all directories
|
|
||||||
" in the runtime path.
|
|
||||||
function! pathogen#infect(...) abort
|
|
||||||
for path in a:0 ? filter(reverse(copy(a:000)), 'type(v:val) == type("")') : ['bundle/{}']
|
|
||||||
if path =~# '^\%({\=[$~\\/]\|{\=\w:[\\/]\).*[{}*]'
|
|
||||||
call pathogen#surround(path)
|
|
||||||
elseif path =~# '^\%([$~\\/]\|\w:[\\/]\)'
|
|
||||||
call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')')
|
|
||||||
call pathogen#surround(path . '/{}')
|
|
||||||
elseif path =~# '[{}*]'
|
|
||||||
call pathogen#interpose(path)
|
|
||||||
else
|
|
||||||
call s:warn('Change pathogen#infect('.string(path).') to pathogen#infect('.string(path.'/{}').')')
|
|
||||||
call pathogen#interpose(path . '/{}')
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call pathogen#cycle_filetype()
|
|
||||||
if pathogen#is_disabled($MYVIMRC)
|
|
||||||
return 'finish'
|
|
||||||
endif
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Split a path into a list.
|
|
||||||
function! pathogen#split(path) abort
|
|
||||||
if type(a:path) == type([]) | return a:path | endif
|
|
||||||
if empty(a:path) | return [] | endif
|
|
||||||
let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
|
|
||||||
return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Convert a list to a path.
|
|
||||||
function! pathogen#join(...) abort
|
|
||||||
if type(a:1) == type(1) && a:1
|
|
||||||
let i = 1
|
|
||||||
let space = ' '
|
|
||||||
else
|
|
||||||
let i = 0
|
|
||||||
let space = ''
|
|
||||||
endif
|
|
||||||
let path = ""
|
|
||||||
while i < a:0
|
|
||||||
if type(a:000[i]) == type([])
|
|
||||||
let list = a:000[i]
|
|
||||||
let j = 0
|
|
||||||
while j < len(list)
|
|
||||||
let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
|
|
||||||
let path .= ',' . escaped
|
|
||||||
let j += 1
|
|
||||||
endwhile
|
|
||||||
else
|
|
||||||
let path .= "," . a:000[i]
|
|
||||||
endif
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
return substitute(path,'^,','','')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
|
|
||||||
function! pathogen#legacyjoin(...) abort
|
|
||||||
return call('pathogen#join',[1] + a:000)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Turn filetype detection off and back on again if it was already enabled.
|
|
||||||
function! pathogen#cycle_filetype() abort
|
|
||||||
if exists('g:did_load_filetypes')
|
|
||||||
filetype off
|
|
||||||
filetype on
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Check if a bundle is disabled. A bundle is considered disabled if its
|
|
||||||
" basename or full name is included in the list g:pathogen_disabled.
|
|
||||||
function! pathogen#is_disabled(path) abort
|
|
||||||
if a:path =~# '\~$'
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
let sep = pathogen#slash()
|
|
||||||
let blacklist = map(
|
|
||||||
\ get(g:, 'pathogen_blacklist', get(g:, 'pathogen_disabled', [])) +
|
|
||||||
\ pathogen#split($VIMBLACKLIST),
|
|
||||||
\ 'substitute(v:val, "[\\/]$", "", "")')
|
|
||||||
return index(blacklist, fnamemodify(a:path, ':t')) != -1 || index(blacklist, a:path) != -1
|
|
||||||
endfunction "}}}1
|
|
||||||
|
|
||||||
" Prepend the given directory to the runtime path and append its corresponding
|
|
||||||
" after directory. Curly braces are expanded with pathogen#expand().
|
|
||||||
function! pathogen#surround(path) abort
|
|
||||||
let sep = pathogen#slash()
|
|
||||||
let rtp = pathogen#split(&rtp)
|
|
||||||
let path = fnamemodify(a:path, ':p:?[\\/]\=$??')
|
|
||||||
let before = filter(pathogen#expand(path), '!pathogen#is_disabled(v:val)')
|
|
||||||
let after = filter(reverse(pathogen#expand(path.sep.'after')), '!pathogen#is_disabled(v:val[0:-7])')
|
|
||||||
call filter(rtp, 'index(before + after, v:val) == -1')
|
|
||||||
let &rtp = pathogen#join(before, rtp, after)
|
|
||||||
return &rtp
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" For each directory in the runtime path, add a second entry with the given
|
|
||||||
" argument appended. Curly braces are expanded with pathogen#expand().
|
|
||||||
function! pathogen#interpose(name) abort
|
|
||||||
let sep = pathogen#slash()
|
|
||||||
let name = a:name
|
|
||||||
if has_key(s:done_bundles, name)
|
|
||||||
return ""
|
|
||||||
endif
|
|
||||||
let s:done_bundles[name] = 1
|
|
||||||
let list = []
|
|
||||||
for dir in pathogen#split(&rtp)
|
|
||||||
if dir =~# '\<after$'
|
|
||||||
let list += reverse(filter(pathogen#expand(dir[0:-6].name.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])')) + [dir]
|
|
||||||
else
|
|
||||||
let list += [dir] + filter(pathogen#expand(dir.sep.name), '!pathogen#is_disabled(v:val)')
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
let &rtp = pathogen#join(pathogen#uniq(list))
|
|
||||||
return 1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:done_bundles = {}
|
|
||||||
|
|
||||||
" Invoke :helptags on all non-$VIM doc directories in runtimepath.
|
|
||||||
function! pathogen#helptags() abort
|
|
||||||
let sep = pathogen#slash()
|
|
||||||
for glob in pathogen#split(&rtp)
|
|
||||||
for dir in map(split(glob(glob), "\n"), 'v:val.sep."/doc/".sep')
|
|
||||||
if (dir)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir) == 2 && !empty(split(glob(dir.'*.txt'))) && (!filereadable(dir.'tags') || filewritable(dir.'tags'))
|
|
||||||
silent! execute 'helptags' pathogen#fnameescape(dir)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! -bar Helptags :call pathogen#helptags()
|
|
||||||
|
|
||||||
" Execute the given command. This is basically a backdoor for --remote-expr.
|
|
||||||
function! pathogen#execute(...) abort
|
|
||||||
for command in a:000
|
|
||||||
execute command
|
|
||||||
endfor
|
|
||||||
return ''
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Section: Unofficial
|
|
||||||
|
|
||||||
function! pathogen#is_absolute(path) abort
|
|
||||||
return a:path =~# (has('win32') ? '^\%([\\/]\|\w:\)[\\/]\|^[~$]' : '^[/~$]')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Given a string, returns all possible permutations of comma delimited braced
|
|
||||||
" alternatives of that string. pathogen#expand('/{a,b}/{c,d}') yields
|
|
||||||
" ['/a/c', '/a/d', '/b/c', '/b/d']. Empty braces are treated as a wildcard
|
|
||||||
" and globbed. Actual globs are preserved.
|
|
||||||
function! pathogen#expand(pattern) abort
|
|
||||||
if a:pattern =~# '{[^{}]\+}'
|
|
||||||
let [pre, pat, post] = split(substitute(a:pattern, '\(.\{-\}\){\([^{}]\+\)}\(.*\)', "\\1\001\\2\001\\3", ''), "\001", 1)
|
|
||||||
let found = map(split(pat, ',', 1), 'pre.v:val.post')
|
|
||||||
let results = []
|
|
||||||
for pattern in found
|
|
||||||
call extend(results, pathogen#expand(pattern))
|
|
||||||
endfor
|
|
||||||
return results
|
|
||||||
elseif a:pattern =~# '{}'
|
|
||||||
let pat = matchstr(a:pattern, '^.*{}[^*]*\%($\|[\\/]\)')
|
|
||||||
let post = a:pattern[strlen(pat) : -1]
|
|
||||||
return map(split(glob(substitute(pat, '{}', '*', 'g')), "\n"), 'v:val.post')
|
|
||||||
else
|
|
||||||
return [a:pattern]
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" \ on Windows unless shellslash is set, / everywhere else.
|
|
||||||
function! pathogen#slash() abort
|
|
||||||
return !exists("+shellslash") || &shellslash ? '/' : '\'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! pathogen#separator() abort
|
|
||||||
return pathogen#slash()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Convenience wrapper around glob() which returns a list.
|
|
||||||
function! pathogen#glob(pattern) abort
|
|
||||||
let files = split(glob(a:pattern),"\n")
|
|
||||||
return map(files,'substitute(v:val,"[".pathogen#slash()."/]$","","")')
|
|
||||||
endfunction "}}}1
|
|
||||||
|
|
||||||
" Like pathogen#glob(), only limit the results to directories.
|
|
||||||
function! pathogen#glob_directories(pattern) abort
|
|
||||||
return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
|
|
||||||
endfunction "}}}1
|
|
||||||
|
|
||||||
" Remove duplicates from a list.
|
|
||||||
function! pathogen#uniq(list) abort
|
|
||||||
let i = 0
|
|
||||||
let seen = {}
|
|
||||||
while i < len(a:list)
|
|
||||||
if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i])
|
|
||||||
call remove(a:list,i)
|
|
||||||
elseif a:list[i] ==# ''
|
|
||||||
let i += 1
|
|
||||||
let empty = 1
|
|
||||||
else
|
|
||||||
let seen[a:list[i]] = 1
|
|
||||||
let i += 1
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return a:list
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Backport of fnameescape().
|
|
||||||
function! pathogen#fnameescape(string) abort
|
|
||||||
if exists('*fnameescape')
|
|
||||||
return fnameescape(a:string)
|
|
||||||
elseif a:string ==# '-'
|
|
||||||
return '\-'
|
|
||||||
else
|
|
||||||
return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Like findfile(), but hardcoded to use the runtimepath.
|
|
||||||
function! pathogen#runtime_findfile(file,count) abort "{{{1
|
|
||||||
let rtp = pathogen#join(1,pathogen#split(&rtp))
|
|
||||||
let file = findfile(a:file,rtp,a:count)
|
|
||||||
if file ==# ''
|
|
||||||
return ''
|
|
||||||
else
|
|
||||||
return fnamemodify(file,':p')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Section: Deprecated
|
|
||||||
|
|
||||||
function! s:warn(msg) abort
|
|
||||||
echohl WarningMsg
|
|
||||||
echomsg a:msg
|
|
||||||
echohl NONE
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Prepend all subdirectories of path to the rtp, and append all 'after'
|
|
||||||
" directories in those subdirectories. Deprecated.
|
|
||||||
function! pathogen#runtime_prepend_subdirectories(path) abort
|
|
||||||
call s:warn('Change pathogen#runtime_prepend_subdirectories('.string(a:path).') to pathogen#infect('.string(a:path.'/{}').')')
|
|
||||||
return pathogen#surround(a:path . pathogen#slash() . '{}')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! pathogen#incubate(...) abort
|
|
||||||
let name = a:0 ? a:1 : 'bundle/{}'
|
|
||||||
call s:warn('Change pathogen#incubate('.(a:0 ? string(a:1) : '').') to pathogen#infect('.string(name).')')
|
|
||||||
return pathogen#interpose(name)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Deprecated alias for pathogen#interpose().
|
|
||||||
function! pathogen#runtime_append_all_bundles(...) abort
|
|
||||||
if a:0
|
|
||||||
call s:warn('Change pathogen#runtime_append_all_bundles('.string(a:1).') to pathogen#infect('.string(a:1.'/{}').')')
|
|
||||||
else
|
|
||||||
call s:warn('Change pathogen#runtime_append_all_bundles() to pathogen#infect()')
|
|
||||||
endif
|
|
||||||
return pathogen#interpose(a:0 ? a:1 . '/{}' : 'bundle/{}')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
if exists(':Vedit')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:vopen_warning = 0
|
|
||||||
|
|
||||||
function! s:find(count,cmd,file,lcd)
|
|
||||||
let rtp = pathogen#join(1,pathogen#split(&runtimepath))
|
|
||||||
let file = pathogen#runtime_findfile(a:file,a:count)
|
|
||||||
if file ==# ''
|
|
||||||
return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'"
|
|
||||||
endif
|
|
||||||
if !s:vopen_warning
|
|
||||||
let s:vopen_warning = 1
|
|
||||||
let warning = '|echohl WarningMsg|echo "Install scriptease.vim to continue using :V'.a:cmd.'"|echohl NONE'
|
|
||||||
else
|
|
||||||
let warning = ''
|
|
||||||
endif
|
|
||||||
if a:lcd
|
|
||||||
let path = file[0:-strlen(a:file)-2]
|
|
||||||
execute 'lcd `=path`'
|
|
||||||
return a:cmd.' '.pathogen#fnameescape(a:file) . warning
|
|
||||||
else
|
|
||||||
return a:cmd.' '.pathogen#fnameescape(file) . warning
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Findcomplete(A,L,P)
|
|
||||||
let sep = pathogen#slash()
|
|
||||||
let cheats = {
|
|
||||||
\'a': 'autoload',
|
|
||||||
\'d': 'doc',
|
|
||||||
\'f': 'ftplugin',
|
|
||||||
\'i': 'indent',
|
|
||||||
\'p': 'plugin',
|
|
||||||
\'s': 'syntax'}
|
|
||||||
if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0])
|
|
||||||
let request = cheats[a:A[0]].a:A[1:-1]
|
|
||||||
else
|
|
||||||
let request = a:A
|
|
||||||
endif
|
|
||||||
let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*'
|
|
||||||
let found = {}
|
|
||||||
for path in pathogen#split(&runtimepath)
|
|
||||||
let path = expand(path, ':p')
|
|
||||||
let matches = split(glob(path.sep.pattern),"\n")
|
|
||||||
call map(matches,'isdirectory(v:val) ? v:val.sep : v:val')
|
|
||||||
call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]')
|
|
||||||
for match in matches
|
|
||||||
let found[match] = 1
|
|
||||||
endfor
|
|
||||||
endfor
|
|
||||||
return sort(keys(found))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(<count>,'edit<bang>',<q-args>,0)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>,0)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,1)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split',<q-args>,<bang>1)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit',<q-args>,<bang>1)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit',<q-args>,<bang>1)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit',<q-args>,<bang>1)
|
|
||||||
command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read',<q-args>,<bang>1)
|
|
||||||
|
|
||||||
" vim:set et sw=2 foldmethod=expr foldexpr=getline(v\:lnum)=~'^\"\ Section\:'?'>1'\:getline(v\:lnum)=~#'^fu'?'a1'\:getline(v\:lnum)=~#'^endf'?'s1'\:'=':
|
|
||||||
|
|
@ -1,11 +1,13 @@
|
||||||
cd ~/.vim_runtime
|
cd ~/.vim_runtime
|
||||||
|
|
||||||
echo 'set runtimepath+=~/.vim_runtime
|
echo 'set rtp+=~/.vim_runtime
|
||||||
|
call vundle#rc()
|
||||||
|
|
||||||
source ~/.vim_runtime/vimrcs/basic.vim
|
source ~/.vim_runtime/basic.vim
|
||||||
source ~/.vim_runtime/vimrcs/filetypes.vim
|
source ~/.vim_runtime/filetypes.vim
|
||||||
source ~/.vim_runtime/vimrcs/plugins_config.vim
|
source ~/.vim_runtime/extended.vim
|
||||||
source ~/.vim_runtime/vimrcs/extended.vim
|
source ~/.vim_runtime/vundle_plugins.vim
|
||||||
|
source ~/.vim_runtime/plugins_config.vim
|
||||||
|
|
||||||
try
|
try
|
||||||
source ~/.vim_runtime/my_configs.vim
|
source ~/.vim_runtime/my_configs.vim
|
||||||
|
|
|
||||||
|
|
@ -1 +1,16 @@
|
||||||
set number
|
set number
|
||||||
|
|
||||||
|
"-- Taglist setting --
|
||||||
|
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
|
||||||
|
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
|
||||||
|
let Tlist_Show_One_File=0 "让taglist可以同时展示多个文件的函数列表
|
||||||
|
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
|
||||||
|
let Tlist_Exit_OnlyWindow=1 "当taglist是最后一个分割窗口时,自动推出vim
|
||||||
|
"是否一直处理tags.1:处理;0:不处理
|
||||||
|
let Tlist_Process_File_Always=1 "实时更新tags
|
||||||
|
let Tlist_Inc_Winwidth=0
|
||||||
|
|
||||||
|
"-- WinManager setting --
|
||||||
|
let g:winManagerWindowLayout='FileExplorer|TagList' " 设置我们要管理的插件
|
||||||
|
let g:persistentBehaviour=0 " 如果所有编辑文件都关闭了,退出vim
|
||||||
|
nmap wm :WMToggle<cr>
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,3 @@
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
" Important:
|
|
||||||
" This requries that you install https://github.com/amix/vimrc !
|
|
||||||
"
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""
|
|
||||||
" => Load pathogen paths
|
|
||||||
""""""""""""""""""""""""""""""
|
|
||||||
call pathogen#infect('~/.vim_runtime/sources_forked/{}')
|
|
||||||
call pathogen#infect('~/.vim_runtime/sources_non_forked/{}')
|
|
||||||
call pathogen#helptags()
|
|
||||||
|
|
||||||
""""""""""""""""""""""""""""""
|
""""""""""""""""""""""""""""""
|
||||||
" => bufExplorer plugin
|
" => bufExplorer plugin
|
||||||
""""""""""""""""""""""""""""""
|
""""""""""""""""""""""""""""""
|
||||||
|
|
@ -1,166 +0,0 @@
|
||||||
This is a mirror of http://www.vim.org/scripts/script.php?script_id=521
|
|
||||||
|
|
||||||
Overview
|
|
||||||
|
|
||||||
The Most Recently Used (MRU) plugin provides an easy access to a list of
|
|
||||||
recently opened/edited files in Vim. This plugin automatically stores the
|
|
||||||
file names as you open/edit them in Vim.
|
|
||||||
|
|
||||||
This plugin will work on all the platforms where Vim is supported. This
|
|
||||||
plugin will work in both console and GUI Vim. This version of the MRU
|
|
||||||
plugin needs Vim 7.0 and above. If you are using an earlier version of
|
|
||||||
Vim, then you should use an older version of the MRU plugin.
|
|
||||||
|
|
||||||
The recently used filenames are stored in a file specified by the Vim
|
|
||||||
MRU_File variable.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
|
|
||||||
To list and edit files from the MRU list, you can use the ":MRU" command.
|
|
||||||
The ":MRU" command displays the MRU file list in a temporary Vim window. If
|
|
||||||
the MRU window is already opened, then the MRU list displayed in the window
|
|
||||||
is refreshed.
|
|
||||||
|
|
||||||
If you are using GUI Vim, then the names of the recently edited files are
|
|
||||||
added to the "File->Recent Files" menu. You can select the name of a file
|
|
||||||
from this sub-menu to edit the file.
|
|
||||||
|
|
||||||
You can use the normal Vim commands to move around in the MRU window. You
|
|
||||||
cannot make changes in the MRU window.
|
|
||||||
|
|
||||||
You can select a file name to edit by pressing the <Enter> key or by double
|
|
||||||
clicking the left mouse button on a file name. The selected file will be
|
|
||||||
opened. If the file is already opened in a window, the cursor will be moved
|
|
||||||
to that window. Otherwise, the file is opened in the previous window. If the
|
|
||||||
previous window has a modified buffer or is the preview window or is used by
|
|
||||||
some other plugin, then the file is opened in a new window.
|
|
||||||
|
|
||||||
You can press the 'o' key to open the file name under the cursor in the
|
|
||||||
MRU window in a new window.
|
|
||||||
|
|
||||||
To open a file from the MRU window in read-only mode (view), press the 'v'
|
|
||||||
key.
|
|
||||||
|
|
||||||
To open a file from the MRU window in a new tab, press the 't' key. If the
|
|
||||||
file is already opened in a window in the current or in another tab, then
|
|
||||||
the cursor is moved to that tab. Otherwise, a new tab is opened.
|
|
||||||
|
|
||||||
You can open multiple files from the MRU window by specifying a count before
|
|
||||||
pressing '<Enter>' or 'v' or 'o' or 't'. You can also visually select
|
|
||||||
multiple filenames and invoke the commands to open the files. Each selected
|
|
||||||
file will be opened in a separate window or tab.
|
|
||||||
|
|
||||||
You can press the 'u' key in the MRU window to update the file list. This is
|
|
||||||
useful if you keep the MRU window open always.
|
|
||||||
|
|
||||||
You can close the MRU window by pressing the 'q' key or using one of the Vim
|
|
||||||
window commands.
|
|
||||||
|
|
||||||
To display only files matching a pattern from the MRU list in the MRU
|
|
||||||
window, you can specify a pattern to the ":MRU" command. For example, to
|
|
||||||
display only file names containing "vim" in them, you can use the following
|
|
||||||
command ":MRU vim". When you specify a partial file name and only one
|
|
||||||
matching filename is found, then the ":MRU" command will edit that file.
|
|
||||||
|
|
||||||
The ":MRU" command supports command-line completion of file names from
|
|
||||||
the MRU list. You can enter a partial file name and then press <Tab>
|
|
||||||
or <Ctrl-D> to complete or list all the matching file names. Note that
|
|
||||||
after typing the ":MRU" command, you have to enter a space before completing
|
|
||||||
the file names with <Tab>.
|
|
||||||
|
|
||||||
When a file supplied to the ":MRU" command is not present in the MRU list,
|
|
||||||
but it is a readable file, then the file will be opened (even though it is
|
|
||||||
not present in the MRU list). This is useful if you want to open a file
|
|
||||||
present in the same directory as a file in the MRU list. You can use the
|
|
||||||
command-line completion of the ":MRU" command to complete the full path of a
|
|
||||||
file and then modify the path to open another file present in the same path.
|
|
||||||
|
|
||||||
Whenever the MRU list changes, the MRU file is updated with the latest MRU
|
|
||||||
list. When you have multiple instances of Vim running at the same time, the
|
|
||||||
latest MRU list will show up in all the instances of Vim.
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
|
|
||||||
By changing the following variables you can configure the behavior of this
|
|
||||||
plugin. Set the following variables in your .vimrc file using the 'let'
|
|
||||||
command.
|
|
||||||
|
|
||||||
The list of recently edited file names is stored in the file specified by the
|
|
||||||
MRU_File variable. The default setting for this variable is
|
|
||||||
$HOME/.vim_mru_files for Unix-like systems and $USERPROFILE/_vim_mru_files
|
|
||||||
for MS-Windows systems. You can change this variable to point to a file by
|
|
||||||
adding the following line to the .vimrc file:
|
|
||||||
|
|
||||||
let MRU_File = 'd:\myhome\_vim_mru_files'
|
|
||||||
|
|
||||||
By default, the plugin will remember the names of the last 100 used files.
|
|
||||||
As you edit more files, old file names will be removed from the MRU list.
|
|
||||||
You can set the 'MRU_Max_Entries' variable to remember more file names. For
|
|
||||||
example, to remember 1000 most recently used file names, you can use
|
|
||||||
|
|
||||||
let MRU_Max_Entries = 1000
|
|
||||||
|
|
||||||
By default, all the edited file names will be added to the MRU list. If you
|
|
||||||
want to exclude file names matching a list of patterns, you can set the
|
|
||||||
MRU_Exclude_Files variable to a list of Vim regular expressions. By default,
|
|
||||||
this variable is set to an empty string. For example, to not include files
|
|
||||||
in the temporary (/tmp, /var/tmp and d:\temp) directories, you can set the
|
|
||||||
MRU_Exclude_Files variable to
|
|
||||||
|
|
||||||
let MRU_Exclude_Files = '^/tmp/.*\|^/var/tmp/.*' " For Unix
|
|
||||||
let MRU_Exclude_Files = '^c:\\temp\\.*' " For MS-Windows
|
|
||||||
|
|
||||||
The specified pattern should be a Vim regular expression pattern.
|
|
||||||
|
|
||||||
If you want to add only file names matching a set of patterns to the MRU
|
|
||||||
list, then you can set the MRU_Include_Files variable. This variable should
|
|
||||||
be set to a Vim regular expression pattern. For example, to add only .c and
|
|
||||||
.h files to the MRU list, you can set this variable as below:
|
|
||||||
|
|
||||||
let MRU_Include_Files = '\.c$\|\.h$'
|
|
||||||
|
|
||||||
By default, MRU_Include_Files is set to an empty string and all the edited
|
|
||||||
filenames are added to the MRU list.
|
|
||||||
|
|
||||||
The default height of the MRU window is 8. You can set the MRU_Window_Height
|
|
||||||
variable to change the window height.
|
|
||||||
|
|
||||||
let MRU_Window_Height = 15
|
|
||||||
|
|
||||||
By default, when the :MRU command is invoked, the MRU list will be displayed
|
|
||||||
in a new window. Instead, if you want the MRU plugin to reuse the current
|
|
||||||
window, then you can set the 'MRU_Use_Current_Window' variable to one.
|
|
||||||
|
|
||||||
let MRU_Use_Current_Window = 1
|
|
||||||
|
|
||||||
The MRU plugin will reuse the current window. When a file name is selected,
|
|
||||||
the file is also opened in the current window.
|
|
||||||
|
|
||||||
When you select a file from the MRU window, the MRU window will be
|
|
||||||
automatically closed and the selected file will be opened in the previous
|
|
||||||
window. You can set the 'MRU_Auto_Close' variable to zero to keep the MRU
|
|
||||||
window open.
|
|
||||||
|
|
||||||
let MRU_Auto_Close = 0
|
|
||||||
|
|
||||||
If you don't use the "File->Recent Files" menu and want to disable it,
|
|
||||||
then you can set the 'MRU_Add_Menu' variable to zero. By default, the
|
|
||||||
menu is enabled.
|
|
||||||
|
|
||||||
let MRU_Add_Menu = 0
|
|
||||||
|
|
||||||
If too many file names are present in the MRU list, then updating the MRU
|
|
||||||
menu to list all the file names makes Vim slow. To avoid this, the
|
|
||||||
MRU_Max_Menu_Entries variable controls the number of file names to show in
|
|
||||||
the MRU menu. By default, this is set to 10. You can change this to show
|
|
||||||
more entries in the menu.
|
|
||||||
|
|
||||||
let MRU_Max_Menu_Entries = 20
|
|
||||||
|
|
||||||
If many file names are present in the MRU list, then the MRU menu is split
|
|
||||||
into sub-menus. Each sub-menu contains MRU_Max_Submenu_Entries file names.
|
|
||||||
The default setting for this is 10. You can change this to increase the
|
|
||||||
number of file names displayed in a single sub-menu:
|
|
||||||
|
|
||||||
let MRU_Max_Submenu_Entries = 15
|
|
||||||
|
|
||||||
|
|
@ -1,989 +0,0 @@
|
||||||
" File: mru.vim
|
|
||||||
" Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
|
|
||||||
" Version: 3.4
|
|
||||||
" Last Modified: April 13, 2012
|
|
||||||
" Copyright: Copyright (C) 2003-2012 Yegappan Lakshmanan
|
|
||||||
" Permission is hereby granted to use and distribute this code,
|
|
||||||
" with or without modifications, provided that this copyright
|
|
||||||
" notice is copied with it. Like anything else that's free,
|
|
||||||
" mru.vim is provided *as is* and comes with no warranty of any
|
|
||||||
" kind, either expressed or implied. In no event will the copyright
|
|
||||||
" holder be liable for any damamges resulting from the use of this
|
|
||||||
" software.
|
|
||||||
"
|
|
||||||
" Overview
|
|
||||||
" --------
|
|
||||||
" The Most Recently Used (MRU) plugin provides an easy access to a list of
|
|
||||||
" recently opened/edited files in Vim. This plugin automatically stores the
|
|
||||||
" file names as you open/edit them in Vim.
|
|
||||||
"
|
|
||||||
" This plugin will work on all the platforms where Vim is supported. This
|
|
||||||
" plugin will work in both console and GUI Vim. This version of the MRU
|
|
||||||
" plugin needs Vim 7.0 and above. If you are using an earlier version of
|
|
||||||
" Vim, then you should use an older version of the MRU plugin.
|
|
||||||
"
|
|
||||||
" The recently used filenames are stored in a file specified by the Vim
|
|
||||||
" MRU_File variable.
|
|
||||||
"
|
|
||||||
" Installation
|
|
||||||
" ------------
|
|
||||||
" 1. Copy the mru.vim file to one of the following directories:
|
|
||||||
"
|
|
||||||
" $HOME/.vim/plugin - Unix like systems
|
|
||||||
" $HOME/vimfiles/plugin - MS-Windows
|
|
||||||
" $VIM:vimfiles:plugin - Macintosh
|
|
||||||
" $VIM/vimfiles/plugin - All
|
|
||||||
"
|
|
||||||
" Refer to the following Vim help topics for more information about Vim
|
|
||||||
" plugins:
|
|
||||||
"
|
|
||||||
" :help add-plugin
|
|
||||||
" :help add-global-plugin
|
|
||||||
" :help runtimepath
|
|
||||||
"
|
|
||||||
" 2. Set the MRU_File Vim variable in the .vimrc file to the location of a
|
|
||||||
" file to store the most recently edited file names. This step is needed
|
|
||||||
" only if you want to change the default MRU filename.
|
|
||||||
" 3. Restart Vim.
|
|
||||||
" 4. You can use the ":MRU" command to list and edit the recently used files.
|
|
||||||
" In GUI Vim, you can use the 'File->Recent Files' menu to access the
|
|
||||||
" recently used files.
|
|
||||||
"
|
|
||||||
" To uninstall this plugin, remove this file (mru.vim) from the
|
|
||||||
" $HOME/.vim/plugin or $HOME/vimfiles/plugin or the $VIM/vimfile/plugin
|
|
||||||
" directory.
|
|
||||||
"
|
|
||||||
" Usage
|
|
||||||
" -----
|
|
||||||
" To list and edit files from the MRU list, you can use the ":MRU" command.
|
|
||||||
" The ":MRU" command displays the MRU file list in a temporary Vim window. If
|
|
||||||
" the MRU window is already opened, then the MRU list displayed in the window
|
|
||||||
" is refreshed.
|
|
||||||
"
|
|
||||||
" If you are using GUI Vim, then the names of the recently edited files are
|
|
||||||
" added to the "File->Recent Files" menu. You can select the name of a file
|
|
||||||
" from this sub-menu to edit the file.
|
|
||||||
"
|
|
||||||
" You can use the normal Vim commands to move around in the MRU window. You
|
|
||||||
" cannot make changes in the MRU window.
|
|
||||||
"
|
|
||||||
" You can select a file name to edit by pressing the <Enter> key or by double
|
|
||||||
" clicking the left mouse button on a file name. The selected file will be
|
|
||||||
" opened. If the file is already opened in a window, the cursor will be moved
|
|
||||||
" to that window. Otherwise, the file is opened in the previous window. If the
|
|
||||||
" previous window has a modified buffer or is the preview window or is used by
|
|
||||||
" some other plugin, then the file is opened in a new window.
|
|
||||||
"
|
|
||||||
" You can press the 'o' key to open the file name under the cursor in the
|
|
||||||
" MRU window in a new window.
|
|
||||||
"
|
|
||||||
" To open a file from the MRU window in read-only mode (view), press the 'v'
|
|
||||||
" key.
|
|
||||||
"
|
|
||||||
" To open a file from the MRU window in a new tab, press the 't' key. If the
|
|
||||||
" file is already opened in a window in the current or in another tab, then
|
|
||||||
" the cursor is moved to that tab. Otherwise, a new tab is opened.
|
|
||||||
"
|
|
||||||
" You can open multiple files from the MRU window by specifying a count before
|
|
||||||
" pressing '<Enter>' or 'v' or 'o' or 't'. You can also visually select
|
|
||||||
" multiple filenames and invoke the commands to open the files. Each selected
|
|
||||||
" file will be opened in a separate window or tab.
|
|
||||||
"
|
|
||||||
" You can press the 'u' key in the MRU window to update the file list. This is
|
|
||||||
" useful if you keep the MRU window open always.
|
|
||||||
"
|
|
||||||
" You can close the MRU window by pressing the 'q' key or using one of the Vim
|
|
||||||
" window commands.
|
|
||||||
"
|
|
||||||
" To display only files matching a pattern from the MRU list in the MRU
|
|
||||||
" window, you can specify a pattern to the ":MRU" command. For example, to
|
|
||||||
" display only file names matching "vim" in them, you can use the following
|
|
||||||
" command ":MRU vim". When you specify a partial file name and only one
|
|
||||||
" matching filename is found, then the ":MRU" command will edit that file.
|
|
||||||
"
|
|
||||||
" The ":MRU" command supports command-line completion of file names from
|
|
||||||
" the MRU list. You can enter a partial file name and then press <Tab>
|
|
||||||
" or <Ctrl-D> to complete or list all the matching file names. Note that
|
|
||||||
" after typing the ":MRU" command, you have to enter a space before completing
|
|
||||||
" the file names with <Tab>.
|
|
||||||
"
|
|
||||||
" When a file supplied to the ":MRU" command is not present in the MRU list,
|
|
||||||
" but it is a readable file, then the file will be opened (even though it is
|
|
||||||
" not present in the MRU list). This is useful if you want to open a file
|
|
||||||
" present in the same directory as a file in the MRU list. You can use the
|
|
||||||
" command-line completion of the ":MRU" command to complete the full path of a
|
|
||||||
" file and then modify the path to open another file present in the same path.
|
|
||||||
"
|
|
||||||
" Whenever the MRU list changes, the MRU file is updated with the latest MRU
|
|
||||||
" list. When you have multiple instances of Vim running at the same time, the
|
|
||||||
" latest MRU list will show up in all the instances of Vim.
|
|
||||||
"
|
|
||||||
" Configuration
|
|
||||||
" -------------
|
|
||||||
" By changing the following variables you can configure the behavior of this
|
|
||||||
" plugin. Set the following variables in your .vimrc file using the 'let'
|
|
||||||
" command.
|
|
||||||
"
|
|
||||||
" The list of recently edited file names is stored in the file specified by the
|
|
||||||
" MRU_File variable. The default setting for this variable is
|
|
||||||
" $HOME/.vim_mru_files for Unix-like systems and $USERPROFILE/_vim_mru_files
|
|
||||||
" for MS-Windows systems. You can change this variable to point to a file by
|
|
||||||
" adding the following line to the .vimrc file:
|
|
||||||
"
|
|
||||||
" let MRU_File = 'd:\myhome\_vim_mru_files'
|
|
||||||
"
|
|
||||||
" By default, the plugin will remember the names of the last 100 used files.
|
|
||||||
" As you edit more files, old file names will be removed from the MRU list.
|
|
||||||
" You can set the 'MRU_Max_Entries' variable to remember more file names. For
|
|
||||||
" example, to remember 1000 most recently used file names, you can use
|
|
||||||
"
|
|
||||||
" let MRU_Max_Entries = 1000
|
|
||||||
"
|
|
||||||
" By default, all the edited file names will be added to the MRU list. If you
|
|
||||||
" want to exclude file names matching a list of patterns, you can set the
|
|
||||||
" MRU_Exclude_Files variable to a list of Vim regular expressions. By default,
|
|
||||||
" this variable is set to an empty string. For example, to not include files
|
|
||||||
" in the temporary (/tmp, /var/tmp and d:\temp) directories, you can set the
|
|
||||||
" MRU_Exclude_Files variable to
|
|
||||||
"
|
|
||||||
" let MRU_Exclude_Files = '^/tmp/.*\|^/var/tmp/.*' " For Unix
|
|
||||||
" let MRU_Exclude_Files = '^c:\\temp\\.*' " For MS-Windows
|
|
||||||
"
|
|
||||||
" The specified pattern should be a Vim regular expression pattern.
|
|
||||||
"
|
|
||||||
" If you want to add only file names matching a set of patterns to the MRU
|
|
||||||
" list, then you can set the MRU_Include_Files variable. This variable should
|
|
||||||
" be set to a Vim regular expression pattern. For example, to add only .c and
|
|
||||||
" .h files to the MRU list, you can set this variable as below:
|
|
||||||
"
|
|
||||||
" let MRU_Include_Files = '\.c$\|\.h$'
|
|
||||||
"
|
|
||||||
" By default, MRU_Include_Files is set to an empty string and all the edited
|
|
||||||
" filenames are added to the MRU list.
|
|
||||||
"
|
|
||||||
" The default height of the MRU window is 8. You can set the MRU_Window_Height
|
|
||||||
" variable to change the window height.
|
|
||||||
"
|
|
||||||
" let MRU_Window_Height = 15
|
|
||||||
"
|
|
||||||
" By default, when the :MRU command is invoked, the MRU list will be displayed
|
|
||||||
" in a new window. Instead, if you want the MRU plugin to reuse the current
|
|
||||||
" window, then you can set the 'MRU_Use_Current_Window' variable to one.
|
|
||||||
"
|
|
||||||
" let MRU_Use_Current_Window = 1
|
|
||||||
"
|
|
||||||
" The MRU plugin will reuse the current window. When a file name is selected,
|
|
||||||
" the file is also opened in the current window.
|
|
||||||
"
|
|
||||||
" When you select a file from the MRU window, the MRU window will be
|
|
||||||
" automatically closed and the selected file will be opened in the previous
|
|
||||||
" window. You can set the 'MRU_Auto_Close' variable to zero to keep the MRU
|
|
||||||
" window open.
|
|
||||||
"
|
|
||||||
" let MRU_Auto_Close = 0
|
|
||||||
"
|
|
||||||
" If you don't use the "File->Recent Files" menu and want to disable it,
|
|
||||||
" then you can set the 'MRU_Add_Menu' variable to zero. By default, the
|
|
||||||
" menu is enabled.
|
|
||||||
"
|
|
||||||
" let MRU_Add_Menu = 0
|
|
||||||
"
|
|
||||||
" If too many file names are present in the MRU list, then updating the MRU
|
|
||||||
" menu to list all the file names makes Vim slow. To avoid this, the
|
|
||||||
" MRU_Max_Menu_Entries variable controls the number of file names to show in
|
|
||||||
" the MRU menu. By default, this is set to 10. You can change this to show
|
|
||||||
" more entries in the menu.
|
|
||||||
"
|
|
||||||
" let MRU_Max_Menu_Entries = 20
|
|
||||||
"
|
|
||||||
" If many file names are present in the MRU list, then the MRU menu is split
|
|
||||||
" into sub-menus. Each sub-menu contains MRU_Max_Submenu_Entries file names.
|
|
||||||
" The default setting for this is 10. You can change this to increase the
|
|
||||||
" number of file names displayed in a single sub-menu:
|
|
||||||
"
|
|
||||||
" let MRU_Max_Submenu_Entries = 15
|
|
||||||
"
|
|
||||||
" ****************** Do not modify after this line ************************
|
|
||||||
if exists('loaded_mru')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let loaded_mru=1
|
|
||||||
|
|
||||||
if v:version < 700
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Line continuation used here
|
|
||||||
let s:cpo_save = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
" MRU configuration variables {{{1
|
|
||||||
" Maximum number of entries allowed in the MRU list
|
|
||||||
if !exists('MRU_Max_Entries')
|
|
||||||
let MRU_Max_Entries = 100
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Files to exclude from the MRU list
|
|
||||||
if !exists('MRU_Exclude_Files')
|
|
||||||
let MRU_Exclude_Files = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Files to include in the MRU list
|
|
||||||
if !exists('MRU_Include_Files')
|
|
||||||
let MRU_Include_Files = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Height of the MRU window
|
|
||||||
" Default height is 8
|
|
||||||
if !exists('MRU_Window_Height')
|
|
||||||
let MRU_Window_Height = 8
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('MRU_Use_Current_Window')
|
|
||||||
let MRU_Use_Current_Window = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('MRU_Auto_Close')
|
|
||||||
let MRU_Auto_Close = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('MRU_File')
|
|
||||||
if has('unix') || has('macunix')
|
|
||||||
let MRU_File = $HOME . '/.vim_mru_files'
|
|
||||||
else
|
|
||||||
let MRU_File = $VIM . '/_vim_mru_files'
|
|
||||||
if has('win32')
|
|
||||||
" MS-Windows
|
|
||||||
if $USERPROFILE != ''
|
|
||||||
let MRU_File = $USERPROFILE . '\_vim_mru_files'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Option for enabling or disabling the MRU menu
|
|
||||||
if !exists('MRU_Add_Menu')
|
|
||||||
let MRU_Add_Menu = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Maximum number of file names to show in the MRU menu. If too many files are
|
|
||||||
" listed in the menu, then Vim becomes slow when updating the menu. So set
|
|
||||||
" this to a low value.
|
|
||||||
if !exists('MRU_Max_Menu_Entries')
|
|
||||||
let MRU_Max_Menu_Entries = 10
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Maximum number of file names to show in a MRU sub-menu. If the MRU list
|
|
||||||
" contains more file names than this setting, then the MRU menu is split into
|
|
||||||
" one or more sub-menus.
|
|
||||||
if !exists('MRU_Max_Submenu_Entries')
|
|
||||||
let MRU_Max_Submenu_Entries = 10
|
|
||||||
endif
|
|
||||||
|
|
||||||
" When only a single matching filename is found in the MRU list, the following
|
|
||||||
" option controls whether the file name is displayed in the MRU window or the
|
|
||||||
" file is directly opened. When this variable is set to 0 and a single
|
|
||||||
" matching file name is found, then the file is directly opened.
|
|
||||||
if !exists('MRU_Window_Open_Always')
|
|
||||||
let MRU_Window_Open_Always = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" When opening a file from the MRU list, the file is opened in the current
|
|
||||||
" tab. If the selected file has to be opened in a tab always, then set the
|
|
||||||
" following variable to 1. If the file is already opened in a tab, then the
|
|
||||||
" cursor will be moved to that tab.
|
|
||||||
if !exists('MRU_Open_File_Use_Tabs')
|
|
||||||
let MRU_Open_File_Use_Tabs = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Control to temporarily lock the MRU list. Used to prevent files from
|
|
||||||
" getting added to the MRU list when the ':vimgrep' command is executed.
|
|
||||||
let s:mru_list_locked = 0
|
|
||||||
|
|
||||||
" MRU_LoadList {{{1
|
|
||||||
" Loads the latest list of file names from the MRU file
|
|
||||||
function! s:MRU_LoadList()
|
|
||||||
" If the MRU file is present, then load the list of filenames. Otherwise
|
|
||||||
" start with an empty list.
|
|
||||||
if filereadable(g:MRU_File)
|
|
||||||
let s:MRU_files = readfile(g:MRU_File)
|
|
||||||
if s:MRU_files[0] =~# '^\s*" Most recently edited files in Vim'
|
|
||||||
" Generated by the previous version of the MRU plugin.
|
|
||||||
" Discard the list.
|
|
||||||
let s:MRU_files = []
|
|
||||||
elseif s:MRU_files[0] =~# '^#'
|
|
||||||
" Remove the comment line
|
|
||||||
call remove(s:MRU_files, 0)
|
|
||||||
else
|
|
||||||
" Unsupported format
|
|
||||||
let s:MRU_files = []
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let s:MRU_files = []
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Refresh the MRU menu with the latest list of filenames
|
|
||||||
call s:MRU_Refresh_Menu()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_SaveList {{{1
|
|
||||||
" Saves the MRU file names to the MRU file
|
|
||||||
function! s:MRU_SaveList()
|
|
||||||
let l = []
|
|
||||||
call add(l, '# Most recently edited files in Vim (version 3.0)')
|
|
||||||
call extend(l, s:MRU_files)
|
|
||||||
call writefile(l, g:MRU_File)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_AddFile {{{1
|
|
||||||
" Adds a file to the MRU file list
|
|
||||||
" acmd_bufnr - Buffer number of the file to add
|
|
||||||
function! s:MRU_AddFile(acmd_bufnr)
|
|
||||||
if s:mru_list_locked
|
|
||||||
" MRU list is currently locked
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Get the full path to the filename
|
|
||||||
let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p')
|
|
||||||
if fname == ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Skip temporary buffers with buftype set. The buftype is set for buffers
|
|
||||||
" used by plugins.
|
|
||||||
if &buftype != ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:MRU_Include_Files != ''
|
|
||||||
" If MRU_Include_Files is set, include only files matching the
|
|
||||||
" specified pattern
|
|
||||||
if fname !~# g:MRU_Include_Files
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:MRU_Exclude_Files != ''
|
|
||||||
" Do not add files matching the pattern specified in the
|
|
||||||
" MRU_Exclude_Files to the MRU list
|
|
||||||
if fname =~# g:MRU_Exclude_Files
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If the filename is not already present in the MRU list and is not
|
|
||||||
" readable then ignore it
|
|
||||||
let idx = index(s:MRU_files, fname)
|
|
||||||
if idx == -1
|
|
||||||
if !filereadable(fname)
|
|
||||||
" File is not readable and is not in the MRU list
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Load the latest MRU file list
|
|
||||||
call s:MRU_LoadList()
|
|
||||||
|
|
||||||
" Remove the new file name from the existing MRU list (if already present)
|
|
||||||
call filter(s:MRU_files, 'v:val !=# fname')
|
|
||||||
|
|
||||||
" Add the new file list to the beginning of the updated old file list
|
|
||||||
call insert(s:MRU_files, fname, 0)
|
|
||||||
|
|
||||||
" Trim the list
|
|
||||||
if len(s:MRU_files) > g:MRU_Max_Entries
|
|
||||||
call remove(s:MRU_files, g:MRU_Max_Entries, -1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Save the updated MRU list
|
|
||||||
call s:MRU_SaveList()
|
|
||||||
|
|
||||||
" Refresh the MRU menu
|
|
||||||
call s:MRU_Refresh_Menu()
|
|
||||||
|
|
||||||
" If the MRU window is open, update the displayed MRU list
|
|
||||||
let bname = '__MRU_Files__'
|
|
||||||
let winnum = bufwinnr(bname)
|
|
||||||
if winnum != -1
|
|
||||||
let cur_winnr = winnr()
|
|
||||||
call s:MRU_Open_Window()
|
|
||||||
if winnr() != cur_winnr
|
|
||||||
exe cur_winnr . 'wincmd w'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_escape_filename {{{1
|
|
||||||
" Escape special characters in a filename. Special characters in file names
|
|
||||||
" that should be escaped (for security reasons)
|
|
||||||
let s:esc_filename_chars = ' *?[{`$%#"|!<>();&' . "'\t\n"
|
|
||||||
function! s:MRU_escape_filename(fname)
|
|
||||||
return escape(a:fname, s:esc_filename_chars)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Edit_File {{{1
|
|
||||||
" Edit the specified file
|
|
||||||
" filename - Name of the file to edit
|
|
||||||
" sanitized - Specifies whether the filename is already escaped for special
|
|
||||||
" characters or not.
|
|
||||||
function! s:MRU_Edit_File(filename, sanitized)
|
|
||||||
if !a:sanitized
|
|
||||||
let esc_fname = s:MRU_escape_filename(a:filename)
|
|
||||||
else
|
|
||||||
let esc_fname = a:filename
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If the user wants to always open the file in a tab, then open the file
|
|
||||||
" in a tab. If it is already opened in a tab, then the cursor will be
|
|
||||||
" moved to that tab.
|
|
||||||
if g:MRU_Open_File_Use_Tabs
|
|
||||||
call s:MRU_Open_File_In_Tab(a:filename, esc_fname)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If the file is already open in one of the windows, jump to it
|
|
||||||
let winnum = bufwinnr('^' . a:filename . '$')
|
|
||||||
if winnum != -1
|
|
||||||
if winnum != winnr()
|
|
||||||
exe winnum . 'wincmd w'
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if &modified || &buftype != '' || &previewwindow
|
|
||||||
" Current buffer has unsaved changes or is a special buffer or is
|
|
||||||
" the preview window. So open the file in a new window
|
|
||||||
exe 'split ' . esc_fname
|
|
||||||
else
|
|
||||||
exe 'edit ' . esc_fname
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Open_File_In_Tab
|
|
||||||
" Open a file in a tab. If the file is already opened in a tab, jump to the
|
|
||||||
" tab. Otherwise, create a new tab and open the file.
|
|
||||||
" fname : Name of the file to open
|
|
||||||
" esc_fname : File name with special characters escaped
|
|
||||||
function! s:MRU_Open_File_In_Tab(fname, esc_fname)
|
|
||||||
" If the selected file is already open in the current tab or in
|
|
||||||
" another tab, jump to it. Otherwise open it in a new tab
|
|
||||||
if bufwinnr('^' . a:fname . '$') == -1
|
|
||||||
let tabnum = -1
|
|
||||||
let i = 1
|
|
||||||
let bnum = bufnr('^' . a:fname . '$')
|
|
||||||
while i <= tabpagenr('$')
|
|
||||||
if index(tabpagebuflist(i), bnum) != -1
|
|
||||||
let tabnum = i
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
if tabnum != -1
|
|
||||||
" Goto the tab containing the file
|
|
||||||
exe 'tabnext ' . i
|
|
||||||
else
|
|
||||||
" Open a new tab as the last tab page
|
|
||||||
exe '999tabnew ' . a:esc_fname
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Jump to the window containing the file
|
|
||||||
let winnum = bufwinnr('^' . a:fname . '$')
|
|
||||||
if winnum != winnr()
|
|
||||||
exe winnum . 'wincmd w'
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Window_Edit_File {{{1
|
|
||||||
" fname : Name of the file to edit. May specify single or multiple
|
|
||||||
" files.
|
|
||||||
" edit_type : Specifies how to edit the file. Can be one of 'edit' or 'view'.
|
|
||||||
" 'view' - Open the file as a read-only file
|
|
||||||
" 'edit' - Edit the file as a regular file
|
|
||||||
" multi : Specifies whether a single file or multiple files need to be
|
|
||||||
" opened.
|
|
||||||
" open_type : Specifies where to open the file. Can be one of 'useopen' or
|
|
||||||
" 'newwin' or 'newtab'.
|
|
||||||
" useopen - If the file is already present in a window, then
|
|
||||||
" jump to that window. Otherwise, open the file in
|
|
||||||
" the previous window.
|
|
||||||
" newwin_horiz - Open the file in a new horizontal window.
|
|
||||||
" newwin_vert - Open the file in a new vertical window.
|
|
||||||
" newtab - Open the file in a new tab. If the file is already
|
|
||||||
" opened in a tab, then jump to that tab.
|
|
||||||
function! s:MRU_Window_Edit_File(fname, multi, edit_type, open_type)
|
|
||||||
let esc_fname = s:MRU_escape_filename(a:fname)
|
|
||||||
|
|
||||||
if a:open_type == 'newwin_horiz'
|
|
||||||
" Edit the file in a new horizontally split window above the previous
|
|
||||||
" window
|
|
||||||
wincmd p
|
|
||||||
exe 'belowright new ' . esc_fname
|
|
||||||
elseif a:open_type == 'newwin_vert'
|
|
||||||
" Edit the file in a new vertically split window above the previous
|
|
||||||
" window
|
|
||||||
wincmd p
|
|
||||||
exe 'belowright vnew ' . esc_fname
|
|
||||||
elseif a:open_type == 'newtab' || g:MRU_Open_File_Use_Tabs
|
|
||||||
call s:MRU_Open_File_In_Tab(a:fname, esc_fname)
|
|
||||||
else
|
|
||||||
" If the selected file is already open in one of the windows,
|
|
||||||
" jump to it
|
|
||||||
let winnum = bufwinnr('^' . a:fname . '$')
|
|
||||||
if winnum != -1
|
|
||||||
exe winnum . 'wincmd w'
|
|
||||||
else
|
|
||||||
if g:MRU_Auto_Close == 1 && g:MRU_Use_Current_Window == 0
|
|
||||||
" Jump to the window from which the MRU window was opened
|
|
||||||
if exists('s:MRU_last_buffer')
|
|
||||||
let last_winnr = bufwinnr(s:MRU_last_buffer)
|
|
||||||
if last_winnr != -1 && last_winnr != winnr()
|
|
||||||
exe last_winnr . 'wincmd w'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if g:MRU_Use_Current_Window == 0
|
|
||||||
" Goto the previous window
|
|
||||||
" If MRU_Use_Current_Window is set to one, then the
|
|
||||||
" current window is used to open the file
|
|
||||||
wincmd p
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
let split_window = 0
|
|
||||||
|
|
||||||
if &modified || &previewwindow || a:multi
|
|
||||||
" Current buffer has unsaved changes or is the preview window
|
|
||||||
" or the user is opening multiple files
|
|
||||||
" So open the file in a new window
|
|
||||||
let split_window = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if &buftype != ''
|
|
||||||
" Current buffer is a special buffer (maybe used by a plugin)
|
|
||||||
if g:MRU_Use_Current_Window == 0 ||
|
|
||||||
\ bufnr('%') != bufnr('__MRU_Files__')
|
|
||||||
let split_window = 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Edit the file
|
|
||||||
if split_window
|
|
||||||
" Current buffer has unsaved changes or is a special buffer or
|
|
||||||
" is the preview window. So open the file in a new window
|
|
||||||
if a:edit_type == 'edit'
|
|
||||||
exe 'split ' . esc_fname
|
|
||||||
else
|
|
||||||
exe 'sview ' . esc_fname
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if a:edit_type == 'edit'
|
|
||||||
exe 'edit ' . esc_fname
|
|
||||||
else
|
|
||||||
exe 'view ' . esc_fname
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Select_File_Cmd {{{1
|
|
||||||
" Open a file selected from the MRU window
|
|
||||||
"
|
|
||||||
" 'opt' has two values separated by comma. The first value specifies how to
|
|
||||||
" edit the file and can be either 'edit' or 'view'. The second value
|
|
||||||
" specifies where to open the file. It can take one of the following values:
|
|
||||||
" 'useopen' to open file in the previous window
|
|
||||||
" 'newwin_horiz' to open the file in a new horizontal split window
|
|
||||||
" 'newwin_vert' to open the file in a new vertical split window.
|
|
||||||
" 'newtab' to open the file in a new tab.
|
|
||||||
" If multiple file names are selected using visual mode, then open multiple
|
|
||||||
" files (either in split windows or tabs)
|
|
||||||
function! s:MRU_Select_File_Cmd(opt) range
|
|
||||||
let [edit_type, open_type] = split(a:opt, ',')
|
|
||||||
|
|
||||||
let fnames = getline(a:firstline, a:lastline)
|
|
||||||
|
|
||||||
if g:MRU_Auto_Close == 1 && g:MRU_Use_Current_Window == 0
|
|
||||||
" Automatically close the window if the file window is
|
|
||||||
" not used to display the MRU list.
|
|
||||||
silent! close
|
|
||||||
endif
|
|
||||||
|
|
||||||
let multi = 0
|
|
||||||
|
|
||||||
for f in fnames
|
|
||||||
if f == ''
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
|
|
||||||
" The text in the MRU window contains the filename in parenthesis
|
|
||||||
let file = matchstr(f, '(\zs.*\ze)')
|
|
||||||
|
|
||||||
call s:MRU_Window_Edit_File(file, multi, edit_type, open_type)
|
|
||||||
|
|
||||||
if a:firstline != a:lastline
|
|
||||||
" Opening multiple files
|
|
||||||
let multi = 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Warn_Msg {{{1
|
|
||||||
" Display a warning message
|
|
||||||
function! s:MRU_Warn_Msg(msg)
|
|
||||||
echohl WarningMsg
|
|
||||||
echo a:msg
|
|
||||||
echohl None
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Open_Window {{{1
|
|
||||||
" Display the Most Recently Used file list in a temporary window.
|
|
||||||
" If the optional argument is supplied, then it specifies the pattern of files
|
|
||||||
" to selectively display in the MRU window.
|
|
||||||
function! s:MRU_Open_Window(...)
|
|
||||||
|
|
||||||
" Load the latest MRU file list
|
|
||||||
call s:MRU_LoadList()
|
|
||||||
|
|
||||||
" Check for empty MRU list
|
|
||||||
if empty(s:MRU_files)
|
|
||||||
call s:MRU_Warn_Msg('MRU file list is empty')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Save the current buffer number. This is used later to open a file when a
|
|
||||||
" entry is selected from the MRU window. The window number is not saved,
|
|
||||||
" as the window number will change when new windows are opened.
|
|
||||||
let s:MRU_last_buffer = bufnr('%')
|
|
||||||
|
|
||||||
let bname = '__MRU_Files__'
|
|
||||||
|
|
||||||
" If the window is already open, jump to it
|
|
||||||
let winnum = bufwinnr(bname)
|
|
||||||
if winnum != -1
|
|
||||||
if winnr() != winnum
|
|
||||||
" If not already in the window, jump to it
|
|
||||||
exe winnum . 'wincmd w'
|
|
||||||
endif
|
|
||||||
|
|
||||||
setlocal modifiable
|
|
||||||
|
|
||||||
" Delete the contents of the buffer to the black-hole register
|
|
||||||
silent! %delete _
|
|
||||||
else
|
|
||||||
if g:MRU_Use_Current_Window
|
|
||||||
" Reuse the current window
|
|
||||||
"
|
|
||||||
" If the __MRU_Files__ buffer exists, then reuse it. Otherwise open
|
|
||||||
" a new buffer
|
|
||||||
let bufnum = bufnr(bname)
|
|
||||||
if bufnum == -1
|
|
||||||
let cmd = 'edit ' . bname
|
|
||||||
else
|
|
||||||
let cmd = 'buffer ' . bufnum
|
|
||||||
endif
|
|
||||||
|
|
||||||
exe cmd
|
|
||||||
|
|
||||||
if bufnr('%') != bufnr(bname)
|
|
||||||
" Failed to edit the MRU buffer
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
" Open a new window at the bottom
|
|
||||||
|
|
||||||
" If the __MRU_Files__ buffer exists, then reuse it. Otherwise open
|
|
||||||
" a new buffer
|
|
||||||
let bufnum = bufnr(bname)
|
|
||||||
if bufnum == -1
|
|
||||||
let wcmd = bname
|
|
||||||
else
|
|
||||||
let wcmd = '+buffer' . bufnum
|
|
||||||
endif
|
|
||||||
|
|
||||||
exe 'silent! botright ' . g:MRU_Window_Height . 'split ' . wcmd
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Mark the buffer as scratch
|
|
||||||
setlocal buftype=nofile
|
|
||||||
setlocal bufhidden=delete
|
|
||||||
setlocal noswapfile
|
|
||||||
setlocal nowrap
|
|
||||||
setlocal nobuflisted
|
|
||||||
" Use fixed height for the MRU window
|
|
||||||
setlocal winfixheight
|
|
||||||
|
|
||||||
call MRU_SetupSyntax()
|
|
||||||
|
|
||||||
" Setup the cpoptions properly for the maps to work
|
|
||||||
let old_cpoptions = &cpoptions
|
|
||||||
set cpoptions&vim
|
|
||||||
|
|
||||||
" Create mappings to select and edit a file from the MRU list
|
|
||||||
nnoremap <buffer> <silent> <CR>
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,useopen')<CR>
|
|
||||||
vnoremap <buffer> <silent> <CR>
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,useopen')<CR>
|
|
||||||
nnoremap <buffer> <silent> o
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newwin_horiz')<CR>
|
|
||||||
vnoremap <buffer> <silent> o
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newwin_horiz')<CR>
|
|
||||||
nnoremap <buffer> <silent> O
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newwin_vert')<CR>
|
|
||||||
vnoremap <buffer> <silent> O
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newwin_vert')<CR>
|
|
||||||
nnoremap <buffer> <silent> t
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newtab')<CR>
|
|
||||||
vnoremap <buffer> <silent> t
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,newtab')<CR>
|
|
||||||
nnoremap <buffer> <silent> v
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('view,useopen')<CR>
|
|
||||||
nnoremap <buffer> <silent> u :MRU<CR>
|
|
||||||
nnoremap <buffer> <silent> <2-LeftMouse>
|
|
||||||
\ :call <SID>MRU_Select_File_Cmd('edit,useopen')<CR>
|
|
||||||
nnoremap <buffer> <silent> q :close<CR>
|
|
||||||
|
|
||||||
" Restore the previous cpoptions settings
|
|
||||||
let &cpoptions = old_cpoptions
|
|
||||||
|
|
||||||
" Display the MRU list
|
|
||||||
if a:0 == 0
|
|
||||||
" No search pattern specified. Display the complete list
|
|
||||||
let m = copy(s:MRU_files)
|
|
||||||
else
|
|
||||||
" Display only the entries matching the specified pattern
|
|
||||||
" First try using it as a literal pattern
|
|
||||||
let m = filter(copy(s:MRU_files), 'stridx(v:val, a:1) != -1')
|
|
||||||
if len(m) == 0
|
|
||||||
" No match. Try using it as a regular expression
|
|
||||||
let m = filter(copy(s:MRU_files), 'v:val =~# a:1')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Get the tail part of the file name (without the directory) and display
|
|
||||||
" it along with the full path
|
|
||||||
let output = map(m, 'fnamemodify(v:val, ":t") . " (" . v:val . ")"')
|
|
||||||
silent! 0put =output
|
|
||||||
|
|
||||||
" Delete the empty line at the end of the buffer
|
|
||||||
$delete
|
|
||||||
|
|
||||||
" Move the cursor to the beginning of the file
|
|
||||||
normal! gg
|
|
||||||
|
|
||||||
setlocal nomodifiable
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Complete {{{1
|
|
||||||
" Command-line completion function used by :MRU command
|
|
||||||
function! s:MRU_Complete(ArgLead, CmdLine, CursorPos)
|
|
||||||
if a:ArgLead == ''
|
|
||||||
" Return the complete list of MRU files
|
|
||||||
return s:MRU_files
|
|
||||||
else
|
|
||||||
" Return only the files matching the specified pattern
|
|
||||||
return filter(copy(s:MRU_files), 'v:val =~? a:ArgLead')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Cmd {{{1
|
|
||||||
" Function to handle the MRU command
|
|
||||||
" pat - File name pattern passed to the MRU command
|
|
||||||
function! s:MRU_Cmd(pat)
|
|
||||||
if a:pat == ''
|
|
||||||
" No arguments specified. Open the MRU window
|
|
||||||
call s:MRU_Open_Window()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Load the latest MRU file
|
|
||||||
call s:MRU_LoadList()
|
|
||||||
|
|
||||||
" Empty MRU list
|
|
||||||
if empty(s:MRU_files)
|
|
||||||
call s:MRU_Warn_Msg('MRU file list is empty')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" First use the specified string as a literal string and search for
|
|
||||||
" filenames containing the string. If only one filename is found,
|
|
||||||
" then edit it (unless the user wants to open the MRU window always)
|
|
||||||
let m = filter(copy(s:MRU_files), 'stridx(v:val, a:pat) != -1')
|
|
||||||
if len(m) > 0
|
|
||||||
if len(m) == 1 && !g:MRU_Window_Open_Always
|
|
||||||
call s:MRU_Edit_File(m[0], 0)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" More than one file matches. Try find an accurate match
|
|
||||||
let new_m = filter(m, 'v:val ==# a:pat')
|
|
||||||
if len(new_m) == 1 && !g:MRU_Window_Open_Always
|
|
||||||
call s:MRU_Edit_File(new_m[0], 0)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Couldn't find an exact match, open the MRU window with all the
|
|
||||||
" files matching the pattern.
|
|
||||||
call s:MRU_Open_Window(a:pat)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Use the specified string as a regular expression pattern and search
|
|
||||||
" for filenames matching the pattern
|
|
||||||
let m = filter(copy(s:MRU_files), 'v:val =~? a:pat')
|
|
||||||
|
|
||||||
if len(m) == 0
|
|
||||||
" If an existing file (not present in the MRU list) is specified,
|
|
||||||
" then open the file.
|
|
||||||
if filereadable(a:pat)
|
|
||||||
call s:MRU_Edit_File(a:pat, 0)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" No filenames matching the specified pattern are found
|
|
||||||
call s:MRU_Warn_Msg("MRU file list doesn't contain " .
|
|
||||||
\ "files matching " . a:pat)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if len(m) == 1 && !g:MRU_Window_Open_Always
|
|
||||||
call s:MRU_Edit_File(m[0], 0)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:MRU_Open_Window(a:pat)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_add_files_to_menu {{{1
|
|
||||||
" Adds a list of files to the "Recent Files" sub menu under the "File" menu.
|
|
||||||
" prefix - Prefix to use for each of the menu entries
|
|
||||||
" file_list - List of file names to add to the menu
|
|
||||||
function! s:MRU_add_files_to_menu(prefix, file_list)
|
|
||||||
for fname in a:file_list
|
|
||||||
" Escape special characters in the filename
|
|
||||||
let esc_fname = escape(fnamemodify(fname, ':t'), ".\\" .
|
|
||||||
\ s:esc_filename_chars)
|
|
||||||
let esc_fname = substitute(esc_fname, '&', '&&', 'g')
|
|
||||||
|
|
||||||
" Truncate the directory name if it is long
|
|
||||||
let dir_name = fnamemodify(fname, ':h')
|
|
||||||
let len = strlen(dir_name)
|
|
||||||
" Shorten long file names by adding only few characters from
|
|
||||||
" the beginning and end.
|
|
||||||
if len > 30
|
|
||||||
let dir_name = strpart(dir_name, 0, 10) .
|
|
||||||
\ '...' .
|
|
||||||
\ strpart(dir_name, len - 20)
|
|
||||||
endif
|
|
||||||
let esc_dir_name = escape(dir_name, ".\\" . s:esc_filename_chars)
|
|
||||||
let esc_dir_name = substitute(esc_dir_name, '&', '&&', 'g')
|
|
||||||
|
|
||||||
let menu_path = '&File.&Recent\ Files.' . a:prefix . esc_fname .
|
|
||||||
\ '\ (' . esc_dir_name . ')'
|
|
||||||
let esc_mfname = s:MRU_escape_filename(fname)
|
|
||||||
exe 'anoremenu <silent> ' . menu_path .
|
|
||||||
\ " :call <SID>MRU_Edit_File('" . esc_mfname . "', 1)<CR>"
|
|
||||||
exe 'tmenu ' . menu_path . ' Edit file ' . esc_mfname
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" MRU_Refresh_Menu {{{1
|
|
||||||
" Refresh the MRU menu
|
|
||||||
function! s:MRU_Refresh_Menu()
|
|
||||||
if !has('menu') || !g:MRU_Add_Menu
|
|
||||||
" No support for menus
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Setup the cpoptions properly for the maps to work
|
|
||||||
let old_cpoptions = &cpoptions
|
|
||||||
set cpoptions&vim
|
|
||||||
|
|
||||||
" Remove the MRU menu
|
|
||||||
" To retain the teared-off MRU menu, we need to add a dummy entry
|
|
||||||
silent! unmenu &File.&Recent\ Files
|
|
||||||
" The menu priority of the File menu is 10. If the MRU plugin runs
|
|
||||||
" first before menu.vim, the File menu order may not be correct.
|
|
||||||
" So specify the priority of the File menu here.
|
|
||||||
10noremenu &File.&Recent\ Files.Dummy <Nop>
|
|
||||||
silent! unmenu! &File.&Recent\ Files
|
|
||||||
|
|
||||||
anoremenu <silent> &File.&Recent\ Files.Refresh\ list
|
|
||||||
\ :call <SID>MRU_LoadList()<CR>
|
|
||||||
exe 'tmenu File.&Recent\ Files.Refresh\ list Reload the MRU file list from '
|
|
||||||
\ . s:MRU_escape_filename(g:MRU_File)
|
|
||||||
anoremenu File.&Recent\ Files.-SEP1- :
|
|
||||||
|
|
||||||
" Add the filenames in the MRU list to the menu
|
|
||||||
let entry_cnt = len(s:MRU_files)
|
|
||||||
if entry_cnt > g:MRU_Max_Menu_Entries
|
|
||||||
" Show only MRU_Max_Menu_Entries file names in the menu
|
|
||||||
let mru_list = s:MRU_files[1 : g:MRU_Max_Menu_Entries]
|
|
||||||
let entry_cnt = g:MRU_Max_Menu_Entries
|
|
||||||
else
|
|
||||||
let mru_list = s:MRU_files
|
|
||||||
endif
|
|
||||||
if entry_cnt > g:MRU_Max_Submenu_Entries
|
|
||||||
" Split the MRU menu into sub-menus
|
|
||||||
for start_idx in range(0, entry_cnt, g:MRU_Max_Submenu_Entries)
|
|
||||||
let last_idx = start_idx + g:MRU_Max_Submenu_Entries - 1
|
|
||||||
if last_idx >= entry_cnt
|
|
||||||
let last_idx = entry_cnt - 1
|
|
||||||
endif
|
|
||||||
let prefix = 'Files\ (' . (start_idx + 1) . '\.\.\.' .
|
|
||||||
\ (last_idx + 1) . ').'
|
|
||||||
call s:MRU_add_files_to_menu(prefix,
|
|
||||||
\ mru_list[start_idx : last_idx])
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
call s:MRU_add_files_to_menu('', mru_list)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Remove the dummy menu entry
|
|
||||||
unmenu &File.&Recent\ Files.Dummy
|
|
||||||
|
|
||||||
" Restore the previous cpoptions settings
|
|
||||||
let &cpoptions = old_cpoptions
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Setup syntax highlight
|
|
||||||
function! MRU_SetupSyntax()
|
|
||||||
if has("syntax")
|
|
||||||
syn match mruName /.\+\s/
|
|
||||||
syn match mruDir /(.\+)/
|
|
||||||
hi def link mruDir Folded
|
|
||||||
hi def link mruName String
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Load the MRU list on plugin startup
|
|
||||||
call s:MRU_LoadList()
|
|
||||||
|
|
||||||
" MRU autocommands {{{1
|
|
||||||
" Autocommands to detect the most recently used files
|
|
||||||
autocmd BufRead * call s:MRU_AddFile(expand('<abuf>'))
|
|
||||||
autocmd BufNewFile * call s:MRU_AddFile(expand('<abuf>'))
|
|
||||||
autocmd BufWritePost * call s:MRU_AddFile(expand('<abuf>'))
|
|
||||||
|
|
||||||
" The ':vimgrep' command adds all the files searched to the buffer list.
|
|
||||||
" This also modifies the MRU list, even though the user didn't edit the
|
|
||||||
" files. Use the following autocmds to prevent this.
|
|
||||||
autocmd QuickFixCmdPre *vimgrep* let s:mru_list_locked = 1
|
|
||||||
autocmd QuickFixCmdPost *vimgrep* let s:mru_list_locked = 0
|
|
||||||
|
|
||||||
" Command to open the MRU window
|
|
||||||
command! -nargs=? -complete=customlist,s:MRU_Complete MRU
|
|
||||||
\ call s:MRU_Cmd(<q-args>)
|
|
||||||
command! -nargs=? -complete=customlist,s:MRU_Complete Mru
|
|
||||||
\ call s:MRU_Cmd(<q-args>)
|
|
||||||
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" restore 'cpo'
|
|
||||||
let &cpo = s:cpo_save
|
|
||||||
unlet s:cpo_save
|
|
||||||
|
|
||||||
" vim:set foldenable foldmethod=marker:
|
|
||||||
|
|
@ -1,606 +0,0 @@
|
||||||
" Vim color file --- psc (peak sea color) "Lite version"
|
|
||||||
" Maintainer: Pan, Shi Zhu <Go to the following URL for my email>
|
|
||||||
" URL: http://vim.sourceforge.net/scripts/script.php?script_id=760
|
|
||||||
" Last Change: 5 Feb 2010
|
|
||||||
" Version: 3.4
|
|
||||||
"
|
|
||||||
" Comments and e-mails are welcomed, thanks.
|
|
||||||
"
|
|
||||||
" The peaksea color is simply a colorscheme with the default settings of
|
|
||||||
" the original ps_color. Lite version means there's no custom settings
|
|
||||||
" and fancy features such as integration with reloaded.vim
|
|
||||||
"
|
|
||||||
" The full version of ps_color.vim will be maintained until Vim 8.
|
|
||||||
" By then there will be only the lite version: peaksea.vim
|
|
||||||
"
|
|
||||||
" Note: Please set the background option in your .vimrc and/or .gvimrc
|
|
||||||
"
|
|
||||||
" It is much better *not* to set 'background' option inside
|
|
||||||
" a colorscheme file. because ":set background" improperly
|
|
||||||
" may cause colorscheme be sourced twice
|
|
||||||
"
|
|
||||||
" Color Scheme Overview:
|
|
||||||
" :ru syntax/hitest.vim
|
|
||||||
"
|
|
||||||
" Relevant Help:
|
|
||||||
" :h highlight-groups
|
|
||||||
" :h psc-cterm-color-table
|
|
||||||
"
|
|
||||||
" Colors Order:
|
|
||||||
" #rrggbb
|
|
||||||
"
|
|
||||||
|
|
||||||
hi clear
|
|
||||||
|
|
||||||
if exists("syntax_on")
|
|
||||||
syntax reset
|
|
||||||
endif
|
|
||||||
|
|
||||||
let g:colors_name = "peaksea"
|
|
||||||
|
|
||||||
" I don't want to abuse folding, but here folding is used to avoid confusion.
|
|
||||||
if &background=='light'
|
|
||||||
" for background=light {{{2
|
|
||||||
" LIGHT COLOR DEFINE START
|
|
||||||
|
|
||||||
hi Normal guifg=#000000 guibg=#e0e0e0 gui=NONE
|
|
||||||
hi Search guifg=White guibg=DarkRed gui=NONE
|
|
||||||
hi Visual guifg=NONE guibg=#a6caf0 gui=NONE
|
|
||||||
hi Cursor guifg=#f0f0f0 guibg=#008000 gui=NONE
|
|
||||||
" The idea of CursorIM is pretty good, however, the feature is still buggy
|
|
||||||
" in the current version (Vim 7.0).
|
|
||||||
" The following line will be kept commented until the bug fixed.
|
|
||||||
"
|
|
||||||
" hi CursorIM guifg=#f0f0f0 guibg=#800080
|
|
||||||
hi Special guifg=#907000 guibg=NONE gui=NONE
|
|
||||||
hi Comment guifg=#606000 guibg=NONE gui=NONE
|
|
||||||
hi Number guifg=#907000 guibg=NONE gui=NONE
|
|
||||||
hi Constant guifg=#007068 guibg=NONE gui=NONE
|
|
||||||
hi StatusLine guifg=fg guibg=#a6caf0 gui=NONE
|
|
||||||
hi LineNr guifg=#686868 guibg=NONE gui=NONE
|
|
||||||
hi Question guifg=fg guibg=#d0d090 gui=NONE
|
|
||||||
hi PreProc guifg=#009030 guibg=NONE gui=NONE
|
|
||||||
hi Statement guifg=#2060a8 guibg=NONE gui=NONE
|
|
||||||
hi Type guifg=#0850a0 guibg=NONE gui=NONE
|
|
||||||
hi Todo guifg=#800000 guibg=#e0e090 gui=NONE
|
|
||||||
" NOTE THIS IS IN THE WARM SECTION
|
|
||||||
hi Error guifg=#c03000 guibg=NONE gui=NONE
|
|
||||||
hi Identifier guifg=#a030a0 guibg=NONE gui=NONE
|
|
||||||
hi ModeMsg guifg=fg guibg=#b0b0e0 gui=NONE
|
|
||||||
hi VisualNOS guifg=fg guibg=#b0b0e0 gui=NONE
|
|
||||||
hi SpecialKey guifg=#1050a0 guibg=NONE gui=NONE
|
|
||||||
hi NonText guifg=#002090 guibg=#d0d0d0 gui=NONE
|
|
||||||
hi Directory guifg=#a030a0 guibg=NONE gui=NONE
|
|
||||||
hi ErrorMsg guifg=fg guibg=#f0b090 gui=NONE
|
|
||||||
hi MoreMsg guifg=#489000 guibg=NONE gui=NONE
|
|
||||||
hi Title guifg=#a030a0 guibg=NONE gui=NONE
|
|
||||||
hi WarningMsg guifg=#b02000 guibg=NONE gui=NONE
|
|
||||||
hi WildMenu guifg=fg guibg=#d0d090 gui=NONE
|
|
||||||
hi Folded guifg=NONE guibg=#b0e0b0 gui=NONE
|
|
||||||
hi FoldColumn guifg=fg guibg=#90e090 gui=NONE
|
|
||||||
hi DiffAdd guifg=NONE guibg=#b0b0e0 gui=NONE
|
|
||||||
hi DiffChange guifg=NONE guibg=#e0b0e0 gui=NONE
|
|
||||||
hi DiffDelete guifg=#002090 guibg=#d0d0d0 gui=NONE
|
|
||||||
hi DiffText guifg=NONE guibg=#c0e080 gui=NONE
|
|
||||||
hi SignColumn guifg=fg guibg=#90e090 gui=NONE
|
|
||||||
|
|
||||||
hi IncSearch guifg=White guibg=DarkRed gui=NONE
|
|
||||||
hi StatusLineNC guifg=fg guibg=#c0c0c0 gui=NONE
|
|
||||||
hi VertSplit guifg=fg guibg=#c0c0c0 gui=NONE
|
|
||||||
hi Underlined guifg=#6a5acd guibg=NONE gui=underline
|
|
||||||
hi Ignore guifg=bg guibg=NONE
|
|
||||||
" NOTE THIS IS IN THE WARM SECTION
|
|
||||||
if v:version >= 700
|
|
||||||
if has('spell')
|
|
||||||
hi SpellBad guifg=NONE guibg=NONE guisp=#c03000
|
|
||||||
hi SpellCap guifg=NONE guibg=NONE guisp=#2060a8
|
|
||||||
hi SpellRare guifg=NONE guibg=NONE guisp=#a030a0
|
|
||||||
hi SpellLocal guifg=NONE guibg=NONE guisp=#007068
|
|
||||||
endif
|
|
||||||
hi Pmenu guifg=fg guibg=#e0b0e0
|
|
||||||
hi PmenuSel guifg=#f0f0f0 guibg=#806060 gui=NONE
|
|
||||||
hi PmenuSbar guifg=fg guibg=#c0c0c0 gui=NONE
|
|
||||||
hi PmenuThumb guifg=fg guibg=#c0e080 gui=NONE
|
|
||||||
hi TabLine guifg=fg guibg=#c0c0c0 gui=NONE
|
|
||||||
hi TabLineFill guifg=fg guibg=#c0c0c0 gui=NONE
|
|
||||||
hi TabLineSel guifg=fg guibg=NONE gui=NONE
|
|
||||||
hi CursorColumn guifg=NONE guibg=#f0b090
|
|
||||||
hi CursorLine guifg=NONE guibg=NONE gui=underline
|
|
||||||
hi MatchParen guifg=NONE guibg=#c0e080
|
|
||||||
endif
|
|
||||||
|
|
||||||
" LIGHT COLOR DEFINE END
|
|
||||||
|
|
||||||
" Vim 7 added stuffs
|
|
||||||
if v:version >= 700
|
|
||||||
hi Ignore gui=NONE
|
|
||||||
|
|
||||||
" the gui=undercurl guisp could only support in Vim 7
|
|
||||||
if has('spell')
|
|
||||||
hi SpellBad gui=undercurl
|
|
||||||
hi SpellCap gui=undercurl
|
|
||||||
hi SpellRare gui=undercurl
|
|
||||||
hi SpellLocal gui=undercurl
|
|
||||||
endif
|
|
||||||
hi TabLine gui=underline
|
|
||||||
hi TabLineFill gui=underline
|
|
||||||
hi CursorLine gui=underline
|
|
||||||
endif
|
|
||||||
|
|
||||||
" For reversed stuffs, clear the reversed prop and set the bold prop again
|
|
||||||
hi IncSearch gui=bold
|
|
||||||
hi StatusLine gui=bold
|
|
||||||
hi StatusLineNC gui=bold
|
|
||||||
hi VertSplit gui=bold
|
|
||||||
hi Visual gui=bold
|
|
||||||
|
|
||||||
" Enable the bold property
|
|
||||||
hi Question gui=bold
|
|
||||||
hi DiffText gui=bold
|
|
||||||
hi Statement gui=bold
|
|
||||||
hi Type gui=bold
|
|
||||||
hi MoreMsg gui=bold
|
|
||||||
hi ModeMsg gui=bold
|
|
||||||
hi NonText gui=bold
|
|
||||||
hi Title gui=bold
|
|
||||||
hi DiffDelete gui=bold
|
|
||||||
hi TabLineSel gui=bold
|
|
||||||
|
|
||||||
" gui define for background=light end here
|
|
||||||
|
|
||||||
" generally, a dumb terminal is dark, we assume the light terminal has 256
|
|
||||||
" color support.
|
|
||||||
if &t_Co==8 || &t_Co==16
|
|
||||||
set t_Co=256
|
|
||||||
endif
|
|
||||||
if &t_Co==256
|
|
||||||
" 256color light terminal support here
|
|
||||||
|
|
||||||
hi Normal ctermfg=16 ctermbg=254 cterm=NONE
|
|
||||||
" Comment/Uncomment the following line to disable/enable transparency
|
|
||||||
"hi Normal ctermfg=16 ctermbg=NONE cterm=NONE
|
|
||||||
hi Search ctermfg=White ctermbg=DarkRed cterm=NONE
|
|
||||||
hi Visual ctermfg=NONE ctermbg=153 cterm=NONE
|
|
||||||
hi Cursor ctermfg=255 ctermbg=28 cterm=NONE
|
|
||||||
" hi CursorIM ctermfg=255 ctermbg=90
|
|
||||||
hi Special ctermfg=94 ctermbg=NONE cterm=NONE
|
|
||||||
hi Comment ctermfg=58 ctermbg=NONE cterm=NONE
|
|
||||||
hi Number ctermfg=94 ctermbg=NONE cterm=NONE
|
|
||||||
hi Constant ctermfg=23 ctermbg=NONE cterm=NONE
|
|
||||||
hi StatusLine ctermfg=fg ctermbg=153 cterm=NONE
|
|
||||||
hi LineNr ctermfg=242 ctermbg=NONE cterm=NONE
|
|
||||||
hi Question ctermfg=fg ctermbg=186 cterm=NONE
|
|
||||||
hi PreProc ctermfg=29 ctermbg=NONE cterm=NONE
|
|
||||||
hi Statement ctermfg=25 ctermbg=NONE cterm=NONE
|
|
||||||
hi Type ctermfg=25 ctermbg=NONE cterm=NONE
|
|
||||||
hi Todo ctermfg=88 ctermbg=186 cterm=NONE
|
|
||||||
" NOTE THIS IS IN THE WARM SECTION
|
|
||||||
hi Error ctermfg=130 ctermbg=NONE cterm=NONE
|
|
||||||
hi Identifier ctermfg=133 ctermbg=NONE cterm=NONE
|
|
||||||
hi ModeMsg ctermfg=fg ctermbg=146 cterm=NONE
|
|
||||||
hi VisualNOS ctermfg=fg ctermbg=146 cterm=NONE
|
|
||||||
hi SpecialKey ctermfg=25 ctermbg=NONE cterm=NONE
|
|
||||||
hi NonText ctermfg=18 ctermbg=252 cterm=NONE
|
|
||||||
" Comment/Uncomment the following line to disable/enable transparency
|
|
||||||
"hi NonText ctermfg=18 ctermbg=NONE cterm=NONE
|
|
||||||
hi Directory ctermfg=133 ctermbg=NONE cterm=NONE
|
|
||||||
hi ErrorMsg ctermfg=fg ctermbg=216 cterm=NONE
|
|
||||||
hi MoreMsg ctermfg=64 ctermbg=NONE cterm=NONE
|
|
||||||
hi Title ctermfg=133 ctermbg=NONE cterm=NONE
|
|
||||||
hi WarningMsg ctermfg=124 ctermbg=NONE cterm=NONE
|
|
||||||
hi WildMenu ctermfg=fg ctermbg=186 cterm=NONE
|
|
||||||
hi Folded ctermfg=NONE ctermbg=151 cterm=NONE
|
|
||||||
hi FoldColumn ctermfg=fg ctermbg=114 cterm=NONE
|
|
||||||
hi DiffAdd ctermfg=NONE ctermbg=146 cterm=NONE
|
|
||||||
hi DiffChange ctermfg=NONE ctermbg=182 cterm=NONE
|
|
||||||
hi DiffDelete ctermfg=18 ctermbg=252 cterm=NONE
|
|
||||||
hi DiffText ctermfg=NONE ctermbg=150 cterm=NONE
|
|
||||||
hi SignColumn ctermfg=fg ctermbg=114 cterm=NONE
|
|
||||||
|
|
||||||
hi IncSearch ctermfg=White ctermbg=DarkRed cterm=NONE
|
|
||||||
hi StatusLineNC ctermfg=fg ctermbg=250 cterm=NONE
|
|
||||||
hi VertSplit ctermfg=fg ctermbg=250 cterm=NONE
|
|
||||||
hi Underlined ctermfg=62 ctermbg=NONE cterm=underline
|
|
||||||
hi Ignore ctermfg=bg ctermbg=NONE
|
|
||||||
" NOTE THIS IS IN THE WARM SECTION
|
|
||||||
if v:version >= 700
|
|
||||||
if has('spell')
|
|
||||||
if 0
|
|
||||||
" ctermsp is not supported in Vim7, we ignore it.
|
|
||||||
hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=130
|
|
||||||
hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=25
|
|
||||||
hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=133
|
|
||||||
hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=23
|
|
||||||
else
|
|
||||||
hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
hi Pmenu ctermfg=fg ctermbg=182
|
|
||||||
hi PmenuSel ctermfg=255 ctermbg=95 cterm=NONE
|
|
||||||
hi PmenuSbar ctermfg=fg ctermbg=250 cterm=NONE
|
|
||||||
hi PmenuThumb ctermfg=fg ctermbg=150 cterm=NONE
|
|
||||||
hi TabLine ctermfg=fg ctermbg=250 cterm=NONE
|
|
||||||
hi TabLineFill ctermfg=fg ctermbg=250 cterm=NONE
|
|
||||||
hi TabLineSel ctermfg=fg ctermbg=NONE cterm=NONE
|
|
||||||
hi CursorColumn ctermfg=NONE ctermbg=216
|
|
||||||
hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
|
|
||||||
hi MatchParen ctermfg=NONE ctermbg=150
|
|
||||||
endif
|
|
||||||
|
|
||||||
hi TabLine cterm=underline
|
|
||||||
hi TabLineFill cterm=underline
|
|
||||||
hi CursorLine cterm=underline
|
|
||||||
|
|
||||||
" For reversed stuffs, clear the reversed prop and set the bold prop again
|
|
||||||
hi IncSearch cterm=bold
|
|
||||||
hi StatusLine cterm=bold
|
|
||||||
hi StatusLineNC cterm=bold
|
|
||||||
hi VertSplit cterm=bold
|
|
||||||
hi Visual cterm=bold
|
|
||||||
|
|
||||||
hi NonText cterm=bold
|
|
||||||
hi Question cterm=bold
|
|
||||||
hi Title cterm=bold
|
|
||||||
hi DiffDelete cterm=bold
|
|
||||||
hi DiffText cterm=bold
|
|
||||||
hi Statement cterm=bold
|
|
||||||
hi Type cterm=bold
|
|
||||||
hi MoreMsg cterm=bold
|
|
||||||
hi ModeMsg cterm=bold
|
|
||||||
hi TabLineSel cterm=bold
|
|
||||||
|
|
||||||
"hi lCursor ctermfg=bg ctermbg=fg cterm=NONE
|
|
||||||
endif " t_Co==256
|
|
||||||
" }}}2
|
|
||||||
elseif &background=='dark'
|
|
||||||
" for background=dark {{{2
|
|
||||||
" DARK COLOR DEFINE START
|
|
||||||
|
|
||||||
hi Normal guifg=#d0d0d0 guibg=#202020 gui=NONE
|
|
||||||
hi Comment guifg=#d0d090 guibg=NONE gui=NONE
|
|
||||||
hi Constant guifg=#80c0e0 guibg=NONE gui=NONE
|
|
||||||
hi Number guifg=#e0c060 guibg=NONE gui=NONE
|
|
||||||
hi Identifier guifg=#f0c0f0 guibg=NONE gui=NONE
|
|
||||||
hi Statement guifg=#c0d8f8 guibg=NONE gui=NONE
|
|
||||||
hi PreProc guifg=#60f080 guibg=NONE gui=NONE
|
|
||||||
hi Type guifg=#b0d0f0 guibg=NONE gui=NONE
|
|
||||||
hi Special guifg=#e0c060 guibg=NONE gui=NONE
|
|
||||||
hi Error guifg=#f08060 guibg=NONE gui=NONE
|
|
||||||
hi Todo guifg=#800000 guibg=#d0d090 gui=NONE
|
|
||||||
hi Search guifg=White guibg=DarkRed gui=NONE
|
|
||||||
hi Visual guifg=#000000 guibg=#a6caf0 gui=NONE
|
|
||||||
hi Cursor guifg=#000000 guibg=#00f000 gui=NONE
|
|
||||||
" NOTE THIS IS IN THE COOL SECTION
|
|
||||||
" hi CursorIM guifg=#000000 guibg=#f000f0 gui=NONE
|
|
||||||
hi StatusLine guifg=#000000 guibg=#a6caf0 gui=NONE
|
|
||||||
hi LineNr guifg=#b0b0b0 guibg=NONE gui=NONE
|
|
||||||
hi Question guifg=#000000 guibg=#d0d090 gui=NONE
|
|
||||||
hi ModeMsg guifg=fg guibg=#000080 gui=NONE
|
|
||||||
hi VisualNOS guifg=fg guibg=#000080 gui=NONE
|
|
||||||
hi SpecialKey guifg=#b0d0f0 guibg=NONE gui=NONE
|
|
||||||
hi NonText guifg=#202020 guibg=#202020 gui=NONE
|
|
||||||
hi Directory guifg=#80c0e0 guibg=NONE gui=NONE
|
|
||||||
hi ErrorMsg guifg=#d0d090 guibg=#800000 gui=NONE
|
|
||||||
hi MoreMsg guifg=#c0e080 guibg=NONE gui=NONE
|
|
||||||
hi Title guifg=#f0c0f0 guibg=NONE gui=NONE
|
|
||||||
hi WarningMsg guifg=#f08060 guibg=NONE gui=NONE
|
|
||||||
hi WildMenu guifg=#000000 guibg=#d0d090 gui=NONE
|
|
||||||
hi Folded guifg=#aaaaaa guibg=#333333 gui=NONE
|
|
||||||
hi FoldColumn guifg=#202020 guibg=#202020 gui=NONE
|
|
||||||
hi DiffAdd guifg=NONE guibg=#000080 gui=NONE
|
|
||||||
hi DiffChange guifg=NONE guibg=#800080 gui=NONE
|
|
||||||
hi DiffDelete guifg=#6080f0 guibg=#202020 gui=NONE
|
|
||||||
hi DiffText guifg=#000000 guibg=#c0e080 gui=NONE
|
|
||||||
hi SignColumn guifg=#e0e0e0 guibg=#202020 gui=NONE
|
|
||||||
hi IncSearch guifg=White guibg=DarkRed gui=NONE
|
|
||||||
hi StatusLineNC guifg=#000000 guibg=#c0c0c0 gui=NONE
|
|
||||||
hi VertSplit guifg=#000000 guibg=#c0c0c0 gui=NONE
|
|
||||||
hi Underlined guifg=#80a0ff guibg=NONE gui=underline
|
|
||||||
hi Ignore guifg=#000000 guibg=NONE
|
|
||||||
" NOTE THIS IS IN THE COOL SECTION
|
|
||||||
if v:version >= 700
|
|
||||||
if has('spell')
|
|
||||||
" the guisp= could only support in Vim 7
|
|
||||||
hi SpellBad guifg=NONE guibg=NONE guisp=#f08060
|
|
||||||
hi SpellCap guifg=NONE guibg=NONE guisp=#6080f0
|
|
||||||
hi SpellRare guifg=NONE guibg=NONE guisp=#f0c0f0
|
|
||||||
hi SpellLocal guifg=NONE guibg=NONE guisp=#c0d8f8
|
|
||||||
endif
|
|
||||||
|
|
||||||
hi Pmenu guifg=#dddddd guibg=#444444 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi PmenuSel guifg=#000000 guibg=#ffffff gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi TabLine guifg=fg guibg=#008000 gui=NONE
|
|
||||||
hi TabLineFill guifg=fg guibg=#008000 gui=NONE
|
|
||||||
hi TabLineSel guifg=fg guibg=NONE gui=NONE
|
|
||||||
hi CursorColumn guifg=NONE guibg=#800000 gui=NONE
|
|
||||||
hi CursorLine guifg=NONE guibg=NONE gui=underline
|
|
||||||
hi MatchParen guifg=NONE guibg=#800080
|
|
||||||
endif
|
|
||||||
|
|
||||||
" DARK COLOR DEFINE END
|
|
||||||
|
|
||||||
" Vim 7 added stuffs
|
|
||||||
if v:version >= 700
|
|
||||||
hi Ignore gui=NONE
|
|
||||||
|
|
||||||
" the gui=undercurl could only support in Vim 7
|
|
||||||
if has('spell')
|
|
||||||
hi SpellBad gui=undercurl
|
|
||||||
hi SpellCap gui=undercurl
|
|
||||||
hi SpellRare gui=undercurl
|
|
||||||
hi SpellLocal gui=undercurl
|
|
||||||
endif
|
|
||||||
hi TabLine gui=underline
|
|
||||||
hi TabLineFill gui=underline
|
|
||||||
hi Underlined gui=underline
|
|
||||||
hi CursorLine gui=underline
|
|
||||||
endif
|
|
||||||
|
|
||||||
" gui define for background=dark end here
|
|
||||||
|
|
||||||
if &t_Co==8 || &t_Co==16
|
|
||||||
" for 8-color and 16-color term
|
|
||||||
hi Normal ctermfg=LightGrey ctermbg=Black
|
|
||||||
hi Special ctermfg=Yellow ctermbg=bg
|
|
||||||
hi Comment ctermfg=DarkYellow ctermbg=bg
|
|
||||||
hi Constant ctermfg=Blue ctermbg=bg
|
|
||||||
hi Number ctermfg=Yellow ctermbg=bg
|
|
||||||
hi LineNr ctermfg=DarkGrey ctermbg=bg
|
|
||||||
hi PreProc ctermfg=Green ctermbg=bg
|
|
||||||
hi Statement ctermfg=Cyan ctermbg=bg
|
|
||||||
hi Type ctermfg=Cyan ctermbg=bg
|
|
||||||
hi Error ctermfg=Red ctermbg=bg
|
|
||||||
hi Identifier ctermfg=Magenta ctermbg=bg
|
|
||||||
hi SpecialKey ctermfg=Cyan ctermbg=bg
|
|
||||||
hi NonText ctermfg=Blue ctermbg=bg
|
|
||||||
hi Directory ctermfg=Blue ctermbg=bg
|
|
||||||
hi MoreMsg ctermfg=Green ctermbg=bg
|
|
||||||
hi Title ctermfg=Magenta ctermbg=bg
|
|
||||||
hi WarningMsg ctermfg=Red ctermbg=bg
|
|
||||||
hi DiffDelete ctermfg=Blue ctermbg=bg
|
|
||||||
|
|
||||||
hi Search ctermfg=NONE ctermbg=DarkRed
|
|
||||||
hi Visual ctermfg=Black ctermbg=DarkCyan
|
|
||||||
hi Cursor ctermfg=Black ctermbg=Green
|
|
||||||
hi StatusLine ctermfg=Black ctermbg=DarkCyan
|
|
||||||
hi Question ctermfg=Black ctermbg=DarkYellow
|
|
||||||
hi Todo ctermfg=DarkRed ctermbg=DarkYellow
|
|
||||||
hi Folded ctermfg=DarkGrey ctermbg=DarkGrey
|
|
||||||
hi FoldColumn ctermfg=DarkGrey ctermbg=DarkGrey
|
|
||||||
hi ModeMsg ctermfg=Grey ctermbg=DarkBlue
|
|
||||||
hi VisualNOS ctermfg=Grey ctermbg=DarkBlue
|
|
||||||
hi ErrorMsg ctermfg=DarkYellow ctermbg=DarkRed
|
|
||||||
hi WildMenu ctermfg=Black ctermbg=DarkYellow
|
|
||||||
hi SignColumn ctermfg=White ctermbg=DarkGreen
|
|
||||||
hi DiffText ctermfg=Black ctermbg=DarkYellow
|
|
||||||
|
|
||||||
if v:version >= 700
|
|
||||||
if has('spell')
|
|
||||||
hi SpellBad ctermfg=NONE ctermbg=DarkRed
|
|
||||||
hi SpellCap ctermfg=NONE ctermbg=DarkBlue
|
|
||||||
hi SpellRare ctermfg=NONE ctermbg=DarkMagenta
|
|
||||||
hi SpellLocal ctermfg=NONE ctermbg=DarkGreen
|
|
||||||
endif
|
|
||||||
|
|
||||||
hi Pmenu ctermfg=White ctermbg=DarkGrey
|
|
||||||
hi PmenuSel ctermfg=Black ctermbg=White
|
|
||||||
|
|
||||||
hi TabLine ctermfg=fg ctermbg=Black cterm=underline
|
|
||||||
hi TabLineFill ctermfg=fg ctermbg=Black cterm=underline
|
|
||||||
hi CursorColumn ctermfg=NONE ctermbg=DarkRed
|
|
||||||
|
|
||||||
hi TabLineSel ctermfg=fg ctermbg=bg
|
|
||||||
hi CursorLine ctermfg=NONE ctermbg=bg cterm=underline
|
|
||||||
|
|
||||||
hi MatchParen ctermfg=NONE ctermbg=DarkMagenta
|
|
||||||
endif
|
|
||||||
if &t_Co==8
|
|
||||||
" 8 colour terminal support, this assumes 16 colour is available through
|
|
||||||
" setting the 'bold' attribute, will get bright foreground colour.
|
|
||||||
" However, the bright background color is not available for 8-color terms.
|
|
||||||
"
|
|
||||||
" You can manually set t_Co=16 in your .vimrc to see if your terminal
|
|
||||||
" supports 16 colours,
|
|
||||||
hi DiffText cterm=none
|
|
||||||
hi Visual cterm=none
|
|
||||||
hi Cursor cterm=none
|
|
||||||
hi Comment cterm=none
|
|
||||||
hi Todo cterm=none
|
|
||||||
hi StatusLine cterm=none
|
|
||||||
hi Question cterm=none
|
|
||||||
hi DiffChange cterm=none
|
|
||||||
hi ModeMsg cterm=none
|
|
||||||
hi VisualNOS cterm=none
|
|
||||||
hi ErrorMsg cterm=none
|
|
||||||
hi WildMenu cterm=none
|
|
||||||
hi DiffAdd cterm=none
|
|
||||||
hi Folded cterm=none
|
|
||||||
hi DiffDelete cterm=none
|
|
||||||
hi Normal cterm=none
|
|
||||||
hi PmenuThumb cterm=none
|
|
||||||
hi Search cterm=bold
|
|
||||||
hi Special cterm=bold
|
|
||||||
hi Constant cterm=bold
|
|
||||||
hi Number cterm=bold
|
|
||||||
hi LineNr cterm=bold
|
|
||||||
hi PreProc cterm=bold
|
|
||||||
hi Statement cterm=bold
|
|
||||||
hi Type cterm=bold
|
|
||||||
hi Error cterm=bold
|
|
||||||
hi Identifier cterm=bold
|
|
||||||
hi SpecialKey cterm=bold
|
|
||||||
hi NonText cterm=bold
|
|
||||||
hi MoreMsg cterm=bold
|
|
||||||
hi Title cterm=bold
|
|
||||||
hi WarningMsg cterm=bold
|
|
||||||
hi FoldColumn cterm=bold
|
|
||||||
hi SignColumn cterm=bold
|
|
||||||
hi Directory cterm=bold
|
|
||||||
hi DiffDelete cterm=bold
|
|
||||||
else
|
|
||||||
" Background > 7 is only available with 16 or more colors
|
|
||||||
|
|
||||||
hi WarningMsg cterm=none
|
|
||||||
hi Search cterm=none
|
|
||||||
hi Visual cterm=none
|
|
||||||
hi Cursor cterm=none
|
|
||||||
hi Special cterm=none
|
|
||||||
hi Comment cterm=none
|
|
||||||
hi Constant cterm=none
|
|
||||||
hi Number cterm=none
|
|
||||||
hi LineNr cterm=none
|
|
||||||
hi PreProc cterm=none
|
|
||||||
hi Todo cterm=none
|
|
||||||
hi Error cterm=none
|
|
||||||
hi Identifier cterm=none
|
|
||||||
hi Folded cterm=none
|
|
||||||
hi SpecialKey cterm=none
|
|
||||||
hi Directory cterm=none
|
|
||||||
hi ErrorMsg cterm=none
|
|
||||||
hi Normal cterm=none
|
|
||||||
hi PmenuThumb cterm=none
|
|
||||||
hi WildMenu cterm=none
|
|
||||||
hi FoldColumn cterm=none
|
|
||||||
hi SignColumn cterm=none
|
|
||||||
hi DiffAdd cterm=none
|
|
||||||
hi DiffChange cterm=none
|
|
||||||
hi Question cterm=none
|
|
||||||
hi StatusLine cterm=none
|
|
||||||
hi DiffText cterm=none
|
|
||||||
hi IncSearch cterm=reverse
|
|
||||||
hi StatusLineNC cterm=reverse
|
|
||||||
hi VertSplit cterm=reverse
|
|
||||||
|
|
||||||
" Well, well, bold font with color 0-7 is not possible.
|
|
||||||
" So, the Question, StatusLine, DiffText cannot act as expected.
|
|
||||||
|
|
||||||
hi Statement cterm=none
|
|
||||||
hi Type cterm=none
|
|
||||||
hi MoreMsg cterm=none
|
|
||||||
hi ModeMsg cterm=none
|
|
||||||
hi NonText cterm=none
|
|
||||||
hi Title cterm=none
|
|
||||||
hi VisualNOS cterm=none
|
|
||||||
hi DiffDelete cterm=none
|
|
||||||
hi TabLineSel cterm=none
|
|
||||||
|
|
||||||
endif
|
|
||||||
elseif &t_Co==256
|
|
||||||
" 256color dark terminal support here
|
|
||||||
hi Normal ctermfg=252 ctermbg=234 cterm=NONE
|
|
||||||
" Comment/Uncomment the following line to disable/enable transparency
|
|
||||||
"hi Normal ctermfg=252 ctermbg=NONE cterm=NONE
|
|
||||||
hi Comment ctermfg=186 ctermbg=NONE cterm=NONE
|
|
||||||
hi Constant ctermfg=110 ctermbg=NONE cterm=NONE
|
|
||||||
hi Number ctermfg=179 ctermbg=NONE cterm=NONE
|
|
||||||
hi Identifier ctermfg=219 ctermbg=NONE cterm=NONE
|
|
||||||
hi Statement ctermfg=153 ctermbg=NONE cterm=NONE
|
|
||||||
hi PreProc ctermfg=84 ctermbg=NONE cterm=NONE
|
|
||||||
hi Type ctermfg=153 ctermbg=NONE cterm=NONE
|
|
||||||
hi Special ctermfg=179 ctermbg=NONE cterm=NONE
|
|
||||||
hi Error ctermfg=209 ctermbg=NONE cterm=NONE
|
|
||||||
hi Todo ctermfg=88 ctermbg=186 cterm=NONE
|
|
||||||
hi Search ctermfg=White ctermbg=DarkRed cterm=NONE
|
|
||||||
hi Visual ctermfg=16 ctermbg=153 cterm=NONE
|
|
||||||
hi Cursor ctermfg=16 ctermbg=46 cterm=NONE
|
|
||||||
" NOTE THIS IS IN THE COOL SECTION
|
|
||||||
" hi CursorIM ctermfg=16 ctermbg=201 cterm=NONE
|
|
||||||
hi StatusLine ctermfg=16 ctermbg=153 cterm=NONE
|
|
||||||
hi LineNr ctermfg=249 ctermbg=NONE cterm=NONE
|
|
||||||
hi Question ctermfg=16 ctermbg=186 cterm=NONE
|
|
||||||
hi ModeMsg ctermfg=fg ctermbg=18 cterm=NONE
|
|
||||||
hi VisualNOS ctermfg=fg ctermbg=18 cterm=NONE
|
|
||||||
hi SpecialKey ctermfg=153 ctermbg=NONE cterm=NONE
|
|
||||||
hi NonText ctermfg=69 ctermbg=233 cterm=NONE
|
|
||||||
" Comment/Uncomment the following line to disable/enable transparency
|
|
||||||
"hi NonText ctermfg=69 ctermbg=NONE cterm=NONE
|
|
||||||
hi Directory ctermfg=110 ctermbg=NONE cterm=NONE
|
|
||||||
hi ErrorMsg ctermfg=186 ctermbg=88 cterm=NONE
|
|
||||||
hi MoreMsg ctermfg=150 ctermbg=NONE cterm=NONE
|
|
||||||
hi Title ctermfg=219 ctermbg=NONE cterm=NONE
|
|
||||||
hi WarningMsg ctermfg=209 ctermbg=NONE cterm=NONE
|
|
||||||
hi WildMenu ctermfg=16 ctermbg=186 cterm=NONE
|
|
||||||
hi Folded ctermfg=NONE ctermbg=DarkGrey cterm=NONE
|
|
||||||
hi FoldColumn ctermfg=DarkGrey ctermbg=DarkGrey cterm=NONE
|
|
||||||
hi DiffAdd ctermfg=NONE ctermbg=18 cterm=NONE
|
|
||||||
hi DiffChange ctermfg=NONE ctermbg=90 cterm=NONE
|
|
||||||
hi DiffDelete ctermfg=69 ctermbg=234 cterm=NONE
|
|
||||||
hi DiffText ctermfg=16 ctermbg=150 cterm=NONE
|
|
||||||
hi SignColumn ctermfg=254 ctermbg=28 cterm=NONE
|
|
||||||
hi IncSearch ctermfg=White ctermbg=DarkRed cterm=NONE
|
|
||||||
hi StatusLineNC ctermfg=16 ctermbg=250 cterm=NONE
|
|
||||||
hi VertSplit ctermfg=16 ctermbg=250 cterm=NONE
|
|
||||||
hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
|
|
||||||
hi Ignore ctermfg=16 ctermbg=NONE
|
|
||||||
" NOTE THIS IS IN THE COOL SECTION
|
|
||||||
if v:version >= 700
|
|
||||||
if has('spell')
|
|
||||||
" the ctermsp= is not supported in Vim 7 we simply ignored
|
|
||||||
if 0
|
|
||||||
hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=209
|
|
||||||
hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=69
|
|
||||||
hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=219
|
|
||||||
hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=153
|
|
||||||
else
|
|
||||||
hi SpellBad cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellCap cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellRare cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
hi SpellLocal cterm=undercurl ctermbg=NONE ctermfg=NONE
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
hi Pmenu ctermfg=White ctermbg=DarkGrey
|
|
||||||
hi PmenuSel ctermfg=Black ctermbg=White cterm=NONE
|
|
||||||
|
|
||||||
hi TabLine ctermfg=fg ctermbg=Black cterm=NONE
|
|
||||||
hi TabLineFill ctermfg=fg ctermbg=Black cterm=NONE
|
|
||||||
hi TabLineSel ctermfg=fg ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi CursorColumn ctermfg=NONE ctermbg=88 cterm=NONE
|
|
||||||
hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
|
|
||||||
hi MatchParen ctermfg=NONE ctermbg=90
|
|
||||||
hi TabLine cterm=underline
|
|
||||||
hi TabLineFill cterm=underline
|
|
||||||
hi Underlined cterm=underline
|
|
||||||
hi CursorLine cterm=underline
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif " t_Co
|
|
||||||
|
|
||||||
" }}}2
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Links:
|
|
||||||
"
|
|
||||||
" COLOR LINKS DEFINE START
|
|
||||||
|
|
||||||
hi link String Constant
|
|
||||||
" Character must be different from strings because in many languages
|
|
||||||
" (especially C, C++) a 'char' variable is scalar while 'string' is pointer,
|
|
||||||
" mistaken a 'char' for a 'string' will cause disaster!
|
|
||||||
hi link Character Number
|
|
||||||
hi link SpecialChar LineNr
|
|
||||||
hi link Tag Identifier
|
|
||||||
hi link cCppOut LineNr
|
|
||||||
" The following are not standard hi links,
|
|
||||||
" these are used by DrChip
|
|
||||||
hi link Warning MoreMsg
|
|
||||||
hi link Notice Constant
|
|
||||||
" these are used by Calendar
|
|
||||||
hi link CalToday PreProc
|
|
||||||
" these are used by TagList
|
|
||||||
hi link MyTagListTagName IncSearch
|
|
||||||
hi link MyTagListTagScope Constant
|
|
||||||
|
|
||||||
hi TabLineFill guifg=#9098a0 guibg=#111111
|
|
||||||
hi TabLine guifg=black guibg=#888888
|
|
||||||
hi TabLineSel guifg=white guibg=#202020 gui=bold
|
|
||||||
|
|
||||||
" COLOR LINKS DEFINE END
|
|
||||||
|
|
||||||
" vim:et:nosta:sw=2:ts=8:
|
|
||||||
" vim600:fdm=marker:fdl=1:
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
function! CustomizedTabLine()
|
|
||||||
let s = ''
|
|
||||||
let t = tabpagenr()
|
|
||||||
let i = 1
|
|
||||||
while i <= tabpagenr('$')
|
|
||||||
let buflist = tabpagebuflist(i)
|
|
||||||
let winnr = tabpagewinnr(i)
|
|
||||||
let s .= '%' . i . 'T'
|
|
||||||
let s .= (i == t ? '%1*' : '%2*')
|
|
||||||
let s .= ' '
|
|
||||||
let s .= i . ':'
|
|
||||||
let s .= '%*'
|
|
||||||
let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#')
|
|
||||||
let file = bufname(buflist[winnr - 1])
|
|
||||||
let file = fnamemodify(file, ':p:t')
|
|
||||||
if file == ''
|
|
||||||
let file = '[No Name]'
|
|
||||||
endif
|
|
||||||
let s .= file
|
|
||||||
let s .= ' '
|
|
||||||
let i = i + 1
|
|
||||||
endwhile
|
|
||||||
let s .= '%T%#TabLineFill#%='
|
|
||||||
let s .= (tabpagenr('$') > 1 ? '%999XX' : 'X')
|
|
||||||
return s
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Always show the tablilne
|
|
||||||
set stal=2
|
|
||||||
set tabline=%!CustomizedTabLine()
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
This is a version of Infinite Red's vim theme (http://blog.infinitered.com/entries/show/8) packaged to work with Tim Pope's pathogen plugin (http://www.vim.org/scripts/script.php?script_id=2332).
|
|
||||||
|
|
||||||
To use it (assuming you're using pathogen):
|
|
||||||
|
|
||||||
- go to your bundle directory (.vim/bundle or .vimbundles) and clone the repo:
|
|
||||||
|
|
||||||
git clone git@github.com:wgibbs/vim-irblack.git
|
|
||||||
|
|
||||||
- edit your .vimrc and add:
|
|
||||||
|
|
||||||
:colorscheme ir_black
|
|
||||||
|
|
@ -1,220 +0,0 @@
|
||||||
" ir_black color scheme
|
|
||||||
" More at: http://blog.infinitered.com/entries/show/8
|
|
||||||
|
|
||||||
|
|
||||||
" ********************************************************************************
|
|
||||||
" Standard colors used in all ir_black themes:
|
|
||||||
" Note, x:x:x are RGB values
|
|
||||||
"
|
|
||||||
" normal: #f6f3e8
|
|
||||||
"
|
|
||||||
" string: #A8FF60 168:255:96
|
|
||||||
" string inner (punc, code, etc): #00A0A0 0:160:160
|
|
||||||
" number: #FF73FD 255:115:253
|
|
||||||
" comments: #7C7C7C 124:124:124
|
|
||||||
" keywords: #96CBFE 150:203:254
|
|
||||||
" operators: white
|
|
||||||
" class: #FFFFB6 255:255:182
|
|
||||||
" method declaration name: #FFD2A7 255:210:167
|
|
||||||
" regular expression: #E9C062 233:192:98
|
|
||||||
" regexp alternate: #FF8000 255:128:0
|
|
||||||
" regexp alternate 2: #B18A3D 177:138:61
|
|
||||||
" variable: #C6C5FE 198:197:254
|
|
||||||
"
|
|
||||||
" Misc colors:
|
|
||||||
" red color (used for whatever): #FF6C60 255:108:96
|
|
||||||
" light red: #FFB6B0 255:182:176
|
|
||||||
"
|
|
||||||
" brown: #E18964 good for special
|
|
||||||
"
|
|
||||||
" lightpurpleish: #FFCCFF
|
|
||||||
"
|
|
||||||
" Interface colors:
|
|
||||||
" background color: black
|
|
||||||
" cursor (where underscore is used): #FFA560 255:165:96
|
|
||||||
" cursor (where block is used): white
|
|
||||||
" visual selection: #1D1E2C
|
|
||||||
" current line: #151515 21:21:21
|
|
||||||
" search selection: #07281C 7:40:28
|
|
||||||
" line number: #3D3D3D 61:61:61
|
|
||||||
|
|
||||||
|
|
||||||
" ********************************************************************************
|
|
||||||
" The following are the preferred 16 colors for your terminal
|
|
||||||
" Colors Bright Colors
|
|
||||||
" Black #4E4E4E #7C7C7C
|
|
||||||
" Red #FF6C60 #FFB6B0
|
|
||||||
" Green #A8FF60 #CEFFAB
|
|
||||||
" Yellow #FFFFB6 #FFFFCB
|
|
||||||
" Blue #96CBFE #FFFFCB
|
|
||||||
" Magenta #FF73FD #FF9CFE
|
|
||||||
" Cyan #C6C5FE #DFDFFE
|
|
||||||
" White #EEEEEE #FFFFFF
|
|
||||||
|
|
||||||
|
|
||||||
" ********************************************************************************
|
|
||||||
set background=dark
|
|
||||||
hi clear
|
|
||||||
|
|
||||||
if exists("syntax_on")
|
|
||||||
syntax reset
|
|
||||||
endif
|
|
||||||
|
|
||||||
let colors_name = "ir_black"
|
|
||||||
|
|
||||||
|
|
||||||
"hi Example guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
" General colors
|
|
||||||
hi Normal guifg=#f6f3e8 guibg=black gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi NonText guifg=#070707 guibg=black gui=NONE ctermfg=black ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi Cursor guifg=black guibg=white gui=NONE ctermfg=black ctermbg=white cterm=reverse
|
|
||||||
hi LineNr guifg=#3D3D3D guibg=black gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi VertSplit guifg=#202020 guibg=#202020 gui=NONE ctermfg=darkgray ctermbg=darkgray cterm=NONE
|
|
||||||
hi StatusLine guifg=#CCCCCC guibg=#202020 gui=None ctermfg=white ctermbg=darkgray cterm=NONE
|
|
||||||
hi StatusLineNC guifg=black guibg=#202020 gui=NONE ctermfg=blue ctermbg=darkgray cterm=NONE
|
|
||||||
|
|
||||||
hi Folded guifg=#a0a8b0 guibg=#384048 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi Title guifg=#f6f3e8 guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi Visual guifg=NONE guibg=DarkBlue gui=NONE ctermfg=NONE ctermbg=darkgray cterm=NONE
|
|
||||||
|
|
||||||
hi SpecialKey guifg=#808080 guibg=#343434 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi WildMenu guifg=white guibg=DarkRed gui=NONE ctermfg=white ctermbg=DarkRed cterm=NONE
|
|
||||||
hi PmenuSbar guifg=black guibg=white gui=NONE ctermfg=black ctermbg=white cterm=NONE
|
|
||||||
"hi Ignore guifg=gray guibg=black gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi Error guifg=NONE guibg=red gui=undercurl ctermfg=white ctermbg=red cterm=NONE guisp=#FF6C60 " undercurl color
|
|
||||||
hi ErrorMsg guifg=white guibg=#FF6C60 gui=BOLD ctermfg=white ctermbg=red cterm=NONE
|
|
||||||
hi WarningMsg guifg=white guibg=#FF6C60 gui=BOLD ctermfg=white ctermbg=red cterm=NONE
|
|
||||||
|
|
||||||
" Message displayed in lower left, such as --INSERT--
|
|
||||||
hi ModeMsg guifg=black guibg=#C6C5FE gui=BOLD ctermfg=black ctermbg=cyan cterm=BOLD
|
|
||||||
|
|
||||||
if version >= 700 " Vim 7.x specific colors
|
|
||||||
hi CursorLine guifg=NONE guibg=#121212 gui=NONE ctermfg=NONE ctermbg=NONE cterm=BOLD
|
|
||||||
hi CursorColumn guifg=NONE guibg=#121212 gui=NONE ctermfg=NONE ctermbg=NONE cterm=BOLD
|
|
||||||
hi MatchParen guifg=#f6f3e8 guibg=#857b6f gui=BOLD ctermfg=white ctermbg=darkgray cterm=NONE
|
|
||||||
hi Pmenu guifg=#f6f3e8 guibg=#444444 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi PmenuSel guifg=#000000 guibg=#cae682 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
hi Search guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Syntax highlighting
|
|
||||||
hi Comment guifg=#7C7C7C guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE
|
|
||||||
hi String guifg=#A8FF60 guibg=NONE gui=NONE ctermfg=green ctermbg=NONE cterm=NONE
|
|
||||||
hi Number guifg=#FF73FD guibg=NONE gui=NONE ctermfg=magenta ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi Keyword guifg=#96CBFE guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE
|
|
||||||
hi PreProc guifg=#96CBFE guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE
|
|
||||||
hi Conditional guifg=#6699CC guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE " if else end
|
|
||||||
|
|
||||||
hi Todo guifg=#8f8f8f guibg=NONE gui=NONE ctermfg=red ctermbg=NONE cterm=NONE
|
|
||||||
hi Constant guifg=#99CC99 guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi Identifier guifg=#C6C5FE guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE
|
|
||||||
hi Function guifg=#FFD2A7 guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE
|
|
||||||
hi Type guifg=#FFFFB6 guibg=NONE gui=NONE ctermfg=yellow ctermbg=NONE cterm=NONE
|
|
||||||
hi Statement guifg=#6699CC guibg=NONE gui=NONE ctermfg=lightblue ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi Special guifg=#E18964 guibg=NONE gui=NONE ctermfg=white ctermbg=NONE cterm=NONE
|
|
||||||
hi Delimiter guifg=#00A0A0 guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE
|
|
||||||
hi Operator guifg=#6699CC guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
hi link Character Constant
|
|
||||||
hi link Boolean Constant
|
|
||||||
hi link Float Number
|
|
||||||
hi link Repeat Statement
|
|
||||||
hi link Label Statement
|
|
||||||
hi link Exception Statement
|
|
||||||
hi link Include PreProc
|
|
||||||
hi link Define PreProc
|
|
||||||
hi link Macro PreProc
|
|
||||||
hi link PreCondit PreProc
|
|
||||||
hi link StorageClass Type
|
|
||||||
hi link Structure Type
|
|
||||||
hi link Typedef Type
|
|
||||||
hi link Tag Special
|
|
||||||
hi link SpecialChar Special
|
|
||||||
hi link SpecialComment Special
|
|
||||||
hi link Debug Special
|
|
||||||
|
|
||||||
|
|
||||||
" Special for Ruby
|
|
||||||
hi rubyRegexp guifg=#B18A3D guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE
|
|
||||||
hi rubyRegexpDelimiter guifg=#FF8000 guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE
|
|
||||||
hi rubyEscape guifg=white guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE
|
|
||||||
hi rubyInterpolationDelimiter guifg=#00A0A0 guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE
|
|
||||||
hi rubyControl guifg=#6699CC guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE "and break, etc
|
|
||||||
"hi rubyGlobalVariable guifg=#FFCCFF guibg=NONE gui=NONE ctermfg=lightblue ctermbg=NONE cterm=NONE "yield
|
|
||||||
hi rubyStringDelimiter guifg=#336633 guibg=NONE gui=NONE ctermfg=lightgreen ctermbg=NONE cterm=NONE
|
|
||||||
"rubyInclude
|
|
||||||
"rubySharpBang
|
|
||||||
"rubyAccess
|
|
||||||
"rubyPredefinedVariable
|
|
||||||
"rubyBoolean
|
|
||||||
"rubyClassVariable
|
|
||||||
"rubyBeginEnd
|
|
||||||
"rubyRepeatModifier
|
|
||||||
"hi link rubyArrayDelimiter Special " [ , , ]
|
|
||||||
"rubyCurlyBlock { , , }
|
|
||||||
|
|
||||||
hi link rubyClass Keyword
|
|
||||||
hi link rubyModule Keyword
|
|
||||||
hi link rubyKeyword Keyword
|
|
||||||
hi link rubyOperator Operator
|
|
||||||
hi link rubyIdentifier Identifier
|
|
||||||
hi link rubyInstanceVariable Identifier
|
|
||||||
hi link rubyGlobalVariable Identifier
|
|
||||||
hi link rubyClassVariable Identifier
|
|
||||||
hi link rubyConstant Type
|
|
||||||
|
|
||||||
|
|
||||||
" Special for Java
|
|
||||||
" hi link javaClassDecl Type
|
|
||||||
hi link javaScopeDecl Identifier
|
|
||||||
hi link javaCommentTitle javaDocSeeTag
|
|
||||||
hi link javaDocTags javaDocSeeTag
|
|
||||||
hi link javaDocParam javaDocSeeTag
|
|
||||||
hi link javaDocSeeTagParam javaDocSeeTag
|
|
||||||
|
|
||||||
hi javaDocSeeTag guifg=#CCCCCC guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE
|
|
||||||
hi javaDocSeeTag guifg=#CCCCCC guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE
|
|
||||||
"hi javaClassDecl guifg=#CCFFCC guibg=NONE gui=NONE ctermfg=white ctermbg=NONE cterm=NONE
|
|
||||||
|
|
||||||
|
|
||||||
" Special for XML
|
|
||||||
hi link xmlTag Keyword
|
|
||||||
hi link xmlTagName Conditional
|
|
||||||
hi link xmlEndTag Identifier
|
|
||||||
|
|
||||||
|
|
||||||
" Special for HTML
|
|
||||||
hi link htmlTag Keyword
|
|
||||||
hi link htmlTagName Conditional
|
|
||||||
hi link htmlEndTag Identifier
|
|
||||||
|
|
||||||
|
|
||||||
" Special for Javascript
|
|
||||||
hi link javaScriptNumber Number
|
|
||||||
|
|
||||||
|
|
||||||
" Special for Python
|
|
||||||
"hi link pythonEscape Keyword
|
|
||||||
|
|
||||||
|
|
||||||
" Special for CSharp
|
|
||||||
hi link csXmlTag Keyword
|
|
||||||
|
|
||||||
|
|
||||||
" Amix customizations
|
|
||||||
|
|
||||||
" Tab line
|
|
||||||
hi TabLineFill guifg=#000000 guibg=#000000 gui=NONE
|
|
||||||
hi TabLine guifg=black guibg=#888888 gui=NONE
|
|
||||||
hi TabLineSel guifg=white guibg=#000000 gui=bold
|
|
||||||
|
|
||||||
" Search higlights
|
|
||||||
hi Search guifg=White guibg=DarkRed gui=NONE
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
vim-peepopen
|
|
||||||
=============
|
|
||||||
|
|
||||||
A plugin for the Vim text editor. PeepOpen provides fuzzy search of filenames and paths in a programming project.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
Get the PeepOpen.app and open it at least once to approve the Mac OS X security dialog.
|
|
||||||
|
|
||||||
Standard:
|
|
||||||
|
|
||||||
Copy `peepopen.vim` to your `~/.vim/plugin` directory.
|
|
||||||
|
|
||||||
With Tim Pope's [Pathogen](http://github.com/tpope/vim-pathogen):
|
|
||||||
|
|
||||||
Copy the entire `vim-peepopen` plugin directory to your `~/.vim/bundle` directory.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
`<Leader>p` opens the current project directory with the PeepOpen application.
|
|
||||||
|
|
||||||
Use the [vim-rooter](https://github.com/airblade/vim-rooter) plugin for automatic assignment of the current working directory for projects stored in Git.
|
|
||||||
|
|
||||||
(Leader is mapped to '\' by default)
|
|
||||||
|
|
||||||
### Options
|
|
||||||
Automatically quit PeepOpen when Vim exits.
|
|
||||||
|
|
||||||
`let p:peepopen_quit = 1`
|
|
||||||
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
- Initial Vim Plugin by [Andrew Stewart](http://www.airbladesoftware.com/).
|
|
||||||
- Some plugin boilerplate from [Rein Henrichs](http://reinh.com/).
|
|
||||||
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
" plugin/peepopen.vim
|
|
||||||
" Author: Geoffrey Grosenbach <boss@topfunky.com>
|
|
||||||
" License: MIT License
|
|
||||||
|
|
||||||
" Install this file as plugin/peepopen.vim.
|
|
||||||
|
|
||||||
" If you prefer Command-T, use this snippet in your .gvimrc:
|
|
||||||
|
|
||||||
" if has("gui_macvim")
|
|
||||||
" macmenu &File.New\ Tab key=<nop>
|
|
||||||
" map <D-t> <Plug>PeepOpen
|
|
||||||
" end
|
|
||||||
|
|
||||||
" ============================================================================
|
|
||||||
|
|
||||||
" Exit quickly when:
|
|
||||||
" - this plugin was already loaded (or disabled)
|
|
||||||
" - when 'compatible' is set
|
|
||||||
if &cp || exists("g:peepopen_loaded") && g:peepopen_loaded
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:peepopen_loaded = 1
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
if !exists('g:peepopen_quit')
|
|
||||||
let g:peepopen_quit = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
function s:LaunchPeepOpenViaVim()
|
|
||||||
silent exe "!open -a PeepOpen " . shellescape(getcwd())
|
|
||||||
redraw!
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function s:QuitPeepOpenViaVim()
|
|
||||||
silent exe '!ps ax | grep PeepOpen | grep -v grep | awk "{ print $1 }" | xargs kill -QUIT'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
command! PeepOpen :call <SID>LaunchPeepOpenViaVim()
|
|
||||||
command! PeepQuit :call <SID>QuitPeepOpenViaVim()
|
|
||||||
|
|
||||||
if has('autocmd') && exists('g:peepopen_quit') && g:peepopen_quit
|
|
||||||
au VimLeave * :call <SID>QuitPeepOpenViaVim()
|
|
||||||
endif
|
|
||||||
|
|
||||||
noremap <unique> <script> <Plug>PeepOpen <SID>Launch
|
|
||||||
noremap <SID>Launch :call <SID>LaunchPeepOpenViaVim()<CR>
|
|
||||||
|
|
||||||
if !hasmapto('<Plug>PeepOpen')
|
|
||||||
map! <unique> <silent> <Leader>p <Plug>PeepOpen
|
|
||||||
endif
|
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
" vim:set sw=2 sts=2:
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1 +0,0 @@
|
||||||
tags
|
|
||||||
|
|
@ -1,89 +0,0 @@
|
||||||
ack.vim is distributed under the same license terms as Vim itself, which you
|
|
||||||
can find in full with `:help license` within Vim, or copied in full herein.
|
|
||||||
|
|
||||||
Copyright (c) 2007-2015 Antoine Imbert <antoine.imbert+ackvim@gmail.com>
|
|
||||||
and contributors.
|
|
||||||
|
|
||||||
Maintainers may be contacted via GitHub Issues at:
|
|
||||||
|
|
||||||
https://github.com/mileszs/ack.vim/issues
|
|
||||||
|
|
||||||
|
|
||||||
VIM LICENSE
|
|
||||||
|
|
||||||
I) There are no restrictions on distributing unmodified copies of Vim except
|
|
||||||
that they must include this license text. You can also distribute
|
|
||||||
unmodified parts of Vim, likewise unrestricted except that they must
|
|
||||||
include this license text. You are also allowed to include executables
|
|
||||||
that you made from the unmodified Vim sources, plus your own usage
|
|
||||||
examples and Vim scripts.
|
|
||||||
|
|
||||||
II) It is allowed to distribute a modified (or extended) version of Vim,
|
|
||||||
including executables and/or source code, when the following four
|
|
||||||
conditions are met:
|
|
||||||
1) This license text must be included unmodified.
|
|
||||||
2) The modified Vim must be distributed in one of the following five ways:
|
|
||||||
a) If you make changes to Vim yourself, you must clearly describe in
|
|
||||||
the distribution how to contact you. When the maintainer asks you
|
|
||||||
(in any way) for a copy of the modified Vim you distributed, you
|
|
||||||
must make your changes, including source code, available to the
|
|
||||||
maintainer without fee. The maintainer reserves the right to
|
|
||||||
include your changes in the official version of Vim. What the
|
|
||||||
maintainer will do with your changes and under what license they
|
|
||||||
will be distributed is negotiable. If there has been no negotiation
|
|
||||||
then this license, or a later version, also applies to your changes.
|
|
||||||
The current maintainer is Bram Moolenaar <Bram@vim.org>. If this
|
|
||||||
changes it will be announced in appropriate places (most likely
|
|
||||||
vim.sf.net, www.vim.org and/or comp.editors). When it is completely
|
|
||||||
impossible to contact the maintainer, the obligation to send him
|
|
||||||
your changes ceases. Once the maintainer has confirmed that he has
|
|
||||||
received your changes they will not have to be sent again.
|
|
||||||
b) If you have received a modified Vim that was distributed as
|
|
||||||
mentioned under a) you are allowed to further distribute it
|
|
||||||
unmodified, as mentioned at I). If you make additional changes the
|
|
||||||
text under a) applies to those changes.
|
|
||||||
c) Provide all the changes, including source code, with every copy of
|
|
||||||
the modified Vim you distribute. This may be done in the form of a
|
|
||||||
context diff. You can choose what license to use for new code you
|
|
||||||
add. The changes and their license must not restrict others from
|
|
||||||
making their own changes to the official version of Vim.
|
|
||||||
d) When you have a modified Vim which includes changes as mentioned
|
|
||||||
under c), you can distribute it without the source code for the
|
|
||||||
changes if the following three conditions are met:
|
|
||||||
- The license that applies to the changes permits you to distribute
|
|
||||||
the changes to the Vim maintainer without fee or restriction, and
|
|
||||||
permits the Vim maintainer to include the changes in the official
|
|
||||||
version of Vim without fee or restriction.
|
|
||||||
- You keep the changes for at least three years after last
|
|
||||||
distributing the corresponding modified Vim. When the maintainer
|
|
||||||
or someone who you distributed the modified Vim to asks you (in
|
|
||||||
any way) for the changes within this period, you must make them
|
|
||||||
available to him.
|
|
||||||
- You clearly describe in the distribution how to contact you. This
|
|
||||||
contact information must remain valid for at least three years
|
|
||||||
after last distributing the corresponding modified Vim, or as long
|
|
||||||
as possible.
|
|
||||||
e) When the GNU General Public License (GPL) applies to the changes,
|
|
||||||
you can distribute the modified Vim under the GNU GPL version 2 or
|
|
||||||
any later version.
|
|
||||||
3) A message must be added, at least in the output of the ":version"
|
|
||||||
command and in the intro screen, such that the user of the modified Vim
|
|
||||||
is able to see that it was modified. When distributing as mentioned
|
|
||||||
under 2)e) adding the message is only required for as far as this does
|
|
||||||
not conflict with the license used for the changes.
|
|
||||||
4) The contact information as required under 2)a) and 2)d) must not be
|
|
||||||
removed or changed, except that the person himself can make
|
|
||||||
corrections.
|
|
||||||
|
|
||||||
III) If you distribute a modified version of Vim, you are encouraged to use
|
|
||||||
the Vim license for your changes and make them available to the
|
|
||||||
maintainer, including the source code. The preferred way to do this is
|
|
||||||
by e-mail or by uploading the files to a server and e-mailing the URL.
|
|
||||||
If the number of changes is small (e.g., a modified Makefile) e-mailing a
|
|
||||||
context diff will do. The e-mail address to be used is
|
|
||||||
<maintainer@vim.org>
|
|
||||||
|
|
||||||
IV) It is not allowed to remove this license from the distribution of the Vim
|
|
||||||
sources, parts of it or from a modified version. You may use this
|
|
||||||
license for previous Vim releases instead of the license that they came
|
|
||||||
with, at your option.
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
||||||
# ack.vim
|
|
||||||
|
|
||||||
Run your favorite search tool from Vim, with an enhanced results list.
|
|
||||||
|
|
||||||
This plugin was designed as a Vim frontend for the Perl module [App::Ack]. Ack
|
|
||||||
can be used as a replacement for 99% of the uses of _grep_. The plugin allows
|
|
||||||
you to run ack from Vim, and shows the results in a split window.
|
|
||||||
|
|
||||||
But here's a little secret for the Vim-seasoned: it's just a light wrapper for
|
|
||||||
Vim's [grepprg] and the [quickfix] window for match results. This makes it easy
|
|
||||||
to integrate with your own Vim configuration and use existing knowledge of core
|
|
||||||
features. It also means the plugin is flexible to use with other search tools.
|
|
||||||
|
|
||||||
[App::Ack]: http://search.cpan.org/~petdance/ack/ack
|
|
||||||
[grepprg]: http://vimdoc.sourceforge.net/htmldoc/options.html#'grepprg'
|
|
||||||
[quickfix]: http://vimdoc.sourceforge.net/htmldoc/quickfix.html#quickfix
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Ack
|
|
||||||
|
|
||||||
You will need ack (>= 2.0), of course. To install it follow the
|
|
||||||
[manual](http://beyondgrep.com/install/).
|
|
||||||
|
|
||||||
### The Plugin
|
|
||||||
|
|
||||||
It is recommended to use one of the popular plugin managers for Vim. There are
|
|
||||||
many and you probably already have a preferred one, but a few examples for your
|
|
||||||
copy-and-paste convenience:
|
|
||||||
|
|
||||||
#### Pathogen
|
|
||||||
|
|
||||||
$ git clone https://github.com/mileszs/ack.vim.git ~/.vim/bundle/ack.vim
|
|
||||||
|
|
||||||
#### Vundle
|
|
||||||
|
|
||||||
```vim
|
|
||||||
Plugin 'mileszs/ack.vim'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### NeoBundle
|
|
||||||
|
|
||||||
```vim
|
|
||||||
NeoBundle 'mileszs/ack.vim'
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Manual (not recommended)
|
|
||||||
|
|
||||||
[Download][releases] the plugin and extract it in `~/.vim/` (or
|
|
||||||
`%PROGRAMFILES%/Vim/vimfiles` on Windows).
|
|
||||||
|
|
||||||
[zipball]: https://github.com/mileszs/ack.vim/archive/master.zip
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
:Ack [options] {pattern} [{directories}]
|
|
||||||
|
|
||||||
Search recursively in `{directories}` (which defaults to the current directory)
|
|
||||||
for the `{pattern}`.
|
|
||||||
|
|
||||||
Files containing the search term will be listed in the quickfix window, along
|
|
||||||
with the line number of the occurrence, once for each occurrence. `<Enter>` on
|
|
||||||
a line in this window will open the file, and place the cursor on the matching
|
|
||||||
line.
|
|
||||||
|
|
||||||
Just like where you use `:grep`, `:grepadd`, `:lgrep`, and :`lgrepadd`, you can
|
|
||||||
use `:Ack`, `:AckAdd`, `:LAck`, and `:LAckAdd` respectively. (See `:help Ack`
|
|
||||||
after installing, or [`doc/ack.txt`][doc] in the repo, for more information.)
|
|
||||||
|
|
||||||
For more ack help see [ack documentation](http://beyondgrep.com/documentation/).
|
|
||||||
|
|
||||||
[doc]: https://github.com/mileszs/ack.vim/blob/master/doc/ack.txt
|
|
||||||
|
|
||||||
### Keyboard Shortcuts
|
|
||||||
|
|
||||||
The quickfix results window is augmented with these convenience mappings:
|
|
||||||
|
|
||||||
? a quick summary of these keys, repeat to close
|
|
||||||
o to open (same as Enter)
|
|
||||||
O to open and close the quickfix window
|
|
||||||
go to preview file, open but maintain focus on ack.vim results
|
|
||||||
t to open in new tab
|
|
||||||
T to open in new tab without moving to it
|
|
||||||
h to open in horizontal split
|
|
||||||
H to open in horizontal split, keeping focus on the results
|
|
||||||
v to open in vertical split
|
|
||||||
gv to open in vertical split, keeping focus on the results
|
|
||||||
q to close the quickfix window
|
|
||||||
|
|
||||||
### Gotchas
|
|
||||||
|
|
||||||
Some characters have special meaning, and need to be escaped in your search
|
|
||||||
pattern. For instance, `#`. You need to escape it with `:Ack '\\\#define
|
|
||||||
foo'` to search for '#define foo'. See [issue #5].
|
|
||||||
|
|
||||||
[issue #5]: https://github.com/mileszs/ack.vim/issues/5
|
|
||||||
|
|
||||||
## Possibly FAQ
|
|
||||||
|
|
||||||
#### Can I use `ag` ([The Silver Searcher]) with this?
|
|
||||||
|
|
||||||
Absolutely, and probably other tools if their output is similar or you can
|
|
||||||
write a pattern match for it--just set `g:ackprg`. If you like, you can fall
|
|
||||||
back to Ack in case you use your vimrc on a system without Ag available:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
if executable('ag')
|
|
||||||
let g:ackprg = 'ag --vimgrep'
|
|
||||||
endif
|
|
||||||
```
|
|
||||||
|
|
||||||
Since Ack is quite portable you might check a copy of it into your dotfiles
|
|
||||||
repository in `~/bin` so you'll nearly always have it available.
|
|
||||||
|
|
||||||
#### What's the difference from ag.vim?
|
|
||||||
|
|
||||||
Well... not a lot really.
|
|
||||||
|
|
||||||
Present maintainer, yours truly, [kind of wishes they never forked][sadface],
|
|
||||||
contributes to both, and wouldn't mind seeing them merged again. ag.vim got a
|
|
||||||
nice code clean-up (which ack.vim is now hopefully getting), and ack.vim picked
|
|
||||||
up a few features that haven't made their way to ag.vim, like `:AckWindow`,
|
|
||||||
optional background search execution with [vim-dispatch], and auto-previewing.
|
|
||||||
|
|
||||||
[The Silver Searcher]: https://github.com/ggreer/the_silver_searcher
|
|
||||||
[sadface]: https://github.com/mileszs/ack.vim/commit/d97090fb502d40229e6976dfec0e06636ba227d5#commitcomment-5771145
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
Please see [the Github releases page][releases].
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
|
|
||||||
This plugin is derived from Antoine Imbert's blog post [Ack and Vim
|
|
||||||
Integration][] (in particular, the function in the update to the post). [Miles
|
|
||||||
Sterrett][mileszs] packaged it up as a plugin and documented it in Vim's help
|
|
||||||
format, and since then [many contributors][contributors] have submitted
|
|
||||||
enhancements and fixes.
|
|
||||||
|
|
||||||
And of course, where would we be without [Ack]. And, you know, Vim.
|
|
||||||
|
|
||||||
[Ack and Vim Integration]: http://blog.ant0ine.com/typepad/2007/03/ack-and-vim-integration.html
|
|
||||||
[mileszs]: https://github.com/mileszs
|
|
||||||
[contributors]: https://github.com/mileszs/ack.vim/graphs/contributors
|
|
||||||
[Ack]: http://beyondgrep.com/
|
|
||||||
|
|
||||||
[vim-dispatch]: https://github.com/tpope/vim-dispatch
|
|
||||||
[releases]: https://github.com/mileszs/ack.vim/releases
|
|
||||||
|
|
@ -1,227 +0,0 @@
|
||||||
if exists('g:ack_use_dispatch')
|
|
||||||
if g:ack_use_dispatch && !exists(':Dispatch')
|
|
||||||
call s:Warn('Dispatch not loaded! Falling back to g:ack_use_dispatch = 0.')
|
|
||||||
let g:ack_use_dispatch = 0
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let g:ack_use_dispatch = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
"-----------------------------------------------------------------------------
|
|
||||||
" Public API
|
|
||||||
"-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
function! ack#Ack(cmd, args) "{{{
|
|
||||||
call s:Init(a:cmd)
|
|
||||||
redraw
|
|
||||||
|
|
||||||
" Local values that we'll temporarily set as options when searching
|
|
||||||
let l:grepprg = g:ackprg
|
|
||||||
let l:grepformat = '%f:%l:%c:%m,%f:%l:%m' " Include column number
|
|
||||||
|
|
||||||
" Strip some options that are meaningless for path search and set match
|
|
||||||
" format accordingly.
|
|
||||||
if s:SearchingFilepaths()
|
|
||||||
let l:grepprg = substitute(l:grepprg, '-H\|--column', '', 'g')
|
|
||||||
let l:grepformat = '%f'
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If no pattern is provided, search for the word under the cursor
|
|
||||||
let l:grepargs = empty(a:args) ? expand("<cword>") : a:args . join(a:000, ' ')
|
|
||||||
|
|
||||||
" NOTE: we escape special chars, but not everything using shellescape to
|
|
||||||
" allow for passing arguments etc
|
|
||||||
let l:escaped_args = escape(l:grepargs, '|#%')
|
|
||||||
|
|
||||||
echo "Searching ..."
|
|
||||||
|
|
||||||
if g:ack_use_dispatch
|
|
||||||
call s:SearchWithDispatch(l:grepprg, l:escaped_args, l:grepformat)
|
|
||||||
else
|
|
||||||
call s:SearchWithGrep(a:cmd, l:grepprg, l:escaped_args, l:grepformat)
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Dispatch has no callback mechanism currently, we just have to display the
|
|
||||||
" list window early and wait for it to populate :-/
|
|
||||||
call ack#ShowResults()
|
|
||||||
call s:Highlight(l:grepargs)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! ack#AckFromSearch(cmd, args) "{{{
|
|
||||||
let search = getreg('/')
|
|
||||||
" translate vim regular expression to perl regular expression.
|
|
||||||
let search = substitute(search, '\(\\<\|\\>\)', '\\b', 'g')
|
|
||||||
call ack#Ack(a:cmd, '"' . search . '" ' . a:args)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! ack#AckHelp(cmd, args) "{{{
|
|
||||||
let args = a:args . ' ' . s:GetDocLocations()
|
|
||||||
call ack#Ack(a:cmd, args)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! ack#AckWindow(cmd, args) "{{{
|
|
||||||
let files = tabpagebuflist()
|
|
||||||
|
|
||||||
" remove duplicated filenames (files appearing in more than one window)
|
|
||||||
let files = filter(copy(sort(files)), 'index(files,v:val,v:key+1)==-1')
|
|
||||||
call map(files, "bufname(v:val)")
|
|
||||||
|
|
||||||
" remove unnamed buffers as quickfix (empty strings before shellescape)
|
|
||||||
call filter(files, 'v:val != ""')
|
|
||||||
|
|
||||||
" expand to full path (avoid problems with cd/lcd in au QuickFixCmdPre)
|
|
||||||
let files = map(files, "shellescape(fnamemodify(v:val, ':p'))")
|
|
||||||
let args = a:args . ' ' . join(files)
|
|
||||||
|
|
||||||
call ack#Ack(a:cmd, args)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! ack#ShowResults() "{{{
|
|
||||||
let l:handler = s:UsingLocList() ? g:ack_lhandler : g:ack_qhandler
|
|
||||||
execute l:handler
|
|
||||||
call s:ApplyMappings()
|
|
||||||
redraw!
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
"-----------------------------------------------------------------------------
|
|
||||||
" Private API
|
|
||||||
"-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
function! s:ApplyMappings() "{{{
|
|
||||||
if !s:UsingListMappings() || &filetype != 'qf'
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:wintype = s:UsingLocList() ? 'l' : 'c'
|
|
||||||
let l:closemap = ':' . l:wintype . 'close<CR>'
|
|
||||||
let g:ack_mappings.q = l:closemap
|
|
||||||
|
|
||||||
nnoremap <buffer> <silent> ? :call <SID>QuickHelp()<CR>
|
|
||||||
|
|
||||||
if g:ack_autoclose
|
|
||||||
" We just map the 'go' and 'gv' mappings to close on autoclose, wtf?
|
|
||||||
for key_map in items(g:ack_mappings)
|
|
||||||
execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1) . l:closemap)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
execute "nnoremap <buffer> <silent> <CR> <CR>" . l:closemap
|
|
||||||
else
|
|
||||||
for key_map in items(g:ack_mappings)
|
|
||||||
execute printf("nnoremap <buffer> <silent> %s %s", get(key_map, 0), get(key_map, 1))
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("g:ackpreview") " if auto preview in on, remap j and k keys
|
|
||||||
nnoremap <buffer> <silent> j j<CR><C-W><C-W>
|
|
||||||
nnoremap <buffer> <silent> k k<CR><C-W><C-W>
|
|
||||||
nmap <buffer> <silent> <Down> j
|
|
||||||
nmap <buffer> <silent> <Up> k
|
|
||||||
endif
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:GetDocLocations() "{{{
|
|
||||||
let dp = ''
|
|
||||||
for p in split(&rtp, ',')
|
|
||||||
let p = p . '/doc/'
|
|
||||||
if isdirectory(p)
|
|
||||||
let dp = p . '*.txt ' . dp
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return dp
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:Highlight(args) "{{{
|
|
||||||
if !g:ackhighlight
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]")
|
|
||||||
call feedkeys(":let &hlsearch=1 \| echo \<CR>", "n")
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
" Initialize state for an :Ack* or :LAck* search
|
|
||||||
function! s:Init(cmd) "{{{
|
|
||||||
let s:searching_filepaths = (a:cmd =~# '-g$') ? 1 : 0
|
|
||||||
let s:using_loclist = (a:cmd =~# '^l') ? 1 : 0
|
|
||||||
|
|
||||||
if g:ack_use_dispatch && s:using_loclist
|
|
||||||
call s:Warn('Dispatch does not support location lists! Proceeding with quickfix...')
|
|
||||||
let s:using_loclist = 0
|
|
||||||
endif
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:QuickHelp() "{{{
|
|
||||||
execute 'edit' globpath(&rtp, 'doc/ack_quick_help.txt')
|
|
||||||
|
|
||||||
silent normal gg
|
|
||||||
setlocal buftype=nofile bufhidden=hide nobuflisted
|
|
||||||
setlocal nomodifiable noswapfile
|
|
||||||
setlocal filetype=help
|
|
||||||
setlocal nonumber norelativenumber nowrap
|
|
||||||
setlocal foldmethod=diff foldlevel=20
|
|
||||||
|
|
||||||
nnoremap <buffer> <silent> ? :q!<CR>:call ack#ShowResults()<CR>
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:SearchWithDispatch(grepprg, grepargs, grepformat) "{{{
|
|
||||||
let l:makeprg_bak = &l:makeprg
|
|
||||||
let l:errorformat_bak = &l:errorformat
|
|
||||||
|
|
||||||
" We don't execute a :grep command for Dispatch, so add -g here instead
|
|
||||||
if s:SearchingFilepaths()
|
|
||||||
let l:grepprg = a:grepprg . ' -g'
|
|
||||||
else
|
|
||||||
let l:grepprg = a:grepprg
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
|
||||||
let &l:makeprg = l:grepprg . ' ' . a:grepargs
|
|
||||||
let &l:errorformat = a:grepformat
|
|
||||||
|
|
||||||
Make
|
|
||||||
finally
|
|
||||||
let &l:makeprg = l:makeprg_bak
|
|
||||||
let &l:errorformat = l:errorformat_bak
|
|
||||||
endtry
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:SearchWithGrep(grepcmd, grepprg, grepargs, grepformat) "{{{
|
|
||||||
let l:grepprg_bak = &l:grepprg
|
|
||||||
let l:grepformat_bak = &grepformat
|
|
||||||
|
|
||||||
try
|
|
||||||
let &l:grepprg = a:grepprg
|
|
||||||
let &grepformat = a:grepformat
|
|
||||||
|
|
||||||
silent execute a:grepcmd a:grepargs
|
|
||||||
finally
|
|
||||||
let &l:grepprg = l:grepprg_bak
|
|
||||||
let &grepformat = l:grepformat_bak
|
|
||||||
endtry
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
" Are we finding matching files, not lines? (the -g option -- :AckFile)
|
|
||||||
function! s:SearchingFilepaths() "{{{
|
|
||||||
return get(s:, 'searching_filepaths', 0)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
" Predicate for whether mappings are enabled for list type of current search.
|
|
||||||
function! s:UsingListMappings() "{{{
|
|
||||||
if s:UsingLocList()
|
|
||||||
return g:ack_apply_lmappings
|
|
||||||
else
|
|
||||||
return g:ack_apply_qmappings
|
|
||||||
endif
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
" Were we invoked with a :LAck command?
|
|
||||||
function! s:UsingLocList() "{{{
|
|
||||||
return get(s:, 'using_loclist', 0)
|
|
||||||
endfunction "}}}
|
|
||||||
|
|
||||||
function! s:Warn(msg) "{{{
|
|
||||||
echohl WarningMsg | echomsg 'Ack: ' . a:msg | echohl None
|
|
||||||
endf "}}}
|
|
||||||
|
|
||||||
" vim:set et sw=2 ts=2 tw=78 fdm=marker
|
|
||||||
|
|
@ -1,256 +0,0 @@
|
||||||
*ack.txt* Plugin that integrates ack with Vim
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
Author: Antoine Imbert <antoine.imbert+ackvim@gmail.com> *ack-author*
|
|
||||||
License: Same terms as Vim itself (see |license|)
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
INTRODUCTION *ack*
|
|
||||||
|
|
||||||
This plugin is a front for the Perl module App::Ack. Ack can be used as a
|
|
||||||
replacement for grep. This plugin will allow you to run ack from vim, and
|
|
||||||
shows the results in a split window.
|
|
||||||
|
|
||||||
:Ack[!] [options] {pattern} [{directory}] *:Ack*
|
|
||||||
|
|
||||||
Search recursively in {directory} (which defaults to the current
|
|
||||||
directory) for the {pattern}. Behaves just like the |:grep| command, but
|
|
||||||
will open the |Quickfix| window for you. If [!] is not given the first
|
|
||||||
occurence is jumped to.
|
|
||||||
|
|
||||||
:AckAdd [options] {pattern} [{directory}] *:AckAdd*
|
|
||||||
|
|
||||||
Just like |:Ack|, but instead of making a new list, the matches are
|
|
||||||
appended to the current |quickfix| list.
|
|
||||||
|
|
||||||
:AckFromSearch [{directory}] *:AckFromSearch*
|
|
||||||
|
|
||||||
Just like |:Ack| but the pattern is from previous search.
|
|
||||||
|
|
||||||
:LAck [options] {pattern} [{directory}] *:LAck*
|
|
||||||
|
|
||||||
Just like |:Ack| but instead of the |quickfix| list, matches are placed in
|
|
||||||
the current |location-list|.
|
|
||||||
|
|
||||||
:LAckAdd [options] {pattern} [{directory}] *:LAckAdd*
|
|
||||||
|
|
||||||
Just like |:AckAdd| but instead of the |quickfix| list, matches are added
|
|
||||||
to the current |location-list|
|
|
||||||
|
|
||||||
:AckFile [options] {pattern} [{directory}] *:AckFile*
|
|
||||||
|
|
||||||
Search recursively in {directory} (which defaults to the current
|
|
||||||
directory) for filenames matching the {pattern}. Behaves just like the
|
|
||||||
|:grep| command, but will open the |Quickfix| window for you.
|
|
||||||
|
|
||||||
:AckHelp[!] [options] {pattern} *:AckHelp*
|
|
||||||
|
|
||||||
Search vim documentation files for the {pattern}. Behaves just like the
|
|
||||||
|:Ack| command, but searches only vim documentation .txt files
|
|
||||||
|
|
||||||
:LAckHelp [options] {pattern} *:LAckHelp*
|
|
||||||
|
|
||||||
Just like |:AckHelp| but instead of the |quickfix| list, matches are placed
|
|
||||||
in the current |location-list|.
|
|
||||||
|
|
||||||
:AckWindow[!] [options] {pattern} *:AckWindow*
|
|
||||||
|
|
||||||
Search all buffers visible in the screen (current tab page only) files for
|
|
||||||
the {pattern}.
|
|
||||||
|
|
||||||
:LAckWindow [options] {pattern} *:LAckWindow*
|
|
||||||
|
|
||||||
Just like |:AckWindow| but instead of the |quickfix| list, matches are
|
|
||||||
placed in the current |location-list|.
|
|
||||||
|
|
||||||
Files containing the search term will be listed in the split window, along
|
|
||||||
with the line number of the occurrence, once for each occurrence. <Enter> on
|
|
||||||
a line in this window will open the file, and place the cursor on the matching
|
|
||||||
line.
|
|
||||||
|
|
||||||
Note that if you are using Dispatch.vim with |g:ack_use_dispatch|, location
|
|
||||||
lists are not supported, because Dispatch does not support them at this time.
|
|
||||||
`:LAck` versions of commands above will give a warning and proceed to use the
|
|
||||||
quickfix list instead.
|
|
||||||
|
|
||||||
See http://beyondgrep.com/ for more information on searching with ack.
|
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
CONFIGURATION *ack-configuration*
|
|
||||||
|
|
||||||
*g:ackprg*
|
|
||||||
g:ackprg
|
|
||||||
Default for ubuntu: "ack-grep"
|
|
||||||
Default for other systems: "ack"
|
|
||||||
|
|
||||||
Use this option to specify the search command and its default arguments.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ackprg = "ag --vimgrep"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_default_options*
|
|
||||||
g:ack_default_options
|
|
||||||
Default: " -s -H --nocolor --nogroup --column"
|
|
||||||
|
|
||||||
Use this option to specify the default arguments given to `ack`. This is only
|
|
||||||
used if |g:ackprg| has not been customized from the default--if you are using
|
|
||||||
a custom search program instead of Ack, set your preferred options in
|
|
||||||
|g:ackprg|.
|
|
||||||
|
|
||||||
NOTE: This option may be deprecated in the future. ~
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ack_default_options =
|
|
||||||
\ " -s -H --nocolor --nogroup --column --smart-case --follow"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_apply_qmappings*
|
|
||||||
g:ack_apply_qmappings
|
|
||||||
Default: 1
|
|
||||||
|
|
||||||
This option enable mappings on quickview window.
|
|
||||||
|
|
||||||
*g:ack_apply_lmappings*
|
|
||||||
g:ack_apply_lmappings
|
|
||||||
Default: 1
|
|
||||||
|
|
||||||
This option enable mappings on Location list window.
|
|
||||||
|
|
||||||
*g:ack_mappings*
|
|
||||||
g:ack_mappings
|
|
||||||
Default: {
|
|
||||||
\ "t": "<C-W><CR><C-W>T",
|
|
||||||
\ "T": "<C-W><CR><C-W>TgT<C-W>j",
|
|
||||||
\ "o": "<CR>",
|
|
||||||
\ "O": "<CR><C-W><C-W>:ccl<CR>",
|
|
||||||
\ "go": "<CR><C-W>j",
|
|
||||||
\ "h": "<C-W><CR><C-W>K",
|
|
||||||
\ "H": "<C-W><CR><C-W>K<C-W>b",
|
|
||||||
\ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t",
|
|
||||||
\ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" }
|
|
||||||
|
|
||||||
This option list all maps create on quickfix/Location list window.
|
|
||||||
|
|
||||||
Example, if you want to open the result in the middle of the screen:
|
|
||||||
>
|
|
||||||
let g:ack_mappings = { "o": "<CR>zz" }
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_qhandler*
|
|
||||||
g:ack_qhandler
|
|
||||||
Default: "botright copen"
|
|
||||||
|
|
||||||
Command to open the quickview window.
|
|
||||||
|
|
||||||
If you want to open a quickview window with 30 lines you can do:
|
|
||||||
>
|
|
||||||
let g:ack_qhandler = "botright copen 30"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_lhandler*
|
|
||||||
g:ack_lhandler
|
|
||||||
Default: "botright lopen"
|
|
||||||
|
|
||||||
Command to open the Location list window.
|
|
||||||
|
|
||||||
If you want to open a Location list window with 30 lines you can do:
|
|
||||||
>
|
|
||||||
let g:ack_lhandler = "botright lopen 30"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ackhighlight*
|
|
||||||
|
|
||||||
g:ackhighlight
|
|
||||||
Default: 0
|
|
||||||
|
|
||||||
Use this option to highlight the searched term.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ackhighlight = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_autoclose*
|
|
||||||
g:ack_autoclose
|
|
||||||
Default: 0
|
|
||||||
|
|
||||||
Use this option to specify whether to close the quickfix window after
|
|
||||||
using any of the shortcuts.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ack_autoclose = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_autofold_results*
|
|
||||||
|
|
||||||
g:ack_autofold_results
|
|
||||||
Default: 0
|
|
||||||
|
|
||||||
Use this option to fold the results in quickfix by file name. Only the current
|
|
||||||
fold will be open by default and while you press 'j' and 'k' to move between the
|
|
||||||
results if you hit other fold the last one will be closed and the current will
|
|
||||||
be open.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ack_autofold_results = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ackpreview*
|
|
||||||
|
|
||||||
g:ackpreview
|
|
||||||
Default: 0
|
|
||||||
|
|
||||||
Use this option to automagically open the file with 'j' or 'k'.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ackpreview = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ack_use_dispatch*
|
|
||||||
|
|
||||||
g:ack_use_dispatch
|
|
||||||
Default: 0
|
|
||||||
|
|
||||||
Use this option to use vim-dispatch to run searches in the background, with a
|
|
||||||
variety of execution backends for different systems.
|
|
||||||
|
|
||||||
Due to limitations in Dispatch at this time, location lists are unsupported
|
|
||||||
and result windows will appear before results are ready. Still, these may be
|
|
||||||
acceptable tradeoffs for very large projects where searches are slow.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
>
|
|
||||||
let g:ack_use_dispatch = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
MAPPINGS *ack-mappings*
|
|
||||||
|
|
||||||
The following keyboard shortcuts are available in the quickfix window:
|
|
||||||
|
|
||||||
o open file (same as enter).
|
|
||||||
|
|
||||||
O open file and close quickfix window.
|
|
||||||
|
|
||||||
go preview file (open but maintain focus on ack.vim results).
|
|
||||||
|
|
||||||
t open in a new tab.
|
|
||||||
|
|
||||||
T open in new tab silently.
|
|
||||||
|
|
||||||
h open in horizontal split.
|
|
||||||
|
|
||||||
H open in horizontal split silently.
|
|
||||||
|
|
||||||
v open in vertical split.
|
|
||||||
|
|
||||||
gv open in vertical split silently.
|
|
||||||
|
|
||||||
q close the quickfix window.
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
==== ack.vim quick help ===============
|
|
||||||
|
|
||||||
*?:* a quick summary of these keys, repeat to close
|
|
||||||
*o:* to open (same as Enter)
|
|
||||||
*O:* to open and close the quickfix window
|
|
||||||
*go:* to preview file, open but maintain focus on ack.vim results
|
|
||||||
*t:* to open in new tab
|
|
||||||
*T:* to open in new tab without moving to it
|
|
||||||
*h:* to open in horizontal split
|
|
||||||
*H:* to open in horizontal split, keeping focus on the results
|
|
||||||
*v:* to open in vertical split
|
|
||||||
*gv:* to open in vertical split, keeping focus on the results
|
|
||||||
*q:* to close the quickfix window
|
|
||||||
|
|
||||||
========================================
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
if exists("g:ack_autofold_results") && g:ack_autofold_results
|
|
||||||
setlocal foldlevel=0
|
|
||||||
setlocal foldmethod=expr
|
|
||||||
setlocal foldexpr=matchstr(getline(v:lnum),'^[^\|]\\+')==#matchstr(getline(v:lnum+1),'^[^\|]\\+')?1:'<1'
|
|
||||||
setlocal foldenable
|
|
||||||
setlocal foldclose=all
|
|
||||||
setlocal foldopen=all
|
|
||||||
nnoremap <buffer> j jzz
|
|
||||||
endif
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
||||||
if exists('g:loaded_ack')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_default_options")
|
|
||||||
let g:ack_default_options = " -s -H --nocolor --nogroup --column"
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Location of the ack utility
|
|
||||||
if !exists("g:ackprg")
|
|
||||||
if executable('ack')
|
|
||||||
let g:ackprg = "ack"
|
|
||||||
elseif executable('ack-grep')
|
|
||||||
let g:ackprg = "ack-grep"
|
|
||||||
else
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:ackprg .= g:ack_default_options
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_apply_qmappings")
|
|
||||||
let g:ack_apply_qmappings = !exists("g:ack_qhandler")
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_apply_lmappings")
|
|
||||||
let g:ack_apply_lmappings = !exists("g:ack_lhandler")
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:ack_mappings = {
|
|
||||||
\ "t": "<C-W><CR><C-W>T",
|
|
||||||
\ "T": "<C-W><CR><C-W>TgT<C-W>j",
|
|
||||||
\ "o": "<CR>",
|
|
||||||
\ "O": "<CR><C-W>p<C-W>c",
|
|
||||||
\ "go": "<CR><C-W>p",
|
|
||||||
\ "h": "<C-W><CR><C-W>K",
|
|
||||||
\ "H": "<C-W><CR><C-W>K<C-W>b",
|
|
||||||
\ "v": "<C-W><CR><C-W>H<C-W>b<C-W>J<C-W>t",
|
|
||||||
\ "gv": "<C-W><CR><C-W>H<C-W>b<C-W>J" }
|
|
||||||
|
|
||||||
if exists("g:ack_mappings")
|
|
||||||
let g:ack_mappings = extend(s:ack_mappings, g:ack_mappings)
|
|
||||||
else
|
|
||||||
let g:ack_mappings = s:ack_mappings
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_qhandler")
|
|
||||||
let g:ack_qhandler = "botright copen"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_lhandler")
|
|
||||||
let g:ack_lhandler = "botright lopen"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ackhighlight")
|
|
||||||
let g:ackhighlight = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_autoclose")
|
|
||||||
let g:ack_autoclose = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ack_autofold_results")
|
|
||||||
let g:ack_autofold_results = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
command! -bang -nargs=* -complete=file Ack call ack#Ack('grep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AckAdd call ack#Ack('grepadd<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AckFromSearch call ack#AckFromSearch('grep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file LAck call ack#Ack('lgrep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file LAckAdd call ack#Ack('lgrepadd<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AckFile call ack#Ack('grep<bang> -g', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=help AckHelp call ack#AckHelp('grep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=help LAckHelp call ack#AckHelp('lgrep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* AckWindow call ack#AckWindow('grep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* LAckWindow call ack#AckWindow('lgrep<bang>', <q-args>)
|
|
||||||
|
|
||||||
let g:loaded_ack = 1
|
|
||||||
|
|
||||||
" vim:set et sw=2 ts=2 tw=78 fdm=marker
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
tags
|
|
||||||
ag-vim.tgz
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
||||||
# ag.vim #
|
|
||||||
|
|
||||||
This plugin is a front for ag, A.K.A.
|
|
||||||
[the_silver_searcher](https://github.com/ggreer/the_silver_searcher). Ag can
|
|
||||||
be used as a replacement for 153% of the uses of `ack`. This plugin will allow
|
|
||||||
you to run ag from vim, and shows the results in a split window.
|
|
||||||
|
|
||||||
## Installation ##
|
|
||||||
|
|
||||||
See [the_silver_searcher's README](https://github.com/ggreer/the_silver_searcher#installing) for its installation instructions (if you haven't installed it already).
|
|
||||||
|
|
||||||
You have to first install [ag](https://github.com/ggreer/the_silver_searcher), itself. On Mac+Homebrew, Gentoo Linux, several others, there's package named `the_silver_searcher`, but if your OS/distro don't have one, the GitHub repo installs fine:
|
|
||||||
|
|
||||||
Vim has various ways of installing plugins, the standard way is in [the documentation](http://vimdoc.sourceforge.net/htmldoc/usr_05.html#plugin), but most people use a plugin to manage their plugins. If you don't already have a preferred plugin manager plugin, why not try one of the following?
|
|
||||||
- [vim-plug](https://github.com/junegunn/vim-plug#readme)
|
|
||||||
- [vim-pathogen](https://github.com/tpope/vim-pathogen#readme)
|
|
||||||
- [Vundle.vim](https://github.com/gmarik/Vundle.vim#readme)
|
|
||||||
- Or, if you don't use any sort of Vim plugin management:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
cd ~/.vim/bundle && git clone https://github.com/rking/ag.vim ag && echo "set runtimepath^=~/.vim/bundle/ag" >> ~/.vimrc
|
|
||||||
```
|
|
||||||
|
|
||||||
Then open vim and run `:helptags ~/.vim/bundle/ag/doc`.
|
|
||||||
|
|
||||||
### Configuration ###
|
|
||||||
|
|
||||||
You can specify a custom ag name and path in your .vimrc like so:
|
|
||||||
|
|
||||||
let g:ag_prg="<custom-ag-path-goes-here> --vimgrep"
|
|
||||||
|
|
||||||
You can configure ag.vim to always start searching from your project root
|
|
||||||
instead of the cwd
|
|
||||||
|
|
||||||
let g:ag_working_path_mode="r"
|
|
||||||
|
|
||||||
## Usage ##
|
|
||||||
|
|
||||||
:Ag [options] {pattern} [{directory}]
|
|
||||||
|
|
||||||
Search recursively in {directory} (which defaults to the current directory) for the {pattern}.
|
|
||||||
|
|
||||||
Files containing the search term will be listed in the split window, along with
|
|
||||||
the line number of the occurrence, once for each occurrence. [Enter] on a line
|
|
||||||
in this window will open the file, and place the cursor on the matching line.
|
|
||||||
|
|
||||||
Just like where you use :grep, :grepadd, :lgrep, and :lgrepadd, you can use `:Ag`, `:AgAdd`, `:LAg`, and `:LAgAdd` respectively. (See `doc/ag.txt`, or install and `:h Ag` for more information.)
|
|
||||||
|
|
||||||
### Gotchas ###
|
|
||||||
|
|
||||||
Some characters have special meaning, and need to be escaped your search pattern. For instance, '#'. You have to escape it like this `:Ag '\\\#define foo'` to search for `#define foo`. (From [blueyed in issue #5](https://github.com/mileszs/ack.vim/issues/5).)
|
|
||||||
|
|
||||||
Sometimes `git grep` is even faster, though in my experience it's not noticeably so.
|
|
||||||
|
|
||||||
### Keyboard Shortcuts ###
|
|
||||||
|
|
||||||
In the quickfix window, you can use:
|
|
||||||
|
|
||||||
e to open file and close the quickfix window
|
|
||||||
o to open (same as enter)
|
|
||||||
go to preview file (open but maintain focus on ag.vim results)
|
|
||||||
t to open in new tab
|
|
||||||
T to open in new tab silently
|
|
||||||
h to open in horizontal split
|
|
||||||
H to open in horizontal split silently
|
|
||||||
v to open in vertical split
|
|
||||||
gv to open in vertical split silently
|
|
||||||
q to close the quickfix window
|
|
||||||
|
|
||||||
### Related Plugin ###
|
|
||||||
[vim-ag-anything](https://github.com/Chun-Yang/vim-ag-anything) adds an 'ga' action to search any text object.
|
|
||||||
|
|
||||||
### Acknowledgements ###
|
|
||||||
|
|
||||||
This Vim plugin is derived (and by derived, I mean copied, almost entirely)
|
|
||||||
from [milesz's ack.vim](https://github.com/mileszs/ack.vim), which I also
|
|
||||||
recommend installing since you might be in a situation where you have ack but
|
|
||||||
not ag, and don't want to stop to install ag. Also, ack supports `--type`, and
|
|
||||||
a few other features.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
task :tgz do
|
|
||||||
sh 'cd ..; tar czvf ag/ag-vim.tgz ag/{plugin,autoload,doc}'
|
|
||||||
end
|
|
||||||
|
|
@ -1,234 +0,0 @@
|
||||||
" NOTE: You must, of course, install ag / the_silver_searcher
|
|
||||||
|
|
||||||
" FIXME: Delete deprecated options below on or after 2016-4 (6 months from when the deprecation warning was added) {{{
|
|
||||||
|
|
||||||
if exists("g:agprg")
|
|
||||||
let g:ag_prg = g:agprg
|
|
||||||
echohl WarningMsg
|
|
||||||
call input('g:agprg is deprecated and will be removed. Please use g:ag_prg')
|
|
||||||
echohl None
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("g:aghighlight")
|
|
||||||
let g:ag_highlight = g:aghighlight
|
|
||||||
echohl WarningMsg
|
|
||||||
call input('g:aghighlight is deprecated and will be removed. Please use g:ag_highlight')
|
|
||||||
echohl None
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("g:agformat")
|
|
||||||
let g:ag_format = g:agformat
|
|
||||||
echohl WarningMsg
|
|
||||||
call input('g:agformat is deprecated and will be removed. Please use g:ag_format')
|
|
||||||
echohl None
|
|
||||||
endif
|
|
||||||
|
|
||||||
" }}} FIXME: Delete the deprecated options above on or after 15-7 (6 months from when they were changed)
|
|
||||||
|
|
||||||
" Location of the ag utility
|
|
||||||
if !exists("g:ag_prg")
|
|
||||||
" --vimgrep (consistent output we can parse) is available from version 0.25.0+
|
|
||||||
if split(system("ag --version"), "[ \n\r\t]")[2] =~ '\d\+.\(\(2[5-9]\)\|\([3-9][0-9]\)\)\(.\d\+\)\?'
|
|
||||||
let g:ag_prg="ag --vimgrep"
|
|
||||||
else
|
|
||||||
" --noheading seems odd here, but see https://github.com/ggreer/the_silver_searcher/issues/361
|
|
||||||
let g:ag_prg="ag --column --nogroup --noheading"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_apply_qmappings")
|
|
||||||
let g:ag_apply_qmappings=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_apply_lmappings")
|
|
||||||
let g:ag_apply_lmappings=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_qhandler")
|
|
||||||
let g:ag_qhandler="botright copen"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_lhandler")
|
|
||||||
let g:ag_lhandler="botright lopen"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_mapping_message")
|
|
||||||
let g:ag_mapping_message=1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists("g:ag_working_path_mode")
|
|
||||||
let g:ag_working_path_mode = 'c'
|
|
||||||
endif
|
|
||||||
|
|
||||||
function! ag#AgBuffer(cmd, args)
|
|
||||||
let l:bufs = filter(range(1, bufnr('$')), 'buflisted(v:val)')
|
|
||||||
let l:files = []
|
|
||||||
for buf in l:bufs
|
|
||||||
let l:file = fnamemodify(bufname(buf), ':p')
|
|
||||||
if !isdirectory(l:file)
|
|
||||||
call add(l:files, l:file)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call ag#Ag(a:cmd, a:args . ' ' . join(l:files, ' '))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! ag#Ag(cmd, args)
|
|
||||||
let l:ag_executable = get(split(g:ag_prg, " "), 0)
|
|
||||||
|
|
||||||
" Ensure that `ag` is installed
|
|
||||||
if !executable(l:ag_executable)
|
|
||||||
echoe "Ag command '" . l:ag_executable . "' was not found. Is the silver searcher installed and on your $PATH?"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If no pattern is provided, search for the word under the cursor
|
|
||||||
if empty(a:args)
|
|
||||||
let l:grepargs = expand("<cword>")
|
|
||||||
else
|
|
||||||
let l:grepargs = a:args . join(a:000, ' ')
|
|
||||||
end
|
|
||||||
|
|
||||||
if empty(l:grepargs)
|
|
||||||
echo "Usage: ':Ag {pattern}' (or just :Ag to search for the word under the cursor). See ':help :Ag' for more information."
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Format, used to manage column jump
|
|
||||||
if a:cmd =~# '-g$'
|
|
||||||
let s:ag_format_backup=g:ag_format
|
|
||||||
let g:ag_format="%f"
|
|
||||||
elseif exists("s:ag_format_backup")
|
|
||||||
let g:ag_format=s:ag_format_backup
|
|
||||||
elseif !exists("g:ag_format")
|
|
||||||
let g:ag_format="%f:%l:%c:%m"
|
|
||||||
endif
|
|
||||||
|
|
||||||
let l:grepprg_bak=&grepprg
|
|
||||||
let l:grepformat_bak=&grepformat
|
|
||||||
let l:t_ti_bak=&t_ti
|
|
||||||
let l:t_te_bak=&t_te
|
|
||||||
try
|
|
||||||
let &grepprg=g:ag_prg
|
|
||||||
let &grepformat=g:ag_format
|
|
||||||
set t_ti=
|
|
||||||
set t_te=
|
|
||||||
if g:ag_working_path_mode ==? 'r' " Try to find the projectroot for current buffer
|
|
||||||
let l:cwd_back = getcwd()
|
|
||||||
let l:cwd = s:guessProjectRoot()
|
|
||||||
try
|
|
||||||
exe "lcd ".l:cwd
|
|
||||||
catch
|
|
||||||
echom 'Failed to change directory to:'.l:cwd
|
|
||||||
finally
|
|
||||||
silent! execute a:cmd . " " . escape(l:grepargs, '|')
|
|
||||||
exe "lcd ".l:cwd_back
|
|
||||||
endtry
|
|
||||||
else " Someone chose an undefined value or 'c' so we revert to the default
|
|
||||||
silent! execute a:cmd . " " . escape(l:grepargs, '|')
|
|
||||||
endif
|
|
||||||
finally
|
|
||||||
let &grepprg=l:grepprg_bak
|
|
||||||
let &grepformat=l:grepformat_bak
|
|
||||||
let &t_ti=l:t_ti_bak
|
|
||||||
let &t_te=l:t_te_bak
|
|
||||||
endtry
|
|
||||||
|
|
||||||
if a:cmd =~# '^l'
|
|
||||||
let l:match_count = len(getloclist(winnr()))
|
|
||||||
else
|
|
||||||
let l:match_count = len(getqflist())
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:cmd =~# '^l' && l:match_count
|
|
||||||
exe g:ag_lhandler
|
|
||||||
let l:apply_mappings = g:ag_apply_lmappings
|
|
||||||
let l:matches_window_prefix = 'l' " we're using the location list
|
|
||||||
elseif l:match_count
|
|
||||||
exe g:ag_qhandler
|
|
||||||
let l:apply_mappings = g:ag_apply_qmappings
|
|
||||||
let l:matches_window_prefix = 'c' " we're using the quickfix window
|
|
||||||
endif
|
|
||||||
|
|
||||||
" If highlighting is on, highlight the search keyword.
|
|
||||||
if exists('g:ag_highlight')
|
|
||||||
let @/ = matchstr(a:args, "\\v(-)\@<!(\<)\@<=\\w+|['\"]\\zs.{-}\\ze['\"]")
|
|
||||||
call feedkeys(":let &hlsearch=1 \| echo \<CR>", 'n')
|
|
||||||
end
|
|
||||||
|
|
||||||
redraw!
|
|
||||||
|
|
||||||
if l:match_count
|
|
||||||
if l:apply_mappings
|
|
||||||
nnoremap <silent> <buffer> h <C-W><CR><C-w>K
|
|
||||||
nnoremap <silent> <buffer> H <C-W><CR><C-w>K<C-w>b
|
|
||||||
nnoremap <silent> <buffer> o <CR>
|
|
||||||
nnoremap <silent> <buffer> t <C-w><CR><C-w>T
|
|
||||||
nnoremap <silent> <buffer> T <C-w><CR><C-w>TgT<C-W><C-W>
|
|
||||||
nnoremap <silent> <buffer> v <C-w><CR><C-w>H<C-W>b<C-W>J<C-W>t
|
|
||||||
|
|
||||||
exe 'nnoremap <silent> <buffer> e <CR><C-w><C-w>:' . l:matches_window_prefix .'close<CR>'
|
|
||||||
exe 'nnoremap <silent> <buffer> go <CR>:' . l:matches_window_prefix . 'open<CR>'
|
|
||||||
exe 'nnoremap <silent> <buffer> q :' . l:matches_window_prefix . 'close<CR>'
|
|
||||||
|
|
||||||
exe 'nnoremap <silent> <buffer> gv :let b:height=winheight(0)<CR><C-w><CR><C-w>H:' . l:matches_window_prefix . 'open<CR><C-w>J:exe printf(":normal %d\<lt>c-w>_", b:height)<CR>'
|
|
||||||
" Interpretation:
|
|
||||||
" :let b:height=winheight(0)<CR> Get the height of the quickfix/location list window
|
|
||||||
" <CR><C-w> Open the current item in a new split
|
|
||||||
" <C-w>H Slam the newly opened window against the left edge
|
|
||||||
" :copen<CR> -or- :lopen<CR> Open either the quickfix window or the location list (whichever we were using)
|
|
||||||
" <C-w>J Slam the quickfix/location list window against the bottom edge
|
|
||||||
" :exe printf(":normal %d\<lt>c-w>_", b:height)<CR> Restore the quickfix/location list window's height from before we opened the match
|
|
||||||
|
|
||||||
if g:ag_mapping_message && l:apply_mappings
|
|
||||||
echom "ag.vim keys: q=quit <cr>/e/t/h/v=enter/edit/tab/split/vsplit go/T/H/gv=preview versions of same"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
else " Close the split window automatically:
|
|
||||||
cclose
|
|
||||||
lclose
|
|
||||||
echohl WarningMsg
|
|
||||||
echom 'No matches for "'.a:args.'"'
|
|
||||||
echohl None
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! ag#AgFromSearch(cmd, args)
|
|
||||||
let search = getreg('/')
|
|
||||||
" translate vim regular expression to perl regular expression.
|
|
||||||
let search = substitute(search,'\(\\<\|\\>\)','\\b','g')
|
|
||||||
call ag#Ag(a:cmd, '"' . search .'" '. a:args)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! ag#GetDocLocations()
|
|
||||||
let dp = ''
|
|
||||||
for p in split(&runtimepath,',')
|
|
||||||
let p = p.'doc/'
|
|
||||||
if isdirectory(p)
|
|
||||||
let dp = p.'*.txt '.dp
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return dp
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! ag#AgHelp(cmd,args)
|
|
||||||
let args = a:args.' '.ag#GetDocLocations()
|
|
||||||
call ag#Ag(a:cmd,args)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:guessProjectRoot()
|
|
||||||
let l:splitsearchdir = split(getcwd(), "/")
|
|
||||||
|
|
||||||
while len(l:splitsearchdir) > 2
|
|
||||||
let l:searchdir = '/'.join(l:splitsearchdir, '/').'/'
|
|
||||||
for l:marker in ['.rootdir', '.git', '.hg', '.svn', 'bzr', '_darcs', 'build.xml']
|
|
||||||
" found it! Return the dir
|
|
||||||
if filereadable(l:searchdir.l:marker) || isdirectory(l:searchdir.l:marker)
|
|
||||||
return l:searchdir
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
let l:splitsearchdir = l:splitsearchdir[0:-2] " Splice the list to get rid of the tail directory
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
" Nothing found, fallback to current working dir
|
|
||||||
return getcwd()
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,174 +0,0 @@
|
||||||
*ag.txt* Plugin that integrates ag with Vim
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
INTRODUCTION *ag*
|
|
||||||
|
|
||||||
This plugin is a front for the_silver_searcher: ag. Ag can be used as a
|
|
||||||
replacement for ack. This plugin will allow you to run ag from vim, and shows
|
|
||||||
the results in a split window.
|
|
||||||
|
|
||||||
:Ag[!] [options] {pattern} [{directory}] *:Ag*
|
|
||||||
|
|
||||||
Search recursively in {directory} (which defaults to the current
|
|
||||||
directory) for the {pattern}. Behaves just like the |:grep| command, but
|
|
||||||
will open the |Quickfix| window for you. If [!] is not given the first
|
|
||||||
error is jumped to.
|
|
||||||
|
|
||||||
:AgBuffer[!] [options] {pattern} *:AgBuffer*
|
|
||||||
|
|
||||||
Search for {pattern} in all open buffers. Behaves just like the |:grep|
|
|
||||||
command, but will open the |Quickfix| window for you. If [!] is not given
|
|
||||||
the first error is jumped to.
|
|
||||||
|
|
||||||
Note: this will not find changes in modified buffers, since ag can only
|
|
||||||
find what is on disk! You can save buffers automatically when searching
|
|
||||||
with the 'autowrite' option. A buffer will be ignored if it is a directory
|
|
||||||
(an explorer, like netrw).
|
|
||||||
|
|
||||||
:AgAdd [options] {pattern} [{directory}] *:AgAdd*
|
|
||||||
|
|
||||||
Just like |:Ag|, but instead of making a new list, the matches are
|
|
||||||
appended to the current |quickfix| list.
|
|
||||||
|
|
||||||
:AgFromSearch [{directory}] *:AgFromSearch*
|
|
||||||
|
|
||||||
Just like |:Ag| but the pattern is from previous search.
|
|
||||||
|
|
||||||
:LAg [options] {pattern} [{directory}] *:LAg*
|
|
||||||
|
|
||||||
Just like |:Ag| but instead of the |quickfix| list, matches are placed in
|
|
||||||
the current |location-list|.
|
|
||||||
|
|
||||||
:LAgBuffer [options] {pattern} *:LAgBuffer*
|
|
||||||
|
|
||||||
Just like |:AgBuffer| but instead of the |quickfix| list, matches are
|
|
||||||
placed in the current |location-list|.
|
|
||||||
|
|
||||||
:LAgAdd [options] {pattern} [{directory}] *:LAgAdd*
|
|
||||||
|
|
||||||
Just like |:AgAdd| but instead of the |quickfix| list, matches are added
|
|
||||||
to the current |location-list|
|
|
||||||
|
|
||||||
:AgFile [options] {pattern} [{directory}] *:AgFile*
|
|
||||||
|
|
||||||
Search recursively in {directory} (which defaults to the current
|
|
||||||
directory) for filenames matching the {pattern}. Behaves just like the
|
|
||||||
|:grep| command, but will open the |Quickfix| window for you.
|
|
||||||
|
|
||||||
:AgHelp[!] [options] {pattern} *:AgHelp*
|
|
||||||
|
|
||||||
Search vim documentation files for the {pattern}. Behaves just like the
|
|
||||||
|:Ag| command, but searches only vim documentation .txt files
|
|
||||||
|
|
||||||
:LAgHelp [options] {pattern} *:LAgHelp*
|
|
||||||
|
|
||||||
Just like |:AgHelp| but instead of the |quickfix| list, matches are placed
|
|
||||||
in the current |location-list|.
|
|
||||||
|
|
||||||
Files containing the search term will be listed in the split window, along
|
|
||||||
with the line number of the occurrence, once for each occurrence. <Enter> on a
|
|
||||||
line in this window will open the file, and place the cursor on the matching
|
|
||||||
line.
|
|
||||||
|
|
||||||
See http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/ for
|
|
||||||
more information.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
OPTIONS *ag-options*
|
|
||||||
|
|
||||||
*g:ag_prg*
|
|
||||||
The location of the Ag program, and any options you want passed to it before
|
|
||||||
searching. Default: "ag --vimgrep" (for parsable output). Example: >
|
|
||||||
let g:ag_prg="ag --vimgrep --smart-case"
|
|
||||||
<
|
|
||||||
Note: the `--vimgrep` option was added in Ag 0.25.0. If ag.vim detects that
|
|
||||||
you're using a lower version, the following default will be used instead: >
|
|
||||||
let g:ag_prg="ag --column --nogroup --noheading"
|
|
||||||
<
|
|
||||||
This works around inconsistent behaviors in earlier Ag versions, but it is
|
|
||||||
recommended that you upgrade if possible for a better experience. `--vimgrep`
|
|
||||||
supports multiple matches on the same line of text, for example.
|
|
||||||
|
|
||||||
For background, see: https://github.com/rking/ag.vim/pull/88
|
|
||||||
|
|
||||||
*g:ag_working_path_mode*
|
|
||||||
A mapping that describes where ag will be run. Default is the current working
|
|
||||||
directory. Specifying 'r' as the argument will tell it to run from the project
|
|
||||||
rootdirectory. For now any other mapping will result to the default.
|
|
||||||
Example:
|
|
||||||
let g:ag_working_path_mode='r'
|
|
||||||
|
|
||||||
*g:ag_highlight*
|
|
||||||
If 1, highlight the search terms after searching. Default: 0. Example: >
|
|
||||||
let g:ag_highlight=1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_format*
|
|
||||||
Format to recognize the matches. See 'errorformat' for more info. Default:
|
|
||||||
"%f" when searching for files, "%f:%l:%c:%m" if not otherwise set. For
|
|
||||||
example, if your `g:ag_prg` is set to just "ag" (no column numbers in the
|
|
||||||
output, so when you jump to a match your cursor will be on the start of the
|
|
||||||
line): >
|
|
||||||
let g:ag_format="%f:%l:%m"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_apply_lmappings*
|
|
||||||
Whether or not to add custom mappings to location list windows opened by this
|
|
||||||
plugin. Only applies if you're using the location list. Default 1. Example: >
|
|
||||||
let g:ag_apply_lmappings=0
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_apply_qmappings*
|
|
||||||
Whether or not to add custom mappings to quickfix windows opened by this
|
|
||||||
plugin. Only applies if you're using the error list. Default 1. Example: >
|
|
||||||
let g:ag_apply_qmappings=0
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_lhandler*
|
|
||||||
A custom command used to open the location list after it's populated.
|
|
||||||
Default: "botright lopen". You might want to set this to change where the
|
|
||||||
location list is opened, or what size it is. Example: >
|
|
||||||
let g:ag_lhandler="topleft lopen"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_qhandler*
|
|
||||||
A custom command used to open the error list after it's populated. Default:
|
|
||||||
"botright copen". You might want to set this to change where the quickfix
|
|
||||||
window is opened, or what size it is. Example: >
|
|
||||||
let g:ag_qhandler="copen 20"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ag_mapping_message*
|
|
||||||
Whether or not to show the message explaining the extra mappings that are
|
|
||||||
added to the results list this plugin populates. This message is not shown if
|
|
||||||
the mappings are not applied (see |g:ag_apply_qmappings| and
|
|
||||||
|g:ag_apply_lmappings| for more info. Default 1. Example: >
|
|
||||||
let g:ag_mapping_message=0
|
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
MAPPINGS *ag-mappings*
|
|
||||||
|
|
||||||
The following keyboard shortcuts are available in the quickfix window:
|
|
||||||
|
|
||||||
e open file and close the quickfix window.
|
|
||||||
|
|
||||||
o open file (same as enter).
|
|
||||||
|
|
||||||
go preview file (open but maintain focus on ag.vim results).
|
|
||||||
|
|
||||||
t open in a new tab.
|
|
||||||
|
|
||||||
T open in new tab silently.
|
|
||||||
|
|
||||||
h open in horizontal split.
|
|
||||||
|
|
||||||
H open in horizontal split silently.
|
|
||||||
|
|
||||||
v open in vertical split.
|
|
||||||
|
|
||||||
gv open in vertical split silently.
|
|
||||||
|
|
||||||
q close the quickfix window.
|
|
||||||
|
|
||||||
vim:tw=78:fo=tcq2:ft=help:norl:
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
" NOTE: You must, of course, install ag / the_silver_searcher
|
|
||||||
command! -bang -nargs=* -complete=file Ag call ag#Ag('grep<bang>',<q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AgBuffer call ag#AgBuffer('grep<bang>',<q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AgAdd call ag#Ag('grepadd<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AgFromSearch call ag#AgFromSearch('grep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file LAg call ag#Ag('lgrep<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file LAgBuffer call ag#AgBuffer('lgrep<bang>',<q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file LAgAdd call ag#Ag('lgrepadd<bang>', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=file AgFile call ag#Ag('grep<bang> -g', <q-args>)
|
|
||||||
command! -bang -nargs=* -complete=help AgHelp call ag#AgHelp('grep<bang>',<q-args>)
|
|
||||||
command! -bang -nargs=* -complete=help LAgHelp call ag#AgHelp('lgrep<bang>',<q-args>)
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
created by
|
|
||||||
---------
|
|
||||||
[jeff lanzarotta](http://www.vim.org/account/profile.php?user_id=97)
|
|
||||||
|
|
||||||
script type
|
|
||||||
----------
|
|
||||||
utility
|
|
||||||
|
|
||||||
description
|
|
||||||
-----------
|
|
||||||
With bufexplorer, you can quickly and easily switch between buffers by using the one of the default public interfaces:
|
|
||||||
|
|
||||||
'\be' (normal open) or
|
|
||||||
'\bs' (force horizontal split open) or
|
|
||||||
'\bv' (force vertical split open)
|
|
||||||
|
|
||||||
Once the bufexplorer window is open you can use the normal movement keys (hjkl) to move around and then use <Enter> or <Left-Mouse-Click> to select the buffer you would like to open. If you would like to have the selected buffer opened in a new tab, simply press either <Shift-Enter> or 't'. Please note that when opening a buffer in a tab, that if the buffer is already in another tab, bufexplorer can switch to that tab automatically for you if you would like. More about that in the supplied VIM help.
|
|
||||||
|
|
||||||
Bufexplorer also offers various options including:
|
|
||||||
|
|
||||||
* Display the list of buffers in various sort orders including:
|
|
||||||
* Most Recently Used (MRU) which is the default
|
|
||||||
* Buffer number
|
|
||||||
* File name
|
|
||||||
* File extension
|
|
||||||
* Full file path name
|
|
||||||
* Delete buffer from list
|
|
||||||
|
|
||||||
For more about options, sort orders, configuration options, etc. please see the supplied VIM help.
|
|
||||||
|
|
||||||
install details
|
|
||||||
---------------
|
|
||||||
Simply unzip bufexplorer.zip into a directory in your 'runtimepath', usually ~/.vim or c:\vimfiles, and restart Vim. This zip file contains plugin\bufexplorer.vim, and doc\bufexplorer.txt. See ':help add-local-help' on how to add bufexplorer.txt to vim's help system.
|
|
||||||
|
|
||||||
NOTE
|
|
||||||
----
|
|
||||||
Version 7.0.12 and above will ONLY work with 7.0 and above of Vim.
|
|
||||||
|
|
||||||
**IMPORTANT**: If you have a version prior to 7.1.2 that contains an autoload\bufexplorer.vim file, please REMOVE the autoload\bufexlorer.vim AND the plugin\bufexplorer.vim files before installing a new version.
|
|
||||||
|
|
@ -1,513 +0,0 @@
|
||||||
*bufexplorer.txt* Buffer Explorer Last Change: 22 Oct 2010
|
|
||||||
|
|
||||||
Buffer Explorer *buffer-explorer* *bufexplorer*
|
|
||||||
Version 7.2.8
|
|
||||||
|
|
||||||
Plugin for easily exploring (or browsing) Vim |:buffers|.
|
|
||||||
|
|
||||||
|bufexplorer-installation| Installation
|
|
||||||
|bufexplorer-usage| Usage
|
|
||||||
|bufexplorer-windowlayout| Window Layout
|
|
||||||
|bufexplorer-customization| Customization
|
|
||||||
|bufexplorer-changelog| Change Log
|
|
||||||
|bufexplorer-todo| Todo
|
|
||||||
|bufexplorer-credits| Credits
|
|
||||||
|
|
||||||
For Vim version 7.0 and above.
|
|
||||||
This plugin is only available if 'compatible' is not set.
|
|
||||||
|
|
||||||
{Vi does not have any of this}
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
INSTALLATION *bufexplorer-installation*
|
|
||||||
|
|
||||||
To install:
|
|
||||||
- Download the bufexplorer.zip.
|
|
||||||
- Extract the zip archive into your runtime directory.
|
|
||||||
The archive contains plugin/bufexplorer.vim, and doc/bufexplorer.txt.
|
|
||||||
- Start Vim or goto an existing instance of Vim.
|
|
||||||
- Execute the following command:
|
|
||||||
>
|
|
||||||
:helptag <your runtime directory>/doc
|
|
||||||
<
|
|
||||||
This will generate all the help tags for any file located in the doc
|
|
||||||
directory.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
USAGE *bufexplorer-usage*
|
|
||||||
|
|
||||||
To start exploring in the current window, use: >
|
|
||||||
\be or :BufExplorer
|
|
||||||
To start exploring in a newly split horizontal window, use: >
|
|
||||||
\bs or :BufExplorerHorizontalSplit
|
|
||||||
To start exploring in a newly split vertical window, use: >
|
|
||||||
\bv or :BufExplorerVerticalSplit
|
|
||||||
|
|
||||||
If you would like to use something other than '\', you may simply change the
|
|
||||||
leader (see |mapleader|).
|
|
||||||
|
|
||||||
Note: If the current buffer is modified when bufexplorer started, the current
|
|
||||||
window is always split and the new bufexplorer is displayed in that new
|
|
||||||
window.
|
|
||||||
|
|
||||||
Commands to use once exploring:
|
|
||||||
|
|
||||||
<F1> Toggle help information.
|
|
||||||
<enter> Opens the buffer that is under the cursor into the current
|
|
||||||
window.
|
|
||||||
<leftmouse> Opens the buffer that is under the cursor into the current
|
|
||||||
window.
|
|
||||||
<shift-enter> Opens the buffer that is under the cursor in another tab.
|
|
||||||
d |:delete|the buffer under the cursor from the list. The
|
|
||||||
buffer's 'buflisted' is cleared. This allows for the buffer to
|
|
||||||
be displayed again using the 'show unlisted' command.
|
|
||||||
R Toggles relative path/absolute path.
|
|
||||||
T Toggles to show only buffers for this tab or not.
|
|
||||||
D |:wipeout|the buffer under the cursor from the list. When a
|
|
||||||
buffers is wiped, it will not be shown when unlisted buffer are
|
|
||||||
displayed.
|
|
||||||
f Toggles whether you are taken to the active window when
|
|
||||||
selecting a buffer or not.
|
|
||||||
o Opens the buffer that is under the cursor into the current
|
|
||||||
window.
|
|
||||||
p Toggles the showing of a split filename/pathname.
|
|
||||||
q Quit exploring.
|
|
||||||
r Reverses the order the buffers are listed in.
|
|
||||||
s Selects the order the buffers are listed in. Either by buffer
|
|
||||||
number, file name, file extension, most recently used (MRU), or
|
|
||||||
full path.
|
|
||||||
t Opens the buffer that is under the cursor in another tab.
|
|
||||||
u Toggles the showing of "unlisted" buffers.
|
|
||||||
|
|
||||||
Once invoked, Buffer Explorer displays a sorted list (MRU is the default
|
|
||||||
sort method) of all the buffers that are currently opened. You are then
|
|
||||||
able to move the cursor to the line containing the buffer's name you are
|
|
||||||
wanting to act upon. Once you have selected the buffer you would like,
|
|
||||||
you can then either open it, close it(delete), resort the list, reverse
|
|
||||||
the sort, quit exploring and so on...
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
WINDOW LAYOUT *bufexplorer-windowlayout*
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
" Press <F1> for Help
|
|
||||||
" Sorted by mru | Locate buffer | Absolute Split path
|
|
||||||
"=
|
|
||||||
01 %a bufexplorer.txt C:\Vim\vimfiles\doc line 87
|
|
||||||
02 # bufexplorer.vim c:\Vim\vimfiles\plugin line 1
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
| | | | |
|
|
||||||
| | | | +-- Current Line #.
|
|
||||||
| | | +-- Relative/Full Path
|
|
||||||
| | +-- Buffer Name.
|
|
||||||
| +-- Buffer Attributes. See|:buffers|for more information.
|
|
||||||
+-- Buffer Number. See|:buffers|for more information.
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
CUSTOMIZATION *bufexplorer-customization*
|
|
||||||
|
|
||||||
*g:bufExplorerChgWin*
|
|
||||||
If set, bufexplorer will bring up the selected buffer in the window specified
|
|
||||||
by g:bufExplorerChgWin.
|
|
||||||
|
|
||||||
*g:bufExplorerDefaultHelp*
|
|
||||||
To control whether the default help is displayed or not, use: >
|
|
||||||
let g:bufExplorerDefaultHelp=0 " Do not show default help.
|
|
||||||
let g:bufExplorerDefaultHelp=1 " Show default help.
|
|
||||||
The default is to show the default help.
|
|
||||||
|
|
||||||
*g:bufExplorerDetailedHelp*
|
|
||||||
To control whether detailed help is display by, use: >
|
|
||||||
let g:bufExplorerDetailedHelp=0 " Do not show detailed help.
|
|
||||||
let g:bufExplorerDetailedHelp=1 " Show detailed help.
|
|
||||||
The default is NOT to show detailed help.
|
|
||||||
|
|
||||||
*g:bufExplorerFindActive*
|
|
||||||
To control whether you are taken to the active window when selecting a buffer,
|
|
||||||
use: >
|
|
||||||
let g:bufExplorerFindActive=0 " Do not go to active window.
|
|
||||||
let g:bufExplorerFindActive=1 " Go to active window.
|
|
||||||
The default is to be taken to the active window.
|
|
||||||
|
|
||||||
*g:bufExplorerFuncRef*
|
|
||||||
When a buffer is selected, the functions specified either singly or as a list
|
|
||||||
will be called.
|
|
||||||
|
|
||||||
*g:bufExplorerReverseSort*
|
|
||||||
To control whether to sort the buffer in reverse order or not, use: >
|
|
||||||
let g:bufExplorerReverseSort=0 " Do not sort in reverse order.
|
|
||||||
let g:bufExplorerReverseSort=1 " Sort in reverse order.
|
|
||||||
The default is NOT to sort in reverse order.
|
|
||||||
|
|
||||||
*g:bufExplorerShowDirectories*
|
|
||||||
Directories usually show up in the list from using a command like ":e .".
|
|
||||||
To control whether to show directories in the buffer list or not, use: >
|
|
||||||
let g:bufExplorerShowDirectories=1 " Show directories.
|
|
||||||
let g:bufExplorerShowDirectories=0 " Don't show directories.
|
|
||||||
The default is to show directories.
|
|
||||||
|
|
||||||
*g:bufExplorerShowRelativePath*
|
|
||||||
To control whether to show absolute paths or relative to the current
|
|
||||||
directory, use: >
|
|
||||||
let g:bufExplorerShowRelativePath=0 " Show absolute paths.
|
|
||||||
let g:bufExplorerShowRelativePath=1 " Show relative paths.
|
|
||||||
The default is to show absolute paths.
|
|
||||||
|
|
||||||
*g:bufExplorerShowTabBuffer*
|
|
||||||
To control weither or not to show buffers on for the specific tab or not, use: >
|
|
||||||
let g:bufExplorerShowTabBuffer=0 " No.
|
|
||||||
let g:bufExplorerShowTabBuffer=1 " Yes.
|
|
||||||
The default is not to show.
|
|
||||||
|
|
||||||
*g:bufExplorerShowUnlisted*
|
|
||||||
To control whether to show unlisted buffer or not, use: >
|
|
||||||
let g:bufExplorerShowUnlisted=0 " Do not show unlisted buffers.
|
|
||||||
let g:bufExplorerShowUnlisted=1 " Show unlisted buffers.
|
|
||||||
The default is to NOT show unlisted buffers.
|
|
||||||
|
|
||||||
*g:bufExplorerSortBy*
|
|
||||||
To control what field the buffers are sorted by, use: >
|
|
||||||
let g:bufExplorerSortBy='extension' " Sort by file extension.
|
|
||||||
let g:bufExplorerSortBy='fullpath' " Sort by full file path name.
|
|
||||||
let g:bufExplorerSortBy='mru' " Sort by most recently used.
|
|
||||||
let g:bufExplorerSortBy='name' " Sort by the buffer's name.
|
|
||||||
let g:bufExplorerSortBy='number' " Sort by the buffer's number.
|
|
||||||
The default is to sort by mru.
|
|
||||||
|
|
||||||
*g:bufExplorerSplitBelow*
|
|
||||||
To control where the new split window will be placed above or below the
|
|
||||||
current window, use: >
|
|
||||||
let g:bufExplorerSplitBelow=1 " Split new window below current.
|
|
||||||
let g:bufExplorerSplitBelow=0 " Split new window above current.
|
|
||||||
The default is to use what ever is set by the global &splitbelow
|
|
||||||
variable.
|
|
||||||
|
|
||||||
*g:bufExplorerSplitOutPathName*
|
|
||||||
To control whether to split out the path and file name or not, use: >
|
|
||||||
let g:bufExplorerSplitOutPathName=1 " Split the path and file name.
|
|
||||||
let g:bufExplorerSplitOutPathName=0 " Don't split the path and file
|
|
||||||
" name.
|
|
||||||
The default is to split the path and file name.
|
|
||||||
|
|
||||||
*g:bufExplorerSplitRight*
|
|
||||||
To control where the new vsplit window will be placed to the left or right of
|
|
||||||
current window, use: >
|
|
||||||
let g:bufExplorerSplitRight=0 " Split left.
|
|
||||||
let g:bufExplorerSplitRight=1 " Split right.
|
|
||||||
The default is to use the global &splitright.
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
CHANGE LOG *bufexplorer-changelog*
|
|
||||||
|
|
||||||
7.2.8 - Enhancements:
|
|
||||||
* Thanks to Charles Campbell for integrating bufexplorer with GDBMGR.
|
|
||||||
http://mysite.verizon.net/astronaut/vim/index.html#GDBMGR
|
|
||||||
7.2.7 - Fix:
|
|
||||||
* My 1st attempt to fix the "cache" issue where buffers information
|
|
||||||
has changed but the cache/display does not reflect those changes.
|
|
||||||
More work still needs to be done.
|
|
||||||
7.2.6 - Fix:
|
|
||||||
* Thanks to Michael Henry for pointing out that I totally forgot to
|
|
||||||
update the inline help to reflect the previous change to the 'd'
|
|
||||||
and 'D' keys. Opps!
|
|
||||||
7.2.5 - Fix:
|
|
||||||
* Philip Morant suggested switching the command (bwipe) associated
|
|
||||||
with the 'd' key with the command (bdelete) associated with the 'D'
|
|
||||||
key. This made sense since the 'd' key is more likely to be used
|
|
||||||
compared to the 'D' key.
|
|
||||||
7.2.4 - Fix:
|
|
||||||
* I did not implement the patch provided by Godefroid Chapelle
|
|
||||||
correctly. I missed one line which happened to be the most
|
|
||||||
important one :)
|
|
||||||
7.2.3 - Enhancements:
|
|
||||||
* Thanks to David Fishburn for helping me out with a much needed
|
|
||||||
code overhaul as well as some awesome performance enhancements.
|
|
||||||
He also reworked the handling of tabs.
|
|
||||||
* Thanks to Vladimir Dobriakov for making the suggestions on
|
|
||||||
enhancing the documentation to include a better explaination of
|
|
||||||
what is contained in the main bufexplorer window.
|
|
||||||
* Thanks to Yuriy Ershov for added code that when the bufexplorer
|
|
||||||
window is opened, the cursor is now positioned at the line with the
|
|
||||||
active buffer (useful in non-MRU sort modes).
|
|
||||||
* Yuriy also added the abiltiy to cycle through the sort fields in
|
|
||||||
reverse order.
|
|
||||||
Fixes:
|
|
||||||
* Thanks to Michael Henry for supplying a patch that allows
|
|
||||||
bufexplorer to be opened even when there is one buffer or less.
|
|
||||||
* Thanks to Godefroid Chapelle for supplying a patch that fixed
|
|
||||||
MRU sort order after loading a session.
|
|
||||||
7.2.2 - Fixes:
|
|
||||||
* Thanks to David L. Dight for spotting and fixing an issue when
|
|
||||||
using ctrl^. bufexplorer would incorrectly handle the previous
|
|
||||||
buffer so that when ctrl^ was pressed the incorrect file was opened.
|
|
||||||
7.2.1 - Fixes:
|
|
||||||
* Thanks to Dimitar for spotting and fixing a feature that was
|
|
||||||
inadvertently left out of the previous version. The feature was
|
|
||||||
when bufexplorer was used together with WinManager, you could use
|
|
||||||
the tab key to open a buffer in a split window.
|
|
||||||
7.2.0 - Enhancements:
|
|
||||||
* For all those missing the \bs and \bv commands, these have now
|
|
||||||
returned. Thanks to Phil O'Connell for asking for the return of
|
|
||||||
these missing features and helping test out this version.
|
|
||||||
Fixes:
|
|
||||||
* Fixed problem with the bufExplorerFindActive code not working
|
|
||||||
correctly.
|
|
||||||
* Fixed an incompatibility between bufexplorer and netrw that caused
|
|
||||||
buffers to be incorrectly removed from the MRU list.
|
|
||||||
7.1.7 - Fixes:
|
|
||||||
* TaCahiroy fixed several issues related to opening a buffer in a
|
|
||||||
tab.
|
|
||||||
7.1.6 - Fixes:
|
|
||||||
* Removed ff=unix from modeline in bufexplorer.txt. Found by Bill
|
|
||||||
McCarthy.
|
|
||||||
7.1.5 - Fixes:
|
|
||||||
* Could not open unnamed buffers. Fixed by TaCahiroy.
|
|
||||||
7.1.4 - Fixes:
|
|
||||||
* Sometimes when a file's path has 'white space' in it, extra buffers
|
|
||||||
would be created containing each piece of the path. i.e:
|
|
||||||
opening c:\document and settings\test.txt would create a buffer
|
|
||||||
named "and" and a buffer named "Documents". This was reported and
|
|
||||||
fixed by TaCa Yoss.
|
|
||||||
7.1.3 - Fixes:
|
|
||||||
* Added code to allow only one instance of the plugin to run at a
|
|
||||||
time. Thanks Dennis Hostetler.
|
|
||||||
7.1.2 - Fixes:
|
|
||||||
* Fixed a jumplist issue spotted by JiangJun. I overlooked the
|
|
||||||
'jumplist' and with a couple calls to 'keepjumps', everything is
|
|
||||||
fine again.
|
|
||||||
* Went back to just having a plugin file, no autoload file. By having
|
|
||||||
the autoload, WinManager was no longer working and without really
|
|
||||||
digging into the cause, it was easier to go back to using just a
|
|
||||||
plugin file.
|
|
||||||
7.1.1 - Fixes:
|
|
||||||
* A problem spotted by Thomas Arendsen Hein.
|
|
||||||
When running Vim (7.1.94), error E493 was being thrown.
|
|
||||||
Enhancements:
|
|
||||||
* Added 'D' for 'delete' buffer as the 'd' command was a 'wipe'
|
|
||||||
buffer.
|
|
||||||
7.1.0 - Another 'major' update, some by Dave Larson, some by me.
|
|
||||||
* Making use of 'autoload' now to make the plugin load quicker.
|
|
||||||
* Removed '\bs' and '\bv'. These are now controlled by the user. The
|
|
||||||
user can issue a ':sp' or ':vs' to create a horizontal or vertical
|
|
||||||
split window and then issue a '\be'
|
|
||||||
* Added handling of tabs.
|
|
||||||
7.0.17 - Fixed issue with 'drop' command.
|
|
||||||
Various enhancements and improvements.
|
|
||||||
7.0.16 - Fixed issue reported by Liu Jiaping on non Windows systems, which was
|
|
||||||
...
|
|
||||||
Open file1, open file2, modify file1, open bufexplorer, you get the
|
|
||||||
following error:
|
|
||||||
|
|
||||||
--------8<--------
|
|
||||||
Error detected while processing function
|
|
||||||
<SNR>14_StartBufExplorer..<SNR>14_SplitOpen:
|
|
||||||
line 4:
|
|
||||||
E37: No write since last change (add ! to override)
|
|
||||||
|
|
||||||
But the worse thing is, when I want to save the current buffer and
|
|
||||||
type ':w', I get another error message:
|
|
||||||
E382: Cannot write, 'buftype' option is set
|
|
||||||
--------8<--------
|
|
||||||
|
|
||||||
7.0.15 - Thanks to Mark Smithfield for suggesting bufexplorer needed to handle
|
|
||||||
the ':args' command.
|
|
||||||
7.0.14 - Thanks to Randall Hansen for removing the requirement of terminal
|
|
||||||
versions to be recompiled with 'gui' support so the 'drop' command
|
|
||||||
would work. The 'drop' command is really not needed in terminal
|
|
||||||
versions.
|
|
||||||
7.0.13 - Fixed integration with WinManager.
|
|
||||||
Thanks to Dave Eggum for another update.
|
|
||||||
- Fix: The detailed help didn't display the mapping for toggling
|
|
||||||
the split type, even though the split type is displayed.
|
|
||||||
- Fixed incorrect description in the detailed help for toggling
|
|
||||||
relative or full paths.
|
|
||||||
- Deprecated s:ExtractBufferNbr(). Vim's str2nr() does the same
|
|
||||||
thing.
|
|
||||||
- Created a s:Set() function that sets a variable only if it hasn't
|
|
||||||
already been defined. It's useful for initializing all those
|
|
||||||
default settings.
|
|
||||||
- Removed checks for repetitive command definitions. They were
|
|
||||||
unnecessary.
|
|
||||||
- Made the help highlighting a little more fancy.
|
|
||||||
- Minor reverse compatibility issue: Changed ambiguous setting
|
|
||||||
names to be more descriptive of what they do (also makes the code
|
|
||||||
easier to follow):
|
|
||||||
Changed bufExplorerSortDirection to bufExplorerReverseSort
|
|
||||||
Changed bufExplorerSplitType to bufExplorerSplitVertical
|
|
||||||
Changed bufExplorerOpenMode to bufExplorerUseCurrentWindow
|
|
||||||
- When the BufExplorer window closes, all the file-local marks are
|
|
||||||
now deleted. This may have the benefit of cleaning up some of the
|
|
||||||
jumplist.
|
|
||||||
- Changed the name of the parameter for StartBufExplorer from
|
|
||||||
"split" to "open". The parameter is a string which specifies how
|
|
||||||
the buffer will be open, not if it is split or not.
|
|
||||||
- Deprecated DoAnyMoreBuffersExist() - it is a one line function
|
|
||||||
only used in one spot.
|
|
||||||
- Created four functions (SplitOpen(), RebuildBufferList(),
|
|
||||||
UpdateHelpStatus() and ReSortListing()) all with one purpose - to
|
|
||||||
reduce repeated code.
|
|
||||||
- Changed the name of AddHeader() to CreateHelp() to be more
|
|
||||||
descriptive of what it does. It now returns an array instead of
|
|
||||||
updating the window directly. This has the benefit of making the
|
|
||||||
code more efficient since the text the function returns is used a
|
|
||||||
little differently in the two places the function is called.
|
|
||||||
- Other minor simplifications.
|
|
||||||
7.0.12 - MAJOR Update.
|
|
||||||
This version will ONLY run with Vim version 7.0 or greater.
|
|
||||||
Dave Eggum has made some 'significant' updates to this latest
|
|
||||||
version:
|
|
||||||
- Added BufExplorerGetAltBuf() global function to be used in the
|
|
||||||
user’s rulerformat.
|
|
||||||
- Added g:bufExplorerSplitRight option.
|
|
||||||
- Added g:bufExplorerShowRelativePath option with mapping.
|
|
||||||
- Added current line highlighting.
|
|
||||||
- The split type can now be changed whether bufexplorer is opened
|
|
||||||
in split mode or not.
|
|
||||||
- Various major and minor bug fixes and speed improvements.
|
|
||||||
- Sort by extension.
|
|
||||||
Other improvements/changes:
|
|
||||||
- Changed the help key from '?' to <F1> to be more 'standard'.
|
|
||||||
- Fixed splitting of vertical bufexplorer window.
|
|
||||||
Hopefully I have not forgot something :)
|
|
||||||
7.0.11 - Fixed a couple of highlighting bugs, reported by David Eggum. He also
|
|
||||||
changed passive voice to active on a couple of warning messages.
|
|
||||||
7.0.10 - Fixed bug report by Xiangjiang Ma. If the 'ssl' option is set,
|
|
||||||
the slash character used when displaying the path was incorrect.
|
|
||||||
7.0.9 - Martin Grenfell found and eliminated an annoying bug in the
|
|
||||||
bufexplorer/winmanager integration. The bug was were an
|
|
||||||
annoying message would be displayed when a window was split or
|
|
||||||
a new file was opened in a new window. Thanks Martin!
|
|
||||||
7.0.8 - Thanks to Mike Li for catching a bug in the WinManager integration.
|
|
||||||
The bug was related to the incorrect displaying of the buffer
|
|
||||||
explorer's window title.
|
|
||||||
7.0.7 - Thanks to Jeremy Cowgar for adding a new enhancement. This
|
|
||||||
enhancement allows the user to press 'S', that is capital S, which
|
|
||||||
will open the buffer under the cursor in a newly created split
|
|
||||||
window.
|
|
||||||
7.0.6 - Thanks to Larry Zhang for finding a bug in the "split" buffer code.
|
|
||||||
If you force set g:bufExplorerSplitType='v' in your vimrc, and if you
|
|
||||||
tried to do a \bs to split the bufexplorer window, it would always
|
|
||||||
split horizontal, not vertical. He also found that I had a typeo in
|
|
||||||
that the variable g:bufExplorerSplitVertSize was all lower case in
|
|
||||||
the documentation which was incorrect.
|
|
||||||
7.0.5 - Thanks to Mun Johl for pointing out a bug that if a buffer was
|
|
||||||
modified, the '+' was not showing up correctly.
|
|
||||||
7.0.4 - Fixed a problem discovered first by Xiangjiang Ma. Well since I've
|
|
||||||
been using vim 7.0 and not 6.3, I started using a function (getftype)
|
|
||||||
that is not in 6.3. So for backward compatibility, I conditionaly use
|
|
||||||
this function now. Thus, the g:bufExplorerShowDirectories feature is
|
|
||||||
only available when using vim 7.0 and above.
|
|
||||||
7.0.3 - Thanks to Erwin Waterlander for finding a problem when the last
|
|
||||||
buffer was deleted. This issue got me to rewrite the buffer display
|
|
||||||
logic (which I've wanted to do for sometime now).
|
|
||||||
Also great thanks to Dave Eggum for coming up with idea for
|
|
||||||
g:bufExplorerShowDirectories. Read the above information about this
|
|
||||||
feature.
|
|
||||||
7.0.2 - Thanks to Thomas Arendsen Hein for finding a problem when a user
|
|
||||||
has the default help turned off and then brought up the explorer. An
|
|
||||||
E493 would be displayed.
|
|
||||||
7.0.1 - Thanks to Erwin Waterlander for finding a couple problems.
|
|
||||||
The first problem allowed a modified buffer to be deleted. Opps! The
|
|
||||||
second problem occurred when several files were opened, BufExplorer
|
|
||||||
was started, the current buffer was deleted using the 'd' option, and
|
|
||||||
then BufExplorer was exited. The deleted buffer was still visible
|
|
||||||
while it is not in the buffers list. Opps again!
|
|
||||||
7.0.0 - Thanks to Shankar R. for suggesting to add the ability to set
|
|
||||||
the fixed width (g:bufExplorerSplitVertSize) of a new window
|
|
||||||
when opening bufexplorer vertically and fixed height
|
|
||||||
(g:bufExplorerSplitHorzSize) of a new window when opening
|
|
||||||
bufexplorer horizontally. By default, the windows are normally
|
|
||||||
split to use half the existing width or height.
|
|
||||||
6.3.0 - Added keepjumps so that the jumps list would not get cluttered with
|
|
||||||
bufexplorer related stuff.
|
|
||||||
6.2.3 - Thanks to Jay Logan for finding a bug in the vertical split position
|
|
||||||
of the code. When selecting that the window was to be split
|
|
||||||
vertically by doing a '\bv', from then on, all splits, i.e. '\bs',
|
|
||||||
were split vertically, even though g:bufExplorerSplitType was not set
|
|
||||||
to 'v'.
|
|
||||||
6.2.2 - Thanks to Patrik Modesto for adding a small improvement. For some
|
|
||||||
reason his bufexplorer window was always showing up folded. He added
|
|
||||||
'setlocal nofoldenable' and it was fixed.
|
|
||||||
6.2.1 - Thanks goes out to Takashi Matsuo for added the 'fullPath' sorting
|
|
||||||
logic and option.
|
|
||||||
6.2.0 - Thanks goes out to Simon Johann-Ganter for spotting and fixing a
|
|
||||||
problem in that the last search pattern is overridden by the search
|
|
||||||
pattern for blank lines.
|
|
||||||
6.1.6 - Thanks to Artem Chuprina for finding a pesky bug that has been around
|
|
||||||
for sometime now. The <esc> key mapping was causing the buffer
|
|
||||||
explored to close prematurely when vim was run in an xterm. The <esc>
|
|
||||||
key mapping is now removed.
|
|
||||||
6.1.5 - Thanks to Khorev Sergey. Added option to show default help or not.
|
|
||||||
6.1.4 - Thanks goes out to Valery Kondakoff for suggesting the addition of
|
|
||||||
setlocal nonumber and foldcolumn=0. This allows for line numbering
|
|
||||||
and folding to be turned off temporarily while in the explorer.
|
|
||||||
6.1.3 - Added folding. Did some code cleanup. Added the ability to force the
|
|
||||||
newly split window to be temporarily vertical, which was suggested by
|
|
||||||
Thomas Glanzmann.
|
|
||||||
6.1.2 - Now pressing the <esc> key will quit, just like 'q'.
|
|
||||||
Added folds to hide winmanager configuration.
|
|
||||||
If anyone had the 'C' option in their cpoptions they would receive
|
|
||||||
a E10 error on startup of BufExplorer. cpo is now saved, updated and
|
|
||||||
restored. Thanks to Charles E Campbell, Jr.
|
|
||||||
Attempted to make sure there can only be one BufExplorer window open
|
|
||||||
at a time.
|
|
||||||
6.1.1 - Thanks to Brian D. Goodwin for adding toupper to FileNameCmp. This
|
|
||||||
way buffers sorted by name will be in the correct order regardless of
|
|
||||||
case.
|
|
||||||
6.0.16 - Thanks to Andre Pang for the original patch/idea to get bufexplorer
|
|
||||||
to work in insertmode/modeless mode (evim). Added Initialize
|
|
||||||
and Cleanup autocommands to handle commands that need to be
|
|
||||||
performed when starting or leaving bufexplorer.
|
|
||||||
6.0.15 - Srinath Avadhanulax added a patch for winmanager.vim.
|
|
||||||
6.0.14 - Fix a few more bug that I thought I already had fixed. Thanks
|
|
||||||
to Eric Bloodworth for adding 'Open Mode/Edit in Place'. Added
|
|
||||||
vertical splitting.
|
|
||||||
6.0.13 - Thanks to Charles E Campbell, Jr. for pointing out some embarrassing
|
|
||||||
typos that I had in the documentation. I guess I need to run
|
|
||||||
the spell checker more :o)
|
|
||||||
6.0.12 - Thanks to Madoka Machitani, for the tip on adding the augroup command
|
|
||||||
around the MRUList autocommands.
|
|
||||||
6.0.11 - Fixed bug report by Xiangjiang Ma. '"=' was being added to the
|
|
||||||
search history which messed up hlsearch.
|
|
||||||
6.0.10 - Added the necessary hooks so that the Srinath Avadhanula's
|
|
||||||
winmanager.vim script could more easily integrate with this script.
|
|
||||||
Tried to improve performance.
|
|
||||||
6.0.9 - Added MRU (Most Recently Used) sort ordering.
|
|
||||||
6.0.8 - Was not resetting the showcmd command correctly.
|
|
||||||
Added nifty help file.
|
|
||||||
6.0.7 - Thanks to Brett Carlane for some great enhancements. Some are added,
|
|
||||||
some are not, yet. Added highlighting of current and alternate
|
|
||||||
filenames. Added splitting of path/filename toggle. Reworked
|
|
||||||
ShowBuffers().
|
|
||||||
Changed my email address.
|
|
||||||
6.0.6 - Copyright notice added. Needed this so that it could be distributed
|
|
||||||
with Debian Linux. Fixed problem with the SortListing() function
|
|
||||||
failing when there was only one buffer to display.
|
|
||||||
6.0.5 - Fixed problems reported by David Pascoe, in that you where unable to
|
|
||||||
hit 'd' on a buffer that belonged to a files that no longer existed
|
|
||||||
and that the 'yank' buffer was being overridden by the help text when
|
|
||||||
the bufexplorer was opened.
|
|
||||||
6.0.4 - Thanks to Charles Campbell, Jr. for making this plugin more plugin
|
|
||||||
*compliant*, adding default keymappings of <Leader>be and <Leader>bs
|
|
||||||
as well as fixing the 'w:sortDirLabel not being defined' bug.
|
|
||||||
6.0.3 - Added sorting capabilities. Sort taken from explorer.vim.
|
|
||||||
6.0.2 - Can't remember. (2001-07-25)
|
|
||||||
6.0.1 - Initial release.
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
TODO *bufexplorer-todo*
|
|
||||||
|
|
||||||
- Nothing as of now, buf if you have any suggestions, drop me an email.
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
CREDITS *bufexplorer-credits*
|
|
||||||
|
|
||||||
Author: Jeff Lanzarotta <delux256-vim at yahoo dot com>
|
|
||||||
|
|
||||||
Credit must go out to Bram Moolenaar and all the Vim developers for
|
|
||||||
making the world's best editor (IMHO). I also want to thank everyone who
|
|
||||||
helped and gave me suggestions. I wouldn't want to leave anyone out so I
|
|
||||||
won't list names.
|
|
||||||
|
|
||||||
===============================================================================
|
|
||||||
vim:tw=78:noet:wrap:ts=8:ft=help:norl:
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,6 +0,0 @@
|
||||||
*.markdown
|
|
||||||
*.zip
|
|
||||||
note.txt
|
|
||||||
tags
|
|
||||||
.hg*
|
|
||||||
tmp/*
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,140 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/bookmarkdir.vim
|
|
||||||
" Description: Bookmarked directories extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_bookmarkdir') && g:loaded_ctrlp_bookmarkdir
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_bookmarkdir = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#bookmarkdir#init()',
|
|
||||||
\ 'accept': 'ctrlp#bookmarkdir#accept',
|
|
||||||
\ 'lname': 'bookmarked dirs',
|
|
||||||
\ 'sname': 'bkd',
|
|
||||||
\ 'type': 'tabs',
|
|
||||||
\ 'opmul': 1,
|
|
||||||
\ 'nolim': 1,
|
|
||||||
\ 'wipe': 'ctrlp#bookmarkdir#remove',
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:getinput(str, ...)
|
|
||||||
echoh Identifier
|
|
||||||
cal inputsave()
|
|
||||||
let input = call('input', a:0 ? [a:str] + a:000 : [a:str])
|
|
||||||
cal inputrestore()
|
|
||||||
echoh None
|
|
||||||
retu input
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:cachefile()
|
|
||||||
if !exists('s:cadir') || !exists('s:cafile')
|
|
||||||
let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'bkd'
|
|
||||||
let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
|
|
||||||
en
|
|
||||||
retu s:cafile
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:writecache(lines)
|
|
||||||
cal ctrlp#utils#writecache(a:lines, s:cadir, s:cafile)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:getbookmarks()
|
|
||||||
retu ctrlp#utils#readfile(s:cachefile())
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:savebookmark(name, cwd)
|
|
||||||
let cwds = exists('+ssl') ? [tr(a:cwd, '\', '/'), tr(a:cwd, '/', '\')] : [a:cwd]
|
|
||||||
let entries = filter(s:getbookmarks(), 'index(cwds, s:parts(v:val)[1]) < 0')
|
|
||||||
cal s:writecache(insert(entries, a:name.' '.a:cwd))
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:setentries()
|
|
||||||
let time = getftime(s:cachefile())
|
|
||||||
if !( exists('s:bookmarks') && time == s:bookmarks[0] )
|
|
||||||
let s:bookmarks = [time, s:getbookmarks()]
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:parts(str)
|
|
||||||
let mlist = matchlist(a:str, '\v([^\t]+)\t(.*)$')
|
|
||||||
retu mlist != [] ? mlist[1:2] : ['', '']
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:process(entries, type)
|
|
||||||
retu map(a:entries, 's:modify(v:val, a:type)')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:modify(entry, type)
|
|
||||||
let [name, dir] = s:parts(a:entry)
|
|
||||||
let dir = fnamemodify(dir, a:type)
|
|
||||||
retu name.' '.( dir == '' ? '.' : dir )
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:msg(name, cwd)
|
|
||||||
redr
|
|
||||||
echoh Identifier | echon 'Bookmarked ' | echoh Constant
|
|
||||||
echon a:name.' ' | echoh Directory | echon a:cwd
|
|
||||||
echoh None
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPBookmark', 'Identifier')
|
|
||||||
cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
||||||
sy match CtrlPBookmark '^> [^\t]\+' contains=CtrlPLinePre
|
|
||||||
sy match CtrlPTabExtra '\zs\t.*\ze$'
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#bookmarkdir#init()
|
|
||||||
cal s:setentries()
|
|
||||||
cal s:syntax()
|
|
||||||
retu s:process(copy(s:bookmarks[1]), ':.')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#bookmarkdir#accept(mode, str)
|
|
||||||
let parts = s:parts(s:modify(a:str, ':p'))
|
|
||||||
cal call('s:savebookmark', parts)
|
|
||||||
if a:mode =~ 't\|v\|h'
|
|
||||||
cal ctrlp#exit()
|
|
||||||
en
|
|
||||||
cal ctrlp#setdir(parts[1], a:mode =~ 't\|h' ? 'chd!' : 'lc!')
|
|
||||||
if a:mode == 'e'
|
|
||||||
cal ctrlp#switchtype(0)
|
|
||||||
cal ctrlp#recordhist()
|
|
||||||
cal ctrlp#prtclear()
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#bookmarkdir#add(dir, ...)
|
|
||||||
let str = 'Directory to bookmark: '
|
|
||||||
let cwd = a:dir != '' ? a:dir : s:getinput(str, getcwd(), 'dir')
|
|
||||||
if cwd == '' | retu | en
|
|
||||||
let cwd = fnamemodify(cwd, ':p')
|
|
||||||
let name = a:0 && a:1 != '' ? a:1 : s:getinput('Bookmark as: ', cwd)
|
|
||||||
if name == '' | retu | en
|
|
||||||
let name = tr(name, ' ', ' ')
|
|
||||||
cal s:savebookmark(name, cwd)
|
|
||||||
cal s:msg(name, cwd)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#bookmarkdir#remove(entries)
|
|
||||||
cal s:process(a:entries, ':p')
|
|
||||||
cal s:writecache(a:entries == [] ? [] :
|
|
||||||
\ filter(s:getbookmarks(), 'index(a:entries, v:val) < 0'))
|
|
||||||
cal s:setentries()
|
|
||||||
retu s:process(copy(s:bookmarks[1]), ':.')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#bookmarkdir#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,264 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/buffertag.vim
|
|
||||||
" Description: Buffer Tag extension
|
|
||||||
" Maintainer: Kien Nguyen <github.com/kien>
|
|
||||||
" Credits: Much of the code was taken from tagbar.vim by Jan Larres, plus
|
|
||||||
" a few lines from taglist.vim by Yegappan Lakshmanan and from
|
|
||||||
" buffertag.vim by Takeshi Nishida.
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_buftag') && g:loaded_ctrlp_buftag
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_buftag = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#buffertag#init(s:crfile)',
|
|
||||||
\ 'accept': 'ctrlp#buffertag#accept',
|
|
||||||
\ 'lname': 'buffer tags',
|
|
||||||
\ 'sname': 'bft',
|
|
||||||
\ 'exit': 'ctrlp#buffertag#exit()',
|
|
||||||
\ 'type': 'tabs',
|
|
||||||
\ 'opts': 'ctrlp#buffertag#opts()',
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
|
|
||||||
let [s:pref, s:opts] = ['g:ctrlp_buftag_', {
|
|
||||||
\ 'systemenc': ['s:enc', &enc],
|
|
||||||
\ 'ctags_bin': ['s:bin', ''],
|
|
||||||
\ 'types': ['s:usr_types', {}],
|
|
||||||
\ }]
|
|
||||||
|
|
||||||
let s:bins = [
|
|
||||||
\ 'ctags-exuberant',
|
|
||||||
\ 'exuberant-ctags',
|
|
||||||
\ 'exctags',
|
|
||||||
\ '/usr/local/bin/ctags',
|
|
||||||
\ '/opt/local/bin/ctags',
|
|
||||||
\ 'ctags',
|
|
||||||
\ 'ctags.exe',
|
|
||||||
\ 'tags',
|
|
||||||
\ ]
|
|
||||||
|
|
||||||
let s:types = {
|
|
||||||
\ 'asm' : '%sasm%sasm%sdlmt',
|
|
||||||
\ 'aspperl': '%sasp%sasp%sfsv',
|
|
||||||
\ 'aspvbs' : '%sasp%sasp%sfsv',
|
|
||||||
\ 'awk' : '%sawk%sawk%sf',
|
|
||||||
\ 'beta' : '%sbeta%sbeta%sfsv',
|
|
||||||
\ 'c' : '%sc%sc%sdgsutvf',
|
|
||||||
\ 'cpp' : '%sc++%sc++%snvdtcgsuf',
|
|
||||||
\ 'cs' : '%sc#%sc#%sdtncEgsipm',
|
|
||||||
\ 'cobol' : '%scobol%scobol%sdfgpPs',
|
|
||||||
\ 'eiffel' : '%seiffel%seiffel%scf',
|
|
||||||
\ 'erlang' : '%serlang%serlang%sdrmf',
|
|
||||||
\ 'expect' : '%stcl%stcl%scfp',
|
|
||||||
\ 'fortran': '%sfortran%sfortran%spbceiklmntvfs',
|
|
||||||
\ 'html' : '%shtml%shtml%saf',
|
|
||||||
\ 'java' : '%sjava%sjava%spcifm',
|
|
||||||
\ 'javascript': '%sjavascript%sjavascript%sf',
|
|
||||||
\ 'lisp' : '%slisp%slisp%sf',
|
|
||||||
\ 'lua' : '%slua%slua%sf',
|
|
||||||
\ 'make' : '%smake%smake%sm',
|
|
||||||
\ 'ocaml' : '%socaml%socaml%scmMvtfCre',
|
|
||||||
\ 'pascal' : '%spascal%spascal%sfp',
|
|
||||||
\ 'perl' : '%sperl%sperl%sclps',
|
|
||||||
\ 'php' : '%sphp%sphp%scdvf',
|
|
||||||
\ 'python' : '%spython%spython%scmf',
|
|
||||||
\ 'rexx' : '%srexx%srexx%ss',
|
|
||||||
\ 'ruby' : '%sruby%sruby%scfFm',
|
|
||||||
\ 'scheme' : '%sscheme%sscheme%ssf',
|
|
||||||
\ 'sh' : '%ssh%ssh%sf',
|
|
||||||
\ 'csh' : '%ssh%ssh%sf',
|
|
||||||
\ 'zsh' : '%ssh%ssh%sf',
|
|
||||||
\ 'slang' : '%sslang%sslang%snf',
|
|
||||||
\ 'sml' : '%ssml%ssml%secsrtvf',
|
|
||||||
\ 'sql' : '%ssql%ssql%scFPrstTvfp',
|
|
||||||
\ 'tcl' : '%stcl%stcl%scfmp',
|
|
||||||
\ 'vera' : '%svera%svera%scdefgmpPtTvx',
|
|
||||||
\ 'verilog': '%sverilog%sverilog%smcPertwpvf',
|
|
||||||
\ 'vim' : '%svim%svim%savf',
|
|
||||||
\ 'yacc' : '%syacc%syacc%sl',
|
|
||||||
\ }
|
|
||||||
|
|
||||||
cal map(s:types, 'printf(v:val, "--language-force=", " --", "-types=")')
|
|
||||||
|
|
||||||
if executable('jsctags')
|
|
||||||
cal extend(s:types, { 'javascript': { 'args': '-f -', 'bin': 'jsctags' } })
|
|
||||||
en
|
|
||||||
|
|
||||||
fu! ctrlp#buffertag#opts()
|
|
||||||
for [ke, va] in items(s:opts)
|
|
||||||
let {va[0]} = exists(s:pref.ke) ? {s:pref.ke} : va[1]
|
|
||||||
endfo
|
|
||||||
" Ctags bin
|
|
||||||
if empty(s:bin)
|
|
||||||
for bin in s:bins | if executable(bin)
|
|
||||||
let s:bin = bin
|
|
||||||
brea
|
|
||||||
en | endfo
|
|
||||||
el
|
|
||||||
let s:bin = expand(s:bin, 1)
|
|
||||||
en
|
|
||||||
" Types
|
|
||||||
cal extend(s:types, s:usr_types)
|
|
||||||
endf
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:validfile(fname, ftype)
|
|
||||||
if ( !empty(a:fname) || !empty(a:ftype) ) && filereadable(a:fname)
|
|
||||||
\ && index(keys(s:types), a:ftype) >= 0 | retu 1 | en
|
|
||||||
retu 0
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:exectags(cmd)
|
|
||||||
if exists('+ssl')
|
|
||||||
let [ssl, &ssl] = [&ssl, 0]
|
|
||||||
en
|
|
||||||
if &sh =~ 'cmd\.exe'
|
|
||||||
let [sxq, &sxq, shcf, &shcf] = [&sxq, '"', &shcf, '/s /c']
|
|
||||||
en
|
|
||||||
let output = system(a:cmd)
|
|
||||||
if &sh =~ 'cmd\.exe'
|
|
||||||
let [&sxq, &shcf] = [sxq, shcf]
|
|
||||||
en
|
|
||||||
if exists('+ssl')
|
|
||||||
let &ssl = ssl
|
|
||||||
en
|
|
||||||
retu output
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:exectagsonfile(fname, ftype)
|
|
||||||
let [ags, ft] = ['-f - --sort=no --excmd=pattern --fields=nKs ', a:ftype]
|
|
||||||
if type(s:types[ft]) == 1
|
|
||||||
let ags .= s:types[ft]
|
|
||||||
let bin = s:bin
|
|
||||||
elsei type(s:types[ft]) == 4
|
|
||||||
let ags = s:types[ft]['args']
|
|
||||||
let bin = expand(s:types[ft]['bin'], 1)
|
|
||||||
en
|
|
||||||
if empty(bin) | retu '' | en
|
|
||||||
let cmd = s:esctagscmd(bin, ags, a:fname)
|
|
||||||
if empty(cmd) | retu '' | en
|
|
||||||
let output = s:exectags(cmd)
|
|
||||||
if v:shell_error || output =~ 'Warning: cannot open' | retu '' | en
|
|
||||||
retu output
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:esctagscmd(bin, args, ...)
|
|
||||||
if exists('+ssl')
|
|
||||||
let [ssl, &ssl] = [&ssl, 0]
|
|
||||||
en
|
|
||||||
let fname = a:0 ? shellescape(a:1) : ''
|
|
||||||
let cmd = shellescape(a:bin).' '.a:args.' '.fname
|
|
||||||
if &sh =~ 'cmd\.exe'
|
|
||||||
let cmd = substitute(cmd, '[&()@^<>|]', '^\0', 'g')
|
|
||||||
en
|
|
||||||
if exists('+ssl')
|
|
||||||
let &ssl = ssl
|
|
||||||
en
|
|
||||||
if has('iconv')
|
|
||||||
let last = s:enc != &enc ? s:enc : !empty( $LANG ) ? $LANG : &enc
|
|
||||||
let cmd = iconv(cmd, &enc, last)
|
|
||||||
en
|
|
||||||
retu cmd
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:process(fname, ftype)
|
|
||||||
if !s:validfile(a:fname, a:ftype) | retu [] | endif
|
|
||||||
let ftime = getftime(a:fname)
|
|
||||||
if has_key(g:ctrlp_buftags, a:fname)
|
|
||||||
\ && g:ctrlp_buftags[a:fname]['time'] >= ftime
|
|
||||||
let lines = g:ctrlp_buftags[a:fname]['lines']
|
|
||||||
el
|
|
||||||
let data = s:exectagsonfile(a:fname, a:ftype)
|
|
||||||
let [raw, lines] = [split(data, '\n\+'), []]
|
|
||||||
for line in raw
|
|
||||||
if line !~# '^!_TAG_' && len(split(line, ';"')) == 2
|
|
||||||
let parsed_line = s:parseline(line)
|
|
||||||
if parsed_line != ''
|
|
||||||
cal add(lines, parsed_line)
|
|
||||||
en
|
|
||||||
en
|
|
||||||
endfo
|
|
||||||
let cache = { a:fname : { 'time': ftime, 'lines': lines } }
|
|
||||||
cal extend(g:ctrlp_buftags, cache)
|
|
||||||
en
|
|
||||||
retu lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:parseline(line)
|
|
||||||
let vals = matchlist(a:line,
|
|
||||||
\ '\v^([^\t]+)\t(.+)\t[?/]\^?(.{-1,})\$?[?/]\;\"\t(.+)\tline(no)?\:(\d+)')
|
|
||||||
if vals == [] | retu '' | en
|
|
||||||
let [bufnr, bufname] = [bufnr('^'.vals[2].'$'), fnamemodify(vals[2], ':p:t')]
|
|
||||||
retu vals[1].' '.vals[4].'|'.bufnr.':'.bufname.'|'.vals[6].'| '.vals[3]
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPTagKind', 'Title')
|
|
||||||
cal ctrlp#hicheck('CtrlPBufName', 'Directory')
|
|
||||||
cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
||||||
sy match CtrlPTagKind '\zs[^\t|]\+\ze|\d\+:[^|]\+|\d\+|'
|
|
||||||
sy match CtrlPBufName '|\d\+:\zs[^|]\+\ze|\d\+|'
|
|
||||||
sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName,CtrlPTagKind
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:chknearby(pat)
|
|
||||||
if match(getline('.'), a:pat) < 0
|
|
||||||
let [int, forw, maxl] = [1, 1, line('$')]
|
|
||||||
wh !search(a:pat, 'W'.( forw ? '' : 'b' ))
|
|
||||||
if !forw
|
|
||||||
if int > maxl | brea | en
|
|
||||||
let int += int
|
|
||||||
en
|
|
||||||
let forw = !forw
|
|
||||||
endw
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#buffertag#init(fname)
|
|
||||||
let bufs = exists('s:btmode') && s:btmode
|
|
||||||
\ ? filter(ctrlp#buffers(), 'filereadable(v:val)')
|
|
||||||
\ : [exists('s:bufname') ? s:bufname : a:fname]
|
|
||||||
let lines = []
|
|
||||||
for each in bufs
|
|
||||||
let bname = fnamemodify(each, ':p')
|
|
||||||
let tftype = get(split(getbufvar('^'.bname.'$', '&ft'), '\.'), 0, '')
|
|
||||||
cal extend(lines, s:process(bname, tftype))
|
|
||||||
endfo
|
|
||||||
cal s:syntax()
|
|
||||||
retu lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#buffertag#accept(mode, str)
|
|
||||||
let vals = matchlist(a:str,
|
|
||||||
\ '\v^[^\t]+\t+[^\t|]+\|(\d+)\:[^\t|]+\|(\d+)\|\s(.+)$')
|
|
||||||
let bufnr = str2nr(get(vals, 1))
|
|
||||||
if bufnr
|
|
||||||
cal ctrlp#acceptfile(a:mode, bufnr)
|
|
||||||
exe 'norm!' str2nr(get(vals, 2, line('.'))).'G'
|
|
||||||
cal s:chknearby('\V\C'.get(vals, 3, ''))
|
|
||||||
sil! norm! zvzz
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#buffertag#cmd(mode, ...)
|
|
||||||
let s:btmode = a:mode
|
|
||||||
if a:0 && !empty(a:1)
|
|
||||||
let s:btmode = 0
|
|
||||||
let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
|
|
||||||
let s:bufname = fnamemodify(bname, ':p')
|
|
||||||
en
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#buffertag#exit()
|
|
||||||
unl! s:btmode s:bufname
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/changes.vim
|
|
||||||
" Description: Change list extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_changes') && g:loaded_ctrlp_changes
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_changes = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#changes#init(s:bufnr, s:crbufnr)',
|
|
||||||
\ 'accept': 'ctrlp#changes#accept',
|
|
||||||
\ 'lname': 'changes',
|
|
||||||
\ 'sname': 'chs',
|
|
||||||
\ 'exit': 'ctrlp#changes#exit()',
|
|
||||||
\ 'type': 'tabe',
|
|
||||||
\ 'sort': 0,
|
|
||||||
\ 'nolim': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:changelist(bufnr)
|
|
||||||
sil! exe 'noa hid b' a:bufnr
|
|
||||||
redi => result
|
|
||||||
sil! changes
|
|
||||||
redi END
|
|
||||||
retu map(split(result, "\n")[1:], 'tr(v:val, " ", " ")')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:process(clines, ...)
|
|
||||||
let [clines, evas] = [[], []]
|
|
||||||
for each in a:clines
|
|
||||||
let parts = matchlist(each, '\v^.\s*\d+\s+(\d+)\s+(\d+)\s(.*)$')
|
|
||||||
if !empty(parts)
|
|
||||||
if parts[3] == '' | let parts[3] = ' ' | en
|
|
||||||
cal add(clines, parts[3].' |'.a:1.':'.a:2.'|'.parts[1].':'.parts[2].'|')
|
|
||||||
en
|
|
||||||
endfo
|
|
||||||
retu reverse(filter(clines, 'count(clines, v:val) == 1'))
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPBufName', 'Directory')
|
|
||||||
cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
||||||
sy match CtrlPBufName '\t|\d\+:\zs[^|]\+\ze|\d\+:\d\+|$'
|
|
||||||
sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#changes#init(original_bufnr, bufnr)
|
|
||||||
let bufnr = exists('s:bufnr') ? s:bufnr : a:bufnr
|
|
||||||
let bufs = exists('s:clmode') && s:clmode ? ctrlp#buffers('id') : [bufnr]
|
|
||||||
cal filter(bufs, 'v:val > 0')
|
|
||||||
let [swb, &swb] = [&swb, '']
|
|
||||||
let lines = []
|
|
||||||
for each in bufs
|
|
||||||
let bname = bufname(each)
|
|
||||||
let fnamet = fnamemodify(bname == '' ? '[No Name]' : bname, ':t')
|
|
||||||
cal extend(lines, s:process(s:changelist(each), each, fnamet))
|
|
||||||
endfo
|
|
||||||
sil! exe 'noa hid b' a:original_bufnr
|
|
||||||
let &swb = swb
|
|
||||||
cal ctrlp#syntax()
|
|
||||||
cal s:syntax()
|
|
||||||
retu lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#changes#accept(mode, str)
|
|
||||||
let info = matchlist(a:str, '\t|\(\d\+\):[^|]\+|\(\d\+\):\(\d\+\)|$')
|
|
||||||
let bufnr = str2nr(get(info, 1))
|
|
||||||
if bufnr
|
|
||||||
cal ctrlp#acceptfile(a:mode, bufnr)
|
|
||||||
cal cursor(get(info, 2), get(info, 3))
|
|
||||||
sil! norm! zvzz
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#changes#cmd(mode, ...)
|
|
||||||
let s:clmode = a:mode
|
|
||||||
if a:0 && !empty(a:1)
|
|
||||||
let s:clmode = 0
|
|
||||||
let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
|
|
||||||
let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$')
|
|
||||||
en
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#changes#exit()
|
|
||||||
unl! s:clmode s:bufnr
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/dir.vim
|
|
||||||
" Description: Directory extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_dir') && g:loaded_ctrlp_dir
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let [g:loaded_ctrlp_dir, g:ctrlp_newdir] = [1, 0]
|
|
||||||
|
|
||||||
let s:ars = ['s:maxdepth', 's:maxfiles', 's:compare_lim', 's:glob', 's:caching']
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#dir#init('.join(s:ars, ', ').')',
|
|
||||||
\ 'accept': 'ctrlp#dir#accept',
|
|
||||||
\ 'lname': 'dirs',
|
|
||||||
\ 'sname': 'dir',
|
|
||||||
\ 'type': 'path',
|
|
||||||
\ 'specinput': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
|
|
||||||
let s:dircounts = {}
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:globdirs(dirs, depth)
|
|
||||||
let entries = split(globpath(a:dirs, s:glob), "\n")
|
|
||||||
let [dirs, depth] = [ctrlp#dirnfile(entries)[0], a:depth + 1]
|
|
||||||
cal extend(g:ctrlp_alldirs, dirs)
|
|
||||||
let nr = len(g:ctrlp_alldirs)
|
|
||||||
if !empty(dirs) && !s:max(nr, s:maxfiles) && depth <= s:maxdepth
|
|
||||||
sil! cal ctrlp#progress(nr)
|
|
||||||
cal map(dirs, 'ctrlp#utils#fnesc(v:val, "g", ",")')
|
|
||||||
cal s:globdirs(join(dirs, ','), depth)
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:max(len, max)
|
|
||||||
retu a:max && a:len > a:max
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:nocache()
|
|
||||||
retu !s:caching || ( s:caching > 1 && get(s:dircounts, s:cwd) < s:caching )
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#dir#init(...)
|
|
||||||
let s:cwd = getcwd()
|
|
||||||
for each in range(len(s:ars))
|
|
||||||
let {s:ars[each]} = a:{each + 1}
|
|
||||||
endfo
|
|
||||||
let cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'dir'
|
|
||||||
let cafile = cadir.ctrlp#utils#lash().ctrlp#utils#cachefile('dir')
|
|
||||||
if g:ctrlp_newdir || s:nocache() || !filereadable(cafile)
|
|
||||||
let [s:initcwd, g:ctrlp_alldirs] = [s:cwd, []]
|
|
||||||
if !ctrlp#igncwd(s:cwd)
|
|
||||||
cal s:globdirs(ctrlp#utils#fnesc(s:cwd, 'g', ','), 0)
|
|
||||||
en
|
|
||||||
cal ctrlp#rmbasedir(g:ctrlp_alldirs)
|
|
||||||
if len(g:ctrlp_alldirs) <= s:compare_lim
|
|
||||||
cal sort(g:ctrlp_alldirs, 'ctrlp#complen')
|
|
||||||
en
|
|
||||||
cal ctrlp#utils#writecache(g:ctrlp_alldirs, cadir, cafile)
|
|
||||||
let g:ctrlp_newdir = 0
|
|
||||||
el
|
|
||||||
if !( exists('s:initcwd') && s:initcwd == s:cwd )
|
|
||||||
let s:initcwd = s:cwd
|
|
||||||
let g:ctrlp_alldirs = ctrlp#utils#readfile(cafile)
|
|
||||||
en
|
|
||||||
en
|
|
||||||
cal extend(s:dircounts, { s:cwd : len(g:ctrlp_alldirs) })
|
|
||||||
retu g:ctrlp_alldirs
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#dir#accept(mode, str)
|
|
||||||
let path = a:mode == 'h' ? getcwd() : s:cwd.ctrlp#call('s:lash', s:cwd).a:str
|
|
||||||
if a:mode =~ 't\|v\|h'
|
|
||||||
cal ctrlp#exit()
|
|
||||||
en
|
|
||||||
cal ctrlp#setdir(path, a:mode =~ 't\|h' ? 'chd!' : 'lc!')
|
|
||||||
if a:mode == 'e'
|
|
||||||
sil! cal ctrlp#statusline()
|
|
||||||
cal ctrlp#setlines(s:id)
|
|
||||||
cal ctrlp#recordhist()
|
|
||||||
cal ctrlp#prtclear()
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#dir#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/line.vim
|
|
||||||
" Description: Line extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_line') && g:loaded_ctrlp_line
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_line = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#line#init(s:crbufnr)',
|
|
||||||
\ 'accept': 'ctrlp#line#accept',
|
|
||||||
\ 'lname': 'lines',
|
|
||||||
\ 'sname': 'lns',
|
|
||||||
\ 'type': 'tabe',
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPBufName', 'Directory')
|
|
||||||
cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
||||||
sy match CtrlPBufName '\t|\zs[^|]\+\ze|\d\+:\d\+|$'
|
|
||||||
sy match CtrlPTabExtra '\zs\t.*\ze$' contains=CtrlPBufName
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#line#init(bufnr)
|
|
||||||
let [lines, bufnr] = [[], exists('s:bufnr') ? s:bufnr : a:bufnr]
|
|
||||||
let bufs = exists('s:lnmode') && s:lnmode ? ctrlp#buffers('id') : [bufnr]
|
|
||||||
for bufnr in bufs
|
|
||||||
let [lfb, bufn] = [getbufline(bufnr, 1, '$'), bufname(bufnr)]
|
|
||||||
if lfb == [] && bufn != ''
|
|
||||||
let lfb = ctrlp#utils#readfile(fnamemodify(bufn, ':p'))
|
|
||||||
en
|
|
||||||
cal map(lfb, 'tr(v:val, '' '', '' '')')
|
|
||||||
let [linenr, len_lfb] = [1, len(lfb)]
|
|
||||||
let buft = bufn == '' ? '[No Name]' : fnamemodify(bufn, ':t')
|
|
||||||
wh linenr <= len_lfb
|
|
||||||
let lfb[linenr - 1] .= ' |'.buft.'|'.bufnr.':'.linenr.'|'
|
|
||||||
let linenr += 1
|
|
||||||
endw
|
|
||||||
cal extend(lines, filter(lfb, 'v:val !~ ''^\s*\t|[^|]\+|\d\+:\d\+|$'''))
|
|
||||||
endfo
|
|
||||||
cal s:syntax()
|
|
||||||
retu lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#line#accept(mode, str)
|
|
||||||
let info = matchlist(a:str, '\t|[^|]\+|\(\d\+\):\(\d\+\)|$')
|
|
||||||
let bufnr = str2nr(get(info, 1))
|
|
||||||
if bufnr
|
|
||||||
cal ctrlp#acceptfile(a:mode, bufnr, get(info, 2))
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#line#cmd(mode, ...)
|
|
||||||
let s:lnmode = a:mode
|
|
||||||
if a:0 && !empty(a:1)
|
|
||||||
let s:lnmode = 0
|
|
||||||
let bname = a:1 =~# '^%$\|^#\d*$' ? expand(a:1) : a:1
|
|
||||||
let s:bufnr = bufnr('^'.fnamemodify(bname, ':p').'$')
|
|
||||||
en
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/mixed.vim
|
|
||||||
" Description: Mixing Files + MRU + Buffers
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_mixed') && g:loaded_ctrlp_mixed
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let [g:loaded_ctrlp_mixed, g:ctrlp_newmix] = [1, 0]
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#mixed#init(s:compare_lim)',
|
|
||||||
\ 'accept': 'ctrlp#acceptfile',
|
|
||||||
\ 'lname': 'fil + mru + buf',
|
|
||||||
\ 'sname': 'mix',
|
|
||||||
\ 'type': 'path',
|
|
||||||
\ 'opmul': 1,
|
|
||||||
\ 'specinput': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:newcache(cwd)
|
|
||||||
if g:ctrlp_newmix || !has_key(g:ctrlp_allmixes, 'data') | retu 1 | en
|
|
||||||
retu g:ctrlp_allmixes['cwd'] != a:cwd
|
|
||||||
\ || g:ctrlp_allmixes['filtime'] < getftime(ctrlp#utils#cachefile())
|
|
||||||
\ || g:ctrlp_allmixes['mrutime'] < getftime(ctrlp#mrufiles#cachefile())
|
|
||||||
\ || g:ctrlp_allmixes['bufs'] < len(ctrlp#mrufiles#bufs())
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:getnewmix(cwd, clim)
|
|
||||||
if g:ctrlp_newmix
|
|
||||||
cal ctrlp#mrufiles#refresh('raw')
|
|
||||||
let g:ctrlp_newcache = 1
|
|
||||||
en
|
|
||||||
let g:ctrlp_lines = copy(ctrlp#files())
|
|
||||||
cal ctrlp#progress('Mixing...')
|
|
||||||
let mrufs = copy(ctrlp#mrufiles#list('raw'))
|
|
||||||
if exists('+ssl') && &ssl
|
|
||||||
cal map(mrufs, 'tr(v:val, "\\", "/")')
|
|
||||||
en
|
|
||||||
let allbufs = map(ctrlp#buffers(), 'fnamemodify(v:val, ":p")')
|
|
||||||
let [bufs, ubufs] = [[], []]
|
|
||||||
for each in allbufs
|
|
||||||
cal add(filereadable(each) ? bufs : ubufs, each)
|
|
||||||
endfo
|
|
||||||
let mrufs = bufs + filter(mrufs, 'index(bufs, v:val) < 0')
|
|
||||||
if len(mrufs) > len(g:ctrlp_lines)
|
|
||||||
cal filter(mrufs, 'stridx(v:val, a:cwd)')
|
|
||||||
el
|
|
||||||
let cwd_mrufs = filter(copy(mrufs), '!stridx(v:val, a:cwd)')
|
|
||||||
let cwd_mrufs = ctrlp#rmbasedir(cwd_mrufs)
|
|
||||||
for each in cwd_mrufs
|
|
||||||
let id = index(g:ctrlp_lines, each)
|
|
||||||
if id >= 0 | cal remove(g:ctrlp_lines, id) | en
|
|
||||||
endfo
|
|
||||||
en
|
|
||||||
let mrufs += ubufs
|
|
||||||
cal map(mrufs, 'fnamemodify(v:val, ":.")')
|
|
||||||
let g:ctrlp_lines = len(mrufs) > len(g:ctrlp_lines)
|
|
||||||
\ ? g:ctrlp_lines + mrufs : mrufs + g:ctrlp_lines
|
|
||||||
if len(g:ctrlp_lines) <= a:clim
|
|
||||||
cal sort(g:ctrlp_lines, 'ctrlp#complen')
|
|
||||||
en
|
|
||||||
let g:ctrlp_allmixes = { 'filtime': getftime(ctrlp#utils#cachefile()),
|
|
||||||
\ 'mrutime': getftime(ctrlp#mrufiles#cachefile()), 'cwd': a:cwd,
|
|
||||||
\ 'bufs': len(ctrlp#mrufiles#bufs()), 'data': g:ctrlp_lines }
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#mixed#init(clim)
|
|
||||||
let cwd = getcwd()
|
|
||||||
if s:newcache(cwd)
|
|
||||||
cal s:getnewmix(cwd, a:clim)
|
|
||||||
el
|
|
||||||
let g:ctrlp_lines = g:ctrlp_allmixes['data']
|
|
||||||
en
|
|
||||||
let g:ctrlp_newmix = 0
|
|
||||||
retu g:ctrlp_lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mixed#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/mrufiles.vim
|
|
||||||
" Description: Most Recently Used Files extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Static variables {{{1
|
|
||||||
let [s:mrbs, s:mrufs] = [[], []]
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#opts()
|
|
||||||
let [pref, opts] = ['g:ctrlp_mruf_', {
|
|
||||||
\ 'max': ['s:max', 250],
|
|
||||||
\ 'include': ['s:in', ''],
|
|
||||||
\ 'exclude': ['s:ex', ''],
|
|
||||||
\ 'case_sensitive': ['s:cseno', 1],
|
|
||||||
\ 'relative': ['s:re', 0],
|
|
||||||
\ 'save_on_update': ['s:soup', 1],
|
|
||||||
\ }]
|
|
||||||
for [ke, va] in items(opts)
|
|
||||||
let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]]
|
|
||||||
endfo
|
|
||||||
endf
|
|
||||||
cal ctrlp#mrufiles#opts()
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:excl(fn)
|
|
||||||
retu !empty({s:ex}) && a:fn =~# {s:ex}
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:mergelists()
|
|
||||||
let diskmrufs = ctrlp#utils#readfile(ctrlp#mrufiles#cachefile())
|
|
||||||
cal filter(diskmrufs, 'index(s:mrufs, v:val) < 0')
|
|
||||||
let mrufs = s:mrufs + diskmrufs
|
|
||||||
retu s:chop(mrufs)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:chop(mrufs)
|
|
||||||
if len(a:mrufs) > {s:max} | cal remove(a:mrufs, {s:max}, -1) | en
|
|
||||||
retu a:mrufs
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:reformat(mrufs, ...)
|
|
||||||
let cwd = getcwd()
|
|
||||||
let cwd .= cwd !~ '[\/]$' ? ctrlp#utils#lash() : ''
|
|
||||||
if {s:re}
|
|
||||||
let cwd = exists('+ssl') ? tr(cwd, '/', '\') : cwd
|
|
||||||
cal filter(a:mrufs, '!stridx(v:val, cwd)')
|
|
||||||
en
|
|
||||||
if a:0 && a:1 == 'raw' | retu a:mrufs | en
|
|
||||||
let idx = strlen(cwd)
|
|
||||||
if exists('+ssl') && &ssl
|
|
||||||
let cwd = tr(cwd, '\', '/')
|
|
||||||
cal map(a:mrufs, 'tr(v:val, "\\", "/")')
|
|
||||||
en
|
|
||||||
retu map(a:mrufs, '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:record(bufnr)
|
|
||||||
if s:locked | retu | en
|
|
||||||
let bufnr = a:bufnr + 0
|
|
||||||
let bufname = bufname(bufnr)
|
|
||||||
if bufnr > 0 && !empty(bufname)
|
|
||||||
cal filter(s:mrbs, 'v:val != bufnr')
|
|
||||||
cal insert(s:mrbs, bufnr)
|
|
||||||
cal s:addtomrufs(bufname)
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:addtomrufs(fname)
|
|
||||||
let fn = fnamemodify(a:fname, ':p')
|
|
||||||
let fn = exists('+ssl') ? tr(fn, '/', '\') : fn
|
|
||||||
if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} )
|
|
||||||
\ || !empty(getbufvar('^'.fn.'$', '&bt')) || !filereadable(fn) | retu
|
|
||||||
en
|
|
||||||
let idx = index(s:mrufs, fn, 0, !{s:cseno})
|
|
||||||
if idx
|
|
||||||
cal filter(s:mrufs, 'v:val !='.( {s:cseno} ? '#' : '?' ).' fn')
|
|
||||||
cal insert(s:mrufs, fn)
|
|
||||||
if {s:soup} && idx < 0
|
|
||||||
cal s:savetofile(s:mergelists())
|
|
||||||
en
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:savetofile(mrufs)
|
|
||||||
cal ctrlp#utils#writecache(a:mrufs, s:cadir, s:cafile)
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#mrufiles#refresh(...)
|
|
||||||
let mrufs = s:mergelists()
|
|
||||||
cal filter(mrufs, '!empty(ctrlp#utils#glob(v:val, 1)) && !s:excl(v:val)')
|
|
||||||
if exists('+ssl')
|
|
||||||
cal map(mrufs, 'tr(v:val, "/", "\\")')
|
|
||||||
cal map(s:mrufs, 'tr(v:val, "/", "\\")')
|
|
||||||
let cond = 'count(mrufs, v:val, !{s:cseno}) == 1'
|
|
||||||
cal filter(mrufs, cond)
|
|
||||||
cal filter(s:mrufs, cond)
|
|
||||||
en
|
|
||||||
cal s:savetofile(mrufs)
|
|
||||||
retu a:0 && a:1 == 'raw' ? [] : s:reformat(mrufs)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#remove(files)
|
|
||||||
let mrufs = []
|
|
||||||
if a:files != []
|
|
||||||
let mrufs = s:mergelists()
|
|
||||||
let cond = 'index(a:files, v:val, 0, !{s:cseno}) < 0'
|
|
||||||
cal filter(mrufs, cond)
|
|
||||||
cal filter(s:mrufs, cond)
|
|
||||||
en
|
|
||||||
cal s:savetofile(mrufs)
|
|
||||||
retu s:reformat(mrufs)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#add(fn)
|
|
||||||
if !empty(a:fn)
|
|
||||||
cal s:addtomrufs(a:fn)
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#list(...)
|
|
||||||
retu a:0 ? a:1 == 'raw' ? s:reformat(s:mergelists(), a:1) : 0
|
|
||||||
\ : s:reformat(s:mergelists())
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#bufs()
|
|
||||||
retu s:mrbs
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#tgrel()
|
|
||||||
let {s:re} = !{s:re}
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#cachefile()
|
|
||||||
if !exists('s:cadir') || !exists('s:cafile')
|
|
||||||
let s:cadir = ctrlp#utils#cachedir().ctrlp#utils#lash().'mru'
|
|
||||||
let s:cafile = s:cadir.ctrlp#utils#lash().'cache.txt'
|
|
||||||
en
|
|
||||||
retu s:cafile
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#mrufiles#init()
|
|
||||||
if !has('autocmd') | retu | en
|
|
||||||
let s:locked = 0
|
|
||||||
aug CtrlPMRUF
|
|
||||||
au!
|
|
||||||
au BufAdd,BufEnter,BufLeave,BufWritePost * cal s:record(expand('<abuf>', 1))
|
|
||||||
au QuickFixCmdPre *vimgrep* let s:locked = 1
|
|
||||||
au QuickFixCmdPost *vimgrep* let s:locked = 0
|
|
||||||
au VimLeavePre * cal s:savetofile(s:mergelists())
|
|
||||||
aug END
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/quickfix.vim
|
|
||||||
" Description: Quickfix extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_quickfix') && g:loaded_ctrlp_quickfix
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_quickfix = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#quickfix#init()',
|
|
||||||
\ 'accept': 'ctrlp#quickfix#accept',
|
|
||||||
\ 'lname': 'quickfix',
|
|
||||||
\ 'sname': 'qfx',
|
|
||||||
\ 'type': 'line',
|
|
||||||
\ 'sort': 0,
|
|
||||||
\ 'nolim': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
|
|
||||||
fu! s:lineout(dict)
|
|
||||||
retu printf('%s|%d:%d| %s', bufname(a:dict['bufnr']), a:dict['lnum'],
|
|
||||||
\ a:dict['col'], matchstr(a:dict['text'], '\s*\zs.*\S'))
|
|
||||||
endf
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPqfLineCol', 'Search')
|
|
||||||
sy match CtrlPqfLineCol '|\zs\d\+:\d\+\ze|'
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#quickfix#init()
|
|
||||||
cal s:syntax()
|
|
||||||
retu map(getqflist(), 's:lineout(v:val)')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#quickfix#accept(mode, str)
|
|
||||||
let vals = matchlist(a:str, '^\([^|]\+\ze\)|\(\d\+\):\(\d\+\)|')
|
|
||||||
if vals == [] || vals[1] == '' | retu | en
|
|
||||||
cal ctrlp#acceptfile(a:mode, vals[1])
|
|
||||||
let cur_pos = getpos('.')[1:2]
|
|
||||||
if cur_pos != [1, 1] && cur_pos != map(vals[2:3], 'str2nr(v:val)')
|
|
||||||
mark '
|
|
||||||
en
|
|
||||||
cal cursor(vals[2], vals[3])
|
|
||||||
sil! norm! zvzz
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#quickfix#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/rtscript.vim
|
|
||||||
" Description: Runtime scripts extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_rtscript') && g:loaded_ctrlp_rtscript
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let [g:loaded_ctrlp_rtscript, g:ctrlp_newrts] = [1, 0]
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#rtscript#init(s:caching)',
|
|
||||||
\ 'accept': 'ctrlp#acceptfile',
|
|
||||||
\ 'lname': 'runtime scripts',
|
|
||||||
\ 'sname': 'rts',
|
|
||||||
\ 'type': 'path',
|
|
||||||
\ 'opmul': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
|
|
||||||
let s:filecounts = {}
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:nocache()
|
|
||||||
retu g:ctrlp_newrts ||
|
|
||||||
\ !s:caching || ( s:caching > 1 && get(s:filecounts, s:cwd) < s:caching )
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#rtscript#init(caching)
|
|
||||||
let [s:caching, s:cwd] = [a:caching, getcwd()]
|
|
||||||
if s:nocache() ||
|
|
||||||
\ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[0] == &rtp )
|
|
||||||
sil! cal ctrlp#progress('Indexing...')
|
|
||||||
let entries = split(globpath(ctrlp#utils#fnesc(&rtp, 'g'), '**/*.*'), "\n")
|
|
||||||
cal filter(entries, 'count(entries, v:val) == 1')
|
|
||||||
let [entries, echoed] = [ctrlp#dirnfile(entries)[1], 1]
|
|
||||||
el
|
|
||||||
let [entries, results] = g:ctrlp_rtscache[2:3]
|
|
||||||
en
|
|
||||||
if s:nocache() ||
|
|
||||||
\ !( exists('g:ctrlp_rtscache') && g:ctrlp_rtscache[:1] == [&rtp, s:cwd] )
|
|
||||||
if !exists('echoed')
|
|
||||||
sil! cal ctrlp#progress('Processing...')
|
|
||||||
en
|
|
||||||
let results = map(copy(entries), 'fnamemodify(v:val, '':.'')')
|
|
||||||
en
|
|
||||||
let [g:ctrlp_rtscache, g:ctrlp_newrts] = [[&rtp, s:cwd, entries, results], 0]
|
|
||||||
cal extend(s:filecounts, { s:cwd : len(results) })
|
|
||||||
retu results
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#rtscript#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,138 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/tag.vim
|
|
||||||
" Description: Tag file extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if exists('g:loaded_ctrlp_tag') && g:loaded_ctrlp_tag
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_tag = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#tag#init()',
|
|
||||||
\ 'accept': 'ctrlp#tag#accept',
|
|
||||||
\ 'lname': 'tags',
|
|
||||||
\ 'sname': 'tag',
|
|
||||||
\ 'enter': 'ctrlp#tag#enter()',
|
|
||||||
\ 'type': 'tabs',
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:findcount(str)
|
|
||||||
let [tg, ofname] = split(a:str, '\t\+\ze[^\t]\+$')
|
|
||||||
let tgs = taglist('^'.tg.'$')
|
|
||||||
if len(tgs) < 2
|
|
||||||
retu [0, 0, 0, 0]
|
|
||||||
en
|
|
||||||
let bname = fnamemodify(bufname('%'), ':p')
|
|
||||||
let fname = expand(fnamemodify(simplify(ofname), ':s?^[.\/]\+??:p:.'), 1)
|
|
||||||
let [fnd, cnt, pos, ctgs, otgs] = [0, 0, 0, [], []]
|
|
||||||
for tgi in tgs
|
|
||||||
let lst = bname == fnamemodify(tgi["filename"], ':p') ? 'ctgs' : 'otgs'
|
|
||||||
cal call('add', [{lst}, tgi])
|
|
||||||
endfo
|
|
||||||
let ntgs = ctgs + otgs
|
|
||||||
for tgi in ntgs
|
|
||||||
let cnt += 1
|
|
||||||
let fulname = fnamemodify(tgi["filename"], ':p')
|
|
||||||
if stridx(fulname, fname) >= 0
|
|
||||||
\ && strlen(fname) + stridx(fulname, fname) == strlen(fulname)
|
|
||||||
let fnd += 1
|
|
||||||
let pos = cnt
|
|
||||||
en
|
|
||||||
endfo
|
|
||||||
let cnt = 0
|
|
||||||
for tgi in ntgs
|
|
||||||
let cnt += 1
|
|
||||||
if tgi["filename"] == ofname
|
|
||||||
let [fnd, pos] = [0, cnt]
|
|
||||||
en
|
|
||||||
endfo
|
|
||||||
retu [1, fnd, pos, len(ctgs)]
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:filter(tags)
|
|
||||||
let nr = 0
|
|
||||||
wh 0 < 1
|
|
||||||
if a:tags == [] | brea | en
|
|
||||||
if a:tags[nr] =~ '^!' && a:tags[nr] !~# '^!_TAG_'
|
|
||||||
let nr += 1
|
|
||||||
con
|
|
||||||
en
|
|
||||||
if a:tags[nr] =~# '^!_TAG_' && len(a:tags) > nr
|
|
||||||
cal remove(a:tags, nr)
|
|
||||||
el
|
|
||||||
brea
|
|
||||||
en
|
|
||||||
endw
|
|
||||||
retu a:tags
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:syntax()
|
|
||||||
if !ctrlp#nosy()
|
|
||||||
cal ctrlp#hicheck('CtrlPTabExtra', 'Comment')
|
|
||||||
sy match CtrlPTabExtra '\zs\t.*\ze$'
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#tag#init()
|
|
||||||
if empty(s:tagfiles) | retu [] | en
|
|
||||||
let g:ctrlp_alltags = []
|
|
||||||
let tagfiles = sort(filter(s:tagfiles, 'count(s:tagfiles, v:val) == 1'))
|
|
||||||
for each in tagfiles
|
|
||||||
let alltags = s:filter(ctrlp#utils#readfile(each))
|
|
||||||
cal extend(g:ctrlp_alltags, alltags)
|
|
||||||
endfo
|
|
||||||
cal s:syntax()
|
|
||||||
retu g:ctrlp_alltags
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#tag#accept(mode, str)
|
|
||||||
cal ctrlp#exit()
|
|
||||||
let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
|
|
||||||
let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str)]
|
|
||||||
let cmds = {
|
|
||||||
\ 't': ['tab sp', 'tab stj'],
|
|
||||||
\ 'h': ['sp', 'stj'],
|
|
||||||
\ 'v': ['vs', 'vert stj'],
|
|
||||||
\ 'e': ['', 'tj'],
|
|
||||||
\ }
|
|
||||||
let utg = fdcnt[3] < 2 && fdcnt[0] == 1 && fdcnt[1] == 1
|
|
||||||
let cmd = !fdcnt[0] || utg ? cmds[a:mode][0] : cmds[a:mode][1]
|
|
||||||
let cmd = a:mode == 'e' && ctrlp#modfilecond(!&aw)
|
|
||||||
\ ? ( cmd == 'tj' ? 'stj' : 'sp' ) : cmd
|
|
||||||
let cmd = a:mode == 't' ? ctrlp#tabcount().cmd : cmd
|
|
||||||
if !fdcnt[0] || utg
|
|
||||||
if cmd != ''
|
|
||||||
exe cmd
|
|
||||||
en
|
|
||||||
let save_cst = &cst
|
|
||||||
set cst&
|
|
||||||
cal feedkeys(":".( utg ? fdcnt[2] : "" )."ta ".tg."\r", 'nt')
|
|
||||||
let &cst = save_cst
|
|
||||||
el
|
|
||||||
let ext = ""
|
|
||||||
if fdcnt[1] < 2 && fdcnt[2]
|
|
||||||
let [sav_more, &more] = [&more, 0]
|
|
||||||
let ext = fdcnt[2]."\r".":let &more = ".sav_more."\r"
|
|
||||||
en
|
|
||||||
cal feedkeys(":".cmd." ".tg."\r".ext, 'nt')
|
|
||||||
en
|
|
||||||
cal ctrlp#setlcdir()
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#tag#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#tag#enter()
|
|
||||||
let tfs = tagfiles()
|
|
||||||
let s:tagfiles = tfs != [] ? filter(map(tfs, 'fnamemodify(v:val, ":p")'),
|
|
||||||
\ 'filereadable(v:val)') : []
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,154 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/undo.vim
|
|
||||||
" Description: Undo extension
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Init {{{1
|
|
||||||
if ( exists('g:loaded_ctrlp_undo') && g:loaded_ctrlp_undo )
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp_undo = 1
|
|
||||||
|
|
||||||
cal add(g:ctrlp_ext_vars, {
|
|
||||||
\ 'init': 'ctrlp#undo#init()',
|
|
||||||
\ 'accept': 'ctrlp#undo#accept',
|
|
||||||
\ 'lname': 'undo',
|
|
||||||
\ 'sname': 'udo',
|
|
||||||
\ 'enter': 'ctrlp#undo#enter()',
|
|
||||||
\ 'exit': 'ctrlp#undo#exit()',
|
|
||||||
\ 'type': 'line',
|
|
||||||
\ 'sort': 0,
|
|
||||||
\ 'nolim': 1,
|
|
||||||
\ })
|
|
||||||
|
|
||||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
|
||||||
|
|
||||||
let s:text = map(['second', 'seconds', 'minutes', 'hours', 'days', 'weeks',
|
|
||||||
\ 'months', 'years'], '" ".v:val." ago"')
|
|
||||||
" Utilities {{{1
|
|
||||||
fu! s:getundo()
|
|
||||||
if exists('*undotree')
|
|
||||||
\ && ( v:version > 703 || ( v:version == 703 && has('patch005') ) )
|
|
||||||
retu [1, undotree()]
|
|
||||||
el
|
|
||||||
redi => result
|
|
||||||
sil! undol
|
|
||||||
redi END
|
|
||||||
retu [0, split(result, "\n")[1:]]
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:flatten(tree, cur)
|
|
||||||
let flatdict = {}
|
|
||||||
for each in a:tree
|
|
||||||
let saved = has_key(each, 'save') ? 'saved' : ''
|
|
||||||
let current = each['seq'] == a:cur ? 'current' : ''
|
|
||||||
cal extend(flatdict, { each['seq'] : [each['time'], saved, current] })
|
|
||||||
if has_key(each, 'alt')
|
|
||||||
cal extend(flatdict, s:flatten(each['alt'], a:cur))
|
|
||||||
en
|
|
||||||
endfo
|
|
||||||
retu flatdict
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:elapsed(nr)
|
|
||||||
let [text, time] = [s:text, localtime() - a:nr]
|
|
||||||
let mins = time / 60
|
|
||||||
let hrs = time / 3600
|
|
||||||
let days = time / 86400
|
|
||||||
let wks = time / 604800
|
|
||||||
let mons = time / 2592000
|
|
||||||
let yrs = time / 31536000
|
|
||||||
if yrs > 1
|
|
||||||
retu yrs.text[7]
|
|
||||||
elsei mons > 1
|
|
||||||
retu mons.text[6]
|
|
||||||
elsei wks > 1
|
|
||||||
retu wks.text[5]
|
|
||||||
elsei days > 1
|
|
||||||
retu days.text[4]
|
|
||||||
elsei hrs > 1
|
|
||||||
retu hrs.text[3]
|
|
||||||
elsei mins > 1
|
|
||||||
retu mins.text[2]
|
|
||||||
elsei time == 1
|
|
||||||
retu time.text[0]
|
|
||||||
elsei time < 120
|
|
||||||
retu time.text[1]
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:syntax()
|
|
||||||
if ctrlp#nosy() | retu | en
|
|
||||||
for [ke, va] in items({'T': 'Directory', 'Br': 'Comment', 'Nr': 'String',
|
|
||||||
\ 'Sv': 'Comment', 'Po': 'Title'})
|
|
||||||
cal ctrlp#hicheck('CtrlPUndo'.ke, va)
|
|
||||||
endfo
|
|
||||||
sy match CtrlPUndoT '\v\d+ \zs[^ ]+\ze|\d+:\d+:\d+'
|
|
||||||
sy match CtrlPUndoBr '\[\|\]'
|
|
||||||
sy match CtrlPUndoNr '\[\d\+\]' contains=CtrlPUndoBr
|
|
||||||
sy match CtrlPUndoSv 'saved'
|
|
||||||
sy match CtrlPUndoPo 'current'
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:dict2list(dict)
|
|
||||||
for ke in keys(a:dict)
|
|
||||||
let a:dict[ke][0] = s:elapsed(a:dict[ke][0])
|
|
||||||
endfo
|
|
||||||
retu map(keys(a:dict), 'eval(''[v:val, a:dict[v:val]]'')')
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:compval(...)
|
|
||||||
retu a:2[0] - a:1[0]
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:format(...)
|
|
||||||
let saved = !empty(a:1[1][1]) ? ' '.a:1[1][1] : ''
|
|
||||||
let current = !empty(a:1[1][2]) ? ' '.a:1[1][2] : ''
|
|
||||||
retu a:1[1][0].' ['.a:1[0].']'.saved.current
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:formatul(...)
|
|
||||||
let parts = matchlist(a:1,
|
|
||||||
\ '\v^\s+(\d+)\s+\d+\s+([^ ]+\s?[^ ]+|\d+\s\w+\s\w+)(\s*\d*)$')
|
|
||||||
retu parts == [] ? '----'
|
|
||||||
\ : parts[2].' ['.parts[1].']'.( parts[3] != '' ? ' saved' : '' )
|
|
||||||
endf
|
|
||||||
" Public {{{1
|
|
||||||
fu! ctrlp#undo#init()
|
|
||||||
let entries = s:undos[0] ? s:undos[1]['entries'] : s:undos[1]
|
|
||||||
if empty(entries) | retu [] | en
|
|
||||||
if !exists('s:lines')
|
|
||||||
if s:undos[0]
|
|
||||||
let entries = s:dict2list(s:flatten(entries, s:undos[1]['seq_cur']))
|
|
||||||
let s:lines = map(sort(entries, 's:compval'), 's:format(v:val)')
|
|
||||||
el
|
|
||||||
let s:lines = map(reverse(entries), 's:formatul(v:val)')
|
|
||||||
en
|
|
||||||
en
|
|
||||||
cal s:syntax()
|
|
||||||
retu s:lines
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#undo#accept(mode, str)
|
|
||||||
let undon = matchstr(a:str, '\[\zs\d\+\ze\]')
|
|
||||||
if empty(undon) | retu | en
|
|
||||||
cal ctrlp#exit()
|
|
||||||
exe 'u' undon
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#undo#id()
|
|
||||||
retu s:id
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#undo#enter()
|
|
||||||
let s:undos = s:getundo()
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#undo#exit()
|
|
||||||
unl! s:lines
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,110 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: autoload/ctrlp/utils.vim
|
|
||||||
" Description: Utilities
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Static variables {{{1
|
|
||||||
fu! ctrlp#utils#lash()
|
|
||||||
retu &ssl || !exists('+ssl') ? '/' : '\'
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! s:lash(...)
|
|
||||||
retu ( a:0 ? a:1 : getcwd() ) !~ '[\/]$' ? s:lash : ''
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#opts()
|
|
||||||
let s:lash = ctrlp#utils#lash()
|
|
||||||
let usrhome = $HOME . s:lash( $HOME )
|
|
||||||
let cahome = exists('$XDG_CACHE_HOME') ? $XDG_CACHE_HOME : usrhome.'.cache'
|
|
||||||
let cadir = isdirectory(usrhome.'.ctrlp_cache')
|
|
||||||
\ ? usrhome.'.ctrlp_cache' : cahome.s:lash(cahome).'ctrlp'
|
|
||||||
if exists('g:ctrlp_cache_dir')
|
|
||||||
let cadir = expand(g:ctrlp_cache_dir, 1)
|
|
||||||
if isdirectory(cadir.s:lash(cadir).'.ctrlp_cache')
|
|
||||||
let cadir = cadir.s:lash(cadir).'.ctrlp_cache'
|
|
||||||
en
|
|
||||||
en
|
|
||||||
let s:cache_dir = cadir
|
|
||||||
endf
|
|
||||||
cal ctrlp#utils#opts()
|
|
||||||
|
|
||||||
let s:wig_cond = v:version > 702 || ( v:version == 702 && has('patch051') )
|
|
||||||
" Files and Directories {{{1
|
|
||||||
fu! ctrlp#utils#cachedir()
|
|
||||||
retu s:cache_dir
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#cachefile(...)
|
|
||||||
let [tail, dir] = [a:0 == 1 ? '.'.a:1 : '', a:0 == 2 ? a:1 : getcwd()]
|
|
||||||
let cache_file = substitute(dir, '\([\/]\|^\a\zs:\)', '%', 'g').tail.'.txt'
|
|
||||||
retu a:0 == 1 ? cache_file : s:cache_dir.s:lash(s:cache_dir).cache_file
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#readfile(file)
|
|
||||||
if filereadable(a:file)
|
|
||||||
let data = readfile(a:file)
|
|
||||||
if empty(data) || type(data) != 3
|
|
||||||
unl data
|
|
||||||
let data = []
|
|
||||||
en
|
|
||||||
retu data
|
|
||||||
en
|
|
||||||
retu []
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#mkdir(dir)
|
|
||||||
if exists('*mkdir') && !isdirectory(a:dir)
|
|
||||||
sil! cal mkdir(a:dir, 'p')
|
|
||||||
en
|
|
||||||
retu a:dir
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#writecache(lines, ...)
|
|
||||||
if isdirectory(ctrlp#utils#mkdir(a:0 ? a:1 : s:cache_dir))
|
|
||||||
sil! cal writefile(a:lines, a:0 >= 2 ? a:2 : ctrlp#utils#cachefile())
|
|
||||||
en
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#glob(...)
|
|
||||||
let path = ctrlp#utils#fnesc(a:1, 'g')
|
|
||||||
retu s:wig_cond ? glob(path, a:2) : glob(path)
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#globpath(...)
|
|
||||||
retu call('globpath', s:wig_cond ? a:000 : a:000[:1])
|
|
||||||
endf
|
|
||||||
|
|
||||||
fu! ctrlp#utils#fnesc(path, type, ...)
|
|
||||||
if exists('*fnameescape')
|
|
||||||
if exists('+ssl')
|
|
||||||
if a:type == 'c'
|
|
||||||
let path = escape(a:path, '%#')
|
|
||||||
elsei a:type == 'f'
|
|
||||||
let path = fnameescape(a:path)
|
|
||||||
elsei a:type == 'g'
|
|
||||||
let path = escape(a:path, '?*')
|
|
||||||
en
|
|
||||||
let path = substitute(path, '[', '[[]', 'g')
|
|
||||||
el
|
|
||||||
let path = fnameescape(a:path)
|
|
||||||
en
|
|
||||||
el
|
|
||||||
if exists('+ssl')
|
|
||||||
if a:type == 'c'
|
|
||||||
let path = escape(a:path, '%#')
|
|
||||||
elsei a:type == 'f'
|
|
||||||
let path = escape(a:path, " \t\n%#*?|<\"")
|
|
||||||
elsei a:type == 'g'
|
|
||||||
let path = escape(a:path, '?*')
|
|
||||||
en
|
|
||||||
let path = substitute(path, '[', '[[]', 'g')
|
|
||||||
el
|
|
||||||
let path = escape(a:path, " \t\n*?[{`$\\%#'\"|!<")
|
|
||||||
en
|
|
||||||
en
|
|
||||||
retu a:0 ? escape(path, a:1) : path
|
|
||||||
endf
|
|
||||||
"}}}
|
|
||||||
|
|
||||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,68 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
" File: plugin/ctrlp.vim
|
|
||||||
" Description: Fuzzy file, buffer, mru, tag, etc finder.
|
|
||||||
" Author: Kien Nguyen <github.com/kien>
|
|
||||||
" =============================================================================
|
|
||||||
" GetLatestVimScripts: 3736 1 :AutoInstall: ctrlp.zip
|
|
||||||
|
|
||||||
if ( exists('g:loaded_ctrlp') && g:loaded_ctrlp ) || v:version < 700 || &cp
|
|
||||||
fini
|
|
||||||
en
|
|
||||||
let g:loaded_ctrlp = 1
|
|
||||||
|
|
||||||
let [g:ctrlp_lines, g:ctrlp_allfiles, g:ctrlp_alltags, g:ctrlp_alldirs,
|
|
||||||
\ g:ctrlp_allmixes, g:ctrlp_buftags, g:ctrlp_ext_vars, g:ctrlp_builtins]
|
|
||||||
\ = [[], [], [], [], {}, {}, [], 2]
|
|
||||||
|
|
||||||
if !exists('g:ctrlp_map') | let g:ctrlp_map = '<c-p>' | en
|
|
||||||
if !exists('g:ctrlp_cmd') | let g:ctrlp_cmd = 'CtrlP' | en
|
|
||||||
|
|
||||||
com! -n=? -com=dir CtrlP cal ctrlp#init(0, { 'dir': <q-args> })
|
|
||||||
com! -n=? -com=dir CtrlPMRUFiles cal ctrlp#init(2, { 'dir': <q-args> })
|
|
||||||
|
|
||||||
com! -bar CtrlPBuffer cal ctrlp#init(1)
|
|
||||||
com! -n=? CtrlPLastMode cal ctrlp#init(-1, { 'args': <q-args> })
|
|
||||||
|
|
||||||
com! -bar CtrlPClearCache cal ctrlp#clr()
|
|
||||||
com! -bar CtrlPClearAllCaches cal ctrlp#clra()
|
|
||||||
|
|
||||||
com! -bar ClearCtrlPCache cal ctrlp#clr()
|
|
||||||
com! -bar ClearAllCtrlPCaches cal ctrlp#clra()
|
|
||||||
|
|
||||||
com! -bar CtrlPCurWD cal ctrlp#init(0, { 'mode': '' })
|
|
||||||
com! -bar CtrlPCurFile cal ctrlp#init(0, { 'mode': 'c' })
|
|
||||||
com! -bar CtrlPRoot cal ctrlp#init(0, { 'mode': 'r' })
|
|
||||||
|
|
||||||
if g:ctrlp_map != '' && !hasmapto(':<c-u>'.g:ctrlp_cmd.'<cr>', 'n')
|
|
||||||
exe 'nn <silent>' g:ctrlp_map ':<c-u>'.g:ctrlp_cmd.'<cr>'
|
|
||||||
en
|
|
||||||
|
|
||||||
cal ctrlp#mrufiles#init()
|
|
||||||
|
|
||||||
com! -bar CtrlPTag cal ctrlp#init(ctrlp#tag#id())
|
|
||||||
com! -bar CtrlPQuickfix cal ctrlp#init(ctrlp#quickfix#id())
|
|
||||||
|
|
||||||
com! -n=? -com=dir CtrlPDir
|
|
||||||
\ cal ctrlp#init(ctrlp#dir#id(), { 'dir': <q-args> })
|
|
||||||
|
|
||||||
com! -n=? -com=buffer CtrlPBufTag
|
|
||||||
\ cal ctrlp#init(ctrlp#buffertag#cmd(0, <q-args>))
|
|
||||||
|
|
||||||
com! -bar CtrlPBufTagAll cal ctrlp#init(ctrlp#buffertag#cmd(1))
|
|
||||||
com! -bar CtrlPRTS cal ctrlp#init(ctrlp#rtscript#id())
|
|
||||||
com! -bar CtrlPUndo cal ctrlp#init(ctrlp#undo#id())
|
|
||||||
|
|
||||||
com! -n=? -com=buffer CtrlPLine
|
|
||||||
\ cal ctrlp#init(ctrlp#line#cmd(1, <q-args>))
|
|
||||||
|
|
||||||
com! -n=? -com=buffer CtrlPChange
|
|
||||||
\ cal ctrlp#init(ctrlp#changes#cmd(0, <q-args>))
|
|
||||||
|
|
||||||
com! -bar CtrlPChangeAll cal ctrlp#init(ctrlp#changes#cmd(1))
|
|
||||||
com! -bar CtrlPMixed cal ctrlp#init(ctrlp#mixed#id())
|
|
||||||
com! -bar CtrlPBookmarkDir cal ctrlp#init(ctrlp#bookmarkdir#id())
|
|
||||||
|
|
||||||
com! -n=? -com=dir CtrlPBookmarkDirAdd
|
|
||||||
\ cal ctrlp#call('ctrlp#bookmarkdir#add', <q-args>)
|
|
||||||
|
|
||||||
" vim:ts=2:sw=2:sts=2
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
#**This project is unmaintained**
|
|
||||||
**You should use [this fork](https://github.com/ctrlpvim/ctrlp.vim) instead.**
|
|
||||||
|
|
||||||
# ctrlp.vim
|
|
||||||
Full path fuzzy __file__, __buffer__, __mru__, __tag__, __...__ finder for Vim.
|
|
||||||
|
|
||||||
* Written in pure Vimscript for MacVim, gVim and Vim 7.0+.
|
|
||||||
* Full support for Vim's regexp as search patterns.
|
|
||||||
* Built-in Most Recently Used (MRU) files monitoring.
|
|
||||||
* Built-in project's root finder.
|
|
||||||
* Open multiple files at once.
|
|
||||||
* Create new files and directories.
|
|
||||||
* [Extensible][2].
|
|
||||||
|
|
||||||
![ctrlp][1]
|
|
||||||
|
|
||||||
## Basic Usage
|
|
||||||
* Run `:CtrlP` or `:CtrlP [starting-directory]` to invoke CtrlP in find file mode.
|
|
||||||
* Run `:CtrlPBuffer` or `:CtrlPMRU` to invoke CtrlP in find buffer or find MRU file mode.
|
|
||||||
* Run `:CtrlPMixed` to search in Files, Buffers and MRU files at the same time.
|
|
||||||
|
|
||||||
Check `:help ctrlp-commands` and `:help ctrlp-extensions` for other commands.
|
|
||||||
|
|
||||||
##### Once CtrlP is open:
|
|
||||||
* Press `<F5>` to purge the cache for the current directory to get new files, remove deleted files and apply new ignore options.
|
|
||||||
* Press `<c-f>` and `<c-b>` to cycle between modes.
|
|
||||||
* Press `<c-d>` to switch to filename only search instead of full path.
|
|
||||||
* Press `<c-r>` to switch to regexp mode.
|
|
||||||
* Use `<c-j>`, `<c-k>` or the arrow keys to navigate the result list.
|
|
||||||
* Use `<c-t>` or `<c-v>`, `<c-x>` to open the selected entry in a new tab or in a new split.
|
|
||||||
* Use `<c-n>`, `<c-p>` to select the next/previous string in the prompt's history.
|
|
||||||
* Use `<c-y>` to create a new file and its parent directories.
|
|
||||||
* Use `<c-z>` to mark/unmark multiple files and `<c-o>` to open them.
|
|
||||||
|
|
||||||
Run `:help ctrlp-mappings` or submit `?` in CtrlP for more mapping help.
|
|
||||||
|
|
||||||
* Submit two or more dots `..` to go up the directory tree by one or multiple levels.
|
|
||||||
* End the input string with a colon `:` followed by a command to execute it on the opening file(s):
|
|
||||||
Use `:25` to jump to line 25.
|
|
||||||
Use `:diffthis` when opening multiple files to run `:diffthis` on the first 4 files.
|
|
||||||
|
|
||||||
## Basic Options
|
|
||||||
* Change the default mapping and the default command to invoke CtrlP:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:ctrlp_map = '<c-p>'
|
|
||||||
let g:ctrlp_cmd = 'CtrlP'
|
|
||||||
```
|
|
||||||
|
|
||||||
* When invoked, unless a starting directory is specified, CtrlP will set its local working directory according to this variable:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:ctrlp_working_path_mode = 'ra'
|
|
||||||
```
|
|
||||||
|
|
||||||
`'c'` - the directory of the current file.
|
|
||||||
`'r'` - the nearest ancestor that contains one of these directories or files: `.git` `.hg` `.svn` `.bzr` `_darcs`
|
|
||||||
`'a'` - like c, but only if the current working directory outside of CtrlP is not a direct ancestor of the directory of the current file.
|
|
||||||
`0` or `''` (empty string) - disable this feature.
|
|
||||||
|
|
||||||
Define additional root markers with the `g:ctrlp_root_markers` option.
|
|
||||||
|
|
||||||
* Exclude files and directories using Vim's `wildignore` and CtrlP's own `g:ctrlp_custom_ignore`:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
set wildignore+=*/tmp/*,*.so,*.swp,*.zip " MacOSX/Linux
|
|
||||||
set wildignore+=*\\tmp\\*,*.swp,*.zip,*.exe " Windows
|
|
||||||
|
|
||||||
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
|
|
||||||
let g:ctrlp_custom_ignore = {
|
|
||||||
\ 'dir': '\v[\/]\.(git|hg|svn)$',
|
|
||||||
\ 'file': '\v\.(exe|so|dll)$',
|
|
||||||
\ 'link': 'some_bad_symbolic_links',
|
|
||||||
\ }
|
|
||||||
```
|
|
||||||
|
|
||||||
* Use a custom file listing command:
|
|
||||||
|
|
||||||
```vim
|
|
||||||
let g:ctrlp_user_command = 'find %s -type f' " MacOSX/Linux
|
|
||||||
let g:ctrlp_user_command = 'dir %s /-n /b /s /a-d' " Windows
|
|
||||||
```
|
|
||||||
|
|
||||||
Check `:help ctrlp-options` for other options.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
Use your favorite method or check the homepage for a [quick installation guide][3].
|
|
||||||
|
|
||||||
[1]: http://i.imgur.com/yIynr.png
|
|
||||||
[2]: https://github.com/kien/ctrlp.vim/tree/extensions
|
|
||||||
[3]: http://kien.github.com/ctrlp.vim#installation
|
|
||||||
|
|
@ -1,447 +0,0 @@
|
||||||
" Copyright (c) 2015 Junegunn Choi
|
|
||||||
"
|
|
||||||
" MIT License
|
|
||||||
"
|
|
||||||
" Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
" a copy of this software and associated documentation files (the
|
|
||||||
" "Software"), to deal in the Software without restriction, including
|
|
||||||
" without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
" distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
" permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
" the following conditions:
|
|
||||||
"
|
|
||||||
" The above copyright notice and this permission notice shall be
|
|
||||||
" included in all copies or substantial portions of the Software.
|
|
||||||
"
|
|
||||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! s:const(val, min, max)
|
|
||||||
return min([max([a:val, a:min]), a:max])
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:get_color(group, attr)
|
|
||||||
return synIDattr(synIDtrans(hlID(a:group)), a:attr)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:set_color(group, attr, color)
|
|
||||||
let gui = a:color =~ '^#'
|
|
||||||
execute printf('hi %s %s%s=%s', a:group, gui ? 'gui' : 'cterm', a:attr, a:color)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:blank(repel)
|
|
||||||
if bufwinnr(t:goyo_pads.r) <= bufwinnr(t:goyo_pads.l) + 1
|
|
||||||
\ || bufwinnr(t:goyo_pads.b) <= bufwinnr(t:goyo_pads.t) + 3
|
|
||||||
call s:goyo_off()
|
|
||||||
endif
|
|
||||||
execute 'wincmd' a:repel
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:init_pad(command)
|
|
||||||
execute a:command
|
|
||||||
|
|
||||||
setlocal buftype=nofile bufhidden=wipe nomodifiable nobuflisted noswapfile
|
|
||||||
\ nonu nocursorline nocursorcolumn winfixwidth winfixheight statusline=\
|
|
||||||
if exists('&rnu')
|
|
||||||
setlocal nornu
|
|
||||||
endif
|
|
||||||
if exists('&colorcolumn')
|
|
||||||
setlocal colorcolumn=
|
|
||||||
endif
|
|
||||||
let bufnr = winbufnr(0)
|
|
||||||
|
|
||||||
execute winnr('#') . 'wincmd w'
|
|
||||||
return bufnr
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:setup_pad(bufnr, vert, size, repel)
|
|
||||||
let win = bufwinnr(a:bufnr)
|
|
||||||
execute win . 'wincmd w'
|
|
||||||
execute (a:vert ? 'vertical ' : '') . 'resize ' . max([0, a:size])
|
|
||||||
augroup goyop
|
|
||||||
execute 'autocmd WinEnter,CursorMoved <buffer> nested call s:blank("'.a:repel.'")'
|
|
||||||
autocmd WinLeave <buffer> call s:hide_statusline()
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
" To hide scrollbars of pad windows in GVim
|
|
||||||
let diff = winheight(0) - line('$') - (has('gui_running') ? 2 : 0)
|
|
||||||
if diff > 0
|
|
||||||
setlocal modifiable
|
|
||||||
call append(0, map(range(1, diff), '""'))
|
|
||||||
normal! gg
|
|
||||||
setlocal nomodifiable
|
|
||||||
endif
|
|
||||||
execute winnr('#') . 'wincmd w'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:resize_pads()
|
|
||||||
augroup goyop
|
|
||||||
autocmd!
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
let t:goyo_dim.width = s:const(t:goyo_dim.width, 2, &columns)
|
|
||||||
let t:goyo_dim.height = s:const(t:goyo_dim.height, 2, &lines)
|
|
||||||
|
|
||||||
let vmargin = max([0, (&lines - t:goyo_dim.height) / 2 - 1])
|
|
||||||
let yoff = s:const(t:goyo_dim.yoff, - vmargin, vmargin)
|
|
||||||
let top = vmargin + yoff
|
|
||||||
let bot = vmargin - yoff - 1
|
|
||||||
call s:setup_pad(t:goyo_pads.t, 0, top, 'j')
|
|
||||||
call s:setup_pad(t:goyo_pads.b, 0, bot, 'k')
|
|
||||||
|
|
||||||
let nwidth = max([len(string(line('$'))) + 1, &numberwidth])
|
|
||||||
let width = t:goyo_dim.width + (&number ? nwidth : 0)
|
|
||||||
let hmargin = max([0, (&columns - width) / 2 - 1])
|
|
||||||
let xoff = s:const(t:goyo_dim.xoff, - hmargin, hmargin)
|
|
||||||
call s:setup_pad(t:goyo_pads.l, 1, hmargin + xoff, 'l')
|
|
||||||
call s:setup_pad(t:goyo_pads.r, 1, hmargin - xoff, 'h')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:tranquilize()
|
|
||||||
let bg = s:get_color('Normal', 'bg#')
|
|
||||||
for grp in ['NonText', 'FoldColumn', 'ColorColumn', 'VertSplit',
|
|
||||||
\ 'StatusLine', 'StatusLineNC', 'SignColumn']
|
|
||||||
" -1 on Vim / '' on GVim
|
|
||||||
if bg == -1 || empty(bg)
|
|
||||||
call s:set_color(grp, 'fg', get(g:, 'goyo_bg', 'black'))
|
|
||||||
call s:set_color(grp, 'bg', 'NONE')
|
|
||||||
else
|
|
||||||
call s:set_color(grp, 'fg', bg)
|
|
||||||
call s:set_color(grp, 'bg', bg)
|
|
||||||
endif
|
|
||||||
call s:set_color(grp, '', 'NONE')
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:hide_statusline()
|
|
||||||
let &l:statusline = repeat(' ', winwidth(0))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:hide_linenr()
|
|
||||||
if !get(g:, 'goyo_linenr', 0)
|
|
||||||
setlocal nonu
|
|
||||||
if exists('&rnu')
|
|
||||||
setlocal nornu
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if exists('&colorcolumn')
|
|
||||||
setlocal colorcolumn=
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:maps_nop()
|
|
||||||
let mapped = filter(['R', 'H', 'J', 'K', 'L', '|', '_'],
|
|
||||||
\ "empty(maparg(\"\<c-w>\".v:val, 'n'))")
|
|
||||||
for c in mapped
|
|
||||||
execute 'nnoremap <c-w>'.escape(c, '|').' <nop>'
|
|
||||||
endfor
|
|
||||||
return mapped
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:maps_resize()
|
|
||||||
let commands = {
|
|
||||||
\ '=': ':<c-u>let t:goyo_dim = <sid>parse_arg(t:goyo_dim_expr) <bar> call <sid>resize_pads()<cr>',
|
|
||||||
\ '>': ':<c-u>let t:goyo_dim.width = winwidth(0) + 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
|
|
||||||
\ '<': ':<c-u>let t:goyo_dim.width = winwidth(0) - 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
|
|
||||||
\ '+': ':<c-u>let t:goyo_dim.height += 2 * v:count1 <bar> call <sid>resize_pads()<cr>',
|
|
||||||
\ '-': ':<c-u>let t:goyo_dim.height -= 2 * v:count1 <bar> call <sid>resize_pads()<cr>'
|
|
||||||
\ }
|
|
||||||
let mapped = filter(keys(commands), "empty(maparg(\"\<c-w>\".v:val, 'n'))")
|
|
||||||
for c in mapped
|
|
||||||
execute 'nnoremap <silent> <c-w>'.c.' '.commands[c]
|
|
||||||
endfor
|
|
||||||
return mapped
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
nnoremap <silent> <plug>(goyo-resize) :<c-u>call <sid>resize_pads()<cr>
|
|
||||||
|
|
||||||
function! s:goyo_on(dim)
|
|
||||||
let dim = s:parse_arg(a:dim)
|
|
||||||
if empty(dim)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:orig_tab = tabpagenr()
|
|
||||||
let settings =
|
|
||||||
\ { 'laststatus': &laststatus,
|
|
||||||
\ 'showtabline': &showtabline,
|
|
||||||
\ 'fillchars': &fillchars,
|
|
||||||
\ 'winminwidth': &winminwidth,
|
|
||||||
\ 'winwidth': &winwidth,
|
|
||||||
\ 'winminheight': &winminheight,
|
|
||||||
\ 'winheight': &winheight,
|
|
||||||
\ 'ruler': &ruler,
|
|
||||||
\ 'sidescroll': &sidescroll,
|
|
||||||
\ 'sidescrolloff': &sidescrolloff
|
|
||||||
\ }
|
|
||||||
|
|
||||||
" New tab
|
|
||||||
tab split
|
|
||||||
|
|
||||||
let t:goyo_master = winbufnr(0)
|
|
||||||
let t:goyo_dim = dim
|
|
||||||
let t:goyo_dim_expr = a:dim
|
|
||||||
let t:goyo_pads = {}
|
|
||||||
let t:goyo_revert = settings
|
|
||||||
let t:goyo_maps = extend(s:maps_nop(), s:maps_resize())
|
|
||||||
if has('gui_running')
|
|
||||||
let t:goyo_revert.guioptions = &guioptions
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim-gitgutter
|
|
||||||
let t:goyo_disabled_gitgutter = get(g:, 'gitgutter_enabled', 0)
|
|
||||||
if t:goyo_disabled_gitgutter
|
|
||||||
silent! GitGutterDisable
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim-signify
|
|
||||||
let t:goyo_disabled_signify = exists('b:sy') && b:sy.active
|
|
||||||
if t:goyo_disabled_signify
|
|
||||||
SignifyToggle
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim-airline
|
|
||||||
let t:goyo_disabled_airline = exists('#airline')
|
|
||||||
if t:goyo_disabled_airline
|
|
||||||
AirlineToggle
|
|
||||||
endif
|
|
||||||
|
|
||||||
" vim-powerline
|
|
||||||
let t:goyo_disabled_powerline = exists('#PowerlineMain')
|
|
||||||
if t:goyo_disabled_powerline
|
|
||||||
augroup PowerlineMain
|
|
||||||
autocmd!
|
|
||||||
augroup END
|
|
||||||
augroup! PowerlineMain
|
|
||||||
endif
|
|
||||||
|
|
||||||
" lightline.vim
|
|
||||||
let t:goyo_disabled_lightline = exists('#lightline')
|
|
||||||
if t:goyo_disabled_lightline
|
|
||||||
silent! call lightline#disable()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:hide_linenr()
|
|
||||||
" Global options
|
|
||||||
let &winheight = max([&winminheight, 1])
|
|
||||||
set winminheight=1
|
|
||||||
set winheight=1
|
|
||||||
set winminwidth=1 winwidth=1
|
|
||||||
set laststatus=0
|
|
||||||
set showtabline=0
|
|
||||||
set noruler
|
|
||||||
set fillchars+=vert:\
|
|
||||||
set fillchars+=stl:.
|
|
||||||
set fillchars+=stlnc:\
|
|
||||||
set sidescroll=1
|
|
||||||
set sidescrolloff=0
|
|
||||||
|
|
||||||
" Hide left-hand scrollbars
|
|
||||||
if has('gui_running')
|
|
||||||
set guioptions-=l
|
|
||||||
set guioptions-=L
|
|
||||||
endif
|
|
||||||
|
|
||||||
let t:goyo_pads.l = s:init_pad('vertical topleft new')
|
|
||||||
let t:goyo_pads.r = s:init_pad('vertical botright new')
|
|
||||||
let t:goyo_pads.t = s:init_pad('topleft new')
|
|
||||||
let t:goyo_pads.b = s:init_pad('botright new')
|
|
||||||
|
|
||||||
call s:resize_pads()
|
|
||||||
call s:tranquilize()
|
|
||||||
|
|
||||||
augroup goyo
|
|
||||||
autocmd!
|
|
||||||
autocmd TabLeave * call s:goyo_off()
|
|
||||||
autocmd VimResized * call s:resize_pads()
|
|
||||||
autocmd ColorScheme * call s:tranquilize()
|
|
||||||
autocmd BufWinEnter * call s:hide_linenr() | call s:hide_statusline()
|
|
||||||
autocmd WinEnter,WinLeave * call s:hide_statusline()
|
|
||||||
if has('nvim')
|
|
||||||
autocmd TermClose * call feedkeys("\<plug>(goyo-resize)")
|
|
||||||
endif
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
call s:hide_statusline()
|
|
||||||
if exists('g:goyo_callbacks[0]')
|
|
||||||
call g:goyo_callbacks[0]()
|
|
||||||
endif
|
|
||||||
if exists('#User#GoyoEnter')
|
|
||||||
doautocmd User GoyoEnter
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:goyo_off()
|
|
||||||
if !exists('#goyo')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Oops, not this tab
|
|
||||||
if !exists('t:goyo_revert')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Clear auto commands
|
|
||||||
augroup goyo
|
|
||||||
autocmd!
|
|
||||||
augroup END
|
|
||||||
augroup! goyo
|
|
||||||
augroup goyop
|
|
||||||
autocmd!
|
|
||||||
augroup END
|
|
||||||
augroup! goyop
|
|
||||||
|
|
||||||
for c in t:goyo_maps
|
|
||||||
execute 'nunmap <c-w>'.escape(c, '|')
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let goyo_revert = t:goyo_revert
|
|
||||||
let goyo_disabled_gitgutter = t:goyo_disabled_gitgutter
|
|
||||||
let goyo_disabled_signify = t:goyo_disabled_signify
|
|
||||||
let goyo_disabled_airline = t:goyo_disabled_airline
|
|
||||||
let goyo_disabled_powerline = t:goyo_disabled_powerline
|
|
||||||
let goyo_disabled_lightline = t:goyo_disabled_lightline
|
|
||||||
let goyo_orig_buffer = t:goyo_master
|
|
||||||
let [line, col] = [line('.'), col('.')]
|
|
||||||
|
|
||||||
if tabpagenr() == 1
|
|
||||||
tabnew
|
|
||||||
normal! gt
|
|
||||||
bd
|
|
||||||
endif
|
|
||||||
tabclose
|
|
||||||
execute 'normal! '.s:orig_tab.'gt'
|
|
||||||
if winbufnr(0) == goyo_orig_buffer
|
|
||||||
" Doesn't work if window closed with `q`
|
|
||||||
execute printf('normal! %dG%d|', line, col)
|
|
||||||
endif
|
|
||||||
|
|
||||||
let wmw = remove(goyo_revert, 'winminwidth')
|
|
||||||
let ww = remove(goyo_revert, 'winwidth')
|
|
||||||
let &winwidth = ww
|
|
||||||
let &winminwidth = wmw
|
|
||||||
let wmh = remove(goyo_revert, 'winminheight')
|
|
||||||
let wh = remove(goyo_revert, 'winheight')
|
|
||||||
let &winheight = max([wmh, 1])
|
|
||||||
let &winminheight = wmh
|
|
||||||
let &winheight = wh
|
|
||||||
|
|
||||||
for [k, v] in items(goyo_revert)
|
|
||||||
execute printf('let &%s = %s', k, string(v))
|
|
||||||
endfor
|
|
||||||
execute 'colo '. get(g:, 'colors_name', 'default')
|
|
||||||
|
|
||||||
if goyo_disabled_gitgutter
|
|
||||||
silent! GitGutterEnable
|
|
||||||
endif
|
|
||||||
|
|
||||||
if goyo_disabled_signify
|
|
||||||
silent! if !b:sy.active
|
|
||||||
SignifyToggle
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if goyo_disabled_airline && !exists('#airline')
|
|
||||||
AirlineToggle
|
|
||||||
" For some reason, Airline requires two refreshes to avoid display
|
|
||||||
" artifacts
|
|
||||||
silent! AirlineRefresh
|
|
||||||
silent! AirlineRefresh
|
|
||||||
endif
|
|
||||||
|
|
||||||
if goyo_disabled_powerline && !exists('#PowerlineMain')
|
|
||||||
doautocmd PowerlineStartup VimEnter
|
|
||||||
silent! PowerlineReloadColorscheme
|
|
||||||
endif
|
|
||||||
|
|
||||||
if goyo_disabled_lightline
|
|
||||||
silent! call lightline#enable()
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists('#Powerline')
|
|
||||||
doautocmd Powerline ColorScheme
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists('g:goyo_callbacks[1]')
|
|
||||||
call g:goyo_callbacks[1]()
|
|
||||||
endif
|
|
||||||
if exists('#User#GoyoLeave')
|
|
||||||
doautocmd User GoyoLeave
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:relsz(expr, limit)
|
|
||||||
if a:expr !~ '%$'
|
|
||||||
return str2nr(a:expr)
|
|
||||||
endif
|
|
||||||
return a:limit * str2nr(a:expr[:-2]) / 100
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:parse_arg(arg)
|
|
||||||
if exists('g:goyo_height') || !exists('g:goyo_margin_top') && !exists('g:goyo_margin_bottom')
|
|
||||||
let height = s:relsz(get(g:, 'goyo_height', '85%'), &lines)
|
|
||||||
let yoff = 0
|
|
||||||
else
|
|
||||||
let top = max([0, s:relsz(get(g:, 'goyo_margin_top', 4), &lines)])
|
|
||||||
let bot = max([0, s:relsz(get(g:, 'goyo_margin_bottom', 4), &lines)])
|
|
||||||
let height = &lines - top - bot
|
|
||||||
let yoff = top - bot
|
|
||||||
endif
|
|
||||||
|
|
||||||
let dim = { 'width': s:relsz(get(g:, 'goyo_width', 80), &columns),
|
|
||||||
\ 'height': height,
|
|
||||||
\ 'xoff': 0,
|
|
||||||
\ 'yoff': yoff }
|
|
||||||
if empty(a:arg)
|
|
||||||
return dim
|
|
||||||
endif
|
|
||||||
let parts = matchlist(a:arg, '^\s*\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\%(x\([0-9]\+%\?\)\?\([+-][0-9]\+%\?\)\?\)\?\s*$')
|
|
||||||
if empty(parts)
|
|
||||||
echohl WarningMsg
|
|
||||||
echo 'Invalid dimension expression: '.a:arg
|
|
||||||
echohl None
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
if !empty(parts[1]) | let dim.width = s:relsz(parts[1], &columns) | endif
|
|
||||||
if !empty(parts[2]) | let dim.xoff = s:relsz(parts[2], &columns) | endif
|
|
||||||
if !empty(parts[3]) | let dim.height = s:relsz(parts[3], &lines) | endif
|
|
||||||
if !empty(parts[4]) | let dim.yoff = s:relsz(parts[4], &lines) | endif
|
|
||||||
return dim
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! goyo#execute(bang, dim)
|
|
||||||
if a:bang
|
|
||||||
if exists('#goyo')
|
|
||||||
call s:goyo_off()
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if exists('#goyo') == 0
|
|
||||||
call s:goyo_on(a:dim)
|
|
||||||
elseif !empty(a:dim)
|
|
||||||
if winnr('$') < 5
|
|
||||||
call s:goyo_off()
|
|
||||||
return goyo#execute(a:bang, a:dim)
|
|
||||||
endif
|
|
||||||
let dim = s:parse_arg(a:dim)
|
|
||||||
if !empty(dim)
|
|
||||||
let t:goyo_dim = dim
|
|
||||||
let t:goyo_dim_expr = a:dim
|
|
||||||
call s:resize_pads()
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call s:goyo_off()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
|
||||||
unlet s:cpo_save
|
|
||||||
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
" Copyright (c) 2015 Junegunn Choi
|
|
||||||
"
|
|
||||||
" MIT License
|
|
||||||
"
|
|
||||||
" Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
" a copy of this software and associated documentation files (the
|
|
||||||
" "Software"), to deal in the Software without restriction, including
|
|
||||||
" without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
" distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
" permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
" the following conditions:
|
|
||||||
"
|
|
||||||
" The above copyright notice and this permission notice shall be
|
|
||||||
" included in all copies or substantial portions of the Software.
|
|
||||||
"
|
|
||||||
" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
command! -nargs=? -bar -bang Goyo call goyo#execute(<bang>0, <q-args>)
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 705e68d90d6596c621093a28bf480a572a41ad02
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
This is a mirror of http://www.vim.org/scripts/script.php?script_id=3065
|
|
||||||
|
|
||||||
This is a pleasant and ergonomic light-background color scheme, designed for long hours of coding and working. The UI elements are muted without being drab, the syntax elements are colorful without being garish, and the background is relaxing without being soporific. It is of a low-enough contrast so as not to cause eye-burn, but high-enough contrast so as not to cause eye-strain. The syntax coloration offers just a little higher resolution than most, distinguishing between class names vs. functions, strings and numbers vs. other constants, etc. Many of the colors in this color scheme are drawn from Mayan murals, paintings and codices, and thus the name.
|
|
||||||
|
|
||||||
Screenshots:
|
|
||||||
==========
|
|
||||||
|
|
||||||
- Python: http://jeetworks.org/files/images/mayansmoke-python1.png
|
|
||||||
- C++: http://jeetworks.org/files/images/mayansmoke-cpp1.png
|
|
||||||
|
|
||||||
Customization:
|
|
||||||
==============
|
|
||||||
|
|
||||||
If any of the following highlights are defined (e.g., in your "~/.vimrc"), these will override the default highlight definitions:
|
|
||||||
|
|
||||||
MayanSmokeCursorLine (will be applied to: CursorColumn and CursorLine)
|
|
||||||
MayanSmokeSearch (will be applied to: Search and IncSearch)
|
|
||||||
MayanSmokeSpecialKey (will be applied to: SpecialKey)
|
|
||||||
|
|
||||||
For example, you can set the following in your "~/.vimrc" to select your own colors for these items:
|
|
||||||
|
|
||||||
hi MayanSmokeCursorLine guifg=NONE guibg=yellow gui=NONE
|
|
||||||
hi MayanSmokeSearch guifg=white guibg=blue gui=NONE
|
|
||||||
hi MayanSmokeSpecialKey guifg=NONE guibg=green gui=NONE
|
|
||||||
|
|
||||||
Alternatively, you can define one or more of the following values in your "~/.vimrc" to select different pre-defined levels of visibility for the above highlights:
|
|
||||||
|
|
||||||
let g:mayansmoke_cursor_line_visibility = 0 " lower visibility
|
|
||||||
let g:mayansmoke_cursor_line_visibility = 1 " medium visibility
|
|
||||||
let g:mayansmoke_cursor_line_visibility = 2 " higher visibility
|
|
||||||
|
|
||||||
let g:mayansmoke_search_visibility = 0 " low visibility
|
|
||||||
let g:mayansmoke_search_visibility = 1 " medium visibility (default)
|
|
||||||
let g:mayansmoke_search_visibility = 2 " high visibility
|
|
||||||
let g:mayansmoke_search_visibility = 3 " very high visibility
|
|
||||||
let g:mayansmoke_search_visibility = 4 " highest visibility
|
|
||||||
|
|
||||||
let g:mayansmoke_special_key_visibility = 0 " lower visibility
|
|
||||||
let g:mayansmoke_special_key_visibility = 1 " medium visibility
|
|
||||||
let g:mayansmoke_special_key_visibility = 2 " higher visibility
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,343 +0,0 @@
|
||||||
" =============================================================================
|
|
||||||
"
|
|
||||||
" File: mayansmoke.vim
|
|
||||||
" Description: Vim color scheme file
|
|
||||||
" Maintainer: Jeet Sukumaran (GUI colors); Clayton Parker (cterm colors)
|
|
||||||
"
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" Initialization and Setup {{{1
|
|
||||||
" =============================================================================
|
|
||||||
set background=light
|
|
||||||
highlight clear
|
|
||||||
if exists("syntax_on")
|
|
||||||
syntax reset
|
|
||||||
endif
|
|
||||||
let colors_name = "mayansmoke"
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Normal Color {{{1
|
|
||||||
" =============================================================================
|
|
||||||
hi Normal gui=NONE guifg=Black guibg=#F4F4E8
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" Highlight Groups {{{1
|
|
||||||
" =============================================================================
|
|
||||||
" Groups (see ':help highlight-groups'):
|
|
||||||
" ColorColumn highlight to use with ':set colorcolumn'
|
|
||||||
" Cursor the character under the cursor
|
|
||||||
" CursorIM like Cursor, but used when in IME mode |CursorIM|
|
|
||||||
" CursorColumn the screen column that the cursor is in when 'cursorcolumn' is set
|
|
||||||
" CursorLine the screen line that the cursor is in when 'cursorline' is set
|
|
||||||
" Directory directory names (and other special names in listings)
|
|
||||||
" DiffAdd diff mode: Added line |diff.txt|
|
|
||||||
" DiffChange diff mode: Changed line |diff.txt|
|
|
||||||
" DiffDelete diff mode: Deleted line |diff.txt|
|
|
||||||
" DiffText diff mode: Changed text within a changed line |diff.txt|
|
|
||||||
" ErrorMsg error messages on the command line
|
|
||||||
" VertSplit the column separating vertically split windows
|
|
||||||
" Folded line used for closed folds
|
|
||||||
" FoldColumn 'foldcolumn'
|
|
||||||
" SignColumn column where |signs| are displayed
|
|
||||||
" IncSearch 'incsearch' highlighting; also used for the text replaced with ":s///c"
|
|
||||||
" LineNr Line number for ":number" and ":#" commands, and when 'number' option is set.
|
|
||||||
" MatchParen The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt|
|
|
||||||
" ModeMsg 'showmode' message (e.g., "-- INSERT --")
|
|
||||||
" MoreMsg |more-prompt|
|
|
||||||
" NonText '~' and '@' at the end of the window, etc.
|
|
||||||
" Normal normal text
|
|
||||||
" Pmenu Popup menu: normal item.
|
|
||||||
" PmenuSel Popup menu: selected item.
|
|
||||||
" PmenuSbar Popup menu: scrollbar.
|
|
||||||
" PmenuThumb Popup menu: Thumb of the scrollbar.
|
|
||||||
" Question |hit-enter| prompt and yes/no questions
|
|
||||||
" Search Last search pattern highlighting (see 'hlsearch').
|
|
||||||
" SpecialKey Meta and special keys listed with ":map", text that is displayed differently from what it really is (such as tabs, spaces in listchars etc.).
|
|
||||||
" SpellBad Word that is not recognized by the spellchecker. |spell|
|
|
||||||
" SpellCap Word that should start with a capital. |spell|
|
|
||||||
" SpellLocal Word that is recognized by the spellchecker as one that is
|
|
||||||
" SpellRare Word that is recognized by the spellchecker as one that is hardly ever used. |spell|
|
|
||||||
" StatusLine status line of current window
|
|
||||||
" StatusLineNC status lines of not-current windows
|
|
||||||
" TabLine tab pages line, not active tab page label
|
|
||||||
" TabLineFill tab pages line, where there are no labels
|
|
||||||
" TabLineSel tab pages line, active tab page label
|
|
||||||
" Title titles for output from ":set all", ":autocmd" etc.
|
|
||||||
" Visual Visual mode selection
|
|
||||||
" VisualNOS Visual mode selection when vim is "Not Owning the Selection".
|
|
||||||
" WarningMsg warning messages
|
|
||||||
" WildMenu current match in 'wildmenu' completion
|
|
||||||
hi ColorColumn guifg=NONE guibg=#EEEEDD
|
|
||||||
hi Cursor guifg=bg guibg=fg gui=NONE
|
|
||||||
if hlexists('MayanSmokeCursorLine')
|
|
||||||
hi link CursorColumn MayanSmokeCursorLine
|
|
||||||
hi link CursorLine MayanSmokeCursorLine
|
|
||||||
elseif exists('g:mayansmoke_cursor_line_visibility') && g:mayansmoke_cursor_line_visibility >= 2
|
|
||||||
hi CursorColumn guifg=NONE guibg=NavajoWhite gui=NONE
|
|
||||||
hi CursorLine guifg=NONE guibg=NavajoWhite gui=NONE
|
|
||||||
elseif exists('g:mayansmoke_cursor_line_visibility') && g:mayansmoke_cursor_line_visibility >= 1
|
|
||||||
hi CursorColumn guifg=NONE guibg=white gui=NONE
|
|
||||||
hi CursorLine guifg=NONE guibg=white gui=NONE
|
|
||||||
else
|
|
||||||
hi CursorColumn guifg=NONE guibg=#FFFDD0 gui=NONE
|
|
||||||
hi CursorLine guifg=NONE guibg=#FFFDD0 gui=NONE
|
|
||||||
endif
|
|
||||||
hi CursorIM guifg=bg guibg=fg gui=NONE
|
|
||||||
hi lCursor guifg=bg guibg=fg gui=NONE
|
|
||||||
hi DiffAdd guifg=NONE guibg=SeaGreen1 gui=NONE
|
|
||||||
hi DiffChange guifg=NONE guibg=LightSkyBlue1 gui=NONE
|
|
||||||
hi DiffDelete guifg=NONE guibg=LightCoral gui=NONE
|
|
||||||
hi DiffText guifg=black guibg=LightCyan1 gui=NONE
|
|
||||||
hi Directory guifg=#1600FF guibg=bg gui=NONE
|
|
||||||
hi ErrorMsg guifg=Red2 guibg=NONE gui=NONE
|
|
||||||
hi FoldColumn guifg=SteelBlue4 guibg=LightYellow2 gui=bold
|
|
||||||
hi Folded guifg=SteelBlue4 guibg=Gainsboro gui=italic
|
|
||||||
if hlexists('MayanSmokeSearch')
|
|
||||||
hi link IncSearch MayanSmokeSearch
|
|
||||||
hi link Search MayanSmokeSearch
|
|
||||||
elseif exists('g:mayansmoke_search_visibility') && g:mayansmoke_search_visibility >= 4
|
|
||||||
hi IncSearch guifg=white guibg=red gui=NONE
|
|
||||||
hi Search guifg=white guibg=red gui=NONE
|
|
||||||
elseif exists('g:mayansmoke_search_visibility') && g:mayansmoke_search_visibility == 3
|
|
||||||
hi IncSearch guifg=black guibg=gold gui=NONE
|
|
||||||
hi Search guifg=black guibg=gold gui=NONE
|
|
||||||
elseif exists('g:mayansmoke_search_visibility') && g:mayansmoke_search_visibility == 2
|
|
||||||
hi IncSearch guifg=white guibg=darkorange gui=NONE
|
|
||||||
hi Search guifg=white guibg=darkorange gui=NONE
|
|
||||||
elseif exists('g:mayansmoke_search_visibility') && g:mayansmoke_search_visibility == 0
|
|
||||||
hi IncSearch guifg=black guibg=tan gui=NONE
|
|
||||||
hi Search guifg=black guibg=tan gui=NONE
|
|
||||||
else
|
|
||||||
hi IncSearch guifg=black guibg=khaki gui=NONE
|
|
||||||
hi Search guifg=black guibg=khaki gui=NONE
|
|
||||||
endif
|
|
||||||
hi LineNr guifg=#666677 guibg=#cccfbf gui=NONE
|
|
||||||
hi MatchParen guifg=black guibg=LemonChiffon3 gui=bold
|
|
||||||
hi ModeMsg guifg=White guibg=tomato1 gui=bold
|
|
||||||
hi MoreMsg guifg=SeaGreen4 guibg=bg gui=bold
|
|
||||||
hi NonText guifg=LightCyan3 guibg=bg gui=bold
|
|
||||||
|
|
||||||
hi Pmenu guifg=Orange4 guibg=LightYellow3 gui=NONE
|
|
||||||
hi PmenuSel guifg=ivory2 guibg=NavajoWhite4 gui=bold
|
|
||||||
hi PmenuSbar guifg=White guibg=#999666 gui=NONE
|
|
||||||
hi PmenuThumb guifg=White guibg=#7B7939 gui=NONE
|
|
||||||
|
|
||||||
hi Question guifg=Chartreuse4 guibg=bg gui=bold
|
|
||||||
hi SignColumn guifg=white guibg=LightYellow3 gui=NONE
|
|
||||||
if hlexists('MayanSmokeSpecialKey')
|
|
||||||
hi link SpecialKey MayanSmokeSpecialKey
|
|
||||||
elseif exists('g:mayansmoke_special_key_visibility') && g:mayansmoke_special_key_visibility >= 2
|
|
||||||
hi SpecialKey guifg=black guibg=NavajoWhite gui=NONE
|
|
||||||
elseif exists('g:mayansmoke_special_key_visibility') && g:mayansmoke_special_key_visibility == 0
|
|
||||||
hi SpecialKey guifg=bisque3 guibg=NONE gui=NONE
|
|
||||||
else
|
|
||||||
hi SpecialKey guifg=white guibg=ivory3 gui=NONE
|
|
||||||
endif
|
|
||||||
hi SpellBad guisp=Firebrick2 gui=undercurl
|
|
||||||
hi SpellCap guisp=Blue gui=undercurl
|
|
||||||
hi SpellLocal guisp=DarkCyan gui=undercurl
|
|
||||||
hi SpellRare guisp=Magenta gui=undercurl
|
|
||||||
hi StatusLine guifg=#FFFEEE guibg=#557788 gui=NONE
|
|
||||||
" hi StatusLineNC guifg=#EAE6E2 guibg=LightSteelBlue3 gui=italic
|
|
||||||
hi StatusLineNC guifg=#F4F4EE guibg=#99aabb gui=italic
|
|
||||||
hi TabLine guifg=fg guibg=LightGrey gui=underline
|
|
||||||
hi TabLineFill guifg=fg guibg=bg gui=reverse
|
|
||||||
hi TabLineSel guifg=fg guibg=bg gui=bold
|
|
||||||
hi Title guifg=DeepSkyBlue3 guibg=bg gui=bold
|
|
||||||
hi VertSplit guifg=#99aabb guibg=#99aabb
|
|
||||||
hi Visual guifg=white guibg=DeepSkyBlue1 gui=NONE
|
|
||||||
hi WarningMsg guifg=Firebrick2 guibg=bg gui=NONE
|
|
||||||
hi WildMenu guifg=Black guibg=SkyBlue gui=NONE
|
|
||||||
" }}}
|
|
||||||
|
|
||||||
" 256-Color Terminal Colors, by Clayton Parker {{{1
|
|
||||||
" =============================================================================
|
|
||||||
hi Normal cterm=NONE ctermfg=16 ctermbg=255
|
|
||||||
hi Comment ctermfg=110
|
|
||||||
hi Constant ctermfg=214
|
|
||||||
hi String ctermfg=30
|
|
||||||
hi Boolean ctermfg=88
|
|
||||||
hi Identifier ctermfg=160
|
|
||||||
hi Function ctermfg=132
|
|
||||||
hi Statement ctermfg=21
|
|
||||||
hi Keyword ctermfg=45
|
|
||||||
hi PreProc ctermfg=27
|
|
||||||
hi Type ctermfg=147
|
|
||||||
hi Special ctermfg=64
|
|
||||||
hi Ignore ctermfg=255
|
|
||||||
hi Error ctermfg=196 ctermbg=255 term=none
|
|
||||||
hi Todo ctermfg=136 ctermbg=255 cterm=NONE
|
|
||||||
hi VimError ctermfg=160 ctermbg=16
|
|
||||||
hi VimCommentTitle ctermfg=110
|
|
||||||
hi qfLineNr ctermfg=16 ctermbg=46 cterm=NONE
|
|
||||||
hi pythonDecorator ctermfg=208 ctermbg=255 cterm=NONE
|
|
||||||
hi Cursor ctermfg=255 ctermbg=16 cterm=NONE
|
|
||||||
hi CursorColumn ctermfg=NONE ctermbg=255 cterm=NONE
|
|
||||||
hi CursorIM ctermfg=255 ctermbg=16 cterm=NONE
|
|
||||||
hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE
|
|
||||||
hi lCursor ctermfg=255 ctermbg=16 cterm=NONE
|
|
||||||
hi DiffAdd ctermfg=16 ctermbg=48 cterm=NONE
|
|
||||||
hi DiffChange ctermfg=16 ctermbg=153 cterm=NONE
|
|
||||||
hi DiffDelete ctermfg=16 ctermbg=203 cterm=NONE
|
|
||||||
hi DiffText ctermfg=16 ctermbg=226 cterm=NONE
|
|
||||||
hi Directory ctermfg=21 ctermbg=255 cterm=NONE
|
|
||||||
hi ErrorMsg ctermfg=160 ctermbg=NONE cterm=NONE
|
|
||||||
hi FoldColumn ctermfg=24 ctermbg=252 cterm=NONE
|
|
||||||
hi Folded ctermfg=24 ctermbg=252 cterm=NONE
|
|
||||||
hi IncSearch ctermfg=255 ctermbg=160 cterm=NONE
|
|
||||||
hi LineNr ctermfg=253 ctermbg=110 cterm=NONE
|
|
||||||
hi NonText ctermfg=110 ctermbg=255 cterm=NONE
|
|
||||||
hi Pmenu ctermfg=fg ctermbg=195 cterm=NONE
|
|
||||||
hi PmenuSbar ctermfg=255 ctermbg=153 cterm=NONE
|
|
||||||
hi PmenuSel ctermfg=255 ctermbg=21 cterm=NONE
|
|
||||||
hi PmenuThumb ctermfg=111 ctermbg=255 cterm=NONE
|
|
||||||
hi SignColumn ctermfg=110 ctermbg=254 cterm=NONE
|
|
||||||
hi Search ctermfg=255 ctermbg=160 cterm=NONE
|
|
||||||
hi SpecialKey ctermfg=255 ctermbg=144 cterm=NONE
|
|
||||||
hi SpellBad ctermfg=16 ctermbg=229 cterm=NONE
|
|
||||||
hi SpellCap ctermfg=16 ctermbg=231 cterm=NONE
|
|
||||||
hi SpellLocal ctermfg=16 ctermbg=231 cterm=NONE
|
|
||||||
hi SpellRare ctermfg=16 ctermbg=226 cterm=NONE
|
|
||||||
hi StatusLine ctermfg=255 ctermbg=24 cterm=NONE
|
|
||||||
hi StatusLineNC ctermfg=253 ctermbg=110 cterm=NONE
|
|
||||||
hi Title ctermfg=75 ctermbg=255 cterm=NONE
|
|
||||||
hi VertSplit ctermfg=255 ctermbg=24 cterm=NONE
|
|
||||||
hi Visual ctermfg=255 ctermbg=153 cterm=NONE
|
|
||||||
hi WildMenu ctermfg=16 ctermbg=117 cterm=NONE
|
|
||||||
|
|
||||||
" 1}}}
|
|
||||||
|
|
||||||
" Syntax {{{1
|
|
||||||
" =============================================================================
|
|
||||||
|
|
||||||
" General {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
" Groups ('*' = major; see 'help group-name'):
|
|
||||||
" *Comment any comment
|
|
||||||
" *Constant any constant
|
|
||||||
" String a string constant: "this is a string"
|
|
||||||
" Character a character constant: 'c', '\n'
|
|
||||||
" Number a number constant: 234, 0xff
|
|
||||||
" Boolean a boolean constant: TRUE, false
|
|
||||||
" Float a floating point constant: 2.3e10
|
|
||||||
" *Identifier any variable name
|
|
||||||
" Function function name (also: methods for classes)
|
|
||||||
" *Statement any statement
|
|
||||||
" Conditional if, then, else, endif, switch, etc.
|
|
||||||
" Repeat for, do, while, etc.
|
|
||||||
" Label case, default, etc.
|
|
||||||
" Operator "sizeof", "+", "*", etc.
|
|
||||||
" Keyword any other keyword
|
|
||||||
" Exception try, catch, throw
|
|
||||||
" *PreProc generic Preprocessor
|
|
||||||
" Include preprocessor #include
|
|
||||||
" Define preprocessor #define
|
|
||||||
" Macro same as Define
|
|
||||||
" PreCondit preprocessor #if, #else, #endif, etc.
|
|
||||||
" *Type int, long, char, etc.
|
|
||||||
" StorageClass static, register, volatile, etc.
|
|
||||||
" Structure struct, union, enum, etc.
|
|
||||||
" Typedef A typedef
|
|
||||||
" *Special any special symbol
|
|
||||||
" SpecialChar special character in a constant
|
|
||||||
" Tag you can use CTRL-] on this
|
|
||||||
" Delimiter character that needs attention
|
|
||||||
" SpecialComment special things inside a comment
|
|
||||||
" Debug debugging statements
|
|
||||||
" *Error any erroneous construct
|
|
||||||
" *Todo anything that needs extra attention
|
|
||||||
" hi Comment guifg=#A2B5CD guibg=NONE gui=italic
|
|
||||||
hi Comment guifg=#96AAC2 guibg=NONE gui=italic
|
|
||||||
hi Constant guifg=DarkOrange guibg=NONE gui=NONE
|
|
||||||
hi String guifg=Aquamarine4 guibg=NONE gui=NONE
|
|
||||||
hi Boolean guifg=IndianRed4 guibg=NONE gui=NONE
|
|
||||||
hi Identifier guifg=brown3 guibg=NONE gui=NONE
|
|
||||||
hi Function guifg=VioletRed4 guibg=NONE gui=NONE
|
|
||||||
hi Statement guifg=blue1 guibg=NONE gui=NONE
|
|
||||||
hi Keyword guifg=DodgerBlue guibg=NONE gui=NONE
|
|
||||||
hi PreProc guifg=blue1 guibg=NONE gui=NONE
|
|
||||||
hi Type guifg=LightSlateBlue guibg=NONE gui=NONE
|
|
||||||
hi Special guifg=DarkOliveGreen4 guibg=NONE gui=NONE
|
|
||||||
hi Ignore guifg=bg guibg=NONE gui=NONE
|
|
||||||
hi Error guifg=Red guibg=NONE gui=underline
|
|
||||||
hi Todo guifg=tan4 guibg=NONE gui=underline
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" Vim {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
hi VimError guifg=red guibg=Black gui=bold
|
|
||||||
hi VimCommentTitle guifg=DarkSlateGray4 guibg=bg gui=bold,italic
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" QuickFix {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
" syn match qfFileName "^[^|]*" nextgroup=qfSeparator
|
|
||||||
" syn match qfSeparator "|" nextgroup=qfLineNr contained
|
|
||||||
" syn match qfLineNr "[^|]*" contained contains=qfError
|
|
||||||
" syn match qfError "error" contained
|
|
||||||
hi qfFileName guifg=LightSkyBlue4 guibg=NONE gui=italic
|
|
||||||
hi qfLineNr guifg=coral guibg=NONE gui=bold
|
|
||||||
hi qfError guifg=red guibg=NONE gui=bold
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" Python {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
hi pythonDecorator guifg=orange3 guibg=NONE gui=bold
|
|
||||||
hi link pythonDecoratorFunction pythonDecorator
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" Diff {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
hi diffOldFile guifg=#006666 guibg=NONE gui=NONE
|
|
||||||
hi diffNewFile guifg=#0088FF guibg=NONE gui=bold
|
|
||||||
hi diffFile guifg=#0000FF guibg=NONE gui=NONE
|
|
||||||
hi link diffOnly Constant
|
|
||||||
hi link diffIdentical Constant
|
|
||||||
hi link diffDiffer Constant
|
|
||||||
hi link diffBDiffer Constant
|
|
||||||
hi link diffIsA Constant
|
|
||||||
hi link diffNoEOL Constant
|
|
||||||
hi link diffCommon Constant
|
|
||||||
hi diffRemoved guifg=#BB0000 guibg=NONE gui=NONE
|
|
||||||
hi diffChanged guifg=DarkSeaGreen guibg=NONE gui=NONE
|
|
||||||
hi diffAdded guifg=#00AA00 guibg=NONE gui=NONE
|
|
||||||
hi diffLine guifg=thistle4 guibg=NONE gui=italic
|
|
||||||
hi link diffSubname diffLine
|
|
||||||
hi link diffComment Comment
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" PHP (contributed by Ryan Kulla) {{{2
|
|
||||||
" -----------------------------------------------------------------------------
|
|
||||||
" Ryan Kulla's addition for PHP syntax highlighting (for regular/terminal vim)
|
|
||||||
hi phpConditional ctermfg=21 cterm=NONE guifg=black
|
|
||||||
hi phpIdentifier ctermfg=0 cterm=NONE guifg=black
|
|
||||||
hi phpOperator ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpRegion ctermfg=132 cterm=NONE guifg=VioletRed4
|
|
||||||
hi phpComparison ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpType ctermfg=darkgreen cterm=NONE guifg=darkgreen
|
|
||||||
hi phpParent ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpMethodsVar ctermfg=132 cterm=NONE guifg=VioletRed4
|
|
||||||
hi phpStatement ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpStorageClass ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpStringSingle ctermfg=30 cterm=NONE guifg=Aquamarine4
|
|
||||||
hi phpStringDouble ctermfg=30 cterm=NONE guifg=Aquamarine4
|
|
||||||
hi phpFunctions ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpSpecialFunction ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpRepeat ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpNumber ctermfg=214 cterm=bold guifg=brown
|
|
||||||
hi phpTodo ctermfg=red cterm=bold guifg=red gui=bold
|
|
||||||
hi phpDefine ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpConstant ctermfg=21 cterm=NONE guifg=black
|
|
||||||
hi phpCoreConstant ctermfg=21 cterm=NONE guifg=black
|
|
||||||
hi phpMemberSelector ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpLabel ctermfg=21 cterm=NONE guifg=blue
|
|
||||||
hi phpStructure ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpRelation ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpEnvVar ctermfg=black cterm=NONE guifg=black
|
|
||||||
hi phpIntVar ctermfg=0 cterm=bold guifg=black gui=bold
|
|
||||||
hi phpBoolean ctermfg=58 cterm=NONE guifg=brown
|
|
||||||
" 2}}}
|
|
||||||
|
|
||||||
" 1}}}
|
|
||||||
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
*~
|
|
||||||
*.swp
|
|
||||||
tags
|
|
||||||
|
|
@ -1,153 +0,0 @@
|
||||||
Next
|
|
||||||
- Rename "primary" and "secondary" trees to "tab" and "window" trees.
|
|
||||||
- Move a bunch of buffer level variables into the NERDTree and UI classes.
|
|
||||||
- Display cascading dirs on one line to save vertical/horizontal space (@matt-gardner: brainstorming/testing)
|
|
||||||
- Remove the old style UI - Remove 'NERDTreeDirArrows' option.
|
|
||||||
- On windows default to + and ~ for expand/collapse directory symbols.
|
|
||||||
- Lots more refactoring. Move a bunch of b: level vars into b:NERDTree and friends.
|
|
||||||
|
|
||||||
5.0.0
|
|
||||||
- Refactor the code significantly:
|
|
||||||
* Break the classes out into their own files.
|
|
||||||
* Make the majority of the code OO - previously large parts were
|
|
||||||
effectively a tangle of "global" methods.
|
|
||||||
- Add an API to assign flags to nodes. This allows VCS plugins like
|
|
||||||
https://github.com/Xuyuanp/nerdtree-git-plugin to exist. Thanks to
|
|
||||||
Xuyuanp for helping design/test/build said API.
|
|
||||||
- add 'scope' argument to the key map API see :help NERDTreeAddKeyMap()
|
|
||||||
- add magic [[dir]] and [[file]] flags to NERDTreeIgnore
|
|
||||||
- add support for custom path filters. See :help NERDTreeAddPathFilter()
|
|
||||||
- add path listener API. See :help NERDTreePathListenerAPI.
|
|
||||||
- expand the fs menu functionality to list file properties (PhilRunninger,
|
|
||||||
apbarrero, JESii)
|
|
||||||
- make bookmarks work with `~` home shortcuts (hiberabyss)
|
|
||||||
- show OSX specific fsmenu options in regular vim on mac (evindor)
|
|
||||||
- make dir arrow icons configurable (PickRelated)
|
|
||||||
- optimise node sorting performance when opening large dirs (vtsang)
|
|
||||||
- make the root note render prettier by truncating it at a path slash (gcmt)
|
|
||||||
- remove NERDChristmasTree option - its always christmas now
|
|
||||||
- add "cascade" open and closing for dirs containing only another single
|
|
||||||
dir. See :help NERDTreeCascadeOpenSingleChildDir (pendulm)
|
|
||||||
|
|
||||||
Many other fixes, doc updates and contributions from:
|
|
||||||
actionshrimp
|
|
||||||
SchDen
|
|
||||||
egalpin
|
|
||||||
cperl82 - many small fixes
|
|
||||||
toiffel
|
|
||||||
WoLpH
|
|
||||||
handcraftedbits
|
|
||||||
devmanhinton
|
|
||||||
xiaodili
|
|
||||||
zhangoose
|
|
||||||
gastropoda
|
|
||||||
mixvin
|
|
||||||
alvan
|
|
||||||
lucascaton
|
|
||||||
kelaban
|
|
||||||
shanesmith
|
|
||||||
staeff
|
|
||||||
pendulm
|
|
||||||
stephenprater
|
|
||||||
franksort
|
|
||||||
agrussellknives
|
|
||||||
AndrewRadev
|
|
||||||
Twinside
|
|
||||||
|
|
||||||
4.2.0
|
|
||||||
- Add NERDTreeDirArrows option to make the UI use pretty arrow chars
|
|
||||||
instead of the old +~| chars to define the tree structure (sickill)
|
|
||||||
- shift the syntax highlighting out into its own syntax file (gnap)
|
|
||||||
- add some mac specific options to the filesystem menu - for macvim
|
|
||||||
only (andersonfreitas)
|
|
||||||
- Add NERDTreeMinimalUI option to remove some non functional parts of the
|
|
||||||
nerdtree ui (camthompson)
|
|
||||||
- tweak the behaviour of :NERDTreeFind - see :help :NERDTreeFind for the
|
|
||||||
new behaviour (benjamingeiger)
|
|
||||||
- if no name is given to :Bookmark, make it default to the name of the
|
|
||||||
target file/dir (minyoung)
|
|
||||||
- use 'file' completion when doing copying, create, and move
|
|
||||||
operations (EvanDotPro)
|
|
||||||
- lots of misc bug fixes (paddyoloughlin, sdewald, camthompson, Vitaly
|
|
||||||
Bogdanov, AndrewRadev, mathias, scottstvnsn, kml, wycats, me RAWR!)
|
|
||||||
|
|
||||||
4.1.0
|
|
||||||
features:
|
|
||||||
- NERDTreeFind to reveal the node for the current buffer in the tree,
|
|
||||||
see |NERDTreeFind|. This effectively merges the FindInNERDTree plugin (by
|
|
||||||
Doug McInnes) into the script.
|
|
||||||
- make NERDTreeQuitOnOpen apply to the t/T keymaps too. Thanks to Stefan
|
|
||||||
Ritter and Rémi Prévost.
|
|
||||||
- truncate the root node if wider than the tree window. Thanks to Victor
|
|
||||||
Gonzalez.
|
|
||||||
|
|
||||||
bugfixes:
|
|
||||||
- really fix window state restoring
|
|
||||||
- fix some win32 path escaping issues. Thanks to Stephan Baumeister, Ricky,
|
|
||||||
jfilip1024, and Chris Chambers
|
|
||||||
|
|
||||||
4.0.0
|
|
||||||
- add a new programmable menu system (see :help NERDTreeMenu).
|
|
||||||
- add new APIs to add menus/menu-items to the menu system as well as
|
|
||||||
custom key mappings to the NERD tree buffer (see :help NERDTreeAPI).
|
|
||||||
- removed the old API functions
|
|
||||||
- added a mapping to maximize/restore the size of nerd tree window, thanks
|
|
||||||
to Guillaume Duranceau for the patch. See :help NERDTree-A for details.
|
|
||||||
|
|
||||||
- fix a bug where secondary nerd trees (netrw hijacked trees) and
|
|
||||||
NERDTreeQuitOnOpen didnt play nicely, thanks to Curtis Harvey.
|
|
||||||
- fix a bug where the script ignored directories whose name ended in a dot,
|
|
||||||
thanks to Aggelos Orfanakos for the patch.
|
|
||||||
- fix a bug when using the x mapping on the tree root, thanks to Bryan
|
|
||||||
Venteicher for the patch.
|
|
||||||
- fix a bug where the cursor position/window size of the nerd tree buffer
|
|
||||||
wasnt being stored on closing the window, thanks to Richard Hart.
|
|
||||||
- fix a bug where NERDTreeMirror would mirror the wrong tree
|
|
||||||
|
|
||||||
3.1.1
|
|
||||||
- fix a bug where a non-listed no-name buffer was getting created every
|
|
||||||
time the tree windows was created, thanks to Derek Wyatt and owen1
|
|
||||||
- make <CR> behave the same as the 'o' mapping
|
|
||||||
- some helptag fixes in the doc, thanks strull
|
|
||||||
- fix a bug when using :set nohidden and opening a file where the previous
|
|
||||||
buf was modified. Thanks iElectric
|
|
||||||
- other minor fixes
|
|
||||||
|
|
||||||
3.1.0
|
|
||||||
New features:
|
|
||||||
- add mappings to open files in a vsplit, see :help NERDTree-s and :help
|
|
||||||
NERDTree-gs
|
|
||||||
- make the statusline for the nerd tree window default to something
|
|
||||||
hopefully more useful. See :help 'NERDTreeStatusline'
|
|
||||||
Bugfixes:
|
|
||||||
- make the hijack netrw functionality work when vim is started with "vim
|
|
||||||
<some dir>" (thanks to Alf Mikula for the patch).
|
|
||||||
- fix a bug where the CWD wasnt being changed for some operations even when
|
|
||||||
NERDTreeChDirMode==2 (thanks to Lucas S. Buchala)
|
|
||||||
- add -bar to all the nerd tree :commands so they can chain with other
|
|
||||||
:commands (thanks to tpope)
|
|
||||||
- fix bugs when ignorecase was set (thanks to nach)
|
|
||||||
- fix a bug with the relative path code (thanks to nach)
|
|
||||||
- fix a bug where doing a :cd would cause :NERDTreeToggle to fail (thanks nach)
|
|
||||||
|
|
||||||
|
|
||||||
3.0.1
|
|
||||||
Bugfixes:
|
|
||||||
- fix bugs with :NERDTreeToggle and :NERDTreeMirror when 'hidden
|
|
||||||
was not set
|
|
||||||
- fix a bug where :NERDTree <path> would fail if <path> was relative and
|
|
||||||
didnt start with a ./ or ../ Thanks to James Kanze.
|
|
||||||
- make the q mapping work with secondary (:e <dir> style) trees,
|
|
||||||
thanks to jamessan
|
|
||||||
- fix a bunch of small bugs with secondary trees
|
|
||||||
|
|
||||||
More insane refactoring.
|
|
||||||
|
|
||||||
3.0.0
|
|
||||||
- hijack netrw so that doing an :edit <directory> will put a NERD tree in
|
|
||||||
the window rather than a netrw browser. See :help 'NERDTreeHijackNetrw'
|
|
||||||
- allow sharing of trees across tabs, see :help :NERDTreeMirror
|
|
||||||
- remove "top" and "bottom" as valid settings for NERDTreeWinPos
|
|
||||||
- change the '<tab>' mapping to 'i'
|
|
||||||
- change the 'H' mapping to 'I'
|
|
||||||
- lots of refactoring
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
Version 2, December 2004
|
|
||||||
|
|
||||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
|
||||||
|
|
||||||
Everyone is permitted to copy and distribute verbatim or modified
|
|
||||||
copies of this license document, and changing it is allowed as long
|
|
||||||
as the name is changed.
|
|
||||||
|
|
||||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
|
||||||
|
|
||||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
The NERD Tree
|
|
||||||
=============
|
|
||||||
|
|
||||||
Intro
|
|
||||||
-----
|
|
||||||
|
|
||||||
The NERD tree allows you to explore your filesystem and to open files and
|
|
||||||
directories. It presents the filesystem to you in the form of a tree which you
|
|
||||||
manipulate with the keyboard and/or mouse. It also allows you to perform
|
|
||||||
simple filesystem operations.
|
|
||||||
|
|
||||||
The following features and functionality are provided by the NERD tree:
|
|
||||||
|
|
||||||
* Files and directories are displayed in a hierarchical tree structure
|
|
||||||
* Different highlighting is provided for the following types of nodes:
|
|
||||||
* files
|
|
||||||
* directories
|
|
||||||
* sym-links
|
|
||||||
* windows .lnk files
|
|
||||||
* read-only files
|
|
||||||
* executable files
|
|
||||||
* Many (customisable) mappings are provided to manipulate the tree:
|
|
||||||
* Mappings to open/close/explore directory nodes
|
|
||||||
* Mappings to open files in new/existing windows/tabs
|
|
||||||
* Mappings to change the current root of the tree
|
|
||||||
* Mappings to navigate around the tree
|
|
||||||
* ...
|
|
||||||
* Directories and files can be bookmarked.
|
|
||||||
* Most NERD tree navigation can also be done with the mouse
|
|
||||||
* Filtering of tree content (can be toggled at runtime)
|
|
||||||
* custom file filters to prevent e.g. vim backup files being displayed
|
|
||||||
* optional displaying of hidden files (. files)
|
|
||||||
* files can be "turned off" so that only directories are displayed
|
|
||||||
* The position and size of the NERD tree window can be customised
|
|
||||||
* The order in which the nodes in the tree are listed can be customised.
|
|
||||||
* A model of your filesystem is created/maintained as you explore it. This
|
|
||||||
has several advantages:
|
|
||||||
* All filesystem information is cached and is only re-read on demand
|
|
||||||
* If you revisit a part of the tree that you left earlier in your
|
|
||||||
session, the directory nodes will be opened/closed as you left them
|
|
||||||
* The script remembers the cursor position and window position in the NERD
|
|
||||||
tree so you can toggle it off (or just close the tree window) and then
|
|
||||||
reopen it (with NERDTreeToggle) the NERD tree window will appear exactly
|
|
||||||
as you left it
|
|
||||||
* You can have a separate NERD tree for each tab, share trees across tabs,
|
|
||||||
or a mix of both.
|
|
||||||
* By default the script overrides the default file browser (netrw), so if
|
|
||||||
you :edit a directory a (slightly modified) NERD tree will appear in the
|
|
||||||
current window
|
|
||||||
* A programmable menu system is provided (simulates right clicking on a node)
|
|
||||||
* one default menu plugin is provided to perform basic filesystem
|
|
||||||
operations (create/delete/move/copy files/directories)
|
|
||||||
* There's an API for adding your own keymappings
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
####[pathogen.vim](https://github.com/tpope/vim-pathogen)
|
|
||||||
|
|
||||||
cd ~/.vim/bundle
|
|
||||||
git clone https://github.com/scrooloose/nerdtree.git
|
|
||||||
|
|
||||||
Then reload vim, run `:Helptags`, and check out `:help NERD_tree.txt`.
|
|
||||||
|
|
||||||
|
|
||||||
####[apt-vim](https://github.com/egalpin/apt-vim)
|
|
||||||
|
|
||||||
apt-vim install -y https://github.com/scrooloose/nerdtree.git
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Faq
|
|
||||||
---
|
|
||||||
|
|
||||||
> Is there any support for `git` flags?
|
|
||||||
|
|
||||||
Yes, install [nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin).
|
|
||||||
|
|
||||||
|
|
||||||
> Can I have the nerdtree on every tab automatically?
|
|
||||||
|
|
||||||
Nope. If this is something you want then chances are you aren't using tabs and
|
|
||||||
buffers as they were intended to be used. Read this
|
|
||||||
http://stackoverflow.com/questions/102384/using-vims-tabs-like-buffers
|
|
||||||
|
|
||||||
If you are interested in this behaviour then consider [vim-nerdtree-tabs](https://github.com/jistr/vim-nerdtree-tabs)
|
|
||||||
|
|
||||||
> How can I open a NERDTree automatically when vim starts up?
|
|
||||||
|
|
||||||
Stick this in your vimrc: `autocmd vimenter * NERDTree`
|
|
||||||
|
|
||||||
> How can I open a NERDTree automatically when vim starts up if no files were specified?
|
|
||||||
|
|
||||||
Stick this in your vimrc:
|
|
||||||
|
|
||||||
autocmd StdinReadPre * let s:std_in=1
|
|
||||||
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
|
|
||||||
|
|
||||||
Note: Now start vim with plain `vim`, not `vim .`
|
|
||||||
|
|
||||||
> How can I map a specific key or shortcut to open NERDTree?
|
|
||||||
|
|
||||||
Stick this in your vimrc to open NERDTree with `Ctrl+n` (you can set whatever key you want):
|
|
||||||
|
|
||||||
map <C-n> :NERDTreeToggle<CR>
|
|
||||||
|
|
||||||
> How can I close vim if the only window left open is a NERDTree?
|
|
||||||
|
|
||||||
Stick this in your vimrc:
|
|
||||||
|
|
||||||
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
|
|
||||||
|
|
||||||
> Can I have different highlighting for different file extensions?
|
|
||||||
|
|
||||||
See here: https://github.com/scrooloose/nerdtree/issues/433#issuecomment-92590696
|
|
||||||
|
|
||||||
> How can I change default arrows?
|
|
||||||
|
|
||||||
Use these variables in your vimrc. Note that below are default arrow symbols
|
|
||||||
|
|
||||||
let g:NERDTreeDirArrowExpandable = '▸'
|
|
||||||
let g:NERDTreeDirArrowCollapsible = '▾'
|
|
||||||
|
|
@ -1,147 +0,0 @@
|
||||||
if exists("g:loaded_nerdtree_autoload")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_nerdtree_autoload = 1
|
|
||||||
|
|
||||||
function! nerdtree#version()
|
|
||||||
return '5.0.0'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" SECTION: General Functions {{{1
|
|
||||||
"============================================================
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#checkForBrowse(dir) {{{2
|
|
||||||
"inits a window tree in the current buffer if appropriate
|
|
||||||
function! nerdtree#checkForBrowse(dir)
|
|
||||||
if a:dir != '' && isdirectory(a:dir)
|
|
||||||
call g:NERDTreeCreator.CreateWindowTree(a:dir)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2
|
|
||||||
" completion function for the bookmark commands
|
|
||||||
function! nerdtree#completeBookmarks(A,L,P)
|
|
||||||
return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#compareBookmarks(dir) {{{2
|
|
||||||
function! nerdtree#compareBookmarks(first, second)
|
|
||||||
return a:first.compareTo(a:second)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#compareNodes(dir) {{{2
|
|
||||||
function! nerdtree#compareNodes(n1, n2)
|
|
||||||
return a:n1.path.compareTo(a:n2.path)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#compareNodesBySortKey(n1, n2) {{{2
|
|
||||||
function! nerdtree#compareNodesBySortKey(n1, n2)
|
|
||||||
if a:n1.path.getSortKey() <# a:n2.path.getSortKey()
|
|
||||||
return -1
|
|
||||||
elseif a:n1.path.getSortKey() ># a:n2.path.getSortKey()
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2
|
|
||||||
" Issue a deprecation warning for a:func. If a second arg is given, use this
|
|
||||||
" as the deprecation message
|
|
||||||
function! nerdtree#deprecated(func, ...)
|
|
||||||
let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated'
|
|
||||||
|
|
||||||
if !exists('s:deprecationWarnings')
|
|
||||||
let s:deprecationWarnings = {}
|
|
||||||
endif
|
|
||||||
if !has_key(s:deprecationWarnings, a:func)
|
|
||||||
let s:deprecationWarnings[a:func] = 1
|
|
||||||
echomsg msg
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#exec(cmd) {{{2
|
|
||||||
" same as :exec cmd but eventignore=all is set for the duration
|
|
||||||
function! nerdtree#exec(cmd)
|
|
||||||
let old_ei = &ei
|
|
||||||
set ei=all
|
|
||||||
exec a:cmd
|
|
||||||
let &ei = old_ei
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#has_opt(options, name) {{{2
|
|
||||||
function! nerdtree#has_opt(options, name)
|
|
||||||
return has_key(a:options, a:name) && a:options[a:name] == 1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#loadClassFiles() {{{2
|
|
||||||
function! nerdtree#loadClassFiles()
|
|
||||||
runtime lib/nerdtree/path.vim
|
|
||||||
runtime lib/nerdtree/menu_controller.vim
|
|
||||||
runtime lib/nerdtree/menu_item.vim
|
|
||||||
runtime lib/nerdtree/key_map.vim
|
|
||||||
runtime lib/nerdtree/bookmark.vim
|
|
||||||
runtime lib/nerdtree/tree_file_node.vim
|
|
||||||
runtime lib/nerdtree/tree_dir_node.vim
|
|
||||||
runtime lib/nerdtree/opener.vim
|
|
||||||
runtime lib/nerdtree/creator.vim
|
|
||||||
runtime lib/nerdtree/flag_set.vim
|
|
||||||
runtime lib/nerdtree/nerdtree.vim
|
|
||||||
runtime lib/nerdtree/ui.vim
|
|
||||||
runtime lib/nerdtree/event.vim
|
|
||||||
runtime lib/nerdtree/notifier.vim
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#postSourceActions() {{{2
|
|
||||||
function! nerdtree#postSourceActions()
|
|
||||||
call g:NERDTreeBookmark.CacheBookmarks(1)
|
|
||||||
call nerdtree#ui_glue#createDefaultBindings()
|
|
||||||
|
|
||||||
"load all nerdtree plugins
|
|
||||||
runtime! nerdtree_plugin/**/*.vim
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#runningWindows(dir) {{{2
|
|
||||||
function! nerdtree#runningWindows()
|
|
||||||
return has("win16") || has("win32") || has("win64")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" SECTION: View Functions {{{1
|
|
||||||
"============================================================
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#echo {{{2
|
|
||||||
"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"msg: the message to echo
|
|
||||||
function! nerdtree#echo(msg)
|
|
||||||
redraw
|
|
||||||
echomsg "NERDTree: " . a:msg
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#echoError {{{2
|
|
||||||
"Wrapper for nerdtree#echo, sets the message type to errormsg for this message
|
|
||||||
"Args:
|
|
||||||
"msg: the message to echo
|
|
||||||
function! nerdtree#echoError(msg)
|
|
||||||
echohl errormsg
|
|
||||||
call nerdtree#echo(a:msg)
|
|
||||||
echohl normal
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#echoWarning {{{2
|
|
||||||
"Wrapper for nerdtree#echo, sets the message type to warningmsg for this message
|
|
||||||
"Args:
|
|
||||||
"msg: the message to echo
|
|
||||||
function! nerdtree#echoWarning(msg)
|
|
||||||
echohl warningmsg
|
|
||||||
call nerdtree#echo(a:msg)
|
|
||||||
echohl normal
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#renderView {{{2
|
|
||||||
function! nerdtree#renderView()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,646 +0,0 @@
|
||||||
if exists("g:loaded_nerdtree_ui_glue_autoload")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_nerdtree_ui_glue_autoload = 1
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#createDefaultBindings() {{{1
|
|
||||||
function! nerdtree#ui_glue#createDefaultBindings()
|
|
||||||
let s = '<SNR>' . s:SID() . '_'
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<MiddleRelease>', 'scope': "all", 'callback': s."handleMiddleMouse" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<LeftRelease>', 'scope': "all", 'callback': s."handleLeftClick" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "DirNode", 'callback': s."activateDirNode" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "FileNode", 'callback': s."activateFileNode" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "Bookmark", 'callback': s."activateBookmark" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': "all", 'callback': s."activateAll" })
|
|
||||||
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "DirNode", 'callback': s."activateDirNode" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "FileNode", 'callback': s."activateFileNode" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "Bookmark", 'callback': s."activateBookmark" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': "all", 'callback': s."activateAll" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Node", 'callback': s."openHSplit" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Node", 'callback': s."openVSplit" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': "Bookmark", 'callback': s."openHSplit" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': "Bookmark", 'callback': s."openVSplit" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Node", 'callback': s."previewNodeCurrent" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Node", 'callback': s."previewNodeVSplit" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Node", 'callback': s."previewNodeHSplit" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': "Bookmark", 'callback': s."previewNodeCurrent" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': "Bookmark", 'callback': s."previewNodeVSplit" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': "Bookmark", 'callback': s."previewNodeHSplit" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': "DirNode", 'callback': s."openNodeRecursively" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': "all", 'callback': s."upDirCurrentRootClosed" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': "all", 'callback': s."upDirCurrentRootOpen" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': "Node", 'callback': s."chRoot" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': "Node", 'callback': s."chCwd" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': "all", 'callback': s."closeTreeWindow" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCWD, 'scope': "all", 'callback': "nerdtree#ui_glue#chRootCwd" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': "all", 'callback': s."refreshRoot" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': "Node", 'callback': s."refreshCurrent" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': "all", 'callback': s."displayHelp" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': "all", 'callback': s."toggleZoom" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': "all", 'callback': s."toggleShowHidden" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': "all", 'callback': s."toggleIgnoreFilter" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': "all", 'callback': s."toggleShowFiles" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': "all", 'callback': s."toggleShowBookmarks" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': "Node", 'callback': s."closeCurrentDir" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': "DirNode", 'callback': s."closeChildren" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': "Node", 'callback': s."showMenu" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': "Node", 'callback': s."jumpToParent" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': "Node", 'callback': s."jumpToFirstChild" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': "Node", 'callback': s."jumpToLastChild" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': "all", 'callback': s."jumpToRoot" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': "Node", 'callback': s."jumpToNextSibling" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': "Node", 'callback': s."jumpToPrevSibling" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Node", 'callback': s."openInNewTab" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Node", 'callback': s."openInNewTabSilent" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': "Bookmark", 'callback': s."openInNewTab" })
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': "Bookmark", 'callback': s."openInNewTabSilent" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': "DirNode", 'callback': s."openExplorer" })
|
|
||||||
|
|
||||||
call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': "Bookmark", 'callback': s."deleteBookmark" })
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
"SECTION: Interface bindings {{{1
|
|
||||||
"============================================================
|
|
||||||
|
|
||||||
"FUNCTION: s:activateAll() {{{1
|
|
||||||
"handle the user activating the updir line
|
|
||||||
function! s:activateAll()
|
|
||||||
if getline(".") ==# g:NERDTreeUI.UpDirLine()
|
|
||||||
return nerdtree#ui_glue#upDir(0)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:activateDirNode() {{{1
|
|
||||||
"handle the user activating a tree node
|
|
||||||
function! s:activateDirNode(node)
|
|
||||||
call a:node.activate()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:activateFileNode() {{{1
|
|
||||||
"handle the user activating a tree node
|
|
||||||
function! s:activateFileNode(node)
|
|
||||||
call a:node.activate({'reuse': 'all', 'where': 'p'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:activateBookmark() {{{1
|
|
||||||
"handle the user activating a bookmark
|
|
||||||
function! s:activateBookmark(bm)
|
|
||||||
call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p'} : {})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1
|
|
||||||
" Associate the current node with the given name
|
|
||||||
function! nerdtree#ui_glue#bookmarkNode(...)
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if currentNode != {}
|
|
||||||
let name = a:1
|
|
||||||
if empty(name)
|
|
||||||
let name = currentNode.path.getLastPathComponent(0)
|
|
||||||
endif
|
|
||||||
try
|
|
||||||
call currentNode.bookmark(name)
|
|
||||||
call b:NERDTree.render()
|
|
||||||
catch /^NERDTree.IllegalBookmarkNameError/
|
|
||||||
call nerdtree#echo("bookmark names must not contain spaces")
|
|
||||||
endtry
|
|
||||||
else
|
|
||||||
call nerdtree#echo("select a node first")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:chCwd(node) {{{1
|
|
||||||
function! s:chCwd(node)
|
|
||||||
try
|
|
||||||
call a:node.path.changeToDir()
|
|
||||||
catch /^NERDTree.PathChangeError/
|
|
||||||
call nerdtree#echoWarning("could not change cwd")
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:chRoot(node) {{{1
|
|
||||||
" changes the current root to the selected one
|
|
||||||
function! s:chRoot(node)
|
|
||||||
call b:NERDTree.changeRoot(a:node)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:nerdtree#ui_glue#chRootCwd() {{{1
|
|
||||||
" changes the current root to CWD
|
|
||||||
function! nerdtree#ui_glue#chRootCwd()
|
|
||||||
try
|
|
||||||
let cwd = g:NERDTreePath.New(getcwd())
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call nerdtree#echo("current directory does not exist.")
|
|
||||||
return
|
|
||||||
endtry
|
|
||||||
if cwd.str() == g:NERDTreeFileNode.GetRootForTab().path.str()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
call s:chRoot(g:NERDTreeDirNode.New(cwd, b:NERDTree))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nnerdtree#ui_glue#clearBookmarks(bookmarks) {{{1
|
|
||||||
function! nerdtree#ui_glue#clearBookmarks(bookmarks)
|
|
||||||
if a:bookmarks ==# ''
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if currentNode != {}
|
|
||||||
call currentNode.clearBookmarks()
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
for name in split(a:bookmarks, ' ')
|
|
||||||
let bookmark = g:NERDTreeBookmark.BookmarkFor(name)
|
|
||||||
call bookmark.delete()
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
call b:NERDTree.root.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:closeChildren(node) {{{1
|
|
||||||
" closes all childnodes of the current node
|
|
||||||
function! s:closeChildren(node)
|
|
||||||
call a:node.closeChildren()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call a:node.putCursorHere(0, 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:closeCurrentDir(node) {{{1
|
|
||||||
" closes the parent dir of the current node
|
|
||||||
function! s:closeCurrentDir(node)
|
|
||||||
let parent = a:node.parent
|
|
||||||
if parent ==# {} || parent.isRoot()
|
|
||||||
call nerdtree#echo("cannot close tree root")
|
|
||||||
else
|
|
||||||
while g:NERDTreeCascadeOpenSingleChildDir && !parent.parent.isRoot()
|
|
||||||
if parent.parent.getVisibleChildCount() == 1
|
|
||||||
call parent.close()
|
|
||||||
let parent = parent.parent
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
call parent.close()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call parent.putCursorHere(0, 0)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:closeTreeWindow() {{{1
|
|
||||||
" close the tree window
|
|
||||||
function! s:closeTreeWindow()
|
|
||||||
if b:NERDTree.isWinTree() && b:NERDTree.previousBuf() != -1
|
|
||||||
exec "buffer " . b:NERDTree.previousBuf()
|
|
||||||
else
|
|
||||||
if winnr("$") > 1
|
|
||||||
call g:NERDTree.Close()
|
|
||||||
else
|
|
||||||
call nerdtree#echo("Cannot close last window")
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:deleteBookmark(bm) {{{1
|
|
||||||
" if the cursor is on a bookmark, prompt to delete
|
|
||||||
function! s:deleteBookmark(bm)
|
|
||||||
echo "Are you sure you wish to delete the bookmark:\n\"" . a:bm.name . "\" (yN):"
|
|
||||||
|
|
||||||
if nr2char(getchar()) ==# 'y'
|
|
||||||
try
|
|
||||||
call a:bm.delete()
|
|
||||||
call b:NERDTree.root.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
redraw
|
|
||||||
catch /^NERDTree/
|
|
||||||
call nerdtree#echoWarning("Could not remove bookmark")
|
|
||||||
endtry
|
|
||||||
else
|
|
||||||
call nerdtree#echo("delete aborted" )
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:displayHelp() {{{1
|
|
||||||
" toggles the help display
|
|
||||||
function! s:displayHelp()
|
|
||||||
call b:NERDTree.ui.toggleHelp()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call b:NERDTree.ui.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:findAndRevealPath() {{{1
|
|
||||||
function! s:findAndRevealPath()
|
|
||||||
try
|
|
||||||
let p = g:NERDTreePath.New(expand("%:p"))
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call nerdtree#echo("no file for the current buffer")
|
|
||||||
return
|
|
||||||
endtry
|
|
||||||
|
|
||||||
if p.isUnixHiddenPath()
|
|
||||||
let showhidden=g:NERDTreeShowHidden
|
|
||||||
let g:NERDTreeShowHidden = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !g:NERDTree.ExistsForTab()
|
|
||||||
try
|
|
||||||
let cwd = g:NERDTreePath.New(getcwd())
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call nerdtree#echo("current directory does not exist.")
|
|
||||||
let cwd = p.getParent()
|
|
||||||
endtry
|
|
||||||
|
|
||||||
if p.isUnder(cwd)
|
|
||||||
call g:NERDTreeCreator.CreateTabTree(cwd.str())
|
|
||||||
else
|
|
||||||
call g:NERDTreeCreator.CreateTabTree(p.getParent().str())
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
if !p.isUnder(g:NERDTreeFileNode.GetRootForTab().path)
|
|
||||||
if !g:NERDTree.IsOpen()
|
|
||||||
call g:NERDTreeCreator.ToggleTabTree('')
|
|
||||||
else
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
endif
|
|
||||||
call b:NERDTree.setShowHidden(g:NERDTreeShowHidden)
|
|
||||||
call s:chRoot(g:NERDTreeDirNode.New(p.getParent(), b:NERDTree))
|
|
||||||
else
|
|
||||||
if !g:NERDTree.IsOpen()
|
|
||||||
call g:NERDTreeCreator.ToggleTabTree("")
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
let node = b:NERDTree.root.reveal(p)
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call node.putCursorHere(1,0)
|
|
||||||
|
|
||||||
if p.isUnixHiddenFile()
|
|
||||||
let g:NERDTreeShowHidden = showhidden
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:handleLeftClick() {{{1
|
|
||||||
"Checks if the click should open the current node
|
|
||||||
function! s:handleLeftClick()
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if currentNode != {}
|
|
||||||
|
|
||||||
"the dir arrows are multibyte chars, and vim's string functions only
|
|
||||||
"deal with single bytes - so split the line up with the hack below and
|
|
||||||
"take the line substring manually
|
|
||||||
let line = split(getline(line(".")), '\zs')
|
|
||||||
let startToCur = ""
|
|
||||||
for i in range(0,len(line)-1)
|
|
||||||
let startToCur .= line[i]
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if currentNode.path.isDirectory
|
|
||||||
if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \?$'
|
|
||||||
call currentNode.activate()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3
|
|
||||||
let char = strpart(startToCur, strlen(startToCur)-1, 1)
|
|
||||||
if char !~# g:NERDTreeUI.MarkupReg()
|
|
||||||
if currentNode.path.isDirectory
|
|
||||||
call currentNode.activate()
|
|
||||||
else
|
|
||||||
call currentNode.activate({'reuse': 'all', 'where': 'p'})
|
|
||||||
endif
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:handleMiddleMouse() {{{1
|
|
||||||
function! s:handleMiddleMouse()
|
|
||||||
let curNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if curNode ==# {}
|
|
||||||
call nerdtree#echo("Put the cursor on a node first" )
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if curNode.path.isDirectory
|
|
||||||
call nerdtree#openExplorer(curNode)
|
|
||||||
else
|
|
||||||
call curNode.open({'where': 'h'})
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToChild(direction) {{{2
|
|
||||||
" Args:
|
|
||||||
" direction: 0 if going to first child, 1 if going to last
|
|
||||||
function! s:jumpToChild(currentNode, direction)
|
|
||||||
if a:currentNode.isRoot()
|
|
||||||
return nerdtree#echo("cannot jump to " . (a:direction ? "last" : "first") . " child")
|
|
||||||
end
|
|
||||||
let dirNode = a:currentNode.parent
|
|
||||||
let childNodes = dirNode.getVisibleChildren()
|
|
||||||
|
|
||||||
let targetNode = childNodes[0]
|
|
||||||
if a:direction
|
|
||||||
let targetNode = childNodes[len(childNodes) - 1]
|
|
||||||
endif
|
|
||||||
|
|
||||||
if targetNode.equals(a:currentNode)
|
|
||||||
let siblingDir = a:currentNode.parent.findOpenDirSiblingWithVisibleChildren(a:direction)
|
|
||||||
if siblingDir != {}
|
|
||||||
let indx = a:direction ? siblingDir.getVisibleChildCount()-1 : 0
|
|
||||||
let targetNode = siblingDir.getChildByIndex(indx, 1)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
call targetNode.putCursorHere(1, 0)
|
|
||||||
|
|
||||||
call b:NERDTree.ui.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#invokeKeyMap(key) {{{1
|
|
||||||
"this is needed since I cant figure out how to invoke dict functions from a
|
|
||||||
"key map
|
|
||||||
function! nerdtree#ui_glue#invokeKeyMap(key)
|
|
||||||
call g:NERDTreeKeyMap.Invoke(a:key)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToFirstChild() {{{1
|
|
||||||
" wrapper for the jump to child method
|
|
||||||
function! s:jumpToFirstChild(node)
|
|
||||||
call s:jumpToChild(a:node, 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToLastChild() {{{1
|
|
||||||
" wrapper for the jump to child method
|
|
||||||
function! s:jumpToLastChild(node)
|
|
||||||
call s:jumpToChild(a:node, 1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToParent(node) {{{1
|
|
||||||
" moves the cursor to the parent of the current node
|
|
||||||
function! s:jumpToParent(node)
|
|
||||||
if !empty(a:node.parent)
|
|
||||||
call a:node.parent.putCursorHere(1, 0)
|
|
||||||
call b:NERDTree.ui.centerView()
|
|
||||||
else
|
|
||||||
call nerdtree#echo("cannot jump to parent")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToRoot() {{{1
|
|
||||||
" moves the cursor to the root node
|
|
||||||
function! s:jumpToRoot()
|
|
||||||
call b:NERDTree.root.putCursorHere(1, 0)
|
|
||||||
call b:NERDTree.ui.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToNextSibling(node) {{{1
|
|
||||||
function! s:jumpToNextSibling(node)
|
|
||||||
call s:jumpToSibling(a:node, 1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToPrevSibling(node) {{{1
|
|
||||||
function! s:jumpToPrevSibling(node)
|
|
||||||
call s:jumpToSibling(a:node, 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:jumpToSibling(currentNode, forward) {{{2
|
|
||||||
" moves the cursor to the sibling of the current node in the given direction
|
|
||||||
"
|
|
||||||
" Args:
|
|
||||||
" forward: 1 if the cursor should move to the next sibling, 0 if it should
|
|
||||||
" move back to the previous sibling
|
|
||||||
function! s:jumpToSibling(currentNode, forward)
|
|
||||||
let sibling = a:currentNode.findSibling(a:forward)
|
|
||||||
|
|
||||||
if !empty(sibling)
|
|
||||||
call sibling.putCursorHere(1, 0)
|
|
||||||
call b:NERDTree.ui.centerView()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#openBookmark(name) {{{1
|
|
||||||
" put the cursor on the given bookmark and, if its a file, open it
|
|
||||||
function! nerdtree#ui_glue#openBookmark(name)
|
|
||||||
try
|
|
||||||
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree)
|
|
||||||
call targetNode.putCursorHere(0, 1)
|
|
||||||
redraw!
|
|
||||||
catch /^NERDTree.BookmarkedNodeNotFoundError/
|
|
||||||
call nerdtree#echo("note - target node is not cached")
|
|
||||||
let bookmark = g:NERDTreeBookmark.BookmarkFor(a:name)
|
|
||||||
let targetNode = g:NERDTreeFileNode.New(bookmark.path, b:NERDTree)
|
|
||||||
endtry
|
|
||||||
if targetNode.path.isDirectory
|
|
||||||
call targetNode.openExplorer()
|
|
||||||
else
|
|
||||||
call targetNode.open({'where': 'p'})
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openHSplit(target) {{{1
|
|
||||||
function! s:openHSplit(target)
|
|
||||||
call a:target.activate({'where': 'h'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openVSplit(target) {{{1
|
|
||||||
function! s:openVSplit(target)
|
|
||||||
call a:target.activate({'where': 'v'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openExplorer(node) {{{1
|
|
||||||
function! s:openExplorer(node)
|
|
||||||
call a:node.openExplorer()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openInNewTab(target) {{{1
|
|
||||||
function! s:openInNewTab(target)
|
|
||||||
call a:target.activate({'where': 't'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openInNewTabSilent(target) {{{1
|
|
||||||
function! s:openInNewTabSilent(target)
|
|
||||||
call a:target.activate({'where': 't', 'stay': 1})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:openNodeRecursively(node) {{{1
|
|
||||||
function! s:openNodeRecursively(node)
|
|
||||||
call nerdtree#echo("Recursively opening node. Please wait...")
|
|
||||||
call a:node.openRecursively()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
redraw
|
|
||||||
call nerdtree#echo("Recursively opening node. Please wait... DONE")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:previewNodeCurrent(node) {{{1
|
|
||||||
function! s:previewNodeCurrent(node)
|
|
||||||
call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:previewNodeHSplit(node) {{{1
|
|
||||||
function! s:previewNodeHSplit(node)
|
|
||||||
call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:previewNodeVSplit(node) {{{1
|
|
||||||
function! s:previewNodeVSplit(node)
|
|
||||||
call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#revealBookmark(name) {{{1
|
|
||||||
" put the cursor on the node associate with the given name
|
|
||||||
function! nerdtree#ui_glue#revealBookmark(name)
|
|
||||||
try
|
|
||||||
let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree)
|
|
||||||
call targetNode.putCursorHere(0, 1)
|
|
||||||
catch /^NERDTree.BookmarkNotFoundError/
|
|
||||||
call nerdtree#echo("Bookmark isnt cached under the current root")
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:refreshRoot() {{{1
|
|
||||||
" Reloads the current root. All nodes below this will be lost and the root dir
|
|
||||||
" will be reloaded.
|
|
||||||
function! s:refreshRoot()
|
|
||||||
call nerdtree#echo("Refreshing the root node. This could take a while...")
|
|
||||||
call b:NERDTree.root.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
redraw
|
|
||||||
call nerdtree#echo("Refreshing the root node. This could take a while... DONE")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:refreshCurrent(node) {{{1
|
|
||||||
" refreshes the root for the current node
|
|
||||||
function! s:refreshCurrent(node)
|
|
||||||
let node = a:node
|
|
||||||
if !node.path.isDirectory
|
|
||||||
let node = node.parent
|
|
||||||
endif
|
|
||||||
|
|
||||||
call nerdtree#echo("Refreshing node. This could take a while...")
|
|
||||||
call node.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
redraw
|
|
||||||
call nerdtree#echo("Refreshing node. This could take a while... DONE")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: nerdtree#ui_glue#setupCommands() {{{1
|
|
||||||
function! nerdtree#ui_glue#setupCommands()
|
|
||||||
command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreateTabTree('<args>')
|
|
||||||
command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.ToggleTabTree('<args>')
|
|
||||||
command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close()
|
|
||||||
command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreateTabTree('<args>')
|
|
||||||
command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror()
|
|
||||||
command! -n=0 -bar NERDTreeFind call s:findAndRevealPath()
|
|
||||||
command! -n=0 -bar NERDTreeFocus call NERDTreeFocus()
|
|
||||||
command! -n=0 -bar NERDTreeCWD call NERDTreeCWD()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Function: s:SID() {{{1
|
|
||||||
function s:SID()
|
|
||||||
if !exists("s:sid")
|
|
||||||
let s:sid = matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
|
|
||||||
endif
|
|
||||||
return s:sid
|
|
||||||
endfun
|
|
||||||
|
|
||||||
" FUNCTION: s:showMenu(node) {{{1
|
|
||||||
function! s:showMenu(node)
|
|
||||||
let mc = g:NERDTreeMenuController.New(g:NERDTreeMenuItem.AllEnabled())
|
|
||||||
call mc.showMenu()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:toggleIgnoreFilter() {{{1
|
|
||||||
function! s:toggleIgnoreFilter()
|
|
||||||
call b:NERDTree.ui.toggleIgnoreFilter()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:toggleShowBookmarks() {{{1
|
|
||||||
function! s:toggleShowBookmarks()
|
|
||||||
call b:NERDTree.ui.toggleShowBookmarks()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:toggleShowFiles() {{{1
|
|
||||||
function! s:toggleShowFiles()
|
|
||||||
call b:NERDTree.ui.toggleShowFiles()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:toggleShowHidden() {{{1
|
|
||||||
" toggles the display of hidden files
|
|
||||||
function! s:toggleShowHidden()
|
|
||||||
call b:NERDTree.ui.toggleShowHidden()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:toggleZoom() {{{1
|
|
||||||
function! s:toggleZoom()
|
|
||||||
call b:NERDTree.ui.toggleZoom()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: nerdtree#ui_glue#upDir(keepState) {{{1
|
|
||||||
"moves the tree up a level
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"keepState: 1 if the current root should be left open when the tree is
|
|
||||||
"re-rendered
|
|
||||||
function! nerdtree#ui_glue#upDir(keepState)
|
|
||||||
let cwd = b:NERDTree.root.path.str({'format': 'UI'})
|
|
||||||
if cwd ==# "/" || cwd =~# '^[^/]..$'
|
|
||||||
call nerdtree#echo("already at top dir")
|
|
||||||
else
|
|
||||||
if !a:keepState
|
|
||||||
call b:NERDTree.root.close()
|
|
||||||
endif
|
|
||||||
|
|
||||||
let oldRoot = b:NERDTree.root
|
|
||||||
|
|
||||||
if empty(b:NERDTree.root.parent)
|
|
||||||
let path = b:NERDTree.root.path.getParent()
|
|
||||||
let newRoot = g:NERDTreeDirNode.New(path, b:NERDTree)
|
|
||||||
call newRoot.open()
|
|
||||||
call newRoot.transplantChild(b:NERDTree.root)
|
|
||||||
let b:NERDTree.root = newRoot
|
|
||||||
else
|
|
||||||
let b:NERDTree.root = b:NERDTree.root.parent
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:NERDTreeChDirMode ==# 2
|
|
||||||
call b:NERDTree.root.path.changeToDir()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call oldRoot.putCursorHere(0, 0)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:upDirCurrentRootOpen() {{{1
|
|
||||||
function! s:upDirCurrentRootOpen()
|
|
||||||
call nerdtree#ui_glue#upDir(1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:upDirCurrentRootClosed() {{{1
|
|
||||||
function! s:upDirCurrentRootClosed()
|
|
||||||
call nerdtree#ui_glue#upDir(0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,312 +0,0 @@
|
||||||
"CLASS: Bookmark
|
|
||||||
"============================================================
|
|
||||||
let s:Bookmark = {}
|
|
||||||
let g:NERDTreeBookmark = s:Bookmark
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.activate(nerdtree) {{{1
|
|
||||||
function! s:Bookmark.activate(nerdtree, ...)
|
|
||||||
call self.open(a:nerdtree, a:0 ? a:1 : {})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.AddBookmark(name, path) {{{1
|
|
||||||
" Class method to add a new bookmark to the list, if a previous bookmark exists
|
|
||||||
" with the same name, just update the path for that bookmark
|
|
||||||
function! s:Bookmark.AddBookmark(name, path)
|
|
||||||
for i in s:Bookmark.Bookmarks()
|
|
||||||
if i.name ==# a:name
|
|
||||||
let i.path = a:path
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path))
|
|
||||||
if g:NERDTreeBookmarksSort ==# 1
|
|
||||||
call s:Bookmark.Sort()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.Bookmarks() {{{1
|
|
||||||
" Class method to get all bookmarks. Lazily initializes the bookmarks global
|
|
||||||
" variable
|
|
||||||
function! s:Bookmark.Bookmarks()
|
|
||||||
if !exists("g:NERDTreeBookmarks")
|
|
||||||
let g:NERDTreeBookmarks = []
|
|
||||||
endif
|
|
||||||
return g:NERDTreeBookmarks
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.BookmarkExistsFor(name) {{{1
|
|
||||||
" class method that returns 1 if a bookmark with the given name is found, 0
|
|
||||||
" otherwise
|
|
||||||
function! s:Bookmark.BookmarkExistsFor(name)
|
|
||||||
try
|
|
||||||
call s:Bookmark.BookmarkFor(a:name)
|
|
||||||
return 1
|
|
||||||
catch /^NERDTree.BookmarkNotFoundError/
|
|
||||||
return 0
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.BookmarkFor(name) {{{1
|
|
||||||
" Class method to get the bookmark that has the given name. {} is return if no
|
|
||||||
" bookmark is found
|
|
||||||
function! s:Bookmark.BookmarkFor(name)
|
|
||||||
for i in s:Bookmark.Bookmarks()
|
|
||||||
if i.name ==# a:name
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
throw "NERDTree.BookmarkNotFoundError: no bookmark found for name: \"". a:name .'"'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.BookmarkNames() {{{1
|
|
||||||
" Class method to return an array of all bookmark names
|
|
||||||
function! s:Bookmark.BookmarkNames()
|
|
||||||
let names = []
|
|
||||||
for i in s:Bookmark.Bookmarks()
|
|
||||||
call add(names, i.name)
|
|
||||||
endfor
|
|
||||||
return names
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.CacheBookmarks(silent) {{{1
|
|
||||||
" Class method to read all bookmarks from the bookmarks file initialize
|
|
||||||
" bookmark objects for each one.
|
|
||||||
"
|
|
||||||
" Args:
|
|
||||||
" silent - dont echo an error msg if invalid bookmarks are found
|
|
||||||
function! s:Bookmark.CacheBookmarks(silent)
|
|
||||||
if filereadable(g:NERDTreeBookmarksFile)
|
|
||||||
let g:NERDTreeBookmarks = []
|
|
||||||
let g:NERDTreeInvalidBookmarks = []
|
|
||||||
let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
|
|
||||||
let invalidBookmarksFound = 0
|
|
||||||
for i in bookmarkStrings
|
|
||||||
|
|
||||||
"ignore blank lines
|
|
||||||
if i != ''
|
|
||||||
|
|
||||||
let name = substitute(i, '^\(.\{-}\) .*$', '\1', '')
|
|
||||||
let path = substitute(i, '^.\{-} \(.*\)$', '\1', '')
|
|
||||||
let path = fnamemodify(path, ':p')
|
|
||||||
|
|
||||||
try
|
|
||||||
let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path))
|
|
||||||
call add(g:NERDTreeBookmarks, bookmark)
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call add(g:NERDTreeInvalidBookmarks, i)
|
|
||||||
let invalidBookmarksFound += 1
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
if invalidBookmarksFound
|
|
||||||
call s:Bookmark.Write()
|
|
||||||
if !a:silent
|
|
||||||
call nerdtree#echo(invalidBookmarksFound . " invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.")
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if g:NERDTreeBookmarksSort ==# 1
|
|
||||||
call s:Bookmark.Sort()
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.compareTo(otherbookmark) {{{1
|
|
||||||
" Compare these two bookmarks for sorting purposes
|
|
||||||
function! s:Bookmark.compareTo(otherbookmark)
|
|
||||||
return a:otherbookmark.name < self.name
|
|
||||||
endfunction
|
|
||||||
" FUNCTION: Bookmark.ClearAll() {{{1
|
|
||||||
" Class method to delete all bookmarks.
|
|
||||||
function! s:Bookmark.ClearAll()
|
|
||||||
for i in s:Bookmark.Bookmarks()
|
|
||||||
call i.delete()
|
|
||||||
endfor
|
|
||||||
call s:Bookmark.Write()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.delete() {{{1
|
|
||||||
" Delete this bookmark. If the node for this bookmark is under the current
|
|
||||||
" root, then recache bookmarks for its Path object
|
|
||||||
function! s:Bookmark.delete()
|
|
||||||
call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self))
|
|
||||||
call s:Bookmark.Write()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) {{{1
|
|
||||||
" Gets the treenode for this bookmark
|
|
||||||
"
|
|
||||||
" Args:
|
|
||||||
" searchFromAbsoluteRoot: specifies whether we should search from the current
|
|
||||||
" tree root, or the highest cached node
|
|
||||||
function! s:Bookmark.getNode(nerdtree, searchFromAbsoluteRoot)
|
|
||||||
let searchRoot = a:searchFromAbsoluteRoot ? a:nerdtree.root.AbsoluteTreeRoot() : a:nerdtree.root
|
|
||||||
let targetNode = searchRoot.findNode(self.path)
|
|
||||||
if empty(targetNode)
|
|
||||||
throw "NERDTree.BookmarkedNodeNotFoundError: no node was found for bookmark: " . self.name
|
|
||||||
endif
|
|
||||||
return targetNode
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) {{{1
|
|
||||||
" Class method that finds the bookmark with the given name and returns the
|
|
||||||
" treenode for it.
|
|
||||||
function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree)
|
|
||||||
let bookmark = s:Bookmark.BookmarkFor(a:name)
|
|
||||||
return bookmark.getNode(nerdtree, a:searchFromAbsoluteRoot)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.GetSelected() {{{1
|
|
||||||
" returns the Bookmark the cursor is over, or {}
|
|
||||||
function! s:Bookmark.GetSelected()
|
|
||||||
let line = getline(".")
|
|
||||||
let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '')
|
|
||||||
if name != line
|
|
||||||
try
|
|
||||||
return s:Bookmark.BookmarkFor(name)
|
|
||||||
catch /^NERDTree.BookmarkNotFoundError/
|
|
||||||
return {}
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.InvalidBookmarks() {{{1
|
|
||||||
" Class method to get all invalid bookmark strings read from the bookmarks
|
|
||||||
" file
|
|
||||||
function! s:Bookmark.InvalidBookmarks()
|
|
||||||
if !exists("g:NERDTreeInvalidBookmarks")
|
|
||||||
let g:NERDTreeInvalidBookmarks = []
|
|
||||||
endif
|
|
||||||
return g:NERDTreeInvalidBookmarks
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.mustExist() {{{1
|
|
||||||
function! s:Bookmark.mustExist()
|
|
||||||
if !self.path.exists()
|
|
||||||
call s:Bookmark.CacheBookmarks(1)
|
|
||||||
throw "NERDTree.BookmarkPointsToInvalidLocationError: the bookmark \"".
|
|
||||||
\ self.name ."\" points to a non existing location: \"". self.path.str()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.New(name, path) {{{1
|
|
||||||
" Create a new bookmark object with the given name and path object
|
|
||||||
function! s:Bookmark.New(name, path)
|
|
||||||
if a:name =~# ' '
|
|
||||||
throw "NERDTree.IllegalBookmarkNameError: illegal name:" . a:name
|
|
||||||
endif
|
|
||||||
|
|
||||||
let newBookmark = copy(self)
|
|
||||||
let newBookmark.name = a:name
|
|
||||||
let newBookmark.path = a:path
|
|
||||||
return newBookmark
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.open(nerdtree, [options]) {{{1
|
|
||||||
"Args:
|
|
||||||
"
|
|
||||||
"nerdtree: the tree to load open the bookmark in
|
|
||||||
"
|
|
||||||
"A dictionary containing the following keys (all optional):
|
|
||||||
" 'where': Specifies whether the node should be opened in new split/tab or in
|
|
||||||
" the previous window. Can be either 'v' (vertical split), 'h'
|
|
||||||
" (horizontal split), 't' (new tab) or 'p' (previous window).
|
|
||||||
" 'reuse': if a window is displaying the file then jump the cursor there
|
|
||||||
" 'keepopen': dont close the tree window
|
|
||||||
" 'stay': open the file, but keep the cursor in the tree win
|
|
||||||
"
|
|
||||||
function! s:Bookmark.open(nerdtree, ...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
|
|
||||||
if self.path.isDirectory && !has_key(opts, 'where')
|
|
||||||
call self.toRoot(a:nerdtree)
|
|
||||||
else
|
|
||||||
let opener = g:NERDTreeOpener.New(self.path, opts)
|
|
||||||
call opener.open(self)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.openInNewTab(options) {{{1
|
|
||||||
" Create a new bookmark object with the given name and path object
|
|
||||||
function! s:Bookmark.openInNewTab(options)
|
|
||||||
call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead')
|
|
||||||
call self.open(a:options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.setPath(path) {{{1
|
|
||||||
" makes this bookmark point to the given path
|
|
||||||
function! s:Bookmark.setPath(path)
|
|
||||||
let self.path = a:path
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.Sort() {{{1
|
|
||||||
" Class method that sorts all bookmarks
|
|
||||||
function! s:Bookmark.Sort()
|
|
||||||
let CompareFunc = function("nerdtree#compareBookmarks")
|
|
||||||
call sort(s:Bookmark.Bookmarks(), CompareFunc)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.str() {{{1
|
|
||||||
" Get the string that should be rendered in the view for this bookmark
|
|
||||||
function! s:Bookmark.str()
|
|
||||||
let pathStrMaxLen = winwidth(g:NERDTree.GetWinNum()) - 4 - len(self.name)
|
|
||||||
if &nu
|
|
||||||
let pathStrMaxLen = pathStrMaxLen - &numberwidth
|
|
||||||
endif
|
|
||||||
|
|
||||||
let pathStr = self.path.str({'format': 'UI'})
|
|
||||||
if len(pathStr) > pathStrMaxLen
|
|
||||||
let pathStr = '<' . strpart(pathStr, len(pathStr) - pathStrMaxLen)
|
|
||||||
endif
|
|
||||||
return '>' . self.name . ' ' . pathStr
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.toRoot(nerdtree) {{{1
|
|
||||||
" Make the node for this bookmark the new tree root
|
|
||||||
function! s:Bookmark.toRoot(nerdtree)
|
|
||||||
if self.validate()
|
|
||||||
try
|
|
||||||
let targetNode = self.getNode(a:nerdtree, 1)
|
|
||||||
catch /^NERDTree.BookmarkedNodeNotFoundError/
|
|
||||||
let targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree)
|
|
||||||
endtry
|
|
||||||
call a:nerdtree.changeRoot(targetNode)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.ToRoot(name, nerdtree) {{{1
|
|
||||||
" Make the node for this bookmark the new tree root
|
|
||||||
function! s:Bookmark.ToRoot(name, nerdtree)
|
|
||||||
let bookmark = s:Bookmark.BookmarkFor(a:name)
|
|
||||||
call bookmark.toRoot(a:nerdtree)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.validate() {{{1
|
|
||||||
function! s:Bookmark.validate()
|
|
||||||
if self.path.exists()
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
call s:Bookmark.CacheBookmarks(1)
|
|
||||||
call nerdtree#echo(self.name . "now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.")
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Bookmark.Write() {{{1
|
|
||||||
" Class method to write all bookmarks to the bookmarks file
|
|
||||||
function! s:Bookmark.Write()
|
|
||||||
let bookmarkStrings = []
|
|
||||||
for i in s:Bookmark.Bookmarks()
|
|
||||||
call add(bookmarkStrings, i.name . ' ' . fnamemodify(i.path.str(), ':~'))
|
|
||||||
endfor
|
|
||||||
|
|
||||||
"add a blank line before the invalid ones
|
|
||||||
call add(bookmarkStrings, "")
|
|
||||||
|
|
||||||
for j in s:Bookmark.InvalidBookmarks()
|
|
||||||
call add(bookmarkStrings, j)
|
|
||||||
endfor
|
|
||||||
call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,379 +0,0 @@
|
||||||
"CLASS: Creator
|
|
||||||
"Creates tab/window/mirror nerdtree windows. Sets up all the window and
|
|
||||||
"buffer options and key mappings etc.
|
|
||||||
"============================================================
|
|
||||||
let s:Creator = {}
|
|
||||||
let g:NERDTreeCreator = s:Creator
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._bindMappings() {{{1
|
|
||||||
function! s:Creator._bindMappings()
|
|
||||||
"make <cr> do the same as the activate node mapping
|
|
||||||
nnoremap <silent> <buffer> <cr> :call nerdtree#ui_glue#invokeKeyMap(g:NERDTreeMapActivateNode)<cr>
|
|
||||||
|
|
||||||
call g:NERDTreeKeyMap.BindAll()
|
|
||||||
|
|
||||||
command! -buffer -nargs=? Bookmark :call nerdtree#ui_glue#bookmarkNode('<args>')
|
|
||||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#ui_glue#revealBookmark('<args>')
|
|
||||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark :call nerdtree#ui_glue#openBookmark('<args>')
|
|
||||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#ui_glue#clearBookmarks('<args>')
|
|
||||||
command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('<args>', b:NERDTree)
|
|
||||||
command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() <bar> call b:NERDTree.render()
|
|
||||||
command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) <bar> call b:NERDTree.render()
|
|
||||||
command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._broadcastInitEvent() {{{1
|
|
||||||
function! s:Creator._broadcastInitEvent()
|
|
||||||
silent doautocmd User NERDTreeInit
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator.BufNamePrefix() {{{2
|
|
||||||
function! s:Creator.BufNamePrefix()
|
|
||||||
return 'NERD_tree_'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.CreateTabTree(a:name) {{{1
|
|
||||||
function! s:Creator.CreateTabTree(name)
|
|
||||||
let creator = s:Creator.New()
|
|
||||||
call creator.createTabTree(a:name)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.createTabTree(a:name) {{{1
|
|
||||||
"name: the name of a bookmark or a directory
|
|
||||||
function! s:Creator.createTabTree(name)
|
|
||||||
let path = self._pathForString(a:name)
|
|
||||||
|
|
||||||
"abort if exception was thrown (bookmark/dir doesn't exist)
|
|
||||||
if empty(path)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if path == {}
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
"if instructed to, then change the vim CWD to the dir the NERDTree is
|
|
||||||
"inited in
|
|
||||||
if g:NERDTreeChDirMode != 0
|
|
||||||
call path.changeToDir()
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:NERDTree.ExistsForTab()
|
|
||||||
if g:NERDTree.IsOpen()
|
|
||||||
call g:NERDTree.Close()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self._removeTreeBufForTab()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self._createTreeWin()
|
|
||||||
call self._createNERDTree(path, "tab")
|
|
||||||
call b:NERDTree.render()
|
|
||||||
call b:NERDTree.root.putCursorHere(0, 0)
|
|
||||||
|
|
||||||
call self._broadcastInitEvent()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.CreateWindowTree(dir) {{{1
|
|
||||||
function! s:Creator.CreateWindowTree(dir)
|
|
||||||
let creator = s:Creator.New()
|
|
||||||
call creator.createWindowTree(a:dir)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.createWindowTree(dir) {{{1
|
|
||||||
function! s:Creator.createWindowTree(dir)
|
|
||||||
try
|
|
||||||
let path = g:NERDTreePath.New(a:dir)
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call nerdtree#echo("Invalid directory name:" . a:name)
|
|
||||||
return
|
|
||||||
endtry
|
|
||||||
|
|
||||||
"we want the directory buffer to disappear when we do the :edit below
|
|
||||||
setlocal bufhidden=wipe
|
|
||||||
|
|
||||||
let previousBuf = expand("#")
|
|
||||||
|
|
||||||
"we need a unique name for each window tree buffer to ensure they are
|
|
||||||
"all independent
|
|
||||||
exec "silent edit " . self._nextBufferName()
|
|
||||||
|
|
||||||
call self._createNERDTree(path, "window")
|
|
||||||
let b:NERDTree._previousBuf = bufnr(previousBuf)
|
|
||||||
call self._setCommonBufOptions()
|
|
||||||
|
|
||||||
call b:NERDTree.render()
|
|
||||||
|
|
||||||
call self._broadcastInitEvent()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator._createNERDTree(path) {{{1
|
|
||||||
function! s:Creator._createNERDTree(path, type)
|
|
||||||
let b:NERDTree = g:NERDTree.New(a:path, a:type)
|
|
||||||
"TODO: This is kept for compatability only since many things use
|
|
||||||
"b:NERDTreeRoot instead of the new NERDTree.root
|
|
||||||
"Remove this one day
|
|
||||||
let b:NERDTreeRoot = b:NERDTree.root
|
|
||||||
|
|
||||||
call b:NERDTree.root.open()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator.CreateMirror() {{{1
|
|
||||||
function! s:Creator.CreateMirror()
|
|
||||||
let creator = s:Creator.New()
|
|
||||||
call creator.createMirror()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator.createMirror() {{{1
|
|
||||||
function! s:Creator.createMirror()
|
|
||||||
"get the names off all the nerd tree buffers
|
|
||||||
let treeBufNames = []
|
|
||||||
for i in range(1, tabpagenr("$"))
|
|
||||||
let nextName = self._tabpagevar(i, 'NERDTreeBufName')
|
|
||||||
if nextName != -1 && (!exists("t:NERDTreeBufName") || nextName != t:NERDTreeBufName)
|
|
||||||
call add(treeBufNames, nextName)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
let treeBufNames = self._uniq(treeBufNames)
|
|
||||||
|
|
||||||
"map the option names (that the user will be prompted with) to the nerd
|
|
||||||
"tree buffer names
|
|
||||||
let options = {}
|
|
||||||
let i = 0
|
|
||||||
while i < len(treeBufNames)
|
|
||||||
let bufName = treeBufNames[i]
|
|
||||||
let treeRoot = getbufvar(bufName, "NERDTree").root
|
|
||||||
let options[i+1 . '. ' . treeRoot.path.str() . ' (buf name: ' . bufName . ')'] = bufName
|
|
||||||
let i = i + 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
"work out which tree to mirror, if there is more than 1 then ask the user
|
|
||||||
let bufferName = ''
|
|
||||||
if len(keys(options)) > 1
|
|
||||||
let choices = ["Choose a tree to mirror"]
|
|
||||||
let choices = extend(choices, sort(keys(options)))
|
|
||||||
let choice = inputlist(choices)
|
|
||||||
if choice < 1 || choice > len(options) || choice ==# ''
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let bufferName = options[sort(keys(options))[choice-1]]
|
|
||||||
elseif len(keys(options)) ==# 1
|
|
||||||
let bufferName = values(options)[0]
|
|
||||||
else
|
|
||||||
call nerdtree#echo("No trees to mirror")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen()
|
|
||||||
call g:NERDTree.Close()
|
|
||||||
endif
|
|
||||||
|
|
||||||
let t:NERDTreeBufName = bufferName
|
|
||||||
call self._createTreeWin()
|
|
||||||
exec 'buffer ' . bufferName
|
|
||||||
if !&hidden
|
|
||||||
call b:NERDTree.render()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._createTreeWin() {{{1
|
|
||||||
"Inits the NERD tree window. ie. opens it, sizes it, sets all the local
|
|
||||||
"options etc
|
|
||||||
function! s:Creator._createTreeWin()
|
|
||||||
"create the nerd tree window
|
|
||||||
let splitLocation = g:NERDTreeWinPos ==# "left" ? "topleft " : "botright "
|
|
||||||
let splitSize = g:NERDTreeWinSize
|
|
||||||
|
|
||||||
if !exists('t:NERDTreeBufName')
|
|
||||||
let t:NERDTreeBufName = self._nextBufferName()
|
|
||||||
silent! exec splitLocation . 'vertical ' . splitSize . ' new'
|
|
||||||
silent! exec "edit " . t:NERDTreeBufName
|
|
||||||
else
|
|
||||||
silent! exec splitLocation . 'vertical ' . splitSize . ' split'
|
|
||||||
silent! exec "buffer " . t:NERDTreeBufName
|
|
||||||
endif
|
|
||||||
|
|
||||||
setlocal winfixwidth
|
|
||||||
call self._setCommonBufOptions()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._isBufHidden(nr) {{{1
|
|
||||||
function! s:Creator._isBufHidden(nr)
|
|
||||||
redir => bufs
|
|
||||||
silent ls!
|
|
||||||
redir END
|
|
||||||
|
|
||||||
return bufs =~ a:nr . '..h'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.New() {{{1
|
|
||||||
function! s:Creator.New()
|
|
||||||
let newCreator = copy(self)
|
|
||||||
return newCreator
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator._nextBufferName() {{{2
|
|
||||||
" returns the buffer name for the next nerd tree
|
|
||||||
function! s:Creator._nextBufferName()
|
|
||||||
let name = s:Creator.BufNamePrefix() . self._nextBufferNumber()
|
|
||||||
return name
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator._nextBufferNumber() {{{2
|
|
||||||
" the number to add to the nerd tree buffer name to make the buf name unique
|
|
||||||
function! s:Creator._nextBufferNumber()
|
|
||||||
if !exists("s:Creator._NextBufNum")
|
|
||||||
let s:Creator._NextBufNum = 1
|
|
||||||
else
|
|
||||||
let s:Creator._NextBufNum += 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
return s:Creator._NextBufNum
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._pathForString(str) {{{1
|
|
||||||
"find a bookmark or adirectory for the given string
|
|
||||||
function! s:Creator._pathForString(str)
|
|
||||||
let path = {}
|
|
||||||
if g:NERDTreeBookmark.BookmarkExistsFor(a:str)
|
|
||||||
let path = g:NERDTreeBookmark.BookmarkFor(a:str).path
|
|
||||||
else
|
|
||||||
let dir = a:str ==# '' ? getcwd() : a:str
|
|
||||||
|
|
||||||
"hack to get an absolute path if a relative path is given
|
|
||||||
if dir =~# '^\.'
|
|
||||||
let dir = getcwd() . g:NERDTreePath.Slash() . dir
|
|
||||||
endif
|
|
||||||
let dir = g:NERDTreePath.Resolve(dir)
|
|
||||||
|
|
||||||
try
|
|
||||||
let path = g:NERDTreePath.New(dir)
|
|
||||||
catch /^NERDTree.InvalidArgumentsError/
|
|
||||||
call nerdtree#echo("No bookmark or directory found for: " . a:str)
|
|
||||||
return {}
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
if !path.isDirectory
|
|
||||||
let path = path.getParent()
|
|
||||||
endif
|
|
||||||
|
|
||||||
return path
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Function: s:Creator._removeTreeBufForTab() {{{1
|
|
||||||
function! s:Creator._removeTreeBufForTab()
|
|
||||||
let buf = bufnr(t:NERDTreeBufName)
|
|
||||||
|
|
||||||
"if &hidden is not set then it will already be gone
|
|
||||||
if buf != -1
|
|
||||||
|
|
||||||
"nerdtree buf may be mirrored/displayed elsewhere
|
|
||||||
if self._isBufHidden(buf)
|
|
||||||
exec "bwipeout " . buf
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
unlet t:NERDTreeBufName
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._setCommonBufOptions() {{{1
|
|
||||||
function! s:Creator._setCommonBufOptions()
|
|
||||||
"throwaway buffer options
|
|
||||||
setlocal noswapfile
|
|
||||||
setlocal buftype=nofile
|
|
||||||
setlocal bufhidden=hide
|
|
||||||
setlocal nowrap
|
|
||||||
setlocal foldcolumn=0
|
|
||||||
setlocal foldmethod=manual
|
|
||||||
setlocal nofoldenable
|
|
||||||
setlocal nobuflisted
|
|
||||||
setlocal nospell
|
|
||||||
if g:NERDTreeShowLineNumbers
|
|
||||||
setlocal nu
|
|
||||||
else
|
|
||||||
setlocal nonu
|
|
||||||
if v:version >= 703
|
|
||||||
setlocal nornu
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
iabc <buffer>
|
|
||||||
|
|
||||||
if g:NERDTreeHighlightCursorline
|
|
||||||
setlocal cursorline
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self._setupStatusline()
|
|
||||||
call self._bindMappings()
|
|
||||||
setlocal filetype=nerdtree
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator._setupStatusline() {{{1
|
|
||||||
function! s:Creator._setupStatusline()
|
|
||||||
if g:NERDTreeStatusline != -1
|
|
||||||
let &l:statusline = g:NERDTreeStatusline
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:Creator._tabpagevar(tabnr, var) {{{1
|
|
||||||
function! s:Creator._tabpagevar(tabnr, var)
|
|
||||||
let currentTab = tabpagenr()
|
|
||||||
let old_ei = &ei
|
|
||||||
set ei=all
|
|
||||||
|
|
||||||
exec "tabnext " . a:tabnr
|
|
||||||
let v = -1
|
|
||||||
if exists('t:' . a:var)
|
|
||||||
exec 'let v = t:' . a:var
|
|
||||||
endif
|
|
||||||
exec "tabnext " . currentTab
|
|
||||||
|
|
||||||
let &ei = old_ei
|
|
||||||
|
|
||||||
return v
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.ToggleTabTree(dir) {{{1
|
|
||||||
function! s:Creator.ToggleTabTree(dir)
|
|
||||||
let creator = s:Creator.New()
|
|
||||||
call creator.toggleTabTree(a:dir)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Creator.toggleTabTree(dir) {{{1
|
|
||||||
"Toggles the NERD tree. I.e the NERD tree is open, it is closed, if it is
|
|
||||||
"closed it is restored or initialized (if it doesnt exist)
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"dir: the full path for the root node (is only used if the NERD tree is being
|
|
||||||
"initialized.
|
|
||||||
function! s:Creator.toggleTabTree(dir)
|
|
||||||
if g:NERDTree.ExistsForTab()
|
|
||||||
if !g:NERDTree.IsOpen()
|
|
||||||
call self._createTreeWin()
|
|
||||||
if !&hidden
|
|
||||||
call b:NERDTree.render()
|
|
||||||
endif
|
|
||||||
call b:NERDTree.ui.restoreScreenState()
|
|
||||||
else
|
|
||||||
call g:NERDTree.Close()
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call self.createTabTree(a:dir)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Function: s:Creator._uniq(list) {{{1
|
|
||||||
" returns a:list without duplicates
|
|
||||||
function! s:Creator._uniq(list)
|
|
||||||
let uniqlist = []
|
|
||||||
for elem in a:list
|
|
||||||
if index(uniqlist, elem) ==# -1
|
|
||||||
let uniqlist += [elem]
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return uniqlist
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
"CLASS: Event
|
|
||||||
"============================================================
|
|
||||||
let s:Event = {}
|
|
||||||
let g:NERDTreeEvent = s:Event
|
|
||||||
|
|
||||||
function! s:Event.New(nerdtree, subject, action, params) abort
|
|
||||||
let newObj = copy(self)
|
|
||||||
let newObj.nerdtree = a:nerdtree
|
|
||||||
let newObj.subject = a:subject
|
|
||||||
let newObj.action = a:action
|
|
||||||
let newObj.params = a:params
|
|
||||||
return newObj
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
"CLASS: FlagSet
|
|
||||||
"============================================================
|
|
||||||
let s:FlagSet = {}
|
|
||||||
let g:NERDTreeFlagSet = s:FlagSet
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet.addFlag(scope, flag) {{{1
|
|
||||||
function! s:FlagSet.addFlag(scope, flag)
|
|
||||||
let flags = self._flagsForScope(a:scope)
|
|
||||||
if index(flags, a:flag) == -1
|
|
||||||
call add(flags, a:flag)
|
|
||||||
end
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet.clearFlags(scope) {{{1
|
|
||||||
function! s:FlagSet.clearFlags(scope)
|
|
||||||
let self._flags[a:scope] = []
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet._flagsForScope(scope) {{{1
|
|
||||||
function! s:FlagSet._flagsForScope(scope)
|
|
||||||
if !has_key(self._flags, a:scope)
|
|
||||||
let self._flags[a:scope] = []
|
|
||||||
endif
|
|
||||||
return self._flags[a:scope]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet.New() {{{1
|
|
||||||
function! s:FlagSet.New()
|
|
||||||
let newObj = copy(self)
|
|
||||||
let newObj._flags = {}
|
|
||||||
return newObj
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet.removeFlag(scope, flag) {{{1
|
|
||||||
function! s:FlagSet.removeFlag(scope, flag)
|
|
||||||
let flags = self._flagsForScope(a:scope)
|
|
||||||
|
|
||||||
let i = index(flags, a:flag)
|
|
||||||
if i >= 0
|
|
||||||
call remove(flags, i)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: FlagSet.renderToString() {{{1
|
|
||||||
function! s:FlagSet.renderToString()
|
|
||||||
let flagstring = ""
|
|
||||||
for i in values(self._flags)
|
|
||||||
let flagstring .= join(i)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if len(flagstring) == 0
|
|
||||||
return ""
|
|
||||||
endif
|
|
||||||
|
|
||||||
return '[' . flagstring . ']'
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,159 +0,0 @@
|
||||||
"CLASS: KeyMap
|
|
||||||
"============================================================
|
|
||||||
let s:KeyMap = {}
|
|
||||||
let g:NERDTreeKeyMap = s:KeyMap
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.All() {{{1
|
|
||||||
function! s:KeyMap.All()
|
|
||||||
if !exists("s:keyMaps")
|
|
||||||
let s:keyMaps = []
|
|
||||||
endif
|
|
||||||
return s:keyMaps
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.FindFor(key, scope) {{{1
|
|
||||||
function! s:KeyMap.FindFor(key, scope)
|
|
||||||
for i in s:KeyMap.All()
|
|
||||||
if i.key ==# a:key && i.scope ==# a:scope
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.BindAll() {{{1
|
|
||||||
function! s:KeyMap.BindAll()
|
|
||||||
for i in s:KeyMap.All()
|
|
||||||
call i.bind()
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.bind() {{{1
|
|
||||||
function! s:KeyMap.bind()
|
|
||||||
" If the key sequence we're trying to map contains any '<>' notation, we
|
|
||||||
" must replace each of the '<' characters with '<lt>' to ensure the string
|
|
||||||
" is not translated into its corresponding keycode during the later part
|
|
||||||
" of the map command below
|
|
||||||
" :he <>
|
|
||||||
let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)'
|
|
||||||
if self.key =~# specialNotationRegex
|
|
||||||
let keymapInvokeString = substitute(self.key, specialNotationRegex, '<lt>\1', 'g')
|
|
||||||
else
|
|
||||||
let keymapInvokeString = self.key
|
|
||||||
endif
|
|
||||||
|
|
||||||
let premap = self.key == "<LeftRelease>" ? " <LeftRelease>" : " "
|
|
||||||
|
|
||||||
exec 'nnoremap <buffer> <silent> '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")<cr>'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.Remove(key, scope) {{{1
|
|
||||||
function! s:KeyMap.Remove(key, scope)
|
|
||||||
let maps = s:KeyMap.All()
|
|
||||||
for i in range(len(maps))
|
|
||||||
if maps[i].key ==# a:key && maps[i].scope ==# a:scope
|
|
||||||
return remove(maps, i)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.invoke() {{{1
|
|
||||||
"Call the KeyMaps callback function
|
|
||||||
function! s:KeyMap.invoke(...)
|
|
||||||
let Callback = function(self.callback)
|
|
||||||
if a:0
|
|
||||||
call Callback(a:1)
|
|
||||||
else
|
|
||||||
call Callback()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.Invoke() {{{1
|
|
||||||
"Find a keymapping for a:key and the current scope invoke it.
|
|
||||||
"
|
|
||||||
"Scope is determined as follows:
|
|
||||||
" * if the cursor is on a dir node then "DirNode"
|
|
||||||
" * if the cursor is on a file node then "FileNode"
|
|
||||||
" * if the cursor is on a bookmark then "Bookmark"
|
|
||||||
"
|
|
||||||
"If a keymap has the scope of "all" then it will be called if no other keymap
|
|
||||||
"is found for a:key and the scope.
|
|
||||||
function! s:KeyMap.Invoke(key)
|
|
||||||
|
|
||||||
"required because clicking the command window below another window still
|
|
||||||
"invokes the <LeftRelease> mapping - but changes the window cursor
|
|
||||||
"is in first
|
|
||||||
"
|
|
||||||
"TODO: remove this check when the vim bug is fixed
|
|
||||||
if !g:NERDTree.ExistsForBuf()
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
|
|
||||||
let node = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if !empty(node)
|
|
||||||
|
|
||||||
"try file node
|
|
||||||
if !node.path.isDirectory
|
|
||||||
let km = s:KeyMap.FindFor(a:key, "FileNode")
|
|
||||||
if !empty(km)
|
|
||||||
return km.invoke(node)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
"try dir node
|
|
||||||
if node.path.isDirectory
|
|
||||||
let km = s:KeyMap.FindFor(a:key, "DirNode")
|
|
||||||
if !empty(km)
|
|
||||||
return km.invoke(node)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
"try generic node
|
|
||||||
let km = s:KeyMap.FindFor(a:key, "Node")
|
|
||||||
if !empty(km)
|
|
||||||
return km.invoke(node)
|
|
||||||
endif
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
"try bookmark
|
|
||||||
let bm = g:NERDTreeBookmark.GetSelected()
|
|
||||||
if !empty(bm)
|
|
||||||
let km = s:KeyMap.FindFor(a:key, "Bookmark")
|
|
||||||
if !empty(km)
|
|
||||||
return km.invoke(bm)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
"try all
|
|
||||||
let km = s:KeyMap.FindFor(a:key, "all")
|
|
||||||
if !empty(km)
|
|
||||||
return km.invoke()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.Create(options) {{{1
|
|
||||||
function! s:KeyMap.Create(options)
|
|
||||||
let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options))
|
|
||||||
|
|
||||||
"dont override other mappings unless the 'override' option is given
|
|
||||||
if get(opts, 'override', 0) == 0 && !empty(s:KeyMap.FindFor(opts['key'], opts['scope']))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
let newKeyMap = copy(self)
|
|
||||||
let newKeyMap.key = opts['key']
|
|
||||||
let newKeyMap.quickhelpText = opts['quickhelpText']
|
|
||||||
let newKeyMap.callback = opts['callback']
|
|
||||||
let newKeyMap.scope = opts['scope']
|
|
||||||
|
|
||||||
call s:KeyMap.Add(newKeyMap)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: KeyMap.Add(keymap) {{{1
|
|
||||||
function! s:KeyMap.Add(keymap)
|
|
||||||
call s:KeyMap.Remove(a:keymap.key, a:keymap.scope)
|
|
||||||
call add(s:KeyMap.All(), a:keymap)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,180 +0,0 @@
|
||||||
"CLASS: MenuController
|
|
||||||
"============================================================
|
|
||||||
let s:MenuController = {}
|
|
||||||
let g:NERDTreeMenuController = s:MenuController
|
|
||||||
|
|
||||||
"FUNCTION: MenuController.New(menuItems) {{{1
|
|
||||||
"create a new menu controller that operates on the given menu items
|
|
||||||
function! s:MenuController.New(menuItems)
|
|
||||||
let newMenuController = copy(self)
|
|
||||||
if a:menuItems[0].isSeparator()
|
|
||||||
let newMenuController.menuItems = a:menuItems[1:-1]
|
|
||||||
else
|
|
||||||
let newMenuController.menuItems = a:menuItems
|
|
||||||
endif
|
|
||||||
return newMenuController
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController.showMenu() {{{1
|
|
||||||
"start the main loop of the menu and get the user to choose/execute a menu
|
|
||||||
"item
|
|
||||||
function! s:MenuController.showMenu()
|
|
||||||
call self._saveOptions()
|
|
||||||
|
|
||||||
try
|
|
||||||
let self.selection = 0
|
|
||||||
|
|
||||||
let done = 0
|
|
||||||
while !done
|
|
||||||
redraw!
|
|
||||||
call self._echoPrompt()
|
|
||||||
let key = nr2char(getchar())
|
|
||||||
let done = self._handleKeypress(key)
|
|
||||||
endwhile
|
|
||||||
finally
|
|
||||||
call self._restoreOptions()
|
|
||||||
endtry
|
|
||||||
|
|
||||||
if self.selection != -1
|
|
||||||
let m = self._current()
|
|
||||||
call m.execute()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._echoPrompt() {{{1
|
|
||||||
function! s:MenuController._echoPrompt()
|
|
||||||
echo "NERDTree Menu. Use j/k/enter and the shortcuts indicated"
|
|
||||||
echo "=========================================================="
|
|
||||||
|
|
||||||
for i in range(0, len(self.menuItems)-1)
|
|
||||||
if self.selection == i
|
|
||||||
echo "> " . self.menuItems[i].text
|
|
||||||
else
|
|
||||||
echo " " . self.menuItems[i].text
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._current(key) {{{1
|
|
||||||
"get the MenuItem that is currently selected
|
|
||||||
function! s:MenuController._current()
|
|
||||||
return self.menuItems[self.selection]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._handleKeypress(key) {{{1
|
|
||||||
"change the selection (if appropriate) and return 1 if the user has made
|
|
||||||
"their choice, 0 otherwise
|
|
||||||
function! s:MenuController._handleKeypress(key)
|
|
||||||
if a:key == 'j'
|
|
||||||
call self._cursorDown()
|
|
||||||
elseif a:key == 'k'
|
|
||||||
call self._cursorUp()
|
|
||||||
elseif a:key == nr2char(27) "escape
|
|
||||||
let self.selection = -1
|
|
||||||
return 1
|
|
||||||
elseif a:key == "\r" || a:key == "\n" "enter and ctrl-j
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
let index = self._nextIndexFor(a:key)
|
|
||||||
if index != -1
|
|
||||||
let self.selection = index
|
|
||||||
if len(self._allIndexesFor(a:key)) == 1
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._allIndexesFor(shortcut) {{{1
|
|
||||||
"get indexes to all menu items with the given shortcut
|
|
||||||
function! s:MenuController._allIndexesFor(shortcut)
|
|
||||||
let toReturn = []
|
|
||||||
|
|
||||||
for i in range(0, len(self.menuItems)-1)
|
|
||||||
if self.menuItems[i].shortcut == a:shortcut
|
|
||||||
call add(toReturn, i)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._nextIndexFor(shortcut) {{{1
|
|
||||||
"get the index to the next menu item with the given shortcut, starts from the
|
|
||||||
"current cursor location and wraps around to the top again if need be
|
|
||||||
function! s:MenuController._nextIndexFor(shortcut)
|
|
||||||
for i in range(self.selection+1, len(self.menuItems)-1)
|
|
||||||
if self.menuItems[i].shortcut == a:shortcut
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for i in range(0, self.selection)
|
|
||||||
if self.menuItems[i].shortcut == a:shortcut
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._setCmdheight() {{{1
|
|
||||||
"sets &cmdheight to whatever is needed to display the menu
|
|
||||||
function! s:MenuController._setCmdheight()
|
|
||||||
let &cmdheight = len(self.menuItems) + 3
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._saveOptions() {{{1
|
|
||||||
"set any vim options that are required to make the menu work (saving their old
|
|
||||||
"values)
|
|
||||||
function! s:MenuController._saveOptions()
|
|
||||||
let self._oldLazyredraw = &lazyredraw
|
|
||||||
let self._oldCmdheight = &cmdheight
|
|
||||||
set nolazyredraw
|
|
||||||
call self._setCmdheight()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._restoreOptions() {{{1
|
|
||||||
"restore the options we saved in _saveOptions()
|
|
||||||
function! s:MenuController._restoreOptions()
|
|
||||||
let &cmdheight = self._oldCmdheight
|
|
||||||
let &lazyredraw = self._oldLazyredraw
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._cursorDown() {{{1
|
|
||||||
"move the cursor to the next menu item, skipping separators
|
|
||||||
function! s:MenuController._cursorDown()
|
|
||||||
let done = 0
|
|
||||||
while !done
|
|
||||||
if self.selection < len(self.menuItems)-1
|
|
||||||
let self.selection += 1
|
|
||||||
else
|
|
||||||
let self.selection = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !self._current().isSeparator()
|
|
||||||
let done = 1
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuController._cursorUp() {{{1
|
|
||||||
"move the cursor to the previous menu item, skipping separators
|
|
||||||
function! s:MenuController._cursorUp()
|
|
||||||
let done = 0
|
|
||||||
while !done
|
|
||||||
if self.selection > 0
|
|
||||||
let self.selection -= 1
|
|
||||||
else
|
|
||||||
let self.selection = len(self.menuItems)-1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !self._current().isSeparator()
|
|
||||||
let done = 1
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
||||||
"CLASS: MenuItem
|
|
||||||
"============================================================
|
|
||||||
let s:MenuItem = {}
|
|
||||||
let g:NERDTreeMenuItem = s:MenuItem
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.All() {{{1
|
|
||||||
"get all top level menu items
|
|
||||||
function! s:MenuItem.All()
|
|
||||||
if !exists("s:menuItems")
|
|
||||||
let s:menuItems = []
|
|
||||||
endif
|
|
||||||
return s:menuItems
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.AllEnabled() {{{1
|
|
||||||
"get all top level menu items that are currently enabled
|
|
||||||
function! s:MenuItem.AllEnabled()
|
|
||||||
let toReturn = []
|
|
||||||
for i in s:MenuItem.All()
|
|
||||||
if i.enabled()
|
|
||||||
call add(toReturn, i)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.Create(options) {{{1
|
|
||||||
"make a new menu item and add it to the global list
|
|
||||||
function! s:MenuItem.Create(options)
|
|
||||||
let newMenuItem = copy(self)
|
|
||||||
|
|
||||||
let newMenuItem.text = a:options['text']
|
|
||||||
let newMenuItem.shortcut = a:options['shortcut']
|
|
||||||
let newMenuItem.children = []
|
|
||||||
|
|
||||||
let newMenuItem.isActiveCallback = -1
|
|
||||||
if has_key(a:options, 'isActiveCallback')
|
|
||||||
let newMenuItem.isActiveCallback = a:options['isActiveCallback']
|
|
||||||
endif
|
|
||||||
|
|
||||||
let newMenuItem.callback = -1
|
|
||||||
if has_key(a:options, 'callback')
|
|
||||||
let newMenuItem.callback = a:options['callback']
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has_key(a:options, 'parent')
|
|
||||||
call add(a:options['parent'].children, newMenuItem)
|
|
||||||
else
|
|
||||||
call add(s:MenuItem.All(), newMenuItem)
|
|
||||||
endif
|
|
||||||
|
|
||||||
return newMenuItem
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.CreateSeparator(options) {{{1
|
|
||||||
"make a new separator menu item and add it to the global list
|
|
||||||
function! s:MenuItem.CreateSeparator(options)
|
|
||||||
let standard_options = { 'text': '--------------------',
|
|
||||||
\ 'shortcut': -1,
|
|
||||||
\ 'callback': -1 }
|
|
||||||
let options = extend(a:options, standard_options, "force")
|
|
||||||
|
|
||||||
return s:MenuItem.Create(options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.CreateSubmenu(options) {{{1
|
|
||||||
"make a new submenu and add it to global list
|
|
||||||
function! s:MenuItem.CreateSubmenu(options)
|
|
||||||
let standard_options = { 'callback': -1 }
|
|
||||||
let options = extend(a:options, standard_options, "force")
|
|
||||||
|
|
||||||
return s:MenuItem.Create(options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.enabled() {{{1
|
|
||||||
"return 1 if this menu item should be displayed
|
|
||||||
"
|
|
||||||
"delegates off to the isActiveCallback, and defaults to 1 if no callback was
|
|
||||||
"specified
|
|
||||||
function! s:MenuItem.enabled()
|
|
||||||
if self.isActiveCallback != -1
|
|
||||||
return {self.isActiveCallback}()
|
|
||||||
endif
|
|
||||||
return 1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.execute() {{{1
|
|
||||||
"perform the action behind this menu item, if this menuitem has children then
|
|
||||||
"display a new menu for them, otherwise deletegate off to the menuitem's
|
|
||||||
"callback
|
|
||||||
function! s:MenuItem.execute()
|
|
||||||
if len(self.children)
|
|
||||||
let mc = g:NERDTreeMenuController.New(self.children)
|
|
||||||
call mc.showMenu()
|
|
||||||
else
|
|
||||||
if self.callback != -1
|
|
||||||
call {self.callback}()
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.isSeparator() {{{1
|
|
||||||
"return 1 if this menuitem is a separator
|
|
||||||
function! s:MenuItem.isSeparator()
|
|
||||||
return self.callback == -1 && self.children == []
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: MenuItem.isSubmenu() {{{1
|
|
||||||
"return 1 if this menuitem is a submenu
|
|
||||||
function! s:MenuItem.isSubmenu()
|
|
||||||
return self.callback == -1 && !empty(self.children)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,193 +0,0 @@
|
||||||
"CLASS: NERDTree
|
|
||||||
"============================================================
|
|
||||||
let s:NERDTree = {}
|
|
||||||
let g:NERDTree = s:NERDTree
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.AddPathFilter() {{{1
|
|
||||||
function! s:NERDTree.AddPathFilter(callback)
|
|
||||||
call add(s:NERDTree.PathFilters(), a:callback)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.changeRoot(node) {{{1
|
|
||||||
function! s:NERDTree.changeRoot(node)
|
|
||||||
if a:node.path.isDirectory
|
|
||||||
let self.root = a:node
|
|
||||||
else
|
|
||||||
call a:node.cacheParent()
|
|
||||||
let self.root = a:node.parent
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self.root.open()
|
|
||||||
|
|
||||||
"change dir to the dir of the new root if instructed to
|
|
||||||
if g:NERDTreeChDirMode ==# 2
|
|
||||||
exec "cd " . self.root.path.str({'format': 'Edit'})
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self.render()
|
|
||||||
call self.root.putCursorHere(0, 0)
|
|
||||||
|
|
||||||
silent doautocmd User NERDTreeNewRoot
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.Close() {{{1
|
|
||||||
"Closes the tab tree window for this tab
|
|
||||||
function! s:NERDTree.Close()
|
|
||||||
if !s:NERDTree.IsOpen()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if winnr("$") != 1
|
|
||||||
if winnr() == s:NERDTree.GetWinNum()
|
|
||||||
call nerdtree#exec("wincmd p")
|
|
||||||
let bufnr = bufnr("")
|
|
||||||
call nerdtree#exec("wincmd p")
|
|
||||||
else
|
|
||||||
let bufnr = bufnr("")
|
|
||||||
endif
|
|
||||||
|
|
||||||
call nerdtree#exec(s:NERDTree.GetWinNum() . " wincmd w")
|
|
||||||
close
|
|
||||||
call nerdtree#exec(bufwinnr(bufnr) . " wincmd w")
|
|
||||||
else
|
|
||||||
close
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.CloseIfQuitOnOpen() {{{1
|
|
||||||
"Closes the NERD tree window if the close on open option is set
|
|
||||||
function! s:NERDTree.CloseIfQuitOnOpen()
|
|
||||||
if g:NERDTreeQuitOnOpen && s:NERDTree.IsOpen()
|
|
||||||
call s:NERDTree.Close()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1
|
|
||||||
"Places the cursor at the top of the bookmarks table
|
|
||||||
function! s:NERDTree.CursorToBookmarkTable()
|
|
||||||
if !b:NERDTree.ui.getShowBookmarks()
|
|
||||||
throw "NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active"
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:NERDTreeMinimalUI
|
|
||||||
return cursor(1, 2)
|
|
||||||
endif
|
|
||||||
|
|
||||||
let rootNodeLine = b:NERDTree.ui.getRootLineNum()
|
|
||||||
|
|
||||||
let line = 1
|
|
||||||
while getline(line) !~# '^>-\+Bookmarks-\+$'
|
|
||||||
let line = line + 1
|
|
||||||
if line >= rootNodeLine
|
|
||||||
throw "NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table"
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
call cursor(line, 2)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1
|
|
||||||
"Places the cursor in the nerd tree window
|
|
||||||
function! s:NERDTree.CursorToTreeWin()
|
|
||||||
call g:NERDTree.MustBeOpen()
|
|
||||||
call nerdtree#exec(g:NERDTree.GetWinNum() . "wincmd w")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Function: s:NERDTree.ExistsForBuffer() {{{1
|
|
||||||
" Returns 1 if a nerd tree root exists in the current buffer
|
|
||||||
function! s:NERDTree.ExistsForBuf()
|
|
||||||
return exists("b:NERDTree")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Function: s:NERDTree.ExistsForTab() {{{1
|
|
||||||
" Returns 1 if a nerd tree root exists in the current tab
|
|
||||||
function! s:NERDTree.ExistsForTab()
|
|
||||||
if !exists("t:NERDTreeBufName")
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
"check b:NERDTree is still there and hasn't been e.g. :bdeleted
|
|
||||||
return !empty(getbufvar(bufnr(t:NERDTreeBufName), 'NERDTree'))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:NERDTree.ForCurrentBuf()
|
|
||||||
if s:NERDTree.ExistsForBuf()
|
|
||||||
return b:NERDTree
|
|
||||||
else
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.ForCurrentTab() {{{1
|
|
||||||
function! s:NERDTree.ForCurrentTab()
|
|
||||||
if !s:NERDTree.ExistsForTab()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let bufnr = bufnr(t:NERDTreeBufName)
|
|
||||||
return getbufvar(bufnr, "NERDTree")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.getRoot() {{{1
|
|
||||||
function! s:NERDTree.getRoot()
|
|
||||||
return self.root
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.GetWinNum() {{{1
|
|
||||||
"gets the nerd tree window number for this tab
|
|
||||||
function! s:NERDTree.GetWinNum()
|
|
||||||
if exists("t:NERDTreeBufName")
|
|
||||||
return bufwinnr(t:NERDTreeBufName)
|
|
||||||
endif
|
|
||||||
|
|
||||||
return -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.IsOpen() {{{1
|
|
||||||
function! s:NERDTree.IsOpen()
|
|
||||||
return s:NERDTree.GetWinNum() != -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.isTabTree() {{{1
|
|
||||||
function! s:NERDTree.isTabTree()
|
|
||||||
return self._type == "tab"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.isWinTree() {{{1
|
|
||||||
function! s:NERDTree.isWinTree()
|
|
||||||
return self._type == "window"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.MustBeOpen() {{{1
|
|
||||||
function! s:NERDTree.MustBeOpen()
|
|
||||||
if !s:NERDTree.IsOpen()
|
|
||||||
throw "NERDTree.TreeNotOpen"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.New() {{{1
|
|
||||||
function! s:NERDTree.New(path, type)
|
|
||||||
let newObj = copy(self)
|
|
||||||
let newObj.ui = g:NERDTreeUI.New(newObj)
|
|
||||||
let newObj.root = g:NERDTreeDirNode.New(a:path, newObj)
|
|
||||||
let newObj._type = a:type
|
|
||||||
return newObj
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.PathFilters() {{{1
|
|
||||||
function! s:NERDTree.PathFilters()
|
|
||||||
if !exists('s:NERDTree._PathFilters')
|
|
||||||
let s:NERDTree._PathFilters = []
|
|
||||||
endif
|
|
||||||
return s:NERDTree._PathFilters
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.previousBuf() {{{1
|
|
||||||
function! s:NERDTree.previousBuf()
|
|
||||||
return self._previousBuf
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:NERDTree.render() {{{1
|
|
||||||
"A convenience function - since this is called often
|
|
||||||
function! s:NERDTree.render()
|
|
||||||
call self.ui.render()
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
"CLASS: Notifier
|
|
||||||
"============================================================
|
|
||||||
let s:Notifier = {}
|
|
||||||
|
|
||||||
function! s:Notifier.AddListener(event, funcname)
|
|
||||||
let listeners = s:Notifier.GetListenersForEvent(a:event)
|
|
||||||
if listeners == []
|
|
||||||
let listenersMap = s:Notifier.GetListenersMap()
|
|
||||||
let listenersMap[a:event] = listeners
|
|
||||||
endif
|
|
||||||
call add(listeners, a:funcname)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Notifier.NotifyListeners(event, path, nerdtree, params)
|
|
||||||
let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params)
|
|
||||||
|
|
||||||
for listener in s:Notifier.GetListenersForEvent(a:event)
|
|
||||||
call {listener}(event)
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Notifier.GetListenersMap()
|
|
||||||
if !exists("s:refreshListenersMap")
|
|
||||||
let s:refreshListenersMap = {}
|
|
||||||
endif
|
|
||||||
return s:refreshListenersMap
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Notifier.GetListenersForEvent(name)
|
|
||||||
let listenersMap = s:Notifier.GetListenersMap()
|
|
||||||
return get(listenersMap, a:name, [])
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let g:NERDTreePathNotifier = deepcopy(s:Notifier)
|
|
||||||
|
|
||||||
|
|
@ -1,343 +0,0 @@
|
||||||
"CLASS: Opener
|
|
||||||
"============================================================
|
|
||||||
let s:Opener = {}
|
|
||||||
let g:NERDTreeOpener = s:Opener
|
|
||||||
|
|
||||||
"FUNCTION: s:Opener._bufInWindows(bnum){{{1
|
|
||||||
"[[STOLEN FROM VTREEEXPLORER.VIM]]
|
|
||||||
"Determine the number of windows open to this buffer number.
|
|
||||||
"Care of Yegappan Lakshman. Thanks!
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"bnum: the subject buffers buffer number
|
|
||||||
function! s:Opener._bufInWindows(bnum)
|
|
||||||
let cnt = 0
|
|
||||||
let winnum = 1
|
|
||||||
while 1
|
|
||||||
let bufnum = winbufnr(winnum)
|
|
||||||
if bufnum < 0
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
if bufnum ==# a:bnum
|
|
||||||
let cnt = cnt + 1
|
|
||||||
endif
|
|
||||||
let winnum = winnum + 1
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return cnt
|
|
||||||
endfunction
|
|
||||||
"FUNCTION: Opener._checkToCloseTree(newtab) {{{1
|
|
||||||
"Check the class options and global options (i.e. NERDTreeQuitOnOpen) to see
|
|
||||||
"if the tree should be closed now.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"a:newtab - boolean. If set, only close the tree now if we are opening the
|
|
||||||
"target in a new tab. This is needed because we have to close tree before we
|
|
||||||
"leave the tab
|
|
||||||
function! s:Opener._checkToCloseTree(newtab)
|
|
||||||
if self._keepopen
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if (a:newtab && self._where == 't') || !a:newtab
|
|
||||||
call g:NERDTree.CloseIfQuitOnOpen()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
"FUNCTION: s:Opener._firstUsableWindow(){{{1
|
|
||||||
"find the window number of the first normal window
|
|
||||||
function! s:Opener._firstUsableWindow()
|
|
||||||
let i = 1
|
|
||||||
while i <= winnr("$")
|
|
||||||
let bnum = winbufnr(i)
|
|
||||||
if bnum != -1 && getbufvar(bnum, '&buftype') ==# ''
|
|
||||||
\ && !getwinvar(i, '&previewwindow')
|
|
||||||
\ && (!getbufvar(bnum, '&modified') || &hidden)
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
|
|
||||||
let i += 1
|
|
||||||
endwhile
|
|
||||||
return -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._gotoTargetWin() {{{1
|
|
||||||
function! s:Opener._gotoTargetWin()
|
|
||||||
if b:NERDTree.isWinTree()
|
|
||||||
if self._where == 'v'
|
|
||||||
vsplit
|
|
||||||
elseif self._where == 'h'
|
|
||||||
split
|
|
||||||
elseif self._where == 't'
|
|
||||||
tabnew
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call self._checkToCloseTree(1)
|
|
||||||
|
|
||||||
if self._where == 'v'
|
|
||||||
call self._newVSplit()
|
|
||||||
elseif self._where == 'h'
|
|
||||||
call self._newSplit()
|
|
||||||
elseif self._where == 't'
|
|
||||||
tabnew
|
|
||||||
elseif self._where == 'p'
|
|
||||||
call self._previousWindow()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self._checkToCloseTree(0)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1
|
|
||||||
"Returns 0 if opening a file from the tree in the given window requires it to
|
|
||||||
"be split, 1 otherwise
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"winnumber: the number of the window in question
|
|
||||||
function! s:Opener._isWindowUsable(winnumber)
|
|
||||||
"gotta split if theres only one window (i.e. the NERD tree)
|
|
||||||
if winnr("$") ==# 1
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let oldwinnr = winnr()
|
|
||||||
call nerdtree#exec(a:winnumber . "wincmd p")
|
|
||||||
let specialWindow = getbufvar("%", '&buftype') != '' || getwinvar('%', '&previewwindow')
|
|
||||||
let modified = &modified
|
|
||||||
call nerdtree#exec(oldwinnr . "wincmd p")
|
|
||||||
|
|
||||||
"if its a special window e.g. quickfix or another explorer plugin then we
|
|
||||||
"have to split
|
|
||||||
if specialWindow
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
if &hidden
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
return !modified || self._bufInWindows(winbufnr(a:winnumber)) >= 2
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener.New(path, opts) {{{1
|
|
||||||
"Args:
|
|
||||||
"
|
|
||||||
"a:path: The path object that is to be opened.
|
|
||||||
"
|
|
||||||
"a:opts:
|
|
||||||
"
|
|
||||||
"A dictionary containing the following keys (all optional):
|
|
||||||
" 'where': Specifies whether the node should be opened in new split/tab or in
|
|
||||||
" the previous window. Can be either 'v' or 'h' or 't' (for open in
|
|
||||||
" new tab)
|
|
||||||
" 'reuse': if a window is displaying the file then jump the cursor there. Can
|
|
||||||
" 'all', 'currenttab' or empty to not reuse.
|
|
||||||
" 'keepopen': dont close the tree window
|
|
||||||
" 'stay': open the file, but keep the cursor in the tree win
|
|
||||||
function! s:Opener.New(path, opts)
|
|
||||||
let newObj = copy(self)
|
|
||||||
|
|
||||||
let newObj._path = a:path
|
|
||||||
let newObj._stay = nerdtree#has_opt(a:opts, 'stay')
|
|
||||||
|
|
||||||
if has_key(a:opts, 'reuse')
|
|
||||||
let newObj._reuse = a:opts['reuse']
|
|
||||||
else
|
|
||||||
let newObj._reuse = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
let newObj._keepopen = nerdtree#has_opt(a:opts, 'keepopen')
|
|
||||||
let newObj._where = has_key(a:opts, 'where') ? a:opts['where'] : ''
|
|
||||||
let newObj._nerdtree = b:NERDTree
|
|
||||||
call newObj._saveCursorPos()
|
|
||||||
|
|
||||||
return newObj
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._newSplit() {{{1
|
|
||||||
function! s:Opener._newSplit()
|
|
||||||
" Save the user's settings for splitbelow and splitright
|
|
||||||
let savesplitbelow=&splitbelow
|
|
||||||
let savesplitright=&splitright
|
|
||||||
|
|
||||||
" 'there' will be set to a command to move from the split window
|
|
||||||
" back to the explorer window
|
|
||||||
"
|
|
||||||
" 'back' will be set to a command to move from the explorer window
|
|
||||||
" back to the newly split window
|
|
||||||
"
|
|
||||||
" 'right' and 'below' will be set to the settings needed for
|
|
||||||
" splitbelow and splitright IF the explorer is the only window.
|
|
||||||
"
|
|
||||||
let there= g:NERDTreeWinPos ==# "left" ? "wincmd h" : "wincmd l"
|
|
||||||
let back = g:NERDTreeWinPos ==# "left" ? "wincmd l" : "wincmd h"
|
|
||||||
let right= g:NERDTreeWinPos ==# "left"
|
|
||||||
let below=0
|
|
||||||
|
|
||||||
" Attempt to go to adjacent window
|
|
||||||
call nerdtree#exec(back)
|
|
||||||
|
|
||||||
let onlyOneWin = (winnr("$") ==# 1)
|
|
||||||
|
|
||||||
" If no adjacent window, set splitright and splitbelow appropriately
|
|
||||||
if onlyOneWin
|
|
||||||
let &splitright=right
|
|
||||||
let &splitbelow=below
|
|
||||||
else
|
|
||||||
" found adjacent window - invert split direction
|
|
||||||
let &splitright=!right
|
|
||||||
let &splitbelow=!below
|
|
||||||
endif
|
|
||||||
|
|
||||||
let splitMode = onlyOneWin ? "vertical" : ""
|
|
||||||
|
|
||||||
" Open the new window
|
|
||||||
try
|
|
||||||
exec(splitMode." sp ")
|
|
||||||
catch /^Vim\%((\a\+)\)\=:E37/
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified."
|
|
||||||
catch /^Vim\%((\a\+)\)\=:/
|
|
||||||
"do nothing
|
|
||||||
endtry
|
|
||||||
|
|
||||||
"resize the tree window if no other window was open before
|
|
||||||
if onlyOneWin
|
|
||||||
let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize
|
|
||||||
call nerdtree#exec(there)
|
|
||||||
exec("silent ". splitMode ." resize ". size)
|
|
||||||
call nerdtree#exec('wincmd p')
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Restore splitmode settings
|
|
||||||
let &splitbelow=savesplitbelow
|
|
||||||
let &splitright=savesplitright
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._newVSplit() {{{1
|
|
||||||
function! s:Opener._newVSplit()
|
|
||||||
let winwidth = winwidth(".")
|
|
||||||
if winnr("$")==#1
|
|
||||||
let winwidth = g:NERDTreeWinSize
|
|
||||||
endif
|
|
||||||
|
|
||||||
call nerdtree#exec("wincmd p")
|
|
||||||
vnew
|
|
||||||
|
|
||||||
"resize the nerd tree back to the original size
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
exec("silent vertical resize ". winwidth)
|
|
||||||
call nerdtree#exec('wincmd p')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener.open(target) {{{1
|
|
||||||
function! s:Opener.open(target)
|
|
||||||
if self._path.isDirectory
|
|
||||||
call self._openDirectory(a:target)
|
|
||||||
else
|
|
||||||
call self._openFile()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._openFile() {{{1
|
|
||||||
function! s:Opener._openFile()
|
|
||||||
if self._reuseWindow()
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self._gotoTargetWin()
|
|
||||||
call self._path.edit()
|
|
||||||
if self._stay
|
|
||||||
call self._restoreCursorPos()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._openDirectory(node) {{{1
|
|
||||||
function! s:Opener._openDirectory(node)
|
|
||||||
if self._nerdtree.isWinTree()
|
|
||||||
call self._gotoTargetWin()
|
|
||||||
call g:NERDTreeCreator.CreateWindow(a:node.path.str())
|
|
||||||
else
|
|
||||||
call self._gotoTargetWin()
|
|
||||||
if empty(self._where)
|
|
||||||
call b:NERDTree.changeRoot(a:node)
|
|
||||||
elseif self._where == 't'
|
|
||||||
call g:NERDTreeCreator.CreateTabTree(a:node.path.str())
|
|
||||||
else
|
|
||||||
call g:NERDTreeCreator.CreateWindowTree(a:node.path.str())
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self._stay
|
|
||||||
call self._restoreCursorPos()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._previousWindow() {{{1
|
|
||||||
function! s:Opener._previousWindow()
|
|
||||||
if !self._isWindowUsable(winnr("#")) && self._firstUsableWindow() ==# -1
|
|
||||||
call self._newSplit()
|
|
||||||
else
|
|
||||||
try
|
|
||||||
if !self._isWindowUsable(winnr("#"))
|
|
||||||
call nerdtree#exec(self._firstUsableWindow() . "wincmd w")
|
|
||||||
else
|
|
||||||
call nerdtree#exec('wincmd p')
|
|
||||||
endif
|
|
||||||
catch /^Vim\%((\a\+)\)\=:E37/
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
throw "NERDTree.FileAlreadyOpenAndModifiedError: ". self._path.str() ." is already open and modified."
|
|
||||||
catch /^Vim\%((\a\+)\)\=:/
|
|
||||||
echo v:exception
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._restoreCursorPos(){{{1
|
|
||||||
function! s:Opener._restoreCursorPos()
|
|
||||||
call nerdtree#exec('normal ' . self._tabnr . 'gt')
|
|
||||||
call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._reuseWindow(){{{1
|
|
||||||
"put the cursor in the first window we find for this file
|
|
||||||
"
|
|
||||||
"return 1 if we were successful
|
|
||||||
function! s:Opener._reuseWindow()
|
|
||||||
if empty(self._reuse)
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
"check the current tab for the window
|
|
||||||
let winnr = bufwinnr('^' . self._path.str() . '$')
|
|
||||||
if winnr != -1
|
|
||||||
call nerdtree#exec(winnr . "wincmd w")
|
|
||||||
call self._checkToCloseTree(0)
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self._reuse == 'currenttab'
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
"check other tabs
|
|
||||||
let tabnr = self._path.tabnr()
|
|
||||||
if tabnr
|
|
||||||
call self._checkToCloseTree(1)
|
|
||||||
call nerdtree#exec('normal! ' . tabnr . 'gt')
|
|
||||||
let winnr = bufwinnr('^' . self._path.str() . '$')
|
|
||||||
call nerdtree#exec(winnr . "wincmd w")
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Opener._saveCursorPos(){{{1
|
|
||||||
function! s:Opener._saveCursorPos()
|
|
||||||
let self._bufnr = bufnr("")
|
|
||||||
let self._tabnr = tabpagenr()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,795 +0,0 @@
|
||||||
"we need to use this number many times for sorting... so we calculate it only
|
|
||||||
"once here
|
|
||||||
let s:NERDTreeSortStarIndex = index(g:NERDTreeSortOrder, '*')
|
|
||||||
" used in formating sortKey, e.g. '%04d'
|
|
||||||
if exists("log10")
|
|
||||||
let s:sortKeyFormat = "%0" . float2nr(ceil(log10(len(g:NERDTreeSortOrder)))) . "d"
|
|
||||||
else
|
|
||||||
let s:sortKeyFormat = "%04d"
|
|
||||||
endif
|
|
||||||
|
|
||||||
"CLASS: Path
|
|
||||||
"============================================================
|
|
||||||
let s:Path = {}
|
|
||||||
let g:NERDTreePath = s:Path
|
|
||||||
|
|
||||||
"FUNCTION: Path.AbsolutePathFor(str) {{{1
|
|
||||||
function! s:Path.AbsolutePathFor(str)
|
|
||||||
let prependCWD = 0
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
let prependCWD = a:str !~# '^.:\(\\\|\/\)' && a:str !~# '^\(\\\\\|\/\/\)'
|
|
||||||
else
|
|
||||||
let prependCWD = a:str !~# '^/'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let toReturn = a:str
|
|
||||||
if prependCWD
|
|
||||||
let toReturn = getcwd() . s:Path.Slash() . a:str
|
|
||||||
endif
|
|
||||||
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.bookmarkNames() {{{1
|
|
||||||
function! s:Path.bookmarkNames()
|
|
||||||
if !exists("self._bookmarkNames")
|
|
||||||
call self.cacheDisplayString()
|
|
||||||
endif
|
|
||||||
return self._bookmarkNames
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.cacheDisplayString() {{{1
|
|
||||||
function! s:Path.cacheDisplayString() abort
|
|
||||||
let self.cachedDisplayString = self.getLastPathComponent(1)
|
|
||||||
|
|
||||||
if self.isExecutable
|
|
||||||
let self.cachedDisplayString = self.cachedDisplayString . '*'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let self._bookmarkNames = []
|
|
||||||
for i in g:NERDTreeBookmark.Bookmarks()
|
|
||||||
if i.path.equals(self)
|
|
||||||
call add(self._bookmarkNames, i.name)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
if !empty(self._bookmarkNames)
|
|
||||||
let self.cachedDisplayString .= ' {' . join(self._bookmarkNames) . '}'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self.isSymLink
|
|
||||||
let self.cachedDisplayString .= ' -> ' . self.symLinkDest
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self.isReadOnly
|
|
||||||
let self.cachedDisplayString .= ' [RO]'
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.changeToDir() {{{1
|
|
||||||
function! s:Path.changeToDir()
|
|
||||||
let dir = self.str({'format': 'Cd'})
|
|
||||||
if self.isDirectory ==# 0
|
|
||||||
let dir = self.getParent().str({'format': 'Cd'})
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
|
||||||
execute "cd " . dir
|
|
||||||
call nerdtree#echo("CWD is now: " . getcwd())
|
|
||||||
catch
|
|
||||||
throw "NERDTree.PathChangeError: cannot change CWD to " . dir
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.compareTo() {{{1
|
|
||||||
"
|
|
||||||
"Compares this Path to the given path and returns 0 if they are equal, -1 if
|
|
||||||
"this Path is "less than" the given path, or 1 if it is "greater".
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: the path object to compare this to
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"1, -1 or 0
|
|
||||||
function! s:Path.compareTo(path)
|
|
||||||
let thisPath = self.getLastPathComponent(1)
|
|
||||||
let thatPath = a:path.getLastPathComponent(1)
|
|
||||||
|
|
||||||
"if the paths are the same then clearly we return 0
|
|
||||||
if thisPath ==# thatPath
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let thisSS = self.getSortOrderIndex()
|
|
||||||
let thatSS = a:path.getSortOrderIndex()
|
|
||||||
|
|
||||||
"compare the sort sequences, if they are different then the return
|
|
||||||
"value is easy
|
|
||||||
if thisSS < thatSS
|
|
||||||
return -1
|
|
||||||
elseif thisSS > thatSS
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
if !g:NERDTreeSortHiddenFirst
|
|
||||||
let thisPath = substitute(thisPath, '^[._]', '', '')
|
|
||||||
let thatPath = substitute(thatPath, '^[._]', '', '')
|
|
||||||
endif
|
|
||||||
"if the sort sequences are the same then compare the paths
|
|
||||||
"alphabetically
|
|
||||||
let pathCompare = g:NERDTreeCaseSensitiveSort ? thisPath <# thatPath : thisPath <? thatPath
|
|
||||||
if pathCompare
|
|
||||||
return -1
|
|
||||||
else
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.Create(fullpath) {{{1
|
|
||||||
"
|
|
||||||
"Factory method.
|
|
||||||
"
|
|
||||||
"Creates a path object with the given path. The path is also created on the
|
|
||||||
"filesystem. If the path already exists, a NERDTree.Path.Exists exception is
|
|
||||||
"thrown. If any other errors occur, a NERDTree.Path exception is thrown.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"fullpath: the full filesystem path to the file/dir to create
|
|
||||||
function! s:Path.Create(fullpath)
|
|
||||||
"bail if the a:fullpath already exists
|
|
||||||
if isdirectory(a:fullpath) || filereadable(a:fullpath)
|
|
||||||
throw "NERDTree.CreatePathError: Directory Exists: '" . a:fullpath . "'"
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
|
||||||
|
|
||||||
"if it ends with a slash, assume its a dir create it
|
|
||||||
if a:fullpath =~# '\(\\\|\/\)$'
|
|
||||||
"whack the trailing slash off the end if it exists
|
|
||||||
let fullpath = substitute(a:fullpath, '\(\\\|\/\)$', '', '')
|
|
||||||
|
|
||||||
call mkdir(fullpath, 'p')
|
|
||||||
|
|
||||||
"assume its a file and create
|
|
||||||
else
|
|
||||||
call s:Path.createParentDirectories(a:fullpath)
|
|
||||||
call writefile([], a:fullpath)
|
|
||||||
endif
|
|
||||||
catch
|
|
||||||
throw "NERDTree.CreatePathError: Could not create path: '" . a:fullpath . "'"
|
|
||||||
endtry
|
|
||||||
|
|
||||||
return s:Path.New(a:fullpath)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.copy(dest) {{{1
|
|
||||||
"
|
|
||||||
"Copies the file/dir represented by this Path to the given location
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"dest: the location to copy this dir/file to
|
|
||||||
function! s:Path.copy(dest)
|
|
||||||
if !s:Path.CopyingSupported()
|
|
||||||
throw "NERDTree.CopyingNotSupportedError: Copying is not supported on this OS"
|
|
||||||
endif
|
|
||||||
|
|
||||||
call s:Path.createParentDirectories(a:dest)
|
|
||||||
|
|
||||||
let dest = s:Path.WinToUnixPath(a:dest)
|
|
||||||
|
|
||||||
let cmd = g:NERDTreeCopyCmd . " " . escape(self.str(), self._escChars()) . " " . escape(dest, self._escChars())
|
|
||||||
let success = system(cmd)
|
|
||||||
if success != 0
|
|
||||||
throw "NERDTree.CopyError: Could not copy ''". self.str() ."'' to: '" . a:dest . "'"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.CopyingSupported() {{{1
|
|
||||||
"
|
|
||||||
"returns 1 if copying is supported for this OS
|
|
||||||
function! s:Path.CopyingSupported()
|
|
||||||
return exists('g:NERDTreeCopyCmd')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.copyingWillOverwrite(dest) {{{1
|
|
||||||
"
|
|
||||||
"returns 1 if copy this path to the given location will cause files to
|
|
||||||
"overwritten
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"dest: the location this path will be copied to
|
|
||||||
function! s:Path.copyingWillOverwrite(dest)
|
|
||||||
if filereadable(a:dest)
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if isdirectory(a:dest)
|
|
||||||
let path = s:Path.JoinPathStrings(a:dest, self.getLastPathComponent(0))
|
|
||||||
if filereadable(path)
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.createParentDirectories(path) {{{1
|
|
||||||
"
|
|
||||||
"create parent directories for this path if needed
|
|
||||||
"without throwing any errors is those directories already exist
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: full path of the node whose parent directories may need to be created
|
|
||||||
function! s:Path.createParentDirectories(path)
|
|
||||||
let dir_path = fnamemodify(a:path, ':h')
|
|
||||||
if !isdirectory(dir_path)
|
|
||||||
call mkdir(dir_path, 'p')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.delete() {{{1
|
|
||||||
"
|
|
||||||
"Deletes the file represented by this path.
|
|
||||||
"Deletion of directories is not supported
|
|
||||||
"
|
|
||||||
"Throws NERDTree.Path.Deletion exceptions
|
|
||||||
function! s:Path.delete()
|
|
||||||
if self.isDirectory
|
|
||||||
|
|
||||||
let cmd = g:NERDTreeRemoveDirCmd . self.str({'escape': 1})
|
|
||||||
let success = system(cmd)
|
|
||||||
|
|
||||||
if v:shell_error != 0
|
|
||||||
throw "NERDTree.PathDeletionError: Could not delete directory: '" . self.str() . "'"
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let success = delete(self.str())
|
|
||||||
if success != 0
|
|
||||||
throw "NERDTree.PathDeletionError: Could not delete file: '" . self.str() . "'"
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
"delete all bookmarks for this path
|
|
||||||
for i in self.bookmarkNames()
|
|
||||||
let bookmark = g:NERDTreeBookmark.BookmarkFor(i)
|
|
||||||
call bookmark.delete()
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.displayString() {{{1
|
|
||||||
"
|
|
||||||
"Returns a string that specifies how the path should be represented as a
|
|
||||||
"string
|
|
||||||
function! s:Path.displayString()
|
|
||||||
if self.cachedDisplayString ==# ""
|
|
||||||
call self.cacheDisplayString()
|
|
||||||
endif
|
|
||||||
|
|
||||||
return self.cachedDisplayString
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.edit() {{{1
|
|
||||||
function! s:Path.edit()
|
|
||||||
exec "edit " . self.str({'format': 'Edit'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.extractDriveLetter(fullpath) {{{1
|
|
||||||
"
|
|
||||||
"If running windows, cache the drive letter for this path
|
|
||||||
function! s:Path.extractDriveLetter(fullpath)
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
if a:fullpath =~ '^\(\\\\\|\/\/\)'
|
|
||||||
"For network shares, the 'drive' consists of the first two parts of the path, i.e. \\boxname\share
|
|
||||||
let self.drive = substitute(a:fullpath, '^\(\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\).*', '\1', '')
|
|
||||||
let self.drive = substitute(self.drive, '/', '\', "g")
|
|
||||||
else
|
|
||||||
let self.drive = substitute(a:fullpath, '\(^[a-zA-Z]:\).*', '\1', '')
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let self.drive = ''
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.exists() {{{1
|
|
||||||
"return 1 if this path points to a location that is readable or is a directory
|
|
||||||
function! s:Path.exists()
|
|
||||||
let p = self.str()
|
|
||||||
return filereadable(p) || isdirectory(p)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._escChars() {{{1
|
|
||||||
function! s:Path._escChars()
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
return " `\|\"#%&,?()\*^<>"
|
|
||||||
endif
|
|
||||||
|
|
||||||
return " \\`\|\"#%&,?()\*^<>[]"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.getDir() {{{1
|
|
||||||
"
|
|
||||||
"Returns this path if it is a directory, else this paths parent.
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"a Path object
|
|
||||||
function! s:Path.getDir()
|
|
||||||
if self.isDirectory
|
|
||||||
return self
|
|
||||||
else
|
|
||||||
return self.getParent()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.getParent() {{{1
|
|
||||||
"
|
|
||||||
"Returns a new path object for this paths parent
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"a new Path object
|
|
||||||
function! s:Path.getParent()
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
let path = self.drive . '\' . join(self.pathSegments[0:-2], '\')
|
|
||||||
else
|
|
||||||
let path = '/'. join(self.pathSegments[0:-2], '/')
|
|
||||||
endif
|
|
||||||
|
|
||||||
return s:Path.New(path)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.getLastPathComponent(dirSlash) {{{1
|
|
||||||
"
|
|
||||||
"Gets the last part of this path.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"dirSlash: if 1 then a trailing slash will be added to the returned value for
|
|
||||||
"directory nodes.
|
|
||||||
function! s:Path.getLastPathComponent(dirSlash)
|
|
||||||
if empty(self.pathSegments)
|
|
||||||
return ''
|
|
||||||
endif
|
|
||||||
let toReturn = self.pathSegments[-1]
|
|
||||||
if a:dirSlash && self.isDirectory
|
|
||||||
let toReturn = toReturn . '/'
|
|
||||||
endif
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.getSortOrderIndex() {{{1
|
|
||||||
"returns the index of the pattern in g:NERDTreeSortOrder that this path matches
|
|
||||||
function! s:Path.getSortOrderIndex()
|
|
||||||
let i = 0
|
|
||||||
while i < len(g:NERDTreeSortOrder)
|
|
||||||
if self.getLastPathComponent(1) =~# g:NERDTreeSortOrder[i]
|
|
||||||
return i
|
|
||||||
endif
|
|
||||||
let i = i + 1
|
|
||||||
endwhile
|
|
||||||
return s:NERDTreeSortStarIndex
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.getSortKey() {{{1
|
|
||||||
"returns a string used in compare function for sorting
|
|
||||||
function! s:Path.getSortKey()
|
|
||||||
if !exists("self._sortKey")
|
|
||||||
let path = self.getLastPathComponent(1)
|
|
||||||
if !g:NERDTreeSortHiddenFirst
|
|
||||||
let path = substitute(path, '^[._]', '', '')
|
|
||||||
endif
|
|
||||||
if !g:NERDTreeCaseSensitiveSort
|
|
||||||
let path = tolower(path)
|
|
||||||
endif
|
|
||||||
let self._sortKey = printf(s:sortKeyFormat, self.getSortOrderIndex()) . path
|
|
||||||
endif
|
|
||||||
|
|
||||||
return self._sortKey
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
"FUNCTION: Path.isUnixHiddenFile() {{{1
|
|
||||||
"check for unix hidden files
|
|
||||||
function! s:Path.isUnixHiddenFile()
|
|
||||||
return self.getLastPathComponent(0) =~# '^\.'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.isUnixHiddenPath() {{{1
|
|
||||||
"check for unix path with hidden components
|
|
||||||
function! s:Path.isUnixHiddenPath()
|
|
||||||
if self.getLastPathComponent(0) =~# '^\.'
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
for segment in self.pathSegments
|
|
||||||
if segment =~# '^\.'
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.ignore(nerdtree) {{{1
|
|
||||||
"returns true if this path should be ignored
|
|
||||||
function! s:Path.ignore(nerdtree)
|
|
||||||
"filter out the user specified paths to ignore
|
|
||||||
if a:nerdtree.ui.isIgnoreFilterEnabled()
|
|
||||||
for i in g:NERDTreeIgnore
|
|
||||||
if self._ignorePatternMatches(i)
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for callback in g:NERDTree.PathFilters()
|
|
||||||
if {callback}({'path': self, 'nerdtree': a:nerdtree})
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
|
|
||||||
"dont show hidden files unless instructed to
|
|
||||||
if !a:nerdtree.ui.getShowHidden() && self.isUnixHiddenFile()
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:nerdtree.ui.getShowFiles() ==# 0 && self.isDirectory ==# 0
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._ignorePatternMatches(pattern) {{{1
|
|
||||||
"returns true if this path matches the given ignore pattern
|
|
||||||
function! s:Path._ignorePatternMatches(pattern)
|
|
||||||
let pat = a:pattern
|
|
||||||
if strpart(pat,len(pat)-7) == '[[dir]]'
|
|
||||||
if !self.isDirectory
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
let pat = strpart(pat,0, len(pat)-7)
|
|
||||||
elseif strpart(pat,len(pat)-8) == '[[file]]'
|
|
||||||
if self.isDirectory
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
let pat = strpart(pat,0, len(pat)-8)
|
|
||||||
endif
|
|
||||||
|
|
||||||
return self.getLastPathComponent(0) =~# pat
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.isAncestor(path) {{{1
|
|
||||||
"return 1 if this path is somewhere above the given path in the filesystem.
|
|
||||||
"
|
|
||||||
"a:path should be a dir
|
|
||||||
function! s:Path.isAncestor(path)
|
|
||||||
if !self.isDirectory
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let this = self.str()
|
|
||||||
let that = a:path.str()
|
|
||||||
return stridx(that, this) == 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.isUnder(path) {{{1
|
|
||||||
"return 1 if this path is somewhere under the given path in the filesystem.
|
|
||||||
function! s:Path.isUnder(path)
|
|
||||||
if a:path.isDirectory == 0
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
let this = self.str()
|
|
||||||
let that = a:path.str()
|
|
||||||
return stridx(this, that . s:Path.Slash()) == 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.JoinPathStrings(...) {{{1
|
|
||||||
function! s:Path.JoinPathStrings(...)
|
|
||||||
let components = []
|
|
||||||
for i in a:000
|
|
||||||
let components = extend(components, split(i, '/'))
|
|
||||||
endfor
|
|
||||||
return '/' . join(components, '/')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.equals() {{{1
|
|
||||||
"
|
|
||||||
"Determines whether 2 path objects are "equal".
|
|
||||||
"They are equal if the paths they represent are the same
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: the other path obj to compare this with
|
|
||||||
function! s:Path.equals(path)
|
|
||||||
return self.str() ==# a:path.str()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.New() {{{1
|
|
||||||
"The Constructor for the Path object
|
|
||||||
function! s:Path.New(path)
|
|
||||||
let newPath = copy(self)
|
|
||||||
|
|
||||||
call newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:path))
|
|
||||||
|
|
||||||
let newPath.cachedDisplayString = ""
|
|
||||||
let newPath.flagSet = g:NERDTreeFlagSet.New()
|
|
||||||
|
|
||||||
return newPath
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.Slash() {{{1
|
|
||||||
"return the slash to use for the current OS
|
|
||||||
function! s:Path.Slash()
|
|
||||||
return nerdtree#runningWindows() ? '\' : '/'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.Resolve() {{{1
|
|
||||||
"Invoke the vim resolve() function and return the result
|
|
||||||
"This is necessary because in some versions of vim resolve() removes trailing
|
|
||||||
"slashes while in other versions it doesn't. This always removes the trailing
|
|
||||||
"slash
|
|
||||||
function! s:Path.Resolve(path)
|
|
||||||
let tmp = resolve(a:path)
|
|
||||||
return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.readInfoFromDisk(fullpath) {{{1
|
|
||||||
"
|
|
||||||
"
|
|
||||||
"Throws NERDTree.Path.InvalidArguments exception.
|
|
||||||
function! s:Path.readInfoFromDisk(fullpath)
|
|
||||||
call self.extractDriveLetter(a:fullpath)
|
|
||||||
|
|
||||||
let fullpath = s:Path.WinToUnixPath(a:fullpath)
|
|
||||||
|
|
||||||
if getftype(fullpath) ==# "fifo"
|
|
||||||
throw "NERDTree.InvalidFiletypeError: Cant handle FIFO files: " . a:fullpath
|
|
||||||
endif
|
|
||||||
|
|
||||||
let self.pathSegments = split(fullpath, '/')
|
|
||||||
|
|
||||||
let self.isReadOnly = 0
|
|
||||||
if isdirectory(a:fullpath)
|
|
||||||
let self.isDirectory = 1
|
|
||||||
elseif filereadable(a:fullpath)
|
|
||||||
let self.isDirectory = 0
|
|
||||||
let self.isReadOnly = filewritable(a:fullpath) ==# 0
|
|
||||||
else
|
|
||||||
throw "NERDTree.InvalidArgumentsError: Invalid path = " . a:fullpath
|
|
||||||
endif
|
|
||||||
|
|
||||||
let self.isExecutable = 0
|
|
||||||
if !self.isDirectory
|
|
||||||
let self.isExecutable = getfperm(a:fullpath) =~# 'x'
|
|
||||||
endif
|
|
||||||
|
|
||||||
"grab the last part of the path (minus the trailing slash)
|
|
||||||
let lastPathComponent = self.getLastPathComponent(0)
|
|
||||||
|
|
||||||
"get the path to the new node with the parent dir fully resolved
|
|
||||||
let hardPath = s:Path.Resolve(self.strTrunk()) . '/' . lastPathComponent
|
|
||||||
|
|
||||||
"if the last part of the path is a symlink then flag it as such
|
|
||||||
let self.isSymLink = (s:Path.Resolve(hardPath) != hardPath)
|
|
||||||
if self.isSymLink
|
|
||||||
let self.symLinkDest = s:Path.Resolve(fullpath)
|
|
||||||
|
|
||||||
"if the link is a dir then slap a / on the end of its dest
|
|
||||||
if isdirectory(self.symLinkDest)
|
|
||||||
|
|
||||||
"we always wanna treat MS windows shortcuts as files for
|
|
||||||
"simplicity
|
|
||||||
if hardPath !~# '\.lnk$'
|
|
||||||
|
|
||||||
let self.symLinkDest = self.symLinkDest . '/'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.refresh(nerdtree) {{{1
|
|
||||||
function! s:Path.refresh(nerdtree)
|
|
||||||
call self.readInfoFromDisk(self.str())
|
|
||||||
call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {})
|
|
||||||
call self.cacheDisplayString()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.refreshFlags(nerdtree) {{{1
|
|
||||||
function! s:Path.refreshFlags(nerdtree)
|
|
||||||
call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {})
|
|
||||||
call self.cacheDisplayString()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.rename() {{{1
|
|
||||||
"
|
|
||||||
"Renames this node on the filesystem
|
|
||||||
function! s:Path.rename(newPath)
|
|
||||||
if a:newPath ==# ''
|
|
||||||
throw "NERDTree.InvalidArgumentsError: Invalid newPath for renaming = ". a:newPath
|
|
||||||
endif
|
|
||||||
|
|
||||||
let success = rename(self.str(), a:newPath)
|
|
||||||
if success != 0
|
|
||||||
throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath
|
|
||||||
endif
|
|
||||||
call self.readInfoFromDisk(a:newPath)
|
|
||||||
|
|
||||||
for i in self.bookmarkNames()
|
|
||||||
let b = g:NERDTreeBookmark.BookmarkFor(i)
|
|
||||||
call b.setPath(copy(self))
|
|
||||||
endfor
|
|
||||||
call g:NERDTreeBookmark.Write()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.str() {{{1
|
|
||||||
"
|
|
||||||
"Returns a string representation of this Path
|
|
||||||
"
|
|
||||||
"Takes an optional dictionary param to specify how the output should be
|
|
||||||
"formatted.
|
|
||||||
"
|
|
||||||
"The dict may have the following keys:
|
|
||||||
" 'format'
|
|
||||||
" 'escape'
|
|
||||||
" 'truncateTo'
|
|
||||||
"
|
|
||||||
"The 'format' key may have a value of:
|
|
||||||
" 'Cd' - a string to be used with the :cd command
|
|
||||||
" 'Edit' - a string to be used with :e :sp :new :tabedit etc
|
|
||||||
" 'UI' - a string used in the NERD tree UI
|
|
||||||
"
|
|
||||||
"The 'escape' key, if specified will cause the output to be escaped with
|
|
||||||
"shellescape()
|
|
||||||
"
|
|
||||||
"The 'truncateTo' key causes the resulting string to be truncated to the value
|
|
||||||
"'truncateTo' maps to. A '<' char will be prepended.
|
|
||||||
function! s:Path.str(...)
|
|
||||||
let options = a:0 ? a:1 : {}
|
|
||||||
let toReturn = ""
|
|
||||||
|
|
||||||
if has_key(options, 'format')
|
|
||||||
let format = options['format']
|
|
||||||
if has_key(self, '_strFor' . format)
|
|
||||||
exec 'let toReturn = self._strFor' . format . '()'
|
|
||||||
else
|
|
||||||
throw 'NERDTree.UnknownFormatError: unknown format "'. format .'"'
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let toReturn = self._str()
|
|
||||||
endif
|
|
||||||
|
|
||||||
if nerdtree#has_opt(options, 'escape')
|
|
||||||
let toReturn = shellescape(toReturn)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has_key(options, 'truncateTo')
|
|
||||||
let limit = options['truncateTo']
|
|
||||||
if len(toReturn) > limit-1
|
|
||||||
let toReturn = toReturn[(len(toReturn)-limit+1):]
|
|
||||||
if len(split(toReturn, '/')) > 1
|
|
||||||
let toReturn = '</' . join(split(toReturn, '/')[1:], '/') . '/'
|
|
||||||
else
|
|
||||||
let toReturn = '<' . toReturn
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._strForUI() {{{1
|
|
||||||
function! s:Path._strForUI()
|
|
||||||
let toReturn = '/' . join(self.pathSegments, '/')
|
|
||||||
if self.isDirectory && toReturn != '/'
|
|
||||||
let toReturn = toReturn . '/'
|
|
||||||
endif
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._strForCd() {{{1
|
|
||||||
"
|
|
||||||
" returns a string that can be used with :cd
|
|
||||||
function! s:Path._strForCd()
|
|
||||||
return escape(self.str(), self._escChars())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._strForEdit() {{{1
|
|
||||||
"
|
|
||||||
"Return: the string for this path that is suitable to be used with the :edit
|
|
||||||
"command
|
|
||||||
function! s:Path._strForEdit()
|
|
||||||
let p = escape(self.str(), self._escChars())
|
|
||||||
|
|
||||||
"make it relative
|
|
||||||
let p = fnamemodify(p, ':.')
|
|
||||||
|
|
||||||
"handle the edge case where the file begins with a + (vim interprets
|
|
||||||
"the +foo in `:e +foo` as an option to :edit)
|
|
||||||
if p[0] == "+"
|
|
||||||
let p = '\' . p
|
|
||||||
endif
|
|
||||||
|
|
||||||
if p ==# ''
|
|
||||||
let p = '.'
|
|
||||||
endif
|
|
||||||
|
|
||||||
return p
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._strForGlob() {{{1
|
|
||||||
function! s:Path._strForGlob()
|
|
||||||
let lead = s:Path.Slash()
|
|
||||||
|
|
||||||
"if we are running windows then slap a drive letter on the front
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
let lead = self.drive . '\'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let toReturn = lead . join(self.pathSegments, s:Path.Slash())
|
|
||||||
|
|
||||||
if !nerdtree#runningWindows()
|
|
||||||
let toReturn = escape(toReturn, self._escChars())
|
|
||||||
endif
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path._str() {{{1
|
|
||||||
"
|
|
||||||
"Gets the string path for this path object that is appropriate for the OS.
|
|
||||||
"EG, in windows c:\foo\bar
|
|
||||||
" in *nix /foo/bar
|
|
||||||
function! s:Path._str()
|
|
||||||
let lead = s:Path.Slash()
|
|
||||||
|
|
||||||
"if we are running windows then slap a drive letter on the front
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
let lead = self.drive . '\'
|
|
||||||
endif
|
|
||||||
|
|
||||||
return lead . join(self.pathSegments, s:Path.Slash())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.strTrunk() {{{1
|
|
||||||
"Gets the path without the last segment on the end.
|
|
||||||
function! s:Path.strTrunk()
|
|
||||||
return self.drive . '/' . join(self.pathSegments[0:-2], '/')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: Path.tabnr() {{{1
|
|
||||||
" return the number of the first tab that is displaying this file
|
|
||||||
"
|
|
||||||
" return 0 if no tab was found
|
|
||||||
function! s:Path.tabnr()
|
|
||||||
let str = self.str()
|
|
||||||
for t in range(tabpagenr('$'))
|
|
||||||
for b in tabpagebuflist(t+1)
|
|
||||||
if str == expand('#' . b . ':p')
|
|
||||||
return t+1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfor
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: Path.WinToUnixPath(pathstr){{{1
|
|
||||||
"Takes in a windows path and returns the unix equiv
|
|
||||||
"
|
|
||||||
"A class level method
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"pathstr: the windows path to convert
|
|
||||||
function! s:Path.WinToUnixPath(pathstr)
|
|
||||||
if !nerdtree#runningWindows()
|
|
||||||
return a:pathstr
|
|
||||||
endif
|
|
||||||
|
|
||||||
let toReturn = a:pathstr
|
|
||||||
|
|
||||||
"remove the x:\ of the front
|
|
||||||
let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', "")
|
|
||||||
|
|
||||||
"remove the \\ network share from the front
|
|
||||||
let toReturn = substitute(toReturn, '^\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\(\\\|\/\)\?', '/', "")
|
|
||||||
|
|
||||||
"convert all \ chars to /
|
|
||||||
let toReturn = substitute(toReturn, '\', '/', "g")
|
|
||||||
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,608 +0,0 @@
|
||||||
"CLASS: TreeDirNode
|
|
||||||
"A subclass of NERDTreeFileNode.
|
|
||||||
"
|
|
||||||
"The 'composite' part of the file/dir composite.
|
|
||||||
"============================================================
|
|
||||||
let s:TreeDirNode = copy(g:NERDTreeFileNode)
|
|
||||||
let g:NERDTreeDirNode = s:TreeDirNode
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{1
|
|
||||||
"class method that returns the highest cached ancestor of the current root
|
|
||||||
function! s:TreeDirNode.AbsoluteTreeRoot()
|
|
||||||
let currentNode = b:NERDTree.root
|
|
||||||
while currentNode.parent != {}
|
|
||||||
let currentNode = currentNode.parent
|
|
||||||
endwhile
|
|
||||||
return currentNode
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.activate([options]) {{{1
|
|
||||||
unlet s:TreeDirNode.activate
|
|
||||||
function! s:TreeDirNode.activate(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
call self.toggleOpen(opts)
|
|
||||||
call self.getNerdtree().render()
|
|
||||||
call self.putCursorHere(0, 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1
|
|
||||||
"Adds the given treenode to the list of children for this node
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"-treenode: the node to add
|
|
||||||
"-inOrder: 1 if the new node should be inserted in sorted order
|
|
||||||
function! s:TreeDirNode.addChild(treenode, inOrder)
|
|
||||||
call add(self.children, a:treenode)
|
|
||||||
let a:treenode.parent = self
|
|
||||||
|
|
||||||
if a:inOrder
|
|
||||||
call self.sortChildren()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.close() {{{1
|
|
||||||
"Closes this directory
|
|
||||||
function! s:TreeDirNode.close()
|
|
||||||
let self.isOpen = 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.closeChildren() {{{1
|
|
||||||
"Closes all the child dir nodes of this node
|
|
||||||
function! s:TreeDirNode.closeChildren()
|
|
||||||
for i in self.children
|
|
||||||
if i.path.isDirectory
|
|
||||||
call i.close()
|
|
||||||
call i.closeChildren()
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.createChild(path, inOrder) {{{1
|
|
||||||
"Instantiates a new child node for this node with the given path. The new
|
|
||||||
"nodes parent is set to this node.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: a Path object that this node will represent/contain
|
|
||||||
"inOrder: 1 if the new node should be inserted in sorted order
|
|
||||||
"
|
|
||||||
"Returns:
|
|
||||||
"the newly created node
|
|
||||||
function! s:TreeDirNode.createChild(path, inOrder)
|
|
||||||
let newTreeNode = g:NERDTreeFileNode.New(a:path, self.getNerdtree())
|
|
||||||
call self.addChild(newTreeNode, a:inOrder)
|
|
||||||
return newTreeNode
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.displayString() {{{1
|
|
||||||
unlet s:TreeDirNode.displayString
|
|
||||||
function! s:TreeDirNode.displayString()
|
|
||||||
let cascade = self.getCascade()
|
|
||||||
let rv = ""
|
|
||||||
for node in cascade
|
|
||||||
let rv = rv . node.path.displayString()
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let sym = cascade[-1].isOpen ? g:NERDTreeDirArrowCollapsible : g:NERDTreeDirArrowExpandable
|
|
||||||
|
|
||||||
let flags = cascade[-1].path.flagSet.renderToString()
|
|
||||||
|
|
||||||
return sym . ' ' . flags . rv
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.findNode(path) {{{1
|
|
||||||
"Will find one of the children (recursively) that has the given path
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: a path object
|
|
||||||
unlet s:TreeDirNode.findNode
|
|
||||||
function! s:TreeDirNode.findNode(path)
|
|
||||||
if a:path.equals(self.path)
|
|
||||||
return self
|
|
||||||
endif
|
|
||||||
if stridx(a:path.str(), self.path.str(), 0) ==# -1
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self.path.isDirectory
|
|
||||||
for i in self.children
|
|
||||||
let retVal = i.findNode(a:path)
|
|
||||||
if retVal != {}
|
|
||||||
return retVal
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getCascade() {{{1
|
|
||||||
"Return an array of dir nodes (starting from self) that can be cascade opened.
|
|
||||||
function! s:TreeDirNode.getCascade()
|
|
||||||
|
|
||||||
let rv = [self]
|
|
||||||
let node = self
|
|
||||||
|
|
||||||
while 1
|
|
||||||
let vc = node.getVisibleChildren()
|
|
||||||
if len(vc) != 1
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
|
|
||||||
let visChild = vc[0]
|
|
||||||
|
|
||||||
"TODO: optimize
|
|
||||||
if !visChild.path.isDirectory
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
|
|
||||||
call add(rv, visChild)
|
|
||||||
let node = visChild
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
return rv
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getChildCount() {{{1
|
|
||||||
"Returns the number of children this node has
|
|
||||||
function! s:TreeDirNode.getChildCount()
|
|
||||||
return len(self.children)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getChild(path) {{{1
|
|
||||||
"Returns child node of this node that has the given path or {} if no such node
|
|
||||||
"exists.
|
|
||||||
"
|
|
||||||
"This function doesnt not recurse into child dir nodes
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: a path object
|
|
||||||
function! s:TreeDirNode.getChild(path)
|
|
||||||
if stridx(a:path.str(), self.path.str(), 0) ==# -1
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
|
|
||||||
let index = self.getChildIndex(a:path)
|
|
||||||
if index ==# -1
|
|
||||||
return {}
|
|
||||||
else
|
|
||||||
return self.children[index]
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{1
|
|
||||||
"returns the child at the given index
|
|
||||||
"Args:
|
|
||||||
"indx: the index to get the child from
|
|
||||||
"visible: 1 if only the visible children array should be used, 0 if all the
|
|
||||||
"children should be searched.
|
|
||||||
function! s:TreeDirNode.getChildByIndex(indx, visible)
|
|
||||||
let array_to_search = a:visible? self.getVisibleChildren() : self.children
|
|
||||||
if a:indx > len(array_to_search)
|
|
||||||
throw "NERDTree.InvalidArgumentsError: Index is out of bounds."
|
|
||||||
endif
|
|
||||||
return array_to_search[a:indx]
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getChildIndex(path) {{{1
|
|
||||||
"Returns the index of the child node of this node that has the given path or
|
|
||||||
"-1 if no such node exists.
|
|
||||||
"
|
|
||||||
"This function doesnt not recurse into child dir nodes
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: a path object
|
|
||||||
function! s:TreeDirNode.getChildIndex(path)
|
|
||||||
if stridx(a:path.str(), self.path.str(), 0) ==# -1
|
|
||||||
return -1
|
|
||||||
endif
|
|
||||||
|
|
||||||
"do a binary search for the child
|
|
||||||
let a = 0
|
|
||||||
let z = self.getChildCount()
|
|
||||||
while a < z
|
|
||||||
let mid = (a+z)/2
|
|
||||||
let diff = a:path.compareTo(self.children[mid].path)
|
|
||||||
|
|
||||||
if diff ==# -1
|
|
||||||
let z = mid
|
|
||||||
elseif diff ==# 1
|
|
||||||
let a = mid+1
|
|
||||||
else
|
|
||||||
return mid
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getDirChildren() {{{1
|
|
||||||
"Get all children that are directories
|
|
||||||
function! s:TreeDirNode.getDirChildren()
|
|
||||||
return filter(self.children, 'v:val.path.isDirectory == 1')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.GetSelected() {{{1
|
|
||||||
"Returns the current node if it is a dir node, or else returns the current
|
|
||||||
"nodes parent
|
|
||||||
unlet s:TreeDirNode.GetSelected
|
|
||||||
function! s:TreeDirNode.GetSelected()
|
|
||||||
let currentDir = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if currentDir != {} && !currentDir.isRoot()
|
|
||||||
if currentDir.path.isDirectory ==# 0
|
|
||||||
let currentDir = currentDir.parent
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return currentDir
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getVisibleChildCount() {{{1
|
|
||||||
"Returns the number of visible children this node has
|
|
||||||
function! s:TreeDirNode.getVisibleChildCount()
|
|
||||||
return len(self.getVisibleChildren())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.getVisibleChildren() {{{1
|
|
||||||
"Returns a list of children to display for this node, in the correct order
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"an array of treenodes
|
|
||||||
function! s:TreeDirNode.getVisibleChildren()
|
|
||||||
let toReturn = []
|
|
||||||
for i in self.children
|
|
||||||
if i.path.ignore(self.getNerdtree()) ==# 0
|
|
||||||
call add(toReturn, i)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.hasVisibleChildren() {{{1
|
|
||||||
"returns 1 if this node has any childre, 0 otherwise..
|
|
||||||
function! s:TreeDirNode.hasVisibleChildren()
|
|
||||||
return self.getVisibleChildCount() != 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.isCascadable() {{{1
|
|
||||||
"true if this dir has only one visible child - which is also a dir
|
|
||||||
function! s:TreeDirNode.isCascadable()
|
|
||||||
let c = self.getVisibleChildren()
|
|
||||||
return len(c) == 1 && c[0].path.isDirectory
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode._initChildren() {{{1
|
|
||||||
"Removes all childen from this node and re-reads them
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"silent: 1 if the function should not echo any "please wait" messages for
|
|
||||||
"large directories
|
|
||||||
"
|
|
||||||
"Return: the number of child nodes read
|
|
||||||
function! s:TreeDirNode._initChildren(silent)
|
|
||||||
"remove all the current child nodes
|
|
||||||
let self.children = []
|
|
||||||
|
|
||||||
"get an array of all the files in the nodes dir
|
|
||||||
let dir = self.path
|
|
||||||
let globDir = dir.str({'format': 'Glob'})
|
|
||||||
|
|
||||||
if version >= 703
|
|
||||||
let filesStr = globpath(globDir, '*', !g:NERDTreeRespectWildIgnore) . "\n" . globpath(globDir, '.*', !g:NERDTreeRespectWildIgnore)
|
|
||||||
else
|
|
||||||
let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
|
|
||||||
endif
|
|
||||||
|
|
||||||
let files = split(filesStr, "\n")
|
|
||||||
|
|
||||||
if !a:silent && len(files) > g:NERDTreeNotificationThreshold
|
|
||||||
call nerdtree#echo("Please wait, caching a large dir ...")
|
|
||||||
endif
|
|
||||||
|
|
||||||
let invalidFilesFound = 0
|
|
||||||
for i in files
|
|
||||||
|
|
||||||
"filter out the .. and . directories
|
|
||||||
"Note: we must match .. AND ../ since sometimes the globpath returns
|
|
||||||
"../ for path with strange chars (eg $)
|
|
||||||
if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." &&
|
|
||||||
\ i[len(i)-2:1] != "." && i[len(i)-1] != "."
|
|
||||||
"put the next file in a new node and attach it
|
|
||||||
try
|
|
||||||
let path = g:NERDTreePath.New(i)
|
|
||||||
call self.createChild(path, 0)
|
|
||||||
call g:NERDTreePathNotifier.NotifyListeners('init', path, self.getNerdtree(), {})
|
|
||||||
catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
|
|
||||||
let invalidFilesFound += 1
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
call self.sortChildren()
|
|
||||||
|
|
||||||
if !a:silent && len(files) > g:NERDTreeNotificationThreshold
|
|
||||||
call nerdtree#echo("Please wait, caching a large dir ... DONE (". self.getChildCount() ." nodes cached).")
|
|
||||||
endif
|
|
||||||
|
|
||||||
if invalidFilesFound
|
|
||||||
call nerdtree#echoWarning(invalidFilesFound . " file(s) could not be loaded into the NERD tree")
|
|
||||||
endif
|
|
||||||
return self.getChildCount()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.New(path, nerdtree) {{{1
|
|
||||||
"Returns a new TreeNode object with the given path and parent
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: dir that the node represents
|
|
||||||
"nerdtree: the tree the node belongs to
|
|
||||||
function! s:TreeDirNode.New(path, nerdtree)
|
|
||||||
if a:path.isDirectory != 1
|
|
||||||
throw "NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object."
|
|
||||||
endif
|
|
||||||
|
|
||||||
let newTreeNode = copy(self)
|
|
||||||
let newTreeNode.path = a:path
|
|
||||||
|
|
||||||
let newTreeNode.isOpen = 0
|
|
||||||
let newTreeNode.children = []
|
|
||||||
|
|
||||||
let newTreeNode.parent = {}
|
|
||||||
let newTreeNode._nerdtree = a:nerdtree
|
|
||||||
|
|
||||||
return newTreeNode
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.open([opts]) {{{1
|
|
||||||
"Open the dir in the current tree or in a new tree elsewhere.
|
|
||||||
"
|
|
||||||
"If opening in the current tree, return the number of cached nodes.
|
|
||||||
unlet s:TreeDirNode.open
|
|
||||||
function! s:TreeDirNode.open(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
|
|
||||||
if has_key(opts, 'where') && !empty(opts['where'])
|
|
||||||
let opener = g:NERDTreeOpener.New(self.path, opts)
|
|
||||||
call opener.open(self)
|
|
||||||
else
|
|
||||||
let self.isOpen = 1
|
|
||||||
if self.children ==# []
|
|
||||||
return self._initChildren(0)
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.openAlong([opts]) {{{1
|
|
||||||
"recursive open the dir if it has only one directory child.
|
|
||||||
"
|
|
||||||
"return the level of opened directories.
|
|
||||||
function! s:TreeDirNode.openAlong(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
let level = 0
|
|
||||||
|
|
||||||
let node = self
|
|
||||||
while node.path.isDirectory
|
|
||||||
call node.open(opts)
|
|
||||||
let level += 1
|
|
||||||
if node.getVisibleChildCount() == 1
|
|
||||||
let node = node.getChildByIndex(0, 1)
|
|
||||||
else
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return level
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: TreeDirNode.openExplorer() {{{1
|
|
||||||
" opens an explorer window for this node in the previous window (could be a
|
|
||||||
" nerd tree or a netrw)
|
|
||||||
function! s:TreeDirNode.openExplorer()
|
|
||||||
call self.open({'where': 'p'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.openInNewTab(options) {{{1
|
|
||||||
unlet s:TreeDirNode.openInNewTab
|
|
||||||
function! s:TreeDirNode.openInNewTab(options)
|
|
||||||
call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead')
|
|
||||||
call self.open({'where': 't'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode._openInNewTab() {{{1
|
|
||||||
function! s:TreeDirNode._openInNewTab()
|
|
||||||
tabnew
|
|
||||||
call g:NERDTreeCreator.CreateTabTree(self.path.str())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.openRecursively() {{{1
|
|
||||||
"Opens this treenode and all of its children whose paths arent 'ignored'
|
|
||||||
"because of the file filters.
|
|
||||||
"
|
|
||||||
"This method is actually a wrapper for the OpenRecursively2 method which does
|
|
||||||
"the work.
|
|
||||||
function! s:TreeDirNode.openRecursively()
|
|
||||||
call self._openRecursively2(1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode._openRecursively2() {{{1
|
|
||||||
"Opens this all children of this treenode recursively if either:
|
|
||||||
" *they arent filtered by file filters
|
|
||||||
" *a:forceOpen is 1
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"forceOpen: 1 if this node should be opened regardless of file filters
|
|
||||||
function! s:TreeDirNode._openRecursively2(forceOpen)
|
|
||||||
if self.path.ignore(self.getNerdtree()) ==# 0 || a:forceOpen
|
|
||||||
let self.isOpen = 1
|
|
||||||
if self.children ==# []
|
|
||||||
call self._initChildren(1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
for i in self.children
|
|
||||||
if i.path.isDirectory ==# 1
|
|
||||||
call i._openRecursively2(0)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.refresh() {{{1
|
|
||||||
unlet s:TreeDirNode.refresh
|
|
||||||
function! s:TreeDirNode.refresh()
|
|
||||||
call self.path.refresh(self.getNerdtree())
|
|
||||||
|
|
||||||
"if this node was ever opened, refresh its children
|
|
||||||
if self.isOpen || !empty(self.children)
|
|
||||||
"go thru all the files/dirs under this node
|
|
||||||
let newChildNodes = []
|
|
||||||
let invalidFilesFound = 0
|
|
||||||
let dir = self.path
|
|
||||||
let globDir = dir.str({'format': 'Glob'})
|
|
||||||
let filesStr = globpath(globDir, '*') . "\n" . globpath(globDir, '.*')
|
|
||||||
let files = split(filesStr, "\n")
|
|
||||||
for i in files
|
|
||||||
"filter out the .. and . directories
|
|
||||||
"Note: we must match .. AND ../ cos sometimes the globpath returns
|
|
||||||
"../ for path with strange chars (eg $)
|
|
||||||
"if i !~# '\/\.\.\/\?$' && i !~# '\/\.\/\?$'
|
|
||||||
|
|
||||||
" Regular expression is too expensive. Use simply string comparison
|
|
||||||
" instead
|
|
||||||
if i[len(i)-3:2] != ".." && i[len(i)-2:2] != ".." &&
|
|
||||||
\ i[len(i)-2:1] != "." && i[len(i)-1] != "."
|
|
||||||
try
|
|
||||||
"create a new path and see if it exists in this nodes children
|
|
||||||
let path = g:NERDTreePath.New(i)
|
|
||||||
let newNode = self.getChild(path)
|
|
||||||
if newNode != {}
|
|
||||||
call newNode.refresh()
|
|
||||||
call add(newChildNodes, newNode)
|
|
||||||
|
|
||||||
"the node doesnt exist so create it
|
|
||||||
else
|
|
||||||
let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree())
|
|
||||||
let newNode.parent = self
|
|
||||||
call add(newChildNodes, newNode)
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
|
|
||||||
let invalidFilesFound = 1
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
"swap this nodes children out for the children we just read/refreshed
|
|
||||||
let self.children = newChildNodes
|
|
||||||
call self.sortChildren()
|
|
||||||
|
|
||||||
if invalidFilesFound
|
|
||||||
call nerdtree#echoWarning("some files could not be loaded into the NERD tree")
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.refreshFlags() {{{1
|
|
||||||
unlet s:TreeDirNode.refreshFlags
|
|
||||||
function! s:TreeDirNode.refreshFlags()
|
|
||||||
call self.path.refreshFlags(self.getNerdtree())
|
|
||||||
for i in self.children
|
|
||||||
call i.refreshFlags()
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.refreshDirFlags() {{{1
|
|
||||||
function! s:TreeDirNode.refreshDirFlags()
|
|
||||||
call self.path.refreshFlags(self.getNerdtree())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.reveal(path) {{{1
|
|
||||||
"reveal the given path, i.e. cache and open all treenodes needed to display it
|
|
||||||
"in the UI
|
|
||||||
"Returns the revealed node
|
|
||||||
function! s:TreeDirNode.reveal(path, ...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
|
|
||||||
if !a:path.isUnder(self.path)
|
|
||||||
throw "NERDTree.InvalidArgumentsError: " . a:path.str() . " should be under " . self.path.str()
|
|
||||||
endif
|
|
||||||
|
|
||||||
call self.open()
|
|
||||||
|
|
||||||
if self.path.equals(a:path.getParent())
|
|
||||||
let n = self.findNode(a:path)
|
|
||||||
if has_key(opts, "open")
|
|
||||||
call n.open()
|
|
||||||
endif
|
|
||||||
return n
|
|
||||||
endif
|
|
||||||
|
|
||||||
let p = a:path
|
|
||||||
while !p.getParent().equals(self.path)
|
|
||||||
let p = p.getParent()
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
let n = self.findNode(p)
|
|
||||||
return n.reveal(a:path, opts)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.removeChild(treenode) {{{1
|
|
||||||
"
|
|
||||||
"Removes the given treenode from this nodes set of children
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"treenode: the node to remove
|
|
||||||
"
|
|
||||||
"Throws a NERDTree.ChildNotFoundError if the given treenode is not found
|
|
||||||
function! s:TreeDirNode.removeChild(treenode)
|
|
||||||
for i in range(0, self.getChildCount()-1)
|
|
||||||
if self.children[i].equals(a:treenode)
|
|
||||||
call remove(self.children, i)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
throw "NERDTree.ChildNotFoundError: child node was not found"
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.sortChildren() {{{1
|
|
||||||
"
|
|
||||||
"Sorts the children of this node according to alphabetical order and the
|
|
||||||
"directory priority.
|
|
||||||
"
|
|
||||||
function! s:TreeDirNode.sortChildren()
|
|
||||||
let CompareFunc = function("nerdtree#compareNodesBySortKey")
|
|
||||||
call sort(self.children, CompareFunc)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.toggleOpen([options]) {{{1
|
|
||||||
"Opens this directory if it is closed and vice versa
|
|
||||||
function! s:TreeDirNode.toggleOpen(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
if self.isOpen ==# 1
|
|
||||||
call self.close()
|
|
||||||
else
|
|
||||||
if g:NERDTreeCascadeOpenSingleChildDir == 0
|
|
||||||
call self.open(opts)
|
|
||||||
else
|
|
||||||
call self.openAlong(opts)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeDirNode.transplantChild(newNode) {{{1
|
|
||||||
"Replaces the child of this with the given node (where the child node's full
|
|
||||||
"path matches a:newNode's fullpath). The search for the matching node is
|
|
||||||
"non-recursive
|
|
||||||
"
|
|
||||||
"Arg:
|
|
||||||
"newNode: the node to graft into the tree
|
|
||||||
function! s:TreeDirNode.transplantChild(newNode)
|
|
||||||
for i in range(0, self.getChildCount()-1)
|
|
||||||
if self.children[i].equals(a:newNode)
|
|
||||||
let self.children[i] = a:newNode
|
|
||||||
let a:newNode.parent = self
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,368 +0,0 @@
|
||||||
"CLASS: TreeFileNode
|
|
||||||
"This class is the parent of the TreeDirNode class and is the
|
|
||||||
"'Component' part of the composite design pattern between the treenode
|
|
||||||
"classes.
|
|
||||||
"============================================================
|
|
||||||
let s:TreeFileNode = {}
|
|
||||||
let g:NERDTreeFileNode = s:TreeFileNode
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.activate(...) {{{1
|
|
||||||
function! s:TreeFileNode.activate(...)
|
|
||||||
call self.open(a:0 ? a:1 : {})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.bookmark(name) {{{1
|
|
||||||
"bookmark this node with a:name
|
|
||||||
function! s:TreeFileNode.bookmark(name)
|
|
||||||
|
|
||||||
"if a bookmark exists with the same name and the node is cached then save
|
|
||||||
"it so we can update its display string
|
|
||||||
let oldMarkedNode = {}
|
|
||||||
try
|
|
||||||
let oldMarkedNode = g:NERDTreeBookmark.GetNodeForName(a:name, 1, self.getNerdtree())
|
|
||||||
catch /^NERDTree.BookmarkNotFoundError/
|
|
||||||
catch /^NERDTree.BookmarkedNodeNotFoundError/
|
|
||||||
endtry
|
|
||||||
|
|
||||||
call g:NERDTreeBookmark.AddBookmark(a:name, self.path)
|
|
||||||
call self.path.cacheDisplayString()
|
|
||||||
call g:NERDTreeBookmark.Write()
|
|
||||||
|
|
||||||
if !empty(oldMarkedNode)
|
|
||||||
call oldMarkedNode.path.cacheDisplayString()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.cacheParent() {{{1
|
|
||||||
"initializes self.parent if it isnt already
|
|
||||||
function! s:TreeFileNode.cacheParent()
|
|
||||||
if empty(self.parent)
|
|
||||||
let parentPath = self.path.getParent()
|
|
||||||
if parentPath.equals(self.path)
|
|
||||||
throw "NERDTree.CannotCacheParentError: already at root"
|
|
||||||
endif
|
|
||||||
let self.parent = s:TreeFileNode.New(parentPath, self.getNerdtree())
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.clearBookmarks() {{{1
|
|
||||||
function! s:TreeFileNode.clearBookmarks()
|
|
||||||
for i in g:NERDTreeBookmark.Bookmarks()
|
|
||||||
if i.path.equals(self.path)
|
|
||||||
call i.delete()
|
|
||||||
end
|
|
||||||
endfor
|
|
||||||
call self.path.cacheDisplayString()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.copy(dest) {{{1
|
|
||||||
function! s:TreeFileNode.copy(dest)
|
|
||||||
call self.path.copy(a:dest)
|
|
||||||
let newPath = g:NERDTreePath.New(a:dest)
|
|
||||||
let parent = self.getNerdtree().root.findNode(newPath.getParent())
|
|
||||||
if !empty(parent)
|
|
||||||
call parent.refresh()
|
|
||||||
return parent.findNode(newPath)
|
|
||||||
else
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.delete {{{1
|
|
||||||
"Removes this node from the tree and calls the Delete method for its path obj
|
|
||||||
function! s:TreeFileNode.delete()
|
|
||||||
call self.path.delete()
|
|
||||||
call self.parent.removeChild(self)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.displayString() {{{1
|
|
||||||
"
|
|
||||||
"Returns a string that specifies how the node should be represented as a
|
|
||||||
"string
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"a string that can be used in the view to represent this node
|
|
||||||
function! s:TreeFileNode.displayString()
|
|
||||||
return self.path.flagSet.renderToString() . self.path.displayString()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.equals(treenode) {{{1
|
|
||||||
"
|
|
||||||
"Compares this treenode to the input treenode and returns 1 if they are the
|
|
||||||
"same node.
|
|
||||||
"
|
|
||||||
"Use this method instead of == because sometimes when the treenodes contain
|
|
||||||
"many children, vim seg faults when doing ==
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"treenode: the other treenode to compare to
|
|
||||||
function! s:TreeFileNode.equals(treenode)
|
|
||||||
return self.path.str() ==# a:treenode.path.str()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.findNode(path) {{{1
|
|
||||||
"Returns self if this node.path.Equals the given path.
|
|
||||||
"Returns {} if not equal.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: the path object to compare against
|
|
||||||
function! s:TreeFileNode.findNode(path)
|
|
||||||
if a:path.equals(self.path)
|
|
||||||
return self
|
|
||||||
endif
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction) {{{1
|
|
||||||
"
|
|
||||||
"Finds the next sibling for this node in the indicated direction. This sibling
|
|
||||||
"must be a directory and may/may not have children as specified.
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"direction: 0 if you want to find the previous sibling, 1 for the next sibling
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"a treenode object or {} if no appropriate sibling could be found
|
|
||||||
function! s:TreeFileNode.findOpenDirSiblingWithVisibleChildren(direction)
|
|
||||||
"if we have no parent then we can have no siblings
|
|
||||||
if self.parent != {}
|
|
||||||
let nextSibling = self.findSibling(a:direction)
|
|
||||||
|
|
||||||
while nextSibling != {}
|
|
||||||
if nextSibling.path.isDirectory && nextSibling.hasVisibleChildren() && nextSibling.isOpen
|
|
||||||
return nextSibling
|
|
||||||
endif
|
|
||||||
let nextSibling = nextSibling.findSibling(a:direction)
|
|
||||||
endwhile
|
|
||||||
endif
|
|
||||||
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.findSibling(direction) {{{1
|
|
||||||
"
|
|
||||||
"Finds the next sibling for this node in the indicated direction
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"direction: 0 if you want to find the previous sibling, 1 for the next sibling
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"a treenode object or {} if no sibling could be found
|
|
||||||
function! s:TreeFileNode.findSibling(direction)
|
|
||||||
"if we have no parent then we can have no siblings
|
|
||||||
if self.parent != {}
|
|
||||||
|
|
||||||
"get the index of this node in its parents children
|
|
||||||
let siblingIndx = self.parent.getChildIndex(self.path)
|
|
||||||
|
|
||||||
if siblingIndx != -1
|
|
||||||
"move a long to the next potential sibling node
|
|
||||||
let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
|
|
||||||
|
|
||||||
"keep moving along to the next sibling till we find one that is valid
|
|
||||||
let numSiblings = self.parent.getChildCount()
|
|
||||||
while siblingIndx >= 0 && siblingIndx < numSiblings
|
|
||||||
|
|
||||||
"if the next node is not an ignored node (i.e. wont show up in the
|
|
||||||
"view) then return it
|
|
||||||
if self.parent.children[siblingIndx].path.ignore(self.getNerdtree()) ==# 0
|
|
||||||
return self.parent.children[siblingIndx]
|
|
||||||
endif
|
|
||||||
|
|
||||||
"go to next node
|
|
||||||
let siblingIndx = a:direction ==# 1 ? siblingIndx+1 : siblingIndx-1
|
|
||||||
endwhile
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.getNerdtree(){{{1
|
|
||||||
function! s:TreeFileNode.getNerdtree()
|
|
||||||
return self._nerdtree
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.GetRootForTab(){{{1
|
|
||||||
"get the root node for this tab
|
|
||||||
function! s:TreeFileNode.GetRootForTab()
|
|
||||||
if g:NERDTree.ExistsForTab()
|
|
||||||
return getbufvar(t:NERDTreeBufName, 'NERDTree').root
|
|
||||||
end
|
|
||||||
return {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.GetSelected() {{{1
|
|
||||||
"gets the treenode that the cursor is currently over
|
|
||||||
function! s:TreeFileNode.GetSelected()
|
|
||||||
try
|
|
||||||
let path = b:NERDTree.ui.getPath(line("."))
|
|
||||||
if path ==# {}
|
|
||||||
return {}
|
|
||||||
endif
|
|
||||||
return b:NERDTree.root.findNode(path)
|
|
||||||
catch /^NERDTree/
|
|
||||||
return {}
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.isVisible() {{{1
|
|
||||||
"returns 1 if this node should be visible according to the tree filters and
|
|
||||||
"hidden file filters (and their on/off status)
|
|
||||||
function! s:TreeFileNode.isVisible()
|
|
||||||
return !self.path.ignore(self.getNerdtree())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.isRoot() {{{1
|
|
||||||
function! s:TreeFileNode.isRoot()
|
|
||||||
if !g:NERDTree.ExistsForBuf()
|
|
||||||
throw "NERDTree.NoTreeError: No tree exists for the current buffer"
|
|
||||||
endif
|
|
||||||
|
|
||||||
return self.equals(self.getNerdtree().root)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.New(path, nerdtree) {{{1
|
|
||||||
"Returns a new TreeNode object with the given path and parent
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"path: file/dir that the node represents
|
|
||||||
"nerdtree: the tree the node belongs to
|
|
||||||
function! s:TreeFileNode.New(path, nerdtree)
|
|
||||||
if a:path.isDirectory
|
|
||||||
return g:NERDTreeDirNode.New(a:path, a:nerdtree)
|
|
||||||
else
|
|
||||||
let newTreeNode = copy(self)
|
|
||||||
let newTreeNode.path = a:path
|
|
||||||
let newTreeNode.parent = {}
|
|
||||||
let newTreeNode._nerdtree = a:nerdtree
|
|
||||||
return newTreeNode
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.open() {{{1
|
|
||||||
function! s:TreeFileNode.open(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
let opener = g:NERDTreeOpener.New(self.path, opts)
|
|
||||||
call opener.open(self)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.openSplit() {{{1
|
|
||||||
"Open this node in a new window
|
|
||||||
function! s:TreeFileNode.openSplit()
|
|
||||||
call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.')
|
|
||||||
call self.open({'where': 'h'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.openVSplit() {{{1
|
|
||||||
"Open this node in a new vertical window
|
|
||||||
function! s:TreeFileNode.openVSplit()
|
|
||||||
call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.')
|
|
||||||
call self.open({'where': 'v'})
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.openInNewTab(options) {{{1
|
|
||||||
function! s:TreeFileNode.openInNewTab(options)
|
|
||||||
echomsg 'TreeFileNode.openInNewTab is deprecated'
|
|
||||||
call self.open(extend({'where': 't'}, a:options))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1
|
|
||||||
"Places the cursor on the line number this node is rendered on
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"isJump: 1 if this cursor movement should be counted as a jump by vim
|
|
||||||
"recurseUpward: try to put the cursor on the parent if the this node isnt
|
|
||||||
"visible
|
|
||||||
function! s:TreeFileNode.putCursorHere(isJump, recurseUpward)
|
|
||||||
let ln = self.getNerdtree().ui.getLineNum(self)
|
|
||||||
if ln != -1
|
|
||||||
if a:isJump
|
|
||||||
mark '
|
|
||||||
endif
|
|
||||||
call cursor(ln, col("."))
|
|
||||||
else
|
|
||||||
if a:recurseUpward
|
|
||||||
let node = self
|
|
||||||
while node != {} && self.getNerdtree().ui.getLineNum(node) ==# -1
|
|
||||||
let node = node.parent
|
|
||||||
call node.open()
|
|
||||||
endwhile
|
|
||||||
call self._nerdtree.render()
|
|
||||||
call node.putCursorHere(a:isJump, 0)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.refresh() {{{1
|
|
||||||
function! s:TreeFileNode.refresh()
|
|
||||||
call self.path.refresh(self.getNerdtree())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.refreshFlags() {{{1
|
|
||||||
function! s:TreeFileNode.refreshFlags()
|
|
||||||
call self.path.refreshFlags(self.getNerdtree())
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.rename() {{{1
|
|
||||||
"Calls the rename method for this nodes path obj
|
|
||||||
function! s:TreeFileNode.rename(newName)
|
|
||||||
let newName = substitute(a:newName, '\(\\\|\/\)$', '', '')
|
|
||||||
call self.path.rename(newName)
|
|
||||||
call self.parent.removeChild(self)
|
|
||||||
|
|
||||||
let parentPath = self.path.getParent()
|
|
||||||
let newParent = self.getNerdtree().root.findNode(parentPath)
|
|
||||||
|
|
||||||
if newParent != {}
|
|
||||||
call newParent.createChild(self.path, 1)
|
|
||||||
call newParent.refresh()
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: TreeFileNode.renderToString {{{1
|
|
||||||
"returns a string representation for this tree to be rendered in the view
|
|
||||||
function! s:TreeFileNode.renderToString()
|
|
||||||
return self._renderToString(0, 0)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"Args:
|
|
||||||
"depth: the current depth in the tree for this call
|
|
||||||
"drawText: 1 if we should actually draw the line for this node (if 0 then the
|
|
||||||
"child nodes are rendered only)
|
|
||||||
"for each depth in the tree
|
|
||||||
function! s:TreeFileNode._renderToString(depth, drawText)
|
|
||||||
let output = ""
|
|
||||||
if a:drawText ==# 1
|
|
||||||
|
|
||||||
let treeParts = repeat(' ', a:depth - 1)
|
|
||||||
|
|
||||||
if !self.path.isDirectory
|
|
||||||
let treeParts = treeParts . ' '
|
|
||||||
endif
|
|
||||||
|
|
||||||
let line = treeParts . self.displayString()
|
|
||||||
|
|
||||||
let output = output . line . "\n"
|
|
||||||
endif
|
|
||||||
|
|
||||||
"if the node is an open dir, draw its children
|
|
||||||
if self.path.isDirectory ==# 1 && self.isOpen ==# 1
|
|
||||||
|
|
||||||
let childNodesToDraw = self.getVisibleChildren()
|
|
||||||
|
|
||||||
if self.isCascadable() && a:depth > 0
|
|
||||||
|
|
||||||
let output = output . childNodesToDraw[0]._renderToString(a:depth, 0)
|
|
||||||
|
|
||||||
elseif len(childNodesToDraw) > 0
|
|
||||||
for i in childNodesToDraw
|
|
||||||
let output = output . i._renderToString(a:depth + 1, 1)
|
|
||||||
endfor
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
return output
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,539 +0,0 @@
|
||||||
"CLASS: UI
|
|
||||||
"============================================================
|
|
||||||
let s:UI = {}
|
|
||||||
let g:NERDTreeUI = s:UI
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.centerView() {{{2
|
|
||||||
"centers the nerd tree window around the cursor (provided the nerd tree
|
|
||||||
"options permit)
|
|
||||||
function! s:UI.centerView()
|
|
||||||
if g:NERDTreeAutoCenter
|
|
||||||
let current_line = winline()
|
|
||||||
let lines_to_top = current_line
|
|
||||||
let lines_to_bottom = winheight(g:NERDTree.GetWinNum()) - current_line
|
|
||||||
if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold
|
|
||||||
normal! zz
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI._dumpHelp {{{1
|
|
||||||
"prints out the quick help
|
|
||||||
function! s:UI._dumpHelp()
|
|
||||||
let old_h = @h
|
|
||||||
if self.getShowHelp()
|
|
||||||
let @h= "\" NERD tree (" . nerdtree#version() . ") quickhelp~\n"
|
|
||||||
let @h=@h."\" ============================\n"
|
|
||||||
let @h=@h."\" File node mappings~\n"
|
|
||||||
let @h=@h."\" ". (g:NERDTreeMouseMode ==# 3 ? "single" : "double") ."-click,\n"
|
|
||||||
let @h=@h."\" <CR>,\n"
|
|
||||||
if self.nerdtree.isTabTree()
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in prev window\n"
|
|
||||||
else
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open in current window\n"
|
|
||||||
endif
|
|
||||||
if self.nerdtree.isTabTree()
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapPreview .": preview\n"
|
|
||||||
endif
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
|
|
||||||
let @h=@h."\" middle-click,\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenSplit .": open split\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapPreviewSplit .": preview split\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenVSplit .": open vsplit\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Directory node mappings~\n"
|
|
||||||
let @h=@h."\" ". (g:NERDTreeMouseMode ==# 1 ? "double" : "single") ."-click,\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open & close node\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenRecursively .": recursively open node\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapCloseDir .": close parent of node\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapCloseChildren .": close all child nodes of\n"
|
|
||||||
let @h=@h."\" current node recursively\n"
|
|
||||||
let @h=@h."\" middle-click,\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenExpl.": explore selected dir\n"
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Bookmark table mappings~\n"
|
|
||||||
let @h=@h."\" double-click,\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapActivateNode .": open bookmark\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenInTab.": open in new tab\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapDeleteBookmark .": delete bookmark\n"
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Tree navigation mappings~\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpRoot .": go to root\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpParent .": go to parent\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpFirstChild .": go to first child\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpLastChild .": go to last child\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpNextSibling .": go to next sibling\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n"
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Filesystem mappings~\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapChangeRoot .": change tree root to the\n"
|
|
||||||
let @h=@h."\" selected dir\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapUpdir .": move tree root up a dir\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n"
|
|
||||||
let @h=@h."\" but leave old root open\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapRefresh .": refresh cursor dir\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapRefreshRoot .": refresh current root\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapMenu .": Show menu\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapChdir .":change the CWD to the\n"
|
|
||||||
let @h=@h."\" selected dir\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapCWD .":change tree root to CWD\n"
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Tree filtering mappings~\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapToggleHidden .": hidden files (" . (self.getShowHidden() ? "on" : "off") . ")\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapToggleFilters .": file filters (" . (self.isIgnoreFilterEnabled() ? "on" : "off") . ")\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapToggleFiles .": files (" . (self.getShowFiles() ? "on" : "off") . ")\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapToggleBookmarks .": bookmarks (" . (self.getShowBookmarks() ? "on" : "off") . ")\n"
|
|
||||||
|
|
||||||
"add quickhelp entries for each custom key map
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Custom mappings~\n"
|
|
||||||
for i in g:NERDTreeKeyMap.All()
|
|
||||||
if !empty(i.quickhelpText)
|
|
||||||
let @h=@h."\" ". i.key .": ". i.quickhelpText ."\n"
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Other mappings~\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapQuit .": Close the NERDTree window\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n"
|
|
||||||
let @h=@h."\" the NERDTree window\n"
|
|
||||||
let @h=@h."\" ". g:NERDTreeMapHelp .": toggle help\n"
|
|
||||||
let @h=@h."\"\n\" ----------------------------\n"
|
|
||||||
let @h=@h."\" Bookmark commands~\n"
|
|
||||||
let @h=@h."\" :Bookmark [<name>]\n"
|
|
||||||
let @h=@h."\" :BookmarkToRoot <name>\n"
|
|
||||||
let @h=@h."\" :RevealBookmark <name>\n"
|
|
||||||
let @h=@h."\" :OpenBookmark <name>\n"
|
|
||||||
let @h=@h."\" :ClearBookmarks [<names>]\n"
|
|
||||||
let @h=@h."\" :ClearAllBookmarks\n"
|
|
||||||
silent! put h
|
|
||||||
elseif !self.isMinimal()
|
|
||||||
let @h="\" Press ". g:NERDTreeMapHelp ." for help\n"
|
|
||||||
silent! put h
|
|
||||||
endif
|
|
||||||
|
|
||||||
let @h = old_h
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.new(nerdtree) {{{1
|
|
||||||
function! s:UI.New(nerdtree)
|
|
||||||
let newObj = copy(self)
|
|
||||||
let newObj.nerdtree = a:nerdtree
|
|
||||||
let newObj._showHelp = 0
|
|
||||||
let newObj._ignoreEnabled = 1
|
|
||||||
let newObj._showFiles = g:NERDTreeShowFiles
|
|
||||||
let newObj._showHidden = g:NERDTreeShowHidden
|
|
||||||
let newObj._showBookmarks = g:NERDTreeShowBookmarks
|
|
||||||
|
|
||||||
return newObj
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getPath(ln) {{{1
|
|
||||||
"Gets the full path to the node that is rendered on the given line number
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"ln: the line number to get the path for
|
|
||||||
"
|
|
||||||
"Return:
|
|
||||||
"A path if a node was selected, {} if nothing is selected.
|
|
||||||
"If the 'up a dir' line was selected then the path to the parent of the
|
|
||||||
"current root is returned
|
|
||||||
function! s:UI.getPath(ln)
|
|
||||||
let line = getline(a:ln)
|
|
||||||
|
|
||||||
let rootLine = self.getRootLineNum()
|
|
||||||
|
|
||||||
"check to see if we have the root node
|
|
||||||
if a:ln == rootLine
|
|
||||||
return self.nerdtree.root.path
|
|
||||||
endif
|
|
||||||
|
|
||||||
if line ==# s:UI.UpDirLine()
|
|
||||||
return self.nerdtree.root.path.getParent()
|
|
||||||
endif
|
|
||||||
|
|
||||||
let indent = self._indentLevelFor(line)
|
|
||||||
|
|
||||||
"remove the tree parts and the leading space
|
|
||||||
let curFile = self._stripMarkup(line, 0)
|
|
||||||
|
|
||||||
let wasdir = 0
|
|
||||||
if curFile =~# '/$'
|
|
||||||
let wasdir = 1
|
|
||||||
let curFile = substitute(curFile, '/\?$', '/', "")
|
|
||||||
endif
|
|
||||||
|
|
||||||
let dir = ""
|
|
||||||
let lnum = a:ln
|
|
||||||
while lnum > 0
|
|
||||||
let lnum = lnum - 1
|
|
||||||
let curLine = getline(lnum)
|
|
||||||
let curLineStripped = self._stripMarkup(curLine, 1)
|
|
||||||
|
|
||||||
"have we reached the top of the tree?
|
|
||||||
if lnum == rootLine
|
|
||||||
let dir = self.nerdtree.root.path.str({'format': 'UI'}) . dir
|
|
||||||
break
|
|
||||||
endif
|
|
||||||
if curLineStripped =~# '/$'
|
|
||||||
let lpindent = self._indentLevelFor(curLine)
|
|
||||||
if lpindent < indent
|
|
||||||
let indent = indent - 1
|
|
||||||
|
|
||||||
let dir = substitute (curLineStripped,'^\\', "", "") . dir
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
let curFile = self.nerdtree.root.path.drive . dir . curFile
|
|
||||||
let toReturn = g:NERDTreePath.New(curFile)
|
|
||||||
return toReturn
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getLineNum(file_node){{{1
|
|
||||||
"returns the line number this node is rendered on, or -1 if it isnt rendered
|
|
||||||
function! s:UI.getLineNum(file_node)
|
|
||||||
"if the node is the root then return the root line no.
|
|
||||||
if a:file_node.isRoot()
|
|
||||||
return self.getRootLineNum()
|
|
||||||
endif
|
|
||||||
|
|
||||||
let totalLines = line("$")
|
|
||||||
|
|
||||||
"the path components we have matched so far
|
|
||||||
let pathcomponents = [substitute(self.nerdtree.root.path.str({'format': 'UI'}), '/ *$', '', '')]
|
|
||||||
"the index of the component we are searching for
|
|
||||||
let curPathComponent = 1
|
|
||||||
|
|
||||||
let fullpath = a:file_node.path.str({'format': 'UI'})
|
|
||||||
|
|
||||||
let lnum = self.getRootLineNum()
|
|
||||||
while lnum > 0
|
|
||||||
let lnum = lnum + 1
|
|
||||||
"have we reached the bottom of the tree?
|
|
||||||
if lnum ==# totalLines+1
|
|
||||||
return -1
|
|
||||||
endif
|
|
||||||
|
|
||||||
let curLine = getline(lnum)
|
|
||||||
|
|
||||||
let indent = self._indentLevelFor(curLine)
|
|
||||||
if indent ==# curPathComponent
|
|
||||||
let curLine = self._stripMarkup(curLine, 1)
|
|
||||||
|
|
||||||
let curPath = join(pathcomponents, '/') . '/' . curLine
|
|
||||||
if stridx(fullpath, curPath, 0) ==# 0
|
|
||||||
if fullpath ==# curPath || strpart(fullpath, len(curPath)-1,1) ==# '/'
|
|
||||||
let curLine = substitute(curLine, '/ *$', '', '')
|
|
||||||
call add(pathcomponents, curLine)
|
|
||||||
let curPathComponent = curPathComponent + 1
|
|
||||||
|
|
||||||
if fullpath ==# curPath
|
|
||||||
return lnum
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
return -1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getRootLineNum(){{{1
|
|
||||||
"gets the line number of the root node
|
|
||||||
function! s:UI.getRootLineNum()
|
|
||||||
let rootLine = 1
|
|
||||||
while getline(rootLine) !~# '^\(/\|<\)'
|
|
||||||
let rootLine = rootLine + 1
|
|
||||||
endwhile
|
|
||||||
return rootLine
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getShowBookmarks() {{{1
|
|
||||||
function! s:UI.getShowBookmarks()
|
|
||||||
return self._showBookmarks
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getShowFiles() {{{1
|
|
||||||
function! s:UI.getShowFiles()
|
|
||||||
return self._showFiles
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getShowHelp() {{{1
|
|
||||||
function! s:UI.getShowHelp()
|
|
||||||
return self._showHelp
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.getShowHidden() {{{1
|
|
||||||
function! s:UI.getShowHidden()
|
|
||||||
return self._showHidden
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI._indentLevelFor(line) {{{1
|
|
||||||
function! s:UI._indentLevelFor(line)
|
|
||||||
"have to do this work around because match() returns bytes, not chars
|
|
||||||
let numLeadBytes = match(a:line, '\M\[^ '.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']')
|
|
||||||
let leadChars = strchars(a:line[0:numLeadBytes-1])
|
|
||||||
|
|
||||||
return leadChars / s:UI.IndentWid()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.IndentWid() {{{1
|
|
||||||
function! s:UI.IndentWid()
|
|
||||||
return 2
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.isIgnoreFilterEnabled() {{{1
|
|
||||||
function! s:UI.isIgnoreFilterEnabled()
|
|
||||||
return self._ignoreEnabled == 1
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.isMinimal() {{{1
|
|
||||||
function! s:UI.isMinimal()
|
|
||||||
return g:NERDTreeMinimalUI
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.MarkupReg() {{{1
|
|
||||||
function! s:UI.MarkupReg()
|
|
||||||
return '^\(['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \| \+['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \| \+\)'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI._renderBookmarks {{{1
|
|
||||||
function! s:UI._renderBookmarks()
|
|
||||||
|
|
||||||
if !self.isMinimal()
|
|
||||||
call setline(line(".")+1, ">----------Bookmarks----------")
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
endif
|
|
||||||
|
|
||||||
for i in g:NERDTreeBookmark.Bookmarks()
|
|
||||||
call setline(line(".")+1, i.str())
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
endfor
|
|
||||||
|
|
||||||
call setline(line(".")+1, '')
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.restoreScreenState() {{{1
|
|
||||||
"
|
|
||||||
"Sets the screen state back to what it was when nerdtree#saveScreenState was last
|
|
||||||
"called.
|
|
||||||
"
|
|
||||||
"Assumes the cursor is in the NERDTree window
|
|
||||||
function! s:UI.restoreScreenState()
|
|
||||||
if !has_key(self, '_screenState')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
exec("silent vertical resize " . self._screenState['oldWindowSize'])
|
|
||||||
|
|
||||||
let old_scrolloff=&scrolloff
|
|
||||||
let &scrolloff=0
|
|
||||||
call cursor(self._screenState['oldTopLine'], 0)
|
|
||||||
normal! zt
|
|
||||||
call setpos(".", self._screenState['oldPos'])
|
|
||||||
let &scrolloff=old_scrolloff
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.saveScreenState() {{{1
|
|
||||||
"Saves the current cursor position in the current buffer and the window
|
|
||||||
"scroll position
|
|
||||||
function! s:UI.saveScreenState()
|
|
||||||
let win = winnr()
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
let self._screenState = {}
|
|
||||||
let self._screenState['oldPos'] = getpos(".")
|
|
||||||
let self._screenState['oldTopLine'] = line("w0")
|
|
||||||
let self._screenState['oldWindowSize']= winwidth("")
|
|
||||||
call nerdtree#exec(win . "wincmd w")
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.setShowHidden(val) {{{1
|
|
||||||
function! s:UI.setShowHidden(val)
|
|
||||||
let self._showHidden = a:val
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI._stripMarkup(line, removeLeadingSpaces){{{1
|
|
||||||
"returns the given line with all the tree parts stripped off
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"line: the subject line
|
|
||||||
"removeLeadingSpaces: 1 if leading spaces are to be removed (leading spaces =
|
|
||||||
"any spaces before the actual text of the node)
|
|
||||||
function! s:UI._stripMarkup(line, removeLeadingSpaces)
|
|
||||||
let line = a:line
|
|
||||||
"remove the tree parts and the leading space
|
|
||||||
let line = substitute (line, g:NERDTreeUI.MarkupReg(),"","")
|
|
||||||
|
|
||||||
"strip off any read only flag
|
|
||||||
let line = substitute (line, ' \[RO\]', "","")
|
|
||||||
|
|
||||||
"strip off any bookmark flags
|
|
||||||
let line = substitute (line, ' {[^}]*}', "","")
|
|
||||||
|
|
||||||
"strip off any executable flags
|
|
||||||
let line = substitute (line, '*\ze\($\| \)', "","")
|
|
||||||
|
|
||||||
"strip off any generic flags
|
|
||||||
let line = substitute (line, '\[[^]]*\]', "","")
|
|
||||||
|
|
||||||
let wasdir = 0
|
|
||||||
if line =~# '/$'
|
|
||||||
let wasdir = 1
|
|
||||||
endif
|
|
||||||
let line = substitute (line,' -> .*',"","") " remove link to
|
|
||||||
if wasdir ==# 1
|
|
||||||
let line = substitute (line, '/\?$', '/', "")
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:removeLeadingSpaces
|
|
||||||
let line = substitute (line, '^ *', '', '')
|
|
||||||
endif
|
|
||||||
|
|
||||||
return line
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.render() {{{1
|
|
||||||
function! s:UI.render()
|
|
||||||
setlocal modifiable
|
|
||||||
|
|
||||||
"remember the top line of the buffer and the current line so we can
|
|
||||||
"restore the view exactly how it was
|
|
||||||
let curLine = line(".")
|
|
||||||
let curCol = col(".")
|
|
||||||
let topLine = line("w0")
|
|
||||||
|
|
||||||
"delete all lines in the buffer (being careful not to clobber a register)
|
|
||||||
silent 1,$delete _
|
|
||||||
|
|
||||||
call self._dumpHelp()
|
|
||||||
|
|
||||||
"delete the blank line before the help and add one after it
|
|
||||||
if !self.isMinimal()
|
|
||||||
call setline(line(".")+1, "")
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
endif
|
|
||||||
|
|
||||||
if self.getShowBookmarks()
|
|
||||||
call self._renderBookmarks()
|
|
||||||
endif
|
|
||||||
|
|
||||||
"add the 'up a dir' line
|
|
||||||
if !self.isMinimal()
|
|
||||||
call setline(line(".")+1, s:UI.UpDirLine())
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
endif
|
|
||||||
|
|
||||||
"draw the header line
|
|
||||||
let header = self.nerdtree.root.path.str({'format': 'UI', 'truncateTo': winwidth(0)})
|
|
||||||
call setline(line(".")+1, header)
|
|
||||||
call cursor(line(".")+1, col("."))
|
|
||||||
|
|
||||||
"draw the tree
|
|
||||||
let old_o = @o
|
|
||||||
let @o = self.nerdtree.root.renderToString()
|
|
||||||
silent put o
|
|
||||||
let @o = old_o
|
|
||||||
|
|
||||||
"delete the blank line at the top of the buffer
|
|
||||||
silent 1,1delete _
|
|
||||||
|
|
||||||
"restore the view
|
|
||||||
let old_scrolloff=&scrolloff
|
|
||||||
let &scrolloff=0
|
|
||||||
call cursor(topLine, 1)
|
|
||||||
normal! zt
|
|
||||||
call cursor(curLine, curCol)
|
|
||||||
let &scrolloff = old_scrolloff
|
|
||||||
|
|
||||||
setlocal nomodifiable
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
"FUNCTION: UI.renderViewSavingPosition {{{1
|
|
||||||
"Renders the tree and ensures the cursor stays on the current node or the
|
|
||||||
"current nodes parent if it is no longer available upon re-rendering
|
|
||||||
function! s:UI.renderViewSavingPosition()
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
|
|
||||||
"go up the tree till we find a node that will be visible or till we run
|
|
||||||
"out of nodes
|
|
||||||
while currentNode != {} && !currentNode.isVisible() && !currentNode.isRoot()
|
|
||||||
let currentNode = currentNode.parent
|
|
||||||
endwhile
|
|
||||||
|
|
||||||
call self.render()
|
|
||||||
|
|
||||||
if currentNode != {}
|
|
||||||
call currentNode.putCursorHere(0, 0)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.toggleHelp() {{{1
|
|
||||||
function! s:UI.toggleHelp()
|
|
||||||
let self._showHelp = !self._showHelp
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:UI.toggleIgnoreFilter() {{{1
|
|
||||||
" toggles the use of the NERDTreeIgnore option
|
|
||||||
function! s:UI.toggleIgnoreFilter()
|
|
||||||
let self._ignoreEnabled = !self._ignoreEnabled
|
|
||||||
call self.renderViewSavingPosition()
|
|
||||||
call self.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:UI.toggleShowBookmarks() {{{1
|
|
||||||
" toggles the display of bookmarks
|
|
||||||
function! s:UI.toggleShowBookmarks()
|
|
||||||
let self._showBookmarks = !self._showBookmarks
|
|
||||||
if self.getShowBookmarks()
|
|
||||||
call self.nerdtree.render()
|
|
||||||
call g:NERDTree.CursorToBookmarkTable()
|
|
||||||
else
|
|
||||||
call self.renderViewSavingPosition()
|
|
||||||
endif
|
|
||||||
call self.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:UI.toggleShowFiles() {{{1
|
|
||||||
" toggles the display of hidden files
|
|
||||||
function! s:UI.toggleShowFiles()
|
|
||||||
let self._showFiles = !self._showFiles
|
|
||||||
call self.renderViewSavingPosition()
|
|
||||||
call self.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:UI.toggleShowHidden() {{{1
|
|
||||||
" toggles the display of hidden files
|
|
||||||
function! s:UI.toggleShowHidden()
|
|
||||||
let self._showHidden = !self._showHidden
|
|
||||||
call self.renderViewSavingPosition()
|
|
||||||
call self.centerView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: s:UI.toggleZoom() {{{1
|
|
||||||
" zoom (maximize/minimize) the NERDTree window
|
|
||||||
function! s:UI.toggleZoom()
|
|
||||||
if exists("b:NERDTreeZoomed") && b:NERDTreeZoomed
|
|
||||||
let size = exists("b:NERDTreeOldWindowSize") ? b:NERDTreeOldWindowSize : g:NERDTreeWinSize
|
|
||||||
exec "silent vertical resize ". size
|
|
||||||
let b:NERDTreeZoomed = 0
|
|
||||||
else
|
|
||||||
exec "vertical resize"
|
|
||||||
let b:NERDTreeZoomed = 1
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:UI.UpDirLine() {{{1
|
|
||||||
function! s:UI.UpDirLine()
|
|
||||||
return '.. (up a dir)'
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
" ============================================================================
|
|
||||||
" File: exec_menuitem.vim
|
|
||||||
" Description: plugin for NERD Tree that provides an execute file menu item
|
|
||||||
" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
|
|
||||||
" License: This program is free software. It comes without any warranty,
|
|
||||||
" to the extent permitted by applicable law. You can redistribute
|
|
||||||
" it and/or modify it under the terms of the Do What The Fuck You
|
|
||||||
" Want To Public License, Version 2, as published by Sam Hocevar.
|
|
||||||
" See http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
||||||
"
|
|
||||||
" ============================================================================
|
|
||||||
if exists("g:loaded_nerdtree_exec_menuitem")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_nerdtree_exec_menuitem = 1
|
|
||||||
|
|
||||||
call NERDTreeAddMenuItem({
|
|
||||||
\ 'text': '(!)Execute file',
|
|
||||||
\ 'shortcut': '!',
|
|
||||||
\ 'callback': 'NERDTreeExecFile',
|
|
||||||
\ 'isActiveCallback': 'NERDTreeExecFileActive' })
|
|
||||||
|
|
||||||
function! NERDTreeExecFileActive()
|
|
||||||
let node = g:NERDTreeFileNode.GetSelected()
|
|
||||||
return !node.path.isDirectory && node.path.isExecutable
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeExecFile()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
echo "==========================================================\n"
|
|
||||||
echo "Complete the command to execute (add arguments etc):\n"
|
|
||||||
let cmd = treenode.path.str({'escape': 1})
|
|
||||||
let cmd = input(':!', cmd . ' ')
|
|
||||||
|
|
||||||
if cmd != ''
|
|
||||||
exec ':!' . cmd
|
|
||||||
else
|
|
||||||
echo "Aborted"
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,287 +0,0 @@
|
||||||
" ============================================================================
|
|
||||||
" File: fs_menu.vim
|
|
||||||
" Description: plugin for the NERD Tree that provides a file system menu
|
|
||||||
" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
|
|
||||||
" License: This program is free software. It comes without any warranty,
|
|
||||||
" to the extent permitted by applicable law. You can redistribute
|
|
||||||
" it and/or modify it under the terms of the Do What The Fuck You
|
|
||||||
" Want To Public License, Version 2, as published by Sam Hocevar.
|
|
||||||
" See http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
||||||
"
|
|
||||||
" ============================================================================
|
|
||||||
if exists("g:loaded_nerdtree_fs_menu")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_nerdtree_fs_menu = 1
|
|
||||||
|
|
||||||
"Automatically delete the buffer after deleting or renaming a file
|
|
||||||
if !exists("g:NERDTreeAutoDeleteBuffer")
|
|
||||||
let g:NERDTreeAutoDeleteBuffer = 0
|
|
||||||
endif
|
|
||||||
|
|
||||||
call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'})
|
|
||||||
call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
|
|
||||||
call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
|
|
||||||
|
|
||||||
if has("gui_mac") || has("gui_macvim") || has("mac")
|
|
||||||
call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'})
|
|
||||||
call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'})
|
|
||||||
call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'})
|
|
||||||
endif
|
|
||||||
|
|
||||||
if g:NERDTreePath.CopyingSupported()
|
|
||||||
call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has("unix") || has("osx")
|
|
||||||
call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'})
|
|
||||||
else
|
|
||||||
call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'})
|
|
||||||
endif
|
|
||||||
|
|
||||||
"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1
|
|
||||||
"prints out the given msg and, if the user responds by pushing 'y' then the
|
|
||||||
"buffer with the given bufnum is deleted
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"bufnum: the buffer that may be deleted
|
|
||||||
"msg: a message that will be echoed to the user asking them if they wish to
|
|
||||||
" del the buffer
|
|
||||||
function! s:promptToDelBuffer(bufnum, msg)
|
|
||||||
echo a:msg
|
|
||||||
if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
|
|
||||||
" 1. ensure that all windows which display the just deleted filename
|
|
||||||
" now display an empty buffer (so a layout is preserved).
|
|
||||||
" Is not it better to close single tabs with this file only ?
|
|
||||||
let s:originalTabNumber = tabpagenr()
|
|
||||||
let s:originalWindowNumber = winnr()
|
|
||||||
exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':enew! ' | endif"
|
|
||||||
exec "tabnext " . s:originalTabNumber
|
|
||||||
exec s:originalWindowNumber . "wincmd w"
|
|
||||||
" 3. We don't need a previous buffer anymore
|
|
||||||
exec "bwipeout! " . a:bufnum
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: s:promptToRenameBuffer(bufnum, msg){{{1
|
|
||||||
"prints out the given msg and, if the user responds by pushing 'y' then the
|
|
||||||
"buffer with the given bufnum is replaced with a new one
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"bufnum: the buffer that may be deleted
|
|
||||||
"msg: a message that will be echoed to the user asking them if they wish to
|
|
||||||
" del the buffer
|
|
||||||
function! s:promptToRenameBuffer(bufnum, msg, newFileName)
|
|
||||||
echo a:msg
|
|
||||||
if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
|
|
||||||
let quotedFileName = "'" . a:newFileName . "'"
|
|
||||||
" 1. ensure that a new buffer is loaded
|
|
||||||
exec "badd " . quotedFileName
|
|
||||||
" 2. ensure that all windows which display the just deleted filename
|
|
||||||
" display a buffer for a new filename.
|
|
||||||
let s:originalTabNumber = tabpagenr()
|
|
||||||
let s:originalWindowNumber = winnr()
|
|
||||||
let editStr = g:NERDTreePath.New(a:newFileName).str({'format': 'Edit'})
|
|
||||||
exec "tabdo windo if winbufnr(0) == " . a:bufnum . " | exec ':e! " . editStr . "' | endif"
|
|
||||||
exec "tabnext " . s:originalTabNumber
|
|
||||||
exec s:originalWindowNumber . "wincmd w"
|
|
||||||
" 3. We don't need a previous buffer anymore
|
|
||||||
exec "bwipeout! " . a:bufnum
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
"FUNCTION: NERDTreeAddNode(){{{1
|
|
||||||
function! NERDTreeAddNode()
|
|
||||||
let curDirNode = g:NERDTreeDirNode.GetSelected()
|
|
||||||
|
|
||||||
let newNodeName = input("Add a childnode\n".
|
|
||||||
\ "==========================================================\n".
|
|
||||||
\ "Enter the dir/file name to be created. Dirs end with a '/'\n" .
|
|
||||||
\ "", curDirNode.path.str() . g:NERDTreePath.Slash(), "file")
|
|
||||||
|
|
||||||
if newNodeName ==# ''
|
|
||||||
call nerdtree#echo("Node Creation Aborted.")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
|
||||||
let newPath = g:NERDTreePath.Create(newNodeName)
|
|
||||||
let parentNode = b:NERDTree.root.findNode(newPath.getParent())
|
|
||||||
|
|
||||||
let newTreeNode = g:NERDTreeFileNode.New(newPath, b:NERDTree)
|
|
||||||
if empty(parentNode)
|
|
||||||
call b:NERDTree.root.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
elseif parentNode.isOpen || !empty(parentNode.children)
|
|
||||||
call parentNode.addChild(newTreeNode, 1)
|
|
||||||
call NERDTreeRender()
|
|
||||||
call newTreeNode.putCursorHere(1, 0)
|
|
||||||
endif
|
|
||||||
catch /^NERDTree/
|
|
||||||
call nerdtree#echoWarning("Node Not Created.")
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"FUNCTION: NERDTreeMoveNode(){{{1
|
|
||||||
function! NERDTreeMoveNode()
|
|
||||||
let curNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
let newNodePath = input("Rename the current node\n" .
|
|
||||||
\ "==========================================================\n" .
|
|
||||||
\ "Enter the new path for the node: \n" .
|
|
||||||
\ "", curNode.path.str(), "file")
|
|
||||||
|
|
||||||
if newNodePath ==# ''
|
|
||||||
call nerdtree#echo("Node Renaming Aborted.")
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
|
||||||
let bufnum = bufnr("^".curNode.path.str()."$")
|
|
||||||
|
|
||||||
call curNode.rename(newNodePath)
|
|
||||||
call NERDTreeRender()
|
|
||||||
|
|
||||||
"if the node is open in a buffer, ask the user if they want to
|
|
||||||
"close that buffer
|
|
||||||
if bufnum != -1
|
|
||||||
let prompt = "\nNode renamed.\n\nThe old file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Replace this buffer with a new file? (yN)"
|
|
||||||
call s:promptToRenameBuffer(bufnum, prompt, newNodePath)
|
|
||||||
endif
|
|
||||||
|
|
||||||
call curNode.putCursorHere(1, 0)
|
|
||||||
|
|
||||||
redraw
|
|
||||||
catch /^NERDTree/
|
|
||||||
call nerdtree#echoWarning("Node Not Renamed.")
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeDeleteNode() {{{1
|
|
||||||
function! NERDTreeDeleteNode()
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
let confirmed = 0
|
|
||||||
|
|
||||||
if currentNode.path.isDirectory
|
|
||||||
let choice =input("Delete the current node\n" .
|
|
||||||
\ "==========================================================\n" .
|
|
||||||
\ "STOP! To delete this entire directory, type 'yes'\n" .
|
|
||||||
\ "" . currentNode.path.str() . ": ")
|
|
||||||
let confirmed = choice ==# 'yes'
|
|
||||||
else
|
|
||||||
echo "Delete the current node\n" .
|
|
||||||
\ "==========================================================\n".
|
|
||||||
\ "Are you sure you wish to delete the node:\n" .
|
|
||||||
\ "" . currentNode.path.str() . " (yN):"
|
|
||||||
let choice = nr2char(getchar())
|
|
||||||
let confirmed = choice ==# 'y'
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
if confirmed
|
|
||||||
try
|
|
||||||
call currentNode.delete()
|
|
||||||
call NERDTreeRender()
|
|
||||||
|
|
||||||
"if the node is open in a buffer, ask the user if they want to
|
|
||||||
"close that buffer
|
|
||||||
let bufnum = bufnr("^".currentNode.path.str()."$")
|
|
||||||
if buflisted(bufnum)
|
|
||||||
let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? " (hidden)" : "") .". Delete this buffer? (yN)"
|
|
||||||
call s:promptToDelBuffer(bufnum, prompt)
|
|
||||||
endif
|
|
||||||
|
|
||||||
redraw
|
|
||||||
catch /^NERDTree/
|
|
||||||
call nerdtree#echoWarning("Could not remove node")
|
|
||||||
endtry
|
|
||||||
else
|
|
||||||
call nerdtree#echo("delete aborted")
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeListNode() {{{1
|
|
||||||
function! NERDTreeListNode()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if treenode != {}
|
|
||||||
let metadata = split(system('ls -ld ' . shellescape(treenode.path.str())), '\n')
|
|
||||||
call nerdtree#echo(metadata[0])
|
|
||||||
else
|
|
||||||
call nerdtree#echo("No information avaialable")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeListNodeWin32() {{{1
|
|
||||||
function! NERDTreeListNodeWin32()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if treenode != {}
|
|
||||||
let metadata = split(system('DIR /Q ' . shellescape(treenode.path.str()) . ' | FINDSTR "^[012][0-9]/[0-3][0-9]/[12][0-9][0-9][0-9]"'), '\n')
|
|
||||||
call nerdtree#echo(metadata[0])
|
|
||||||
else
|
|
||||||
call nerdtree#echo("No information avaialable")
|
|
||||||
endif
|
|
||||||
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeCopyNode() {{{1
|
|
||||||
function! NERDTreeCopyNode()
|
|
||||||
let currentNode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
let newNodePath = input("Copy the current node\n" .
|
|
||||||
\ "==========================================================\n" .
|
|
||||||
\ "Enter the new path to copy the node to: \n" .
|
|
||||||
\ "", currentNode.path.str(), "file")
|
|
||||||
|
|
||||||
if newNodePath != ""
|
|
||||||
"strip trailing slash
|
|
||||||
let newNodePath = substitute(newNodePath, '\/$', '', '')
|
|
||||||
|
|
||||||
let confirmed = 1
|
|
||||||
if currentNode.path.copyingWillOverwrite(newNodePath)
|
|
||||||
call nerdtree#echo("Warning: copying may overwrite files! Continue? (yN)")
|
|
||||||
let choice = nr2char(getchar())
|
|
||||||
let confirmed = choice ==# 'y'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if confirmed
|
|
||||||
try
|
|
||||||
let newNode = currentNode.copy(newNodePath)
|
|
||||||
if empty(newNode)
|
|
||||||
call b:NERDTree.root.refresh()
|
|
||||||
call b:NERDTree.render()
|
|
||||||
else
|
|
||||||
call NERDTreeRender()
|
|
||||||
call newNode.putCursorHere(0, 0)
|
|
||||||
endif
|
|
||||||
catch /^NERDTree/
|
|
||||||
call nerdtree#echoWarning("Could not copy node")
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call nerdtree#echo("Copy aborted.")
|
|
||||||
endif
|
|
||||||
redraw
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeQuickLook() {{{1
|
|
||||||
function! NERDTreeQuickLook()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if treenode != {}
|
|
||||||
call system("qlmanage -p 2>/dev/null '" . treenode.path.str() . "'")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeRevealInFinder() {{{1
|
|
||||||
function! NERDTreeRevealInFinder()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if treenode != {}
|
|
||||||
call system("open -R '" . treenode.path.str() . "'")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" FUNCTION: NERDTreeExecuteFile() {{{1
|
|
||||||
function! NERDTreeExecuteFile()
|
|
||||||
let treenode = g:NERDTreeFileNode.GetSelected()
|
|
||||||
if treenode != {}
|
|
||||||
call system("open '" . treenode.path.str() . "'")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,215 +0,0 @@
|
||||||
" ============================================================================
|
|
||||||
" File: NERD_tree.vim
|
|
||||||
" Maintainer: Martin Grenfell <martin.grenfell at gmail dot com>
|
|
||||||
" License: This program is free software. It comes without any warranty,
|
|
||||||
" to the extent permitted by applicable law. You can redistribute
|
|
||||||
" it and/or modify it under the terms of the Do What The Fuck You
|
|
||||||
" Want To Public License, Version 2, as published by Sam Hocevar.
|
|
||||||
" See http://sam.zoy.org/wtfpl/COPYING for more details.
|
|
||||||
"
|
|
||||||
" ============================================================================
|
|
||||||
"
|
|
||||||
" SECTION: Script init stuff {{{1
|
|
||||||
"============================================================
|
|
||||||
if exists("loaded_nerd_tree")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
if v:version < 700
|
|
||||||
echoerr "NERDTree: this plugin requires vim >= 7. DOWNLOAD IT! You'll thank me later!"
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let loaded_nerd_tree = 1
|
|
||||||
|
|
||||||
"for line continuation - i.e dont want C in &cpo
|
|
||||||
let s:old_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
"Function: s:initVariable() function {{{2
|
|
||||||
"This function is used to initialise a given variable to a given value. The
|
|
||||||
"variable is only initialised if it does not exist prior
|
|
||||||
"
|
|
||||||
"Args:
|
|
||||||
"var: the name of the var to be initialised
|
|
||||||
"value: the value to initialise var to
|
|
||||||
"
|
|
||||||
"Returns:
|
|
||||||
"1 if the var is set, 0 otherwise
|
|
||||||
function! s:initVariable(var, value)
|
|
||||||
if !exists(a:var)
|
|
||||||
exec 'let ' . a:var . ' = ' . "'" . substitute(a:value, "'", "''", "g") . "'"
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
"SECTION: Init variable calls and other random constants {{{2
|
|
||||||
call s:initVariable("g:NERDTreeAutoCenter", 1)
|
|
||||||
call s:initVariable("g:NERDTreeAutoCenterThreshold", 3)
|
|
||||||
call s:initVariable("g:NERDTreeCaseSensitiveSort", 0)
|
|
||||||
call s:initVariable("g:NERDTreeSortHiddenFirst", 1)
|
|
||||||
call s:initVariable("g:NERDTreeChDirMode", 0)
|
|
||||||
call s:initVariable("g:NERDTreeMinimalUI", 0)
|
|
||||||
if !exists("g:NERDTreeIgnore")
|
|
||||||
let g:NERDTreeIgnore = ['\~$']
|
|
||||||
endif
|
|
||||||
call s:initVariable("g:NERDTreeBookmarksFile", expand('$HOME') . '/.NERDTreeBookmarks')
|
|
||||||
call s:initVariable("g:NERDTreeBookmarksSort", 1)
|
|
||||||
call s:initVariable("g:NERDTreeHighlightCursorline", 1)
|
|
||||||
call s:initVariable("g:NERDTreeHijackNetrw", 1)
|
|
||||||
call s:initVariable("g:NERDTreeMouseMode", 1)
|
|
||||||
call s:initVariable("g:NERDTreeNotificationThreshold", 100)
|
|
||||||
call s:initVariable("g:NERDTreeQuitOnOpen", 0)
|
|
||||||
call s:initVariable("g:NERDTreeRespectWildIgnore", 0)
|
|
||||||
call s:initVariable("g:NERDTreeShowBookmarks", 0)
|
|
||||||
call s:initVariable("g:NERDTreeShowFiles", 1)
|
|
||||||
call s:initVariable("g:NERDTreeShowHidden", 0)
|
|
||||||
call s:initVariable("g:NERDTreeShowLineNumbers", 0)
|
|
||||||
call s:initVariable("g:NERDTreeSortDirs", 1)
|
|
||||||
|
|
||||||
if !nerdtree#runningWindows()
|
|
||||||
call s:initVariable("g:NERDTreeDirArrowExpandable", "▸")
|
|
||||||
call s:initVariable("g:NERDTreeDirArrowCollapsible", "▾")
|
|
||||||
else
|
|
||||||
call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
|
|
||||||
call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
|
|
||||||
endif
|
|
||||||
call s:initVariable("g:NERDTreeCascadeOpenSingleChildDir", 1)
|
|
||||||
|
|
||||||
if !exists("g:NERDTreeSortOrder")
|
|
||||||
let g:NERDTreeSortOrder = ['\/$', '*', '\.swp$', '\.bak$', '\~$']
|
|
||||||
else
|
|
||||||
"if there isnt a * in the sort sequence then add one
|
|
||||||
if count(g:NERDTreeSortOrder, '*') < 1
|
|
||||||
call add(g:NERDTreeSortOrder, '*')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('g:NERDTreeStatusline')
|
|
||||||
|
|
||||||
"the exists() crap here is a hack to stop vim spazzing out when
|
|
||||||
"loading a session that was created with an open nerd tree. It spazzes
|
|
||||||
"because it doesnt store b:NERDTree(its a b: var, and its a hash)
|
|
||||||
let g:NERDTreeStatusline = "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}"
|
|
||||||
|
|
||||||
endif
|
|
||||||
call s:initVariable("g:NERDTreeWinPos", "left")
|
|
||||||
call s:initVariable("g:NERDTreeWinSize", 31)
|
|
||||||
|
|
||||||
"init the shell commands that will be used to copy nodes, and remove dir trees
|
|
||||||
"
|
|
||||||
"Note: the space after the command is important
|
|
||||||
if nerdtree#runningWindows()
|
|
||||||
call s:initVariable("g:NERDTreeRemoveDirCmd", 'rmdir /s /q ')
|
|
||||||
else
|
|
||||||
call s:initVariable("g:NERDTreeRemoveDirCmd", 'rm -rf ')
|
|
||||||
call s:initVariable("g:NERDTreeCopyCmd", 'cp -r ')
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
"SECTION: Init variable calls for key mappings {{{2
|
|
||||||
call s:initVariable("g:NERDTreeMapActivateNode", "o")
|
|
||||||
call s:initVariable("g:NERDTreeMapChangeRoot", "C")
|
|
||||||
call s:initVariable("g:NERDTreeMapChdir", "cd")
|
|
||||||
call s:initVariable("g:NERDTreeMapCloseChildren", "X")
|
|
||||||
call s:initVariable("g:NERDTreeMapCloseDir", "x")
|
|
||||||
call s:initVariable("g:NERDTreeMapDeleteBookmark", "D")
|
|
||||||
call s:initVariable("g:NERDTreeMapMenu", "m")
|
|
||||||
call s:initVariable("g:NERDTreeMapHelp", "?")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpFirstChild", "K")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpLastChild", "J")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpNextSibling", "<C-j>")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpParent", "p")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpPrevSibling", "<C-k>")
|
|
||||||
call s:initVariable("g:NERDTreeMapJumpRoot", "P")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenExpl", "e")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenInTab", "t")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenInTabSilent", "T")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenRecursively", "O")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenSplit", "i")
|
|
||||||
call s:initVariable("g:NERDTreeMapOpenVSplit", "s")
|
|
||||||
call s:initVariable("g:NERDTreeMapPreview", "g" . NERDTreeMapActivateNode)
|
|
||||||
call s:initVariable("g:NERDTreeMapPreviewSplit", "g" . NERDTreeMapOpenSplit)
|
|
||||||
call s:initVariable("g:NERDTreeMapPreviewVSplit", "g" . NERDTreeMapOpenVSplit)
|
|
||||||
call s:initVariable("g:NERDTreeMapQuit", "q")
|
|
||||||
call s:initVariable("g:NERDTreeMapRefresh", "r")
|
|
||||||
call s:initVariable("g:NERDTreeMapRefreshRoot", "R")
|
|
||||||
call s:initVariable("g:NERDTreeMapToggleBookmarks", "B")
|
|
||||||
call s:initVariable("g:NERDTreeMapToggleFiles", "F")
|
|
||||||
call s:initVariable("g:NERDTreeMapToggleFilters", "f")
|
|
||||||
call s:initVariable("g:NERDTreeMapToggleHidden", "I")
|
|
||||||
call s:initVariable("g:NERDTreeMapToggleZoom", "A")
|
|
||||||
call s:initVariable("g:NERDTreeMapUpdir", "u")
|
|
||||||
call s:initVariable("g:NERDTreeMapUpdirKeepOpen", "U")
|
|
||||||
call s:initVariable("g:NERDTreeMapCWD", "CD")
|
|
||||||
|
|
||||||
"SECTION: Load class files{{{2
|
|
||||||
call nerdtree#loadClassFiles()
|
|
||||||
|
|
||||||
" SECTION: Commands {{{1
|
|
||||||
"============================================================
|
|
||||||
call nerdtree#ui_glue#setupCommands()
|
|
||||||
|
|
||||||
" SECTION: Auto commands {{{1
|
|
||||||
"============================================================
|
|
||||||
augroup NERDTree
|
|
||||||
"Save the cursor position whenever we close the nerd tree
|
|
||||||
exec "autocmd BufLeave ". g:NERDTreeCreator.BufNamePrefix() ."* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif"
|
|
||||||
|
|
||||||
"disallow insert mode in the NERDTree
|
|
||||||
exec "autocmd BufEnter ". g:NERDTreeCreator.BufNamePrefix() ."* stopinsert"
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
if g:NERDTreeHijackNetrw
|
|
||||||
augroup NERDTreeHijackNetrw
|
|
||||||
autocmd VimEnter * silent! autocmd! FileExplorer
|
|
||||||
au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand("<amatch>"))
|
|
||||||
augroup END
|
|
||||||
endif
|
|
||||||
|
|
||||||
" SECTION: Public API {{{1
|
|
||||||
"============================================================
|
|
||||||
function! NERDTreeAddMenuItem(options)
|
|
||||||
call g:NERDTreeMenuItem.Create(a:options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeAddMenuSeparator(...)
|
|
||||||
let opts = a:0 ? a:1 : {}
|
|
||||||
call g:NERDTreeMenuItem.CreateSeparator(opts)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeAddSubmenu(options)
|
|
||||||
return g:NERDTreeMenuItem.Create(a:options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeAddKeyMap(options)
|
|
||||||
call g:NERDTreeKeyMap.Create(a:options)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeRender()
|
|
||||||
call nerdtree#renderView()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeFocus()
|
|
||||||
if g:NERDTree.IsOpen()
|
|
||||||
call g:NERDTree.CursorToTreeWin()
|
|
||||||
else
|
|
||||||
call g:NERDTreeCreator.ToggleTabTree("")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeCWD()
|
|
||||||
call NERDTreeFocus()
|
|
||||||
call nerdtree#ui_glue#chRootCwd()
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! NERDTreeAddPathFilter(callback)
|
|
||||||
call g:NERDTree.AddPathFilter(a:callback)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" SECTION: Post Source Actions {{{1
|
|
||||||
call nerdtree#postSourceActions()
|
|
||||||
|
|
||||||
"reset &cpo back to users setting
|
|
||||||
let &cpo = s:old_cpo
|
|
||||||
|
|
||||||
" vim: set sw=4 sts=4 et fdm=marker:
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
let s:tree_up_dir_line = '.. (up a dir)'
|
|
||||||
syn match NERDTreeIgnore #\~#
|
|
||||||
syn match NERDTreeIgnore #\[RO\]#
|
|
||||||
|
|
||||||
"highlighting for the .. (up dir) line at the top of the tree
|
|
||||||
execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line ."#"
|
|
||||||
|
|
||||||
"quickhelp syntax elements
|
|
||||||
syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#ms=s+2,me=e-1
|
|
||||||
syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#ms=s+2,me=e-1
|
|
||||||
syn match NERDTreeHelpTitle #" .*\~#ms=s+2,me=e-1
|
|
||||||
syn match NERDTreeToggleOn #(on)#ms=s+1,he=e-1
|
|
||||||
syn match NERDTreeToggleOff #(off)#ms=e-3,me=e-1
|
|
||||||
syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3
|
|
||||||
syn match NERDTreeHelp #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeIgnore,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand
|
|
||||||
|
|
||||||
"highlighting for sym links
|
|
||||||
syn match NERDTreeLinkTarget #->.*# containedin=NERDTreeDir,NERDTreeFile
|
|
||||||
syn match NERDTreeLinkFile #.* ->#me=e-3 containedin=NERDTreeFile
|
|
||||||
syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir
|
|
||||||
|
|
||||||
"highlighing for directory nodes and file nodes
|
|
||||||
syn match NERDTreeDirSlash #/# containedin=NERDTreeDir
|
|
||||||
|
|
||||||
exec 'syn match NERDTreeClosable #'.escape(g:NERDTreeDirArrowCollapsible, '~').'# containedin=NERDTreeDir,NERDTreeFile'
|
|
||||||
exec 'syn match NERDTreeOpenable #'.escape(g:NERDTreeDirArrowExpandable, '~').'# containedin=NERDTreeDir,NERDTreeFile'
|
|
||||||
|
|
||||||
let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~').escape(g:NERDTreeDirArrowExpandable, '~')
|
|
||||||
exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#'
|
|
||||||
syn match NERDTreeExecFile #^ .*\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmark
|
|
||||||
exec 'syn match NERDTreeFile #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmark,NERDTreeExecFile'
|
|
||||||
|
|
||||||
"highlighting for readonly files
|
|
||||||
syn match NERDTreeRO # *\zs.*\ze \[RO\]# contains=NERDTreeIgnore,NERDTreeBookmark,NERDTreeFile
|
|
||||||
|
|
||||||
syn match NERDTreeFlags #^ *\zs\[.\]# containedin=NERDTreeFile,NERDTreeExecFile
|
|
||||||
syn match NERDTreeFlags #\[.\]# containedin=NERDTreeDir
|
|
||||||
|
|
||||||
syn match NERDTreeCWD #^[</].*$#
|
|
||||||
|
|
||||||
"highlighting for bookmarks
|
|
||||||
syn match NERDTreeBookmark # {.*}#hs=s+1
|
|
||||||
|
|
||||||
"highlighting for the bookmarks table
|
|
||||||
syn match NERDTreeBookmarksLeader #^>#
|
|
||||||
syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader
|
|
||||||
syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader
|
|
||||||
syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader
|
|
||||||
|
|
||||||
hi def link NERDTreePart Special
|
|
||||||
hi def link NERDTreePartFile Type
|
|
||||||
hi def link NERDTreeExecFile Title
|
|
||||||
hi def link NERDTreeDirSlash Identifier
|
|
||||||
|
|
||||||
hi def link NERDTreeBookmarksHeader statement
|
|
||||||
hi def link NERDTreeBookmarksLeader ignore
|
|
||||||
hi def link NERDTreeBookmarkName Identifier
|
|
||||||
hi def link NERDTreeBookmark normal
|
|
||||||
|
|
||||||
hi def link NERDTreeHelp String
|
|
||||||
hi def link NERDTreeHelpKey Identifier
|
|
||||||
hi def link NERDTreeHelpCommand Identifier
|
|
||||||
hi def link NERDTreeHelpTitle Macro
|
|
||||||
hi def link NERDTreeToggleOn Question
|
|
||||||
hi def link NERDTreeToggleOff WarningMsg
|
|
||||||
|
|
||||||
hi def link NERDTreeLinkTarget Type
|
|
||||||
hi def link NERDTreeLinkFile Macro
|
|
||||||
hi def link NERDTreeLinkDir Macro
|
|
||||||
|
|
||||||
hi def link NERDTreeDir Directory
|
|
||||||
hi def link NERDTreeUp Directory
|
|
||||||
hi def link NERDTreeFile Normal
|
|
||||||
hi def link NERDTreeCWD Statement
|
|
||||||
hi def link NERDTreeOpenable Title
|
|
||||||
hi def link NERDTreeClosable Title
|
|
||||||
hi def link NERDTreeIgnore ignore
|
|
||||||
hi def link NERDTreeRO WarningMsg
|
|
||||||
hi def link NERDTreeBookmark Statement
|
|
||||||
hi def link NERDTreeFlags Number
|
|
||||||
|
|
||||||
hi def link NERDTreeCurrentNode Search
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
# nginx syntax files for Vim.
|
|
||||||
|
|
||||||
*NOTE*: As of Dec. 2013, these scripts are maintained in the "contrib" directory of the Nginx source:
|
|
||||||
|
|
||||||
* http://hg.nginx.org/nginx/rev/f38043bd15f5
|
|
||||||
|
|
||||||
You can see the original vim.org version here:
|
|
||||||
|
|
||||||
* http://www.vim.org/scripts/script.php?script_id=1886
|
|
||||||
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
au BufRead,BufNewFile *.nginx set ft=nginx
|
|
||||||
au BufRead,BufNewFile */etc/nginx/* set ft=nginx
|
|
||||||
au BufRead,BufNewFile */usr/local/nginx/conf/* set ft=nginx
|
|
||||||
au BufRead,BufNewFile nginx.conf set ft=nginx
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
if exists("b:did_indent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let b:did_indent = 1
|
|
||||||
|
|
||||||
setlocal indentexpr=
|
|
||||||
|
|
||||||
" cindent actually works for nginx' simple file structure
|
|
||||||
setlocal cindent
|
|
||||||
" Just make sure that the comments are not reset as defs would be.
|
|
||||||
setlocal cinkeys-=0#
|
|
||||||
|
|
@ -1,703 +0,0 @@
|
||||||
" Vim syntax file
|
|
||||||
" Language: nginx.conf
|
|
||||||
|
|
||||||
if exists("b:current_syntax")
|
|
||||||
finish
|
|
||||||
end
|
|
||||||
|
|
||||||
setlocal iskeyword+=.
|
|
||||||
setlocal iskeyword+=/
|
|
||||||
setlocal iskeyword+=:
|
|
||||||
|
|
||||||
syn match ngxVariable '\$\(\w\+\|{\w\+}\)'
|
|
||||||
syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained
|
|
||||||
syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained
|
|
||||||
syn region ngxBlock start=+^+ end=+{+ skip=+\${+ contains=ngxComment,ngxDirectiveBlock,ngxVariableBlock,ngxString oneline
|
|
||||||
syn region ngxString start=+\z(["']\)+ end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString
|
|
||||||
syn match ngxComment ' *#.*$'
|
|
||||||
|
|
||||||
syn keyword ngxBoolean on
|
|
||||||
syn keyword ngxBoolean off
|
|
||||||
|
|
||||||
syn keyword ngxDirectiveBlock http contained
|
|
||||||
syn keyword ngxDirectiveBlock mail contained
|
|
||||||
syn keyword ngxDirectiveBlock events contained
|
|
||||||
syn keyword ngxDirectiveBlock server contained
|
|
||||||
syn keyword ngxDirectiveBlock types contained
|
|
||||||
syn keyword ngxDirectiveBlock location contained
|
|
||||||
syn keyword ngxDirectiveBlock upstream contained
|
|
||||||
syn keyword ngxDirectiveBlock charset_map contained
|
|
||||||
syn keyword ngxDirectiveBlock limit_except contained
|
|
||||||
syn keyword ngxDirectiveBlock if contained
|
|
||||||
syn keyword ngxDirectiveBlock geo contained
|
|
||||||
syn keyword ngxDirectiveBlock map contained
|
|
||||||
|
|
||||||
syn keyword ngxDirectiveImportant include
|
|
||||||
syn keyword ngxDirectiveImportant root
|
|
||||||
syn keyword ngxDirectiveImportant server
|
|
||||||
syn keyword ngxDirectiveImportant server_name
|
|
||||||
syn keyword ngxDirectiveImportant listen
|
|
||||||
syn keyword ngxDirectiveImportant internal
|
|
||||||
syn keyword ngxDirectiveImportant proxy_pass
|
|
||||||
syn keyword ngxDirectiveImportant memcached_pass
|
|
||||||
syn keyword ngxDirectiveImportant fastcgi_pass
|
|
||||||
syn keyword ngxDirectiveImportant try_files
|
|
||||||
|
|
||||||
syn keyword ngxDirectiveControl break
|
|
||||||
syn keyword ngxDirectiveControl return
|
|
||||||
syn keyword ngxDirectiveControl rewrite
|
|
||||||
syn keyword ngxDirectiveControl set
|
|
||||||
|
|
||||||
syn keyword ngxDirectiveError error_page
|
|
||||||
syn keyword ngxDirectiveError post_action
|
|
||||||
|
|
||||||
syn keyword ngxDirectiveDeprecated connections
|
|
||||||
syn keyword ngxDirectiveDeprecated imap
|
|
||||||
syn keyword ngxDirectiveDeprecated open_file_cache_retest
|
|
||||||
syn keyword ngxDirectiveDeprecated optimize_server_names
|
|
||||||
syn keyword ngxDirectiveDeprecated satisfy_any
|
|
||||||
|
|
||||||
syn keyword ngxDirective accept_mutex
|
|
||||||
syn keyword ngxDirective accept_mutex_delay
|
|
||||||
syn keyword ngxDirective access_log
|
|
||||||
syn keyword ngxDirective add_after_body
|
|
||||||
syn keyword ngxDirective add_before_body
|
|
||||||
syn keyword ngxDirective add_header
|
|
||||||
syn keyword ngxDirective addition_types
|
|
||||||
syn keyword ngxDirective aio
|
|
||||||
syn keyword ngxDirective alias
|
|
||||||
syn keyword ngxDirective allow
|
|
||||||
syn keyword ngxDirective ancient_browser
|
|
||||||
syn keyword ngxDirective ancient_browser_value
|
|
||||||
syn keyword ngxDirective auth_basic
|
|
||||||
syn keyword ngxDirective auth_basic_user_file
|
|
||||||
syn keyword ngxDirective auth_http
|
|
||||||
syn keyword ngxDirective auth_http_header
|
|
||||||
syn keyword ngxDirective auth_http_timeout
|
|
||||||
syn keyword ngxDirective autoindex
|
|
||||||
syn keyword ngxDirective autoindex_exact_size
|
|
||||||
syn keyword ngxDirective autoindex_localtime
|
|
||||||
syn keyword ngxDirective charset
|
|
||||||
syn keyword ngxDirective charset_types
|
|
||||||
syn keyword ngxDirective client_body_buffer_size
|
|
||||||
syn keyword ngxDirective client_body_in_file_only
|
|
||||||
syn keyword ngxDirective client_body_in_single_buffer
|
|
||||||
syn keyword ngxDirective client_body_temp_path
|
|
||||||
syn keyword ngxDirective client_body_timeout
|
|
||||||
syn keyword ngxDirective client_header_buffer_size
|
|
||||||
syn keyword ngxDirective client_header_timeout
|
|
||||||
syn keyword ngxDirective client_max_body_size
|
|
||||||
syn keyword ngxDirective connection_pool_size
|
|
||||||
syn keyword ngxDirective create_full_put_path
|
|
||||||
syn keyword ngxDirective daemon
|
|
||||||
syn keyword ngxDirective dav_access
|
|
||||||
syn keyword ngxDirective dav_methods
|
|
||||||
syn keyword ngxDirective debug_connection
|
|
||||||
syn keyword ngxDirective debug_points
|
|
||||||
syn keyword ngxDirective default_type
|
|
||||||
syn keyword ngxDirective degradation
|
|
||||||
syn keyword ngxDirective degrade
|
|
||||||
syn keyword ngxDirective deny
|
|
||||||
syn keyword ngxDirective devpoll_changes
|
|
||||||
syn keyword ngxDirective devpoll_events
|
|
||||||
syn keyword ngxDirective directio
|
|
||||||
syn keyword ngxDirective directio_alignment
|
|
||||||
syn keyword ngxDirective empty_gif
|
|
||||||
syn keyword ngxDirective env
|
|
||||||
syn keyword ngxDirective epoll_events
|
|
||||||
syn keyword ngxDirective error_log
|
|
||||||
syn keyword ngxDirective eventport_events
|
|
||||||
syn keyword ngxDirective expires
|
|
||||||
syn keyword ngxDirective fastcgi_bind
|
|
||||||
syn keyword ngxDirective fastcgi_buffer_size
|
|
||||||
syn keyword ngxDirective fastcgi_buffers
|
|
||||||
syn keyword ngxDirective fastcgi_busy_buffers_size
|
|
||||||
syn keyword ngxDirective fastcgi_cache
|
|
||||||
syn keyword ngxDirective fastcgi_cache_key
|
|
||||||
syn keyword ngxDirective fastcgi_cache_methods
|
|
||||||
syn keyword ngxDirective fastcgi_cache_min_uses
|
|
||||||
syn keyword ngxDirective fastcgi_cache_path
|
|
||||||
syn keyword ngxDirective fastcgi_cache_use_stale
|
|
||||||
syn keyword ngxDirective fastcgi_cache_valid
|
|
||||||
syn keyword ngxDirective fastcgi_catch_stderr
|
|
||||||
syn keyword ngxDirective fastcgi_connect_timeout
|
|
||||||
syn keyword ngxDirective fastcgi_hide_header
|
|
||||||
syn keyword ngxDirective fastcgi_ignore_client_abort
|
|
||||||
syn keyword ngxDirective fastcgi_ignore_headers
|
|
||||||
syn keyword ngxDirective fastcgi_index
|
|
||||||
syn keyword ngxDirective fastcgi_intercept_errors
|
|
||||||
syn keyword ngxDirective fastcgi_max_temp_file_size
|
|
||||||
syn keyword ngxDirective fastcgi_next_upstream
|
|
||||||
syn keyword ngxDirective fastcgi_param
|
|
||||||
syn keyword ngxDirective fastcgi_pass_header
|
|
||||||
syn keyword ngxDirective fastcgi_pass_request_body
|
|
||||||
syn keyword ngxDirective fastcgi_pass_request_headers
|
|
||||||
syn keyword ngxDirective fastcgi_read_timeout
|
|
||||||
syn keyword ngxDirective fastcgi_send_lowat
|
|
||||||
syn keyword ngxDirective fastcgi_send_timeout
|
|
||||||
syn keyword ngxDirective fastcgi_split_path_info
|
|
||||||
syn keyword ngxDirective fastcgi_store
|
|
||||||
syn keyword ngxDirective fastcgi_store_access
|
|
||||||
syn keyword ngxDirective fastcgi_temp_file_write_size
|
|
||||||
syn keyword ngxDirective fastcgi_temp_path
|
|
||||||
syn keyword ngxDirective fastcgi_upstream_fail_timeout
|
|
||||||
syn keyword ngxDirective fastcgi_upstream_max_fails
|
|
||||||
syn keyword ngxDirective flv
|
|
||||||
syn keyword ngxDirective geoip_city
|
|
||||||
syn keyword ngxDirective geoip_country
|
|
||||||
syn keyword ngxDirective google_perftools_profiles
|
|
||||||
syn keyword ngxDirective gzip
|
|
||||||
syn keyword ngxDirective gzip_buffers
|
|
||||||
syn keyword ngxDirective gzip_comp_level
|
|
||||||
syn keyword ngxDirective gzip_disable
|
|
||||||
syn keyword ngxDirective gzip_hash
|
|
||||||
syn keyword ngxDirective gzip_http_version
|
|
||||||
syn keyword ngxDirective gzip_min_length
|
|
||||||
syn keyword ngxDirective gzip_no_buffer
|
|
||||||
syn keyword ngxDirective gzip_proxied
|
|
||||||
syn keyword ngxDirective gzip_static
|
|
||||||
syn keyword ngxDirective gzip_types
|
|
||||||
syn keyword ngxDirective gzip_vary
|
|
||||||
syn keyword ngxDirective gzip_window
|
|
||||||
syn keyword ngxDirective if_modified_since
|
|
||||||
syn keyword ngxDirective ignore_invalid_headers
|
|
||||||
syn keyword ngxDirective image_filter
|
|
||||||
syn keyword ngxDirective image_filter_buffer
|
|
||||||
syn keyword ngxDirective image_filter_jpeg_quality
|
|
||||||
syn keyword ngxDirective image_filter_transparency
|
|
||||||
syn keyword ngxDirective imap_auth
|
|
||||||
syn keyword ngxDirective imap_capabilities
|
|
||||||
syn keyword ngxDirective imap_client_buffer
|
|
||||||
syn keyword ngxDirective index
|
|
||||||
syn keyword ngxDirective ip_hash
|
|
||||||
syn keyword ngxDirective keepalive_requests
|
|
||||||
syn keyword ngxDirective keepalive_timeout
|
|
||||||
syn keyword ngxDirective kqueue_changes
|
|
||||||
syn keyword ngxDirective kqueue_events
|
|
||||||
syn keyword ngxDirective large_client_header_buffers
|
|
||||||
syn keyword ngxDirective limit_conn
|
|
||||||
syn keyword ngxDirective limit_conn_log_level
|
|
||||||
syn keyword ngxDirective limit_rate
|
|
||||||
syn keyword ngxDirective limit_rate_after
|
|
||||||
syn keyword ngxDirective limit_req
|
|
||||||
syn keyword ngxDirective limit_req_log_level
|
|
||||||
syn keyword ngxDirective limit_req_zone
|
|
||||||
syn keyword ngxDirective limit_zone
|
|
||||||
syn keyword ngxDirective lingering_time
|
|
||||||
syn keyword ngxDirective lingering_timeout
|
|
||||||
syn keyword ngxDirective lock_file
|
|
||||||
syn keyword ngxDirective log_format
|
|
||||||
syn keyword ngxDirective log_not_found
|
|
||||||
syn keyword ngxDirective log_subrequest
|
|
||||||
syn keyword ngxDirective map_hash_bucket_size
|
|
||||||
syn keyword ngxDirective map_hash_max_size
|
|
||||||
syn keyword ngxDirective master_process
|
|
||||||
syn keyword ngxDirective memcached_bind
|
|
||||||
syn keyword ngxDirective memcached_buffer_size
|
|
||||||
syn keyword ngxDirective memcached_connect_timeout
|
|
||||||
syn keyword ngxDirective memcached_next_upstream
|
|
||||||
syn keyword ngxDirective memcached_read_timeout
|
|
||||||
syn keyword ngxDirective memcached_send_timeout
|
|
||||||
syn keyword ngxDirective memcached_upstream_fail_timeout
|
|
||||||
syn keyword ngxDirective memcached_upstream_max_fails
|
|
||||||
syn keyword ngxDirective merge_slashes
|
|
||||||
syn keyword ngxDirective min_delete_depth
|
|
||||||
syn keyword ngxDirective modern_browser
|
|
||||||
syn keyword ngxDirective modern_browser_value
|
|
||||||
syn keyword ngxDirective msie_padding
|
|
||||||
syn keyword ngxDirective msie_refresh
|
|
||||||
syn keyword ngxDirective multi_accept
|
|
||||||
syn keyword ngxDirective open_file_cache
|
|
||||||
syn keyword ngxDirective open_file_cache_errors
|
|
||||||
syn keyword ngxDirective open_file_cache_events
|
|
||||||
syn keyword ngxDirective open_file_cache_min_uses
|
|
||||||
syn keyword ngxDirective open_file_cache_valid
|
|
||||||
syn keyword ngxDirective open_log_file_cache
|
|
||||||
syn keyword ngxDirective output_buffers
|
|
||||||
syn keyword ngxDirective override_charset
|
|
||||||
syn keyword ngxDirective perl
|
|
||||||
syn keyword ngxDirective perl_modules
|
|
||||||
syn keyword ngxDirective perl_require
|
|
||||||
syn keyword ngxDirective perl_set
|
|
||||||
syn keyword ngxDirective pid
|
|
||||||
syn keyword ngxDirective pop3_auth
|
|
||||||
syn keyword ngxDirective pop3_capabilities
|
|
||||||
syn keyword ngxDirective port_in_redirect
|
|
||||||
syn keyword ngxDirective postpone_gzipping
|
|
||||||
syn keyword ngxDirective postpone_output
|
|
||||||
syn keyword ngxDirective protocol
|
|
||||||
syn keyword ngxDirective proxy
|
|
||||||
syn keyword ngxDirective proxy_bind
|
|
||||||
syn keyword ngxDirective proxy_buffer
|
|
||||||
syn keyword ngxDirective proxy_buffer_size
|
|
||||||
syn keyword ngxDirective proxy_buffering
|
|
||||||
syn keyword ngxDirective proxy_buffers
|
|
||||||
syn keyword ngxDirective proxy_busy_buffers_size
|
|
||||||
syn keyword ngxDirective proxy_cache
|
|
||||||
syn keyword ngxDirective proxy_cache_key
|
|
||||||
syn keyword ngxDirective proxy_cache_methods
|
|
||||||
syn keyword ngxDirective proxy_cache_min_uses
|
|
||||||
syn keyword ngxDirective proxy_cache_path
|
|
||||||
syn keyword ngxDirective proxy_cache_use_stale
|
|
||||||
syn keyword ngxDirective proxy_cache_valid
|
|
||||||
syn keyword ngxDirective proxy_connect_timeout
|
|
||||||
syn keyword ngxDirective proxy_headers_hash_bucket_size
|
|
||||||
syn keyword ngxDirective proxy_headers_hash_max_size
|
|
||||||
syn keyword ngxDirective proxy_hide_header
|
|
||||||
syn keyword ngxDirective proxy_ignore_client_abort
|
|
||||||
syn keyword ngxDirective proxy_ignore_headers
|
|
||||||
syn keyword ngxDirective proxy_intercept_errors
|
|
||||||
syn keyword ngxDirective proxy_max_temp_file_size
|
|
||||||
syn keyword ngxDirective proxy_method
|
|
||||||
syn keyword ngxDirective proxy_next_upstream
|
|
||||||
syn keyword ngxDirective proxy_pass_error_message
|
|
||||||
syn keyword ngxDirective proxy_pass_header
|
|
||||||
syn keyword ngxDirective proxy_pass_request_body
|
|
||||||
syn keyword ngxDirective proxy_pass_request_headers
|
|
||||||
syn keyword ngxDirective proxy_read_timeout
|
|
||||||
syn keyword ngxDirective proxy_redirect
|
|
||||||
syn keyword ngxDirective proxy_send_lowat
|
|
||||||
syn keyword ngxDirective proxy_send_timeout
|
|
||||||
syn keyword ngxDirective proxy_set_body
|
|
||||||
syn keyword ngxDirective proxy_set_header
|
|
||||||
syn keyword ngxDirective proxy_ssl_session_reuse
|
|
||||||
syn keyword ngxDirective proxy_store
|
|
||||||
syn keyword ngxDirective proxy_store_access
|
|
||||||
syn keyword ngxDirective proxy_temp_file_write_size
|
|
||||||
syn keyword ngxDirective proxy_temp_path
|
|
||||||
syn keyword ngxDirective proxy_timeout
|
|
||||||
syn keyword ngxDirective proxy_upstream_fail_timeout
|
|
||||||
syn keyword ngxDirective proxy_upstream_max_fails
|
|
||||||
syn keyword ngxDirective random_index
|
|
||||||
syn keyword ngxDirective read_ahead
|
|
||||||
syn keyword ngxDirective real_ip_header
|
|
||||||
syn keyword ngxDirective recursive_error_pages
|
|
||||||
syn keyword ngxDirective request_pool_size
|
|
||||||
syn keyword ngxDirective reset_timedout_connection
|
|
||||||
syn keyword ngxDirective resolver
|
|
||||||
syn keyword ngxDirective resolver_timeout
|
|
||||||
syn keyword ngxDirective rewrite_log
|
|
||||||
syn keyword ngxDirective rtsig_overflow_events
|
|
||||||
syn keyword ngxDirective rtsig_overflow_test
|
|
||||||
syn keyword ngxDirective rtsig_overflow_threshold
|
|
||||||
syn keyword ngxDirective rtsig_signo
|
|
||||||
syn keyword ngxDirective satisfy
|
|
||||||
syn keyword ngxDirective secure_link_secret
|
|
||||||
syn keyword ngxDirective send_lowat
|
|
||||||
syn keyword ngxDirective send_timeout
|
|
||||||
syn keyword ngxDirective sendfile
|
|
||||||
syn keyword ngxDirective sendfile_max_chunk
|
|
||||||
syn keyword ngxDirective server_name_in_redirect
|
|
||||||
syn keyword ngxDirective server_names_hash_bucket_size
|
|
||||||
syn keyword ngxDirective server_names_hash_max_size
|
|
||||||
syn keyword ngxDirective server_tokens
|
|
||||||
syn keyword ngxDirective set_real_ip_from
|
|
||||||
syn keyword ngxDirective smtp_auth
|
|
||||||
syn keyword ngxDirective smtp_capabilities
|
|
||||||
syn keyword ngxDirective smtp_client_buffer
|
|
||||||
syn keyword ngxDirective smtp_greeting_delay
|
|
||||||
syn keyword ngxDirective so_keepalive
|
|
||||||
syn keyword ngxDirective source_charset
|
|
||||||
syn keyword ngxDirective ssi
|
|
||||||
syn keyword ngxDirective ssi_ignore_recycled_buffers
|
|
||||||
syn keyword ngxDirective ssi_min_file_chunk
|
|
||||||
syn keyword ngxDirective ssi_silent_errors
|
|
||||||
syn keyword ngxDirective ssi_types
|
|
||||||
syn keyword ngxDirective ssi_value_length
|
|
||||||
syn keyword ngxDirective ssl
|
|
||||||
syn keyword ngxDirective ssl_certificate
|
|
||||||
syn keyword ngxDirective ssl_certificate_key
|
|
||||||
syn keyword ngxDirective ssl_ciphers
|
|
||||||
syn keyword ngxDirective ssl_client_certificate
|
|
||||||
syn keyword ngxDirective ssl_crl
|
|
||||||
syn keyword ngxDirective ssl_dhparam
|
|
||||||
syn keyword ngxDirective ssl_engine
|
|
||||||
syn keyword ngxDirective ssl_prefer_server_ciphers
|
|
||||||
syn keyword ngxDirective ssl_protocols
|
|
||||||
syn keyword ngxDirective ssl_session_cache
|
|
||||||
syn keyword ngxDirective ssl_session_timeout
|
|
||||||
syn keyword ngxDirective ssl_verify_client
|
|
||||||
syn keyword ngxDirective ssl_verify_depth
|
|
||||||
syn keyword ngxDirective starttls
|
|
||||||
syn keyword ngxDirective stub_status
|
|
||||||
syn keyword ngxDirective sub_filter
|
|
||||||
syn keyword ngxDirective sub_filter_once
|
|
||||||
syn keyword ngxDirective sub_filter_types
|
|
||||||
syn keyword ngxDirective tcp_nodelay
|
|
||||||
syn keyword ngxDirective tcp_nopush
|
|
||||||
syn keyword ngxDirective thread_stack_size
|
|
||||||
syn keyword ngxDirective timeout
|
|
||||||
syn keyword ngxDirective timer_resolution
|
|
||||||
syn keyword ngxDirective types_hash_bucket_size
|
|
||||||
syn keyword ngxDirective types_hash_max_size
|
|
||||||
syn keyword ngxDirective underscores_in_headers
|
|
||||||
syn keyword ngxDirective uninitialized_variable_warn
|
|
||||||
syn keyword ngxDirective use
|
|
||||||
syn keyword ngxDirective user
|
|
||||||
syn keyword ngxDirective userid
|
|
||||||
syn keyword ngxDirective userid_domain
|
|
||||||
syn keyword ngxDirective userid_expires
|
|
||||||
syn keyword ngxDirective userid_mark
|
|
||||||
syn keyword ngxDirective userid_name
|
|
||||||
syn keyword ngxDirective userid_p3p
|
|
||||||
syn keyword ngxDirective userid_path
|
|
||||||
syn keyword ngxDirective userid_service
|
|
||||||
syn keyword ngxDirective valid_referers
|
|
||||||
syn keyword ngxDirective variables_hash_bucket_size
|
|
||||||
syn keyword ngxDirective variables_hash_max_size
|
|
||||||
syn keyword ngxDirective worker_connections
|
|
||||||
syn keyword ngxDirective worker_cpu_affinity
|
|
||||||
syn keyword ngxDirective worker_priority
|
|
||||||
syn keyword ngxDirective worker_processes
|
|
||||||
syn keyword ngxDirective worker_rlimit_core
|
|
||||||
syn keyword ngxDirective worker_rlimit_nofile
|
|
||||||
syn keyword ngxDirective worker_rlimit_sigpending
|
|
||||||
syn keyword ngxDirective worker_threads
|
|
||||||
syn keyword ngxDirective working_directory
|
|
||||||
syn keyword ngxDirective xclient
|
|
||||||
syn keyword ngxDirective xml_entities
|
|
||||||
syn keyword ngxDirective xslt_stylesheet
|
|
||||||
syn keyword ngxDirective xslt_types
|
|
||||||
|
|
||||||
" 3rd party module list:
|
|
||||||
" http://wiki.nginx.org/Nginx3rdPartyModules
|
|
||||||
|
|
||||||
" Accept Language Module <http://wiki.nginx.org/NginxAcceptLanguageModule>
|
|
||||||
" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.
|
|
||||||
syn keyword ngxDirectiveThirdParty set_from_accept_language
|
|
||||||
|
|
||||||
" Access Key Module <http://wiki.nginx.org/NginxHttpAccessKeyModule>
|
|
||||||
" Denies access unless the request URL contains an access key.
|
|
||||||
syn keyword ngxDirectiveThirdParty accesskey
|
|
||||||
syn keyword ngxDirectiveThirdParty accesskey_arg
|
|
||||||
syn keyword ngxDirectiveThirdParty accesskey_hashmethod
|
|
||||||
syn keyword ngxDirectiveThirdParty accesskey_signature
|
|
||||||
|
|
||||||
" Auth PAM Module <http://web.iti.upv.es/~sto/nginx/>
|
|
||||||
" HTTP Basic Authentication using PAM.
|
|
||||||
syn keyword ngxDirectiveThirdParty auth_pam
|
|
||||||
syn keyword ngxDirectiveThirdParty auth_pam_service_name
|
|
||||||
|
|
||||||
" Cache Purge Module <http://labs.frickle.com/nginx_ngx_cache_purge/>
|
|
||||||
" Module adding ability to purge content from FastCGI and proxy caches.
|
|
||||||
syn keyword ngxDirectiveThirdParty fastcgi_cache_purge
|
|
||||||
syn keyword ngxDirectiveThirdParty proxy_cache_purge
|
|
||||||
|
|
||||||
" Chunkin Module <http://wiki.nginx.org/NginxHttpChunkinModule>
|
|
||||||
" HTTP 1.1 chunked-encoding request body support for Nginx.
|
|
||||||
syn keyword ngxDirectiveThirdParty chunkin
|
|
||||||
syn keyword ngxDirectiveThirdParty chunkin_keepalive
|
|
||||||
syn keyword ngxDirectiveThirdParty chunkin_max_chunks_per_buf
|
|
||||||
syn keyword ngxDirectiveThirdParty chunkin_resume
|
|
||||||
|
|
||||||
" Circle GIF Module <http://wiki.nginx.org/NginxHttpCircleGifModule>
|
|
||||||
" Generates simple circle images with the colors and size specified in the URL.
|
|
||||||
syn keyword ngxDirectiveThirdParty circle_gif
|
|
||||||
syn keyword ngxDirectiveThirdParty circle_gif_max_radius
|
|
||||||
syn keyword ngxDirectiveThirdParty circle_gif_min_radius
|
|
||||||
syn keyword ngxDirectiveThirdParty circle_gif_step_radius
|
|
||||||
|
|
||||||
" Drizzle Module <http://github.com/chaoslawful/drizzle-nginx-module>
|
|
||||||
" Make nginx talk directly to mysql, drizzle, and sqlite3 by libdrizzle.
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_connect_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_dbname
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_keepalive
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_module_header
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_query
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty drizzle_server
|
|
||||||
|
|
||||||
" Echo Module <http://wiki.nginx.org/NginxHttpEchoModule>
|
|
||||||
" Brings 'echo', 'sleep', 'time', 'exec' and more shell-style goodies to Nginx config file.
|
|
||||||
syn keyword ngxDirectiveThirdParty echo
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_after_body
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_before_body
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_blocking_sleep
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_duplicate
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_end
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_exec
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_flush
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_foreach_split
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_location
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_location_async
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_read_request_body
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_request_body
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_reset_timer
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_sleep
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_subrequest
|
|
||||||
syn keyword ngxDirectiveThirdParty echo_subrequest_async
|
|
||||||
|
|
||||||
" Events Module <http://docs.dutov.org/nginx_modules_events_en.html>
|
|
||||||
" Privides options for start/stop events.
|
|
||||||
syn keyword ngxDirectiveThirdParty on_start
|
|
||||||
syn keyword ngxDirectiveThirdParty on_stop
|
|
||||||
|
|
||||||
" EY Balancer Module <http://github.com/ry/nginx-ey-balancer>
|
|
||||||
" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream.
|
|
||||||
syn keyword ngxDirectiveThirdParty max_connections
|
|
||||||
syn keyword ngxDirectiveThirdParty max_connections_max_queue_length
|
|
||||||
syn keyword ngxDirectiveThirdParty max_connections_queue_timeout
|
|
||||||
|
|
||||||
" Fancy Indexes Module <https://connectical.com/projects/ngx-fancyindex/wiki>
|
|
||||||
" Like the built-in autoindex module, but fancier.
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_exact_size
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_footer
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_header
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_localtime
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_readme
|
|
||||||
syn keyword ngxDirectiveThirdParty fancyindex_readme_mode
|
|
||||||
|
|
||||||
" GeoIP Module (DEPRECATED) <http://wiki.nginx.org/NginxHttp3rdPartyGeoIPModule>
|
|
||||||
" Country code lookups via the MaxMind GeoIP API.
|
|
||||||
syn keyword ngxDirectiveThirdParty geoip_country_file
|
|
||||||
|
|
||||||
" Headers More Module <http://wiki.nginx.org/NginxHttpHeadersMoreModule>
|
|
||||||
" Set and clear input and output headers...more than "add"!
|
|
||||||
syn keyword ngxDirectiveThirdParty more_clear_headers
|
|
||||||
syn keyword ngxDirectiveThirdParty more_clear_input_headers
|
|
||||||
syn keyword ngxDirectiveThirdParty more_set_headers
|
|
||||||
syn keyword ngxDirectiveThirdParty more_set_input_headers
|
|
||||||
|
|
||||||
" HTTP Push Module <http://pushmodule.slact.net/>
|
|
||||||
" Turn Nginx into an adept long-polling HTTP Push (Comet) server.
|
|
||||||
syn keyword ngxDirectiveThirdParty push_buffer_size
|
|
||||||
syn keyword ngxDirectiveThirdParty push_listener
|
|
||||||
syn keyword ngxDirectiveThirdParty push_message_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty push_queue_messages
|
|
||||||
syn keyword ngxDirectiveThirdParty push_sender
|
|
||||||
|
|
||||||
" HTTP Redis Module <http://people.FreeBSD.ORG/~osa/ngx_http_redis-0.3.1.tar.gz>>
|
|
||||||
" Redis <http://code.google.com/p/redis/> support.>
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_bind
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_buffer_size
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_connect_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_next_upstream
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_read_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty redis_send_timeout
|
|
||||||
|
|
||||||
" HTTP JavaScript Module <http://wiki.github.com/kung-fu-tzu/ngx_http_js_module>
|
|
||||||
" Embedding SpiderMonkey. Nearly full port on Perl module.
|
|
||||||
syn keyword ngxDirectiveThirdParty js
|
|
||||||
syn keyword ngxDirectiveThirdParty js_filter
|
|
||||||
syn keyword ngxDirectiveThirdParty js_filter_types
|
|
||||||
syn keyword ngxDirectiveThirdParty js_load
|
|
||||||
syn keyword ngxDirectiveThirdParty js_maxmem
|
|
||||||
syn keyword ngxDirectiveThirdParty js_require
|
|
||||||
syn keyword ngxDirectiveThirdParty js_set
|
|
||||||
syn keyword ngxDirectiveThirdParty js_utf8
|
|
||||||
|
|
||||||
" Log Request Speed <http://wiki.nginx.org/NginxHttpLogRequestSpeed>
|
|
||||||
" Log the time it took to process each request.
|
|
||||||
syn keyword ngxDirectiveThirdParty log_request_speed_filter
|
|
||||||
syn keyword ngxDirectiveThirdParty log_request_speed_filter_timeout
|
|
||||||
|
|
||||||
" Memc Module <http://wiki.nginx.org/NginxHttpMemcModule>
|
|
||||||
" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_buffer_size
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_cmds_allowed
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_connect_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_next_upstream
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_read_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_send_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty memc_upstream_max_fails
|
|
||||||
|
|
||||||
" Mogilefs Module <http://www.grid.net.ru/nginx/mogilefs.en.html>
|
|
||||||
" Implements a MogileFS client, provides a replace to the Perlbal reverse proxy of the original MogileFS.
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_domain
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_methods
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_noverify
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_read_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_send_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty mogilefs_tracker
|
|
||||||
|
|
||||||
" MP4 Streaming Lite Module <http://wiki.nginx.org/NginxMP4StreamingLite>
|
|
||||||
" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL.
|
|
||||||
syn keyword ngxDirectiveThirdParty mp4
|
|
||||||
|
|
||||||
" Nginx Notice Module <http://xph.us/software/nginx-notice/>
|
|
||||||
" Serve static file to POST requests.
|
|
||||||
syn keyword ngxDirectiveThirdParty notice
|
|
||||||
syn keyword ngxDirectiveThirdParty notice_type
|
|
||||||
|
|
||||||
" Phusion Passenger <http://www.modrails.com/documentation.html>
|
|
||||||
" Easy and robust deployment of Ruby on Rails application on Apache and Nginx webservers.
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_base_uri
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_default_user
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_enabled
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_log_level
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_max_pool_size
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_pool_idle_time
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_root
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_ruby
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_use_global_queue
|
|
||||||
syn keyword ngxDirectiveThirdParty passenger_user_switching
|
|
||||||
syn keyword ngxDirectiveThirdParty rack_env
|
|
||||||
syn keyword ngxDirectiveThirdParty rails_app_spawner_idle_time
|
|
||||||
syn keyword ngxDirectiveThirdParty rails_env
|
|
||||||
syn keyword ngxDirectiveThirdParty rails_framework_spawner_idle_time
|
|
||||||
syn keyword ngxDirectiveThirdParty rails_spawn_method
|
|
||||||
|
|
||||||
" RDS JSON Module <http://github.com/agentzh/rds-json-nginx-module>
|
|
||||||
" Help ngx_drizzle and other DBD modules emit JSON data.
|
|
||||||
syn keyword ngxDirectiveThirdParty rds_json
|
|
||||||
syn keyword ngxDirectiveThirdParty rds_json_content_type
|
|
||||||
syn keyword ngxDirectiveThirdParty rds_json_format
|
|
||||||
syn keyword ngxDirectiveThirdParty rds_json_ret
|
|
||||||
|
|
||||||
" RRD Graph Module <http://wiki.nginx.org/NginxNgx_rrd_graph>
|
|
||||||
" This module provides an HTTP interface to RRDtool's graphing facilities.
|
|
||||||
syn keyword ngxDirectiveThirdParty rrd_graph
|
|
||||||
syn keyword ngxDirectiveThirdParty rrd_graph_root
|
|
||||||
|
|
||||||
" Secure Download <http://wiki.nginx.org/NginxHttpSecureDownload>
|
|
||||||
" Create expiring links.
|
|
||||||
syn keyword ngxDirectiveThirdParty secure_download
|
|
||||||
syn keyword ngxDirectiveThirdParty secure_download_fail_location
|
|
||||||
syn keyword ngxDirectiveThirdParty secure_download_path_mode
|
|
||||||
syn keyword ngxDirectiveThirdParty secure_download_secret
|
|
||||||
|
|
||||||
" SlowFS Cache Module <http://labs.frickle.com/nginx_ngx_slowfs_cache/>
|
|
||||||
" Module adding ability to cache static files.
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_big_file_size
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache_key
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache_path
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache_purge
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_cache_valid
|
|
||||||
syn keyword ngxDirectiveThirdParty slowfs_temp_path
|
|
||||||
|
|
||||||
" Strip Module <http://wiki.nginx.org/NginxHttpStripModule>
|
|
||||||
" Whitespace remover.
|
|
||||||
syn keyword ngxDirectiveThirdParty strip
|
|
||||||
|
|
||||||
" Substitutions Module <http://wiki.nginx.org/NginxHttpSubsModule>
|
|
||||||
" A filter module which can do both regular expression and fixed string substitutions on response bodies.
|
|
||||||
syn keyword ngxDirectiveThirdParty subs_filter
|
|
||||||
syn keyword ngxDirectiveThirdParty subs_filter_types
|
|
||||||
|
|
||||||
" Supervisord Module <http://labs.frickle.com/nginx_ngx_supervisord/>
|
|
||||||
" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand.
|
|
||||||
syn keyword ngxDirectiveThirdParty supervisord
|
|
||||||
syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status
|
|
||||||
syn keyword ngxDirectiveThirdParty supervisord_name
|
|
||||||
syn keyword ngxDirectiveThirdParty supervisord_start
|
|
||||||
syn keyword ngxDirectiveThirdParty supervisord_stop
|
|
||||||
|
|
||||||
" Upload Module <http://www.grid.net.ru/nginx/upload.en.html>
|
|
||||||
" Parses multipart/form-data allowing arbitrary handling of uploaded files.
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_aggregate_form_field
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_buffer_size
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_cleanup
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_limit_rate
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_max_file_size
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_max_output_body_len
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_max_part_header_len
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_pass_args
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_pass_form_field
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_set_form_field
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_store
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_store_access
|
|
||||||
|
|
||||||
" Upload Progress Module <http://wiki.nginx.org/NginxHttpUploadProgressModule>
|
|
||||||
" Tracks and reports upload progress.
|
|
||||||
syn keyword ngxDirectiveThirdParty report_uploads
|
|
||||||
syn keyword ngxDirectiveThirdParty track_uploads
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_progress
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_progress_content_type
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_progress_header
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_progress_json_output
|
|
||||||
syn keyword ngxDirectiveThirdParty upload_progress_template
|
|
||||||
|
|
||||||
" Upstream Fair Balancer <http://wiki.nginx.org/NginxHttpUpstreamFairModule>
|
|
||||||
" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin.
|
|
||||||
syn keyword ngxDirectiveThirdParty fair
|
|
||||||
syn keyword ngxDirectiveThirdParty upstream_fair_shm_size
|
|
||||||
|
|
||||||
" Upstream Consistent Hash <http://wiki.nginx.org/NginxHttpUpstreamConsistentHash>
|
|
||||||
" Select backend based on Consistent hash ring.
|
|
||||||
syn keyword ngxDirectiveThirdParty consistent_hash
|
|
||||||
|
|
||||||
" Upstream Hash Module <http://wiki.nginx.org/NginxHttpUpstreamRequestHashModule>
|
|
||||||
" Provides simple upstream load distribution by hashing a configurable variable.
|
|
||||||
syn keyword ngxDirectiveThirdParty hash
|
|
||||||
syn keyword ngxDirectiveThirdParty hash_again
|
|
||||||
|
|
||||||
" XSS Module <http://github.com/agentzh/xss-nginx-module>
|
|
||||||
" Native support for cross-site scripting (XSS) in an nginx.
|
|
||||||
syn keyword ngxDirectiveThirdParty xss_callback_arg
|
|
||||||
syn keyword ngxDirectiveThirdParty xss_get
|
|
||||||
syn keyword ngxDirectiveThirdParty xss_input_types
|
|
||||||
syn keyword ngxDirectiveThirdParty xss_output_type
|
|
||||||
|
|
||||||
" uWSGI Module <http://wiki.nginx.org/HttpUwsgiModule>
|
|
||||||
" Allows Nginx to interact with uWSGI processes and control what parameters are passed to the process.
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_bind
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_buffer_size
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_buffering
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_buffers
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_busy_buffers_size
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_bypass
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_key
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_lock
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_lock_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_methods
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_min_uses
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_path
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_use_stale
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_cache_valid
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_connect_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_hide_header
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_ignore_client_abort
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_ignore_headers
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_intercept_errors
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_max_temp_file_size
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_modifier1
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_modifier2
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_next_upstream
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_no_cache
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_param
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_pass
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_pass_header
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_pass_request_body
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_pass_request_headers
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_read_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_send_timeout
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_store
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_store_access
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_string
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_temp_file_write_size
|
|
||||||
syn keyword ngxDirectiveThirdParty uwsgi_temp_path
|
|
||||||
|
|
||||||
" highlight
|
|
||||||
|
|
||||||
hi link ngxComment Comment
|
|
||||||
hi link ngxVariable Identifier
|
|
||||||
hi link ngxVariableBlock Identifier
|
|
||||||
hi link ngxVariableString PreProc
|
|
||||||
hi link ngxBlock Normal
|
|
||||||
hi link ngxString String
|
|
||||||
|
|
||||||
hi link ngxBoolean Boolean
|
|
||||||
hi link ngxDirectiveBlock Statement
|
|
||||||
hi link ngxDirectiveImportant Type
|
|
||||||
hi link ngxDirectiveControl Keyword
|
|
||||||
hi link ngxDirectiveError Constant
|
|
||||||
hi link ngxDirectiveDeprecated Error
|
|
||||||
hi link ngxDirective Identifier
|
|
||||||
hi link ngxDirectiveThirdParty Special
|
|
||||||
|
|
||||||
let b:current_syntax = "nginx"
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
" ----- Emulate 'gf' but recognize :line format -----
|
|
||||||
function! GotoFile(w)
|
|
||||||
let curword = expand("<cfile>")
|
|
||||||
if (strlen(curword) == 0)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
let matchstart = match(curword, ':\d\+$')
|
|
||||||
if matchstart > 0
|
|
||||||
let pos = '+' . strpart(curword, matchstart+1)
|
|
||||||
let fname = strpart(curword, 0, matchstart)
|
|
||||||
else
|
|
||||||
let pos = ""
|
|
||||||
let fname = curword
|
|
||||||
endif
|
|
||||||
|
|
||||||
" check exists file.
|
|
||||||
if filereadable(fname)
|
|
||||||
let fullname = fname
|
|
||||||
else
|
|
||||||
" try find file with prefix by working directory
|
|
||||||
let fullname = getcwd() . '/' . fname
|
|
||||||
if ! filereadable(fullname)
|
|
||||||
" the last try, using current directory based on file opened.
|
|
||||||
let fullname = expand('%:h') . '/' . fname
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Open new window if requested
|
|
||||||
if a:w == "new"
|
|
||||||
new
|
|
||||||
endif
|
|
||||||
" Use 'find' so path is searched like 'gf' would
|
|
||||||
execute 'find ' . pos . ' ' . fname
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
set isfname+=: " include colon in filenames
|
|
||||||
|
|
||||||
" Override vim commands 'gf', '^Wf', '^W^F'
|
|
||||||
nnoremap gf :call GotoFile("")<CR>
|
|
||||||
nnoremap <C-W>f :call GotoFile("new")<CR>
|
|
||||||
nnoremap <C-W><C-F> :call GotoFile("new")<CR>
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
/doc/tags
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
# rust.vim
|
|
||||||
|
|
||||||
## Description
|
|
||||||
|
|
||||||
This is a vim plugin provides [Rust][r] file detection and syntax highlighting.
|
|
||||||
|
|
||||||
It is synchronized daily to the vim support code in [rust-lang/rust][rr]'s
|
|
||||||
master branch via cronjob.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Using [Vundle][v]
|
|
||||||
|
|
||||||
1. Add `Plugin 'wting/rust.vim'` to `~/.vimrc`
|
|
||||||
2. `vim +PluginInstall +qall`
|
|
||||||
|
|
||||||
*Note:* Vundle will not automatically detect Rust files properly if `filetype
|
|
||||||
on` is executed before Vundle. Please check the [quickstart][vqs] for more
|
|
||||||
details.
|
|
||||||
|
|
||||||
### Using [Pathogen][p]
|
|
||||||
|
|
||||||
1. `cd ~/.vim/bundle`
|
|
||||||
2. `git clone https://github.com/wting/rust.vim.git`
|
|
||||||
|
|
||||||
[rr]: https://github.com/rust-lang/rust
|
|
||||||
[p]: https://github.com/tpope/vim-pathogen
|
|
||||||
[r]: https://en.wikipedia.org/wiki/Rust_language
|
|
||||||
[v]: https://github.com/gmarik/vundle
|
|
||||||
[vqs]: https://github.com/gmarik/vundle#quick-start
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
if !exists('g:rust_conceal') || !has('conceal') || &enc != 'utf-8'
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" For those who don't want to see `::`...
|
|
||||||
if exists('g:rust_conceal_mod_path')
|
|
||||||
syn match rustNiceOperator "::" conceal cchar=ㆍ
|
|
||||||
endif
|
|
||||||
|
|
||||||
syn match rustRightArrowHead contained ">" conceal cchar=
|
|
||||||
syn match rustRightArrowTail contained "-" conceal cchar=⟶
|
|
||||||
syn match rustNiceOperator "->" contains=rustRightArrowHead,rustRightArrowTail
|
|
||||||
|
|
||||||
syn match rustFatRightArrowHead contained ">" conceal cchar=
|
|
||||||
syn match rustFatRightArrowTail contained "=" conceal cchar=⟹
|
|
||||||
syn match rustNiceOperator "=>" contains=rustFatRightArrowHead,rustFatRightArrowTail
|
|
||||||
|
|
||||||
syn match rustNiceOperator /\<\@!_\(_*\>\)\@=/ conceal cchar=′
|
|
||||||
|
|
||||||
" For those who don't want to see `pub`...
|
|
||||||
if exists('g:rust_conceal_pub')
|
|
||||||
syn match rustPublicSigil contained "pu" conceal cchar=*
|
|
||||||
syn match rustPublicRest contained "b" conceal cchar=
|
|
||||||
syn match rustNiceOperator "pub " contains=rustPublicSigil,rustPublicRest
|
|
||||||
endif
|
|
||||||
|
|
||||||
hi link rustNiceOperator Operator
|
|
||||||
|
|
||||||
if !exists('g:rust_conceal_mod_path')
|
|
||||||
hi! link Conceal Operator
|
|
||||||
endif
|
|
||||||
|
|
@ -1,225 +0,0 @@
|
||||||
" Author: Kevin Ballard
|
|
||||||
" Description: Helper functions for Rust commands/mappings
|
|
||||||
" Last Modified: May 27, 2014
|
|
||||||
|
|
||||||
" Jump {{{1
|
|
||||||
|
|
||||||
function! rust#Jump(mode, function) range
|
|
||||||
let cnt = v:count1
|
|
||||||
normal! m'
|
|
||||||
if a:mode ==# 'v'
|
|
||||||
norm! gv
|
|
||||||
endif
|
|
||||||
let foldenable = &foldenable
|
|
||||||
set nofoldenable
|
|
||||||
while cnt > 0
|
|
||||||
execute "call <SID>Jump_" . a:function . "()"
|
|
||||||
let cnt = cnt - 1
|
|
||||||
endwhile
|
|
||||||
let &foldenable = foldenable
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Jump_Back()
|
|
||||||
call search('{', 'b')
|
|
||||||
keepjumps normal! w99[{
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Jump_Forward()
|
|
||||||
normal! j0
|
|
||||||
call search('{', 'b')
|
|
||||||
keepjumps normal! w99[{%
|
|
||||||
call search('{')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Run {{{1
|
|
||||||
|
|
||||||
function! rust#Run(bang, args)
|
|
||||||
if a:bang
|
|
||||||
let idx = index(a:args, '--')
|
|
||||||
if idx != -1
|
|
||||||
let rustc_args = idx == 0 ? [] : a:args[:idx-1]
|
|
||||||
let args = a:args[idx+1:]
|
|
||||||
else
|
|
||||||
let rustc_args = a:args
|
|
||||||
let args = []
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
let rustc_args = []
|
|
||||||
let args = a:args
|
|
||||||
endif
|
|
||||||
|
|
||||||
let b:rust_last_rustc_args = rustc_args
|
|
||||||
let b:rust_last_args = args
|
|
||||||
|
|
||||||
call s:WithPath(function("s:Run"), rustc_args, args)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Run(path, rustc_args, args)
|
|
||||||
try
|
|
||||||
let exepath = tempname()
|
|
||||||
if has('win32')
|
|
||||||
let exepath .= '.exe'
|
|
||||||
endif
|
|
||||||
|
|
||||||
let rustc_args = [a:path, '-o', exepath] + a:rustc_args
|
|
||||||
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
|
||||||
|
|
||||||
let output = system(shellescape(rustc) . " " . join(map(rustc_args, 'shellescape(v:val)')))
|
|
||||||
if output != ''
|
|
||||||
echohl WarningMsg
|
|
||||||
echo output
|
|
||||||
echohl None
|
|
||||||
endif
|
|
||||||
if !v:shell_error
|
|
||||||
exe '!' . shellescape(exepath) . " " . join(map(a:args, 'shellescape(v:val)'))
|
|
||||||
endif
|
|
||||||
finally
|
|
||||||
if exists("exepath")
|
|
||||||
silent! call delete(exepath)
|
|
||||||
endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Expand {{{1
|
|
||||||
|
|
||||||
function! rust#Expand(bang, args)
|
|
||||||
if a:bang && !empty(a:args)
|
|
||||||
let pretty = a:args[0]
|
|
||||||
let args = a:args[1:]
|
|
||||||
else
|
|
||||||
let pretty = "expanded"
|
|
||||||
let args = a:args
|
|
||||||
endif
|
|
||||||
call s:WithPath(function("s:Expand"), pretty, args)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Expand(path, pretty, args)
|
|
||||||
try
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
|
||||||
|
|
||||||
let args = [a:path, '--pretty', a:pretty] + a:args
|
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
|
||||||
if v:shell_error
|
|
||||||
echohl WarningMsg
|
|
||||||
echo output
|
|
||||||
echohl None
|
|
||||||
else
|
|
||||||
new
|
|
||||||
silent put =output
|
|
||||||
1
|
|
||||||
d
|
|
||||||
setl filetype=rust
|
|
||||||
setl buftype=nofile
|
|
||||||
setl bufhidden=hide
|
|
||||||
setl noswapfile
|
|
||||||
endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! rust#CompleteExpand(lead, line, pos)
|
|
||||||
if a:line[: a:pos-1] =~ '^RustExpand!\s*\S*$'
|
|
||||||
" first argument and it has a !
|
|
||||||
let list = ["normal", "expanded", "typed", "expanded,identified", "flowgraph="]
|
|
||||||
if !empty(a:lead)
|
|
||||||
call filter(list, "v:val[:len(a:lead)-1] == a:lead")
|
|
||||||
endif
|
|
||||||
return list
|
|
||||||
endif
|
|
||||||
|
|
||||||
return glob(escape(a:lead, "*?[") . '*', 0, 1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Emit {{{1
|
|
||||||
|
|
||||||
function! rust#Emit(type, args)
|
|
||||||
call s:WithPath(function("s:Emit"), a:type, a:args)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:Emit(path, type, args)
|
|
||||||
try
|
|
||||||
let rustc = exists("g:rustc_path") ? g:rustc_path : "rustc"
|
|
||||||
|
|
||||||
let args = [a:path, '--emit', a:type, '-o', '-'] + a:args
|
|
||||||
let output = system(shellescape(rustc) . " " . join(map(args, "shellescape(v:val)")))
|
|
||||||
if v:shell_error
|
|
||||||
echohl WarningMsg
|
|
||||||
echo output
|
|
||||||
echohl None
|
|
||||||
else
|
|
||||||
new
|
|
||||||
silent put =output
|
|
||||||
1
|
|
||||||
d
|
|
||||||
if a:type == "ir"
|
|
||||||
setl filetype=llvm
|
|
||||||
elseif a:type == "asm"
|
|
||||||
setl filetype=asm
|
|
||||||
endif
|
|
||||||
setl buftype=nofile
|
|
||||||
setl bufhidden=hide
|
|
||||||
setl noswapfile
|
|
||||||
endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Utility functions {{{1
|
|
||||||
|
|
||||||
function! s:WithPath(func, ...)
|
|
||||||
try
|
|
||||||
let save_write = &write
|
|
||||||
set write
|
|
||||||
let path = expand('%')
|
|
||||||
let pathisempty = empty(path)
|
|
||||||
if pathisempty || !save_write
|
|
||||||
" use a temporary file named 'unnamed.rs' inside a temporary
|
|
||||||
" directory. This produces better error messages
|
|
||||||
let tmpdir = tempname()
|
|
||||||
call mkdir(tmpdir)
|
|
||||||
|
|
||||||
let save_cwd = getcwd()
|
|
||||||
silent exe 'lcd' fnameescape(tmpdir)
|
|
||||||
|
|
||||||
let path = 'unnamed.rs'
|
|
||||||
|
|
||||||
let save_mod = &mod
|
|
||||||
set nomod
|
|
||||||
|
|
||||||
silent exe 'keepalt write! ' . fnameescape(path)
|
|
||||||
if pathisempty
|
|
||||||
silent keepalt 0file
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
update
|
|
||||||
endif
|
|
||||||
|
|
||||||
call call(a:func, [path] + a:000)
|
|
||||||
finally
|
|
||||||
if exists("save_mod") | let &mod = save_mod | endif
|
|
||||||
if exists("save_write") | let &write = save_write | endif
|
|
||||||
if exists("save_cwd") | silent exe 'lcd' fnameescape(save_cwd) | endif
|
|
||||||
if exists("tmpdir") | silent call s:RmDir(tmpdir) | endif
|
|
||||||
endtry
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! rust#AppendCmdLine(text)
|
|
||||||
call setcmdpos(getcmdpos())
|
|
||||||
let cmd = getcmdline() . a:text
|
|
||||||
return cmd
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:RmDir(path)
|
|
||||||
" sanity check; make sure it's not empty, /, or $HOME
|
|
||||||
if empty(a:path)
|
|
||||||
echoerr 'Attempted to delete empty path'
|
|
||||||
return 0
|
|
||||||
elseif a:path == '/' || a:path == $HOME
|
|
||||||
echoerr 'Attempted to delete protected path: ' . a:path
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
silent exe "!rm -rf " . shellescape(a:path)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
" vim: set noet sw=4 ts=4:
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
" Vim compiler file
|
|
||||||
" Compiler: Cargo Compiler
|
|
||||||
" Maintainer: Damien Radtke <damienradtke@gmail.com>
|
|
||||||
" Latest Revision: 2014 Sep 24
|
|
||||||
|
|
||||||
if exists('current_compiler')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
runtime compiler/rustc.vim
|
|
||||||
let current_compiler = "cargo"
|
|
||||||
|
|
||||||
if exists(':CompilerSet') != 2
|
|
||||||
command -nargs=* CompilerSet setlocal <args>
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists('g:cargo_makeprg_params')
|
|
||||||
execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*'
|
|
||||||
else
|
|
||||||
CompilerSet makeprg=cargo\ $*
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Allow a configurable global Cargo.toml name. This makes it easy to
|
|
||||||
" support variations like 'cargo.toml'.
|
|
||||||
let s:cargo_manifest_name = get(g:, 'cargo_manifest_name', 'Cargo.toml')
|
|
||||||
|
|
||||||
function! s:is_absolute(path)
|
|
||||||
return a:path[0] == '/' || a:path =~ '[A-Z]\+:'
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:local_manifest = findfile(s:cargo_manifest_name, '.;')
|
|
||||||
if s:local_manifest != ''
|
|
||||||
let s:local_manifest = fnamemodify(s:local_manifest, ':p:h').'/'
|
|
||||||
augroup cargo
|
|
||||||
au!
|
|
||||||
au QuickfixCmdPost make call s:FixPaths()
|
|
||||||
augroup END
|
|
||||||
|
|
||||||
" FixPaths() is run after Cargo, and is used to change the file paths
|
|
||||||
" to be relative to the current directory instead of Cargo.toml.
|
|
||||||
function! s:FixPaths()
|
|
||||||
let qflist = getqflist()
|
|
||||||
let manifest = s:local_manifest
|
|
||||||
for qf in qflist
|
|
||||||
if !qf.valid
|
|
||||||
let m = matchlist(qf.text, '(file://\(.*\))$')
|
|
||||||
if !empty(m)
|
|
||||||
let manifest = m[1].'/'
|
|
||||||
" Manually strip another slash if needed; usually just an
|
|
||||||
" issue on Windows.
|
|
||||||
if manifest =~ '^/[A-Z]\+:/'
|
|
||||||
let manifest = manifest[1:]
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let filename = bufname(qf.bufnr)
|
|
||||||
if s:is_absolute(filename)
|
|
||||||
continue
|
|
||||||
endif
|
|
||||||
let qf.filename = simplify(manifest.filename)
|
|
||||||
call remove(qf, 'bufnr')
|
|
||||||
endfor
|
|
||||||
call setqflist(qflist, 'r')
|
|
||||||
endfunction
|
|
||||||
endif
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
" Vim compiler file
|
|
||||||
" Compiler: Rust Compiler
|
|
||||||
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
|
||||||
" Latest Revision: 2013 Jul 12
|
|
||||||
|
|
||||||
if exists("current_compiler")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let current_compiler = "rustc"
|
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
if exists(":CompilerSet") != 2
|
|
||||||
command -nargs=* CompilerSet setlocal <args>
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent == 1
|
|
||||||
CompilerSet makeprg=rustc
|
|
||||||
else
|
|
||||||
CompilerSet makeprg=rustc\ \%
|
|
||||||
endif
|
|
||||||
|
|
||||||
CompilerSet errorformat=
|
|
||||||
\%f:%l:%c:\ %t%*[^:]:\ %m,
|
|
||||||
\%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m,
|
|
||||||
\%-G%f:%l\ %s,
|
|
||||||
\%-G%*[\ ]^,
|
|
||||||
\%-G%*[\ ]^%*[~],
|
|
||||||
\%-G%*[\ ]...
|
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
|
||||||
unlet s:cpo_save
|
|
||||||
|
|
@ -1,178 +0,0 @@
|
||||||
*rust.txt* Filetype plugin for Rust
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
CONTENTS *rust* *ft-rust*
|
|
||||||
|
|
||||||
1. Introduction |rust-intro|
|
|
||||||
2. Settings |rust-settings|
|
|
||||||
3. Commands |rust-commands|
|
|
||||||
4. Mappings |rust-mappings|
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
INTRODUCTION *rust-intro*
|
|
||||||
|
|
||||||
This plugin provides syntax and supporting functionality for the Rust
|
|
||||||
filetype.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
SETTINGS *rust-settings*
|
|
||||||
|
|
||||||
This plugin has a few variables you can define in your vimrc that change the
|
|
||||||
behavior of the plugin.
|
|
||||||
|
|
||||||
*g:rustc_path*
|
|
||||||
g:rustc_path~
|
|
||||||
Set this option to the path to rustc for use in the |:RustRun| and
|
|
||||||
|:RustExpand| commands. If unset, "rustc" will be located in $PATH: >
|
|
||||||
let g:rustc_path = $HOME."/bin/rustc"
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rustc_makeprg_no_percent*
|
|
||||||
g:rustc_makeprg_no_percent~
|
|
||||||
Set this option to 1 to have 'makeprg' default to "rustc" instead of
|
|
||||||
"rustc %": >
|
|
||||||
let g:rustc_makeprg_no_percent = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rust_conceal*
|
|
||||||
g:rust_conceal~
|
|
||||||
Set this option to turn on the basic |conceal| support: >
|
|
||||||
let g:rust_conceal = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rust_conceal_mod_path*
|
|
||||||
g:rust_conceal_mod_path~
|
|
||||||
Set this option to turn on |conceal| for the path connecting token
|
|
||||||
"::": >
|
|
||||||
let g:rust_conceal_mod_path = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rust_conceal_pub*
|
|
||||||
g:rust_conceal_pub~
|
|
||||||
Set this option to turn on |conceal| for the "pub" token: >
|
|
||||||
let g:rust_conceal_pub = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rust_recommended_style*
|
|
||||||
g:rust_recommended_style~
|
|
||||||
Set this option to enable vim indentation and textwidth settings to
|
|
||||||
conform to style conventions of the rust standard library (i.e. use 4
|
|
||||||
spaces for indents and sets 'textwidth' to 99). This option is enabled
|
|
||||||
by default. To disable it: >
|
|
||||||
let g:rust_recommended_style = 0
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:rust_fold*
|
|
||||||
g:rust_fold~
|
|
||||||
Set this option to turn on |folding|: >
|
|
||||||
let g:rust_fold = 1
|
|
||||||
<
|
|
||||||
Value Effect ~
|
|
||||||
0 No folding
|
|
||||||
1 Braced blocks are folded. All folds are open by
|
|
||||||
default.
|
|
||||||
2 Braced blocks are folded. 'foldlevel' is left at the
|
|
||||||
global value (all folds are closed by default).
|
|
||||||
|
|
||||||
*g:rust_bang_comment_leader*
|
|
||||||
g:rust_bang_comment_leader~
|
|
||||||
Set this option to 1 to preserve the leader on multi-line doc comments
|
|
||||||
using the /*! syntax: >
|
|
||||||
let g:rust_bang_comment_leader = 1
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:ftplugin_rust_source_path*
|
|
||||||
g:ftplugin_rust_source_path~
|
|
||||||
Set this option to a path that should be prepended to 'path' for Rust
|
|
||||||
source files: >
|
|
||||||
let g:ftplugin_rust_source_path = $HOME.'/dev/rust'
|
|
||||||
<
|
|
||||||
|
|
||||||
*g:cargo_manifest_name*
|
|
||||||
g:cargo_manifest_name~
|
|
||||||
Set this option to the name of the manifest file for your projects. If
|
|
||||||
not specified it defaults to 'Cargo.toml' : >
|
|
||||||
let g:cargo_manifest_name = 'Cargo.toml'
|
|
||||||
<
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
COMMANDS *rust-commands*
|
|
||||||
|
|
||||||
:RustRun [args] *:RustRun*
|
|
||||||
:RustRun! [rustc-args] [--] [args]
|
|
||||||
Compiles and runs the current file. If it has unsaved changes,
|
|
||||||
it will be saved first using |:update|. If the current file is
|
|
||||||
an unnamed buffer, it will be written to a temporary file
|
|
||||||
first. The compiled binary is always placed in a temporary
|
|
||||||
directory, but is run from the current directory.
|
|
||||||
|
|
||||||
The arguments given to |:RustRun| will be passed to the
|
|
||||||
compiled binary.
|
|
||||||
|
|
||||||
If ! is specified, the arguments are passed to rustc instead.
|
|
||||||
A "--" argument will separate the rustc arguments from the
|
|
||||||
arguments passed to the binary.
|
|
||||||
|
|
||||||
If |g:rustc_path| is defined, it is used as the path to rustc.
|
|
||||||
Otherwise it is assumed rustc can be found in $PATH.
|
|
||||||
|
|
||||||
:RustExpand [args] *:RustExpand*
|
|
||||||
:RustExpand! [TYPE] [args]
|
|
||||||
Expands the current file using --pretty and displays the
|
|
||||||
results in a new split. If the current file has unsaved
|
|
||||||
changes, it will be saved first using |:update|. If the
|
|
||||||
current file is an unnamed buffer, it will be written to a
|
|
||||||
temporary file first.
|
|
||||||
|
|
||||||
The arguments given to |:RustExpand| will be passed to rustc.
|
|
||||||
This is largely intended for specifying various --cfg
|
|
||||||
configurations.
|
|
||||||
|
|
||||||
If ! is specified, the first argument is the expansion type to
|
|
||||||
pass to rustc --pretty. Otherwise it will default to
|
|
||||||
"expanded".
|
|
||||||
|
|
||||||
If |g:rustc_path| is defined, it is used as the path to rustc.
|
|
||||||
Otherwise it is assumed rustc can be found in $PATH.
|
|
||||||
|
|
||||||
:RustEmitIr [args] *:RustEmitIr*
|
|
||||||
Compiles the current file to LLVM IR and displays the results
|
|
||||||
in a new split. If the current file has unsaved changes, it
|
|
||||||
will be saved first using |:update|. If the current file is an
|
|
||||||
unnamed buffer, it will be written to a temporary file first.
|
|
||||||
|
|
||||||
The arguments given to |:RustEmitIr| will be passed to rustc.
|
|
||||||
|
|
||||||
If |g:rustc_path| is defined, it is used as the path to rustc.
|
|
||||||
Otherwise it is assumed rustc can be found in $PATH.
|
|
||||||
|
|
||||||
:RustEmitAsm [args] *:RustEmitAsm*
|
|
||||||
Compiles the current file to assembly and displays the results
|
|
||||||
in a new split. If the current file has unsaved changes, it
|
|
||||||
will be saved first using |:update|. If the current file is an
|
|
||||||
unnamed buffer, it will be written to a temporary file first.
|
|
||||||
|
|
||||||
The arguments given to |:RustEmitAsm| will be passed to rustc.
|
|
||||||
|
|
||||||
If |g:rustc_path| is defined, it is used as the path to rustc.
|
|
||||||
Otherwise it is assumed rustc can be found in $PATH.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
MAPPINGS *rust-mappings*
|
|
||||||
|
|
||||||
This plugin defines mappings for |[[| and |]]| to support hanging indents.
|
|
||||||
|
|
||||||
It also has a few other mappings:
|
|
||||||
|
|
||||||
*rust_<D-r>*
|
|
||||||
<D-r> Executes |:RustRun| with no arguments.
|
|
||||||
Note: This binding is only available in MacVim.
|
|
||||||
|
|
||||||
*rust_<D-R>*
|
|
||||||
<D-R> Populates the command line with |:RustRun|! using the
|
|
||||||
arguments given to the last invocation, but does not
|
|
||||||
execute it.
|
|
||||||
Note: This binding is only available in MacVim.
|
|
||||||
|
|
||||||
==============================================================================
|
|
||||||
vim:tw=78:sw=4:noet:ts=8:ft=help:norl:
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
au BufRead,BufNewFile *.rs set filetype=rust
|
|
||||||
|
|
@ -1,150 +0,0 @@
|
||||||
" Language: Rust
|
|
||||||
" Description: Vim syntax file for Rust
|
|
||||||
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
|
||||||
" Maintainer: Kevin Ballard <kevin@sb.org>
|
|
||||||
" Last Change: Jul 07, 2014
|
|
||||||
|
|
||||||
if exists("b:did_ftplugin")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let b:did_ftplugin = 1
|
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
" Variables {{{1
|
|
||||||
|
|
||||||
" The rust source code at present seems to typically omit a leader on /*!
|
|
||||||
" comments, so we'll use that as our default, but make it easy to switch.
|
|
||||||
" This does not affect indentation at all (I tested it with and without
|
|
||||||
" leader), merely whether a leader is inserted by default or not.
|
|
||||||
if exists("g:rust_bang_comment_leader") && g:rust_bang_comment_leader == 1
|
|
||||||
" Why is the `,s0:/*,mb:\ ,ex:*/` there, you ask? I don't understand why,
|
|
||||||
" but without it, */ gets indented one space even if there were no
|
|
||||||
" leaders. I'm fairly sure that's a Vim bug.
|
|
||||||
setlocal comments=s1:/*,mb:*,ex:*/,s0:/*,mb:\ ,ex:*/,:///,://!,://
|
|
||||||
else
|
|
||||||
setlocal comments=s0:/*!,m:\ ,ex:*/,s1:/*,mb:*,ex:*/,:///,://!,://
|
|
||||||
endif
|
|
||||||
setlocal commentstring=//%s
|
|
||||||
setlocal formatoptions-=t formatoptions+=croqnl
|
|
||||||
" j was only added in 7.3.541, so stop complaints about its nonexistence
|
|
||||||
silent! setlocal formatoptions+=j
|
|
||||||
|
|
||||||
" smartindent will be overridden by indentexpr if filetype indent is on, but
|
|
||||||
" otherwise it's better than nothing.
|
|
||||||
setlocal smartindent nocindent
|
|
||||||
|
|
||||||
if !exists("g:rust_recommended_style") || g:rust_recommended_style == 1
|
|
||||||
setlocal tabstop=4 shiftwidth=4 softtabstop=4 expandtab
|
|
||||||
setlocal textwidth=99
|
|
||||||
endif
|
|
||||||
|
|
||||||
" This includeexpr isn't perfect, but it's a good start
|
|
||||||
setlocal includeexpr=substitute(v:fname,'::','/','g')
|
|
||||||
|
|
||||||
" NOT adding .rc as it's being phased out (0.7)
|
|
||||||
setlocal suffixesadd=.rs
|
|
||||||
|
|
||||||
if exists("g:ftplugin_rust_source_path")
|
|
||||||
let &l:path=g:ftplugin_rust_source_path . ',' . &l:path
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists("g:loaded_delimitMate")
|
|
||||||
if exists("b:delimitMate_excluded_regions")
|
|
||||||
let b:rust_original_delimitMate_excluded_regions = b:delimitMate_excluded_regions
|
|
||||||
endif
|
|
||||||
let b:delimitMate_excluded_regions = delimitMate#Get("excluded_regions") . ',rustLifetimeCandidate,rustGenericLifetimeCandidate'
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has("folding") && exists('g:rust_fold') && g:rust_fold != 0
|
|
||||||
let b:rust_set_foldmethod=1
|
|
||||||
setlocal foldmethod=syntax
|
|
||||||
if g:rust_fold == 2
|
|
||||||
setlocal foldlevel<
|
|
||||||
else
|
|
||||||
setlocal foldlevel=99
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if has('conceal') && exists('g:rust_conceal')
|
|
||||||
let b:rust_set_conceallevel=1
|
|
||||||
setlocal conceallevel=2
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Motion Commands {{{1
|
|
||||||
|
|
||||||
" Bind motion commands to support hanging indents
|
|
||||||
nnoremap <silent> <buffer> [[ :call rust#Jump('n', 'Back')<CR>
|
|
||||||
nnoremap <silent> <buffer> ]] :call rust#Jump('n', 'Forward')<CR>
|
|
||||||
xnoremap <silent> <buffer> [[ :call rust#Jump('v', 'Back')<CR>
|
|
||||||
xnoremap <silent> <buffer> ]] :call rust#Jump('v', 'Forward')<CR>
|
|
||||||
onoremap <silent> <buffer> [[ :call rust#Jump('o', 'Back')<CR>
|
|
||||||
onoremap <silent> <buffer> ]] :call rust#Jump('o', 'Forward')<CR>
|
|
||||||
|
|
||||||
" Commands {{{1
|
|
||||||
|
|
||||||
" See |:RustRun| for docs
|
|
||||||
command! -nargs=* -complete=file -bang -bar -buffer RustRun call rust#Run(<bang>0, [<f-args>])
|
|
||||||
|
|
||||||
" See |:RustExpand| for docs
|
|
||||||
command! -nargs=* -complete=customlist,rust#CompleteExpand -bang -bar -buffer RustExpand call rust#Expand(<bang>0, [<f-args>])
|
|
||||||
|
|
||||||
" See |:RustEmitIr| for docs
|
|
||||||
command! -nargs=* -bar -buffer RustEmitIr call rust#Emit("ir", [<f-args>])
|
|
||||||
|
|
||||||
" See |:RustEmitAsm| for docs
|
|
||||||
command! -nargs=* -bar -buffer RustEmitAsm call rust#Emit("asm", [<f-args>])
|
|
||||||
|
|
||||||
" Mappings {{{1
|
|
||||||
|
|
||||||
" Bind ⌘R in MacVim to :RustRun
|
|
||||||
nnoremap <silent> <buffer> <D-r> :RustRun<CR>
|
|
||||||
" Bind ⌘⇧R in MacVim to :RustRun! pre-filled with the last args
|
|
||||||
nnoremap <buffer> <D-R> :RustRun! <C-r>=join(b:rust_last_rustc_args)<CR><C-\>erust#AppendCmdLine(' -- ' . join(b:rust_last_args))<CR>
|
|
||||||
|
|
||||||
if !exists("b:rust_last_rustc_args") || !exists("b:rust_last_args")
|
|
||||||
let b:rust_last_rustc_args = []
|
|
||||||
let b:rust_last_args = []
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Cleanup {{{1
|
|
||||||
|
|
||||||
let b:undo_ftplugin = "
|
|
||||||
\ setlocal formatoptions< comments< commentstring< includeexpr< suffixesadd<
|
|
||||||
\|setlocal tabstop< shiftwidth< softtabstop< expandtab< textwidth<
|
|
||||||
\|if exists('b:rust_original_delimitMate_excluded_regions')
|
|
||||||
\|let b:delimitMate_excluded_regions = b:rust_original_delimitMate_excluded_regions
|
|
||||||
\|unlet b:rust_original_delimitMate_excluded_regions
|
|
||||||
\|else
|
|
||||||
\|unlet! b:delimitMate_excluded_regions
|
|
||||||
\|endif
|
|
||||||
\|if exists('b:rust_set_foldmethod')
|
|
||||||
\|setlocal foldmethod< foldlevel<
|
|
||||||
\|unlet b:rust_set_foldmethod
|
|
||||||
\|endif
|
|
||||||
\|if exists('b:rust_set_conceallevel')
|
|
||||||
\|setlocal conceallevel<
|
|
||||||
\|unlet b:rust_set_conceallevel
|
|
||||||
\|endif
|
|
||||||
\|unlet! b:rust_last_rustc_args b:rust_last_args
|
|
||||||
\|delcommand RustRun
|
|
||||||
\|delcommand RustExpand
|
|
||||||
\|delcommand RustEmitIr
|
|
||||||
\|delcommand RustEmitAsm
|
|
||||||
\|nunmap <buffer> <D-r>
|
|
||||||
\|nunmap <buffer> <D-R>
|
|
||||||
\|nunmap <buffer> [[
|
|
||||||
\|nunmap <buffer> ]]
|
|
||||||
\|xunmap <buffer> [[
|
|
||||||
\|xunmap <buffer> ]]
|
|
||||||
\|ounmap <buffer> [[
|
|
||||||
\|ounmap <buffer> ]]
|
|
||||||
\"
|
|
||||||
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
||||||
" vim: set noet sw=4 ts=4:
|
|
||||||
|
|
@ -1,196 +0,0 @@
|
||||||
" Vim indent file
|
|
||||||
" Language: Rust
|
|
||||||
" Author: Chris Morgan <me@chrismorgan.info>
|
|
||||||
" Last Change: 2014 Sep 13
|
|
||||||
|
|
||||||
" Only load this indent file when no other was loaded.
|
|
||||||
if exists("b:did_indent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let b:did_indent = 1
|
|
||||||
|
|
||||||
setlocal cindent
|
|
||||||
setlocal cinoptions=L0,(0,Ws,J1,j1
|
|
||||||
setlocal cinkeys=0{,0},!^F,o,O,0[,0]
|
|
||||||
" Don't think cinwords will actually do anything at all... never mind
|
|
||||||
setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern
|
|
||||||
|
|
||||||
" Some preliminary settings
|
|
||||||
setlocal nolisp " Make sure lisp indenting doesn't supersede us
|
|
||||||
setlocal autoindent " indentexpr isn't much help otherwise
|
|
||||||
" Also do indentkeys, otherwise # gets shoved to column 0 :-/
|
|
||||||
setlocal indentkeys=0{,0},!^F,o,O,0[,0]
|
|
||||||
|
|
||||||
setlocal indentexpr=GetRustIndent(v:lnum)
|
|
||||||
|
|
||||||
" Only define the function once.
|
|
||||||
if exists("*GetRustIndent")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Come here when loading the script the first time.
|
|
||||||
|
|
||||||
function! s:get_line_trimmed(lnum)
|
|
||||||
" Get the line and remove a trailing comment.
|
|
||||||
" Use syntax highlighting attributes when possible.
|
|
||||||
" NOTE: this is not accurate; /* */ or a line continuation could trick it
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
let line_len = strlen(line)
|
|
||||||
if has('syntax_items')
|
|
||||||
" If the last character in the line is a comment, do a binary search for
|
|
||||||
" the start of the comment. synID() is slow, a linear search would take
|
|
||||||
" too long on a long line.
|
|
||||||
if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo'
|
|
||||||
let min = 1
|
|
||||||
let max = line_len
|
|
||||||
while min < max
|
|
||||||
let col = (min + max) / 2
|
|
||||||
if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo'
|
|
||||||
let max = col
|
|
||||||
else
|
|
||||||
let min = col + 1
|
|
||||||
endif
|
|
||||||
endwhile
|
|
||||||
let line = strpart(line, 0, min - 1)
|
|
||||||
endif
|
|
||||||
return substitute(line, "\s*$", "", "")
|
|
||||||
else
|
|
||||||
" Sorry, this is not complete, nor fully correct (e.g. string "//").
|
|
||||||
" Such is life.
|
|
||||||
return substitute(line, "\s*//.*$", "", "")
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:is_string_comment(lnum, col)
|
|
||||||
if has('syntax_items')
|
|
||||||
for id in synstack(a:lnum, a:col)
|
|
||||||
let synname = synIDattr(id, "name")
|
|
||||||
if synname == "rustString" || synname =~ "^rustComment"
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
" without syntax, let's not even try
|
|
||||||
return 0
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function GetRustIndent(lnum)
|
|
||||||
|
|
||||||
" Starting assumption: cindent (called at the end) will do it right
|
|
||||||
" normally. We just want to fix up a few cases.
|
|
||||||
|
|
||||||
let line = getline(a:lnum)
|
|
||||||
|
|
||||||
if has('syntax_items')
|
|
||||||
let synname = synIDattr(synID(a:lnum, 1, 1), "name")
|
|
||||||
if synname == "rustString"
|
|
||||||
" If the start of the line is in a string, don't change the indent
|
|
||||||
return -1
|
|
||||||
elseif synname =~ '\(Comment\|Todo\)'
|
|
||||||
\ && line !~ '^\s*/\*' " not /* opening line
|
|
||||||
if synname =~ "CommentML" " multi-line
|
|
||||||
if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*'
|
|
||||||
" This is (hopefully) the line after a /*, and it has no
|
|
||||||
" leader, so the correct indentation is that of the
|
|
||||||
" previous line.
|
|
||||||
return GetRustIndent(a:lnum - 1)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
" If it's in a comment, let cindent take care of it now. This is
|
|
||||||
" for cases like "/*" where the next line should start " * ", not
|
|
||||||
" "* " as the code below would otherwise cause for module scope
|
|
||||||
" Fun fact: " /*\n*\n*/" takes two calls to get right!
|
|
||||||
return cindent(a:lnum)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" cindent gets second and subsequent match patterns/struct members wrong,
|
|
||||||
" as it treats the comma as indicating an unfinished statement::
|
|
||||||
"
|
|
||||||
" match a {
|
|
||||||
" b => c,
|
|
||||||
" d => e,
|
|
||||||
" f => g,
|
|
||||||
" };
|
|
||||||
|
|
||||||
" Search backwards for the previous non-empty line.
|
|
||||||
let prevlinenum = prevnonblank(a:lnum - 1)
|
|
||||||
let prevline = s:get_line_trimmed(prevlinenum)
|
|
||||||
while prevlinenum > 1 && prevline !~ '[^[:blank:]]'
|
|
||||||
let prevlinenum = prevnonblank(prevlinenum - 1)
|
|
||||||
let prevline = s:get_line_trimmed(prevlinenum)
|
|
||||||
endwhile
|
|
||||||
if prevline[len(prevline) - 1] == ","
|
|
||||||
\ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]'
|
|
||||||
\ && prevline !~ '^\s*fn\s'
|
|
||||||
\ && prevline !~ '([^()]\+,$'
|
|
||||||
" Oh ho! The previous line ended in a comma! I bet cindent will try to
|
|
||||||
" take this too far... For now, let's normally use the previous line's
|
|
||||||
" indent.
|
|
||||||
|
|
||||||
" One case where this doesn't work out is where *this* line contains
|
|
||||||
" square or curly brackets; then we normally *do* want to be indenting
|
|
||||||
" further.
|
|
||||||
"
|
|
||||||
" Another case where we don't want to is one like a function
|
|
||||||
" definition with arguments spread over multiple lines:
|
|
||||||
"
|
|
||||||
" fn foo(baz: Baz,
|
|
||||||
" baz: Baz) // <-- cindent gets this right by itself
|
|
||||||
"
|
|
||||||
" Another case is similar to the previous, except calling a function
|
|
||||||
" instead of defining it, or any conditional expression that leaves
|
|
||||||
" an open paren:
|
|
||||||
"
|
|
||||||
" foo(baz,
|
|
||||||
" baz);
|
|
||||||
"
|
|
||||||
" if baz && (foo ||
|
|
||||||
" bar) {
|
|
||||||
"
|
|
||||||
" There are probably other cases where we don't want to do this as
|
|
||||||
" well. Add them as needed.
|
|
||||||
return indent(prevlinenum)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !has("patch-7.4.355")
|
|
||||||
" cindent before 7.4.355 doesn't do the module scope well at all; e.g.::
|
|
||||||
"
|
|
||||||
" static FOO : &'static [bool] = [
|
|
||||||
" true,
|
|
||||||
" false,
|
|
||||||
" false,
|
|
||||||
" true,
|
|
||||||
" ];
|
|
||||||
"
|
|
||||||
" uh oh, next statement is indented further!
|
|
||||||
|
|
||||||
" Note that this does *not* apply the line continuation pattern properly;
|
|
||||||
" that's too hard to do correctly for my liking at present, so I'll just
|
|
||||||
" start with these two main cases (square brackets and not returning to
|
|
||||||
" column zero)
|
|
||||||
|
|
||||||
call cursor(a:lnum, 1)
|
|
||||||
if searchpair('{\|(', '', '}\|)', 'nbW',
|
|
||||||
\ 's:is_string_comment(line("."), col("."))') == 0
|
|
||||||
if searchpair('\[', '', '\]', 'nbW',
|
|
||||||
\ 's:is_string_comment(line("."), col("."))') == 0
|
|
||||||
" Global scope, should be zero
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
" At the module scope, inside square brackets only
|
|
||||||
"if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum
|
|
||||||
if line =~ "^\\s*]"
|
|
||||||
" It's the closing line, dedent it
|
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return &shiftwidth
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Fall back on cindent, which does it mostly right
|
|
||||||
return cindent(a:lnum)
|
|
||||||
endfunction
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
" Vim syntastic plugin helper
|
|
||||||
" Language: Rust
|
|
||||||
" Maintainer: Andrew Gallant <jamslam@gmail.com>
|
|
||||||
|
|
||||||
if exists("g:loaded_syntastic_rust_filetype")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_syntastic_rust_filetype = 1
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
" This is to let Syntastic know about the Rust filetype.
|
|
||||||
" It enables tab completion for the 'SyntasticInfo' command.
|
|
||||||
" (This does not actually register the syntax checker.)
|
|
||||||
if exists('g:syntastic_extra_filetypes')
|
|
||||||
call add(g:syntastic_extra_filetypes, 'rust')
|
|
||||||
else
|
|
||||||
let g:syntastic_extra_filetypes = ['rust']
|
|
||||||
endif
|
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
|
|
@ -1,262 +0,0 @@
|
||||||
" Vim syntax file
|
|
||||||
" Language: Rust
|
|
||||||
" Maintainer: Patrick Walton <pcwalton@mozilla.com>
|
|
||||||
" Maintainer: Ben Blum <bblum@cs.cmu.edu>
|
|
||||||
" Maintainer: Chris Morgan <me@chrismorgan.info>
|
|
||||||
" Last Change: January 5, 2015
|
|
||||||
|
|
||||||
if version < 600
|
|
||||||
syntax clear
|
|
||||||
elseif exists("b:current_syntax")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Syntax definitions {{{1
|
|
||||||
" Basic keywords {{{2
|
|
||||||
syn keyword rustConditional match if else
|
|
||||||
syn keyword rustOperator as
|
|
||||||
|
|
||||||
syn match rustAssert "\<assert\(\w\)*!" contained
|
|
||||||
syn match rustPanic "\<panic\(\w\)*!" contained
|
|
||||||
syn keyword rustKeyword break
|
|
||||||
syn keyword rustKeyword box nextgroup=rustBoxPlacement skipwhite skipempty
|
|
||||||
syn keyword rustKeyword continue
|
|
||||||
syn keyword rustKeyword extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
|
|
||||||
syn keyword rustKeyword fn nextgroup=rustFuncName skipwhite skipempty
|
|
||||||
syn keyword rustKeyword for in if impl let
|
|
||||||
syn keyword rustKeyword loop once pub
|
|
||||||
syn keyword rustKeyword return super
|
|
||||||
syn keyword rustKeyword unsafe virtual where while
|
|
||||||
syn keyword rustKeyword use nextgroup=rustModPath skipwhite skipempty
|
|
||||||
" FIXME: Scoped impl's name is also fallen in this category
|
|
||||||
syn keyword rustKeyword mod trait struct enum type nextgroup=rustIdentifier skipwhite skipempty
|
|
||||||
syn keyword rustStorage move mut ref static const
|
|
||||||
|
|
||||||
syn keyword rustInvalidBareKeyword crate
|
|
||||||
|
|
||||||
syn keyword rustExternCrate crate contained nextgroup=rustIdentifier,rustExternCrateString skipwhite skipempty
|
|
||||||
" This is to get the `bar` part of `extern crate "foo" as bar;` highlighting.
|
|
||||||
syn match rustExternCrateString /".*"\_s*as/ contained nextgroup=rustIdentifier skipwhite transparent skipempty contains=rustString,rustOperator
|
|
||||||
syn keyword rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
|
|
||||||
|
|
||||||
syn match rustIdentifier contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
|
|
||||||
syn match rustFuncName "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
|
|
||||||
|
|
||||||
syn region rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
|
|
||||||
syn keyword rustBoxPlacementExpr GC containedin=rustBoxPlacement
|
|
||||||
" Ideally we'd have syntax rules set up to match arbitrary expressions. Since
|
|
||||||
" we don't, we'll just define temporary contained rules to handle balancing
|
|
||||||
" delimiters.
|
|
||||||
syn region rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
|
|
||||||
syn region rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
|
|
||||||
" {} are handled by rustFoldBraces
|
|
||||||
|
|
||||||
syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount
|
|
||||||
syn match rustMacroRepeatCount ".\?[*+]" contained
|
|
||||||
syn match rustMacroVariable "$\w\+"
|
|
||||||
|
|
||||||
" Reserved (but not yet used) keywords {{{2
|
|
||||||
syn keyword rustReservedKeyword alignof be do offsetof priv pure sizeof typeof unsized yield abstract final override macro
|
|
||||||
|
|
||||||
" Built-in types {{{2
|
|
||||||
syn keyword rustType isize usize float char bool u8 u16 u32 u64 f32
|
|
||||||
syn keyword rustType f64 i8 i16 i32 i64 str Self
|
|
||||||
|
|
||||||
" Things from the prelude (src/libstd/prelude.rs) {{{2
|
|
||||||
" This section is just straight transformation of the contents of the prelude,
|
|
||||||
" to make it easy to update.
|
|
||||||
|
|
||||||
" Reexported core operators {{{3
|
|
||||||
syn keyword rustTrait Copy Send Sized Sync
|
|
||||||
syn keyword rustTrait Drop Fn FnMut FnOnce
|
|
||||||
|
|
||||||
" Reexported functions {{{3
|
|
||||||
syn keyword rustFunction drop
|
|
||||||
|
|
||||||
" Reexported types and traits {{{3
|
|
||||||
syn keyword rustTrait Box
|
|
||||||
syn keyword rustTrait CharExt
|
|
||||||
syn keyword rustTrait Clone
|
|
||||||
syn keyword rustTrait PartialEq PartialOrd Eq Ord
|
|
||||||
syn keyword rustTrait DoubleEndedIterator
|
|
||||||
syn keyword rustTrait ExactSizeIterator
|
|
||||||
syn keyword rustTrait Iterator IteratorExt Extend
|
|
||||||
syn keyword rustEnum Option
|
|
||||||
syn keyword rustEnumVariant Some None
|
|
||||||
syn keyword rustTrait PtrExt MutPtrExt
|
|
||||||
syn keyword rustEnum Result
|
|
||||||
syn keyword rustEnumVariant Ok Err
|
|
||||||
syn keyword rustTrait AsSlice
|
|
||||||
syn keyword rustTrait SliceExt SliceConcatExt
|
|
||||||
syn keyword rustTrait Str StrExt
|
|
||||||
syn keyword rustTrait String ToString
|
|
||||||
syn keyword rustTrait Vec
|
|
||||||
" FIXME: remove when path reform lands
|
|
||||||
syn keyword rustTrait Path GenericPath
|
|
||||||
" FIXME: remove when I/O reform lands
|
|
||||||
syn keyword rustTrait Buffer Writer Reader Seek BufferPrelude
|
|
||||||
|
|
||||||
" Other syntax {{{2
|
|
||||||
syn keyword rustSelf self
|
|
||||||
syn keyword rustBoolean true false
|
|
||||||
|
|
||||||
" If foo::bar changes to foo.bar, change this ("::" to "\.").
|
|
||||||
" If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
|
|
||||||
syn match rustModPath "\w\(\w\)*::[^<]"he=e-3,me=e-3
|
|
||||||
syn match rustModPathSep "::"
|
|
||||||
|
|
||||||
syn match rustFuncCall "\w\(\w\)*("he=e-1,me=e-1
|
|
||||||
syn match rustFuncCall "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
|
|
||||||
|
|
||||||
" This is merely a convention; note also the use of [A-Z], restricting it to
|
|
||||||
" latin identifiers rather than the full Unicode uppercase. I have not used
|
|
||||||
" [:upper:] as it depends upon 'noignorecase'
|
|
||||||
"syn match rustCapsIdent display "[A-Z]\w\(\w\)*"
|
|
||||||
|
|
||||||
syn match rustOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
|
|
||||||
" This one isn't *quite* right, as we could have binary-& with a reference
|
|
||||||
syn match rustSigil display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
|
|
||||||
syn match rustSigil display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
|
|
||||||
" This isn't actually correct; a closure with no arguments can be `|| { }`.
|
|
||||||
" Last, because the & in && isn't a sigil
|
|
||||||
syn match rustOperator display "&&\|||"
|
|
||||||
|
|
||||||
syn match rustMacro '\w\(\w\)*!' contains=rustAssert,rustPanic
|
|
||||||
syn match rustMacro '#\w\(\w\)*' contains=rustAssert,rustPanic
|
|
||||||
|
|
||||||
syn match rustEscapeError display contained /\\./
|
|
||||||
syn match rustEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/
|
|
||||||
syn match rustEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{8}\)/
|
|
||||||
syn match rustEscapeUnicode display contained /\\u{\x\{1,6}}/
|
|
||||||
syn match rustStringContinuation display contained /\\\n\s*/
|
|
||||||
syn region rustString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation
|
|
||||||
syn region rustString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell
|
|
||||||
syn region rustString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell
|
|
||||||
|
|
||||||
syn region rustAttribute start="#!\?\[" end="\]" contains=rustString,rustDerive
|
|
||||||
syn region rustDerive start="derive(" end=")" contained contains=rustTrait
|
|
||||||
|
|
||||||
" Number literals
|
|
||||||
syn match rustDecNumber display "\<[0-9][0-9_]*\%([iu]\%(s\|8\|16\|32\|64\)\)\="
|
|
||||||
syn match rustHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(s\|8\|16\|32\|64\)\)\="
|
|
||||||
syn match rustOctNumber display "\<0o[0-7_]\+\%([iu]\%(s\|8\|16\|32\|64\)\)\="
|
|
||||||
syn match rustBinNumber display "\<0b[01_]\+\%([iu]\%(s\|8\|16\|32\|64\)\)\="
|
|
||||||
|
|
||||||
" Special case for numbers of the form "1." which are float literals, unless followed by
|
|
||||||
" an identifier, which makes them integer literals with a method call or field access,
|
|
||||||
" or by another ".", which makes them integer literals followed by the ".." token.
|
|
||||||
" (This must go first so the others take precedence.)
|
|
||||||
syn match rustFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!"
|
|
||||||
" To mark a number as a normal float, it must have at least one of the three things integral values don't have:
|
|
||||||
" a decimal point and more numbers; an exponent; and a type suffix.
|
|
||||||
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
|
|
||||||
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
|
|
||||||
syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
|
|
||||||
|
|
||||||
" For the benefit of delimitMate
|
|
||||||
syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
|
|
||||||
syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
|
|
||||||
syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
|
|
||||||
|
|
||||||
"rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
|
|
||||||
syn match rustLifetime display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
|
|
||||||
syn match rustCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/
|
|
||||||
" The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII).
|
|
||||||
syn match rustCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
|
|
||||||
syn match rustCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode
|
|
||||||
syn match rustCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\|u{\x\{1,6}}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid
|
|
||||||
|
|
||||||
syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell
|
|
||||||
syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell
|
|
||||||
syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
|
|
||||||
syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
|
|
||||||
syn region rustCommentBlockNest matchgroup=rustCommentBlock start="/\*" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
|
|
||||||
syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*" end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
|
|
||||||
" FIXME: this is a really ugly and not fully correct implementation. Most
|
|
||||||
" importantly, a case like ``/* */*`` should have the final ``*`` not being in
|
|
||||||
" a comment, but in practice at present it leaves comments open two levels
|
|
||||||
" deep. But as long as you stay away from that particular case, I *believe*
|
|
||||||
" the highlighting is correct. Due to the way Vim's syntax engine works
|
|
||||||
" (greedy for start matches, unlike Rust's tokeniser which is searching for
|
|
||||||
" the earliest-starting match, start or end), I believe this cannot be solved.
|
|
||||||
" Oh you who would fix it, don't bother with things like duplicating the Block
|
|
||||||
" rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
|
|
||||||
" then you must deal with cases like ``/*/**/*/``. And don't try making it
|
|
||||||
" worse with ``\%(/\@<!\*\)\@<!``, either...
|
|
||||||
|
|
||||||
syn keyword rustTodo contained TODO FIXME XXX NB NOTE
|
|
||||||
|
|
||||||
" Folding rules {{{2
|
|
||||||
" Trivial folding rules to begin with.
|
|
||||||
" FIXME: use the AST to make really good folding
|
|
||||||
syn region rustFoldBraces start="{" end="}" transparent fold
|
|
||||||
|
|
||||||
" Default highlighting {{{1
|
|
||||||
hi def link rustDecNumber rustNumber
|
|
||||||
hi def link rustHexNumber rustNumber
|
|
||||||
hi def link rustOctNumber rustNumber
|
|
||||||
hi def link rustBinNumber rustNumber
|
|
||||||
hi def link rustIdentifierPrime rustIdentifier
|
|
||||||
hi def link rustTrait rustType
|
|
||||||
|
|
||||||
hi def link rustMacroRepeatCount rustMacroRepeatDelimiters
|
|
||||||
hi def link rustMacroRepeatDelimiters Macro
|
|
||||||
hi def link rustMacroVariable Define
|
|
||||||
hi def link rustSigil StorageClass
|
|
||||||
hi def link rustEscape Special
|
|
||||||
hi def link rustEscapeUnicode rustEscape
|
|
||||||
hi def link rustEscapeError Error
|
|
||||||
hi def link rustStringContinuation Special
|
|
||||||
hi def link rustString String
|
|
||||||
hi def link rustCharacterInvalid Error
|
|
||||||
hi def link rustCharacterInvalidUnicode rustCharacterInvalid
|
|
||||||
hi def link rustCharacter Character
|
|
||||||
hi def link rustNumber Number
|
|
||||||
hi def link rustBoolean Boolean
|
|
||||||
hi def link rustEnum rustType
|
|
||||||
hi def link rustEnumVariant rustConstant
|
|
||||||
hi def link rustConstant Constant
|
|
||||||
hi def link rustSelf Constant
|
|
||||||
hi def link rustFloat Float
|
|
||||||
hi def link rustOperator Operator
|
|
||||||
hi def link rustKeyword Keyword
|
|
||||||
hi def link rustReservedKeyword Error
|
|
||||||
hi def link rustConditional Conditional
|
|
||||||
hi def link rustIdentifier Identifier
|
|
||||||
hi def link rustCapsIdent rustIdentifier
|
|
||||||
hi def link rustModPath Include
|
|
||||||
hi def link rustModPathSep Delimiter
|
|
||||||
hi def link rustFunction Function
|
|
||||||
hi def link rustFuncName Function
|
|
||||||
hi def link rustFuncCall Function
|
|
||||||
hi def link rustCommentLine Comment
|
|
||||||
hi def link rustCommentLineDoc SpecialComment
|
|
||||||
hi def link rustCommentBlock rustCommentLine
|
|
||||||
hi def link rustCommentBlockDoc rustCommentLineDoc
|
|
||||||
hi def link rustAssert PreCondit
|
|
||||||
hi def link rustPanic PreCondit
|
|
||||||
hi def link rustMacro Macro
|
|
||||||
hi def link rustType Type
|
|
||||||
hi def link rustTodo Todo
|
|
||||||
hi def link rustAttribute PreProc
|
|
||||||
hi def link rustDerive PreProc
|
|
||||||
hi def link rustStorage StorageClass
|
|
||||||
hi def link rustObsoleteStorage Error
|
|
||||||
hi def link rustLifetime Special
|
|
||||||
hi def link rustInvalidBareKeyword Error
|
|
||||||
hi def link rustExternCrate rustKeyword
|
|
||||||
hi def link rustObsoleteExternMod Error
|
|
||||||
hi def link rustBoxPlacementParens Delimiter
|
|
||||||
hi def link rustBoxPlacementExpr rustKeyword
|
|
||||||
|
|
||||||
" Other Suggestions:
|
|
||||||
" hi rustAttribute ctermfg=cyan
|
|
||||||
" hi rustDerive ctermfg=cyan
|
|
||||||
" hi rustAssert ctermfg=yellow
|
|
||||||
" hi rustPanic ctermfg=red
|
|
||||||
" hi rustMacro ctermfg=magenta
|
|
||||||
|
|
||||||
syn sync minlines=200
|
|
||||||
syn sync maxlines=500
|
|
||||||
|
|
||||||
let b:current_syntax = "rust"
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
" Vim syntastic plugin
|
|
||||||
" Language: Rust
|
|
||||||
" Maintainer: Andrew Gallant <jamslam@gmail.com>
|
|
||||||
"
|
|
||||||
" See for details on how to add an external Syntastic checker:
|
|
||||||
" https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide#external
|
|
||||||
|
|
||||||
if exists("g:loaded_syntastic_rust_rustc_checker")
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
let g:loaded_syntastic_rust_rustc_checker = 1
|
|
||||||
|
|
||||||
let s:save_cpo = &cpo
|
|
||||||
set cpo&vim
|
|
||||||
|
|
||||||
function! SyntaxCheckers_rust_rustc_GetLocList() dict
|
|
||||||
let makeprg = self.makeprgBuild({ 'args': '-Zparse-only' })
|
|
||||||
|
|
||||||
let errorformat =
|
|
||||||
\ '%E%f:%l:%c: %\d%#:%\d%# %.%\{-}error:%.%\{-} %m,' .
|
|
||||||
\ '%W%f:%l:%c: %\d%#:%\d%# %.%\{-}warning:%.%\{-} %m,' .
|
|
||||||
\ '%C%f:%l %m,' .
|
|
||||||
\ '%-Z%.%#'
|
|
||||||
|
|
||||||
return SyntasticMake({
|
|
||||||
\ 'makeprg': makeprg,
|
|
||||||
\ 'errorformat': errorformat })
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call g:SyntasticRegistry.CreateAndRegisterChecker({
|
|
||||||
\ 'filetype': 'rust',
|
|
||||||
\ 'name': 'rustc'})
|
|
||||||
|
|
||||||
let &cpo = s:save_cpo
|
|
||||||
unlet s:save_cpo
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue