我正在尝试从.vimrc文件中运行一个shell脚本(脚本中标记了三个问题):
function! CheckMe(file)
let shellcmd = 'checkme '.a:file
" Start the command and return 0 on success.
" XXX: How do you evaluate the return code?
execute '!'.shellcmd
if !result
return 0
endif
" Ending up here, the command returned an error.
" XXX: Where to you get the output?
let pair = split(output, '\S')
let line = pair[0]
let char = pair[1]
" Jump to the errenous column and line.
" XXX: Why does this not work?
normal '/\%'.line.'l\%'.char.'c'
return 1
endfunction
总而言之,如何获得脚本的结果/输出,以及为什么跳转语句不起作用?
其他详情:
答案 0 :(得分:6)
function! CheckMe(file)
let shellcmd = 'checkme '.a:file
let output=system(shellcmd)
if !v:shell_error
return 0
endif
" Are you sure you want to split on non-blanks? This
" will result in list of blank strings.
" My variant:
let [line, char]=split(output)
" Normal is not an execute: this is what it will do:
" «'/» means «Go to mark /», produces an error E78 because /
" is not a valid symbol for mark. Than normal stops after error occured.
" If you need to use variables in nomal use «execute 'normal '.ncmd».
" And you can not use «normal» to perform search
execute '/\%'.line.'l\%'.char.'c'
" or
call setpos('.', [0, line, char, 0])
return 1
endfunction
根据Vim文档,“普通”关键字的参数是“像打字一样执行”,但显然情况并非如此。我键入它时工作正常(在正常命令模式下,没有前导':'),但在脚本中没有(“E78:未知标记”)。
只需输入«'/»即可收到此错误。
答案 1 :(得分:6)
我认为你想使用system()
function而不是!
shell命令。
从链接页面:
The result is a String. Example: :let files = system("ls " . shellescape(expand('%:h')))
和
The resulting error code can be found in |v:shell_error|.
因此,output
来自系统调用的结果,result
来自v:shell_error
。然后你的跳跃应该有效。