Mercurial > ec-dotfiles
comparison vendor/vim-packs/ctrlp.vim/autoload/ctrlp/autoignore.vim @ 707:4576f1471f53
[update-vendor, vim] add ctrlp
| author | nanaya <me@nanaya.net> |
|---|---|
| date | Sun, 18 Dec 2022 22:27:56 +0900 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 706:4b30df382167 | 707:4576f1471f53 |
|---|---|
| 1 " ============================================================================= | |
| 2 " File: autoload/ctrlp/autoignore.vim | |
| 3 " Description: Auto-ignore Extension | |
| 4 " Author: Ludovic Chabant <github.com/ludovicchabant> | |
| 5 " ============================================================================= | |
| 6 | |
| 7 | |
| 8 " Global Settings {{{ | |
| 9 | |
| 10 if exists('g:ctrlp_autoignore_loaded') && g:ctrlp_autoignore_loaded | |
| 11 \ && !g:ctrlp_autoignore_debug | |
| 12 finish | |
| 13 endif | |
| 14 let g:ctrlp_autoignore_loaded = 1 | |
| 15 | |
| 16 if !exists('g:ctrlp_autoignore_debug') | |
| 17 let g:ctrlp_autoignore_debug = 0 | |
| 18 endif | |
| 19 | |
| 20 if !exists('g:ctrlp_autoignore_trace') | |
| 21 let g:ctrlp_autoignore_trace = 0 | |
| 22 endif | |
| 23 | |
| 24 " }}} | |
| 25 | |
| 26 " Initialization {{{ | |
| 27 | |
| 28 if !exists('g:ctrlp_custom_ignore') | |
| 29 let g:ctrlp_custom_ignore = {} | |
| 30 endif | |
| 31 let g:ctrlp_custom_ignore['func'] = 'ctrlp#autoignore#ignore' | |
| 32 let g:ctrlp_custom_ignore['func-init'] = 'ctrlp#autoignore#ignore_init' | |
| 33 let g:ctrlp_custom_ignore['func-close'] = 'ctrlp#autoignore#ignore_close' | |
| 34 | |
| 35 if !exists('g:ctrlp_root_markers') | |
| 36 let g:ctrlp_root_markers = [] | |
| 37 endif | |
| 38 call add(g:ctrlp_root_markers, '.ctrlpignore') | |
| 39 | |
| 40 " }}} | |
| 41 | |
| 42 " Internals {{{ | |
| 43 | |
| 44 function! s:trace(message) abort | |
| 45 if g:ctrlp_autoignore_trace | |
| 46 echom "ctrlp_autoignore: " . a:message | |
| 47 endif | |
| 48 endfunction | |
| 49 | |
| 50 let s:proj_cache = {} | |
| 51 let s:active_cwd = '' | |
| 52 let s:active_cwd_len = 0 | |
| 53 let s:active_patterns = [] | |
| 54 let s:changed_wildignore = 0 | |
| 55 let s:prev_wildignore = '' | |
| 56 | |
| 57 function! s:load_project_patterns(root_dir) abort | |
| 58 let l:ign_path = a:root_dir . '/.ctrlpignore' | |
| 59 if !filereadable(l:ign_path) | |
| 60 call s:trace("No pattern file at: " . l:ign_path) | |
| 61 return [] | |
| 62 endif | |
| 63 let l:cursyntax = 'regexp' | |
| 64 let l:knownsyntaxes = ['regexp', 'wildignore'] | |
| 65 let l:patterns = [] | |
| 66 let l:lines = readfile(l:ign_path) | |
| 67 for line in l:lines | |
| 68 " Comment line? | |
| 69 if match(line, '\v^\s*$') >= 0 || match(line, '\v^\s*#') >= 0 | |
| 70 continue | |
| 71 endif | |
| 72 " Syntax change? | |
| 73 let l:matches = matchlist(line, '\v^syntax:\s?(\w+)\s*$') | |
| 74 if len(l:matches) > 0 | |
| 75 let l:cursyntax = l:matches[1] | |
| 76 if index(l:knownsyntaxes, l:cursyntax) < 0 | |
| 77 echoerr "ctrlp_autoignore: Unknown syntax '".l:cursyntax."' in: ".l:ign_path | |
| 78 endif | |
| 79 continue | |
| 80 endif | |
| 81 " Patterns! | |
| 82 let l:matches = matchlist(line, '\v^((dir|file|link)\:)?(.*)') | |
| 83 let l:mtype = l:matches[2] | |
| 84 let l:mpat = l:matches[3] | |
| 85 call add(l:patterns, {'syn': l:cursyntax, 'type': l:mtype, 'pat': l:mpat}) | |
| 86 endfor | |
| 87 call s:trace("Loaded " . len(l:patterns) . " patterns from: " . l:ign_path) | |
| 88 return l:patterns | |
| 89 endfunction | |
| 90 | |
| 91 function! s:get_project_patterns(root_dir) abort | |
| 92 let l:ign_path = a:root_dir . '/.ctrlpignore' | |
| 93 let l:ign_mtime = getftime(l:ign_path) | |
| 94 let l:patterns = get(s:proj_cache, a:root_dir) | |
| 95 if type(l:patterns) == type({}) | |
| 96 " Check that these patterns are still valid. | |
| 97 if l:ign_mtime < 0 | |
| 98 " File got deleted! :( | |
| 99 let l:patterns['pats'] = [] | |
| 100 return l:patterns['pats'] | |
| 101 elseif l:ign_mtime <= l:patterns['mtime'] | |
| 102 " File hasn't changed! :) | |
| 103 return l:patterns['pats'] | |
| 104 endif | |
| 105 endif | |
| 106 | |
| 107 call s:trace("Loading patterns for project: " . a:root_dir) | |
| 108 let l:loaded = s:load_project_patterns(a:root_dir) | |
| 109 let s:proj_cache[a:root_dir] = { | |
| 110 \'mtime': localtime(), | |
| 111 \'pats': l:loaded} | |
| 112 return l:loaded | |
| 113 endfunction | |
| 114 | |
| 115 " The custom ignore function that CtrlP will be using in addition to | |
| 116 " normal pattern-based matching. | |
| 117 function! ctrlp#autoignore#ignore(item, type) abort | |
| 118 let l:cnv_item = tr(strpart(a:item, s:active_cwd_len), "\\", "/") | |
| 119 for pat in s:active_patterns | |
| 120 if pat['syn'] != 'regexp' | |
| 121 continue | |
| 122 endif | |
| 123 if pat['type'] == '' || pat['type'] == a:type | |
| 124 if match(l:cnv_item, pat['pat']) >= 0 | |
| 125 call s:trace("Ignoring ".l:cnv_item." because of ".pat['pat']) | |
| 126 return 1 | |
| 127 endif | |
| 128 endif | |
| 129 endfor | |
| 130 return 0 | |
| 131 endfunction | |
| 132 | |
| 133 function! ctrlp#autoignore#ignore_init() abort | |
| 134 let l:root = getcwd() | |
| 135 let s:active_cwd = l:root | |
| 136 " len+1 is for including the next separator after the root. | |
| 137 let s:active_cwd_len = len(l:root) + 1 | |
| 138 let s:active_patterns = s:get_project_patterns(l:root) | |
| 139 call s:trace("Got ".len(s:active_patterns)." patterns for ".l:root) | |
| 140 | |
| 141 let s:changed_wildignore = 0 | |
| 142 let s:prev_wildignore = &wildignore | |
| 143 for pat in s:active_patterns | |
| 144 if pat['syn'] == 'wildignore' | |
| 145 execute 'set wildignore+='.pat['pat'] | |
| 146 let s:changed_wildignore = 1 | |
| 147 endif | |
| 148 endfor | |
| 149 if s:changed_wildignore | |
| 150 call s:trace("Set wildignore to ".&wildignore) | |
| 151 endif | |
| 152 endfunction | |
| 153 | |
| 154 function! ctrlp#autoignore#ignore_close() abort | |
| 155 if s:changed_wildignore | |
| 156 execute 'set wildignore='.s:prev_wildignore | |
| 157 let s:prev_wildignore = '' | |
| 158 call s:trace("Set wildignore back to ".&wildignore) | |
| 159 endif | |
| 160 endfunction | |
| 161 | |
| 162 " List patterns for a given project's root. | |
| 163 function! ctrlp#autoignore#get_patterns(root_dir) abort | |
| 164 let l:patterns = s:get_project_patterns(a:root_dir) | |
| 165 for pat in l:patterns | |
| 166 let l:prefix = pat['type'] == '' ? '(all)' : pat['type'] | |
| 167 echom l:prefix . ':' . pat['pat'] | |
| 168 endfor | |
| 169 endfunction | |
| 170 | |
| 171 " }}} | |
| 172 | |
| 173 " vim:fen:fdm=marker:fmr={{{,}}}:fdl=0:fdc=1:ts=2:sw=2:sts=2 |
