"=============================================================================
" FILE: helpers.vim
" AUTHOR: Shougo Matsushita <Shougo.Matsu@gmail.com>
" 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
function! vimshell#helpers#get_editor_name() abort "{{{
if !exists('g:vimshell_editor_command')
" Set editor command.
let g:vimshell_editor_command = g:vimshell_cat_command
if (has('nvim') && executable('nvr'))
\ || (has('clientserver') && (has('gui_running') || has('gui')))
if has('gui_macvim')
" MacVim check.
let macvim1 = '/Applications/MacVim.app/Contents/MacOS/Vim'
let macvim2 = expand('~/Applications/MacVim.app/Contents/MacOS/Vim')
if executable(macvim1)
let progname = macvim1
elseif executable(macvim2)
let progname = macvim2
else
echoerr 'You installed MacVim in not default directory!'.
\ ' You must set g:vimshell_editor_command manually.'
return g:vimshell_cat_command
endif
let progname = '/Applications/MacVim.app/Contents/MacOS/Vim'
else
let progname = has('nvim') ? 'nvr' :
\ has('gui_running') ? v:progname : 'vim'
endif
if !has('nvim')
let progname .= ' -g'
endif
let g:vimshell_editor_command =
\ printf('%s %s --remote-tab-wait-silent',
\ progname, (v:servername == '' ? '' :
\ ' --servername='.v:servername))
endif
endif
return g:vimshell_editor_command
endfunction"}}}
function! vimshell#helpers#execute_internal_command(command, args, context) abort "{{{
if empty(a:context)
let context = { 'has_head_spaces' : 0, 'is_interactive' : 1 }
else
let context = a:context
endif
if !has_key(context, 'fd') || empty(context.fd)
let context.fd = { 'stdin' : '', 'stdout' : '', 'stderr' : '' }
endif
let internal = vimshell#init#_internal_commands(a:command)
if empty(internal)
call vimshell#error_line(context.fd,
\ printf('Internal command : "%s" is not found.', a:command))
return
elseif internal.kind ==# 'execute'
" Convert args.
let args = type(get(a:args, 0, '')) == type('') ?
\ [{ 'args' : a:args, 'fd' : context.fd}] : a:args
return internal.execute(args, context)
else
return internal.execute(a:args, context)
endif
endfunction"}}}
function! vimshell#helpers#imdisable() abort "{{{
" Disable input method.
if exists('g:loaded_eskk') && eskk#is_enabled()
call eskk#disable()
elseif exists('b:skk_on') && b:skk_on && exists('*SkkDisable')
call SkkDisable()
elseif exists('&iminsert')
let &l:iminsert = 0
endif
endfunction"}}}
function! vimshell#helpers#get_current_args(...) abort "{{{
let cur_text = a:0 == 0 ? vimshell#get_cur_text() : a:1
let statements = vimproc#parser#split_statements(cur_text)
if empty(statements)
return []
endif
let commands = vimproc#parser#split_commands(statements[-1])
if empty(commands)
return []
endif
let args = vimproc#parser#split_args_through(commands[-1])
if vimshell#get_cur_text() =~ '\\\@!\s\+$'
" Add blank argument.
call add(args, '')
endif
return args
endfunction"}}}
function! vimshell#helpers#split(command) abort "{{{
let old_pos = [ tabpagenr(), winnr(), bufnr('%'), getpos('.') ]
if a:command != ''
let command =
\ a:command !=# 'nicely' ? a:command :
\ vimshell#helpers#get_winwidth() > 2 * &winwidth ? 'vsplit' : 'split'
execute command
endif
let new_pos = [ tabpagenr(), winnr(), bufnr('%'), getpos('.') ]
return [new_pos, old_pos]
endfunction"}}}
function! vimshell#helpers#restore_pos(pos) abort "{{{
if tabpagenr() != a:pos[0]
execute 'tabnext' a:pos[0]
endif
if winnr() != a:pos[1]
execute a:pos[1].'wincmd w'
endif
if bufnr('%') !=# a:pos[2] && bufexists(a:pos[2])
execute 'buffer' a:pos[2]
endif
call setpos('.', a:pos[3])
endfunction"}}}
function! vimshell#helpers#execute(cmdline, ...) abort "{{{
if !empty(b:vimshell.continuation)
" Kill process.
call vimshell#interactive#hang_up(bufname('%'))
endif
let context = a:0 >= 1? a:1 : vimshell#get_context()
let context.is_interactive = 0
try
call vimshell#parser#eval_script(a:cmdline, context)
catch
if v:exception !~# '^Vim:Interrupt'
let message = v:exception . ' ' . v:throwpoint
call vimshell#error_line(context.fd, message)
endif
return 1
endtry
return b:vimshell.system_variables.status
endfunction"}}}
function! vimshell#helpers#execute_async(cmdline, ...) abort "{{{
if !empty(b:vimshell.continuation)
" Kill process.
call vimshell#interactive#hang_up(bufname('%'))
endif
let context = a:0 >= 1 ? a:1 : vimshell#get_context()
let context.is_interactive = 1
try
return vimshell#parser#eval_script(a:cmdline, context)
catch
if v:exception !~# '^Vim:Interrupt'
let message = v:exception . ' ' . v:throwpoint
call vimshell#error_line(context.fd, message)
endif
let context = vimshell#get_context()
let b:vimshell.continuation = {}
call vimshell#print_prompt(context)
call vimshell#start_insert(mode() ==# 'i')
return 1
endtry
endfunction"}}}
function! vimshell#helpers#get_command_path(program) abort "{{{
" Command search.
try
return vimproc#get_command_name(a:program)
catch /File ".*" is not found./
" Not found.
return ''
endtry
endfunction"}}}
function! vimshell#helpers#get_winwidth() abort "{{{
return winwidth(0) - &l:numberwidth - &l:foldcolumn
endfunction"}}}
function! vimshell#helpers#set_alias(name, value) abort "{{{
if !exists('b:vimshell')
let b:vimshell = {}
endif
if !has_key(b:vimshell, 'alias_table')
let b:vimshell.alias_table = {}
endif
if a:value == ''
" Delete alias.
call remove(b:vimshell.alias_table, a:name)
else
let b:vimshell.alias_table[a:name] = a:value
endif
endfunction"}}}
function! vimshell#helpers#get_alias(name) abort "{{{
return get(b:vimshell.alias_table, a:name, '')
endfunction"}}}
function! vimshell#helpers#set_galias(name, value) abort "{{{
if !exists('b:vimshell')
let b:vimshell = {}
endif
if !has_key(b:vimshell, 'galias_table')
let b:vimshell.galias_table = {}
endif
if a:value == ''
" Delete alias.
call remove(b:vimshell.galias_table, a:name)
else
let b:vimshell.galias_table[a:name] = a:value
endif
endfunction"}}}
function! vimshell#helpers#get_galias(name) abort "{{{
return get(b:vimshell.galias_table, a:name, '')
endfunction"}}}
function! vimshell#helpers#get_program_pattern() abort "{{{
return
\'^\s*\%([^[:blank:]]\|\\[^[:alnum:]._-]\)\+\ze\%(\s*\%(=\s*\)\?\)'
endfunction"}}}
function! vimshell#helpers#get_alias_pattern() abort "{{{
return '^\s*[[:alnum:].+#_@!%:-]\+'
endfunction"}}}
function! vimshell#helpers#complete(arglead, cmdline, cursorpos) abort "{{{
let _ = []
" Option names completion.
try
let _ += filter(vimshell#variables#options(),
\ 'stridx(v:val, a:arglead) == 0')
catch
endtry
" Directory name completion.
let _ += filter(map(split(glob(a:arglead . '*'), '\n'),
\ "isdirectory(v:val) ? v:val.'/' : v:val"),
\ 'stridx(v:val, a:arglead) == 0')
return sort(_)
endfunction"}}}
function! vimshell#helpers#vimshell_execute_complete(arglead, cmdline, cursorpos) abort "{{{
" Get complete words.
let cmdline = a:cmdline[len(matchstr(
\ a:cmdline, vimshell#helpers#get_program_pattern())):]
let args = vimproc#parser#split_args_through(cmdline)
if empty(args) || cmdline =~ '\\\@!\s\+$'
" Add blank argument.
call add(args, '')
endif
return map(vimshell#complete#helper#command_args(args), 'v:val.word')
endfunction"}}}
function! vimshell#helpers#check_cursor_is_end() abort "{{{
return vimshell#get_cur_line() ==# getline('.')
endfunction"}}}
let &cpo = s:save_cpo
unlet s:save_cpo
" vim: foldmethod=marker