From b88ab45dae322f6780d8e0be0fdee2c7a68984ab Mon Sep 17 00:00:00 2001 From: Peter Odding Date: Thu, 18 Apr 2013 02:07:11 +0200 Subject: [PATCH 1/4] Bug fix: Encode ":" on Mac OS X in xolox#misc#path#encode() Reported here: https://github.com/xolox/vim-notes/pull/28 --- path.vim | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/path.vim b/path.vim index efb6340..6f8fe44 100644 --- a/path.vim +++ b/path.vim @@ -1,9 +1,10 @@ " Vim auto-load script " Author: Peter Odding -" 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 From ca030c928d37d8400cbd576d13423411f3498c67 Mon Sep 17 00:00:00 2001 From: Peter Odding Date: Thu, 18 Apr 2013 02:11:40 +0200 Subject: [PATCH 2/4] Improve xolox#misc#buffer#prepare() --- README.md | 2 +- buffer.vim | 42 ++++++++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9111126..2df83e2 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ 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 <>. +© 2013 Peter Odding <>. [plugins]: http://peterodding.com/code/vim/ diff --git a/buffer.vim b/buffer.vim index e4472e6..3597cc2 100644 --- a/buffer.vim +++ b/buffer.vim @@ -1,37 +1,51 @@ " Vim auto-load script " Author: Peter Odding -" 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 From 018fc7197cc759acf783efb1221889be9460d654 Mon Sep 17 00:00:00 2001 From: Peter Odding Date: Sat, 20 Apr 2013 19:14:34 +0200 Subject: [PATCH 3/4] Explain in README.md why vim-misc is what it is (issue #1) --- README.md | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2df83e2..18faf40 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,47 @@ # Miscellaneous auto-load Vim scripts -The git repository at 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). + ## Contact If you have questions, bug reports, suggestions, etc. the author can be contacted at . The latest version is available at and . ## License -This software is licensed under the [MIT license](http://en.wikipedia.org/wiki/MIT_License). +This software is licensed under the [MIT license] [mit]. © 2013 Peter Odding <>. +[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 From a744d4c5f0c6086251aab66ec68cb9299869b1e9 Mon Sep 17 00:00:00 2001 From: Peter Odding Date: Sat, 20 Apr 2013 19:16:39 +0200 Subject: [PATCH 4/4] Make backwards compatibility explicit --- README.md | 2 ++ compat.vim | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 compat.vim diff --git a/README.md b/README.md index 18faf40..f375fe6 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ Regardless of the inclusion strategies discussed above, my current scheme has a 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 . The latest version is available at and . diff --git a/compat.vim b/compat.vim new file mode 100644 index 0000000..83d00a0 --- /dev/null +++ b/compat.vim @@ -0,0 +1,23 @@ +" Vim auto-load script +" Author: Peter Odding +" 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(''), ':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