"============================================================================= " FILE: command.vim " AUTHOR: Shougo Matsushita " License: MIT license {{{ " Permission is hereby granted, free of charge, to any person obtaining " a copy of this software and associated documentation files (the " "Software"), to deal in the Software without restriction, including " without limitation the rights to use, copy, modify, merge, publish, " distribute, sublicense, and/or sell copies of the Software, and to " permit persons to whom the Software is furnished to do so, subject to " the following conditions: " " The above copyright notice and this permission notice shall be included " in all copies or substantial portions of the Software. " " THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS " OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF " MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. " IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY " CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, " TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE " SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. " }}} "============================================================================= let s:save_cpo = &cpo set cpo&vim " Variables "{{{ "}}} function! unite#sources#command#define() abort "{{{ return s:source endfunction"}}} let s:source = { \ 'name' : 'command', \ 'description' : 'candidates from Ex command', \ 'default_action' : 'execute', \ 'default_kind' : 'command', \ 'max_candidates' : 200, \ 'action_table' : {}, \ 'hooks' : {}, \ 'syntax' : 'uniteSource__Command', \ } function! s:source.hooks.on_init(args, context) abort "{{{ " Get command list. let a:context.source__command = unite#util#redir('command') endfunction"}}} function! s:source.hooks.on_syntax(args, context) abort "{{{ syntax match uniteSource__Command_DescriptionLine \ / -- .*$/ \ contained containedin=uniteSource__Command syntax match uniteSource__Command_Description \ /.*$/ \ contained containedin=uniteSource__Command_DescriptionLine syntax match uniteSource__Command_Marker \ / -- / \ contained containedin=uniteSource__Command_DescriptionLine highlight default link uniteSource__Command_Install Statement highlight default link uniteSource__Command_Marker Special highlight default link uniteSource__Command_Description Comment endfunction"}}} let s:cached_result = [] function! s:source.gather_candidates(args, context) abort "{{{ if a:context.is_redraw || empty(s:cached_result) let s:cached_result = s:make_cache_commands() endif let result = copy(s:cached_result) let completions = [ 'augroup', 'buffer', 'behave', \ 'color', 'command', 'compiler', 'cscope', \ 'dir', 'environment', 'event', 'expression', \ 'file', 'file_in_path', 'filetype', 'function', \ 'help', 'highlight', 'history', 'locale', \ 'mapping', 'menu', 'option', 'shellcmd', 'sign', \ 'syntax', 'tag', 'tag_listfiles', \ 'var', 'custom', 'customlist' ] for line in split(a:context.source__command, '\n')[1:] let word = matchstr(line, '\u\w*') " Analyze prototype. let end = matchend(line, '\u\w*') let args = matchstr(line, '[[:digit:]?+*]', end) if args != '0' let prototype = matchstr(line, '\u\w*', end) if index(completions, prototype) < 0 let prototype = 'arg' endif if args == '*' let prototype = '[' . prototype . '] ...' elseif args == '?' let prototype = '[' . prototype . ']' elseif args == '+' let prototype = prototype . ' ...' endif else let prototype = '' endif let dict = { \ 'word' : word, \ 'abbr' : printf('%-16s %s', word, prototype), \ 'source__command' : ':'.word, \ 'action__command' : word . ' ', \ 'action__command_args' : args, \ 'action__histadd' : 1, \ } let dict.action__description = dict.abbr call add(result, dict) endfor return unite#util#sort_by(result, 'tolower(v:val.word)') endfunction"}}} function! s:source.change_candidates(args, context) abort "{{{ let dummy = substitute(a:context.input, '[*\\]', '', 'g') if len(split(dummy)) > 1 " Add dummy result. return [{ \ 'word' : dummy, \ 'abbr' : printf('[new command] %s', dummy), \ 'source' : 'command', \ 'action__command' : dummy, \ 'action__histadd' : 1, \}] endif return [] endfunction"}}} function! s:make_cache_commands() abort "{{{ let helpfile = expand(findfile('doc/index.txt', &runtimepath)) if !filereadable(helpfile) return [] endif let lines = readfile(helpfile) let commands = [] let start = match(lines, '^|:!|') let end = match(lines, '^|:\~|', start) for lnum in range(end, start, -1) let desc = substitute(lines[lnum], '^\s\+\ze', '', 'g') let _ = matchlist(desc, '^|:\(.\{-}\)|\s\+:\S\+\s\+\(.*\)') if !empty(_) call add(commands, { \ 'word' : printf('%-16s -- %s', _[1], _[2]), \ 'action__command' : _[1] . ' ', \ 'source__command' : ':'._[1], \ 'action__histadd' : 1, \ }) endif endfor return commands endfunction"}}} " Actions "{{{ let s:source.action_table.preview = { \ 'description' : 'view the help documentation', \ 'is_quit' : 0, \ } function! s:source.action_table.preview.func(candidate) abort "{{{ let winnr = winnr() try execute 'help' a:candidate.source__command normal! zv normal! zt setlocal previewwindow catch /^Vim\%((\a\+)\)\?:E149/ " Ignore endtry execute winnr.'wincmd w' endfunction"}}} "}}} let &cpo = s:save_cpo unlet s:save_cpo " vim: foldmethod=marker