]> git.r.bdr.sh - rbdr/dotfiles/blame_incremental - vim/autoload/pathogen.vim
Update the stuff
[rbdr/dotfiles] / vim / autoload / pathogen.vim
... / ...
CommitLineData
1" pathogen.vim - path option manipulation
2" Maintainer: Tim Pope <http://tpo.pe/>
3" Version: 2.0
4
5" Install in ~/.vim/autoload (or ~\vimfiles\autoload).
6"
7" For management of individually installed plugins in ~/.vim/bundle (or
8" ~\vimfiles\bundle), adding `call pathogen#infect()` to your .vimrc
9" prior to `filetype plugin indent on` is the only other setup necessary.
10"
11" The API is documented inline below. For maximum ease of reading,
12" :set foldmethod=marker
13
14if exists("g:loaded_pathogen") || &cp
15 finish
16endif
17let g:loaded_pathogen = 1
18
19" Point of entry for basic default usage. Give a directory name to invoke
20" pathogen#runtime_append_all_bundles() (defaults to "bundle"), or a full path
21" to invoke pathogen#runtime_prepend_subdirectories(). Afterwards,
22" pathogen#cycle_filetype() is invoked.
23function! pathogen#infect(...) abort " {{{1
24 let source_path = a:0 ? a:1 : 'bundle'
25 if source_path =~# '[\\/]'
26 call pathogen#runtime_prepend_subdirectories(source_path)
27 else
28 call pathogen#runtime_append_all_bundles(source_path)
29 endif
30 call pathogen#cycle_filetype()
31endfunction " }}}1
32
33" Split a path into a list.
34function! pathogen#split(path) abort " {{{1
35 if type(a:path) == type([]) | return a:path | endif
36 let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
37 return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
38endfunction " }}}1
39
40" Convert a list to a path.
41function! pathogen#join(...) abort " {{{1
42 if type(a:1) == type(1) && a:1
43 let i = 1
44 let space = ' '
45 else
46 let i = 0
47 let space = ''
48 endif
49 let path = ""
50 while i < a:0
51 if type(a:000[i]) == type([])
52 let list = a:000[i]
53 let j = 0
54 while j < len(list)
55 let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
56 let path .= ',' . escaped
57 let j += 1
58 endwhile
59 else
60 let path .= "," . a:000[i]
61 endif
62 let i += 1
63 endwhile
64 return substitute(path,'^,','','')
65endfunction " }}}1
66
67" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
68function! pathogen#legacyjoin(...) abort " {{{1
69 return call('pathogen#join',[1] + a:000)
70endfunction " }}}1
71
72" Remove duplicates from a list.
73function! pathogen#uniq(list) abort " {{{1
74 let i = 0
75 let seen = {}
76 while i < len(a:list)
77 if (a:list[i] ==# '' && exists('empty')) || has_key(seen,a:list[i])
78 call remove(a:list,i)
79 elseif a:list[i] ==# ''
80 let i += 1
81 let empty = 1
82 else
83 let seen[a:list[i]] = 1
84 let i += 1
85 endif
86 endwhile
87 return a:list
88endfunction " }}}1
89
90" \ on Windows unless shellslash is set, / everywhere else.
91function! pathogen#separator() abort " {{{1
92 return !exists("+shellslash") || &shellslash ? '/' : '\'
93endfunction " }}}1
94
95" Convenience wrapper around glob() which returns a list.
96function! pathogen#glob(pattern) abort " {{{1
97 let files = split(glob(a:pattern),"\n")
98 return map(files,'substitute(v:val,"[".pathogen#separator()."/]$","","")')
99endfunction "}}}1
100
101" Like pathogen#glob(), only limit the results to directories.
102function! pathogen#glob_directories(pattern) abort " {{{1
103 return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
104endfunction "}}}1
105
106" Turn filetype detection off and back on again if it was already enabled.
107function! pathogen#cycle_filetype() " {{{1
108 if exists('g:did_load_filetypes')
109 filetype off
110 filetype on
111 endif
112endfunction " }}}1
113
114" Checks if a bundle is 'disabled'. A bundle is considered 'disabled' if
115" its 'basename()' is included in g:pathogen_disabled[]' or ends in a tilde.
116function! pathogen#is_disabled(path) " {{{1
117 if a:path =~# '\~$'
118 return 1
119 elseif !exists("g:pathogen_disabled")
120 return 0
121 endif
122 let sep = pathogen#separator()
123 return index(g:pathogen_disabled, strpart(a:path, strridx(a:path, sep)+1)) != -1
124endfunction "}}}1
125
126" Prepend all subdirectories of path to the rtp, and append all 'after'
127" directories in those subdirectories.
128function! pathogen#runtime_prepend_subdirectories(path) " {{{1
129 let sep = pathogen#separator()
130 let before = filter(pathogen#glob_directories(a:path.sep."*"), '!pathogen#is_disabled(v:val)')
131 let after = filter(pathogen#glob_directories(a:path.sep."*".sep."after"), '!pathogen#is_disabled(v:val[0:-7])')
132 let rtp = pathogen#split(&rtp)
133 let path = expand(a:path)
134 call filter(rtp,'v:val[0:strlen(path)-1] !=# path')
135 let &rtp = pathogen#join(pathogen#uniq(before + rtp + after))
136 return &rtp
137endfunction " }}}1
138
139" For each directory in rtp, check for a subdirectory named dir. If it
140" exists, add all subdirectories of that subdirectory to the rtp, immediately
141" after the original directory. If no argument is given, 'bundle' is used.
142" Repeated calls with the same arguments are ignored.
143function! pathogen#runtime_append_all_bundles(...) " {{{1
144 let sep = pathogen#separator()
145 let name = a:0 ? a:1 : 'bundle'
146 if "\n".s:done_bundles =~# "\\M\n".name."\n"
147 return ""
148 endif
149 let s:done_bundles .= name . "\n"
150 let list = []
151 for dir in pathogen#split(&rtp)
152 if dir =~# '\<after$'
153 let list += filter(pathogen#glob_directories(substitute(dir,'after$',name,'').sep.'*[^~]'.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])') + [dir]
154 else
155 let list += [dir] + filter(pathogen#glob_directories(dir.sep.name.sep.'*[^~]'), '!pathogen#is_disabled(v:val)')
156 endif
157 endfor
158 let &rtp = pathogen#join(pathogen#uniq(list))
159 return 1
160endfunction
161
162let s:done_bundles = ''
163" }}}1
164
165" Invoke :helptags on all non-$VIM doc directories in runtimepath.
166function! pathogen#helptags() " {{{1
167 let sep = pathogen#separator()
168 for dir in pathogen#split(&rtp)
169 if (dir.sep)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir.sep.'doc') == 2 && !empty(filter(split(glob(dir.sep.'doc'.sep.'*'),"\n>"),'!isdirectory(v:val)')) && (!filereadable(dir.sep.'doc'.sep.'tags') || filewritable(dir.sep.'doc'.sep.'tags'))
170 helptags `=dir.'/doc'`
171 endif
172 endfor
173endfunction " }}}1
174
175command! -bar Helptags :call pathogen#helptags()
176
177" Like findfile(), but hardcoded to use the runtimepath.
178function! pathogen#runtime_findfile(file,count) "{{{1
179 let rtp = pathogen#join(1,pathogen#split(&rtp))
180 let file = findfile(a:file,rtp,a:count)
181 if file ==# ''
182 return ''
183 else
184 return fnamemodify(file,':p')
185 endif
186endfunction " }}}1
187
188" Backport of fnameescape().
189function! pathogen#fnameescape(string) " {{{1
190 if exists('*fnameescape')
191 return fnameescape(a:string)
192 elseif a:string ==# '-'
193 return '\-'
194 else
195 return substitute(escape(a:string," \t\n*?[{`$\\%#'\"|!<"),'^[+>]','\\&','')
196 endif
197endfunction " }}}1
198
199function! s:find(count,cmd,file,lcd) " {{{1
200 let rtp = pathogen#join(1,pathogen#split(&runtimepath))
201 let file = pathogen#runtime_findfile(a:file,a:count)
202 if file ==# ''
203 return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'"
204 elseif a:lcd
205 let path = file[0:-strlen(a:file)-2]
206 execute 'lcd `=path`'
207 return a:cmd.' '.pathogen#fnameescape(a:file)
208 else
209 return a:cmd.' '.pathogen#fnameescape(file)
210 endif
211endfunction " }}}1
212
213function! s:Findcomplete(A,L,P) " {{{1
214 let sep = pathogen#separator()
215 let cheats = {
216 \'a': 'autoload',
217 \'d': 'doc',
218 \'f': 'ftplugin',
219 \'i': 'indent',
220 \'p': 'plugin',
221 \'s': 'syntax'}
222 if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0])
223 let request = cheats[a:A[0]].a:A[1:-1]
224 else
225 let request = a:A
226 endif
227 let pattern = substitute(request,'/\|\'.sep,'*'.sep,'g').'*'
228 let found = {}
229 for path in pathogen#split(&runtimepath)
230 let path = expand(path, ':p')
231 let matches = split(glob(path.sep.pattern),"\n")
232 call map(matches,'isdirectory(v:val) ? v:val.sep : v:val')
233 call map(matches,'expand(v:val, ":p")[strlen(path)+1:-1]')
234 for match in matches
235 let found[match] = 1
236 endfor
237 endfor
238 return sort(keys(found))
239endfunction " }}}1
240
241command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(<count>,'edit<bang>',<q-args>,0)
242command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>,0)
243command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,1)
244command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split',<q-args>,<bang>1)
245command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit',<q-args>,<bang>1)
246command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit',<q-args>,<bang>1)
247command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit',<q-args>,<bang>1)
248command! -bar -bang -range=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read',<q-args>,<bang>1)
249
250" vim:set ft=vim ts=8 sw=2 sts=2: