diff options
Diffstat (limited to 'autoload')
-rw-r--r-- | autoload/xolox/misc/buffer.vim | 80 | ||||
-rw-r--r-- | autoload/xolox/misc/compat.vim | 37 | ||||
-rw-r--r-- | autoload/xolox/misc/complete.vim | 22 | ||||
-rw-r--r-- | autoload/xolox/misc/escape.vim | 56 | ||||
-rw-r--r-- | autoload/xolox/misc/list.vim | 57 | ||||
-rw-r--r-- | autoload/xolox/misc/msg.vim | 91 | ||||
-rw-r--r-- | autoload/xolox/misc/open.vim | 92 | ||||
-rw-r--r-- | autoload/xolox/misc/option.vim | 115 | ||||
-rw-r--r-- | autoload/xolox/misc/os.vim | 188 | ||||
-rw-r--r-- | autoload/xolox/misc/path.vim | 253 | ||||
-rw-r--r-- | autoload/xolox/misc/str.vim | 18 | ||||
-rw-r--r-- | autoload/xolox/misc/timer.vim | 103 |
12 files changed, 0 insertions, 1112 deletions
diff --git a/autoload/xolox/misc/buffer.vim b/autoload/xolox/misc/buffer.vim deleted file mode 100644 index 01dca6e..0000000 --- a/autoload/xolox/misc/buffer.vim +++ /dev/null @@ -1,80 +0,0 @@ -" Handling of special buffers -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ -" -" The functions defined here make it easier to deal with special Vim buffers -" that contain text generated by a Vim plug-in. For example my [vim-notes -" plug-in] [vim-notes] generates several such buffers: -" -" - [:RecentNotes] [RecentNotes] lists recently modified notes -" - [:ShowTaggedNotes] [ShowTaggedNotes] lists notes grouped by tags -" - etc. -" -" Because the text in these buffers is generated, Vim shouldn't bother with -" swap files and it should never prompt the user whether to save changes to -" the generated text. -" -" [vim-notes]: http://peterodding.com/code/vim/notes/ -" [RecentNotes]: http://peterodding.com/code/vim/notes/#recentnotes_command -" [ShowTaggedNotes]: http://peterodding.com/code/vim/notes/#showtaggednotes_command - -function! xolox#misc#buffer#is_empty() " {{{1 - " Checks if the current buffer is an empty, unchanged buffer which can be - " reused. Returns 1 if an empty buffer is found, 0 otherwise. - return !&modified && expand('%') == '' && line('$') <= 1 && getline(1) == '' -endfunction - -function! xolox#misc#buffer#prepare(...) " {{{1 - " Open a special buffer, i.e. a buffer that will hold generated contents, - " not directly edited by the user. The buffer can be customized by passing a - " dictionary with the following key/value pairs as the first argument: - " - " - **name** (required): The base name of the buffer (i.e. the base name of - " the file loaded in the buffer, even though it isn't really a file and - " nothing is really 'loaded' :-) - " - **path** (required): The pathname of the buffer. May be relevant if - " [:lcd] [lcd] or ['autochdir'] [acd] is being used. - " - " [lcd]: http://vimdoc.sourceforge.net/htmldoc/editing.html#:lcd - " [acd]: http://vimdoc.sourceforge.net/htmldoc/options.html#'autochdir' - 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(options['path']) - lcd " clear working directory - setlocal buftype=nofile bufhidden=hide noswapfile - let &l:statusline = '[' . options['name'] . ']' - call xolox#misc#buffer#unlock() - silent %delete -endfunction - -function! xolox#misc#buffer#lock() " {{{1 - " Lock a special buffer so that its contents can no longer be edited. - setlocal readonly nomodifiable nomodified -endfunction - -function! xolox#misc#buffer#unlock() " {{{1 - " Unlock a special buffer so that its content can be updated. - setlocal noreadonly modifiable -endfunction diff --git a/autoload/xolox/misc/compat.vim b/autoload/xolox/misc/compat.vim deleted file mode 100644 index b1fd30b..0000000 --- a/autoload/xolox/misc/compat.vim +++ /dev/null @@ -1,37 +0,0 @@ -" Compatibility checking. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 20, 2013 -" URL: http://peterodding.com/code/vim/misc/ -" -" This Vim script defines a version number for the miscellaneous scripts. Each -" of my plug-ins compares their expected version of the miscellaneous scripts -" against the version number defined inside the miscellaneous scripts. -" -" The version number is incremented 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 = 9 - -" 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>'), ':~:h') - -function! xolox#misc#compat#check(plugin_name, plugin_version, required_version) - " Expects three arguments: - " - " 1. The name of the Vim plug-in that is using the miscellaneous scripts - " 2. The version of the Vim plug-in that is using the miscellaneous scripts - " 3. The version of the miscellaneous scripts expected by the plug-in - " - " When the loaded version of the miscellaneous scripts is different from the - " version expected by the plug-in, this function will raise an error message - " that explains what went wrong. - if a:required_version != g:xolox#misc#compat#version - let msg = "The %s %s plug-in expects version %i of the miscellaneous scripts, however version %i was loaded from the directory %s! Please upgrade your plug-ins to the latest releases to resolve this problem." - throw printf(msg, a:plugin_name, a:plugin_version, a:required_version, g:xolox#misc#compat#version, s:misc_directory) - endif -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/complete.vim b/autoload/xolox/misc/complete.vim deleted file mode 100644 index 763e0b9..0000000 --- a/autoload/xolox/misc/complete.vim +++ /dev/null @@ -1,22 +0,0 @@ -" Tab completion for user defined commands. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -function! xolox#misc#complete#keywords(arglead, cmdline, cursorpos) - " This function can be used to perform keyword completion for user defined - " Vim commands based on the contents of the current buffer. Here's an - " example of how you would use it: - " - " :command -nargs=* -complete=customlist,xolox#misc#complete#keywords MyCmd call s:MyCmd(<f-args>) - let words = {} - for line in getline(1, '$') - for word in split(line, '\W\+') - let words[word] = 1 - endfor - endfor - return sort(keys(filter(words, 'v:key =~# a:arglead'))) -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/escape.vim b/autoload/xolox/misc/escape.vim deleted file mode 100644 index 29a16ca..0000000 --- a/autoload/xolox/misc/escape.vim +++ /dev/null @@ -1,56 +0,0 @@ -" String escaping functions. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -function! xolox#misc#escape#pattern(string) " {{{1 - " Takes a single string argument and converts it into a [:substitute] - " [subcmd] / [substitute()] [subfun] pattern string that matches the given - " string literally. - " - " [subfun]: http://vimdoc.sourceforge.net/htmldoc/eval.html#substitute() - " [subcmd]: http://vimdoc.sourceforge.net/htmldoc/change.html#:substitute - if type(a:string) == type('') - let string = escape(a:string, '^$.*\~[]') - return substitute(string, '\n', '\\n', 'g') - endif - return '' -endfunction - -function! xolox#misc#escape#substitute(string) " {{{1 - " Takes a single string argument and converts it into a [:substitute] - " [subcmd] / [substitute()] [subfun] replacement string that inserts the - " given string literally. - if type(a:string) == type('') - let string = escape(a:string, '\&~%') - return substitute(string, '\n', '\\r', 'g') - endif - return '' -endfunction - -function! xolox#misc#escape#shell(string) " {{{1 - " Takes a single string argument and converts it into a quoted command line - " argument. - " - " I was going to add a long rant here about Vim's ['shellslash' option] - " [shellslash], but really, it won't make any difference. Let's just suffice - " to say that I have yet to encounter a single person out there who uses - " this option for its intended purpose (running a UNIX style shell on - " Microsoft Windows). - " - " [shellslash]: http://vimdoc.sourceforge.net/htmldoc/options.html#'shellslash' - if xolox#misc#os#is_win() - try - let ssl_save = &shellslash - set noshellslash - return shellescape(a:string) - finally - let &shellslash = ssl_save - endtry - else - return shellescape(a:string) - endif -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/list.vim b/autoload/xolox/misc/list.vim deleted file mode 100644 index 13dfb43..0000000 --- a/autoload/xolox/misc/list.vim +++ /dev/null @@ -1,57 +0,0 @@ -" List handling functions. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -function! xolox#misc#list#unique(list) " {{{1 - " Remove duplicate values from the given list in-place (preserves order). - call reverse(a:list) - call filter(a:list, 'count(a:list, v:val) == 1') - return reverse(a:list) -endfunction - -function! xolox#misc#list#binsert(list, value, ...) " {{{1 - " Performs in-place binary insertion, which depending on your use case can - " be more efficient than calling Vim's [sort()] [sort] function after each - " insertion (in cases where a single, final sort is not an option). Expects - " three arguments: - " - " 1. A list - " 2. A value to insert - " 3. 1 (true) when case should be ignored, 0 (false) otherwise - " - " [sort]: http://vimdoc.sourceforge.net/htmldoc/eval.html#sort() - let idx = s:binsert_r(a:list, 0, len(a:list), a:value, exists('a:1') && a:1) - return insert(a:list, a:value, idx) -endfunction - -function! s:binsert_r(list, low, high, value, ignorecase) - let mid = a:low + (a:high - a:low) / 2 - if a:low == a:high - return a:low - elseif a:ignorecase ? a:value >? a:list[mid] : a:value > a:list[mid] - return s:binsert_r(a:list, mid + 1, a:high, a:value, a:ignorecase) - elseif a:ignorecase ? a:value <? a:list[mid] : a:value < a:list[mid] - return s:binsert_r(a:list, a:low, mid, a:value, a:ignorecase) - else - return mid - endif -endfunction - -if 0 - " Tests for xolox#misc#list#binsert(). - let s:list = ['a', 'B', 'e'] - function! s:test(value, expected) - call xolox#misc#list#binsert(s:list, a:value, 1) - if s:list != a:expected - call xolox#misc#msg#warn("list.vim: Test failed! Expected %s, got %s", - \ string(a:expected), string(s:list)) - endif - endfunction - call s:test('c', ['a', 'B', 'c', 'e']) - call s:test('D', ['a', 'B', 'c', 'D', 'e']) - call s:test('f', ['a', 'B', 'c', 'D', 'e', 'f']) -endif - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/msg.vim b/autoload/xolox/misc/msg.vim deleted file mode 100644 index 0104b67..0000000 --- a/autoload/xolox/misc/msg.vim +++ /dev/null @@ -1,91 +0,0 @@ -" Functions to interact with the user. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 20, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -if !exists('g:xolox_message_buffer') - " For when I lose my :messages history :-\ - let g:xolox_message_buffer = 100 -endif - -if !exists('g:xolox_messages') - let g:xolox_messages = [] -endif - -function! xolox#misc#msg#info(...) " {{{1 - " Show a formatted informational message to the user. This function has the - " same argument handling as Vim's [printf()] [printf] function. - " - " [printf]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() - call s:show_message('title', a:000) -endfunction - -function! xolox#misc#msg#warn(...) " {{{1 - " Show a formatted warning message to the user. This function has the same - " argument handling as Vim's [printf()] [printf] function. - call s:show_message('warningmsg', a:000) -endfunction - -function! xolox#misc#msg#debug(...) " {{{1 - " Show a formatted debugging message to the user, if the user has enabled - " increased verbosity by setting Vim's ['verbose'] [verbose] option to one - " (1) or higher. This function has the same argument handling as Vim's - " [printf()] [printf] function. - if &vbs >= 1 - call s:show_message('question', a:000) - endif -endfunction - -function! s:show_message(hlgroup, args) " {{{1 - " The implementation of info() and warn(). - let nargs = len(a:args) - if nargs == 1 - let message = a:args[0] - elseif nargs >= 2 - let message = call('printf', a:args) - endif - if exists('message') - try - " Temporarily disable Vim's |hit-enter| prompt and mode display. - if !exists('s:more_save') - let s:more_save = &more - let s:ruler_save = &ruler - let s:smd_save = &showmode - endif - set nomore noshowmode - if winnr('$') == 1 | set noruler | endif - augroup PluginXoloxHideMode - autocmd! CursorHold,CursorHoldI * call s:clear_message() - augroup END - execute 'echohl' a:hlgroup - " Redraw to avoid |hit-enter| prompt. - redraw - for line in split(message, "\n") - echomsg line - endfor - if g:xolox_message_buffer > 0 - call add(g:xolox_messages, message) - if len(g:xolox_messages) > g:xolox_message_buffer - call remove(g:xolox_messages, 0) - endif - endif - finally - " Always clear message highlighting, even when interrupted by Ctrl-C. - echohl none - endtry - endif -endfunction - -function! s:clear_message() " {{{1 - " Callback to clear message after some time has passed. - echo '' - let &more = s:more_save - let &showmode = s:smd_save - let &ruler = s:ruler_save - unlet s:more_save s:ruler_save s:smd_save - autocmd! PluginXoloxHideMode - augroup! PluginXoloxHideMode -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/open.vim b/autoload/xolox/misc/open.vim deleted file mode 100644 index b369f4f..0000000 --- a/autoload/xolox/misc/open.vim +++ /dev/null @@ -1,92 +0,0 @@ -" Integration between Vim and its environment. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -if !exists('s:version') - let s:version = '1.1' - let s:enoimpl = "open.vim %s: %s() hasn't been implemented for your platform! If you have suggestions, please contact peter@peterodding.com." - let s:handlers = ['gnome-open', 'kde-open', 'exo-open', 'xdg-open'] -endif - -function! xolox#misc#open#file(path, ...) " {{{1 - " Given a pathname as the first argument, this opens the file with the - " program associated with the file type. So for example a text file might - " open in Vim, an `*.html` file would probably open in your web browser and - " a media file would open in a media player. - " - " This should work on Windows, Mac OS X and most Linux distributions. If - " this fails to find a file association, you can pass one or more external - " commands to try as additional arguments. For example: - " - " :call xolox#misc#open#file('/path/to/my/file', 'firefox', 'google-chrome') - " - " This generally shouldn't be necessary but it might come in handy now and - " then. - if xolox#misc#os#is_win() - try - call xolox#shell#open_with_windows_shell(a:path) - catch /^Vim\%((\a\+)\)\=:E117/ - let command = '!start CMD /C START "" %s' - silent execute printf(command, xolox#misc#escape#shell(a:path)) - endtry - return - elseif has('macunix') - let cmd = 'open ' . shellescape(a:path) . ' 2>&1' - call s:handle_error(cmd, system(cmd)) - return - else - for handler in s:handlers + a:000 - if executable(handler) - call xolox#misc#msg#debug("open.vim %s: Using '%s' to open '%s'.", s:version, handler, a:path) - let cmd = shellescape(handler) . ' ' . shellescape(a:path) . ' 2>&1' - call s:handle_error(cmd, system(cmd)) - return - endif - endfor - endif - throw printf(s:enoimpl, s:script, 'xolox#misc#open#file') -endfunction - -function! xolox#misc#open#url(url) " {{{1 - " Given a URL as the first argument, this opens the URL in your preferred or - " best available web browser: - " - " - In GUI environments a graphical web browser will open (or a new tab will - " be created in an existing window) - " - In console Vim without a GUI environment, when you have any of `lynx`, - " `links` or `w3m` installed it will launch a command line web browser in - " front of Vim (temporarily suspending Vim) - let url = a:url - if url !~ '^\w\+://' - if url !~ '@' - let url = 'http://' . url - elseif url !~ '^mailto:' - let url = 'mailto:' . url - endif - endif - if has('unix') && !has('gui_running') && $DISPLAY == '' - for browser in ['lynx', 'links', 'w3m'] - if executable(browser) - execute '!' . browser fnameescape(url) - call s:handle_error(browser . ' ' . url, '') - return - endif - endfor - endif - call xolox#misc#open#file(url, 'firefox', 'google-chrome') -endfunction - -function! s:handle_error(cmd, output) " {{{1 - if v:shell_error - let message = "open.vim %s: Failed to execute program! (command line: %s%s)" - let output = strtrans(xolox#misc#str#trim(a:output)) - if output != '' - let output = ", output: " . string(output) - endif - throw printf(message, s:version, a:cmd, output) - endif -endfunction - -" vim: et ts=2 sw=2 fdm=marker diff --git a/autoload/xolox/misc/option.vim b/autoload/xolox/misc/option.vim deleted file mode 100644 index fce155c..0000000 --- a/autoload/xolox/misc/option.vim +++ /dev/null @@ -1,115 +0,0 @@ -" Vim and plug-in option handling. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -function! xolox#misc#option#get(name, ...) " {{{1 - " Expects one or two arguments: 1. The name of a variable and 2. the default - " value if the variable does not exist. - " - " Returns the value of the variable from a buffer local variable, global - " variable or the default value, depending on which is defined. - " - " This is used by some of my Vim plug-ins for option handling, so that users - " can customize options for specific buffers. - if exists('b:' . a:name) - " Buffer local variable. - return eval('b:' . a:name) - elseif exists('g:' . a:name) - " Global variable. - return eval('g:' . a:name) - elseif exists('a:1') - " Default value. - return a:1 - endif -endfunction - -function! xolox#misc#option#split(value) " {{{1 - " Given a multi-value Vim option like ['runtimepath'] [rtp] this returns a - " list of strings. For example: - " - " :echo xolox#misc#option#split(&runtimepath) - " ['/home/peter/Projects/Vim/misc', - " '/home/peter/Projects/Vim/colorscheme-switcher', - " '/home/peter/Projects/Vim/easytags', - " ...] - " - " [rtp]: http://vimdoc.sourceforge.net/htmldoc/options.html#'runtimepath' - let values = split(a:value, '[^\\]\zs,') - return map(values, 's:unescape(v:val)') -endfunction - -function! s:unescape(s) - return substitute(a:s, '\\\([\\,]\)', '\1', 'g') -endfunction - -function! xolox#misc#option#join(values) " {{{1 - " Given a list of strings like the ones returned by - " `xolox#misc#option#split()`, this joins the strings together into a - " single value that can be used to set a Vim option. - let values = copy(a:values) - call map(values, 's:escape(v:val)') - return join(values, ',') -endfunction - -function! s:escape(s) - return escape(a:s, ',\') -endfunction - -function! xolox#misc#option#split_tags(value) " {{{1 - " Customized version of `xolox#misc#option#split()` with specialized - " handling for Vim's ['tags' option] [tags]. - " - " [tags]: http://vimdoc.sourceforge.net/htmldoc/options.html#'tags' - let values = split(a:value, '[^\\]\zs,') - return map(values, 's:unescape_tags(v:val)') -endfunction - -function! s:unescape_tags(s) - return substitute(a:s, '\\\([\\, ]\)', '\1', 'g') -endfunction - -function! xolox#misc#option#join_tags(values) " {{{1 - " Customized version of `xolox#misc#option#join()` with specialized - " handling for Vim's ['tags' option] [tags]. - let values = copy(a:values) - call map(values, 's:escape_tags(v:val)') - return join(values, ',') -endfunction - -function! s:escape_tags(s) - return escape(a:s, ', ') -endfunction - -function! xolox#misc#option#eval_tags(value, ...) " {{{1 - " Evaluate Vim's ['tags' option] [tags] without looking at the file - " system, i.e. this will report tags files that don't exist yet. Expects - " the value of the ['tags' option] [tags] as the first argument. If the - " optional second argument is 1 (true) only the first match is returned, - " otherwise (so by default) a list with all matches is returned. - let pathnames = [] - let first_only = exists('a:1') ? a:1 : 0 - for pattern in xolox#misc#option#split_tags(a:value) - " Make buffer relative pathnames absolute. - if pattern =~ '^\./' - let directory = xolox#misc#escape#substitute(expand('%:p:h')) - let pattern = substitute(pattern, '^.\ze/', directory, '') - endif - " Make working directory relative pathnames absolute. - if xolox#misc#path#is_relative(pattern) - let pattern = xolox#misc#path#merge(getcwd(), pattern) - endif - " Ignore the trailing `;' for recursive upwards searching because we - " always want the most specific pathname available. - let pattern = substitute(pattern, ';$', '', '') - " Expand the pattern. - call extend(pathnames, split(expand(pattern), "\n")) - if first_only && !empty(pathnames) - return pathnames[0] - endif - endfor - return first_only ? '' : pathnames -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/os.vim b/autoload/xolox/misc/os.vim deleted file mode 100644 index 9554947..0000000 --- a/autoload/xolox/misc/os.vim +++ /dev/null @@ -1,188 +0,0 @@ -" Operating system interfaces. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 20, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -let g:xolox#misc#os#version = '0.4' - -function! xolox#misc#os#is_win() " {{{1 - " Returns 1 (true) when on Microsoft Windows, 0 (false) otherwise. - return has('win16') || has('win32') || has('win64') -endfunction - -function! xolox#misc#os#find_vim() " {{{1 - " Returns the program name of Vim as a string. On Windows and UNIX this - " simply returns [v:progname] [progname] while on Mac OS X there is some - " special magic to find MacVim's executable even though it's usually not on - " the executable search path. - " - " [progname]: http://vimdoc.sourceforge.net/htmldoc/eval.html#v:progname - let progname = '' - if has('macunix') - " Special handling for Mac OS X where MacVim is usually not on the $PATH. - call xolox#misc#msg#debug("os.vim %s: Trying MacVim workaround to find Vim executable ..", g:xolox#misc#os#version) - let segments = xolox#misc#path#split($VIMRUNTIME) - if segments[-3:] == ['Resources', 'vim', 'runtime'] - let progname = xolox#misc#path#join(segments[0:-4] + ['MacOS', 'Vim']) - call xolox#misc#msg#debug("os.vim %s: The MacVim workaround resulted in the Vim executable %s.", g:xolox#misc#os#version, string(progname)) - endif - endif - if empty(progname) - call xolox#misc#msg#debug("os.vim %s: Looking for Vim executable named %s on search path ..", g:xolox#misc#os#version, string(v:progname)) - let candidates = xolox#misc#path#which(v:progname) - if !empty(candidates) - call xolox#misc#msg#debug("os.vim %s: Found %i candidate(s) on search path: %s.", g:xolox#misc#os#version, len(candidates), string(candidates)) - let progname = candidates[0] - endif - endif - call xolox#misc#msg#debug("os.vim %s: Reporting Vim executable %s.", g:xolox#misc#os#version, string(progname)) - return progname -endfunction - -function! xolox#misc#os#exec(options) " {{{1 - " Execute an external command (hiding the console on Microsoft Windows when - " my [vim-shell plug-in] [vim-shell] is installed). - " - " Expects a dictionary with the following key/value pairs as the first - " argument: - " - " - **command** (required): The command line to execute - " - **async** (optional): set this to 1 (true) to execute the command in the - " background (asynchronously) - " - **stdin** (optional): a string or list of strings with the input for the - " external command - " - **check** (optional): set this to 0 (false) to disable checking of the - " exit code of the external command (by default an exception will be - " raised when the command fails) - " - " Returns a dictionary with one or more of the following key/value pairs: - " - " - **command** (always available): the generated command line that was used - " to run the external command - " - **exit_code** (only in synchronous mode): the exit status of the - " external command (an integer, zero on success) - " - **stdout** (only in synchronous mode): the output of the command on the - " standard output stream (a list of strings, one for each line) - " - **stderr** (only in synchronous mode): the output of the command on the - " standard error stream (as a list of strings, one for each line) - " - " [vim-shell]: http://peterodding.com/code/vim/shell/ - try - - " Unpack the options. - let cmd = a:options['command'] - let async = get(a:options, 'async', 0) - - " Write the input for the external command to a temporary file? - if has_key(a:options, 'stdin') - let tempin = tempname() - if type(a:options['stdin']) == type([]) - let lines = a:options['stdin'] - else - let lines = split(a:options['stdin'], "\n") - endif - call writefile(lines, tempin) - let cmd .= ' < ' . xolox#misc#escape#shell(tempin) - endif - - " Redirect the standard output and standard error streams of the external - " process to temporary files? (only in synchronous mode, which is the - " default). - if !async - let tempout = tempname() - let temperr = tempname() - let cmd = printf('(%s) 1>%s 2>%s', cmd, xolox#misc#escape#shell(tempout), xolox#misc#escape#shell(temperr)) - endif - - " If A) we're on Windows, B) the vim-shell plug-in is installed and C) the - " compiled DLL works, we'll use that because it's the most user friendly - " method. If the plug-in is not installed Vim will raise the exception - " "E117: Unknown function" which is caught and handled below. - try - if xolox#shell#can_use_dll() - " Let the user know what's happening (in case they're interested). - call xolox#misc#msg#debug("os.vim %s: Executing external command using compiled DLL: %s", g:xolox#misc#os#version, cmd) - let exit_code = xolox#shell#execute_with_dll(cmd, async) - endif - catch /^Vim\%((\a\+)\)\=:E117/ - call xolox#misc#msg#debug("os.vim %s: The vim-shell plug-in is not installed, falling back to system() function.", g:xolox#misc#os#version) - endtry - - " If we cannot use the DLL, we fall back to the default and generic - " implementation using Vim's system() function. - if !exists('exit_code') - - " Enable asynchronous mode (very platform specific). - if async - if xolox#misc#os#is_win() - let cmd = 'start /b ' . cmd - elseif has('unix') - let cmd = '(' . cmd . ') &' - else - call xolox#misc#msg#warn("os.vim %s: I don't know how to run commands asynchronously on your platform! Falling back to synchronous mode.", g:xolox#misc#os#version) - endif - endif - - " Execute the command line using 'sh' instead of the default shell, - " because we assume that standard output and standard error can be - " redirected separately, but (t)csh does not support this. - if has('unix') - call xolox#misc#msg#debug("os.vim %s: Generated shell expression: %s", g:xolox#misc#os#version, cmd) - let cmd = printf('sh -c %s', xolox#misc#escape#shell(cmd)) - endif - - " Let the user know what's happening (in case they're interested). - call xolox#misc#msg#debug("os.vim %s: Executing external command using system() function: %s", g:xolox#misc#os#version, cmd) - call system(cmd) - let exit_code = v:shell_error - - endif - - " Return the results as a dictionary with one or more key/value pairs. - let result = {'command': cmd} - if !async - let result['exit_code'] = exit_code - let result['stdout'] = s:readfile(tempout) - let result['stderr'] = s:readfile(temperr) - " If we just executed a synchronous command and the caller didn't - " specifically ask us *not* to check the exit code of the external - " command, we'll do so now. - if get(a:options, 'check', 1) && exit_code != 0 - " Prepare an error message with enough details so the user can investigate. - let msg = printf("os.vim %s: External command failed with exit code %d!", g:xolox#misc#os#version, result['exit_code']) - let msg .= printf("\nCommand line: %s", result['command']) - " If the external command reported an error, we'll include it in our message. - if !empty(result['stderr']) - " This is where we would normally expect to find an error message. - let msg .= printf("\nOutput on standard output stream:\n%s", join(result['stderr'], "\n")) - elseif !empty(result['stdout']) - " Exuberant Ctags on Windows XP reports errors on standard output :-x. - let msg .= printf("\nOutput on standard error stream:\n%s", join(result['stdout'], "\n")) - endif - throw msg - endif - endif - return result - - finally - " Cleanup any temporary files we created. - for name in ['tempin', 'tempout', 'temperr'] - if exists(name) - call delete({name}) - endif - endfor - endtry - -endfunction - -function! s:readfile(fname) " {{{1 - " readfile() that swallows errors. - try - return readfile(a:fname) - catch - return [] - endtry -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/path.vim b/autoload/xolox/misc/path.vim deleted file mode 100644 index 15e11d6..0000000 --- a/autoload/xolox/misc/path.vim +++ /dev/null @@ -1,253 +0,0 @@ -" Pathname manipulation functions. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 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(...) " {{{1 - " Scan the executable search path (`$PATH`) for one or more external - " programs. Expects one or more string arguments with program names. Returns - " a list with the absolute pathnames of all found programs. Here's an - " example: - " - " :echo xolox#misc#path#which('gvim', 'vim') - " ['/usr/local/bin/gvim', - " '/usr/bin/gvim', - " '/usr/local/bin/vim', - " '/usr/bin/vim'] - let extensions = s:windows_compatible ? split($PATHEXT, ';') : [''] - let matches = [] - let checked = {} - for program in a:000 - for extension in extensions - for directory in split($PATH, s:windows_compatible ? ';' : ':') - let directory = xolox#misc#path#absolute(directory) - if isdirectory(directory) - let path = xolox#misc#path#merge(directory, program . extension) - if executable(path) - call add(matches, path) - endif - endif - endfor - endfor - endfor - return matches -endfunction - -function! xolox#misc#path#split(path) " {{{1 - " Split a pathname (the first and only argument) into a list of pathname - " components. - " - " On Windows, pathnames starting with two slashes or backslashes are UNC - " paths where the leading slashes are significant... In this case we split - " like this: - " - " - Input: `'//server/share/directory'` - " - Result: `['//server', 'share', 'directory']` - " - " Everything except Windows is treated like UNIX until someone has a better - " suggestion :-). In this case we split like this: - " - " - Input: `'/foo/bar/baz'` - " - Result: `['/', 'foo', 'bar', 'baz']` - " - " To join a list of pathname components back into a single pathname string, - " use the `xolox#misc#path#join()` function. - if type(a:path) == type('') - if s:windows_compatible - if a:path =~ '^[\/][\/]' - " UNC pathname. - return split(a:path, '\%>2c[\/]\+') - else - " If it's not a UNC path we can simply split on slashes & backslashes. - return split(a:path, '[\/]\+') - endif - else - " Everything else is treated as UNIX. - let absolute = (a:path =~ '^/') - let segments = split(a:path, '/\+') - return absolute ? insert(segments, '/') : segments - endif - endif - return [] -endfunction - -function! xolox#misc#path#join(parts) " {{{1 - " Join a list of pathname components (the first and only argument) into a - " single pathname string. This is the counterpart to the - " `xolox#misc#path#split()` function and it expects a list of pathname - " components as returned by `xolox#misc#path#split()`. - if type(a:parts) == type([]) - if s:windows_compatible - return join(a:parts, xolox#misc#path#directory_separator()) - elseif a:parts[0] == '/' - " Absolute path on UNIX (non-Windows). - return '/' . join(a:parts[1:], '/') - else - " Relative path on UNIX (non-Windows). - return join(a:parts, '/') - endif - endif - return '' -endfunction - -function! xolox#misc#path#directory_separator() " {{{1 - " Find the preferred directory separator for the platform and settings. - return exists('+shellslash') && &shellslash ? '/' : '\' -endfunction - -function! xolox#misc#path#absolute(path) " {{{1 - " Canonicalize and resolve a pathname, *regardless of whether it exists*. - " This is intended to support string comparison to determine whether two - " pathnames point to the same directory or file. - if type(a:path) == type('') - let path = a:path - " Make the pathname absolute. - if path =~ '^\~' - " Expand ~ to $HOME. - let path = $HOME . '/' . path[1:] - elseif xolox#misc#path#is_relative(path) - " Make relative pathnames absolute. - let path = getcwd() . '/' . path - endif - " Resolve symbolic links to find the canonical pathname. In my tests this - " also removes all symbolic pathname segments (`.' and `..'), even when - " the pathname does not exist. Also there used to be a bug in resolve() - " where it wouldn't resolve pathnames ending in a directory separator. - " Since it's not much trouble to work around, that's what we do. - let path = resolve(substitute(path, s:windows_compatible ? '[\/]\+$' : '/\+$', '', '')) - " Normalize directory separators (especially relevant on Windows). - let parts = xolox#misc#path#split(path) - if s:windows_compatible && parts[0] =~ '^[\/][\/]' - " Also normalize the two leading "directory separators" (I'm not - " sure what else to call them :-) in Windows UNC pathnames. - let parts[0] = repeat(xolox#misc#path#directory_separator(), 2) . parts[0][2:] - endif - return xolox#misc#path#join(parts) - endif - return '' -endfunction - -function! xolox#misc#path#relative(path, base) " {{{1 - " Make an absolute pathname (the first argument) relative to a directory - " (the second argument). - let path = xolox#misc#path#split(a:path) - let base = xolox#misc#path#split(a:base) - while path != [] && base != [] && path[0] == base[0] - call remove(path, 0) - call remove(base, 0) - endwhile - let distance = repeat(['..'], len(base)) - return xolox#misc#path#join(distance + path) -endfunction - - -function! xolox#misc#path#merge(parent, child, ...) " {{{1 - " Join a directory pathname and filename into a single pathname. - if type(a:parent) == type('') && type(a:child) == type('') - " TODO Use xolox#misc#path#is_relative()? - if s:windows_compatible - let parent = substitute(a:parent, '[\\/]\+$', '', '') - let child = substitute(a:child, '^[\\/]\+', '', '') - return parent . '\' . child - else - let parent = substitute(a:parent, '/\+$', '', '') - let child = substitute(a:child, '^/\+', '', '') - return parent . '/' . child - endif - endif - return '' -endfunction - -function! xolox#misc#path#commonprefix(paths) " {{{1 - " Find the common prefix of path components in a list of pathnames. - let common = xolox#misc#path#split(a:paths[0]) - for path in a:paths - let index = 0 - for segment in xolox#misc#path#split(path) - if len(common) <= index - break - elseif common[index] != segment - call remove(common, index, -1) - break - endif - let index += 1 - endfor - endfor - return xolox#misc#path#join(common) -endfunction - -function! xolox#misc#path#encode(path) " {{{1 - " Encode a pathname so it can be used as a filename. This uses URL encoding - " to encode special characters. - 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 - - -function! xolox#misc#path#decode(encoded_path) " {{{1 - " Decode a pathname previously encoded with `xolox#misc#path#encode()`. - return substitute(a:encoded_path, '%\(\x\x\?\)', '\=nr2char("0x" . submatch(1))', 'g') -endfunction - -" xolox#misc#path#equals(a, b) - Check whether two pathnames point to the same file. {{{1 - -if s:windows_compatible - function! xolox#misc#path#equals(a, b) - return a:a ==? a:b || xolox#misc#path#absolute(a:a) ==? xolox#misc#path#absolute(a:b) - endfunction -else - function! xolox#misc#path#equals(a, b) - return a:a ==# a:b || xolox#misc#path#absolute(a:a) ==# xolox#misc#path#absolute(a:b) - endfunction -endif - -function! xolox#misc#path#is_relative(path) " {{{1 - " Returns true (1) when the pathname given as the first argument is - " relative, false (0) otherwise. - if a:path =~ '^\w\+://' - return 0 - elseif s:windows_compatible - return a:path !~ '^\(\w:\|[\\/]\)' - else - return a:path !~ '^/' - endif -endfunction - -function! xolox#misc#path#tempdir() " {{{1 - " Create a temporary directory and return the pathname of the directory. - if !exists('s:tempdir_counter') - let s:tempdir_counter = 1 - endif - if exists('*mkdir') - if s:windows_compatible - let template = $TMP . '\vim_tempdir_' - elseif filewritable('/tmp') == 2 - let template = '/tmp/vim_tempdir_' - endif - endif - if !exists('template') - throw "xolox#misc#path#tempdir() hasn't been implemented on your platform!" - endif - while 1 - let directory = template . s:tempdir_counter - try - call mkdir(directory, '', 0700) - return directory - catch /\<E739\>/ - " Keep looking for a non-existing directory. - endtry - let s:tempdir_counter += 1 - endwhile -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/str.vim b/autoload/xolox/misc/str.vim deleted file mode 100644 index 901696c..0000000 --- a/autoload/xolox/misc/str.vim +++ /dev/null @@ -1,18 +0,0 @@ -" String handling. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 19, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -function! xolox#misc#str#compact(s) - " Compact whitespace in the string given as the first argument. - return join(split(a:s), " ") -endfunction - -function! xolox#misc#str#trim(s) - " Trim all whitespace from the start and end of the string given as the - " first argument. - return substitute(a:s, '^\_s*\(.\{-}\)\_s*$', '\1', '') -endfunction - -" vim: ts=2 sw=2 et diff --git a/autoload/xolox/misc/timer.vim b/autoload/xolox/misc/timer.vim deleted file mode 100644 index 31072f5..0000000 --- a/autoload/xolox/misc/timer.vim +++ /dev/null @@ -1,103 +0,0 @@ -" Timing of long during operations. -" -" Author: Peter Odding <peter@peterodding.com> -" Last Change: May 20, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -if !exists('g:timer_enabled') - let g:timer_enabled = 0 -endif - -if !exists('g:timer_verbosity') - let g:timer_verbosity = 1 -endif - -let s:has_reltime = has('reltime') - -function! xolox#misc#timer#start() " {{{1 - " Start a timer. This returns a list which can later be passed to - " `xolox#misc#timer#stop()`. - return s:has_reltime ? reltime() : [localtime()] -endfunction - -function! xolox#misc#timer#stop(...) " {{{1 - " Show a formatted debugging message to the user, if the user has enabled - " increased verbosity by setting Vim's ['verbose'] [verbose] option to one - " (1) or higher. - " - " This function has the same argument handling as Vim's [printf()] [printf] - " function with one difference: At the point where you want the elapsed time - " to be embedded, you write `%s` and you pass the list returned by - " `xolox#misc#timer#start()` as an argument. - " - " [verbose]: http://vimdoc.sourceforge.net/htmldoc/options.html#'verbose' - " [printf]: http://vimdoc.sourceforge.net/htmldoc/eval.html#printf() - if (g:timer_enabled || &verbose >= g:timer_verbosity) - call call('xolox#misc#msg#info', map(copy(a:000), 's:convert_value(v:val)')) - endif -endfunction - -function! xolox#misc#timer#force(...) " {{{1 - " Show a formatted message to the user. This function has the same argument - " handling as Vim's [printf()] [printf] function with one difference: At the - " point where you want the elapsed time to be embedded, you write `%s` and - " you pass the list returned by `xolox#misc#timer#start()` as an argument. - call call('xolox#misc#msg#info', map(copy(a:000), 's:convert_value(v:val)')) -endfunction - -function! s:convert_value(value) " {{{1 - if type(a:value) != type([]) - return a:value - elseif !empty(a:value) - if s:has_reltime - let ts = xolox#misc#str#trim(reltimestr(reltime(a:value))) - else - let ts = localtime() - a:value[0] - endif - return xolox#misc#timer#format_timespan(ts) - else - return '?' - endif -endfunction - -" Format number of seconds as human friendly description. - -let s:units = [['day', 60 * 60 * 24], ['hour', 60 * 60], ['minute', 60], ['second', 1]] - -function! xolox#misc#timer#format_timespan(ts) " {{{1 - " Format a time stamp (a string containing a formatted floating point - " number) into a human friendly format, for example 70 seconds is phrased as - " "1 minute and 10 seconds". - - " Convert timespan to integer. - let seconds = a:ts + 0 - - " Fast common case with extra precision from reltime(). - if seconds < 5 - let extract = matchstr(a:ts, '^\d\+\(\.0*[1-9][1-9]\?\)\?') - if extract =~ '[123456789]' - return extract . ' second' . (extract != '1' ? 's' : '') - endif - endif - - " Generic but slow code. - let result = [] - for [name, size] in s:units - if seconds >= size - let counter = seconds / size - let seconds = seconds % size - let suffix = counter != 1 ? 's' : '' - call add(result, printf('%i %s%s', counter, name, suffix)) - endif - endfor - - " Format the resulting text? - if len(result) == 1 - return result[0] - else - return join(result[0:-2], ', ') . ' and ' . result[-1] - endif - -endfunction - -" vim: ts=2 sw=2 et |