學習鏈接:eleon-vim基礎教程
Vim - 基礎翻屏操作
光標移動:hjkl 20j 向下移動20行,w 向后移動一個字符,b 向前移動一個字符。
Ctrl + u
向上翻半頁 UP
Ctrl + d
向下翻半頁 Down
Ctrl + f
向下翻整頁 Forward
Ctrl + b
向上翻整頁 Backward
大寫M
跳轉到屏幕中間 Middle
大寫L
跳轉到屏幕最后一行 Last Line
大寫H
跳轉到屏幕第一行 Home
Count + 大寫H
光標移動到頂部下面的count行。
Count + 大寫L
光標移動到底部上面的count行。
Ctrl + e
向下翻一行,光標不動
Ctrl + y
向上翻一行,光標不動
Vim - 編輯操作
復制:yy=Y
復制光標所在行,3yy 復制光標所在行以在內的三行, y$ 復制光標所在字符至行尾的內容。
粘貼:p P
一個是粘貼到光標或行之前,一個是之后。
刪除:dd
刪除本行,3dd
刪除光標所在行以在內的三行,D = d$
刪除光標所在字符至行尾的內容。
剪切:x
剪切當前字符,3x
剪切當前字符在內的三個字符
交換字符順序:xp
,其實就是先剪切后粘貼
合并行:大寫J
無論光標在哪里,都能把下一行的內容補到當前行尾,間隔一個空格。(在代碼整理的時候用嗎???)
替換光標處字符(單詞打錯了后很常用):rb
就可以把光標所在位置字符替換成b,Rccc
就可以把光標所在位置和其后面的倆字符都替換成b。
s
會刪除掉單個字符然后進入插入模式。 S
會刪除掉光標所在行讓后進入插入模式。
變更: cc
與S
的作用一樣。
撤銷:u
或者 U
都行,撤銷上一步。
重做: Ctrl + r
是u
作用的反向
大小寫轉換:gu + Motion
, gU + Motion
其中Motion可以是w表示轉換單詞,如果是2w就是轉換當前單詞在內的倆單詞。
重復上次修改:點“.
” 可以重復上次的命令操作。
Vim - 文本對象(常用)
Operation + type + Object 的組合
Operation: 可能是d,y, c, v
Type:只有兩種 a
和 i
,分別表示all和in
Object:可以是一堆括號{ [ ( " '
等,也可也是w
(word)s
(句子)t
(tab,html用到)
Vim - 縮進
1 手動縮進:
>>
:增加縮進
<<
:減小縮進
3>>
:當前行以下3行增加縮進,減小縮進類似。
> %
:當光標放在大括號上時有效,對當前塊進行增加縮進操作,減小縮進類似。
> i {
:為{}內的內容(不含{})增加縮進
> a {
:為包含{}在內的塊兒內內容增加縮進
2 自動縮進:
==
:對當前行自動縮進
4==
:對當前行及下面三行執行自動縮進
=i{
:對{中的內容自動縮進
=a{
:對{中的內容包括{自動縮進(常用)
=%
:當貫標在括號上時自動縮進整個塊
3 縮進格式設置:
set shiftwidth=8
設置縮進操作長度為8個空格的長度(如果tab為4個空格,則縮進就是兩個制表符,如果tab為8個空格,則縮進就是1個制表符)
set tabstop=4
設置tab的長度為4,當在命令模式下進行縮進時起作用。
set expandtab
在插入模式和命令模式都起作用,使用手動縮進插入的是空格。此時如果在插入模式下敲入tab,則插入的是空格
set noexpandtab
expandtab 的反面,使用手動縮進插入的是制表符。此時如果在插入模式下敲入tab,則插入的是制表符
上面的命令與手動自動縮進命令的配合來編寫符合原代碼規范的代碼。
set softtabstop=8
只在插入模式起作用。 注意與tabstop的不同。如果你想手動寫tab則要修改這個命令。
在檢查更改時如果要檢查自己的設置是否正確使用倆命令:
set list
顯示特殊符號,如$表示行尾,Ctrl+I表示tab制表符
set nolist
隱藏特殊符號
4 插入模式下編輯下一行時如何自動縮進:
set <自動縮進類型>
: 類型有四種,autoindent
,smartindent
, cindent
, indentexpr
;
我現在先使用cindent, 是用于c語言時的縮進格式。 我找了很長時間,網上的教程都是東拼西湊,原來學習還得需要系統,這塊東西如果光靠一個博客就搞明白的確很費精力。
Vim - 折疊-Floding
如果有不需要的代碼可以折疊起來。也可以參考手冊命令模式輸入:help folding
當前我,幾乎不咋用,只有使用vim -d 進行文件對比的時候使用。僅列在這,詳情參考vim 基礎教程
z + f + Motion
: 創建當前行至Motion為一個折疊。
count + z + F
: 創建當前行之后count行的折疊。
z + f + %
:查找光標所在的塊進行塊兒折疊。
z + o
打開折疊,z + O
遞歸打開折疊。
z + c
折疊起來,z + C
遞歸折疊起來。
z + d
刪除光標所在行折疊,z + D
遞歸刪除光標所在塊折疊。
z + E
刪除所有折疊。
Vim - Buffers 多文件(很重要)
命令模式下有如下命令,我曾苦苦找尋,如今發現vim本身就特么強大的一批了,我還裝個毛線的nvim. lvim,騎驢覓驢而已。
e + 文件名
打開并激活指定文件(e為edit)
ls, buffers, files
列出緩沖區文件,這仨命令一樣的作用
b add b.txt
向緩沖區列表添加新文件但不激活。
b d 3
刪除緩沖區編號為3的文件,d也可寫作delete, 如果刪除當前文件不需要加數字即可。
b+空格+Tab
先在命令模式輸入ls進入buffer列表,然后輸入該命令tab就可實現文件跳轉,哈哈好方便啊,我之前都打開一堆vim窗口,簡直是浪費聲明臥槽了。
bn, bp
可以切換到buffer中下一個nexp文件,上一個privious文件
b3
,buffer3
都可以切換到buffer中符號為3的文件。
b#
訪問剛剛訪問的文件,這個應該最常用了。
bf, bl
可以跳轉到buffer中第一個文件,最后一個文件
b1.txt, buffer1.txt
都可以切換到指定文件名的文件,支持tab補全。
set hidden
當寫入內容后不保存也能切換不同文件 set nohidden
作用相反。
Vim - Windows 多窗口
可以將一個窗口分隔成多個窗口,不常用,如果對比文件直接vim -d 不更方便?但是還是記錄下基本用法,以免以后用到查找。
sp + 文件名
,split的縮寫,橫向分隔窗口打開指定文件
vs + 文件名
,vertical split縮寫,縱向分隔窗口打開指定文件
Ctrl + W + Motion
Motion 可以是hjkl實現窗口切換
Ctrl + W + w
輪換窗口
Ctrl + W + +
增加窗口高度。Ctrl + W + -
減小窗口高度。
Ctrl + W + >
增加窗口寬度。Ctrl + W + <
減小窗口寬度。
Ctrl + W + Count + action
其中action可以是上面的窗口操作,比如窗口寬度增大4個格:ctrl + W + 4 + >
Ctrl + W + _
最大化窗口高度; Ctrl + W + |
最大化窗口寬度;
Ctrl + W + =
調整窗口為一致性大小。
Ctrl + W + H/J/K/L
注意motion為大寫,用于調整光標所在窗口在屏幕的位置。
Ctrl + W + q
退出當前窗口
Ctrl + W + =
除當前窗口之外全部退出,等價于on。
Vim - tabs 多標簽
vim -p 文件1 文件2
以TAB形式打開指定文件
vim -p *
以TAB形式打開當前目錄所有文件
:tabe + 文件名
以TAB形式打開新文件,常用(tab edit)
gt
或:tabn
跳到下一個tab.
gT
或:tabp
跳到上一個tab.
數字 + gt
或 :tabn + 數字
跳到指定序號的的tab
:tabl
跳到最后一個tab
:tabm + 數字
(tab move)將當前tab插入到指定數字的位置
:tabc
(tab close)
:tabo
只保留當前窗口 (tab only)
《思考 buffers Windows tabs 的關系》
之前都是先搜索怎么配置,網上找到博客一通復制粘貼,跟著人家的命令就開始用,也不知到為啥,但是最終還是被這些概念搞煩了,最后使用最簡單的vim 打開一個文件的最原始狀態。現在機緣成熟,我學到這里了,也該搞明白他們的關系了,看這個大佬博客:如何理解并正確使用 Vim 中的 Buffer、Window 和 Tab
總結:
buffers
: 為文件在內存中的緩存數據,每個文件對應內存中唯一的buffer。
Windows
: 在一個電腦屏幕大小的空間,劃分不同的小窗口,每個小窗口可以顯示一個打開的文件。可以說Windows可以規定一個窗口的布局。
tabs
:每個tab可以理解為一個電腦屏幕,每個tab里面都可以有一種窗口布局。不同tab之間的窗口沒關系。
我應該如何使用 tabs 和 buffer ?
Windows使用的很少,當我使用vim filename.c 打開一個文件,找到一個目標函數,轉到定義時此時跳到另外一個文件,此時通過:ls
可以到這個文件的buffer也被激活了,這就已經打開了多buffer.
當我要 porting 兩個不同工程的代碼時,我可以為每個工程打開一個tag。這樣可以方便的實現復制。
之前我都是使用多tag, 每個tag顯示一個文件,但是當你使用ctags工具跳轉時,tag顯示的名稱已經不是原來的文件了,會把自己搞暈。(如果能時刻顯示當前打開buffer對應的文件就好了)
Vim 寄存器
無名寄存器(Unnamed):“
(沒錯就是個雙引號)
用于保存d, c, x, s, y
操作的內容。可以通過命令行輸入:reg "
來查看無名寄存器的內容。
數字寄存器(Number): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 一共10個數字寄存器。
0號寄存器 保存y
操作的內容。
1-9 號寄存器 保存d, c
操作的內容,且保存的內容會隨著操作的進行逐漸向后搬移,1號寄存器始終保存著最新刪除的內容。
搜索寄存器:/
,當執行搜索字符后,這個寄存器保存剛剛的搜索記錄。
系統剪切板寄存器:+ 和 * 。在ubuntu中看到兩個寄存器的內容一致,都來自鼠標或鍵盤復制得到的內容。
只讀寄存器:有三個,分別為:
- 文件名寄存器:
%
- 命令寄存器:
:
- 插入文本寄存器:
.
Named - 寄存器:a-z 共26個寄存器
。比較常用,如果想要將指定內容復制到指定寄存器,需要" + 寄存器 + 操作
,其中寄存器小寫表示替換大寫表示追加,vim普通命令模式下例子:
"ayaw
:將單詞 復制 到 a 寄存器。
"byiw
:將單詞 復制 到 b 寄存器。
"Cyaw
:將單詞 追加 到 c 寄存器。
"ap
:將 a 寄存器中的內容粘貼到光標位置。
思考:這一堆寄存器什么時候用?
當我們要跨文件進行大量復制粘貼時,如果只是使用0號寄存器,我們就得來回切換文件,此時若使用vim提供的Named寄存器單次保存不同內容就可以提升編輯效率。還有就是用于存儲錄制的宏。
寄存器內容查看:reg + 寄存器名
寄存器內容操作:Count + " + 寄存器名 + 操作
舉例:3"+p
或 "+3p
都是將+寄存器中的內容粘貼到光標處重復3次。
Vim - Macro 宏(需要用寄存器存儲)
宏就是一個錄制好的一串命令,如果這個命令需要多次重復操作,你就可以錄制一個宏到指定的Named 寄存器,這樣下次就不用一個一個敲了(但是覺的還是很少用到)。
記錄宏的步驟:
開始記錄宏:q + 寄存器名
輸入宏命令
按下q
結束宏錄制
使用宏的步驟:
使用錄制的宏命令:@ + 寄存器名
使用最近一次錄制的宏命令:@@
追加宏內容:q + 大寫寄存器名
多次重復宏命令:count + @ + 寄存器名
舉例子:
比如我想要實現按下@c
來快速將本行行首添加//
注釋掉本行(想法牛逼,很實用)。
比如我想要實現按下@d
來快速將本行行尾添加;
。
Vim - Marks書簽(需要用寄存器存儲)
用到小寫和大寫兩種寄存器,每個文件內有一套小寫Named寄存器提供文件內書簽跳轉(局部跳轉),而文件之間有大寫Named寄存器可以實現文件之間書簽跳轉(全局跳轉)。
添加書簽:m + Named寄存器
清理書簽:delmarks a
可清理a書簽
查看書簽:marks + 要查看的寄存器
(此時區分小寫還是大寫)
跳轉到書簽所在行: ' + Named寄存器
(單引號)
跳轉到書簽所在行與列: ` + Named寄存器(反引號)
范式:Operation + ' + Named寄存器
(單引號)
比如:
d'a
:刪除當前光標所在行至a寄存器書簽所在行之間的內容。
y'a
:復制光標所在行至a寄存器書簽所在行之間的內容。
c'a
:刪除當前光標所在行至a寄存器書簽所在行之間的內容并進入插入模式。
思考:書簽什么時候用?
通過marks查看寄存器存儲的標簽,可見他會隨著你刪除代碼動態更新,這比較有用。
1,多文件穿梭,可能你說用buffers的命令bn就夠了,但是書簽可以更快的跳轉到目標位置,還能跟隨刪除粘貼等命令移動。
2,調試過程中,可以標記報錯位置,快速往返于代碼和日志。
Vim - 插入模式下的快捷鍵
- 進入插入模式常用的有:i, l, a, A, o, O, ea
- Ctrl + y : 插入光標之前行的內容,一直操作就可以一直復制。
- Ctrl + e : 插入光標之后行的內容,一直操作就可以一直復制。
- Ctrl + r + =:將表達式求值并插入。(會議一下:在命令模式使用“ap插入寄存器內容)
Ctrl + r + 寄存器
,將寄存器內容插入Ctrl + t
:當前行增加縮進Ctrl + d
:當前行減小縮進Ctrl + w
:刪除光標前面的單詞- Ctrl + h:刪除光標前面的字符
- Ctrl + o:切換到普通模式,完成一個命令后,重新進入插入模式。
插入模式下比較常用的操作
縮進應該比較少用,我只需要知道如何在命令模式自動管理縮進就夠了。刪除操作吧,都是退回到命令模式切換光標位置或者按上下左右切換位置,感覺都不咋用。
Vim - 視圖模式
之前我只知道Ctrl+V, 用來對那幾行前面插入注釋,但不知道為何他只能選擇一個方塊兒,后面的內容就無法選中。。。
小寫v
: 基于字符模式選擇,從光標所在字符開始選中。
大寫V
:基于行選擇,從光標所在行開始選中整行。
Ctrl + v
:基于塊,可以選中方塊兒形狀的內容。(可配合小寫o,大寫O
來快速跳轉光標位置)
gv
:選中之前選擇的內容。
小寫u大寫U
來切換文本大小寫,~
也可切換大小寫。
>
增加縮進,<
減小縮進。