Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Make compatibility with miscellaneous scripts explicit

  • Loading branch information...
commit d486822233bd4efef4a3096b91ed3b7b8caa280b 2 parents 11cba18 + a744d4c
@xolox authored
View
1  .gitignore
@@ -0,0 +1 @@
+doc/tags
View
2  README.md
@@ -53,4 +53,4 @@ If you have questions, bug reports, suggestions, etc. the author can be contacte
## License
This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).
2011 Peter Odding &lt;<peter@peterodding.com>&gt;.
2013 Peter Odding &lt;<peter@peterodding.com>&gt;.
View
33 autoload/xolox/misc/README.md
@@ -1,24 +1,49 @@
# Miscellaneous auto-load Vim scripts
-The git repository at <http://github.com/xolox/vim-misc> contains Vim scripts that are used by most of the [Vim plug-ins I've written] [plugins] yet don't really belong with any single one. I include this repository as a subdirectory of my plug-in repositories using the following commands:
+The git repository at [github.com/xolox/vim-misc] [repository] contains Vim scripts that are used by most of the [Vim plug-ins I've written] [plugins] yet don't really belong with any single one. I include this repository as a subdirectory of my plug-in repositories using the following commands:
$ git remote add -f vim-misc https://github.com/xolox/vim-misc.git
$ git merge -s ours --no-commit vim-misc/master
$ git read-tree --prefix=autoload/xolox/misc/ -u vim-misc/master
$ git commit -m "Merge vim-misc repository as subdirectory"
-To update a plug-in repository to the latest versions of the miscellaneous auto-load scripts I execute the following command:
+The above trick is called the [subtree merge strategy] [merge-strategy]. To update a plug-in repository to the latest version of the miscellaneous auto-load scripts I execute the following command:
$ git pull -s subtree vim-misc master
+## Why make things so complex?
+
+I came up with this solution after multiple years of back and forth between Vim Online users, the GitHub crowd and my own sanity:
+
+1. When I started publishing my first Vim plug-ins I would prepare ZIP archives for Vim Online using makefiles. The makefiles would make sure the miscellaneous scripts were included in the uploaded distributions. This had two disadvantages: It lost git history and the repositories on GitHub were not usable out of the box, so [I got complaints from GitHub (Pathogen) users] [github-complaints].
+
+2. My second attempt to solve the problem used git submodules which seemed like the ideal solution until I actually started doing it. Submodules are not initialized during a normal `git clone`, you need to use `git clone --recursive` instead but Vim plug-in managers like [Pathogen] [pathogen] and [Vundle] [vundle] don't do this (at least [they didn't when I tried] [vundle-discussion]) so people would end up with broken checkouts.
+
+3. After finding out that git submodules were not going to solve my problems I searched for other inclusion strategies supported by git. After a while I came upon the [subtree merge strategy] [merge-strategy] which I have been using for more than two years now.
+
+## Compatibility issues
+
+Regardless of the inclusion strategies discussed above, my current scheme has a flaw: If more than one of my plug-ins are installed in a Vim profile using [Pathogen] [pathogen] or [Vundle] [vundle], the miscellaneous autoload scripts will all be loaded from the subdirectory of one single plug-in.
+
+This means that when I break compatibility in the miscellaneous scripts, I have to make sure to merge the changes into all of my plug-ins. Even then, if a user has more than one of my plug-ins installed but updates only one of them, the other plug-ins (that are not yet up to date) can break (because of the backwards incompatible change).
+
+The `xolox#misc#compat#check()` function makes sure that incompatibilities are detected early so that the user knows which plug-in to update if incompatibilities arise.
+
## Contact
If you have questions, bug reports, suggestions, etc. the author can be contacted at <peter@peterodding.com>. The latest version is available at <http://peterodding.com/code/vim/misc> and <http://github.com/xolox/vim-misc>.
## License
-This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License).
2011 Peter Odding &lt;<peter@peterodding.com>&gt;.
+This software is licensed under the [MIT license] [mit].
2013 Peter Odding &lt;<peter@peterodding.com>&gt;.
+[github-complaints]: https://github.com/xolox/vim-easytags/issues/1
+[merge-strategy]: http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html
+[mit]: http://en.wikipedia.org/wiki/MIT_License
+[pathogen]: http://www.vim.org/scripts/script.php?script_id=2332
[plugins]: http://peterodding.com/code/vim/
+[repository]: https://github.com/xolox/vim-misc
+[vundle-discussion]: https://github.com/gmarik/vundle/pull/41
+[vundle]: https://github.com/gmarik/vundle
View
42 autoload/xolox/misc/buffer.vim
@@ -1,37 +1,51 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: September 4, 2011
+" Last Change: April 18, 2013
" URL: http://peterodding.com/code/vim/misc/
-function! xolox#misc#buffer#is_empty()
+function! xolox#misc#buffer#is_empty() " {{{1
" Check if the current buffer is an empty, unchanged buffer which can be reused.
return !&modified && expand('%') == '' && line('$') <= 1 && getline(1) == ''
endfunction
-function! xolox#misc#buffer#prepare(bufname)
- let bufname = '[' . a:bufname . ']'
- let buffers = tabpagebuflist()
- call map(buffers, 'fnamemodify(bufname(v:val), ":t:r")')
- let idx = index(buffers, bufname)
- if idx >= 0
- execute (idx + 1) . 'wincmd w'
- elseif !(xolox#misc#buffer#is_empty() || expand('%:t') == bufname)
+function! xolox#misc#buffer#prepare(...) " {{{1
+ " Open a special buffer (with generated contents, not directly edited by the user).
+ if a:0 == 1 && type(a:1) == type('')
+ " Backwards compatibility with old interface.
+ let options = {'name': a:1, 'path': a:1}
+ elseif type(a:1) == type({})
+ let options = a:1
+ else
+ throw "Invalid arguments"
+ endif
+ let winnr = 1
+ let found = 0
+ for bufnr in tabpagebuflist()
+ if xolox#misc#path#equals(options['path'], bufname(bufnr))
+ execute winnr . 'wincmd w'
+ let found = 1
+ break
+ else
+ let winnr += 1
+ endif
+ endfor
+ if !(found || xolox#misc#buffer#is_empty())
vsplit
endif
- silent execute 'edit' fnameescape(bufname)
+ silent execute 'edit' fnameescape(options['path'])
lcd " clear working directory
setlocal buftype=nofile bufhidden=hide noswapfile
- let &l:statusline = bufname
+ let &l:statusline = '[' . options['name'] . ']'
call xolox#misc#buffer#unlock()
silent %delete
endfunction
-function! xolox#misc#buffer#lock()
+function! xolox#misc#buffer#lock() " {{{1
" Lock a special buffer so it can no longer be edited.
setlocal readonly nomodifiable nomodified
endfunction
-function! xolox#misc#buffer#unlock()
+function! xolox#misc#buffer#unlock() " {{{1
" Unlock a special buffer so that its content can be updated.
setlocal noreadonly modifiable
endfunction
View
23 autoload/xolox/misc/compat.vim
@@ -0,0 +1,23 @@
+" Vim auto-load script
+" Author: Peter Odding <peter@peterodding.com>
+" Last Change: April 20, 2013
+" URL: http://peterodding.com/code/vim/misc/
+
+" The following integer will be bumped whenever a change in the miscellaneous
+" scripts breaks backwards compatibility. This enables my Vim plug-ins to fail
+" early when they detect an incompatible version, instead of breaking at the
+" worst possible moments :-).
+let g:xolox#misc#compat#version = 1
+
+" Remember the directory where the miscellaneous scripts are loaded from
+" so the user knows which plug-in to update if incompatibilities arise.
+let s:misc_directory = fnamemodify(expand('<sfile>'), ':p:h')
+
+function! xolox#misc#compat#check(plugin_name, required_version)
+ if a:required_version != g:xolox#misc#compat#version
+ let msg = "The %s plug-in requires version %i of the miscellaneous scripts, however version %i was loaded from %s!"
+ throw printf(msg, a:plugin_name, a:required_version, g:xolox#misc#compat#version, s:misc_directory)
+ endif
+endfunction
+
+" vim: ts=2 sw=2 et
View
11 autoload/xolox/misc/path.vim
@@ -1,9 +1,10 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: September 26, 2011
+" Last Change: April 18, 2013
" URL: http://peterodding.com/code/vim/misc/
let s:windows_compatible = has('win32') || has('win64')
+let s:mac_os_x_compatible = has('macunix')
function! xolox#misc#path#which(...)
let extensions = s:windows_compatible ? split($PATHEXT, ';') : ['']
@@ -129,7 +130,13 @@ endfunction
" Encode a pathname so it can be used as a filename.
function! xolox#misc#path#encode(path)
- let mask = s:windows_compatible ? '[*|\\/:"<>?%]' : '[\\/%]'
+ if s:windows_compatible
+ let mask = '[*|\\/:"<>?%]'
+ elseif s:mac_os_x_compatible
+ let mask = '[\\/%:]'
+ else
+ let mask = '[\\/%]'
+ endif
return substitute(a:path, mask, '\=printf("%%%x", char2nr(submatch(0)))', 'g')
endfunction
View
6 autoload/xolox/pyref.vim
@@ -1,11 +1,13 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
-" Last Change: November 26, 2011
+" Last Change: April 21, 2013
" URL: http://peterodding.com/code/vim/pyref/
-let g:xolox#pyref#version = '0.7.8'
+let g:xolox#pyref#version = '0.7.9'
let s:script = expand('<sfile>:p:~')
+call xolox#misc#compat#check('pyref', 1)
+
function! xolox#pyref#enable() " {{{1
let command = '%s <silent> <buffer> %s %s:call xolox#pyref#at_cursor()<CR>'
let mapping = exists('g:pyref_mapping') ? g:pyref_mapping : '<F1>'
View
20 doc/pyref.txt
@@ -1,5 +1,23 @@
*pyref.txt* Context-sensitive documentation for Python source code in Vim
+===============================================================================
+ *pyref-contents*
+Contents ~
+
+ 1. Introduction |pyref-introduction|
+ 2. Install & usage |pyref-install-usage|
+ 1. The |g:pyref_mapping| option
+ 2. The |g:pyref_python| option
+ 3. The |g:pyref_django| option
+ 4. The |g:pyref_index| option
+ 5. General note about options |pyref-general-note-about-options|
+ 3. Contact |pyref-contact|
+ 4. License |pyref-license|
+
+===============================================================================
+ *pyref-introduction*
+Introduction ~
+
The 'pyref.vim' script is a plug-in for the Vim text editor that helps you
look up the documentation for keywords and identifiers from the following
sources using your web browser:
@@ -100,7 +118,7 @@ If you like the script please vote for it on Vim Online [10].
*pyref-license*
License ~
-This software is licensed under the MIT license [11]. Copyright 2011 Peter
+This software is licensed under the MIT license [11]. Copyright 2013 Peter
Odding <peter@peterodding.com>.
===============================================================================
Please sign in to comment.
Something went wrong with that request. Please try again.