mirror of
https://github.com/tpope/vim-pathogen.git
synced 2026-06-01 11:18:51 +02:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ede9571bc3 | |||
| 040ee8f432 | |||
| a9fcd31a7e | |||
| 3ff705c08e | |||
| 85040e24e8 | |||
| 09cf830c77 | |||
| 43f6273c3c | |||
| 8c46ed160e | |||
| b356563fc8 | |||
| 0abca7beba | |||
| f1c0ee6166 | |||
| 0a8144bf3d | |||
| dccb822c0a | |||
| 3a4129f948 | |||
| e06454cb49 | |||
| 0d230bc4c6 | |||
| 73ba356522 | |||
| 8484839faa | |||
| f56ab3149a | |||
| e9ab337487 | |||
| 568eec91d8 | |||
| 72586074e5 | |||
| fcf77f5101 | |||
| 50650f2531 | |||
| b147125552 | |||
| af5659596e | |||
| 3e63bdb7c4 | |||
| 552e5f0bf8 | |||
| c8f5e6c63c | |||
| a50ad7c80e | |||
| 968e87ef7f | |||
| 52b091892c | |||
| 258c47fe06 | |||
| f4f79bc720 |
+170
@@ -0,0 +1,170 @@
|
||||
pathogen.vim
|
||||
============
|
||||
|
||||
Manage your `'runtimepath'` with ease. In practical terms, pathogen.vim
|
||||
makes it super easy to install plugins and runtime files in their own
|
||||
private directories.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Install to `~/.vim/autoload/pathogen.vim`. Or copy and paste:
|
||||
|
||||
mkdir -p ~/.vim/autoload ~/.vim/bundle
|
||||
curl https://raw.github.com/tpope/vim-pathogen/HEAD/autoload/pathogen.vim \
|
||||
> ~/.vim/autoload/pathogen.vim
|
||||
|
||||
If you don't have `curl`, use `wget -O -` instead.
|
||||
|
||||
By the way, if you're using Windows, change all occurrences of `~/.vim`
|
||||
to `~\vimfiles`.
|
||||
|
||||
Runtime Path Manipulation
|
||||
-------------------------
|
||||
|
||||
Add this to your vimrc:
|
||||
|
||||
call pathogen#infect()
|
||||
|
||||
If you're brand new to Vim and lacking a vimrc, `vim ~/.vimrc` and paste
|
||||
in the following super-minimal example:
|
||||
|
||||
call pathogen#infect()
|
||||
syntax on
|
||||
filetype plugin indent on
|
||||
|
||||
Now any plugins you wish to install can be extracted to a subdirectory
|
||||
under `~/.vim/bundle`, and they will be added to the `'runtimepath'`.
|
||||
Observe:
|
||||
|
||||
cd ~/.vim/bundle
|
||||
git clone git://github.com/tpope/vim-fugitive.git
|
||||
|
||||
Now [fugitive.vim](https://github.com/tpope/vim-fugitive) is installed.
|
||||
If you really want to get crazy, you could set it up as a submodule in
|
||||
whatever repository you keep your dot files in. I don't like to get
|
||||
crazy.
|
||||
|
||||
If you don't like the directory name `bundle`, you can pass a different
|
||||
name as an argument:
|
||||
|
||||
call pathogen#infect('stuff')
|
||||
|
||||
You can also pass an entire path instead. I keep the plugins I maintain
|
||||
under `~/src`, and this is how I add them:
|
||||
|
||||
call pathogen#infect('~/src/vim/bundle')
|
||||
|
||||
Normally to generate documentation, Vim expects you to run `:helptags`
|
||||
on each directory with documentation (e.g., `:helptags ~/.vim/doc`).
|
||||
Provided with pathogen.vim is a `:Helptags` command that does this on
|
||||
every directory in your `'runtimepath'`. If you really want to get
|
||||
crazy, you could even invoke `Helptags` in your vimrc. I don't like to
|
||||
get crazy.
|
||||
|
||||
Finally, pathogen.vim has a rich API that can manipulate `'runtimepath'`
|
||||
and other comma-delimited path options in ways most people will never
|
||||
need to do. If you're one of those edge cases, look at the source.
|
||||
It's well documented.
|
||||
|
||||
Runtime File Editing
|
||||
--------------------
|
||||
|
||||
As a guy who writes a lot of Vim script, I edit a lot of runtime files.
|
||||
For example, when editing a PDF file like I do every day, I might notice
|
||||
something weird in the syntax highlighting and want to have a look:
|
||||
|
||||
:sp $VIMRUNTIME/syntax/pdf.vim
|
||||
|
||||
Even the best case scenario with tab complete is painful:
|
||||
|
||||
:sp $VIMR<Tab>/synt<Tab>/pd<Tab>
|
||||
|
||||
The picture is even bleaker if the file in question sits in a
|
||||
bundle. Enter the V family of commands. The V stands for Vimruntime
|
||||
(work with me here).
|
||||
|
||||
:Vsp s/pd<Tab>
|
||||
|
||||
As you can see, not only does it eliminate the need to qualify the
|
||||
runtime path being targeted, the tab completion is friendlier, allowing
|
||||
you to expand multiple components at once. Here's me editing
|
||||
pathogen.vim itself:
|
||||
|
||||
:Ve a/pat<Tab>
|
||||
|
||||
In the event of duplicate files, you can give a count to disambiguate.
|
||||
Here's the full list of commands:
|
||||
|
||||
* `:Vedit`
|
||||
* `:Vsplit`
|
||||
* `:Vvsplit`
|
||||
* `:Vtabedit`
|
||||
* `:Vpedit`
|
||||
* `:Vread`
|
||||
|
||||
There's also `:Vopen`, which is like `:Vedit` but does an `:lcd` to the
|
||||
containing runtime directory first.
|
||||
|
||||
FAQ
|
||||
---
|
||||
|
||||
> Can I put pathogen.vim in a submodule like all my other plugins?
|
||||
|
||||
Sure, stick it under `~/.vim/bundle`, and prepend the following to your
|
||||
vimrc:
|
||||
|
||||
source ~/.vim/bundle/vim-pathogen/autoload/pathogen.vim
|
||||
|
||||
> Will you accept these 14 pull requests adding a `.gitignore` for
|
||||
> `tags` so I don't see untracked changes in my dot files repository?
|
||||
|
||||
No, but I'll teach you how to ignore `tags` globally:
|
||||
|
||||
git config --global core.excludesfile '~/.cvsignore'
|
||||
echo tags >> ~/.cvsignore
|
||||
|
||||
While any filename will work, I've chosen to follow the ancient
|
||||
tradition of `.cvsignore` because utilities like rsync use it, too.
|
||||
Clever, huh?
|
||||
|
||||
> What about Vimballs?
|
||||
|
||||
If you really must use one:
|
||||
|
||||
:e name.vba
|
||||
:!mkdir ~/.vim/bundle/name
|
||||
:UseVimball ~/.vim/bundle/name
|
||||
|
||||
Contributing
|
||||
------------
|
||||
|
||||
If your [commit message sucks](http://stopwritingramblingcommitmessages.com/),
|
||||
I'm not going to accept your pull request. I've explained very politely
|
||||
dozens of times that
|
||||
[my general guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
|
||||
are absolute rules on on my own repositories, so I may lack the energy
|
||||
to explain it to you yet another time. And please, if I ask you to
|
||||
change something, `git commit --amend`.
|
||||
|
||||
Beyond that, don't be shy about asking before patching. What takes you
|
||||
hours might take me minutes simply because I have both domain knowledge
|
||||
and a perverse knowledge of Vim script so vast that many would consider
|
||||
it a symptom of mental illness. On the flip side, some ideas I'll
|
||||
reject no matter how good the implementation is. "Send a patch" is an
|
||||
edge case answer in my book.
|
||||
|
||||
Self-Promotion
|
||||
--------------
|
||||
|
||||
Like pathogen.vim? Follow the repository on
|
||||
[GitHub](https://github.com/tpope/vim-pathogen) and vote for it on
|
||||
[vim.org](http://www.vim.org/scripts/script.php?script_id=2332). And if
|
||||
you're feeling especially charitable, follow [tpope](http://tpo.pe/) on
|
||||
[Twitter](http://twitter.com/tpope) and
|
||||
[GitHub](https://github.com/tpope).
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Distributable under the same terms as Vim itself. See `:help license`.
|
||||
+107
-9
@@ -1,16 +1,35 @@
|
||||
" pathogen.vim - path option manipulation
|
||||
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
||||
" Version: 1.2
|
||||
" Maintainer: Tim Pope <http://tpo.pe/>
|
||||
" Version: 2.0
|
||||
|
||||
" Install in ~/.vim/autoload (or ~\vimfiles\autoload).
|
||||
"
|
||||
" API is documented below.
|
||||
" For management of individually installed plugins in ~/.vim/bundle (or
|
||||
" ~\vimfiles\bundle), adding `call pathogen#infect()` to your .vimrc
|
||||
" prior to `fileype plugin indent on` is the only other setup necessary.
|
||||
"
|
||||
" The API is documented inline below. For maximum ease of reading,
|
||||
" :set foldmethod=marker
|
||||
|
||||
if exists("g:loaded_pathogen") || &cp
|
||||
finish
|
||||
endif
|
||||
let g:loaded_pathogen = 1
|
||||
|
||||
" Point of entry for basic default usage. Give a directory name to invoke
|
||||
" pathogen#runtime_append_all_bundles() (defaults to "bundle"), or a full path
|
||||
" to invoke pathogen#runtime_prepend_subdirectories(). Afterwards,
|
||||
" pathogen#cycle_filetype() is invoked.
|
||||
function! pathogen#infect(...) abort " {{{1
|
||||
let source_path = a:0 ? a:1 : 'bundle'
|
||||
if source_path =~# '[\\/]'
|
||||
call pathogen#runtime_prepend_subdirectories(source_path)
|
||||
else
|
||||
call pathogen#runtime_append_all_bundles(source_path)
|
||||
endif
|
||||
call pathogen#cycle_filetype()
|
||||
endfunction " }}}1
|
||||
|
||||
" Split a path into a list.
|
||||
function! pathogen#split(path) abort " {{{1
|
||||
if type(a:path) == type([]) | return a:path | endif
|
||||
@@ -81,12 +100,32 @@ function! pathogen#glob_directories(pattern) abort " {{{1
|
||||
return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
|
||||
endfunction "}}}1
|
||||
|
||||
" Prepend all subdirectories of path to the rtp, and append all after
|
||||
" Turn filetype detection off and back on again if it was already enabled.
|
||||
function! pathogen#cycle_filetype() " {{{1
|
||||
if exists('g:did_load_filetypes')
|
||||
filetype off
|
||||
filetype on
|
||||
endif
|
||||
endfunction " }}}1
|
||||
|
||||
" Checks if a bundle is 'disabled'. A bundle is considered 'disabled' if
|
||||
" its 'basename()' is included in g:pathogen_disabled[]' or ends in a tilde.
|
||||
function! pathogen#is_disabled(path) " {{{1
|
||||
if a:path =~# '\~$'
|
||||
return 1
|
||||
elseif !exists("g:pathogen_disabled")
|
||||
return 0
|
||||
endif
|
||||
let sep = pathogen#separator()
|
||||
return index(g:pathogen_disabled, strpart(a:path, strridx(a:path, sep)+1)) != -1
|
||||
endfunction "}}}1
|
||||
|
||||
" Prepend all subdirectories of path to the rtp, and append all 'after'
|
||||
" directories in those subdirectories.
|
||||
function! pathogen#runtime_prepend_subdirectories(path) " {{{1
|
||||
let sep = pathogen#separator()
|
||||
let before = pathogen#glob_directories(a:path.sep."*[^~]")
|
||||
let after = pathogen#glob_directories(a:path.sep."*[^~]".sep."after")
|
||||
let before = filter(pathogen#glob_directories(a:path.sep."*"), '!pathogen#is_disabled(v:val)')
|
||||
let after = filter(pathogen#glob_directories(a:path.sep."*".sep."after"), '!pathogen#is_disabled(v:val[0:-7])')
|
||||
let rtp = pathogen#split(&rtp)
|
||||
let path = expand(a:path)
|
||||
call filter(rtp,'v:val[0:strlen(path)-1] !=# path')
|
||||
@@ -108,9 +147,9 @@ function! pathogen#runtime_append_all_bundles(...) " {{{1
|
||||
let list = []
|
||||
for dir in pathogen#split(&rtp)
|
||||
if dir =~# '\<after$'
|
||||
let list += pathogen#glob_directories(substitute(dir,'after$',name.sep.'*[^~]'.sep.'after','')) + [dir]
|
||||
let list += filter(pathogen#glob_directories(substitute(dir,'after$',name,'').sep.'*[^~]'.sep.'after'), '!pathogen#is_disabled(v:val[0:-7])') + [dir]
|
||||
else
|
||||
let list += [dir] + pathogen#glob_directories(dir.sep.name.sep.'*[^~]')
|
||||
let list += [dir] + filter(pathogen#glob_directories(dir.sep.name.sep.'*[^~]'), '!pathogen#is_disabled(v:val)')
|
||||
endif
|
||||
endfor
|
||||
let &rtp = pathogen#join(pathogen#uniq(list))
|
||||
@@ -122,11 +161,70 @@ let s:done_bundles = ''
|
||||
|
||||
" Invoke :helptags on all non-$VIM doc directories in runtimepath.
|
||||
function! pathogen#helptags() " {{{1
|
||||
let sep = pathogen#separator()
|
||||
for dir in pathogen#split(&rtp)
|
||||
if dir[0 : strlen($VIM)-1] !=# $VIM && isdirectory(dir.'/doc') && (!filereadable(dir.'/doc/tags') || filewritable(dir.'/doc/tags'))
|
||||
if (dir.sep)[0 : strlen($VIMRUNTIME)] !=# $VIMRUNTIME.sep && filewritable(dir.'/doc') == 2 && !empty(glob(dir.'/doc/*')) && (!filereadable(dir.'/doc/tags') || filewritable(dir.'/doc/tags'))
|
||||
helptags `=dir.'/doc'`
|
||||
endif
|
||||
endfor
|
||||
endfunction " }}}1
|
||||
|
||||
command! -bar Helptags :call pathogen#helptags()
|
||||
|
||||
" Like findfile(), but hardcoded to use the runtimepath.
|
||||
function! pathogen#rtpfindfile(file,count) "{{{1
|
||||
let rtp = pathogen#join(1,pathogen#split(&rtp))
|
||||
return fnamemodify(findfile(a:file,rtp,a:count),':p')
|
||||
endfunction " }}}1
|
||||
|
||||
function! s:find(count,cmd,file,...) " {{{1
|
||||
let rtp = pathogen#join(1,pathogen#split(&runtimepath))
|
||||
let file = pathogen#rtpfindfile(a:file,a:count)
|
||||
if file ==# ''
|
||||
return "echoerr 'E345: Can''t find file \"".a:file."\" in runtimepath'"
|
||||
elseif a:0
|
||||
let path = file[0:-strlen(a:file)-2]
|
||||
execute a:1.' `=path`'
|
||||
return a:cmd.' '.fnameescape(a:file)
|
||||
else
|
||||
return a:cmd.' '.fnameescape(file)
|
||||
endif
|
||||
endfunction " }}}1
|
||||
|
||||
function! s:Findcomplete(A,L,P) " {{{1
|
||||
let sep = pathogen#separator()
|
||||
let cheats = {
|
||||
\'a': 'autoload',
|
||||
\'d': 'doc',
|
||||
\'f': 'ftplugin',
|
||||
\'i': 'indent',
|
||||
\'p': 'plugin',
|
||||
\'s': 'syntax'}
|
||||
if a:A =~# '^\w[\\/]' && has_key(cheats,a:A[0])
|
||||
let request = cheats[a:A[0]].a:A[1:-1]
|
||||
else
|
||||
let request = a:A
|
||||
endif
|
||||
let pattern = substitute(request,'\'.sep,'*'.sep,'g').'*'
|
||||
let found = {}
|
||||
for path in pathogen#split(&runtimepath)
|
||||
let matches = split(glob(path.sep.pattern),"\n")
|
||||
call map(matches,'isdirectory(v:val) ? v:val.sep : v:val')
|
||||
call map(matches,'v:val[strlen(path)+1:-1]')
|
||||
for match in matches
|
||||
let found[match] = 1
|
||||
endfor
|
||||
endfor
|
||||
return sort(keys(found))
|
||||
endfunction " }}}1
|
||||
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Ve :execute s:find(<count>,'edit<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vedit :execute s:find(<count>,'edit<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vsplit :execute s:find(<count>,'split<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vvsplit :execute s:find(<count>,'vsplit<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vtabedit :execute s:find(<count>,'tabedit<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vpedit :execute s:find(<count>,'pedit<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vread :execute s:find(<count>,'read<bang>',<q-args>)
|
||||
command! -bar -bang -count=1 -nargs=1 -complete=customlist,s:Findcomplete Vopen :execute s:find(<count>,'edit<bang>',<q-args>,'lcd')
|
||||
|
||||
" vim:set ft=vim ts=8 sw=2 sts=2:
|
||||
|
||||
Reference in New Issue
Block a user