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