【Vim】常用總結(jié)?
簡(jiǎn)介?
image
什么是vim??
Linux下兩大編輯神器之一 vim
? Linux/Unix下使用最多的編輯器
? vi的改進(jìn)版
? 可能是最難上手的編輯器之一
為什么要學(xué)習(xí)vim??
都21世紀(jì)了,為什么還需要學(xué)習(xí)vim?
? 只要你用服務(wù)器,vim就是個(gè)必備技能
? 后端和運(yùn)維工程師必須掌握的編輯器,不然服務(wù)器上操作很尷尬
? 可以純鍵盤編輯,提升編輯效率
初識(shí)vim?
據(jù)說(shuō)Stackoverflow幫助過(guò)上百萬(wàn)開發(fā)者退出過(guò)vim!
1. 輸入vim命令進(jìn)入vim
2. 進(jìn)去之后似乎沒法輸入東西,起始默認(rèn)進(jìn)去是normal模式
3. 使用:q可以退出vim
開始編輯?
進(jìn)入編輯模式就可以像其他編輯器一樣編輯了
? 使用i(insert)進(jìn)入編輯模式,開始輸入文字
?i表示(insert),a(append),o(open a line below)
? 使用Esc可以退出編輯模式,又回到normal模式。
? 使用:wq保存退出
w(write),q(quit)
insert -> normal:使用Esc
normal -> insert:(小寫是操作字符,大寫是操作行)
?i:(insert)表示進(jìn)入insert編輯模式后,在當(dāng)前字符的前面插入
insert
?a:(append)表示進(jìn)入insert編輯模式后,在當(dāng)前字符后附加插入
append
?o:(open a line below)表示進(jìn)入insert編輯模式后,在當(dāng)前行下新啟一行插入
open a line below
?I:(insert before line)表示在當(dāng)前行的最前面插入
insert before line
?A:(append after line)表示在當(dāng)前行的最后附加插入
append after line
?O:(open a line above)表示在當(dāng)前行上新啟一行插入
append a line above
保存:
?:w:(write)寫入,保存
write
?:q:(quit)退出
quit
?:wq:(write and quit)保存并退出
write and quit
vim,為什么你有這么多模式?
怪異的vim模式?
vim和其他很多編輯器的區(qū)別在于多種模式
? 進(jìn)入vim默認(rèn)是normal(普通)模式?為什么不是編輯模式呢?
? 使用a(append)、i(insert)等進(jìn)入編輯模式
? 還有cmd命令模式和v(visual)可視化模式
為什么進(jìn)入vim不能插入-normal模式?
奇怪的是,為什么vim進(jìn)入之后不像其他編輯器一樣直接插入?
? 進(jìn)入Vim默認(rèn)是normal(普通)模式。使用Esc從插入回到普通模式
? 普通模式下可以進(jìn)行各種命令操作和移動(dòng)
? 大部分情況下你是在瀏覽而不是編輯,所以Vim默認(rèn)是normal
Insert(插入)模式?
插入模式下Vim可以直接編輯,和其他編輯器一樣
? 使用i(insert) 、a(append) 、o(open a line below)進(jìn)入插入模式
? 使用Esc退出插入模式到normal模式
Command(命令)模式?
Normal模式下輸入:之后執(zhí)行命令,比如保存退出:wq一氣呵成
? 顧名思義,執(zhí)行Vim命令,比如保存:w,退出:q
? 比如分屏::vs(vertical split),:sp(split)
? 比如使用::% s/foo/bar/g全局替換
%:表示本文件全部文本
g:表示全局替換
Visual(可視)模式?
Visual模式一般用來(lái)塊狀選擇文本(類比使用Alt+鼠標(biāo)拖動(dòng))
? Normal模式下使用v進(jìn)入visual選擇
? 使用V選擇行
? 使用ctrl+v進(jìn)行方塊選擇
vim編輯小技巧?
如何快速糾錯(cuò)(insert模式下)?
代碼就像人生,總是經(jīng)常出錯(cuò),需要我們快速修正
? 進(jìn)入Vim之后首先使用a/i/o之一進(jìn)入插入模式
?ctrl+h刪除上一個(gè)字符,ctrl+w刪除上一個(gè)單詞,ctrl+u刪除當(dāng)前行
快速切換insert和normal模式?
很多鍵盤的鍵位設(shè)置,Esc按起來(lái)不方便,不方便切換到normal
? 使用Ctrl+c代替Esc(但是可能會(huì)中斷某些插件)或者ctrl+[
?gi快速跳轉(zhuǎn)到你最后一次編輯的地方并進(jìn)入插入模式
? 在配置章節(jié)我們會(huì)講解如何映射方便的快捷鍵來(lái)替代Esc
vim快速移動(dòng)大法?
↓CloseCode↓
h # 光標(biāo)左移,同方向鍵 j # 光標(biāo)下移,同 方向鍵 k # 光標(biāo)上移,同 方向鍵 l # 光標(biāo)右移,同 方向鍵 Ctrl+e # 向上滾動(dòng)一行 Ctrl+y # 向下滾動(dòng)一行 Ctrl+u # 向上滾動(dòng)半屏 --> Move up 1/2 a screen Ctrl+d # 向下滾動(dòng)半屏 --> Move down 1/2 a screen Ctrl+f # 向下滾動(dòng)一屏 --> Move forward one full screen Ctrl+b # 向上滾動(dòng)一屏 --> Move back one full screen 0 # 跳到行首,數(shù)字 0,效用等同于 鍵 ^ # 跳到從行首開始第一個(gè)非空白字符 $ # 跳到行尾,效用等同于 鍵 gg # 跳到第一行,效用等同于 Ctrl+ G # 跳到最后一行,效用等同于 Ctrl+ NG # 跳到第 N 行,比如 10G 是移動(dòng)到第 10 行 :N # 跳到第 N 行,比如 :10 是移動(dòng)到第 10 行 10% # 移動(dòng)到文件 10% 處 N| # 移動(dòng)到當(dāng)前行的 N 列 w # 跳到下一個(gè)單詞開頭(word:標(biāo)點(diǎn)或空格分隔的單詞) W # 跳到下一個(gè)單詞開頭(Word:空格分隔的單詞) e # 跳到下一個(gè)單詞尾部(word:標(biāo)點(diǎn)或空格分隔的單詞) E # 跳到下一個(gè)單詞尾部(Word:空格分隔的單詞) b # 跳到上一個(gè)單詞開頭(word:標(biāo)點(diǎn)或空格分隔的單詞) B # 跳到上一個(gè)單詞開頭(Word:空格分隔的單詞) ge # 跳到前一個(gè)單詞結(jié)尾 ) # 向前移動(dòng)一個(gè)句子(句號(hào)分隔) ( # 向后移動(dòng)一個(gè)句子(句號(hào)分隔) } # 向前移動(dòng)一個(gè)段落(空行分隔) { # 向后移動(dòng)一個(gè)段落(空行分隔) # 移動(dòng)到下一行首個(gè)非空字符 N # 光標(biāo)向下移動(dòng) N 行 + # 移動(dòng)到下一行首個(gè)非空字符(同回車鍵) - # 移動(dòng)到上一行首個(gè)非空字符 H # 移動(dòng)到屏幕上部(H: High) M # 移動(dòng)到屏幕中部(M: Middle) L # 移動(dòng)到屏幕下部(L: Low) # 按住 Shift 按左鍵,向左移動(dòng)一個(gè)單詞# 按住 Shift 按右鍵,向右移動(dòng)一個(gè)單詞# 按住 Shift 按上鍵,向上翻頁(yè)# 按住 Shift 按下鍵,向下翻頁(yè) gm # 移動(dòng)到的行中間 gj # 光標(biāo)向下移動(dòng)一個(gè)屏幕行(忽略自動(dòng)換行) gk # 光標(biāo)向上移動(dòng)一個(gè)屏幕行(忽略自動(dòng)換行) zz # 調(diào)整光標(biāo)所在行到屏幕中央 zt # 調(diào)整光標(biāo)所在行到屏幕上部 zb # 調(diào)整光標(biāo)所在行到屏幕下部
反人類的hjkl?
眾所周知,vim normal模式使用了反人類的hjkl來(lái)移動(dòng)
? 據(jù)說(shuō)編輯器作者在編寫vim的時(shí)候鍵盤還沒流行上下左右按鍵
?h(左) ,j(下) ,k(上) ,l(右) ,移動(dòng)也不會(huì)讓手指脫離主鍵盤區(qū)
? 相信我,逼著自己使用hjkl一段時(shí)間之后,你會(huì)體會(huì)到它非常有效率
使用hjkl?
只需要幾天的適應(yīng),你就可以熟練使用hjkl來(lái)移動(dòng)
在單詞之間“飛舞”(normal模式下)?
在單詞之間移動(dòng)是我們?yōu)g覽操作中最常使用的命令
?w/W移到下一個(gè)word/WORD開頭。e/E下一個(gè)word/WORD尾
?b/B回到上一個(gè)word/WORD開頭,可以理解為backword
? word指的是以非空白符分割的單詞, WORD以空白符分割的單詞
行間搜索移動(dòng)?
同一行快速移動(dòng)的方式其實(shí)是搜索一個(gè)字符并且移動(dòng)到該字符
? 使用f{char}可以移動(dòng)到char字符上,t{char}移動(dòng)到char的前一個(gè)字符
f:(find)
t:(until)
[引用]
? 如果第一次沒搜到,可以用分號(hào)(;)/逗號(hào)(,)繼續(xù)搜該行下一個(gè)/上一個(gè)
? 大寫的F{char}表示反過(guò)來(lái)搜前面的字符
vim水平移動(dòng)?
如何快速移動(dòng)到一行的行首或者行尾呢?
?0移動(dòng)到行首第一個(gè)字符,^移動(dòng)到第一個(gè)非空白字符
^:在正則表達(dá)式中,表示行的開頭
?$移動(dòng)到行尾,g_移動(dòng)到行尾非空白字符
$:在正則表達(dá)式中,表示行的結(jié)尾
? 記住常用的0和$就可以滿足日常需求了
Vim垂直移動(dòng)?
我們還可以在句子(sentence)和段落(paragraph)間移動(dòng)(不常用)
? 使用括號(hào)()在句子間移動(dòng),你可以用:help (來(lái)查看幫助
? 使用{}在段落之間移動(dòng)
? 插件章節(jié)我們會(huì)講如何用easy-motion插件移動(dòng),這些命令就都不用記憶啦
Vim頁(yè)面移動(dòng)?
翻頁(yè)命令太多, 2/8定律,記住常見的就能滿足需求
?gg/G移動(dòng)到文件開頭和結(jié)尾,你可以使用ctrl+o快速返回
?nG移動(dòng)到文件第n行,可以配合命令使用,如dnG表示刪除到第n行
?H/M/L跳轉(zhuǎn)到屏幕的開頭(Head),中間(Middle)和結(jié)尾(Lower)
?Ctrl+u,ctrl+f上下翻頁(yè)(upword/forward)。zz把屏幕置為中間
什么是vim的text object?
↓CloseCode↓
0 # 到行首,數(shù)字 0 ^ # 到行首非空字符,可以使用 0w 代替 ^,按鍵更方便 $ # 到行尾 iw # 整個(gè)單詞 Word(不包括分隔符) aw # 整個(gè)單詞 Word(包括分隔符) iW # 整個(gè) Word(不包括分隔符) aW # 整個(gè) Word(包括分隔符) is # 整個(gè)句子 (s: sentence)(不包括分隔符) ib # 小括號(hào)內(nèi)(b: brackets) ab # 小括號(hào)內(nèi)(包含小括號(hào)本身) iB # 大括號(hào)內(nèi) aB # 大括號(hào)內(nèi)(包含大括號(hào)本身) i) # 小括號(hào)內(nèi) a) # 小括號(hào)內(nèi)(包含小括號(hào)本身) i] # 中括號(hào)內(nèi) a] # 中括號(hào)內(nèi)(包含中括號(hào)本身) i} # 大括號(hào)內(nèi) a} # 大括號(hào)內(nèi)(包含大括號(hào)本身) i' # 單引號(hào)內(nèi) a' # 單引號(hào)內(nèi)(包含單引號(hào)本身) i" # 雙引號(hào)內(nèi) a" # 雙引號(hào)內(nèi)(包含雙引號(hào)本身) 2i) # 往外兩層小括號(hào)內(nèi) 2a) # 往外兩層小括號(hào)內(nèi)(包含小括號(hào)本身) 2f) # 到第二個(gè)小括號(hào)處 2t) # 到第二個(gè)小括號(hào)前
Text Object(文本對(duì)象)?
如果你學(xué)過(guò)主流的編程語(yǔ)言,一定知道面向?qū)ο缶幊?/p>
? Vim里文本也有對(duì)象的概念,比如一個(gè)單詞,一段句子,一個(gè)段落
? 很多其他編輯器經(jīng)常只能操作單個(gè)字符來(lái)修改文本,比較低效
? 通過(guò)操作文本對(duì)象來(lái)修改要比只操作單個(gè)字符高效
文本對(duì)象:
? 單詞w(word)
? 句子s(sentence)
? 段落p(paragraph)
? 標(biāo)簽t(tag)
? 小括號(hào)b(bracket)、大括號(hào)B
文本對(duì)象操作方式?
之前我們已經(jīng)使用過(guò)文本對(duì)象了,回憶下dw(刪除一個(gè)單詞)
?[number]
? 或者
? number表示次數(shù),command是命令,d(delete),c(change),y(yank)
? text object是要操作的文本對(duì)象
通過(guò)示例來(lái)學(xué)習(xí)?
?iw表示inner word,如果鍵入viw命令,那么首先v將進(jìn)入選擇模式,然后iw將選中當(dāng)前單詞。
?aw表示around word,它不但會(huì)選中當(dāng)前單詞,還會(huì)包含當(dāng)前單詞之后的空格。
以下實(shí)例中的**[]表示作用范圍**:
?iw
This is a[test]sentence.
?aw
This is a **[test ]**sentence.
?iw
This is a[...test...]sentence.
?aw
This is a **[...test... ]**sentence.
?is
...sentence.[This is a sentence.]This...
?as
...sentence. **[This is a sentence. ]**This...
End of previous paragraph.
?ip
[This is a paragraph. It has two sentences.]
The next.
End of previous paragraph.
?ap
[This is a paragraph. It has two sentences.
]The next.
?ip
?ap
[
?i(ori)
1*([2+3])
?a(ora)
1*[(2+3)]
?i
The <**[tag]**>
?a
The[
?i{ori}
some{[code block]}
?a{ora}
some[{code block}]
?i[ori]
some [[code block]]
?a[ora]
some[[code block]]
?i"
The "[best]"
?a"
The["best"]
?i'
The '[best]'
?a'
The['best']
vim快速增刪改查命令?
數(shù)字+命令+對(duì)象表示多次執(zhí)行命令,如2dw
或者命令+數(shù)字+對(duì)象,如d2w
Vim增加字符?
增加字符就是進(jìn)入插入模式,開始敲鍵盤吧
? 進(jìn)入插入模式編輯文本
? 使用a/i/o進(jìn)入插入模式
? 還記得A/I/O是什么作用么?
↓CloseCode↓
i # 在光標(biāo)處進(jìn)入插入模式 I # 在行首進(jìn)入插入模式 a # 在光標(biāo)后進(jìn)入插入模式 A # 在行尾進(jìn)入插入模式 o # 在下一行插入新行并進(jìn)入插入模式 O # 在上一行插入新行并進(jìn)入插入模式 gi # 進(jìn)入到上一次插入模式的位置# 退出插入模式 Ctrl+[ # 退出插入模式,等價(jià)于 Esc 鍵
Vim快速刪除?
如何快速刪除一個(gè)字符或者單詞呢 ?
? Vim在normal模式下使用x快速刪除一個(gè)字符
? 使用d(delete)配合文本對(duì)象快速刪除一個(gè)單詞daw(delete around word)
dw:默認(rèn)為daw
?d和x都可以搭配數(shù)字來(lái)執(zhí)行多次
Vim快速修改?
相比刪除,更常用修改,一般是刪除之后改成我們期望的文本
? normal 模式下,常用有三個(gè),r(replace),c(change),s(substitute)
? 使用r可以替換一個(gè)字符。
? 使用s替換并進(jìn)入插入模式
? 使用c配合文本對(duì)象,我們可以快速進(jìn)行修改整個(gè)文本對(duì)象。如ci"、ciw
↓CloseCode↓
r # 替換當(dāng)前字符 R # 進(jìn)入替換模式,直至 Esc 離開 s # 替換字符(刪除光標(biāo)處字符,并進(jìn)入插入模式,前可接數(shù)量) S # 替換行(刪除當(dāng)前行,并進(jìn)入插入模式,前可接數(shù)量) cc # 改寫當(dāng)前行(刪除當(dāng)前行并進(jìn)入插入模式),同 S cw # 改寫光標(biāo)開始處的當(dāng)前單詞 ciw # 改寫光標(biāo)所處的單詞 caw # 改寫光標(biāo)所處的單詞,并且包括前后空格(如果有的話) c0 # 改寫到行首 c^ # 改寫到行首(第一個(gè)非零字符) c$ # 改寫到行末 C # 改寫到行尾(同 c$) ci" # 改寫雙引號(hào)中的內(nèi)容 ci' # 改寫單引號(hào)中的內(nèi)容 cib # 改寫小括號(hào)中的內(nèi)容 cab # 改寫小括號(hào)中的內(nèi)容(包含小括號(hào)本身) ci) # 改寫小括號(hào)中的內(nèi)容 ci] # 改寫中括號(hào)中內(nèi)容 ciB # 改寫大括號(hào)中內(nèi)容 caB # 改寫大括號(hào)中的內(nèi)容(包含大括號(hào)本身) ci} # 改寫大括號(hào)中內(nèi)容 cit # 改寫 XML tag 中的內(nèi)容 cis # 改寫當(dāng)前句子 c2w # 改寫下兩個(gè)單詞 ct( # 改寫到小括號(hào)前 x # 刪除當(dāng)前字符,前面可以接數(shù)字,3x 代表刪除三個(gè)字符 X # 向前刪除字符 dd # 刪除(剪切)當(dāng)前行,并把刪除的行存到剪貼板里 --> Delete (cut) a line d0 # 刪除(剪切)到行首 d^ # 刪除(剪切)到行首(第一個(gè)非零字符) d$ # 刪除(剪切)到行末 D # 刪除(剪切)到行末(同 d$) dw # 刪除(剪切)當(dāng)前單詞 diw # 刪除(剪切)光標(biāo)所處的單詞 daw # 刪除(剪切)光標(biāo)所處的單詞,并包含前后空格(如果有的話) di" # 刪除雙引號(hào)中的內(nèi)容 di' # 刪除單引號(hào)中的內(nèi)容 dib # 刪除小括號(hào)中的內(nèi)容 di) # 刪除小括號(hào)中的內(nèi)容 dab # 刪除小括號(hào)內(nèi)的內(nèi)容(包含小括號(hào)本身) di] # 刪除中括號(hào)中內(nèi)容 diB # 刪除大括號(hào)中內(nèi)容 di} # 刪除大括號(hào)中內(nèi)容 daB # 刪除大括號(hào)內(nèi)的內(nèi)容(包含大括號(hào)本身) dit # 刪除 XML 中 tag 中的內(nèi)容 dis # 刪除當(dāng)前句子 d2w # 刪除下兩個(gè)單詞 dt( # 刪除到小括號(hào)前 dgg # 刪除到文件頭部 dG # 刪除到文件尾部 d} # 刪除下一個(gè)段落 d{ # 刪除上一個(gè)段落 Nd # 刪除從當(dāng)前行開始的 N 行 :Nd # 刪除第 N 行 :1,10d # 刪除 1-10 行 J # 將多行合并為一行 . # 重復(fù)上一次操作 ~ # 替換大小寫 g~iw # 替換當(dāng)前單詞的大小寫 gUiw # 將單詞轉(zhuǎn)成大寫 guiw # 將當(dāng)前單詞轉(zhuǎn)成小寫 guu # 全行轉(zhuǎn)為小寫 gUU # 全行轉(zhuǎn)為大寫 << ? ? ? ? ? ? ? ? ?# 減少縮進(jìn) >> # 增加縮進(jìn) == # 自動(dòng)縮進(jìn)。當(dāng)前文件所有行自動(dòng)縮進(jìn)對(duì)齊:gg=G Ctrl+A # 增加數(shù)字 Ctrl+X # 減少數(shù)字
Vim查詢?
查詢單詞也是一個(gè)常用操作
? 使用/或者?進(jìn)行前向或者反向搜索
? 使用n/N跳轉(zhuǎn)到下一個(gè)或者上一個(gè)匹配
next
? 使用*或者#進(jìn)行當(dāng)前單詞的前向和后向匹配
*:在正則表達(dá)式中表示出現(xiàn)0次或多次。
↓CloseCode↓
/pattern # 從光標(biāo)處向文件尾搜索 pattern ?pattern # 從光標(biāo)處向文件頭搜索 pattern n # 向同一方向執(zhí)行上一次搜索 N # 向相反方向執(zhí)行上一次搜索 % # 匹配括號(hào)移動(dòng),包括 (),{},[]。結(jié)合以下兩個(gè)命令對(duì)程序員來(lái)說(shuō)是相當(dāng)強(qiáng)大(前提:需要把光標(biāo)先移到括號(hào)上) * # 向下搜索光標(biāo)所在的單詞 # # 向前搜索光標(biāo)所在的單詞 f# 向后搜索當(dāng)前行第一個(gè)為 的字符,2fv 可以找到第二個(gè) v 字符 F # 向前搜索當(dāng)前行第一個(gè)為 的字符 t # 向后搜索當(dāng)前行第一個(gè)為 的字符前 T # 向前搜索當(dāng)前行第一個(gè)為 的字符前 ; # 重復(fù)上次的字符查找命令(f/t命令) , # 反轉(zhuǎn)方向查找上次的字符查找命令(f/t命令) tx # 搜索當(dāng)前行到指定 字符串 之前 fx # 搜索當(dāng)前行到指定 字符串 之處
重復(fù)命令?
↓CloseCode↓
. # 小數(shù)點(diǎn),即重復(fù)(Dot)命令,重復(fù)執(zhí)行上一次命令 N# 重復(fù)某個(gè)命令 N 次,例如:10k,光標(biāo)上移 10 行
命令行模式?
搜索命令(如何搜索替換)?
Vim替換命令?
substitute命令允許我們查找并且替換掉文本,并且支持正則式
:[range]s(substitute)/{pattern}/{string}/[flags]
?range:表示范圍。比如:10,20表示10-20行,%表示本文件中所有的行。
?pattern:是要替換的模式,正則表達(dá)式
?string:是替換后文本
**注意:**此命令不僅能用來(lái)替換,還能用來(lái)刪除!如 刪除所有星號(hào)*,命令為:%s/*//g
替換范圍range?
你可以在命令之前設(shè)置一個(gè)范圍。以下是一些方法:
?m, n:表示范圍為從第 m 行到第 n 行
?1,:表示范圍為從第 1 行到當(dāng)前行
**注意:**第一行的行號(hào)是已知的,行號(hào)為 1;而最后一行的行號(hào)是未知的,所以我們只用給最后一行分配一個(gè)符號(hào)代表即可。
除了數(shù)字之外,還可以使用這些符號(hào)作為范圍:
?.:表示當(dāng)前行,可以省略。如.,3表示當(dāng)前行到第 3 行。
?$:表示文件中的最后一行。如3,$表示第 3 行到最后一行。
?+n:表示當(dāng)前行的后 n 行。3,+1或者3,.+1,.可以用或不用,表示第 3 行到當(dāng)前行后的 1 行。
?%:表示本文件中所有的行。
在 Vim 中,%通常表示整個(gè)文件。
示例:
?:1,5g/console/d匹配第 1 行和第 5 行之間的字符串"console"并刪除它們。
?:,5g/console/d如果逗號(hào)之前沒有地址,則從當(dāng)前行開始。它在當(dāng)前行和行 5 之間尋找字符串"console"并刪除它們。
?:3,g/console/d如果逗號(hào)后沒有地址,則以當(dāng)前行結(jié)束。它尋找第 3 行和當(dāng)前行之間的字符串"console"并刪除它們。
?:3g/console/d如果僅傳遞一個(gè)沒有逗號(hào)的地址,則它只執(zhí)行第 3 行的命令。它查看第 3 行,如果字符串"console",它將刪除它。
替換模式pattern?
請(qǐng)參照正則表達(dá)式
替換標(biāo)志位flag?
Flags有幾個(gè)常用的標(biāo)志
? 默認(rèn)為空,表示僅替換一行上的第一個(gè)匹配項(xiàng)
?g(global) 表示改變一行上的每個(gè)符合條件的匹配項(xiàng),全局范圍內(nèi)執(zhí)行
global
?c(confirm)表示確認(rèn) ,可以確認(rèn)或者拒絕修改
confirm
?n(number)報(bào)告匹配到的次數(shù)而不替換,可以用來(lái)查詢匹配次數(shù)
number::%s/xxx//gn可以查詢匹配次數(shù)
↓CloseCode↓
& Reuse the flags from the previous substitute command. Must be passed as the first flag. g Replace all matches in the line. c Ask for substitution confirmation. e Prevent error message from displaying when substitution fails. i Perform case insensitive substitution I Perform case sensitive substitution There are more flags that I do not list above. To read about all the flags, check out .:h s_flags
全局命令(如何對(duì)匹配行執(zhí)行命令)?
global命令實(shí)際上是分成兩步執(zhí)行:首先掃描[range]指定范圍內(nèi)的所有行,給匹配{pattern}的行打上標(biāo)記;然后依次對(duì)打有標(biāo)記的行執(zhí)行{command}命令,如果被標(biāo)記的行在對(duì)之前匹配行的命令操作中被刪除、移動(dòng)或合并,則其標(biāo)記自動(dòng)消失,而不對(duì)該行執(zhí)行{command}命令。{command}可以是一個(gè)ex命令,也可以是用|分隔的多個(gè)ex命令,這樣我們就可以對(duì)被標(biāo)記行,或從標(biāo)記行尋址到的行進(jìn)行多種不同的操作。
全局命令執(zhí)行步驟:
1. 掃描[range]指定范圍內(nèi)的所有行,給匹配{pattern}的行打上標(biāo)記;
2. 依次對(duì)打有標(biāo)記的行執(zhí)行{command}命令,如果被標(biāo)記的行在對(duì)之前匹配行的命令操作中被刪除、移動(dòng)或合并,則其標(biāo)記自動(dòng)消失,而不對(duì)該行執(zhí)行{command}命令。
全局命令(The Global Command)?
Vim 的全局命令用于同時(shí)在多行上運(yùn)行命令行命令。
特別注意:全局命令是對(duì)匹配的行,來(lái)進(jìn)行行操作,操作對(duì)象是整個(gè)行,而不僅僅是匹配的那一部分字符。
全局命令具有以下語(yǔ)法:
?:[range]g(global)/{pattern}/{command}
該模式匹配包含該模式的所有行,類似于 substitute 命令中的模式。該命令可以是任何命令行命令。
全局命令的工作方式是對(duì)匹配pattern的每一行執(zhí)行command命令。
反向全局命令?
要在不匹配的行上運(yùn)行全局命令,可以運(yùn)行:
?:[range]g(global)!/{pattern}/{command}
? 或:v/{pattern}/{command}
通過(guò)示例來(lái)學(xué)習(xí)?
如果你有下列表達(dá)式:
↓CloseCode↓
const one = 1; console.log("one: ", one); const two = 2; console.log("two: ", two); const three = 3; console.log("three: ", three);
要?jiǎng)h除所有包含“控制臺(tái)”的行,您可以運(yùn)行::g/console/d
結(jié)果:
↓CloseCode↓
const one = 1; const two = 2; const three = 3;
如果使用反向全局命令,則它將刪除所有不包含“console”的行
外部命令?
在Unix系統(tǒng)內(nèi)部,您會(huì)發(fā)現(xiàn)許多小型的,超專業(yè)化命令,每個(gè)命令只做一件事(而且能很好地完成)。您可以將這些命令鏈接在一起以共同解決一個(gè)復(fù)雜的問(wèn)題。如果可以從Vim內(nèi)部使用這些命令,那不是很好嗎?
答案是肯定的!在本章中,您將學(xué)習(xí)如何擴(kuò)展Vim以使其與外部命令無(wú)縫協(xié)作。
!命令?
Vim有一個(gè)!命令,可以執(zhí)行三件事:
1.將外部命令的STDOUT讀入當(dāng)前緩沖區(qū)。
2.將緩沖區(qū)的內(nèi)容作為STDIN寫入外部命令。
3.從Vim內(nèi)部執(zhí)行外部命令。
讓我們一個(gè)個(gè)認(rèn)真看一下。
將外部命令的標(biāo)準(zhǔn)輸出STDOUT讀入Vim?
將外部命令的STDOUT讀入當(dāng)前緩沖區(qū)的語(yǔ)法為:
↓CloseCode↓
:r !{cmd}
:r是Vim的讀命令。如果不帶!使用它,則可以使用它來(lái)獲取文件的內(nèi)容。如果當(dāng)前目錄中有文件file1.txt,運(yùn)行:
↓CloseCode↓
:r file1.txt
Vim會(huì)將file1.txt的內(nèi)容放入當(dāng)前緩沖區(qū)。
如果您運(yùn)行的:r命令后面跟一個(gè)!和外部命令,則該命令的輸出將插入到當(dāng)前緩沖區(qū)中。要獲取ls命令的結(jié)果,請(qǐng)運(yùn)行:
↓CloseCode↓
:r !ls
它返回類似下列的文本:
↓CloseCode↓
file1.txt file2.txt file3.txt
您可以從curl命令讀取數(shù)據(jù):
↓CloseCode↓
:r !curl -s 'https://jsonplaceholder.typicode.com/todos/1'
r命令也接受一個(gè)地址:
↓CloseCode↓
:10r !cat file1.txt
現(xiàn)在,將在第10行之后插入來(lái)自運(yùn)行cat file.txt的STDOUT。
將緩沖區(qū)內(nèi)容寫入外部命令?
:w命令除了保存文件,還可以用來(lái)將當(dāng)前緩沖區(qū)中的文本作為作為STDIN傳遞給外部命令。語(yǔ)法為:
↓CloseCode↓
:w !cmd
如果您具有以下表達(dá)式:
↓CloseCode↓
console.log("Hello Vim"); console.log("Vim is awesome");
確保在計(jì)算機(jī)中安裝了node,然后運(yùn)行:
↓CloseCode↓
:w !node
Vim將使用node執(zhí)行Javascript表達(dá)式來(lái)打印"Hello Vim"和"Vim is awesome"。
當(dāng)使用:w命令時(shí),Vim使用當(dāng)前緩沖區(qū)中的所有文本,與global命令類似(大多數(shù)命令行命令,如果不給它傳遞范圍,則僅對(duì)當(dāng)前行執(zhí)行該命令)。如果您通過(guò):w來(lái)指定地址:
↓CloseCode↓
:2w !node
"Vim"只使用第二行中的文本到node解釋器中。
:w !node和:w! node形式上區(qū)別很小,但功能上相隔千里。使用:w !node,您是將當(dāng)前緩沖區(qū)中的文本"寫入"到外部命令node中。用:w! node,則您將強(qiáng)制保存文件并將其命名為"node"。
執(zhí)行外部命令?
您可以使用bang命令從Vim內(nèi)部執(zhí)行外部命令。語(yǔ)法為:
↓CloseCode↓
:!cmd
要以長(zhǎng)格式查看當(dāng)前目錄的內(nèi)容,請(qǐng)運(yùn)行:
↓CloseCode↓
:!ls -ls
要終止在PID 3456上運(yùn)行的進(jìn)程,可以運(yùn)行:
↓CloseCode↓
:!kill -9 3456
您可以在不離開Vim的情況下運(yùn)行任何外部命令,因此您可以專注于自己的任務(wù)。
編解碼?
【Linux】Shell命令相關(guān)英文縮寫含義
? md5
? xxd
? base64
Java的.class字節(jié)碼文件?
**注意:**無(wú)論是字節(jié)碼文件也好,二進(jìn)制文件也罷,都不是給人類看的,編輯器逆向反編譯不出來(lái)是合理的。
可以使用md5來(lái)判斷是否為同一個(gè)文件
使用vim不方便看,可以下載jar下來(lái)丟到vscode里看
配合xxd查看并編輯二進(jìn)制文件?
用vim打開 test.bin,vim 的 -b 選項(xiàng)是告訴 vim 打開的是一個(gè)二進(jìn)制文件,不指定的話,會(huì)在后面加上 0x0a ,即一個(gè)換行符。
↓CloseCode↓
vim -b test.bin
在命令模式下鍵入::%!xxd
? 這里的冒號(hào):是進(jìn)入 Vim 的 command-line mode,跟一般的 Vim 指令相同,例如存檔(:w)等。
? 百分比符號(hào)%是指定 ex command-line ranges,代表整個(gè)文檔,也就是說(shuō)將整個(gè)文檔內(nèi)容都進(jìn)行轉(zhuǎn)換。
? 感嘆號(hào)!是指定 filter commands,filter command 是一個(gè)可從標(biāo)準(zhǔn)輸入讀取資料,經(jīng)過(guò)一些處理之后,輸出至標(biāo)準(zhǔn)輸出的外部指令,而這里我們使用 xxd 這一個(gè)打印 16 進(jìn)制數(shù)據(jù)的命令作為 filter command。
如果 vim 后面沒有加 -b 選項(xiàng)就會(huì)出現(xiàn)可惡的 0x0a:image 如果有 -b 選項(xiàng)就不會(huì)有這種情況:
image
過(guò)濾文本?
如果給!范圍,則可用于過(guò)濾文本。假設(shè)您有:
↓CloseCode↓
hello vim hello vim
讓我們使用tr(translate)命令將當(dāng)前行大寫。運(yùn)行:
↓CloseCode↓
:.!tr '[]' '[]'
結(jié)果:
↓CloseCode↓
HELLO VIM hello vim
命令分解:
?.!在當(dāng)前行執(zhí)行filter命令。
?!tr '[]' '[]'調(diào)用tr外部命令將所有小寫字符替換為大寫字符。
必須傳遞范圍以運(yùn)行外部命令作為過(guò)濾器。如果您嘗試在沒有.的情況下運(yùn)行上述命令(:!tr '[]' '[]'),則會(huì)看到錯(cuò)誤。
假設(shè)您需要使用awk命令刪除兩行的第二列:
↓CloseCode↓
:%!awk "{print $1}"
結(jié)果:
↓CloseCode↓
hello hello
命令分解:
?:%!在所有行(%)上執(zhí)行filter命令。
?awk "{print $1}"僅打印匹配項(xiàng)的第一列。
您可以使用管道運(yùn)算符(|)鏈接多個(gè)命令,就像在終端中一樣。假設(shè)您有一個(gè)包含這些美味早餐的文件:
↓CloseCode↓
name price chocolate pancake 10 buttermilk pancake 9 blueberry pancake 12
如果您需要根據(jù)價(jià)格對(duì)它們進(jìn)行排序,并且僅以均勻的間距顯示菜單,則可以運(yùn)行:
↓CloseCode↓
:%!awk 'NR > 1' | sort -nk 3 | column -t
結(jié)果:
↓CloseCode↓
buttermilk pancake 9 chocolate pancake 10 blueberry pancake 12
命令分解:
?:%!將過(guò)濾器應(yīng)用于所有行(%)。
?awk 'NR > 1'僅從第二行開始顯示文本。
?|鏈接下一個(gè)命令。
?sort -nk 3使用列3(k 3)中的值對(duì)數(shù)字進(jìn)行排序(n)。
?column -t以均勻的間距組織文本。
普通模式命令?
在普通模式下,Vim有一個(gè)過(guò)濾運(yùn)算符(!)。如果您有以下問(wèn)候:
↓CloseCode↓
hello vim hola vim bonjour vim salve vim
要大寫當(dāng)前行和下面的行,可以運(yùn)行:
↓CloseCode↓
!jtr '[a-z]' '[A-Z]'
命令分解:
?!j運(yùn)行常規(guī)命令過(guò)濾器運(yùn)算符(!),目標(biāo)是當(dāng)前行及其下方的行。回想一下,因?yàn)樗瞧胀J竭\(yùn)算符,所以適用語(yǔ)法規(guī)則"動(dòng)詞+名詞"。
?tr '[a-z]' '[A-Z]'將小寫字母替換為大寫字母。
filter normal命令僅適用于至少一行以上的motion或至少一行以上的文本對(duì)象。如果您嘗試運(yùn)行!iwtr'[az]''[AZ]'(在內(nèi)部單詞上執(zhí)行tr),您會(huì)發(fā)現(xiàn)它在整個(gè)行上都應(yīng)用了tr命令,而不是光標(biāo)所在的單詞。
vim如何編輯命令(如 粘貼一個(gè)命令)?
問(wèn)題速成解決方式?
怎樣在vim的命令行中拷貝,粘貼?
在vim的普通模式下,輸入:進(jìn)入命令行模式,我們可以在屏幕下方輸入我們想讓vim執(zhí)行的命令。
有時(shí)候,我們需要在命令行中執(zhí)行拷貝粘貼,例如 我們想要查找替換正文中的特殊字符,但我們又不知道怎么在命令行中輸入這個(gè)特殊字符。
查找還好說(shuō),不一定非要在命令行中輸入這個(gè)特殊字符,只要把光標(biāo)放在這個(gè)特殊字符上,按*向下查找,按#向上查找。
但是如果我們要替換這個(gè)特殊字符,就必須在命令行中輸入它了,但是又不知道怎么輸入這個(gè)特殊字符,怎么辦?
答案是拷貝粘貼,先在正文中復(fù)制這個(gè)字符,然后粘貼在命令行中。
可是怎么在命令行中實(shí)現(xiàn)粘貼呢?別急,介紹一個(gè)好東西:命令行窗口。
在正常模式下,輸入q:,就打開了命令行窗口。
命令行窗口中都是我們輸入過(guò)的命令,在這個(gè)窗口中我們可以像編輯正文一樣編輯新的命令,或修改舊的命令。
因?yàn)橄窬庉嬈胀ň彌_區(qū)一樣,自然可以拷貝粘貼了。
編輯完之后,在想要執(zhí)行的命令上按回車,就ok了。
命令執(zhí)行后,命令行窗口也自動(dòng)關(guān)閉了。
命令行窗口?
“歷史記錄”窗口顯示以前使用的命令行命令的列表,但是不能從“歷史記錄”窗口執(zhí)行該命令。若要在瀏覽時(shí)執(zhí)行命令,請(qǐng)使用命令行窗口。有三個(gè)不同的命令行窗口:
↓CloseCode↓
q: Command-line window q/ Forward search window q? Backward search window
q(quick,快速的):
?q::命令行命令編輯,可以看到所有使用過(guò)的命令的歷史記錄
?q/:向前搜索命令編輯,可以看到所有使用過(guò)的向前搜索命令的歷史記錄
?q?:向后搜索命令編輯,可以看到所有使用過(guò)的向后搜索命令的歷史記錄
運(yùn)行q:以啟動(dòng)命令行命令的命令行窗口。Vim 將在屏幕底部啟動(dòng)一個(gè)新窗口。您可以使用 Up 或 Ctrl-p 鍵向上遍歷,使用 Down 或 Ctrl-n 鍵向下遍歷。如果按下回車,Vim 將執(zhí)行該命令。若要退出命令行窗口,請(qǐng)按 Ctrl-c、 Ctrl-w c 或鍵入: quit。
類似地,要啟動(dòng)用于搜索的命令行窗口,可以運(yùn)行向前搜索的q/和向后搜索的q?。
vim復(fù)制粘貼與寄存器的使用?
Vim Normal模式復(fù)制粘貼?
初學(xué)者會(huì)感覺Vim復(fù)制粘貼比較奇怪,先從normal模式學(xué)習(xí)
? normal模式下復(fù)制粘貼分別使用y(yank)和p(put) ,剪貼d(delete)和p(put)
? 我們可以使用v(visual)命令選中所要復(fù)制的地方,然后使用p粘貼
? 配合文本對(duì)象:比如使用yiw復(fù)制一個(gè)單詞,yy復(fù)制一行
Vim里的剪貼(Cut)復(fù)制(copy)粘貼(paste)
分別是delete/yank/put
↓CloseCode↓
p # 粘貼到光標(biāo)后 P # 粘貼到光標(biāo)前 v # 進(jìn)入可視模式 y # 復(fù)制標(biāo)記內(nèi)容 V # 可視模式按行標(biāo)記 Ctrl+V # 可視模式按列標(biāo)記 y$ # 復(fù)制當(dāng)前位置到本行結(jié)束的內(nèi)容 yy # 復(fù)制當(dāng)前行 --> Yank (copy) a line Y # 復(fù)制當(dāng)前行,同 yy yiw # 復(fù)制當(dāng)前單詞 Nyy # 復(fù)制光標(biāo)下 N 行內(nèi)容 ddp # 剪切當(dāng)前行并粘貼(先刪除當(dāng)前行復(fù)制到寄存器,并粘貼) v0 # 選中當(dāng)前位置到行首 v$ # 選中當(dāng)前位置到行末 viw # 選中當(dāng)前單詞 vib # 選中小括號(hào)內(nèi)的內(nèi)容 vi) # 選中小括號(hào)內(nèi)的內(nèi)容 vi] # 選中中括號(hào)內(nèi)的內(nèi)容 viB # 選中大括號(hào)內(nèi)的內(nèi)容 vi} # 選中大括號(hào)內(nèi)的內(nèi)容 vis # 選中句子中的內(nèi)容 vab # 選中小括號(hào)內(nèi)的內(nèi)容(包含小括號(hào)本身) va) # 選中小括號(hào)內(nèi)的內(nèi)容(包含小括號(hào)本身) va] # 選中中括號(hào)內(nèi)的內(nèi)容(包含中括號(hào)本身) vaB # 選中大括號(hào)內(nèi)的內(nèi)容(包含大括號(hào)本身) va} # 選中大括號(hào)內(nèi)的內(nèi)容(包含大括號(hào)本身) :set paste # 允許粘貼模式(避免粘貼時(shí)自動(dòng)縮進(jìn)影響格式) :set nopaste # 禁止粘貼模式 "?yy # 復(fù)制當(dāng)前行到寄存器 ? ,問(wèn)號(hào)代表 0-9 的寄存器名稱 "?d3j # 刪除光標(biāo)下三行內(nèi)容,并放到寄存器 ? ,問(wèn)號(hào)代表 0-9 的寄存器名稱 "?p # 將寄存器 ? 的內(nèi)容粘貼到光標(biāo)后 "?P # 將寄存器 ? 的內(nèi)容粘貼到光標(biāo)前 :registers # 顯示所有寄存器內(nèi)容 :[range]y # 復(fù)制范圍,比如 :20,30y 是復(fù)制 20 到 30 行,:10y 是復(fù)制第十行 :[range]d # 刪除范圍,比如 :20,30d 是刪除 20 到 30 行,:10d 是刪除第十行 "_[command] # 使用 [command] 刪除內(nèi)容,并且不進(jìn)行復(fù)制(不會(huì)污染寄存器) "*[command] # 使用 [command] 復(fù)制內(nèi)容到系統(tǒng)剪貼板(需要 Vim 版本有 clipboard 支持)
Insert模式下的復(fù)制粘貼?
很多人會(huì)使用鼠標(biāo)進(jìn)行選中,然后使用ctrl+v或者cmd+v粘貼
? 這個(gè)和其他的文本編輯器差不多,但是粘貼代碼有個(gè)坑
? 很多人在vimrc中設(shè)置了autoindent ,粘貼Python代碼縮進(jìn)錯(cuò)亂
這個(gè)時(shí)候需要使用:set paste和:set nopaste解決
?Ctrl-r {register}:可以粘貼寄存器{register}中的內(nèi)容。
系統(tǒng)剪貼板寄存器為"+
什么是Vim的寄存器??
你有沒有好奇? Vim在normal模式下復(fù)制/剪貼的內(nèi)容去了哪?
? Vim里操作的是寄存器而不是系統(tǒng)剪貼板,這和其他編輯器不同
? 默認(rèn)我們使用d刪除或者y復(fù)制的內(nèi)容都放到了“無(wú)名寄存器”
? 用x刪除一個(gè)字符放到無(wú)名寄存器,然后p粘貼,可以調(diào)換倆字符
深入寄存器(register)?
Vim不使用單一剪貼板進(jìn)行剪貼、復(fù)制與粘貼,而是多組寄存器
? 通過(guò)"{register}前綴可以指定寄存器,不指定默認(rèn)用無(wú)名寄存器
? 比如使用"ayiw復(fù)制一個(gè)單詞到寄存器a中,"bdd刪除當(dāng)前行到
寄存器b中
? Vim中""表示無(wú)名寄存器,缺省使用。""p其實(shí)就等同p
其他常見寄存器?
除了有名寄存器a-z, Vim中還有一些其他常見寄存器
? 復(fù)制專用寄存器"0:使用y復(fù)制文本同時(shí)會(huì)被拷到復(fù)制寄存器0
? 系統(tǒng)剪貼板"+:可以在復(fù)制前加上"+復(fù)制到系統(tǒng)剪貼板
? 其他一些寄存器比如"%:當(dāng)前文件名,".:上次插入的文本
:set clipboard=unnamed:可以讓你直接復(fù)制粘貼系統(tǒng)剪貼板內(nèi)容
強(qiáng)大的vim宏(macro)?
從需求說(shuō)起?
從一個(gè)需求說(shuō)起,給多行url鏈接加上雙引號(hào),你會(huì)怎么做呢?
什么是Vim宏(macro)?
很多使用Vim很久的Vimer都沒用過(guò)宏
? 宏可以看成是一系列命令的集合
? 我們可以使用宏「錄制」一系列操作,然后用于「回放」
? 宏可以非常方便地把一系列命令用在多行文本上
如何使用宏?
宏的使用分為錄制和回放,是不是有種拍電影的感覺
? Vim使用q{register}來(lái)錄制,同時(shí)也是q結(jié)束錄制
quick
? 使用q{register}選擇要保存的寄存器,把錄制的命令保存其中
? 使用q結(jié)束錄制
? 使用@{register}回放寄存器中保存的一系列命令
用宏解決剛才的問(wèn)題?
現(xiàn)在你知道宏怎么用了,如何解決剛才的問(wèn)題呢?
? 先給一行加上雙引號(hào),然后再回放到其他所有行
? 我們先使用q{register}開始錄制,給一行加上雙引號(hào),之后使用q退出
? 在剩下的所有行中回放錄制的宏(使用可視模式選中,然后使用宏)
需要使用v可視模式選擇所有url,再使用:normal在命令模式下使用normal模式下的命令。
不使用宏解決剛才的問(wèn)題?
可以通過(guò)可視模式選擇所有url
可以使用:normal,在命令模式使用normal模式的命令
:normal I"
:normal A"
vim補(bǔ)全大法?
什么是補(bǔ)全??
只要手速快,補(bǔ)全什么的都是浮云
? 補(bǔ)全是根據(jù)當(dāng)前環(huán)境上下文由編輯器“猜”你想輸入的東西
? 比如補(bǔ)全一個(gè)單詞、文件名,或者代碼中的函數(shù)名、變量名等
? Vim中提供了多種補(bǔ)全功能,還可以由插件拓展功能實(shí)現(xiàn)代碼補(bǔ)全
vim中常用的補(bǔ)全?
Vim中有很多種補(bǔ)全的方式
命令 | 補(bǔ)全類型 |
|
普通關(guān)鍵字 |
|
當(dāng)前緩沖區(qū)關(guān)鍵字 |
|
包含文件關(guān)鍵字 |
|
標(biāo)簽文件關(guān)鍵字 |
|
字典查找 |
|
整行補(bǔ)全 |
|
文件名補(bǔ)全 |
|
全能(Omni)補(bǔ)全 |
常見的三種補(bǔ)全類型?
記不住不用擔(dān)心,根據(jù)筆者經(jīng)驗(yàn),最常用的就三種
? 使用ctrl+n和ctrl+p補(bǔ)全單詞
? 使用ctrl+x和ctrl+f補(bǔ)全文件名
? 使用ctrl+x和ctrl+o補(bǔ)全代碼,需要開啟文件類型檢查,安裝插件
vim多文件操作?
Buffer Window Tab?
我們先來(lái)介紹幾個(gè)多文件操作相關(guān)的概念
? Buffer是指打開的一個(gè)文件的內(nèi)存緩沖區(qū)
? 窗口是Buffer可視化的分割區(qū)域
? Tab可以組織窗口為一個(gè)工作區(qū)
Buffer?
Buffer-什么是緩沖區(qū)??
? Vim 打開一個(gè)文件后會(huì)加載文件內(nèi)容到緩沖區(qū)
? 之后的修改都是針對(duì)內(nèi)存中的緩沖區(qū),并不會(huì)直接保存到文件
? 直到我們執(zhí)行:w(write)的時(shí)候才會(huì)把修改內(nèi)容寫入到文件里
Buffer切換?
那如何在buffer之間切換呢?
? 使用:ls會(huì)列舉當(dāng)前緩沖區(qū),然后使用:b n跳轉(zhuǎn)到第n個(gè)緩沖區(qū)
?:bpre、:bnext、:bfirst、:blast
? 或者用:b buffer_name加上tab補(bǔ)全來(lái)跳轉(zhuǎn)
Window窗口?
窗口是可視化的分割區(qū)域
? 一個(gè)緩沖區(qū)可以分割成多個(gè)窗口,每個(gè)窗口也可以打開不同緩沖區(qū)
?
? 每個(gè)窗口可以繼續(xù)被無(wú)限分 割(看你屏幕是否夠大)
分割窗口示例?
窗口分割效果
如何切換窗口?
切換窗口的命令都是使用Ctrl+w(window)作為前綴
命令 | 用途 |
|
在窗口間循環(huán)切換 |
|
切換到左邊的窗口 |
|
切換到下邊的窗口 |
|
切換到上邊的窗口 |
|
切換到右邊的窗口 |
如何重排窗口??
重排窗口可以改變窗口的大小:h window-resize查看文檔
命令 | 用途 |
|
使所有窗口等寬、等高 |
|
最大化活動(dòng)窗口的高度 |
|
最大化活動(dòng)窗口的寬度 |
[N] |
把活動(dòng)窗口的高度設(shè)為[N]行 |
[N] |
把活動(dòng)窗口的寬度設(shè)為[N]列 |
Tab(標(biāo)簽頁(yè))將窗口分組?
Tab是可以容納-系列窗口的容器(:h tabpage)
? Vim的Tab和其他編輯器不太一樣,可以想象成Linux的虛擬桌面
? 比如一個(gè)Tab全用來(lái)編輯Python文件, 一個(gè)Tab全是HTML文件
? 相比窗口, Tab一般用的比較少, Tab太多管理起來(lái)也比較麻煩
Tab(標(biāo)簽頁(yè))操作?
Tab使用不多,簡(jiǎn)單了解一下常用操作就好
命令 | 用途 |
:tabe[edit] {filename} | 在新標(biāo)簽頁(yè)中打開 |
|
把當(dāng)前窗口移到一個(gè)新標(biāo)簽頁(yè) |
:tabc [close] | 關(guān)閉當(dāng)前標(biāo)簽頁(yè)及其中的所有窗口 |
:tabo [only] | 只保留活動(dòng)標(biāo)簽頁(yè),關(guān)閉所有其他標(biāo)簽頁(yè) |
Tab(標(biāo)簽頁(yè))切換操作?
如何切換不同的標(biāo)簽頁(yè),一般建立兩個(gè)就好,太多不好操作
Ex命令 | 普通模式命令 | 用途 |
:tabn[next] {N} | {N}gt | 切換到編號(hào)為{N} 的標(biāo)簽頁(yè) |
:tabn[next] | gt | 切換到下一標(biāo)簽頁(yè) |
:tabp[previous] | gT | 切換到上一標(biāo)簽頁(yè) |
vim設(shè)置?
設(shè)置文件行號(hào):set nu,取消文件行號(hào):set nonu
設(shè)置高亮:syntax on
常用操作總結(jié)?
u:undo,撤銷上次命令
ctrl + r:redo,恢復(fù)撤銷的命令
https://blog.csdn.net/NickDeCodes/article/details/129170764
vim查看壓縮文件?
↓CloseCode↓
vim javaTest.jar
然后篩選壓縮文件內(nèi)的文件,按下回車,則可進(jìn)入文件
請(qǐng)你務(wù)必,一而再,再而三,三而不竭,千次萬(wàn)次,毫不猶豫地救自己于這世間水火。
鏈接:https://www.cnblogs.com/blknemo/p/14088271.html
-
Linux
+關(guān)注
關(guān)注
87文章
11392瀏覽量
211787 -
VIM
+關(guān)注
關(guān)注
0文章
135瀏覽量
15487 -
編輯器
+關(guān)注
關(guān)注
1文章
811瀏覽量
31497
原文標(biāo)題:Vim 高效編輯技巧總結(jié):提升你的編程效率
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論