如何执行包含shell命令的条件命令字符串?

时间:2015-12-23 10:17:18

标签: shell vim

我目前有以下自动命令(在我的vimrc中) -

autocmd BufEnter *.c nmap <F5> :Makexec<CR> 
  \:if findfile( expand("%:p:r").".exe" ,expand("%:p:h") ) != ""<CR>
  \    :!%:p:r.exe<CR>
  \:else<CR>
  \    :vert topleft cwin<CR>
  \    :vert resize 50<CR>
  \:endif<CR> 

我想转换此自动命令,使其执行单个字符串,其中字符串包含链接在一起的上述命令。

  • 尝试1

    let g:c_exe_str="Makexec | if findfile(expand(\"%:p:r\").\".exe\", expand(\"%:p:h\")) != \"\" | !%:p:r.exe | else | vert topleft cwin | vert resize 50 | endif"
    
    autocmd BufEnter *.c nmap <F5> :execute g:c_exe_str<CR>
    

    这没有像我预期的那样工作,我在shell上遇到以下错误 -

      

    C:\ windows \ system32 \ cmd.exe / c D:\ NewFolder \ c_experiments.exe |别的|   vert topleft cwin | vert resize 50 | ENDIF
      &#39;否则&#39;不被识别为内部或外部命令,可操作程序或批处理文件。

  • 尝试2

    let g:c_exe_str="Makexec | if findfile(expand(\"%:p:r\").\".exe\", expand(\"%:p:h\")) != \"\" | echo system(expand(\"%:p:r\").\".exe\") | else | vert topleft cwin | vert resize 50 | endif"
    
    autocmd BufEnter *.c nmap <F5> :execute g:c_exe_str<CR>
    

    这种(原文如此)有效,但没有在shell窗口中显示可执行文件的输出;基本上它与原始自动命令的工作方式不同。

如何使用execute()完全模仿原始自动命令的步骤?

1 个答案:

答案 0 :(得分:0)

在尝试1中,尝试将!%:p:r.exe封装在exe命令中:

... | exe "!%:p:r.exe" | else ...

否则,条形码以及:!命令后的所有内容都将传递给shell。