mirror of
https://github.com/amix/vimrc
synced 2025-08-04 04:05:00 +08:00
Use ctrlpvim/ctrlp.vim instead of unmaintained kien/ctrlp.vim
This commit is contained in:
173
sources_non_forked/ctrlp.vim/autoload/ctrlp/autoignore.vim
Normal file
173
sources_non_forked/ctrlp.vim/autoload/ctrlp/autoignore.vim
Normal file
@ -0,0 +1,173 @@
|
||||
" =============================================================================
|
||||
" File: autoload/ctrlp/autoignore.vim
|
||||
" Description: Auto-ignore Extension
|
||||
" Author: Ludovic Chabant <github.com/ludovicchabant>
|
||||
" =============================================================================
|
||||
|
||||
|
||||
" Global Settings {{{
|
||||
|
||||
if exists('g:ctrlp_autoignore_loaded') && g:ctrlp_autoignore_loaded
|
||||
\ && !g:ctrlp_autoignore_debug
|
||||
finish
|
||||
endif
|
||||
let g:ctrlp_autoignore_loaded = 1
|
||||
|
||||
if !exists('g:ctrlp_autoignore_debug')
|
||||
let g:ctrlp_autoignore_debug = 0
|
||||
endif
|
||||
|
||||
if !exists('g:ctrlp_autoignore_trace')
|
||||
let g:ctrlp_autoignore_trace = 0
|
||||
endif
|
||||
|
||||
" }}}
|
||||
|
||||
" Initialization {{{
|
||||
|
||||
if !exists('g:ctrlp_custom_ignore')
|
||||
let g:ctrlp_custom_ignore = {}
|
||||
endif
|
||||
let g:ctrlp_custom_ignore['func'] = 'ctrlp#autoignore#ignore'
|
||||
let g:ctrlp_custom_ignore['func-init'] = 'ctrlp#autoignore#ignore_init'
|
||||
let g:ctrlp_custom_ignore['func-close'] = 'ctrlp#autoignore#ignore_close'
|
||||
|
||||
if !exists('g:ctrlp_root_markers')
|
||||
let g:ctrlp_root_markers = []
|
||||
endif
|
||||
call add(g:ctrlp_root_markers, '.ctrlpignore')
|
||||
|
||||
" }}}
|
||||
|
||||
" Internals {{{
|
||||
|
||||
function! s:trace(message) abort
|
||||
if g:ctrlp_autoignore_trace
|
||||
echom "ctrlp_autoignore: " . a:message
|
||||
endif
|
||||
endfunction
|
||||
|
||||
let s:proj_cache = {}
|
||||
let s:active_cwd = ''
|
||||
let s:active_cwd_len = 0
|
||||
let s:active_patterns = []
|
||||
let s:changed_wildignore = 0
|
||||
let s:prev_wildignore = ''
|
||||
|
||||
function! s:load_project_patterns(root_dir) abort
|
||||
let l:ign_path = a:root_dir . '/.ctrlpignore'
|
||||
if !filereadable(l:ign_path)
|
||||
call s:trace("No pattern file at: " . l:ign_path)
|
||||
return []
|
||||
endif
|
||||
let l:cursyntax = 'regexp'
|
||||
let l:knownsyntaxes = ['regexp', 'wildignore']
|
||||
let l:patterns = []
|
||||
let l:lines = readfile(l:ign_path)
|
||||
for line in l:lines
|
||||
" Comment line?
|
||||
if match(line, '\v^\s*$') >= 0 || match(line, '\v^\s*#') >= 0
|
||||
continue
|
||||
endif
|
||||
" Syntax change?
|
||||
let l:matches = matchlist(line, '\v^syntax:\s?(\w+)\s*$')
|
||||
if len(l:matches) > 0
|
||||
let l:cursyntax = l:matches[1]
|
||||
if index(l:knownsyntaxes, l:cursyntax) < 0
|
||||
echoerr "ctrlp_autoignore: Unknown syntax '".l:cursyntax."' in: ".l:ign_path
|
||||
endif
|
||||
continue
|
||||
endif
|
||||
" Patterns!
|
||||
let l:matches = matchlist(line, '\v^((dir|file|link)\:)?(.*)')
|
||||
let l:mtype = l:matches[2]
|
||||
let l:mpat = l:matches[3]
|
||||
call add(l:patterns, {'syn': l:cursyntax, 'type': l:mtype, 'pat': l:mpat})
|
||||
endfor
|
||||
call s:trace("Loaded " . len(l:patterns) . " patterns from: " . l:ign_path)
|
||||
return l:patterns
|
||||
endfunction
|
||||
|
||||
function! s:get_project_patterns(root_dir) abort
|
||||
let l:ign_path = a:root_dir . '/.ctrlpignore'
|
||||
let l:ign_mtime = getftime(l:ign_path)
|
||||
let l:patterns = get(s:proj_cache, a:root_dir)
|
||||
if type(l:patterns) == type({})
|
||||
" Check that these patterns are still valid.
|
||||
if l:ign_mtime < 0
|
||||
" File got deleted! :(
|
||||
let l:patterns['pats'] = []
|
||||
return l:patterns['pats']
|
||||
elseif l:ign_mtime <= l:patterns['mtime']
|
||||
" File hasn't changed! :)
|
||||
return l:patterns['pats']
|
||||
endif
|
||||
endif
|
||||
|
||||
call s:trace("Loading patterns for project: " . a:root_dir)
|
||||
let l:loaded = s:load_project_patterns(a:root_dir)
|
||||
let s:proj_cache[a:root_dir] = {
|
||||
\'mtime': localtime(),
|
||||
\'pats': l:loaded}
|
||||
return l:loaded
|
||||
endfunction
|
||||
|
||||
" The custom ignore function that CtrlP will be using in addition to
|
||||
" normal pattern-based matching.
|
||||
function! ctrlp#autoignore#ignore(item, type) abort
|
||||
let l:cnv_item = tr(strpart(a:item, s:active_cwd_len), "\\", "/")
|
||||
for pat in s:active_patterns
|
||||
if pat['syn'] != 'regexp'
|
||||
continue
|
||||
endif
|
||||
if pat['type'] == '' || pat['type'] == a:type
|
||||
if match(l:cnv_item, pat['pat']) >= 0
|
||||
call s:trace("Ignoring ".l:cnv_item." because of ".pat['pat'])
|
||||
return 1
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
function! ctrlp#autoignore#ignore_init() abort
|
||||
let l:root = getcwd()
|
||||
let s:active_cwd = l:root
|
||||
" len+1 is for including the next separator after the root.
|
||||
let s:active_cwd_len = len(l:root) + 1
|
||||
let s:active_patterns = s:get_project_patterns(l:root)
|
||||
call s:trace("Got ".len(s:active_patterns)." patterns for ".l:root)
|
||||
|
||||
let s:changed_wildignore = 0
|
||||
let s:prev_wildignore = &wildignore
|
||||
for pat in s:active_patterns
|
||||
if pat['syn'] == 'wildignore'
|
||||
execute 'set wildignore+='.pat['pat']
|
||||
let s:changed_wildignore = 1
|
||||
endif
|
||||
endfor
|
||||
if s:changed_wildignore
|
||||
call s:trace("Set wildignore to ".&wildignore)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! ctrlp#autoignore#ignore_close() abort
|
||||
if s:changed_wildignore
|
||||
execute 'set wildignore='.s:prev_wildignore
|
||||
let s:prev_wildignore = ''
|
||||
call s:trace("Set wildignore back to ".&wildignore)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" List patterns for a given project's root.
|
||||
function! ctrlp#autoignore#get_patterns(root_dir) abort
|
||||
let l:patterns = s:get_project_patterns(a:root_dir)
|
||||
for pat in l:patterns
|
||||
let l:prefix = pat['type'] == '' ? '(all)' : pat['type']
|
||||
echom l:prefix . ':' . pat['pat']
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
" }}}
|
||||
|
||||
" vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2
|
@ -112,13 +112,20 @@ fu! ctrlp#bookmarkdir#accept(mode, str)
|
||||
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
|
||||
fu! ctrlp#bookmarkdir#add(bang, dir, ...)
|
||||
let ctrlp_tilde_homedir = get(g:, 'ctrlp_tilde_homedir', 0)
|
||||
let cwd = fnamemodify(getcwd(), ctrlp_tilde_homedir ? ':p:~' : ':p')
|
||||
let dir = fnamemodify(a:dir, ctrlp_tilde_homedir ? ':p:~' : ':p')
|
||||
if a:bang == '!'
|
||||
let cwd = dir != '' ? dir : cwd
|
||||
let name = a:0 && a:1 != '' ? a:1 : cwd
|
||||
el
|
||||
let str = 'Directory to bookmark: '
|
||||
let cwd = dir != '' ? dir : s:getinput(str, cwd, 'dir')
|
||||
if cwd == '' | retu | en
|
||||
let name = a:0 && a:1 != '' ? a:1 : s:getinput('Bookmark as: ', cwd)
|
||||
if name == '' | retu | en
|
||||
en
|
||||
let name = tr(name, ' ', ' ')
|
||||
cal s:savebookmark(name, cwd)
|
||||
cal s:msg(name, cwd)
|
||||
|
@ -43,6 +43,7 @@ let s:bins = [
|
||||
\ ]
|
||||
|
||||
let s:types = {
|
||||
\ 'ant' : '%sant%sant%spt',
|
||||
\ 'asm' : '%sasm%sasm%sdlmt',
|
||||
\ 'aspperl': '%sasp%sasp%sfsv',
|
||||
\ 'aspvbs' : '%sasp%sasp%sfsv',
|
||||
@ -52,6 +53,8 @@ let s:types = {
|
||||
\ 'cpp' : '%sc++%sc++%snvdtcgsuf',
|
||||
\ 'cs' : '%sc#%sc#%sdtncEgsipm',
|
||||
\ 'cobol' : '%scobol%scobol%sdfgpPs',
|
||||
\ 'delphi' : '%spascal%spascal%sfp',
|
||||
\ 'dosbatch': '%sdosbatch%sdosbatch%slv',
|
||||
\ 'eiffel' : '%seiffel%seiffel%scf',
|
||||
\ 'erlang' : '%serlang%serlang%sdrmf',
|
||||
\ 'expect' : '%stcl%stcl%scfp',
|
||||
@ -62,6 +65,7 @@ let s:types = {
|
||||
\ 'lisp' : '%slisp%slisp%sf',
|
||||
\ 'lua' : '%slua%slua%sf',
|
||||
\ 'make' : '%smake%smake%sm',
|
||||
\ 'matlab' : '%smatlab%smatlab%sf',
|
||||
\ 'ocaml' : '%socaml%socaml%scmMvtfCre',
|
||||
\ 'pascal' : '%spascal%spascal%sfp',
|
||||
\ 'perl' : '%sperl%sperl%sclps',
|
||||
@ -69,16 +73,20 @@ let s:types = {
|
||||
\ 'python' : '%spython%spython%scmf',
|
||||
\ 'rexx' : '%srexx%srexx%ss',
|
||||
\ 'ruby' : '%sruby%sruby%scfFm',
|
||||
\ 'rust' : '%srust%srust%sfTgsmctid',
|
||||
\ 'scheme' : '%sscheme%sscheme%ssf',
|
||||
\ 'sh' : '%ssh%ssh%sf',
|
||||
\ 'csh' : '%ssh%ssh%sf',
|
||||
\ 'zsh' : '%ssh%ssh%sf',
|
||||
\ 'scala' : '%sscala%sscala%sctTmlp',
|
||||
\ 'slang' : '%sslang%sslang%snf',
|
||||
\ 'sml' : '%ssml%ssml%secsrtvf',
|
||||
\ 'sql' : '%ssql%ssql%scFPrstTvfp',
|
||||
\ 'tex' : '%stex%stex%sipcsubPGl',
|
||||
\ 'tcl' : '%stcl%stcl%scfmp',
|
||||
\ 'vera' : '%svera%svera%scdefgmpPtTvx',
|
||||
\ 'verilog': '%sverilog%sverilog%smcPertwpvf',
|
||||
\ 'vhdl' : '%svhdl%svhdl%sPctTrefp',
|
||||
\ 'vim' : '%svim%svim%savf',
|
||||
\ 'yacc' : '%syacc%syacc%sl',
|
||||
\ }
|
||||
@ -130,7 +138,7 @@ fu! s:exectags(cmd)
|
||||
endf
|
||||
|
||||
fu! s:exectagsonfile(fname, ftype)
|
||||
let [ags, ft] = ['-f - --sort=no --excmd=pattern --fields=nKs ', a:ftype]
|
||||
let [ags, ft] = ['-f - --sort=no --excmd=pattern --fields=nKs --extra= ', a:ftype]
|
||||
if type(s:types[ft]) == 1
|
||||
let ags .= s:types[ft]
|
||||
let bin = s:bin
|
||||
@ -151,7 +159,11 @@ fu! s:esctagscmd(bin, args, ...)
|
||||
let [ssl, &ssl] = [&ssl, 0]
|
||||
en
|
||||
let fname = a:0 ? shellescape(a:1) : ''
|
||||
let cmd = shellescape(a:bin).' '.a:args.' '.fname
|
||||
if (has('win32') || has('win64'))
|
||||
let cmd = a:bin.' '.a:args.' '.fname
|
||||
else
|
||||
let cmd = shellescape(a:bin).' '.a:args.' '.fname
|
||||
endif
|
||||
if &sh =~ 'cmd\.exe'
|
||||
let cmd = substitute(cmd, '[&()@^<>|]', '^\0', 'g')
|
||||
en
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
" Static variables {{{1
|
||||
let [s:mrbs, s:mrufs] = [[], []]
|
||||
let s:mruf_map_string = '!stridx(v:val, cwd) ? strpart(v:val, idx) : v:val'
|
||||
|
||||
fu! ctrlp#mrufiles#opts()
|
||||
let [pref, opts] = ['g:ctrlp_mruf_', {
|
||||
@ -15,6 +16,7 @@ fu! ctrlp#mrufiles#opts()
|
||||
\ 'case_sensitive': ['s:cseno', 1],
|
||||
\ 'relative': ['s:re', 0],
|
||||
\ 'save_on_update': ['s:soup', 1],
|
||||
\ 'map_string': ['g:ctrlp_mruf_map_string', s:mruf_map_string],
|
||||
\ }]
|
||||
for [ke, va] in items(opts)
|
||||
let [{va[0]}, {pref.ke}] = [pref.ke, exists(pref.ke) ? {pref.ke} : va[1]]
|
||||
@ -51,7 +53,7 @@ fu! s:reformat(mrufs, ...)
|
||||
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')
|
||||
retu map(a:mrufs, g:ctrlp_mruf_map_string)
|
||||
endf
|
||||
|
||||
fu! s:record(bufnr)
|
||||
@ -66,10 +68,12 @@ fu! s:record(bufnr)
|
||||
endf
|
||||
|
||||
fu! s:addtomrufs(fname)
|
||||
let fn = fnamemodify(a:fname, ':p')
|
||||
let fn = fnamemodify(a:fname, get(g:, 'ctrlp_tilde_homedir', 0) ? ':p:~' : ':p')
|
||||
let fn = exists('+ssl') ? tr(fn, '/', '\') : fn
|
||||
let abs_fn = fnamemodify(fn,':p')
|
||||
if ( !empty({s:in}) && fn !~# {s:in} ) || ( !empty({s:ex}) && fn =~# {s:ex} )
|
||||
\ || !empty(getbufvar('^'.fn.'$', '&bt')) || !filereadable(fn) | retu
|
||||
\ || !empty(getbufvar('^' . abs_fn . '$', '&bt')) || !filereadable(abs_fn)
|
||||
retu
|
||||
en
|
||||
let idx = index(s:mrufs, fn, 0, !{s:cseno})
|
||||
if idx
|
||||
@ -143,7 +147,7 @@ fu! ctrlp#mrufiles#init()
|
||||
let s:locked = 0
|
||||
aug CtrlPMRUF
|
||||
au!
|
||||
au BufAdd,BufEnter,BufLeave,BufWritePost * cal s:record(expand('<abuf>', 1))
|
||||
au BufWinEnter,BufWinLeave,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())
|
||||
|
@ -21,7 +21,7 @@ cal add(g:ctrlp_ext_vars, {
|
||||
|
||||
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
|
||||
" Utilities {{{1
|
||||
fu! s:findcount(str)
|
||||
fu! s:findcount(str, tgaddr)
|
||||
let [tg, ofname] = split(a:str, '\t\+\ze[^\t]\+$')
|
||||
let tgs = taglist('^'.tg.'$')
|
||||
if len(tgs) < 2
|
||||
@ -48,7 +48,13 @@ fu! s:findcount(str)
|
||||
for tgi in ntgs
|
||||
let cnt += 1
|
||||
if tgi["filename"] == ofname
|
||||
let [fnd, pos] = [0, cnt]
|
||||
if a:tgaddr != ""
|
||||
if a:tgaddr == tgi["cmd"]
|
||||
let [fnd, pos] = [0, cnt]
|
||||
en
|
||||
else
|
||||
let [fnd, pos] = [0, cnt]
|
||||
en
|
||||
en
|
||||
endfo
|
||||
retu [1, fnd, pos, len(ctgs)]
|
||||
@ -92,8 +98,9 @@ endf
|
||||
|
||||
fu! ctrlp#tag#accept(mode, str)
|
||||
cal ctrlp#exit()
|
||||
let tgaddr = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\t\zs[^\t]\{-1,}\ze\%(;"\)\?\t')
|
||||
let str = matchstr(a:str, '^[^\t]\+\t\+[^\t]\+\ze\t')
|
||||
let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str)]
|
||||
let [tg, fdcnt] = [split(str, '^[^\t]\+\zs\t')[0], s:findcount(str, tgaddr)]
|
||||
let cmds = {
|
||||
\ 't': ['tab sp', 'tab stj'],
|
||||
\ 'h': ['sp', 'stj'],
|
||||
@ -121,6 +128,7 @@ fu! ctrlp#tag#accept(mode, str)
|
||||
en
|
||||
cal feedkeys(":".cmd." ".tg."\r".ext, 'nt')
|
||||
en
|
||||
cal feedkeys('zvzz', 'nt')
|
||||
cal ctrlp#setlcdir()
|
||||
endf
|
||||
|
||||
|
Reference in New Issue
Block a user