12個(gè)超實(shí)用的vim編輯技巧

admin Linux運(yùn)維評(píng)論576字?jǐn)?shù) 3243閱讀模式
摘要

vim 是一個(gè)很好用的編輯器,應(yīng)用十分廣泛。但關(guān)于 vim,總有一些你不知道的事情,我們需要持續(xù)不斷的學(xué)習(xí)。我經(jīng)常使用 vim,也經(jīng)常在各大社區(qū)、論壇看到 vim 專家用戶分享經(jīng)驗(yàn),今天我們就總結(jié)其中常用的一部分,分享給大家。

1,使用內(nèi)置幫助(built-in help)

使用 vim 的內(nèi)置幫助是一個(gè)好習(xí)慣(雖然很多朋友更喜歡在網(wǎng)上搜索相關(guān)的使用方法)。查看幫助的語(yǔ)法如下表格所示:

: :help :w	有關(guān) :w 命令的幫助
none :help j	有關(guān)“j”鍵在正常模式上下文中的幫助
v_ :help v_J	有關(guān)在上下文中使用“J”鍵到視覺(jué)模式的幫助
i_ :help i_<Esc>	有關(guān)在上下文中使用“Esc”鍵插入模式的幫助
/ :help /\n	有關(guān)搜索模式“\n”的幫助

2,以普通用戶身份打開(kāi),以 root 用戶身份保存

在編輯系統(tǒng)文件或者受權(quán)限保護(hù)的文件的時(shí)候,很容易會(huì)忘記在 vim 編輯之前添加 sudo,這樣將會(huì)以只讀模式打開(kāi)文件,也就是編輯后不能保存。

但是這時(shí)候,你可能已經(jīng)對(duì)文件做了一些修改(尚未保存),很顯然,強(qiáng)制退出不是一個(gè)好選擇。

12個(gè)超實(shí)用的vim編輯技巧

在這些情況下,在 vim 中鍵入以下命令:

:w !sudo tee %

鍵入此命令后,將要求您輸入sudo命令的密碼,然后文件就可以保存了。

注:我們應(yīng)該使用 sudoedit 命令而不是 sudo vim 來(lái)編輯需要超級(jí)用戶權(quán)限的文件。

我們將上述命令拆解來(lái)看下:
  • :w?- 這是寫入命令。由于沒(méi)有給出參數(shù),vim 將把整個(gè)文件寫入標(biāo)準(zhǔn)輸出;
  • !sudo?- 將 sudo 命令作為 shell 命令而不是 vim 命令運(yùn)行;
  • tee?-?tee命令用于讀取標(biāo)準(zhǔn)輸入并將其寫入標(biāo)準(zhǔn)輸出或文件;
  • %?- vim 將其替換為您正在編輯的當(dāng)前文件的名稱。
:w?命令將整個(gè)文件寫入 STDOUT(標(biāo)準(zhǔn)輸出);然后,我們使用sudo命令(因?yàn)槲覀兙庉嫷漠吘故且粋€(gè)系統(tǒng)文件)來(lái)獲得臨時(shí)權(quán)限。

百分號(hào)(%)表示文件名,tee 命令從 STDOUT 獲取 vim 的輸出并將其寫入 % 文件。

這基本上適用于?<Vim's STDOUT> | sudo tee /etc/ssh/sshd_config,有點(diǎn)復(fù)雜...

3,將所有空格轉(zhuǎn)為制表符(或者反過(guò)來(lái))

我們都喜歡使用制表符(tab)或者空格,但是,如果我們正在編輯的文本其縮進(jìn)使用的符號(hào)正好與我們的習(xí)慣相反,該怎么辦?

3.1 將所有空格轉(zhuǎn)換為制表符

如果當(dāng)前文件使用空格縮進(jìn)文本,希望將它們轉(zhuǎn)換為制表符時(shí),需要運(yùn)行如下兩個(gè) vim 命令:
:set noexpandtab
:retab!

這樣做會(huì)將所有空格轉(zhuǎn)換為其等效的制表符。如果文檔使用兩個(gè)空格作為縮進(jìn)寬度,它們將轉(zhuǎn)換為1個(gè)制表符。如果 4 個(gè)空格用作單個(gè)縮進(jìn)寬度時(shí),這 4 個(gè)制表位將替換為 1 個(gè)制表字符。

3.2 將所有制表符轉(zhuǎn)換為空格

