1.vi/vim快捷鍵位圖
詳細可以參考:https://www.runoob.com/w3cnote/all-vim-cheatsheat.html
2.vi/vim的三種模式
基本上 vi/vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode)。 這三種模式的作用分別是:
命令模式:
用戶剛剛啟動 vi/vim,便進入了命令模式。
此狀態下敲擊鍵盤動作會被Vim識別為命令,而非輸入字符。比如我們此時按下i,並不會在界面上輸入一個字符i,i被當作了一個命令。
以下是常用的幾個命令:
- i 切換到輸入模式,以輸入字符。
- x 刪除當前光標所在處的字符。
- : 切換到底線命令模式,以在最底一行輸入命令。
若想要編輯文本:啟動Vim,進入了命令模式,按下i,切換到輸入模式。
命令模式只有一些最基本的命令,因此仍要依靠底線命令模式輸入更多命令。
輸入模式:
在命令模式下按下i,a,o等就進入了輸入模式。
在輸入模式中,可以使用以下按鍵:
- 字符按鍵以及Shift組合,輸入字符
- ENTER,回車鍵,換行
- BACK SPACE,退格鍵,刪除光標前一個字符
- DEL,刪除鍵,刪除光標后一個字符
- 方向鍵,在文本中移動光標
- HOME/END,移動光標到行首/行尾
- Page Up/Page Down,上/下翻頁
- Insert,切換光標為輸入/替換模式,光標將變成豎線/下划線
- ESC,退出輸入模式,切換到命令模式
底線命令模式:
在命令模式下按下:(英文冒號)就進入了底線命令模式。
底線命令模式可以輸入單個或多個字符的命令,可用的命令非常多。
在底線命令模式中,基本的命令有(已經省略了冒號):
- q 退出程序
- w 保存文件
按ESC鍵可隨時退出底線命令模式。
3.vi/vim打開和新建文件
(1)打開文件:vi filename
(2)打開文件並到指定行:vi filename +[n],其中n為指定行數,如果不輸入n,會到文件末尾行。
4.vi/vim的異常處理
如果vi/vim退出異常,在磁盤上可能會保存交換文件,此時輸入vi filename會有E325提示。
此時,可用ls -la命令查看到一個“.filename.swp”文件
可以輸入:recover恢復文件
再用rm .filename.swp命令刪除這個文件,再次使用vi filename就不會報錯了。如果不需要恢復直接執行rm .filename.swp命令刪除這個文件即可。
5.vi/vim命令合集
(1)命令模式切換到編輯模式:
①.插入模式
輸入i,I,o,O,a,A等任何一個字母都可以進入vi插入模式。
- i 在當前位置插入
- I 在當前行首插入
- a 在當前位置后插入
- A 在當前行尾插入
- o 在當前行之后插入一行
- O 在當前行之前插入一行
②.取代模式
輸入r和R會進入取代模式。
- r 只會取代光標所在的那一個字符一次
- R 會一直取代光標所在的文字,直到按下 ESC 為止
(2)命令模式切換到底線命令模式:
①.寫入
- :w 將編輯的數據寫入文件中
- :w! 若文件屬性為只讀時,強制寫入該文件。(能不能寫入與用戶對文件的權限有關)
②.離開
- :q 離開vi
- :q! 在vi模式下修改過文件但在離開vi時又不想保存可用
- :wq 或 :x 保存寫入或修改的數據后離開vi
- :wq! 強制保存寫入或修改的數據后離開
- ZZ 注意ZZ前面不需要輸入“:”,若文件沒有改動,則不保存離開,若檔案已經被改動過,則保存后離開
③.另存為
- :w [filename] 將文件的數據保存為 filename 這個文件
- :n1,n2 w [filename] 將 n1 行到 n2 行的數據另存為成 filename 這個文件
④.讀入其他文件的數據
- :r [filename] 在編輯的數據中,讀入另一個文件的數據。亦即將 filename 這個檔案內容加到游標所在行后面
⑤.暫時離開vi模式
- :! command 暫時離開 vi 到指令行模式下執行 command 的顯示結果
(3)命令模式
①.移動光標
上下左右移動 行內移動 行數移動 屏幕移動 程序的段落移動 程序的段落切換
- [n]h 或 鍵盤左箭頭([n]←)光標向左移動n個字符
- [n]j 或 鍵盤下箭頭([n]↓)光標向下移動n行
- [n]k 或 鍵盤上箭頭([n]↑)光標向上移動n行
- [n]l 或 鍵盤右箭頭([n]→)光標向右移動n個字符
- [n]w 向后移動n個單詞
- [n]b 向前移動n個單詞
- [n]+空格符向右移動n個字符
- 0或者Home鍵 到行首
- ^ 到行首第一個不是空白字符的位置
- $ 到行尾
- n$ 到下面n行行尾
- gg 到文件開頭
- G 到文件行尾
- [n]gg 或 [n]G 或 :n 到第n行
- [n]+enter鍵 向下移動n行
- + 到非空格符的下一行
- - 到非空格符的上一行
- Control鍵+f 屏幕向下移動一頁
- Control鍵+b 屏幕向上移動一頁
- Control鍵+d 屏幕向下移動半頁
- Control鍵+u 屏幕向上移動半頁
- Control鍵+e 向下移動一行
- Control鍵+y 向上移動一行
- H 到屏幕頂部第一個字符
- M 到屏幕中間第一個字符
- L 到屏幕底部第一個字符
- { 上一段
- } 下一段
- % 括號匹配及切換
②.搜索
- /str str表示查找的內容,查找到指定內容之后可以使用n:查找下一個,N:查找上一個
- ?str 向光標之上尋找一個字符串名稱為str的字符串
- * 向后查找當前光標所在單詞
- # 向前查找當前光標所在單詞
③.替換
- r 替換當前字符
- R 一直替換當前行光標后字符
- :%s/word1/word2/g word1替換成word2,全局替換,替換所有匹配
- :s/word1/word2/g 可視區域替換,需要先選擇要替換的范圍
- :%s/word1/word2/gc 確認替換,在替換時會有提示
- :n1,n2s/word1/word2/g n1 與 n2 為數字。在第 n1 與 n2 行之間尋找 word1 這個字符串,並將該字符串取代為 word2
- :1,$s/word1/word2/g 或 :%s/word1/word2/g 從第一行到最后一行尋找 word1 字符串,並將該字符串取代為 word2
- :s/word1/word2/ 用word2替換word1,替換當前行的第一個匹配
- :%s/word1/word2/ 用word2替換word1,替換所有行的第一個匹配
- :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 從第一行到最后一行尋找 word1 字符串,並將該字符串取代為 word2 ,且在取代前顯示提示字符給用戶確認 (confirm) 是否需要取代。y為確認替換,n為不替換,a為替換所有,q為退出替換
④.刪除
- x 或 dl 刪除光標所在字符,或者在一行當中選中的文字
- nx 刪除當前光標向后n個字符
- X 或 dh 為向前刪除一個字符
- dd 刪除光標所在一整行
- dj 刪除上一行
- dk 刪除下一行
- dw 從光標位置刪除到單詞末尾
- d} 從光標位置刪除到段落結尾
- nd 刪除當前行開始的n行
- ndd 刪除光標所在向下n行
- d1G 刪除光標所在到第一行的所有數據
- dG 刪除光標所在到最后一行的所有數據
- d$ 或 D 刪除光標所在處到該行的最后一個字符
- d0 刪除光標所在處到該行第一個字符
- kdgg 刪除當前行之前的所有行(不包括當前行)
- jdG 刪除當前行之后的所有行(不包括當前行)
- :n1,n2d 刪除n1到n2行
- :n1,$d 刪除n1行及以后所有行
- J 刪除兩行之間的空格
⑤.復制
- yy 復制游標所在那一行的所有數據
- nyy n為數字,復制光標所在的向下 n 行
- y1G 復制游標所在行到第一行的所有數據
- yG 復制游標所在行到最后一行的所有數據
- y0 復制光標所在的那個字符到該行行首的所有數據
- y$ 復制光標所在的那個字符到該行行尾的所有數據
⑥.粘貼
- p 將已復制的數據貼在光標下一行
- P 將已復制的數據貼在游標上一行!
⑦.標記與定位
- m[flag] 添加標記,flag可以是a-z或者A-Z之間的任意一個字母
- '[flag] 直接定位到flag所在位置
⑧.剪切
- 在vi中,刪除操作其實就相當於剪切操作
- 正常模式下按v(逐字)或V(逐行)進入可視模式,然后用h、j、k、l等命令移動即可選擇某些行或字符,再按d即可剪切
- ndd 剪切當前行之后的n行。利用p命令可以對剪切的內容進行粘貼
- :n1,n2d 將n1到n2行剪切。利用p命令可將剪切后的內容進行粘貼。
- :n1,n2 m n3 將第n1到n2行移動到第n3行之后。
⑨.撤銷和重做
- u 撤銷上次命令
- U 撤銷對整行的操作
- Control鍵+r 重做,即恢復撤銷的命令
⑩.重復執行和縮進
- . 重復執行前一個操作
- >> 向右增加縮進
- << 向左增加縮進
(4)可視模式
可視模式可以和移動光標命令連用,如ggVG可以選中所有內容。
- v 可視模式,從光標位置開始按照正常模式選擇文本
- V 可視行模式,選中光標經過的所有行
- Control鍵+v 可視塊模式,垂直方向選中文本