Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Cleaned up old miscellaneous scripts

  • Loading branch information...
commit fb59e179cb0f3d7a35f9e1279c796747a19d240c 1 parent fdbb8b2
@xolox authored
View
80 autoload/xolox/misc/buffer.vim
@@ -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
View
37 autoload/xolox/misc/compat.vim
@@ -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
View
22 autoload/xolox/misc/complete.vim
@@ -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
View
56 autoload/xolox/misc/escape.vim
@@ -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
View
57 autoload/xolox/misc/list.vim
@@ -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
View
91 autoload/xolox/misc/msg.vim
@@ -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
View
92 autoload/xolox/misc/open.vim
@@ -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
View
115 autoload/xolox/misc/option.vim
@@ -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
View
188 autoload/xolox/misc/os.vim
@@ -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
View
253 autoload/xolox/misc/path.vim
@@ -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
View
18 autoload/xolox/misc/str.vim
@@ -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
View
103 autoload/xolox/misc/timer.vim
@@ -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
Please sign in to comment.
Something went wrong with that request. Please try again.