如果要編輯的文件使用制表符縮進(jìn),并且要將制表符轉(zhuǎn)換為空格,則需要運(yùn)行如下4個(gè) vim 命令:
:set expandtab
:set tabstop=4
:set shiftwidth=4
:retab

第一個(gè)命令(expandtab)告訴 vim 使用空格展開(kāi) tab,第二個(gè)命令(tabstop)設(shè)置使用多少個(gè)空格用作一個(gè)“縮進(jìn)塊”。

在我們的例子中,我們定義了“1個(gè)tab=4個(gè)空格”;當(dāng)使用>>運(yùn)算符時(shí),shiftwidth?命令用于控制縮進(jìn),這也被設(shè)置為4個(gè)空格。

最后,retab?命令將所有制表符(用于縮進(jìn))轉(zhuǎn)換為空格。

4,縮進(jìn)所有行

錯(cuò)誤的縮進(jìn),在 python 或者 YAML 程序中會(huì)報(bào)錯(cuò),導(dǎo)致程序不能正確運(yùn)行。

要縮進(jìn)所有行,按?gg?鍵到達(dá)文件頂部,然后按?=?鍵表示“縮進(jìn)”,最后按?G?鍵表示到“最后一行”。

這樣將會(huì)自動(dòng)縮進(jìn),從第一行到最后一行。

如下圖所示,我使用?:gg=G命令縮進(jìn)的演示:
12個(gè)超實(shí)用的vim編輯技巧
正如你所看到的(從這個(gè)有限的預(yù)覽中),所有行都正確縮進(jìn)。

5,粘貼代碼時(shí)保留縮進(jìn)

我們都有過(guò)在互聯(lián)網(wǎng)上復(fù)制代碼的時(shí)候。當(dāng)將代碼粘貼到文件中時(shí),縮進(jìn)都給弄亂了,這時(shí)候需要怎樣做呢?

為了避免這種情況,請(qǐng)?jiān)?.vimrc?文件中添加以下代碼:
set pastetoggle=<F2>

對(duì)?vimrc?文件進(jìn)行如上更改后,在粘貼代碼之前按?F2?鍵,這樣做將確保代碼粘貼正確的縮進(jìn)。

6,以正確的縮進(jìn)深度開(kāi)始書寫

假設(shè)光標(biāo)在第一行第一列,但是所要寫的內(nèi)容需要縮進(jìn),那在不按下制表符(tab)和空格鍵的情況下,應(yīng)該怎樣做呢?

答案是在正常模式下按下?S?鍵。

當(dāng)光標(biāo)位于行的第一列時(shí),按?Esc?鍵進(jìn)入正常模式。然后按?S(大寫)鍵,這會(huì)將光標(biāo)移動(dòng)到適當(dāng)?shù)目s進(jìn)深度,并自動(dòng)進(jìn)入“插入”模式,以便開(kāi)始鍵入。
12個(gè)超實(shí)用的vim編輯技巧
上圖,我的光標(biāo)位于第一列,通過(guò)按S鍵,光標(biāo)移動(dòng)到正確的縮進(jìn)深度,Vim從正常模式切換到插入模式。

7,保存文件前顯示差異

我們可能遇到過(guò)這樣的情況:我修改了這個(gè)文件,但是忘記都做了哪些修改了,并且我擔(dān)心其中有些地方可能修改錯(cuò)了。

解決此問(wèn)題的方法是查看緩沖區(qū)和文件之間的差異。可在 vim 中執(zhí)行如下命令:
:w !diff % -
我們將上述命令拆解來(lái)看:
  • :w??用于保存/寫入,在這個(gè)特定場(chǎng)景中,如果命令中沒(méi)有指定文件名,則輸出將寫入STDIN(標(biāo)準(zhǔn)輸入)文件;
  • :!<command>? 是執(zhí)行 shell 命令的語(yǔ)法,在這個(gè)例子中,我們?cè)?shell 中運(yùn)行 diff 命令;
  • %??表示未修改的當(dāng)前文件的名稱;試試這個(gè)::!echo %
  • -?是 diff 命令的 STDIN 文件。
因此,該命令首先將所有[未保存]內(nèi)容寫入STDIN文件。然后diff命令讀取當(dāng)前文件(%)并將其與STDIN(-)文件進(jìn)行比較。

這個(gè)命令大致等同于這個(gè)shell命令:diff <original-file> <Vim's STDOUT>

8,顯示拼寫錯(cuò)誤

我們應(yīng)該都使用過(guò) Microsoft word,其拼寫檢查器在拼寫錯(cuò)誤的單詞下會(huì)有一條紅色的波浪線。

