summary
vim基礎
常用的設置
ps: vim的設置, 針對當前用戶的設置, 需要修改~/.vimrc, 如果沒有可以自行創建
針對所有用戶設置, 需要修改 /etc/vim/viminfo
set ts=4 |
ts是tabstop的縮寫,設TAB寬度爲4個空格。 |
set softtabstop=4 |
表示在編輯模式的時候按退格鍵的時候退回縮進的長度,當使用 expandtab 時特別有用。 |
set shiftwidth=4 |
shiftwidth 表示每一級縮進的長度,一般設置成跟 softtabstop 一樣。 |
set expandtab |
expandtab表示縮進用空格來表示,noexpandtab 則是用製表符表示一個縮進。 |
set autoindent |
autoindent自動縮進 |
set nu | nu 設置顯示行號 |
set hlsearch | 設置搜索的關鍵詞高亮 |
set list | 顯示所有的不可見字符(空格, tab, 換行符), 用來解決在Linux/Window上出現的對齊問題 |
set cursorline | 在光標所在行下劃線 |
set cursorcolumn | 顯示光標所在列對齊線 |
基礎操作:
vim 常用的模式有: 命令模式 ===>> vim txt 進入或者ESC 之後的狀態就是此模式
插入模式====>> 當處於修改文件的狀態, 就是此模式
底行模式====>> 進入命令模式後, 鍵盤輸入:在此之後可以輸入一些命令
視圖模式====>> 在命令模式下, 鍵盤輸入v, 就進入此模式
shift + a == A | 從命令模式進入插入模式, 並且光標會跳到行尾 |
shift + i == I | 從命令模式進入插入模式, 並且光標會跳到行尾 |
a | 從命令模式進入插入模式, 在當前光標位置的下一個字符插入 |
i | 從命令模式進入插入模式, 在當前光標位置的下一個字符插入 |
o | 從命令模式進入插入模式, 在當前行的下一行插入一行 |
O | 從命令模式進入插入模式, 在當前行的上一行插入一行 |
J | 將當前行的下一行合併到當前行 |
K | 跳轉到光標所在函數或命令的man手冊 |
gd | 跳到局部的變量定義處,不能跨文件 |
:r hello | 將hello文件讀入當前文件中 |
:n1,n2 w>>fox | 將n1至n2追加到fox文件中 |
:w fileName | 文件另存爲,當我們編輯了很多卻發現當前文件是read only 時候使用 |
光標的轉移:
小寫英文字母 h j k l | 分別控制光標左 下 上 右移動,也可以使用箭頭 |
Ctrl+b | 屏幕往後移動一頁 |
Ctrl+ f | 屏幕往前移動一頁 |
Ctrl+u | 屏幕往後移動半頁 |
Ctrl+d | 屏幕往前移動半頁 |
Shift+g == G | 移動到文章的最後 |
Shift+4 == $ | 移動到光標所在行的行尾 |
Shift+6 == ^ | 移動到光標所在行的行首 |
0 | 移動到光標所在行的行首 |
w | 光標跳到下個字的開頭 |
e | 光標跳到下個字的字尾 |
b | 光標回到上個字的開頭 |
gg | 進入到文本的開始 |
Shift+g == G | 進入到文本的末端 |
2g=15G | 第二行至第15行代碼格式化(重置縮進) |
zf 100 | 摺疊100 行 |
zf% | 把光標放在{或者(位置, 前後都行, 輸入zf%, 摺疊此塊代碼 |
Ctrl + g | 顯示當前文件名字 |
]] | 跳轉到函數結尾} |
[[ | 跳轉到函數開始{ |
刪除操作
- x 刪除光標所在位置字符
- X 刪除光標所在位置前一個字符
- dw 刪除光標所在位置到下一個非字母
- D 刪除光標所在位置到行末的所有字符
- dd 刪除當前行
以上操作均可以在在命令前面加數值, 就是把此操作重複N此的意思
複製操作
-
yy 粘貼當前行
-
yw 粘貼當前word
以上操作可以在命令前加數字,如10yy, 意爲複製10行到粘貼板, 同時此操作需要與p(粘貼)結合使用
3. 更復雜的非整行的複製粘貼操作:
j鍵入v 進入視圖模式, 用光標轉移操作來框選內容, 然後y(複製), 然後移動到目標位置, p 粘貼
Vim進階
1.自動推斷
在Windows 中使用vs/Qt等IDE, 會有自動推斷功能, 在vim中也可以有類似的功能:ctrl + p。
鍵入Ctrl + p 就會出現上圖的結構, 可以推斷我們自己寫的函數, 變量, 也能推斷C庫的內容, 只要包含了頭文件就可以
; 然後可以通過⬆/ctrl +p 逐條向上, 或者⬇/ctrl + n 逐條向下 跳轉到自己想要的item
ps: 根據個人的實踐, Ctrl + p 的推斷並不像Qt那麼智能, 只是根據你已經輸入的字符, 機械的匹配單詞(字符串, 只有數字和字母),對定義的結構體和類的推斷, 還是力不從心的。
2. 跳轉
在vim的使用中, 我們經常會查找某個函數或者變量, 光標就會到處跳轉,比如:
step 1: 光標在100行;
step 2: 光標在300行;
step 3: 光標在500行;
step 4: 光標在50行;
step 5: 光標在250行;
在如上場景中, 我現在到了第五步, 光標處在250行, 如果想回到第四步的位置怎麼辦呢??
Ctrl + o 閃亮登場, Ctrl + o 組合鍵可以讓光標回到上一個位置;
Ctrl + i 如果希望回到下一個位置, 則用 ctrl + i.
PS: 根據本人的實踐, Ctrl + o, Ctrl + i 的光標位置跳轉, 不記錄j/k的逐行光標移動, 記錄的是G/100G/:100/查找/gg 這幾類光標跳轉
3. 列模式:
在word 的編輯中, 如果我們需要把N行同時輸入活刪除若干列的內容, 我們可以藉助Alt 鍵的幫助, 在Vim中也可以方便的使用。
同時在N插入:
step 1:將光標移動到您想要插入的第一行第一個字符位置:
step 2:Ctrl + v 進入virtual block 模式
step 3:通過j/k上下移動光標, 至第N行
step 4:shift + i ====I, 輸入想要的內容
step 5:按兩次ESC 退出插入模式
刪除N行M列:
step 1:將光標移動到您想要插入的第一行第一個字符位置:
step 2:Ctrl + v 進入virtual block 模式
step 3:通過h/j/k/l上下左右移動光標, 至第N行M列, 框選出一個NxM的矩陣
step 4:鍵入x, 完成刪除操作
step 5:按兩次ESC 退出插入模式
4.錄製宏
在實踐中, 經常需要重複的操作, 一些簡單操作, 我們可以使用sed來搞定, 對於有一定複雜性的操作, 可以考慮用錄製宏來完成, 事半功倍,操作步驟如下:
step 1:在命令模式下依次鍵入qa,此時在左下角有一個 recording 單詞;
step 2:此時已經開始錄製了, 接下來會記錄你的所有的vim動作;
step 3:動作結束,按ESC退出插入模式, 鍵入a結束錄製, 此時一系列的動作已經保存完成,接下來就是執行已經保存了的動作;
step 5:鍵入@a執行已經保存的動作,也可以用 n@a 來連續執行n次.
5. vimdiff
在Linux中可以使用vimdiff來查看版本之間的差異:
vimdiff a.1 a.2 進入vimdiff
]+c(右方括號 + c) 跳轉到下一個不同的位置
[+c(左方括號 + c) 跳轉到上一個不同的位置
Ctrl + 兩次w 光標在對比的文件間切換
d+p 把光標所在窗口的差異改到另一個窗口(:diffput)
d+o 把光標所在窗口的差異改爲另一個窗口的(:diffget) o=obtain
z+o 打開光標下面的一個摺疊(open)
z+O 打開光標下面的所有摺疊
z+c 關閉光標下面的一個摺疊(close)
z+C 關閉光標下面的所有摺疊
:set noscrollbind 取消文件比較中的同步滾屏功能,此時移動光標, 另一個文件不會跟着上下翻頁
:diffupdate 在對比過程中, 又時候會手動的改變文件的內容, 此時需要更新一下對比的結果