Vim——正如你可能已經(jīng)了解的那樣——是一個(gè)包含很多特性的強(qiáng)大的編輯器。我們已經(jīng)寫了好多關(guān)于 Vim 的教程,覆蓋了 基本用法、 插件, 還有一些 其他的 有用的 特性。鑒于 Vim 提供了多如海洋的特性,我們總能找到一些有用的東西來(lái)和我們的讀者分享。
在這篇教程中,我們將會(huì)重點(diǎn)關(guān)注你如何在編輯窗口執(zhí)行外部的命令,并且訪問(wèn)命令行 shell。
但是在我們開始之前,很有必要提醒一下,在這篇教程中提及到的所有例子、命令行和說(shuō)明,我們已經(jīng)在 Ubuntu 14.04 上測(cè)試過(guò),我們使用的的 Vim 版本是 7.4 。
在 Vim 中執(zhí)行外部命令
有的時(shí)候,你可能需要在 Vim 編輯窗口中執(zhí)行外部的命令。例如,想象一下這種場(chǎng)景:你已經(jīng)在 Vim 中打開了一個(gè)文件,并做了一些修改,然后等你嘗試保存這些修改的時(shí)候,Vim 拋出一個(gè)錯(cuò)誤說(shuō)你沒有足夠的權(quán)限。
現(xiàn)在,退出當(dāng)前的 vim 會(huì)話,重新使用足夠的權(quán)限打開文件將意味著你會(huì)丟失所做的所有修改,所以,你可能贊同,在大多數(shù)情況不是只有一個(gè)選擇。像這樣的情況,在編輯器內(nèi)部運(yùn)行外部命令的能力將會(huì)派上用場(chǎng)。
稍后我們?cè)倩貋?lái)上面的用例,但是現(xiàn)在,讓我們了解下如何在 vim 中運(yùn)行基本的命令。
假設(shè)你在編輯一個(gè)文件,希望知道這個(gè)文件包含的行數(shù)、單詞數(shù)和字符數(shù)。為了達(dá)到這個(gè)目的,在 vim 的命令行模式下,只需要輸入冒號(hào) :,接下來(lái)一個(gè)感嘆號(hào) !,最后是要執(zhí)行的命令(這個(gè)例子中使用的是 wc)和緊接著的文件名(使用 % 表示當(dāng)前文件)。
:! wc %
這是一個(gè)例子:
填入的上面提及的命令行準(zhǔn)備執(zhí)行:
下面是終端上的輸出:
在你看到輸出之后,輸入回車鍵,你將會(huì)退回到你的 vim 會(huì)話中。
你正在編寫代碼或者腳本,并且希望盡快知道這段代碼或者腳本是否包含編譯時(shí)錯(cuò)誤或者語(yǔ)法錯(cuò)誤,這個(gè)時(shí)候,這種特性真的很方便。
繼續(xù),如果需求是添加輸出到文件中,使用 :read ! 命令。接下來(lái)是一個(gè)例子:
:read ! wc %
read 命令會(huì)把外部命令的輸出作為新的一行插入到編輯的文件中的當(dāng)前行的下面一行。如果你愿意,你也可以指定一個(gè)特定的行號(hào)——輸出將會(huì)添加到特定行之后。
例如,下面的命令將會(huì)在文件的第二行之后添加 wc 的輸出。
:2read ! wc %
注意: 使用 $ 在最后一行插入, 0 在第一行前面插入。
現(xiàn)在,回到最開始我們討論的一個(gè)用例,下面的命令將會(huì)幫助你保存文件而不需要先關(guān)閉文件(這將意味著沒有保存的內(nèi)容不會(huì)丟失)然后使用 sudo 命令重新打開。
:w ! sudo tee %
在 Vim 中訪問(wèn) shell
除了可以執(zhí)行單獨(dú)的命令,你也可以在 vim 中放入自己新創(chuàng)建的 shell。為了達(dá)到這種目的,在編輯器中你必須要做的是運(yùn)行以下的命令:
:shell
或者:
:sh
當(dāng)你執(zhí)行完了你的 shell 任務(wù),輸入 exit —— 這將帶你回到原來(lái)離開的 Vim 會(huì)話中。
要謹(jǐn)記的漏洞
雖然在真實(shí)世界中,能夠訪問(wèn)的 shell 絕對(duì)符合它們的用戶權(quán)限,但是它也可以被用于提權(quán)技術(shù)。正如我們?cè)谠缙诘囊黄恼拢ㄔ?sudoedit 上)解釋的那樣,即使你提供給一個(gè)用戶 sudo 的權(quán)限只是通過(guò) Vim 編輯一個(gè)文件,他們?nèi)钥梢允褂眠@項(xiàng)技術(shù)從編輯器中運(yùn)行一個(gè)新的 shell,而且他們可以做 root 用戶或者管理員用戶可以做的所有內(nèi)容。
總結(jié)
能夠在 Vim 中運(yùn)行外部命令在好多場(chǎng)景中(有些場(chǎng)景我們已經(jīng)在這篇文章中提及了)都是一個(gè)很有用的特性。這個(gè)功能的學(xué)習(xí)曲線并不麻煩,所以初學(xué)者和有經(jīng)驗(yàn)的用戶都可以好好使用它。
WindowsSubsystem for Linux(WSL)2對(duì)Windows10版本1903和1909的支持 根據(jù)客戶......
閱讀微軟已經(jīng)向開發(fā)通道中的Windows Insiders宣布了Windows 10 Insider Prev......
閱讀bull; Wine最近收到了對(duì)6.0版的更新。 bull; 此更新改進(jìn)了使用Wine的......
閱讀有趣的是,微軟正在努力使Linux在Windows10下運(yùn)行。我們都熟悉W......
閱讀適用于 Linux 的 Windows 子系統(tǒng)既是一種啟示,也是一場(chǎng)革命?,F(xiàn)在......
閱讀最近有些朋友問(wèn)小編Linux系統(tǒng)下掛接ntfs盤時(shí)總提示module fuse not found如何解決?今天小編將為大家?guī)?lái)的是Linux系統(tǒng)下掛接ntfs盤時(shí)總提示module fuse not found的解決方法,有需要的朋友一起去看...
次閱讀
今天小編要為大家分享的是Linux下安裝vagrant過(guò)程遇到的問(wèn)題解析,希望可以幫助到大家,有需要的朋友一起去看看吧...
次閱讀
Linux Mint 是較流行的 Linux發(fā)行版之一,它發(fā)布了 20.2 版,綽號(hào)為Uma。它帶有新功能、升級(jí)的內(nèi)部結(jié)構(gòu)和其他更改。今天,我們將仔細(xì)研究新功能。 Mint 20....
次閱讀
最近一些朋友問(wèn)小編Linux怎么去除fstab文件只讀屬性?今天小編為大家分享的是Linux去除fstab文件只讀屬性的方法,有需要的朋友可以參考下...
次閱讀
在實(shí)際使用過(guò)程中,若一個(gè)目錄下文件或文件夾太多,在執(zhí)行“*” 命令時(shí) 會(huì)提示Argument list too long,如rm -rf /tmp/*命令下...
次閱讀
SELinux(Security-Enhanced Linux) 是美國(guó)國(guó)家安全局(NSA)對(duì)于強(qiáng)制訪問(wèn)控制的實(shí)現(xiàn),是 Linux上最杰出的新安全子系統(tǒng)。今天小編要為大家分享的是SELinux基本概念詳解,希望對(duì)大家會(huì)有幫助,有...
次閱讀
bull; Wine最近收到了對(duì)6.0版的更新。 bull; 此更新改進(jìn)了使用Wine的Linux系統(tǒng)上的Windows應(yīng)用程序。 bull; Wine可用于在非本機(jī)系統(tǒng)上運(yùn)行Windows應(yīng)用程序和...
次閱讀
最近一些朋友問(wèn)小編Linux如何修改RPM的安裝目錄?今天小編為大家?guī)?lái)的是Linux修改RPM的安裝目錄的方法,希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀
今天小編為大家?guī)?lái)的是Linux下設(shè)置權(quán)限讓用戶只刪除自己的文件的方法,希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀
今天小編為大家?guī)?lái)的是Linux basename命令的使用詳解,希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀
適用于 Linux 5.16 的新 Zstd 已準(zhǔn)備就緒,性能提升高達(dá) 35% 最近,為 Linux 5.16 內(nèi)核準(zhǔn)備的新 Zstd 已提交給linux-next 合并,以便在接下來(lái)的幾周內(nèi)進(jìn)行更廣泛的測(cè)試。...
次閱讀
這篇文章主要介紹了Linux批量清空當(dāng)前目錄中的日志文件,需要的朋友可以參考下...
次閱讀
最近一些朋友問(wèn)小編在Linux下如何確定網(wǎng)卡所使用驅(qū)動(dòng)程序?今天小編要為大家?guī)?lái)的是在Linux下確定網(wǎng)卡所使用驅(qū)動(dòng)程序的方法,希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀
今天小編為大家?guī)?lái)的是從Vim中訪問(wèn)shell或者運(yùn)行外部命令的方法,希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀
今天小編為大家?guī)?lái)的是 linux命令行下進(jìn)入帶空格的文件夾的方法。希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧...
次閱讀