40 Commits

Author SHA1 Message Date
Tim Pope ede9571bc3 pathogen.vim 2.0 2011-08-09 20:11:26 -04:00
Tim Pope 040ee8f432 Clean up opening comments 2011-08-09 19:49:15 -04:00
Tim Pope a9fcd31a7e Grammar fix 2011-08-09 19:26:50 -04:00
Tim Pope 3ff705c08e Provide :Vopen 2011-08-09 19:24:15 -04:00
Tim Pope 85040e24e8 Provide V family of commands 2011-08-09 18:38:33 -04:00
Tim Pope 09cf830c77 Spelling fix 2011-08-09 16:09:44 -04:00
Tim Pope 43f6273c3c Accept a full path to pathogen#infect()
This full path is passed to pathogen#runtime_prepend_subdirectories()
instead of pathogen#runtime_append_all_bundles().
2011-08-09 12:34:29 -04:00
Tim Pope 8c46ed160e Tighten $VIMRUNTIME exclusion in :Helptags 2011-08-05 11:46:26 -04:00
Tim Pope b356563fc8 Provide homepage, not email 2011-08-05 11:46:26 -04:00
Tim Pope 0abca7beba Move disabling logic out of glob 2011-08-02 22:59:56 -04:00
Tim Pope f1c0ee6166 Add a note about Vimballs. Closes #6 2011-08-02 22:55:50 -04:00
Tim Pope 0a8144bf3d Add a note about wget 2011-07-25 20:21:43 -04:00
Tim Pope dccb822c0a Add an example minimal vimrc 2011-07-25 19:56:42 -04:00
Tim Pope 3a4129f948 Use HTTPS for GitHub URLs in README 2011-07-25 17:42:51 -04:00
Tim Pope e06454cb49 Tighten curl install URL 2011-07-25 16:36:45 -04:00
Tim Pope 0d230bc4c6 Add a FAQ 2011-07-25 15:24:43 -04:00
Tim Pope 73ba356522 Make note of other comma-delimited path options 2011-07-25 01:57:15 -04:00
Tim Pope 8484839faa Fix typo 2011-07-24 21:01:56 -04:00
Tim Pope f56ab3149a Add License 2011-07-24 18:02:27 -04:00
Tim Pope e9ab337487 Typo 2011-07-24 17:56:40 -04:00
Tim Pope 568eec91d8 More explicit installation instructions 2011-07-24 17:55:20 -04:00
Tim Pope 72586074e5 Add a README 2011-07-24 17:35:26 -04:00
Lucas Parry fcf77f5101 Add option to call infect on non-standard paths
Tweak pathogen#infect to take an optional source path to load plugins
from, instead of the standard 'bundle' directory.
2011-06-13 23:05:31 -04:00
Tim Pope 50650f2531 Extract pathogen#cycle_filetype() 2011-05-13 23:42:40 -04:00
Seth Milliken b147125552 Add pathogen#infect() as primary entry point for basic setup 2011-05-13 20:03:20 -07:00
Tim Pope af5659596e Add :Helptags wrapper for pathogen#helptags() 2011-04-13 12:27:57 -04:00
Tim Pope 3e63bdb7c4 More accurate writability check for helptags 2011-04-13 12:27:57 -04:00
Tim Pope 552e5f0bf8 pathogen.vim 1.3 2011-03-10 17:50:22 -05:00
Tim Pope c8f5e6c63c Fix disabling /after in append_all_bundles
[Jeroen Budts]
2011-02-20 17:39:19 -05:00
Tim Pope a50ad7c80e Fix disabling /after directories [Jeroen Budts] 2011-02-20 14:55:02 -05:00
Sebastian Jaeger 968e87ef7f Skip empty directories in pathogen#helptags() 2010-11-07 12:44:24 -05:00
Tim Pope 52b091892c Fix broken function reference 2010-10-24 17:02:50 -04:00
Mathias Gumz 258c47fe06 Exclude bundles in g:pathogen_disabled 2010-10-24 12:48:53 -04:00
Leonardo Luz Almeida f4f79bc720 Fix appending "after" directories on Windows 2010-05-16 20:12:46 -04:00
Tim Pope 9dc6d067fb pathogen.vim 1.2 2010-01-16 19:33:07 -05:00
Tim Pope 40d808db13 Add email address 2010-01-16 18:53:32 -05:00
Tim Pope 720561a037 Add pathogen#uniq() 2010-01-16 16:30:47 -05:00
Tim Pope 7d171d5bd8 Consistently punctuate documentation 2010-01-16 16:14:10 -05:00
Tim Pope c2032bdd90 Add pathogen#helptags() 2010-01-15 02:45:42 -05:00
Tim Pope c3675bda5e Add pathogen#legacyjoin()
Older options like 'path' require you to escape spaces and newer ones
like 'runtimepath' break if you do.  This commit fixes join to not
escape spaces and adds legacyjoin to escape them.
2010-01-14 18:17:07 -05:00
2 changed files with 318 additions and 18 deletions
+170
View File
@@ -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`.
+148 -18
View File
@@ -1,16 +1,35 @@
" pathogen.vim - path option manipulation
" Maintainer: Tim Pope
" Last Change: Oct 24, 2008
" 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
@@ -20,17 +39,20 @@ endfunction " }}}1
" Convert a list to a path.
function! pathogen#join(...) abort " {{{1
let i = 0
if type(a:1) == type(1) && a:1
let i = 1
let space = ' '
else
let i = 0
let space = ''
endif
let path = ""
while i < a:0
if type(a:000[i]) == type([])
let list = a:000[i]
let j = 0
while j < len(list)
let escaped = substitute(list[j],'[\\, ]','\\&','g')
if exists("+shellslash") && !&shellslash
let escaped = substitute(escaped,'^\(\w:\\\)\\','\1','')
endif
let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
let path .= ',' . escaped
let j += 1
endwhile
@@ -42,32 +64,72 @@ function! pathogen#join(...) abort " {{{1
return substitute(path,'^,','','')
endfunction " }}}1
" \ on Windows unless shellslash is set, / everywhere else
" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
function! pathogen#legacyjoin(...) abort " {{{1
return call('pathogen#join',[1] + a:000)
endfunction " }}}1
" Remove duplicates from a list.
function! pathogen#uniq(list) abort " {{{1
let i = 0
let seen = {}
while i < len(a:list)
if has_key(seen,a:list[i])
call remove(a:list,i)
else
let seen[a:list[i]] = 1
let i += 1
endif
endwhile
return a:list
endfunction " }}}1
" \ on Windows unless shellslash is set, / everywhere else.
function! pathogen#separator() abort " {{{1
return !exists("+shellslash") || &shellslash ? '/' : '\'
endfunction " }}}1
" Convenience wrapper around glob() which returns a list
" Convenience wrapper around glob() which returns a list.
function! pathogen#glob(pattern) abort " {{{1
let files = split(glob(a:pattern),"\n")
return map(files,'substitute(v:val,"[".pathogen#separator()."/]$","","")')
endfunction "}}}1
" Like pathogen#glob(), only limit the results to directories
" Like pathogen#glob(), only limit the results to directories.
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')
let &rtp = pathogen#join(before + rtp + after)
let &rtp = pathogen#join(pathogen#uniq(before + rtp + after))
return &rtp
endfunction " }}}1
@@ -85,16 +147,84 @@ 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(list)
let &rtp = pathogen#join(pathogen#uniq(list))
return 1
endfunction
let s:done_bundles = ''
" }}}1
" 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.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: