diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/vim-packs/ctrlp.vim/autoload/ctrlp/autoignore.vim	Sun Dec 18 22:27:56 2022 +0900
@@ -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