通常在使用
!
運作外部Shell指令時,将顯示提示資訊“Press ENTER or type command to continue”,需要使用者點選Enter鍵才可以傳回正常模式。

使用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
,表示将指令的标準輸出(stdout)重定向到名為“ping.out”的檔案;因為預設值為1,是以可以省略;1>ping.out
-
,表示将“2”代表的标準錯誤(stderr)也重定向至“1”代表的标準輸出(stdout);即标準輸出和标準錯誤都輸出至名為“ping.out”的檔案;>2&1
-
,表示在背景執行指令。&
如果不希望外部指令輸出任何資訊,那麼可以将标準輸出指向空裝置檔案“/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中點選Enter鍵以傳回正常模式:
:!zathura %:r.pdf
使用以下指令,将打開與目前檔案同名的PDF文檔。由于zathura視窗在前台顯示,是以無法在Vim視窗中繼續進行編輯;關閉zathura視窗之後,不需要在Vim中點選Enter鍵即可傳回正常模式:
:silent !zathura %:r.pdf
使用以下指令,将在背景打開與目前檔案同名的PDF文檔。由于zathura視窗在背景顯示,是以無需關閉zathura視窗,也無需點選Enter鍵,即可以在Vim視窗中繼續進行編輯:
:silent exec '!zathura '.expand("%:r").'.pdf &'
執行個體:靜默壓縮檔案
使用以下指令,可以使用Zip壓縮目前檔案:
:!zip test.zip %:p
螢幕将顯示以下資訊,并等待使用者按Enter鍵以傳回正常模式:
使用以下指令,則螢幕不會顯示任何資訊,并且自動傳回正常模式:
: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()
關于本文中使用的第三方工具,請參閱以下網址:
- eSpeak, text to speech
- Zathura, document viewer
- Zip, compression and file packaging/archive utility
Ver: 2.0 | YYQ<上一篇 | 目錄 | 下一篇>