aboutsummaryrefslogtreecommitdiff
path: root/runtime/autoload
diff options
context:
space:
mode:
authorJakob Schnitzer <mail@jakobschnitzer.de>2017-06-28 16:52:04 +0200
committerJakob Schnitzer <mail@jakobschnitzer.de>2017-06-28 16:52:04 +0200
commite8829710bc5f38208499e0ad38402eac24a67ac2 (patch)
tree4e1ae954c2e301adadbfa7038b823ea9ea2fb08e /runtime/autoload
parentff8b2eb435c518f0eafd0e509afe1f5ee4a81fd1 (diff)
parentf0dafa89c2b7602cfedf0bd3409858e4c212b0a2 (diff)
downloadrneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.tar.gz
rneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.tar.bz2
rneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.zip
Merge branch 'master' into option-fixes
Diffstat (limited to 'runtime/autoload')
-rw-r--r--runtime/autoload/ada.vim10
-rw-r--r--runtime/autoload/context.vim184
-rw-r--r--runtime/autoload/contextcomplete.vim25
-rw-r--r--runtime/autoload/gzip.vim6
-rw-r--r--runtime/autoload/health.vim1
-rw-r--r--runtime/autoload/health/nvim.vim9
-rw-r--r--runtime/autoload/health/provider.vim45
-rw-r--r--runtime/autoload/man.vim77
-rw-r--r--runtime/autoload/netrw.vim4
-rw-r--r--runtime/autoload/phpcomplete.vim102
-rw-r--r--runtime/autoload/provider/clipboard.vim25
-rw-r--r--runtime/autoload/provider/ruby.vim12
-rw-r--r--runtime/autoload/provider/script_host.rb8
-rw-r--r--runtime/autoload/rubycomplete.vim38
-rw-r--r--runtime/autoload/shada.vim3
-rw-r--r--runtime/autoload/tar.vim2
-rw-r--r--runtime/autoload/zip.vim76
17 files changed, 524 insertions, 103 deletions
diff --git a/runtime/autoload/ada.vim b/runtime/autoload/ada.vim
index cc5191fa43..ce3a19369a 100644
--- a/runtime/autoload/ada.vim
+++ b/runtime/autoload/ada.vim
@@ -2,12 +2,13 @@
" Description: Perform Ada specific completion & tagging.
" Language: Ada (2005)
" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
-" Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" Maintainer: Mathias Brousset <mathiasb17@gmail.com>
+" Martin Krischik <krischik@users.sourceforge.net>
" Taylor Venable <taylor@metasyntax.net>
" Neil Bird <neil@fnxweb.com>
" Ned Okie <nokie@radford.edu>
" $Author: krischik $
-" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" $Date: 2017-01-31 20:20:05 +0200 (Mon, 01 Jan 2017) $
" Version: 4.6
" $Revision: 887 $
" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/ada.vim $
@@ -23,6 +24,7 @@
" 09.05.2007 MK Session just won't work no matter how much
" tweaking is done
" 19.09.2007 NO still some mapleader problems
+" 31.01.2017 MB fix more mapleader problems
" Help Page: ft-ada-functions
"------------------------------------------------------------------------------
@@ -585,11 +587,11 @@ function ada#Map_Menu (Text, Keys, Command)
\ " :" . a:Command . "<CR>"
execute
\ "nnoremap <buffer>" .
- \ escape(l:leader . "a" . a:Keys , '\') .
+ \ " <Leader>a" . a:Keys .
\" :" . a:Command
execute
\ "inoremap <buffer>" .
- \ escape(l:leader . "a" . a:Keys , '\') .
+ \ " <Learder>a" . a:Keys .
\" <C-O>:" . a:Command
endif
return
diff --git a/runtime/autoload/context.vim b/runtime/autoload/context.vim
new file mode 100644
index 0000000000..254d710c01
--- /dev/null
+++ b/runtime/autoload/context.vim
@@ -0,0 +1,184 @@
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Latest Revision: 2016 Oct 21
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Helper functions {{{
+function! s:context_echo(message, mode)
+ redraw
+ echo "\r"
+ execute 'echohl' a:mode
+ echomsg '[ConTeXt]' a:message
+ echohl None
+endf
+
+function! s:sh()
+ return has('win32') || has('win64') || has('win16') || has('win95')
+ \ ? ['cmd.exe', '/C']
+ \ : ['/bin/sh', '-c']
+endfunction
+
+" For backward compatibility
+if exists('*win_getid')
+
+ function! s:win_getid()
+ return win_getid()
+ endf
+
+ function! s:win_id2win(winid)
+ return win_id2win(a:winid)
+ endf
+
+else
+
+ function! s:win_getid()
+ return winnr()
+ endf
+
+ function! s:win_id2win(winnr)
+ return a:winnr
+ endf
+
+endif
+" }}}
+
+" ConTeXt jobs {{{
+if has('job')
+
+ let g:context_jobs = []
+
+ " Print the status of ConTeXt jobs
+ function! context#job_status()
+ let l:jobs = filter(g:context_jobs, 'job_status(v:val) == "run"')
+ let l:n = len(l:jobs)
+ call s:context_echo(
+ \ 'There '.(l:n == 1 ? 'is' : 'are').' '.(l:n == 0 ? 'no' : l:n)
+ \ .' job'.(l:n == 1 ? '' : 's').' running'
+ \ .(l:n == 0 ? '.' : ' (' . join(l:jobs, ', ').').'),
+ \ 'ModeMsg')
+ endfunction
+
+ " Stop all ConTeXt jobs
+ function! context#stop_jobs()
+ let l:jobs = filter(g:context_jobs, 'job_status(v:val) == "run"')
+ for job in l:jobs
+ call job_stop(job)
+ endfor
+ sleep 1
+ let l:tmp = []
+ for job in l:jobs
+ if job_status(job) == "run"
+ call add(l:tmp, job)
+ endif
+ endfor
+ let g:context_jobs = l:tmp
+ if empty(g:context_jobs)
+ call s:context_echo('Done. No jobs running.', 'ModeMsg')
+ else
+ call s:context_echo('There are still some jobs running. Please try again.', 'WarningMsg')
+ endif
+ endfunction
+
+ function! context#callback(path, job, status)
+ if index(g:context_jobs, a:job) != -1 && job_status(a:job) != 'run' " just in case
+ call remove(g:context_jobs, index(g:context_jobs, a:job))
+ endif
+ call s:callback(a:path, a:job, a:status)
+ endfunction
+
+ function! context#close_cb(channel)
+ call job_status(ch_getjob(a:channel)) " Trigger exit_cb's callback for faster feedback
+ endfunction
+
+ function! s:typeset(path)
+ call add(g:context_jobs,
+ \ job_start(add(s:sh(), context#command() . ' ' . shellescape(fnamemodify(a:path, ":t"))), {
+ \ 'close_cb' : 'context#close_cb',
+ \ 'exit_cb' : function(get(b:, 'context_callback', get(g:, 'context_callback', 'context#callback')),
+ \ [a:path]),
+ \ 'in_io' : 'null'
+ \ }))
+ endfunction
+
+else " No jobs
+
+ function! context#job_status()
+ call s:context_echo('Not implemented', 'WarningMsg')
+ endfunction!
+
+ function! context#stop_jobs()
+ call s:context_echo('Not implemented', 'WarningMsg')
+ endfunction
+
+ function! context#callback(path, job, status)
+ call s:callback(a:path, a:job, a:status)
+ endfunction
+
+ function! s:typeset(path)
+ execute '!' . context#command() . ' ' . shellescape(fnamemodify(a:path, ":t"))
+ call call(get(b:, 'context_callback', get(g:, 'context_callback', 'context#callback')),
+ \ [a:path, 0, v:shell_error])
+ endfunction
+
+endif " has('job')
+
+function! s:callback(path, job, status) abort
+ if a:status < 0 " Assume the job was terminated
+ return
+ endif
+ " Get info about the current window
+ let l:winid = s:win_getid() " Save window id
+ let l:efm = &l:errorformat " Save local errorformat
+ let l:cwd = fnamemodify(getcwd(), ":p") " Save local working directory
+ " Set errorformat to parse ConTeXt errors
+ execute 'setl efm=' . escape(b:context_errorformat, ' ')
+ try " Set cwd to expand error file correctly
+ execute 'lcd' fnameescape(fnamemodify(a:path, ':h'))
+ catch /.*/
+ execute 'setl efm=' . escape(l:efm, ' ')
+ throw v:exception
+ endtry
+ try
+ execute 'cgetfile' fnameescape(fnamemodify(a:path, ':r') . '.log')
+ botright cwindow
+ finally " Restore cwd and errorformat
+ execute s:win_id2win(l:winid) . 'wincmd w'
+ execute 'lcd ' . fnameescape(l:cwd)
+ execute 'setl efm=' . escape(l:efm, ' ')
+ endtry
+ if a:status == 0
+ call s:context_echo('Success!', 'ModeMsg')
+ else
+ call s:context_echo('There are errors. ', 'ErrorMsg')
+ endif
+endfunction
+
+function! context#command()
+ return get(b:, 'context_mtxrun', get(g:, 'context_mtxrun', 'mtxrun'))
+ \ . ' --script context --autogenerate --nonstopmode'
+ \ . ' --synctex=' . (get(b:, 'context_synctex', get(g:, 'context_synctex', 0)) ? '1' : '0')
+ \ . ' ' . get(b:, 'context_extra_options', get(g:, 'context_extra_options', ''))
+endfunction
+
+" Accepts an optional path (useful for big projects, when the file you are
+" editing is not the project's root document). If no argument is given, uses
+" the path of the current buffer.
+function! context#typeset(...) abort
+ let l:path = fnamemodify(strlen(a:000[0]) > 0 ? a:1 : expand("%"), ":p")
+ let l:cwd = fnamemodify(getcwd(), ":p") " Save local working directory
+ call s:context_echo('Typesetting...', 'ModeMsg')
+ execute 'lcd' fnameescape(fnamemodify(l:path, ":h"))
+ try
+ call s:typeset(l:path)
+ finally " Restore local working directory
+ execute 'lcd ' . fnameescape(l:cwd)
+ endtry
+endfunction!
+"}}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: sw=2 fdm=marker
diff --git a/runtime/autoload/contextcomplete.vim b/runtime/autoload/contextcomplete.vim
new file mode 100644
index 0000000000..5b93bb0986
--- /dev/null
+++ b/runtime/autoload/contextcomplete.vim
@@ -0,0 +1,25 @@
+" Language: ConTeXt typesetting engine
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Latest Revision: 2016 Oct 15
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Complete keywords in MetaPost blocks
+function! contextcomplete#Complete(findstart, base)
+ if a:findstart == 1
+ if len(synstack(line('.'), 1)) > 0 &&
+ \ synIDattr(synstack(line('.'), 1)[0], "name") ==# 'contextMPGraphic'
+ return syntaxcomplete#Complete(a:findstart, a:base)
+ else
+ return -3
+ endif
+ else
+ return syntaxcomplete#Complete(a:findstart, a:base)
+ endif
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: sw=2 fdm=marker
diff --git a/runtime/autoload/gzip.vim b/runtime/autoload/gzip.vim
index a6b4605b06..e4adec0947 100644
--- a/runtime/autoload/gzip.vim
+++ b/runtime/autoload/gzip.vim
@@ -1,6 +1,6 @@
" Vim autoload file for editing compressed files.
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 Nov 05
+" Last Change: 2016 Sep 28
" These functions are used by the gzip plugin.
@@ -63,6 +63,9 @@ fun gzip#read(cmd)
" set 'modifiable'
let ma_save = &ma
setlocal ma
+ " set 'write'
+ let write_save = &write
+ set write
" Reset 'foldenable', otherwise line numbers get adjusted.
if has("folding")
let fen_save = &fen
@@ -127,6 +130,7 @@ fun gzip#read(cmd)
let &pm = pm_save
let &cpo = cpo_save
let &l:ma = ma_save
+ let &write = write_save
if has("folding")
let &l:fen = fen_save
endif
diff --git a/runtime/autoload/health.vim b/runtime/autoload/health.vim
index 8f45adcff1..1d8cae7d19 100644
--- a/runtime/autoload/health.vim
+++ b/runtime/autoload/health.vim
@@ -66,6 +66,7 @@ function! health#check(plugin_names) abort
" needed for plasticboy/vim-markdown, because it uses fdm=expr
normal! zR
setlocal nomodified
+ setlocal bufhidden=hide
redraw|echo ''
endfunction
diff --git a/runtime/autoload/health/nvim.vim b/runtime/autoload/health/nvim.vim
index 4c6aa0eb04..3834cbd054 100644
--- a/runtime/autoload/health/nvim.vim
+++ b/runtime/autoload/health/nvim.vim
@@ -4,15 +4,6 @@ function! s:check_config() abort
let ok = v:true
call health#report_start('Configuration')
- if get(g:, 'loaded_sensible', 0)
- let ok = v:false
- let sensible_pi = globpath(&runtimepath, '**/sensible.vim', 1, 1)
- call health#report_info("found sensible.vim plugin:\n".join(sensible_pi, "\n"))
- call health#report_error("sensible.vim plugin is not needed; Nvim has the same defaults built-in."
- \ ." Also, sensible.vim sets 'ttimeoutlen' to a sub-optimal value.",
- \ ["Remove sensible.vim plugin, or wrap it in a `if !has('nvim')` check."])
- endif
-
if exists('$NVIM_TUI_ENABLE_CURSOR_SHAPE')
let ok = v:false
call health#report_warn("$NVIM_TUI_ENABLE_CURSOR_SHAPE is ignored in Nvim 0.2+",
diff --git a/runtime/autoload/health/provider.vim b/runtime/autoload/health/provider.vim
index 2506c8216b..31a235a397 100644
--- a/runtime/autoload/health/provider.vim
+++ b/runtime/autoload/health/provider.vim
@@ -31,13 +31,23 @@ endfunction
" Handler for s:system() function.
function! s:system_handler(jobid, data, event) dict abort
- if a:event == 'stdout' || a:event == 'stderr'
+ if a:event ==# 'stdout' || a:event ==# 'stderr'
let self.output .= join(a:data, '')
- elseif a:event == 'exit'
+ elseif a:event ==# 'exit'
let s:shell_error = a:data
endif
endfunction
+" Attempts to construct a shell command from an args list.
+" Only for display, to help users debug a failed command.
+function! s:shellify(cmd) abort
+ if type(a:cmd) != type([])
+ return a:cmd
+ endif
+ return join(map(copy(a:cmd),
+ \'v:val =~# ''\m[\-.a-zA-Z_/]'' ? shellescape(v:val) : v:val'), ' ')
+endfunction
+
" Run a system command and timeout after 30 seconds.
function! s:system(cmd, ...) abort
let stdin = a:0 ? a:1 : ''
@@ -54,8 +64,7 @@ function! s:system(cmd, ...) abort
let jobid = jobstart(a:cmd, opts)
if jobid < 1
- call health#report_error(printf('Command error %d: %s', jobid,
- \ type(a:cmd) == type([]) ? join(a:cmd) : a:cmd)))
+ call health#report_error(printf('Command error (job=%d): %s', jobid, s:shellify(a:cmd)))
let s:shell_error = 1
return opts.output
endif
@@ -66,13 +75,11 @@ function! s:system(cmd, ...) abort
let res = jobwait([jobid], 30000)
if res[0] == -1
- call health#report_error(printf('Command timed out: %s',
- \ type(a:cmd) == type([]) ? join(a:cmd) : a:cmd))
+ call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd)))
call jobstop(jobid)
elseif s:shell_error != 0 && !ignore_error
- call health#report_error(printf("Command error (%d) %s: %s", jobid,
- \ type(a:cmd) == type([]) ? join(a:cmd) : a:cmd,
- \ opts.output))
+ call health#report_error(printf("Command error (job=%d): %s\nOutput: %s", jobid,
+ \ s:shellify(a:cmd), opts.output))
endif
return opts.output
@@ -116,7 +123,7 @@ function! s:check_clipboard() abort
let clipboard_tool = provider#clipboard#Executable()
if empty(clipboard_tool)
call health#report_warn(
- \ "No clipboard tool found. Clipboard registers will not work.",
+ \ 'No clipboard tool found. Clipboard registers will not work.',
\ [':help clipboard'])
else
call health#report_ok('Clipboard tool found: '. clipboard_tool)
@@ -157,7 +164,7 @@ function! s:version_info(python) abort
\ ]))
if empty(python_version)
- let python_version = 'unable to parse python response'
+ let python_version = 'unable to parse '.a:python.' response'
endif
let nvim_path = s:trim(s:system([
@@ -169,14 +176,14 @@ function! s:version_info(python) abort
" Assuming that multiple versions of a package are installed, sort them
" numerically in descending order.
- function! s:compare(metapath1, metapath2)
+ function! s:compare(metapath1, metapath2) abort
let a = matchstr(fnamemodify(a:metapath1, ':p:h:t'), '[0-9.]\+')
let b = matchstr(fnamemodify(a:metapath2, ':p:h:t'), '[0-9.]\+')
return a == b ? 0 : a > b ? 1 : -1
endfunction
" Try to get neovim.VERSION (added in 0.1.11dev).
- let nvim_version = s:system(['python', '-c',
+ let nvim_version = s:system([a:python, '-c',
\ 'from neovim import VERSION as v; '.
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
\ '', 1, 1)
@@ -429,8 +436,8 @@ function! s:check_ruby() abort
if !executable('ruby') || !executable('gem')
call health#report_warn(
- \ "`ruby` and `gem` must be in $PATH.",
- \ ["Install Ruby and verify that `ruby` and `gem` commands work."])
+ \ '`ruby` and `gem` must be in $PATH.',
+ \ ['Install Ruby and verify that `ruby` and `gem` commands work.'])
return
endif
call health#report_info('Ruby: '. s:system('ruby -v'))
@@ -445,21 +452,21 @@ function! s:check_ruby() abort
endif
call health#report_info('Host: '. host)
- let latest_gem_cmd = 'gem list -ra ^neovim$'
+ let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra ^^neovim$' : 'gem list -ra ^neovim$'
let latest_gem = s:system(split(latest_gem_cmd))
if s:shell_error || empty(latest_gem)
call health#report_error('Failed to run: '. latest_gem_cmd,
\ ["Make sure you're connected to the internet.",
- \ "Are you behind a firewall or proxy?"])
+ \ 'Are you behind a firewall or proxy?'])
return
endif
- let latest_gem = get(split(latest_gem, ' (\|, \|)$' ), 1, 'not found')
+ let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 1, 'not found')
let current_gem_cmd = host .' --version'
let current_gem = s:system(current_gem_cmd)
if s:shell_error
call health#report_error('Failed to run: '. current_gem_cmd,
- \ ["Report this issue with the output of: ", current_gem_cmd])
+ \ ['Report this issue with the output of: ', current_gem_cmd])
return
endif
diff --git a/runtime/autoload/man.vim b/runtime/autoload/man.vim
index 96f03e47cc..dd71ede680 100644
--- a/runtime/autoload/man.vim
+++ b/runtime/autoload/man.vim
@@ -1,16 +1,31 @@
" Maintainer: Anmol Sethi <anmol@aubble.com>
-let s:man_find_arg = "-w"
+let s:find_arg = '-w'
+let s:localfile_arg = v:true " Always use -l if possible. #6683
+let s:section_arg = '-s'
-" TODO(nhooyr) Completion may work on SunOS; I'm not sure if `man -l` displays
-" the list of searched directories.
-try
- if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
- let s:man_find_arg = '-l'
+function! s:init_section_flag()
+ call system(['env', 'MANPAGER=cat', 'man', s:section_arg, '1', 'man'])
+ if v:shell_error
+ let s:section_arg = '-S'
endif
-catch /E145:/
- " Ignore the error in restricted mode
-endtry
+endfunction
+
+function! s:init() abort
+ call s:init_section_flag()
+ " TODO(nhooyr): Does `man -l` on SunOS list searched directories?
+ try
+ if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
+ let s:find_arg = '-l'
+ endif
+ " Check for -l support.
+ call s:get_page(s:get_path('', 'man')[0:-2])
+ catch /E145:/
+ " Ignore the error in restricted mode
+ catch /command error .*/
+ let s:localfile_arg = v:false
+ endtry
+endfunction
function! man#open_page(count, count1, mods, ...) abort
if a:0 > 2
@@ -88,10 +103,8 @@ endfunction
" Handler for s:system() function.
function! s:system_handler(jobid, data, event) dict abort
- if a:event == 'stdout'
- let self.stdout .= join(a:data, "\n")
- elseif a:event == 'stderr'
- let self.stderr .= join(a:data, "\n")
+ if a:event is# 'stdout' || a:event is# 'stderr'
+ let self[a:event] .= join(a:data, "\n")
else
let self.exit_code = a:data
endif
@@ -118,7 +131,7 @@ function! s:system(cmd, ...) abort
try
call jobstop(jobid)
throw printf('command timed out: %s', join(a:cmd))
- catch /^Vim\%((\a\+)\)\=:E900/
+ catch /^Vim(call):E900:/
endtry
elseif res[0] == -2
throw printf('command interrupted: %s', join(a:cmd))
@@ -135,7 +148,8 @@ function! s:get_page(path) abort
let manwidth = empty($MANWIDTH) ? winwidth(0) : $MANWIDTH
" Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
" http://comments.gmane.org/gmane.editors.vim.devel/29085
- return s:system(['env', 'MANPAGER=cat', 'MANWIDTH='.manwidth, 'man', a:path])
+ let cmd = ['env', 'MANPAGER=cat', 'MANWIDTH='.manwidth, 'man']
+ return s:system(cmd + (s:localfile_arg ? ['-l', a:path] : [a:path]))
endfunction
function! s:put_page(page) abort
@@ -151,6 +165,31 @@ function! s:put_page(page) abort
setlocal filetype=man
endfunction
+function! man#show_toc() abort
+ let bufname = bufname('%')
+ let info = getloclist(0, {'winid': 1})
+ if !empty(info) && getwinvar(info.winid, 'qf_toc') ==# bufname
+ lopen
+ return
+ endif
+
+ let toc = []
+ let lnum = 2
+ let last_line = line('$') - 1
+ while lnum && lnum < last_line
+ let text = getline(lnum)
+ if text =~# '^\%( \{3\}\)\=\S.*$'
+ call add(toc, {'bufnr': bufnr('%'), 'lnum': lnum, 'text': text})
+ endif
+ let lnum = nextnonblank(lnum + 1)
+ endwhile
+
+ call setloclist(0, toc, ' ')
+ call setloclist(0, [], 'a', {'title': 'Man TOC'})
+ lopen
+ let w:qf_toc = bufname
+endfunction
+
" attempt to extract the name and sect out of 'name(sect)'
" otherwise just return the largest string of valid characters in ref
function! man#extract_sect_and_name_ref(ref) abort
@@ -174,14 +213,14 @@ endfunction
function! s:get_path(sect, name) abort
if empty(a:sect)
- return s:system(['man', s:man_find_arg, a:name])
+ return s:system(['man', s:find_arg, a:name])
endif
" '-s' flag handles:
" - tokens like 'printf(echo)'
" - sections starting with '-'
" - 3pcap section (found on macOS)
" - commas between sections (for section priority)
- return s:system(['man', s:man_find_arg, '-s', a:sect, a:name])
+ return s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])
endfunction
function! s:verify_exists(sect, name) abort
@@ -306,7 +345,7 @@ endfunction
function! s:complete(sect, psect, name) abort
try
- let mandirs = join(split(s:system(['man', s:man_find_arg]), ':\|\n'), ',')
+ let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
catch
call s:error(v:exception)
return
@@ -348,3 +387,5 @@ function! man#init_pager() abort
endtry
execute 'silent file man://'.fnameescape(ref)
endfunction
+
+call s:init()
diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
index de85844d5d..76485c2f38 100644
--- a/runtime/autoload/netrw.vim
+++ b/runtime/autoload/netrw.vim
@@ -22,8 +22,8 @@
if &cp || exists("g:loaded_netrw")
finish
endif
-" netrw requires vim having patch 213; netrw will benefit from vim's having patch#656, too
-if v:version < 704 || !has("patch213")
+" netrw requires vim having patch 7.4.213; netrw will benefit from vim's having patch#656, too
+if v:version < 704 || (v:version == 704 && !has("patch213"))
if !exists("s:needpatch213")
unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch 213"
endif
diff --git a/runtime/autoload/phpcomplete.vim b/runtime/autoload/phpcomplete.vim
index 7f25d9df33..8e38867a77 100644
--- a/runtime/autoload/phpcomplete.vim
+++ b/runtime/autoload/phpcomplete.vim
@@ -3,7 +3,7 @@
" Maintainer: Dávid Szabó ( complex857 AT gmail DOT com )
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" URL: https://github.com/shawncplus/phpcomplete.vim
-" Last Change: 2015 Jul 13
+" Last Change: 2016 Oct 10
"
" OPTIONS:
"
@@ -195,6 +195,8 @@ function! phpcomplete#CompletePHP(findstart, base) " {{{
" }}}
elseif context =~? 'implements'
return phpcomplete#CompleteClassName(a:base, ['i'], current_namespace, imports)
+ elseif context =~? 'instanceof'
+ return phpcomplete#CompleteClassName(a:base, ['c', 'n'], current_namespace, imports)
elseif context =~? 'extends\s\+.\+$' && a:base == ''
return ['implements']
elseif context =~? 'extends'
@@ -787,6 +789,8 @@ function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports)
if kinds == ['c', 'i']
let filterstr = 'v:val =~? "\\(class\\|interface\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
+ elseif kinds == ['c', 'n']
+ let filterstr = 'v:val =~? "\\(class\\|namespace\\)\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
elseif kinds == ['c']
let filterstr = 'v:val =~? "class\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
elseif kinds == ['i']
@@ -931,7 +935,7 @@ function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibite
endfor
for modifier in a:modifiers
- " if the modifier is prohibited its a no match
+ " if the modifier is prohibited it's a no match
if index(a:prohibited_modifiers, modifier) != -1
return 0
endif
@@ -996,7 +1000,7 @@ function! phpcomplete#CompleteUserClass(context, base, sccontent, visibility) "
let required_modifiers += ['static']
endif
let all_variable = filter(deepcopy(a:sccontent),
- \ 'v:val =~ "^\\s*\\(var\\s\\+\\|public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)\\+\\$"')
+ \ 'v:val =~ "\\(^\\s*\\(var\\s\\+\\|public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)\\+\\$\\|^\\s*\\(\\/\\|\\*\\)*\\s*@property\\s\\+\\S\\+\\s\\S\\{-}\\s*$\\)"')
let variables = []
for i in all_variable
@@ -1160,6 +1164,14 @@ function! phpcomplete#GetTaglist(pattern) " {{{
endif
let tags = taglist(a:pattern)
+ for tag in tags
+ for prop in keys(tag)
+ if prop == 'cmd' || prop == 'static' || prop == 'kind' || prop == 'builtin'
+ continue
+ endif
+ let tag[prop] = substitute(tag[prop], '\\\\', '\\', 'g')
+ endfor
+ endfor
let s:cache_tags[a:pattern] = tags
let has_key = has_key(s:cache_tags, a:pattern)
let s:cache_tags_checksum = cache_checksum
@@ -1379,7 +1391,7 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
" Get Structured information of all classes and subclasses including namespace and includes
" try to find the method's return type in docblock comment
for classstructure in classcontents
- let docblock_target_pattern = 'function\s\+&\?'.method.'\|\(public\|private\|protected\|var\).\+\$'.method
+ let docblock_target_pattern = 'function\s\+&\?'.method.'\>\|\(public\|private\|protected\|var\).\+\$'.method.'\>\|@property.\+\$'.method.'\>'
let doc_str = phpcomplete#GetDocBlock(split(classstructure.content, '\n'), docblock_target_pattern)
if doc_str != ''
break
@@ -1387,8 +1399,17 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
endfor
if doc_str != ''
let docblock = phpcomplete#ParseDocBlock(doc_str)
- if has_key(docblock.return, 'type') || has_key(docblock.var, 'type')
- let type = has_key(docblock.return, 'type') ? docblock.return.type : docblock.var.type
+ if has_key(docblock.return, 'type') || has_key(docblock.var, 'type') || len(docblock.properties) > 0
+ let type = has_key(docblock.return, 'type') ? docblock.return.type : has_key(docblock.var, 'type') ? docblock.var.type : ''
+
+ if type == ''
+ for property in docblock.properties
+ if property.description =~? method
+ let type = property.type
+ break
+ endif
+ endfor
+ endif
" there's a namespace in the type, threat the type as FQCN
if type =~ '\\'
@@ -1554,6 +1575,9 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
elseif get(methodstack, 0) =~# function_invocation_pattern
let function_name = matchstr(methodstack[0], '^\s*\zs'.function_name_pattern)
let function_file = phpcomplete#GetFunctionLocation(function_name, a:current_namespace)
+ if function_file == ''
+ let function_file = phpcomplete#GetFunctionLocation(function_name, '\')
+ endif
if function_file == 'VIMPHP_BUILTINFUNCTION'
" built in function, grab the return type from the info string
@@ -1569,7 +1593,7 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines)
" try to expand the classname of the returned type with the context got from the function's source file
- let [classname_candidate, unused] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
endif
endif
if classname_candidate != ''
@@ -1650,9 +1674,10 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*'))
let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(
\ classname,
- \ a:current_namespace,
+ \ namespace_for_class,
\ a:imports,
\ sub_methodstack)
+
return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
endif
endif
@@ -1783,6 +1808,9 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let [function_name, function_namespace] = phpcomplete#ExpandClassName(function_name, a:current_namespace, a:imports)
let function_file = phpcomplete#GetFunctionLocation(function_name, function_namespace)
+ if function_file == ''
+ let function_file = phpcomplete#GetFunctionLocation(function_name, '\')
+ endif
if function_file == 'VIMPHP_BUILTINFUNCTION'
" built in function, grab the return type from the info string
@@ -1798,7 +1826,7 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
let classname_candidate = docblock.return.type
let [class_candidate_namespace, function_imports] = phpcomplete#GetCurrentNameSpace(file_lines)
" try to expand the classname of the returned type with the context got from the function's source file
- let [classname_candidate, unused] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
break
endif
endif
@@ -1861,6 +1889,8 @@ function! phpcomplete#GetClassName(start_line, context, current_namespace, impor
for tag in tags
if tag.kind ==? 'v' && tag.cmd =~? '=\s*new\s\+\zs'.class_name_pattern.'\ze'
let classname = matchstr(tag.cmd, '=\s*new\s\+\zs'.class_name_pattern.'\ze')
+ " unescape the classname, it would have "\" doubled since it is an ex command
+ let classname = substitute(classname, '\\\(\_.\)', '\1', 'g')
return classname
endif
endfor
@@ -2077,6 +2107,19 @@ function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_nam
endif
call searchpair('{', '', '}', 'W')
let class_closing_bracket_line = line('.')
+
+ " Include class docblock
+ let doc_line = cfline - 1
+ if getline(doc_line) =~? '^\s*\*/'
+ while doc_line != 0
+ if getline(doc_line) =~? '^\s*/\*\*'
+ let cfline = doc_line
+ break
+ endif
+ let doc_line -= 1
+ endwhile
+ endif
+
let classcontent = join(getline(cfline, class_closing_bracket_line), "\n")
let used_traits = []
@@ -2241,8 +2284,19 @@ function! phpcomplete#GetDocBlock(sccontent, search) " {{{
let line = a:sccontent[i]
" search for a function declaration
if line =~? a:search
- let l = i - 1
- " start backward serch for the comment block
+ if line =~? '@property'
+ let doc_line = i
+ while doc_line != sccontent_len - 1
+ if a:sccontent[doc_line] =~? '^\s*\*/'
+ let l = doc_line
+ break
+ endif
+ let doc_line += 1
+ endwhile
+ else
+ let l = i - 1
+ endif
+ " start backward search for the comment block
while l != 0
let line = a:sccontent[l]
" if it's a one line docblock like comment and we can just return it right away
@@ -2263,7 +2317,7 @@ function! phpcomplete#GetDocBlock(sccontent, search) " {{{
return ''
end
- while l != 0
+ while l >= 0
let line = a:sccontent[l]
if line =~? '^\s*/\*\*'
let comment_start = l
@@ -2297,9 +2351,10 @@ function! phpcomplete#ParseDocBlock(docblock) " {{{
\ 'return': {},
\ 'throws': [],
\ 'var': {},
+ \ 'properties': [],
\ }
- let res.description = substitute(matchstr(a:docblock, '\zs\_.\{-}\ze\(@var\|@param\|@return\|$\)'), '\(^\_s*\|\_s*$\)', '', 'g')
+ let res.description = substitute(matchstr(a:docblock, '\zs\_.\{-}\ze\(@type\|@var\|@param\|@return\|$\)'), '\(^\_s*\|\_s*$\)', '', 'g')
let docblock_lines = split(a:docblock, "\n")
let param_lines = filter(copy(docblock_lines), 'v:val =~? "^@param"')
@@ -2334,15 +2389,26 @@ function! phpcomplete#ParseDocBlock(docblock) " {{{
endif
endfor
- let var_line = filter(copy(docblock_lines), 'v:val =~? "^@var"')
+ let var_line = filter(copy(docblock_lines), 'v:val =~? "^\\(@var\\|@type\\)"')
if len(var_line) > 0
- let var_parts = matchlist(var_line[0], '@var\s\+\(\S\+\)\s*\(.*\)')
+ let var_parts = matchlist(var_line[0], '\(@var\|@type\)\s\+\(\S\+\)\s*\(.*\)')
let res['var'] = {
\ 'line': var_parts[0],
- \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(var_parts, 1, '')),
- \ 'description': get(var_parts, 2, '')}
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(var_parts, 2, '')),
+ \ 'description': get(var_parts, 3, '')}
endif
+ let property_lines = filter(copy(docblock_lines), 'v:val =~? "^@property"')
+ for property_line in property_lines
+ let parts = matchlist(property_line, '\(@property\)\s\+\(\S\+\)\s*\(.*\)')
+ if len(parts) > 0
+ call add(res.properties, {
+ \ 'line': parts[0],
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 2, '')),
+ \ 'description': get(parts, 3, '')})
+ endif
+ endfor
+
return res
endfunction
" }}}
@@ -2498,6 +2564,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
let name = matchstr(name, '\\\zs[^\\]\+\ze$')
endif
endif
+
" leading slash is not required use imports are always absolute
let imports[name] = {'name': object, 'kind': ''}
endfor
@@ -2533,6 +2600,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
elseif !exists('no_namespace_candidate')
" save the first namespacless match to be used if no better
" candidate found later on
+ let tag.namespace = namespace_for_classes
let no_namespace_candidate = tag
endif
endif
diff --git a/runtime/autoload/provider/clipboard.vim b/runtime/autoload/provider/clipboard.vim
index a3210046b1..a67681d28e 100644
--- a/runtime/autoload/provider/clipboard.vim
+++ b/runtime/autoload/provider/clipboard.vim
@@ -8,7 +8,7 @@ let s:paste = {}
" ownership of the selection, so we know how long the cache is valid.
let s:selection = { 'owner': 0, 'data': [] }
-function! s:selection.on_exit(jobid, data, event)
+function! s:selection.on_exit(jobid, data, event) abort
" At this point this nvim instance might already have launched
" a new provider instance. Don't drop ownership in this case.
if self.owner == a:jobid
@@ -18,7 +18,7 @@ endfunction
let s:selections = { '*': s:selection, '+': copy(s:selection)}
-function! s:try_cmd(cmd, ...)
+function! s:try_cmd(cmd, ...) abort
let argv = split(a:cmd, " ")
let out = a:0 ? systemlist(argv, a:1, 1) : systemlist(argv, [''], 1)
if v:shell_error
@@ -34,7 +34,7 @@ function! s:try_cmd(cmd, ...)
endfunction
" Returns TRUE if `cmd` exits with success, else FALSE.
-function! s:cmd_ok(cmd)
+function! s:cmd_ok(cmd) abort
call system(a:cmd)
return v:shell_error == 0
endfunction
@@ -47,7 +47,12 @@ function! provider#clipboard#Error() abort
endfunction
function! provider#clipboard#Executable() abort
- if has('mac') && executable('pbcopy')
+ if exists('g:clipboard')
+ let s:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null })
+ let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null })
+ let s:cache_enabled = get(g:clipboard, 'cache_enabled', 1)
+ return get(g:clipboard, 'name', 'g:clipboard')
+ elseif has('mac') && executable('pbcopy')
let s:copy['+'] = 'pbcopy'
let s:paste['+'] = 'pbpaste'
let s:copy['*'] = s:copy['+']
@@ -84,6 +89,12 @@ function! provider#clipboard#Executable() abort
let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+']
return 'win32yank'
+ elseif exists('$TMUX') && executable('tmux')
+ let s:copy['+'] = 'tmux load-buffer -'
+ let s:paste['+'] = 'tmux save-buffer -'
+ let s:copy['*'] = s:copy['+']
+ let s:paste['*'] = s:paste['+']
+ return 'tmux'
endif
let s:err = 'clipboard: No clipboard tool available. :help clipboard'
@@ -96,14 +107,14 @@ endif
let s:clipboard = {}
-function! s:clipboard.get(reg)
+function! s:clipboard.get(reg) abort
if s:selections[a:reg].owner > 0
return s:selections[a:reg].data
end
return s:try_cmd(s:paste[a:reg])
endfunction
-function! s:clipboard.set(lines, regtype, reg)
+function! s:clipboard.set(lines, regtype, reg) abort
if a:reg == '"'
call s:clipboard.set(a:lines,a:regtype,'+')
if s:copy['*'] != s:copy['+']
@@ -138,6 +149,6 @@ function! s:clipboard.set(lines, regtype, reg)
let selection.owner = jobid
endfunction
-function! provider#clipboard#Call(method, args)
+function! provider#clipboard#Call(method, args) abort
return call(s:clipboard[a:method],a:args,s:clipboard)
endfunction
diff --git a/runtime/autoload/provider/ruby.vim b/runtime/autoload/provider/ruby.vim
index c8ede20a75..91b7fb9f2c 100644
--- a/runtime/autoload/provider/ruby.vim
+++ b/runtime/autoload/provider/ruby.vim
@@ -16,7 +16,11 @@ function! s:job_opts.on_stderr(chan_id, data, event)
endfunction
function! provider#ruby#Detect() abort
- return exepath('neovim-ruby-host')
+ if exists("g:ruby_host_prog")
+ return g:ruby_host_prog
+ else
+ return exepath('neovim-ruby-host')
+ end
endfunction
function! provider#ruby#Prog()
@@ -24,15 +28,15 @@ function! provider#ruby#Prog()
endfunction
function! provider#ruby#Require(host) abort
- let args = [provider#ruby#Prog()]
+ let prog = provider#ruby#Prog()
let ruby_plugins = remote#host#PluginsForHost(a:host.name)
for plugin in ruby_plugins
- call add(args, plugin.path)
+ let prog .= " " . shellescape(plugin.path)
endfor
try
- let channel_id = jobstart(args, s:job_opts)
+ let channel_id = jobstart(prog, s:job_opts)
if rpcrequest(channel_id, 'poll') ==# 'ok'
return channel_id
endif
diff --git a/runtime/autoload/provider/script_host.rb b/runtime/autoload/provider/script_host.rb
index 1dade766c7..a1c58bde85 100644
--- a/runtime/autoload/provider/script_host.rb
+++ b/runtime/autoload/provider/script_host.rb
@@ -1,8 +1,6 @@
begin
- require "neovim/ruby_provider"
+ require 'neovim/ruby_provider'
rescue LoadError
- warn(
- "Your neovim RubyGem is missing or out of date. " +
- "Install the latest version using `gem install neovim`."
- )
+ warn('Your neovim RubyGem is missing or out of date.',
+ 'Install the latest version using `gem install neovim`.')
end
diff --git a/runtime/autoload/rubycomplete.vim b/runtime/autoload/rubycomplete.vim
index e1064c8a58..40b87f4cbe 100644
--- a/runtime/autoload/rubycomplete.vim
+++ b/runtime/autoload/rubycomplete.vim
@@ -93,7 +93,7 @@ function! s:GetBufferRubyEntity( name, type, ... )
let stopline = 1
- let crex = '^\s*\<' . a:type . '\>\s*\<' . a:name . '\>\s*\(<\s*.*\s*\)\?'
+ let crex = '^\s*\<' . a:type . '\>\s*\<' . escape(a:name, '*') . '\>\s*\(<\s*.*\s*\)\?'
let [lnum,lcol] = searchpos( crex, 'w' )
"let [lnum,lcol] = searchpairpos( crex . '\zs', '', '\(end\|}\)', 'w' )
@@ -149,7 +149,7 @@ function! s:GetRubyVarType(v)
let ctors = ctors.'\)'
let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
- let sstr = ''.a:v.'\>\s*[+\-*/]*'.fstr
+ let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
if lnum != 0 && lcol != 0
let str = matchstr(getline(lnum),fstr,lcol)
@@ -196,7 +196,7 @@ function! rubycomplete#Complete(findstart, base)
if c =~ '\w'
continue
elseif ! c =~ '\.'
- idx = -1
+ let idx = -1
break
else
break
@@ -266,6 +266,28 @@ class VimRubyCompletion
end
end
+ def load_gems
+ fpath = VIM::evaluate("get(g:, 'rubycomplete_gemfile_path', 'Gemfile')")
+ return unless File.file?(fpath) && File.readable?(fpath)
+ want_bundler = VIM::evaluate("get(g:, 'rubycomplete_use_bundler')")
+ parse_file = !want_bundler
+ begin
+ require 'bundler'
+ Bundler.setup
+ Bundler.require
+ rescue Exception
+ parse_file = true
+ end
+ if parse_file
+ File.new(fpath).each_line do |line|
+ begin
+ require $1 if /\s*gem\s*['"]([^'"]+)/.match(line)
+ rescue Exception
+ end
+ end
+ end
+ end
+
def load_buffer_class(name)
dprint "load_buffer_class(%s) START" % name
classdef = get_buffer_entity(name, 's:GetBufferRubyClass("%s")')
@@ -588,6 +610,10 @@ class VimRubyCompletion
load_rails
end
+ want_gems = VIM::evaluate("get(g:, 'rubycomplete_load_gemfile')")
+ load_gems unless want_gems.to_i.zero?
+
+
input = VIM::Buffer.current.line
cpos = VIM::Window.current.cursor[1] - 1
input = input[0..cpos]
@@ -678,7 +704,9 @@ class VimRubyCompletion
cv = eval("self.class.constants")
vartype = get_var_type( receiver )
dprint "vartype: %s" % vartype
- if vartype != ''
+
+ invalid_vartype = ['', "gets"]
+ if !invalid_vartype.include?(vartype)
load_buffer_class( vartype )
begin
@@ -706,7 +734,7 @@ class VimRubyCompletion
methods.concat m.instance_methods(false)
}
end
- variables += add_rails_columns( "#{vartype}" ) if vartype && vartype.length > 0
+ variables += add_rails_columns( "#{vartype}" ) if vartype && !invalid_vartype.include?(vartype)
when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
message = $1
diff --git a/runtime/autoload/shada.vim b/runtime/autoload/shada.vim
index cf27ee608a..87acc515ee 100644
--- a/runtime/autoload/shada.vim
+++ b/runtime/autoload/shada.vim
@@ -45,7 +45,7 @@ call map(copy(s:SHADA_ENTRY_NAMES),
let s:SHADA_MAP_ENTRIES = {
\'search_pattern': ['sp', 'sh', 'ss', 'sb', 'sm', 'sc', 'sl', 'se', 'so',
\ 'su'],
- \'register': ['n', 'rc', 'rw', 'rt'],
+ \'register': ['n', 'rc', 'rw', 'rt', 'ru'],
\'global_mark': ['n', 'f', 'l', 'c'],
\'local_mark': ['f', 'n', 'l', 'c'],
\'jump': ['f', 'l', 'c'],
@@ -139,6 +139,7 @@ let s:SHADA_STANDARD_KEYS = {
\'rt': ['type', 'regtype', s:SHADA_ENUMS.regtype.CHARACTERWISE],
\'rw': ['block width', 'uint', 0],
\'rc': ['contents', 'binarray', s:SHADA_REQUIRED],
+ \'ru': ['is_unnamed', 'boolean', g:msgpack#false],
\'n': ['name', 'intchar', char2nr('"')],
\'l': ['line number', 'uint', 1],
\'c': ['column', 'uint', 0],
diff --git a/runtime/autoload/tar.vim b/runtime/autoload/tar.vim
index 5e76870cce..9c518cb9d0 100644
--- a/runtime/autoload/tar.vim
+++ b/runtime/autoload/tar.vim
@@ -117,7 +117,7 @@ fun! tar#Browse(tarfile)
if !filereadable(a:tarfile)
" call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
if a:tarfile !~# '^\a\+://'
- " if its an url, don't complain, let url-handlers such as vim do its thing
+ " if it's an url, don't complain, let url-handlers such as vim do its thing
redraw!
echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
endif
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index 687500ebe3..ea086e0882 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/autoload/zip.vim
@@ -1,7 +1,7 @@
" zip.vim: Handles browsing zipfiles
" AUTOLOAD PORTION
-" Date: Jul 02, 2013
-" Version: 27
+" Date: Sep 13, 2016
+" Version: 28
" Maintainer: Charles E Campbell <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
" License: Vim License (see vim's :help license)
" Copyright: Copyright (C) 2005-2013 Charles E. Campbell {{{1
@@ -20,10 +20,10 @@
if &cp || exists("g:loaded_zip")
finish
endif
-let g:loaded_zip= "v27"
+let g:loaded_zip= "v28"
if v:version < 702
echohl WarningMsg
- echo "***warning*** this version of zip needs vim 7.2"
+ echo "***warning*** this version of zip needs vim 7.2 or later"
echohl Normal
finish
endif
@@ -53,6 +53,9 @@ endif
if !exists("g:zip_unzipcmd")
let g:zip_unzipcmd= "unzip"
endif
+if !exists("g:zip_extractcmd")
+ let g:zip_extractcmd= g:zip_unzipcmd
+endif
" ----------------
" Functions: {{{1
@@ -62,14 +65,14 @@ endif
" zip#Browse: {{{2
fun! zip#Browse(zipfile)
" call Dfunc("zip#Browse(zipfile<".a:zipfile.">)")
- " sanity check: insure that the zipfile has "PK" as its first two letters
+ " sanity check: ensure that the zipfile has "PK" as its first two letters
" (zipped files have a leading PK as a "magic cookie")
if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK'
exe "noautocmd e ".fnameescape(a:zipfile)
" call Dret("zip#Browse : not a zipfile<".a:zipfile.">")
return
" else " Decho
-" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - its a zip file")
+" call Decho("zip#Browse: a:zipfile<".a:zipfile."> passed PK test - it's a zip file")
endif
let repkeep= &report
@@ -92,7 +95,7 @@ fun! zip#Browse(zipfile)
endif
if !filereadable(a:zipfile)
if a:zipfile !~# '^\a\+://'
- " if its an url, don't complain, let url-handlers such as vim do its thing
+ " if it's an url, don't complain, let url-handlers such as vim do its thing
redraw!
echohl Error | echo "***error*** (zip#Browse) File not readable<".a:zipfile.">" | echohl None
" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
@@ -136,8 +139,10 @@ fun! zip#Browse(zipfile)
return
endif
+ " Maps associated with zip plugin
setlocal noma nomod ro
- noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
+ noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
+ noremap <silent> <buffer> x :call zip#Extract()<cr>
let &report= repkeep
" call Dret("zip#Browse")
@@ -204,6 +209,15 @@ fun! zip#Read(fname,mode)
endif
" call Decho("zipfile<".zipfile.">")
" call Decho("fname <".fname.">")
+ " sanity check
+ if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
+ redraw!
+ echohl Error | echo "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program" | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &report= repkeep
+" call Dret("zip#Write")
+ return
+ endif
" the following code does much the same thing as
" exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1)
@@ -236,9 +250,9 @@ fun! zip#Write(fname)
set report=10
" sanity checks
- if !executable(g:zip_zipcmd)
+ if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
redraw!
- echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the zip pgm" | echohl None
+ echohl Error | echo "***error*** (zip#Write) sorry, your system doesn't appear to have the ".g:zip_zipcmd." program" | echohl None
" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
let &report= repkeep
" call Dret("zip#Write")
@@ -345,6 +359,48 @@ fun! zip#Write(fname)
endfun
" ---------------------------------------------------------------------
+" zip#Extract: extract a file from a zip archive {{{2
+fun! zip#Extract()
+" call Dfunc("zip#Extract()")
+
+ let repkeep= &report
+ set report=10
+ let fname= getline(".")
+" call Decho("fname<".fname.">")
+
+ " sanity check
+ if fname =~ '^"'
+ let &report= repkeep
+" call Dret("zip#Extract")
+ return
+ endif
+ if fname =~ '/$'
+ redraw!
+ echohl Error | echo "***error*** (zip#Extract) Please specify a file, not a directory" | echohl None
+ let &report= repkeep
+" call Dret("zip#Extract")
+ return
+ endif
+
+ " extract the file mentioned under the cursor
+" call Decho("system(".g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell).")")
+ call system(g:zip_extractcmd." ".shellescape(b:zipfile)." ".shellescape(shell))
+" call Decho("zipfile<".b:zipfile.">")
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!" | echohl NONE
+ elseif !filereadable(fname)
+ echohl Error | echo "***error*** attempted to extract ".fname." but it doesn't appear to be present!"
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ " restore option
+ let &report= repkeep
+
+" call Dret("zip#Extract")
+endfun
+
+" ---------------------------------------------------------------------
" s:Escape: {{{2
fun! s:Escape(fname,isfilt)
" call Dfunc("QuoteFileDir(fname<".a:fname."> isfilt=".a:isfilt.")")