通常在使用!
运行外部Shell命令时,将显示提示信息“Press ENTER or type command to continue”,需要用户点击回车键才可以返回常规模式。
使用silent静默执行命令
如果不希望显示提示信息,那么可以使用:silent
命令:
:silent !echo 'Hello World'
如果需要清除命令本身及其输出信息,那么可以使用Ctrl-L快捷键或:redraw!
命令来重画屏幕。
您可以自定义命令,来合并以上两步操作:
:command! -nargs=1 Silent execute ':silent !'.<q-args> | execute ':redraw!'
使用以下自定义命令,将首先执行外部命令,然后重画屏幕:
:Silent echo 'Hello World'
通过结合:execute
命令,可以生成并执行较复杂的命令:
:silent exec "!command"
定义以下快捷键,在Linux下静默执行命令。比如使用eSpeak将文字转换为语音:
:nnoremap <leader>es :silent exec '!espeak "hello world" &'<CR>
定义以下快捷键,在Windows下使用默认程序打开当前文件。比如使用默认浏览器,打开当前编辑的HTML文档:
:nmap <Leader>x :silent ! start "1" "%:p"<CR>
后台执行命令
使用以下命令,可以利用Shell后台执行命令和重定向的能力:
:silent exec "!(ping www.vim.org >ping.out >2&1) &"
>ping.out
,即1>ping.out
,表示将命令的标准输出(stdout)重定向到名为“ping.out”的文件;因为默认值为1,所以可以省略;>2&1
,表示将“2”代表的标准错误(stderr)也重定向至“1”代表的标准输出(stdout);即标准输出和标准错误都输出至名为“ping.out”的文件;&
,表示在后台执行命令。
如果不希望外部命令输出任何信息,那么可以将标准输出指向空设备文件“/dev/null”:
:silent exec "!(ping www.vim.org >/dev/null >2&1) &"
也可以静默执行外部命令,并在新建标签页(Tab)内显示命令输出:
:silent exec "!(echo 'Hello World') > test.txt" | :tabedit test.txt
如果希望在分割窗口内显示命令输出,那么可以使用:split命令:
:silent exec "!(echo 'Hello World') > test.txt" | :sp test.txt
后台打开应用窗口
使用以下命令,将打开与当前文件同名的PDF文档。由于Zathura窗口在前台显示,所以无法在Vim窗口中继续进行编辑;关闭zathura窗口之后,也需要在Vim中点击回车键以返回常规模式:
:!zathura %:r.pdf
使用以下命令,将打开与当前文件同名的PDF文档。由于zathura窗口在前台显示,所以无法在Vim窗口中继续进行编辑;关闭zathura窗口之后,不需要在Vim中点击回车键即可返回常规模式:
:silent !zathura %:r.pdf
使用以下命令,将在后台打开与当前文件同名的PDF文档。由于zathura窗口在后台显示,所以无需关闭zathura窗口,也无需点击回车键,即可以在Vim窗口中继续进行编辑:
:silent exec '!zathura '.expand("%:r").'.pdf &'
实例:静默压缩文件
使用以下命令,可以使用Zip压缩当前文件:
:!zip test.zip %:p
屏幕将显示以下信息,并等待用户按回车键以返回常规模式:
使用以下命令,则屏幕不会显示任何信息,并且自动返回常规模式:
:silent !zip test.zip %:p
使用以下命令,可以批量压缩所有打开的文件:
:silent bufdo !zip test.zip %:p
实例:静默载入视图
如果希望记忆光标位置和手动折叠(Fold),以便在重新打开文件时恢复到之前的编辑状态。那么可以在vimrc配置文件中,增加以下自动命令:
set viewdir=$HOME/vimfiles/views/
autocmd BufWinLeave * mkview
autocmd BufWinEnter * silent loadview
使用system()函数静默执行命令
通过调用system()函数,也可静默执行命令:
:call system('espeak "hello world" &')
函数system()
和!
命令都可以调用外部命令,但system()函数不会切到shell终端,而是仍停留在vim界面。所调用外部命令的输出将会被system()函数捕获,可以将其保存在VimL变量中以供后续使用。
使用以下命令,可以查看更多帮助信息:
:help :silent
:help system()
关于本文中使用的第三方工具,请参阅以下网址:
没有评论:
发表评论