在.vimrc中运行shell脚本(并处理输出)

kni*_*nap 5 vim shell

我试图从.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
Run Code Online (Sandbox Code Playgroud)

总而言之,如何获得脚本的结果/输出,以及为什么跳转语句不起作用?

额外细节:

  • shell脚本在成功时返回0,在失败时返回1.如果失败,脚本会将两个数字(行号和列号)打印到stdout,用空格字符分隔.
  • 根据Vim文档,"普通"关键字的参数"执行就像它被打字",但显然情况并非如此.当我输入它时(在正常命令模式下,没有前导':')它工作正常,但在脚本中没有("E78:未知标记").

ZyX*_*ZyX 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
Run Code Online (Sandbox Code Playgroud)

根据Vim文档,"普通"关键字的参数"执行就像它被打字",但显然情况并非如此.当我输入它时(在正常命令模式下,没有前导':')它工作正常,但在脚本中没有("E78:未知标记").

只需输入«'/»即可得到此错误.


Pau*_*ce. 6

我想你想使用system()函数而不是!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.然后你的跳跃应该工作.