公司做影視網(wǎng)站侵權(quán)全國(guó)疫情防控最新數(shù)據(jù)
運(yùn)維人員不僅要熟悉操作系統(tǒng)、服務(wù)器、網(wǎng)絡(luò)等只是,甚至對(duì)于開(kāi)發(fā)相關(guān)的也要有所了解。很多運(yùn)維工作者可能一時(shí)半會(huì)記不住那么多命令、代碼、方法、原理或者用法等等。這里我將結(jié)合自身工作,持續(xù)給大家更新運(yùn)維工作所需要接觸到的知識(shí)點(diǎn),希望大家喜歡。
今天我們要講的是 Vim。
一、簡(jiǎn)介
Vim文本編輯器,是由 vi 發(fā)展演變過(guò)來(lái)的文本編輯器,使用簡(jiǎn)單、功能強(qiáng)大、是 Linux眾多發(fā)行版的默認(rèn)文本編輯器。?
vi ( visual editor ) 編輯器通常被簡(jiǎn)稱(chēng)為vi,它是Linux和Unix系統(tǒng)上最基本的文本編輯器,類(lèi)似于Windows系統(tǒng)下的notepad (記事本) 編輯器。Vim (Vi improved)是 vi 編輯器的加強(qiáng)版,比 vi 更容易使用。vi 的命令幾乎全部都可以在vim上使用。
文章開(kāi)頭我先對(duì) Vim 相關(guān)的一些基礎(chǔ)詞語(yǔ)做個(gè)解釋,后面都會(huì)有詳細(xì)的說(shuō)明,方便大家理解。
官方網(wǎng)站:https://www.vim.org/
1.1. 動(dòng)詞理解
動(dòng)詞代表了我們打算對(duì)文本進(jìn)行什么樣的操作。
d # 表示刪除delete
r # 表示替換replace
c # 表示修改change
y # 表示復(fù)制yank
v # 表示選取visual select
1.2.?名詞理解
名詞代表了我們即將處理的文本。引號(hào)或者各種括號(hào)所包含的文本稱(chēng)作一個(gè)文本塊。
w # 表示一個(gè)單詞word
s # 表示一個(gè)句子sentence
p # 表示一個(gè)段落paragraph
t # 表示一個(gè) HTML 標(biāo)簽tag
1.3.?介詞理解
?介詞界定了待編輯文本的范圍或者位置。
i # 表示在...之內(nèi) inside
a # 表示環(huán)繞... around
t # 表示到...位置前 to
f # 表示到...位置上 forward
1.4.?數(shù)詞理解
數(shù)詞指定了待編輯文本對(duì)象的數(shù)量,從這個(gè)角度而言,數(shù)詞也可以看作是一種介詞。引入數(shù)詞之后,文本編輯命令的語(yǔ)法就升級(jí)成了下面這樣:
動(dòng)詞 介詞/數(shù)詞 名詞
# 示例
c3w # 修改三個(gè)單詞:change three words
d2w # 刪除兩個(gè)單詞:delete two words
另外,數(shù)詞也可以修飾動(dòng)詞,表示將操作執(zhí)行 n 次。于是,我們又有了下面的語(yǔ)法:
數(shù)詞 動(dòng)詞 名詞?
# 示例
2dw # 兩次刪除單詞(等價(jià)于刪除兩個(gè)單詞): twice delete word
3x # 三次刪除字符(等價(jià)于刪除三個(gè)字符): three times delete character
二、Vim 鍵位操作
按鍵 | 說(shuō)明 |
l???????? | 右移光標(biāo) |
gj??????? | 下移光標(biāo)(折行文本) |
gk??????? | 上移光標(biāo)(折行文本) |
H???????? | 移動(dòng)到當(dāng)前頁(yè)面頂部 |
M???????? | 移動(dòng)到當(dāng)前頁(yè)面中間 |
L???????? | 移動(dòng)到當(dāng)前頁(yè)面底部 |
w???????? | 移動(dòng)到下個(gè)單詞開(kāi)頭 |
W???????? | 移動(dòng)到下個(gè)單詞開(kāi)頭(單詞含標(biāo)點(diǎn)) |
e???????? | 移動(dòng)到下個(gè)單詞結(jié)尾 |
E???????? | 移動(dòng)到下個(gè)單詞結(jié)尾(單詞含標(biāo)點(diǎn)) |
b???????? | 移動(dòng)到上個(gè)單詞開(kāi)頭 |
B???????? | 移動(dòng)到上個(gè)單詞開(kāi)頭(單詞含標(biāo)點(diǎn)) |
ge??????? | 移動(dòng)到上個(gè)單詞結(jié)尾 |
gE??????? | 移動(dòng)到上個(gè)單詞結(jié)尾(單詞含標(biāo)點(diǎn)) |
%???????? | 跳轉(zhuǎn)到配對(duì)的符號(hào)(默認(rèn)支持的配對(duì)符號(hào)組: '()', '{}', '[]' 在vim中使用 :h matchpairs 獲得更多信息) |
0 | 移動(dòng)到行首 |
^???????? | 移動(dòng)到行首的非空白符 |
$???????? | 移動(dòng)到行尾 |
g_??????? | 移動(dòng)到行內(nèi)最后一個(gè)非空白符 |
gg??????? | 移動(dòng)到文件第一行 |
G???????? | 移動(dòng)到文件最后一行 |
5gg or 5G | 移動(dòng)到第五行 |
gd??????? | 跳轉(zhuǎn)到局部定義 |
gD??????? | 跳轉(zhuǎn)到全局定義 |
fx??????? | 移動(dòng)到字符 x 下次出現(xiàn)的位置 |
tx??????? | 移動(dòng)到字符 x 下次出現(xiàn)的位置的前一個(gè)字符 |
Fx??????? | 移動(dòng)到字符 x 上次出現(xiàn)的位置 |
Tx??????? | 移動(dòng)到字符 x 上次出現(xiàn)的位置的后一個(gè)字符 |
;???????? | 重復(fù)之前的f、t、F、T操作 |
,???????? | 反向重復(fù)之前的f、t、F、T操作 |
}???????? | 移動(dòng)到下一個(gè)段落 (當(dāng)編輯代碼時(shí)則為函數(shù)/代碼塊) |
{???????? | 移動(dòng)到上一個(gè)段落 (當(dāng)編輯代碼時(shí)則為函數(shù)/代碼塊) |
zz??????? | 移動(dòng)屏幕使光標(biāo)居中 |
zt??????? | 移動(dòng)屏幕使光標(biāo)位于屏幕頂部 |
zb??????? | 移動(dòng)屏幕使光標(biāo)位于屏幕底部 |
Ctrl + e? | 向下移動(dòng)屏幕一行(保持光標(biāo)不動(dòng)) |
Ctrl + y? | 向上移動(dòng)屏幕一行(保持光標(biāo)不動(dòng)) |
Ctrl + b? | 向上滾動(dòng)一屏 |
Ctrl + f? | 向下滾動(dòng)一屏 |
Ctrl + d? | 向下滾動(dòng)半屏 |
Ctrl + u? | 向上滾動(dòng)半屏 |
?Tips:命令前追加數(shù)字表示命令的重復(fù)次數(shù), 比如?4j?表示向下移動(dòng)四行
三、Vim?基礎(chǔ)編輯
按鍵 | 說(shuō)明 |
r??????? | 替換當(dāng)前字符 |
R??????? | 在 ESC 按下之前,替換多個(gè)字符 |
J??????? | 將下一行合并到當(dāng)前行, 并在兩部分文本之間插入一個(gè)空格 |
gJ?????? | 將下一行合并到當(dāng)前行, 兩部分文本之間不含空格 |
gwip???? | 重新調(diào)整段落 |
g~?????? | 大小寫(xiě)轉(zhuǎn)換操作修飾符 |
gu?????? | 小寫(xiě)操作修飾符 |
gU?????? | 大寫(xiě)操作修飾符 |
cc?????? | 將光標(biāo)所在的行刪除, 然后進(jìn)入插入模式 |
c$ or C? | 將光標(biāo)處到行尾刪除, 然后進(jìn)入插入模式 |
ciw????? | 將光標(biāo)所在的單詞刪除, 然后進(jìn)入插入模式 |
cw or ce | 從光標(biāo)位置開(kāi)始, 修改單詞 |
s??????? | 刪除當(dāng)前字符, 然后進(jìn)入插入模式 |
S??????? | 清空當(dāng)前行, 然后進(jìn)入插入模式 (同cc) |
xp?????? | 當(dāng)前字符后移 |
u??????? | 撤銷(xiāo) |
U??????? | 撤銷(xiāo)上一次的改動(dòng)行的操作 |
Ctrl + r | 重做(取消撤銷(xiāo)) |
.??????? | 再次執(zhí)行上個(gè)命令 |
四、Vim 插入模式
按鍵 | 說(shuō)明 |
i?????????????? | 從光標(biāo)前開(kāi)始插入字符 |
I?????????????? | 從行首開(kāi)始插入字符 |
a?????????????? | 從光標(biāo)后開(kāi)始插入字符 |
A?????????????? | 從行尾開(kāi)始插入字符 |
o?????????????? | 在當(dāng)前行之下另起一行, 開(kāi)始插入字符 |
O?????????????? | 在當(dāng)前行之上另起一行, 開(kāi)始插入字符 |
ea????????????? | 從當(dāng)前單詞末尾開(kāi)始插入 |
Ctrl + h??????? | 在插入模式下,刪除光標(biāo)前的字符 |
Ctrl + w??????? | 在插入模式下,刪除光標(biāo)前的單詞 |
Ctrl + j??????? | 在插入模式下,另起一行 |
Ctrl + t??????? | 在插入模式下,向右縮進(jìn),寬度由 shiftwidth 控制 |
Ctrl + d??????? | 在插入模式下,向左縮進(jìn),寬度由 shiftwidth 控制 |
Ctrl + n??????? | 在插入模式下,在光標(biāo)之前插入自動(dòng)補(bǔ)全的下一個(gè)匹配項(xiàng) |
Ctrl + p??????? | 在插入模式下,在光標(biāo)之前插入自動(dòng)補(bǔ)全的上一個(gè)匹配項(xiàng) |
Ctrl + rx?????? | 插入寄存器 x 的內(nèi)容 |
Ctrl + ox?????? | 暫時(shí)進(jìn)入正常模式以發(fā)出一個(gè)正常模式命令 x |
Esc or Ctrl + c | 退出插入模式 |
五、Vim 可視化模式
按鍵 | 說(shuō)明 |
v?????????????? | 進(jìn)入可視化模式, 移動(dòng)光標(biāo)高亮選擇, 然后可以對(duì)選擇的文本執(zhí)行命令(比 y - 復(fù)制) |
V?????????????? | 進(jìn)入可視化模式(行粒度選擇) |
o?????????????? | 切換光標(biāo)到選擇區(qū)開(kāi)頭/結(jié)尾 |
Ctrl + v??????? | 進(jìn)入可視化模式(矩陣選擇) |
O?????????????? | 切換光標(biāo)到選擇區(qū)的角 |
aw????????????? | 選擇當(dāng)前單詞 |
ab????????????? | 選擇被 () 包裹的區(qū)域(含括號(hào)) |
aB????????????? | 選擇被 {} 包裹的區(qū)域(含花括號(hào)) |
at????????????? | 選擇被 <> 標(biāo)簽包裹的區(qū)域(含<>標(biāo)簽) |
ib????????????? | 選擇被 () 包裹的區(qū)域(不含括號(hào)) |
iB????????????? | 選擇被 {} 包裹的區(qū)域(不含花括號(hào)) |
it????????????? | 選擇被 <> 標(biāo)簽包裹的區(qū)域(不含<>標(biāo)簽) |
Esc or Ctrl + c | 退出可視化模式 |
>?????????????? | 向右縮進(jìn) |
<?????????????? | 向左縮進(jìn) |
y?????????????? | 復(fù)制 |
d?????????????? | 剪切 |
~?????????????? | 大小寫(xiě)切換 |
u?????????????? | 將選中文本轉(zhuǎn)換為小寫(xiě) |
U?????????????? | 將選中文本轉(zhuǎn)換為大寫(xiě) |
Tips:也可以使用?(?和?{?分別代替?b?和?B?。
六、Vim Ctrl-c + Ctrl v?神器
按鍵 | 說(shuō)明 |
yy????? | 復(fù)制當(dāng)前行 |
2yy???? | 復(fù)制 2 行 |
yw????? | 復(fù)制當(dāng)前單詞 |
yiw???? | 復(fù)制光標(biāo)處的單詞 |
yaw???? | 復(fù)制光標(biāo)處的單詞及其前后的空格 |
y$ or Y | 復(fù)制, 從光標(biāo)位置到行末 |
p?????? | 在光標(biāo)后粘貼 |
P?????? | 在光標(biāo)前粘貼 |
gp????? | 在光標(biāo)后粘貼并把光標(biāo)定位于粘貼的文本之后 |
gP????? | 在光標(biāo)前粘貼并把光標(biāo)定位于粘貼的文本之后 |
dd????? | 剪切當(dāng)前行 |
2dd???? | 剪切 2 行 |
dw????? | 剪切當(dāng)前單詞 |
diw???? | 刪除光標(biāo)處的單詞 |
daw???? | 刪除光標(biāo)處的單詞及其前后的空格 |
:3,5d?? | 刪除 3 至 5 行 |
:g/{pattern}/d | 刪除所有包含 pattern 的行 |
:g!/{pattern}/d | 刪除所有不包含 pattern 的行 |
d$ or D | 剪切, 從光標(biāo)位置到行末 (同 D ) |
x | 剪切當(dāng)前字符 |
Tips:也可以使用以下字符來(lái)指定范圍:
:.,$d - 從當(dāng)前行到文件末尾
:.,1d - 從當(dāng)前行到文件開(kāi)頭
:10,$d - 第 10 行到文件末尾?
七、Vim 保存和退出
按鍵 | 說(shuō)明 |
:w | 保存 |
:q | 關(guān)閉文件 |
:wq | :x | ZZ | 保存并退出 |
:wqa | 保存并退出所有文件 |
:q! | ZQ | 強(qiáng)制退出 |
:qa | 關(guān)閉所有文件 |
:qa! | 強(qiáng)制退出所有文件 |
:w new.txt | 寫(xiě)入new.txt |
:sav new.txt | 保存并編輯new.txt |
:w !sudo tee % | 寫(xiě)入只讀文件 |
八、Vim 查找和替換
按鍵 | 說(shuō)明 |
/foo | 向前搜索 |
/foo\c | 向前搜索?(不區(qū)分大小寫(xiě)) |
?foo | 向后搜索 |
/\v\d+ | 使用?regex?搜索 |
n | 下一個(gè)匹配的搜索模式 |
N | 上一個(gè)匹配的搜索 |
* | 向前搜索當(dāng)前單詞 |
# | 向后搜索當(dāng)前單詞 |
% | 整個(gè)文件 |
’<,’> | 當(dāng)前選擇 |
5 | 第?5?行 |
5,10 | 第?5?行到第?10?行 |
$ | 最后一行 |
2,$ | 第?2?行到最后 |
. | 當(dāng)前行 |
,3 | 接下來(lái)的?3?行 |
-3, | 轉(zhuǎn)發(fā)?3?行 |
&?|?\0 | 替換為整個(gè)匹配的 |
\1...\9 | 替換為 0-9 組 |
\u | 大寫(xiě)下一個(gè)字母 |
\U | 后面的大寫(xiě)字符 |
\l | 小寫(xiě)下一個(gè)字母 |
\L | 后面的字符小寫(xiě) |
\e | \u、\U、\l?和?\L?的結(jié)尾 |
\E | \u、\U、\l?和?\L?的結(jié)尾 |
:s/old/new | 更換行:先更換 |
:s/old/new/g | 更換行:全部替換 |
:s/\vold/new/g | 更換行:全部替換為?regex |
:s/old/new/gc | 更換行:全部替換_(確認(rèn))_ |
:s/old/new/i | 更換行:先忽略大小寫(xiě)替換 |
:2,6s/old/new/g | 更換行:在?2-6?行之間替換 |
:%s/old/new | 更換文件:先更換 |
:%s/old/new/g | 更換文件:全部替換 |
:%s/old/new/gc | 更換文件:全部替換?(確認(rèn)) |
:%s/old/new/gi | 更換文件:全部替換?(忽略大小寫(xiě)) |
:%s/\vold/new/g | 更換文件:全部替換為?regex |
:g/foo/d | 刪除包含?foo?的行 |
:g!/foo/d | 刪除不包含?foo?的行 |
:g/^\s*$/d | 刪除所有空行 |
:g/foo/t$ | 將包含?foo?的行復(fù)制到 EOF |
:g/foo/m$ | 將包含?foo?的行移動(dòng)到 EOF |
:g/^/m0 | 反轉(zhuǎn)文件 |
:g/^/t. | 復(fù)制每一行 |
實(shí)例說(shuō)明:
:s/a\|b/xxx\0xxx/g # 將 "a b" 修改為 "xxxaxxx xxxbxxx"
:s/test/\U& file/ # 將 "test" 修改為 "TEST FILE"
:s/\(test\)/\U\1\e file/ # 將 "test" 修改為 "TEST file"
:s/\v([abc])([efg])/\2\1/g # 將 "af fa bg" 修改為 "fa fa gb"
:s/\v\w+/\u\0/g # 將 "bla bla" 修改為 "Bla Bla"
:s/\v([ab])|([cd])/\1x/g # 將 "a b c d" 修改為 "ax bx x x"
:%s/.*/\L&/ # 將 "HTML" 修改為 "html"
:s/\v<(.)(\w*)/\u\1\L\2/g # 將單詞的每個(gè)首字母大寫(xiě)
:%s/^\(.*\)\n\1/\1/ # 刪除重復(fù)行
:%s/<\/\=\(\w\+\)\>/\U&/g # 將 HTML 標(biāo)記轉(zhuǎn)換為大寫(xiě)
:g/^pattern/s/$/mytext # 查找文本并將其附加到末尾
:g/pattern/norm! @i # 在匹配行上運(yùn)行宏
/^\(.*\)\(\r\?\n\1\)\+$ # 查看重復(fù)行
/\v^(.*)(\r?\n\1)+$ # 查看重復(fù)行(非常神奇)
:v/./,/./-j # 將空行壓縮成空行
:g/<p1>/,/<p2>/d # 從 <p1> 到 <p2> 包含刪除
九、Vim?diff 文件比對(duì)
用法:
$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]
按鍵說(shuō)明:
按鍵 | 說(shuō)明 |
zf?????????????? | 定義折疊修飾符 |
zd?????????????? | 刪除光標(biāo)位置的折疊 |
za?????????????? | 展開(kāi) & 關(guān)閉光標(biāo)位置的折疊 |
zo?????????????? | 展開(kāi)光標(biāo)位置的折疊 |
zc?????????????? | 關(guān)閉光標(biāo)位置的折疊 |
zr?????????????? | 展開(kāi)同級(jí)的所有折疊 |
zm?????????????? | 關(guān)閉同級(jí)的所有折疊 |
zi?????????????? | 開(kāi)啟 & 關(guān)閉折疊功能 |
]c?????????????? | 光標(biāo)移至下一處差異 |
[c?????????????? | 光標(biāo)移至上一處差異 |
do or :diffg[et] | 將另一緩沖區(qū)中的差異合并至當(dāng)前緩沖區(qū) |
dp or :diffpu[t] | 將當(dāng)前緩沖區(qū)中的差異推送至另一緩沖區(qū) |
:diffthis??????? | 令當(dāng)前窗口成為 diff 模式的窗口之一 |
:dif[fupdate]??? | 強(qiáng)制刷新 diff 的高亮與折疊 |
:diffo[ff]?????? | 令當(dāng)前窗口退出 diff 模式 |
Tips:可以直接在終端運(yùn)行 vimdiff 查看文件間的不同。也可以將該程序設(shè)為 git difftool 的選項(xiàng)之一。
十、Vim 標(biāo)記
按鍵 | 說(shuō)明 |
`^ | 插入模式下光標(biāo)的最后位置 |
`. | 當(dāng)前緩沖區(qū)的最后更改 |
`" | 最后退出的當(dāng)前緩沖區(qū) |
`0 | 在上次編輯的文件中 |
'' | 返回當(dāng)前緩沖區(qū)中跳出的行 |
`` | 返回當(dāng)前緩沖區(qū)中跳轉(zhuǎn)的位置 |
`[ | 到先前更改或拉出的文本的開(kāi)頭 |
`] | 到之前更改或拉出的文本的結(jié)尾 |
`< | 到最后一個(gè)可視化選擇的開(kāi)始 |
`> | 到最后一個(gè)可視化選擇的結(jié)尾 |
ma | 將此光標(biāo)位置標(biāo)記為a |
`a | 跳轉(zhuǎn)到光標(biāo)位置a |
'a | 跳轉(zhuǎn)到位置為?a?的行首 |
d'a | 從當(dāng)前行刪除到標(biāo)記?a?的行 |
d`a | 從當(dāng)前位置刪除到標(biāo)記?a?的位置 |
c'a | 將文本從當(dāng)前行更改為?a?行 |
y`a | 將文本從當(dāng)前位置拉到?a?的位置 |
:marks | 列出所有當(dāng)前標(biāo)記 |
:delm a | 刪除標(biāo)記a |
:delm a-d | 刪除標(biāo)記a、b、c、d |
:delm abc | 刪除標(biāo)記a、b、c |
Tips:可以使用反引號(hào)(`)或單引號(hào)(')跳轉(zhuǎn)至標(biāo)記位置。使用單引號(hào)會(huì)跳轉(zhuǎn)至該標(biāo)記所在行行首(首個(gè)非空白字符)。?
十一、Vim 標(biāo)簽
按鍵 | 說(shuō)明 |
:tabnew or :tabnew {page.words.file} | 在新標(biāo)簽中打開(kāi)文件 |
Ctrl + wT??????????????????????????? | 將窗口變成標(biāo)簽 |
gt or :tabn[ext]???????????????????? | 切換到下一個(gè)標(biāo)簽 |
gT or :tabp[revious]???????????????? | 切換到上一個(gè)標(biāo)簽 |
#gt????????????????????????????????? | 切換到第 # 個(gè)標(biāo)簽 |
:tabm[ove] #???????????????????????? | 移動(dòng)標(biāo)簽到第 # 位(下標(biāo)從 0 開(kāi)始) |
:tabc[lose]????????????????????????? | 關(guān)閉當(dāng)前標(biāo)簽 |
:tabo[nly]?????????????????????????? | 關(guān)閉其他標(biāo)簽 |
:tabdo command?????????????????????? | 在所有標(biāo)簽中執(zhí)行命令 (例如 :tabdo q 關(guān)閉所有標(biāo)簽) |
十二、Vim 多文件編輯
按鍵 | 說(shuō)明 |
:e[dit] 文件名???? | 新建緩沖區(qū)打開(kāi) filename |
:bn[ext]?????????? | 切換到下個(gè)緩沖區(qū) |
:bp[revious]?????? | 切換到上個(gè)緩沖區(qū) |
:bd[elete]???????? | 關(guān)閉緩沖區(qū) |
:b[uffer]#???????? | 切換到第 # 個(gè)緩沖區(qū) |
:b[uffer] file???? | 用文件名切換緩沖區(qū) |
:ls or :buffers??? | 列出所有打開(kāi)的緩沖區(qū) |
:sp[lit] 文件名??? | 新建緩沖區(qū)打開(kāi) filename 并水平分割窗口 |
:vs[plit] 文件名?? | 新緩沖區(qū)打開(kāi) filename 并垂直分割窗口 |
:vert[ical] ba[ll] | 垂直分割窗口編輯所有緩沖區(qū) |
:tab ba[ll]??????? | 標(biāo)簽頁(yè)編輯所有緩沖區(qū) |
Ctrl + ws????????? | 水平分割窗口 |
Ctrl + wv????????? | 垂直分割窗口 |
Ctrl + ww????????? | 在窗口間切換 |
Ctrl + wq????????? | 關(guān)閉窗口 |
Ctrl + wx????????? | 當(dāng)前窗口與下一個(gè)窗口交換位置 |
Ctrl + w=????????? | 令所有窗口高 & 寬一致 |
Ctrl + wh????????? | 切換到左側(cè)窗口 |
Ctrl + wl????????? | 切換到右側(cè)窗口 |
Ctrl + wj????????? | 切換到下側(cè)窗口 |
Ctrl + wk????????? | 切換到上側(cè)窗口 |
Ctrl + wH????????? | 使游標(biāo)所在視窗全高并移至最左 (最左垂直視窗) |
Ctrl + wL????????? | 使游標(biāo)所在視窗全高并移至最右 (最右垂直視窗) |
Ctrl + wJ????????? | 使游標(biāo)所在視窗全寬并移至最下 (最下水平視窗) |
Ctrl + wK????????? | 使游標(biāo)所在視窗全寬并移至最上 (最上水平視窗) |
十三、Vim 宏
按鍵 | 說(shuō)明 |
qa | 錄制宏 a |
q? | 停止錄制宏 |
@a | 執(zhí)行宏 a |
@@ | 重新執(zhí)行上次執(zhí)行的宏 |
實(shí)例說(shuō)明:
假設(shè)文件包含以下內(nèi)容:
Hello world
My name is Vim
I am an editor
先在你想在每行末尾添加“!”號(hào)。為此,可以使用宏來(lái)錄制和重放該命令,對(duì)于多文本和內(nèi)容較多的文本操作有很大的幫助。通過(guò)以下步驟錄制宏:
- 將光標(biāo)置于第一行末尾的單詞
- 鍵入“qa”來(lái)啟動(dòng)錄制宏,并按下“A!”向光標(biāo)所在位置添加“!”號(hào)
- 按下“j”將光標(biāo)移動(dòng)到下一行
- 按下“q”停止錄制宏
錄制完宏后執(zhí)行以下命令執(zhí)行宏:
:%norm!@a
?這將應(yīng)用宏到整個(gè)文件,將“!”添加到每行的末尾。文件現(xiàn)在如下所示:
Hello world!
My name is Vim!
I am an editor!
十四、Vim 常用小技巧
14.1. 刪除重復(fù)行
:sort | %!uniq -u
14.2.?對(duì)文件中的行進(jìn)行編號(hào)
:%!cat -n
14.3.?將整個(gè)文檔復(fù)制到剪貼板
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux
14.4.?空格和制表符轉(zhuǎn)換
:set noexpandtab # 將所有空格轉(zhuǎn)換為制表符
:set expandtab # 將所有制表符轉(zhuǎn)換為空格
14.5.?保存文件前顯示差異
:w !diff % -
這個(gè)強(qiáng)烈推薦。
我們可能遇到過(guò)這樣的情況:我修改了這個(gè)文件,但是忘記都做了哪些修改了,并且我擔(dān)心其中有些地方可能修改錯(cuò)了。解決此問(wèn)題的方法是查看緩沖區(qū)和文件之間的差異。上述命令可以查看。
14.6.?顯示拼寫(xiě)錯(cuò)誤
:set spell
更多小技巧歡迎大家在評(píng)論區(qū)分享,讓我們一起努力,謝謝大家。