vim 也內(nèi)置了拼寫檢查器,但默認(rèn)情況下是關(guān)閉的。我們可以使用如下命令啟用它:
:set spell

這樣,你可能會(huì)看到拼寫錯(cuò)誤的單詞被突出顯示,其突出顯示的方式取決于你的 vim 顏色方案。我在拼寫錯(cuò)誤的單詞下面有一條白色下劃線,如下圖所示:

12個(gè)超實(shí)用的vim編輯技巧

要將這設(shè)置為 vim 的默認(rèn),可在 .vimrc 文件中添加如下配置:

set spell

9,顯示行號(hào)

與許多 vim 用戶一樣,你可能喜歡在 vim 中顯示行號(hào)。

有兩種方法可以顯示行號(hào)。一種是絕對(duì)行編號(hào),在這種情況下,每行顯示絕對(duì)行號(hào),就像任何其他代碼編輯器或IDE一樣。

第二種是相對(duì)行號(hào)。在這種情況下,當(dāng)前行的行號(hào)為0,其他行的行號(hào)為相比于光標(biāo)所在行的相對(duì)數(shù)字。

這兩種情況,也并不是只能選擇一個(gè),事實(shí)上,可以兩種都要。

通過(guò)在?.vimrc?中添加以下行,可以在 vim 中啟用“混合行編號(hào)”:
set number relativenumber

這將在光標(biāo)所在行顯示絕對(duì)行號(hào),在其他行顯示相對(duì)行號(hào)。如下圖所示:

12個(gè)超實(shí)用的vim編輯技巧

當(dāng)前光標(biāo)位于第44行,因此該行顯示絕對(duì)行號(hào);其他行(光標(biāo)上方和下方的行)顯示相對(duì)行號(hào)。

10,使用 vim 打開(kāi)文件的同時(shí)將光標(biāo)定位在某一行

默認(rèn)情況下,我們使用 vim 打開(kāi)文件,光標(biāo)總會(huì)在第一行。在某些時(shí)候,我們希望光標(biāo)能夠定位在我們指定的某一行,而不是第一行。

可以通過(guò)使用?+n(n為行號(hào))選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn),當(dāng)然前提是你需要知道打開(kāi)的文件總行數(shù)應(yīng)大于或等于 n,如下:
vim +n <file-name>

11,使用可讀的配色方案

當(dāng)談到使用配色方案時(shí),人們通常會(huì)選擇他們覺(jué)得最吸引人或最美觀的配色方案。但是,當(dāng)你作為一個(gè)代碼編輯器兼 IDE 的 vim 時(shí),最好放棄一些引人注目的東西,轉(zhuǎn)而使用具有更好視覺(jué)指導(dǎo)的配色方案。

一個(gè)好的配色方案看起來(lái)很好,但是一個(gè)優(yōu)秀的配色可以幫助你在顏色的幫助下輕松識(shí)別關(guān)鍵詞、變量和其他標(biāo)識(shí)符。

當(dāng)然,每個(gè)人的喜好是不同的,配色當(dāng)然也是不同的。我們?cè)谙聢D中貼出幾個(gè)大家都覺(jué)得順眼的方案,可以作為參考:

12個(gè)超實(shí)用的vim編輯技巧

12個(gè)超實(shí)用的vim編輯技巧

12個(gè)超實(shí)用的vim編輯技巧

12,在插入模式下刪除文本

我們都知道,在正常模式(normal mode)下,可以使用?d?和?x?鍵刪除文本,那么在插入模式下如何執(zhí)行相同的操作(比如?dd)呢?

以下是常用的一些方案:
  • ctrl + w?刪除前一個(gè)單詞(字)(相當(dāng)于正常模式下的?db);
  • ctrl + h?刪除前一個(gè)字符;
  • ctrl ?+ u?刪除當(dāng)前行所有前面的字符(相當(dāng)于正常模式下的?d0?);
  • ctrl ?+ k?刪除當(dāng)前行中所有主要字符(相當(dāng)于正常模式下的?d$)。

版權(quán)聲明:文章圖片資源來(lái)源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)留言刪除!!!
廣告也精彩
admin
  • 本文由 發(fā)表于 2022年11月28日 20:00:44
  • 轉(zhuǎn)載請(qǐng)務(wù)必保留本文鏈接:http://yudch.cn/9230.html
匿名

發(fā)表評(píng)論

匿名網(wǎng)友 填寫信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: