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 |