Skip to content

Commit

Permalink
Make compatibility with miscellaneous scripts explicit
Browse files Browse the repository at this point in the history
  • Loading branch information
xolox committed Apr 20, 2013
2 parents 46466bb + a744d4c commit fbeb973
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 24 deletions.
6 changes: 4 additions & 2 deletions autoload/xolox/lua.vim
@@ -1,13 +1,15 @@
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
" Last Change: November 25, 2011
" Last Change: April 20, 2013
" URL: http://peterodding.com/code/vim/lua-ftplugin

let g:xolox#lua#version = '0.7'
let g:xolox#lua#version = '0.7.1'
let s:miscdir = expand('<sfile>:p:h:h:h') . '/misc/lua-ftplugin'
let s:omnicomplete_script = s:miscdir . '/omnicomplete.lua'
let s:globals_script = s:miscdir . '/globals.lua'

call xolox#misc#compat#check('lua-ftplugin', 1)

function! xolox#lua#includeexpr(fname) " {{{1
" Search module path for matching Lua scripts.
let module = substitute(a:fname, '\.', '/', 'g')
Expand Down
33 changes: 29 additions & 4 deletions 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
42 changes: 28 additions & 14 deletions 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
23 changes: 23 additions & 0 deletions 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
11 changes: 9 additions & 2 deletions 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, ';') : ['']
Expand Down Expand Up @@ -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

Expand Down
29 changes: 27 additions & 2 deletions doc/ft_lua.txt
@@ -1,5 +1,30 @@
*ft_lua.txt* Lua file type plug-in for the Vim text editor

===============================================================================
*ft_lua-contents*
Contents ~

1. Introduction |ft_lua-introduction|
2. Installation |ft_lua-installation|
3. Options |ft_lua-options|
1. The |lua_path| option
2. The |lua_check_syntax| option
3. The |lua_check_globals| option
4. The |lua_compiler_name| option
5. The |lua_compiler_args| option
6. The |lua_error_format| option
7. The |lua_complete_keywords| option
8. The |lua_complete_globals| option
9. The |lua_complete_library| option
10. The |lua_complete_dynamic| option
11. The |lua_complete_omni| option
4. Contact |ft_lua-contact|
5. License |ft_lua-license|

===============================================================================
*ft_lua-introduction*
Introduction ~

The Lua [1] file type plug-in for Vim makes it easier to work with Lua source
code in Vim by providing the following features:

Expand All @@ -26,8 +51,8 @@ code in Vim by providing the following features:
defined in all modules installed on the system using Control-X Control-O,
however it needs to be explicitly enabled by setting the
|lua_complete_omni| option because this functionality may have undesired
side effects! When you invoke omni completion after typing 'require '' or
'require('' you get completion of module names
side effects! When you invoke omni completion after typing 'require ' or
'require(' you get completion of module names

Screenshot of omni completion, see reference [7]

Expand Down

0 comments on commit fbeb973

Please sign in to comment.