Vim 1 基本使用

前言

Vim, 上古時期的編輯器, 號稱編輯器之神. 我相信搞軟件開發的大都聽說過, 而且大多數人其實都多多少少用過 Vim. 什麼? 你沒用過? git commit 瞭解一下, Git 寫提交信息時默認的編輯器就是 Vim 啊.

提起 Vim, 很多人的第一印象是: 功能強大, 但是難學, 難用, 能用 Vim 的要麼是大牛, 要麼是在裝B… 老實說, Vim 在服務端用的比較多, 因爲默認情況下, Vim 是服務器上唯二的選擇(還有一個叫 Emacs 的上古神器), 搞客戶端/前端/遊戲/人工智能大數據開發的, 一般不怎麼用 Vim. 而且現在各種編輯器, IDE(集成開發環境) 層出不窮, 界面美觀, 功能強大, 上手容易, 而 Vim 以界面簡陋, 上手困難著稱, 這麼一對比, 選擇 Vim 的人越來越少, 對其望而生畏, 也不難理解.

但是, 我還是想寫一些關於 Vim 的文章, 一來是總結記錄我這些年來使用 Vim 的心得; 二來, Vim 其實真的是個很優秀的編輯器, 它就像一個其貌不揚卻卻充滿智慧的男人, 你越深入瞭解, 越能發現其魅力, 直到你愛上他, 離不開他(咳咳, gay 裏 gay 氣的).

聽上去我像是個忠實 Vim 粉, 隨時都要引發編輯器聖戰. 其實不是的. 我在大學期間就學習了 Vim, 到現在也有六七年了, 中間也曾換過 Notepad++, Sublime, VSCode 作爲主力編輯器, 各種 IDE 也都用過(Eclipse, AndroidStuido, JetBrains 全家桶等等), 最終我選擇了 VSCode/IDE + Vim 插件作爲主要的開發工具, 而 Vim 本身, 是我平時寫文檔, 記筆記, 簡單修改 log/配置文件的工具.

我向你推薦 Vim, 不是要你把它當作主力工具, 而是希望你能通過學習瞭解它, 學習一種高效的編輯方式, 同時你也能發現一些神奇的, 有趣的功能, 你可以在你喜歡的工具中添加 Vim 插件, 提升你的編輯效率, 這纔是重點. 另外, 這系列文章並不會教你把 Vim 打造成 IDE, 即使對於我來說, Vim 還是作爲一個文本編輯器比較合適.

Vim 下載和安裝

官網下載地址: https://www.vim.org/download.php

Windows 版本請點擊: https://ftp.nluug.nl/pub/vim/pc/gvim81.exe

注意, 下載的文件名是 “gVim81.exe”, gVim 的意思是帶圖形界面(Graphic)的 Vim, 因爲 Vim 默認是在命令行裏用的, 沒有圖形界面, 實在是太不友好了, 所以官方出了個 gVim, 有圖形界面, 相對友好一些.

PS. 我現在的電腦是 Windows, 所以以下都會以 Windows 版本的 gVim 做演示.

下載之後雙擊下一步下一步安裝就好了, 沒啥需要注意的, 安裝好會在桌面上生成三個圖標: gVim, gVim Easy, 以及 gVim Read-only, 注意, 請點擊 gVim 圖標來打開 Vim, 或者你也可以在某個文件上右鍵, 選擇"用 Vim 編輯".

打開 Vim 之後, 你會發現這玩意奇醜無比, 簡直不像21世紀的產物. 不要急, 我們先不要管界面, 先學習使用, 後面我們會慢慢地把它變好看(所以男人也得學會打扮啊).

接下來, 我們就可以學習使用 Vim 了. 我不建議你現在馬上就去看官方文檔(不然我寫這些文章還有啥意義, 大誤…), 因爲直接看文檔很容易看懵. 既然你選擇看我這系列文章, 那麼就安心看完, 之後你一定有所收穫, 並且已經掌握基本使用和進階技巧, 再去看官方文檔就會輕鬆很多.

Vim 的幾種模式

Vim 和普通的編輯器有一點非常大的區別, 或者是是本質的區別: Vim 是有不同的模式(狀態)的. 普通的編輯器, 你一打開就可以進行輸入(打字)了, 很符合直覺, 打開就會用, 就好像使用 Word 一樣. 但是 Vim 和他們不一樣, 你打開 Vim 之後, 是處於一種無法編輯的狀態中的, 這是 Vim 的普通模式, 在這種狀態下, 你是無法輸入文字的, 只能執行一些指令.

在普通模式(默認模式)下, 你可以使用 h,j,k,l 這幾個按鍵來移動光標, 這四個鍵分別代表 左,下,上,右. 如果想輸入文字, 你需要按下鍵盤上的 i 鍵, 才能進入可編輯的狀態, 即 Vim 的插入模式, 才能像使用普通編輯器一樣打字.

可以說, 正是由於 Vim 有不同的模式, 才使得 Vim 的編輯效率遠超其他編輯器. 模式是 Vim 的基礎, 這裏有必要先介紹一下 Vim 的幾種模式.

Vim 有五種模式:

  • 普通模式/默認模式: 執行 Vim 的指令, 如移動光標, 複製/刪除/粘貼文本等等, 不能進行輸入(打字).
  • 插入模式/編輯模式: 進行文本輸入(打字), 和普通編輯器一樣
  • 替換模式: 進行字符替換
  • 可視模式/選擇模式: 進行文本選擇
  • 命令模式: 在 Vim 底部最後一行中輸入命令, 按回車並執行

接下來我介紹以下如何進入/退出這幾種狀態, 我會把所有方式都列舉出來, 但是現在你只需使用最簡單的一種方式即可.

在開始之前, 請連續按幾次 Esc 鍵, 保證你處於普通模式(無論你現在在任何模式下, 按 Esc 鍵可以讓你回到普通模式).

普通模式 > 插入模式

要從普通模式進入插入模式, 最簡單的方法就是按 i 鍵, 你可以理解爲 “insert”. 按過 i 鍵之後, 你就可以打字了.

除此之外, 你還可以:

  • i/I: 在光標前面/行首插入
  • a/A: 在光標後面/行尾插入
  • o/O: 在下/上一行行首插入
  • 在插入模式下按 Ctrl-o 可進入插入-普通模式, 在此模式下可以運行一次普通模式命令, 然後就又回到插入模式.

在繼續學習之前, 請先輸入一些文本(最好是英文), 以供後續的操作使用. 另外, 如果操作過程中, 你不知道自己處於什麼模式了, 那就連續按幾次 Esc, 回到普通模式, 再繼續進行操作. 遇事不決 Esc!

普通模式 > 替換模式

在普通模式下, 按 r 鍵(小寫)可進入替換模式, 你可以理解爲"replace". 此時你再次輸入的字符, 可以替換光標處的那個字符. 如果你想連續替換多個字符, 則按 R 鍵(大寫, 即 Shift+r), 此時你的輸入會不斷地替換光標處的字符. 想退出持續替換模式, 按 Esc 即可.

除此之外, 你還可以:

  • 數字r: 將光標所在向後 n 個字符都替換掉, 例如 3rs 可以把光標向後的三個字符都替換成 s
  • 在持續替換模式中可使用 Insert 鍵在持續替換模式和插入模式中切換

普通模式 > 可視模式

在普通模式下, 按 v 鍵可進入可視模式(選擇模式), 你可以理解爲"visual". 進入可視模式後, 你可以選擇一些文本, 此時你使用 h,j,k,l 鍵, 可以改變選擇的區域, 當你選擇了一些文本後, 可以使用一些執行操作你選擇的文本, 這個後面再介紹. 要退出可視模式, 按 Esc 鍵或者 v 鍵.

除此之外, 你還可以:

  • V: 進入行選擇模式, 整行整行地進行選擇
  • Ctrl-q: 進入塊選擇模式. 在這個模式下, 你可以以"塊" 或者說 “列” 的方式選擇文本. 本來快捷鍵是 Ctrl+v, 但是在 Windows 上, Vim 會模仿 Windows 快捷鍵, Ctrl-v 是粘貼, 所以使用 Ctrl-q 進入塊選擇模式.

普通模式 > 命令模式

在普通模式下, 按 : 鍵(即 Shift+;)即可進入命令模式, 此時光標會跑到編輯器的最底部, 你可以輸入一些命令, 按回車執行, 執行完命令之後自動回到普通模式, 或者你可以直接按 Esc 回到普通模式.

其他模式 > 普通模式

任何模式下, 你都可以按 Esc 回到普通模式, 一次不行就多按幾次, 遇事不決 Esc.

OK, 現在你想一下記住這麼多模式以及進入方法, 肯定是比較困難的. 這裏說一下, Vim 不是學會的, 是用會的. 與其學怎麼操作, 不如按照教程自己多做幾次, 多用幾次自然就記住了, 不用擔心把 Vim 折騰壞了, 大不了重裝(滑稽).

普通模式

接下來我們就來學學普通模式下的一些指令. 普通模式是進入 Vim 後的默認模式, 在這種模式下, 無法輸入, 只能移動光標或對文本進行操作.

在進行下面的操作之前, 請先保證你輸入了一定量的文本(最好是英文. PS. 也別最好了, 請一定保證是英文, 中文會遇到一些小情況, 影響效果).

另外, 下面的指令非常多, 不可能背下來, 要通過"用"去記憶.

移動

  • h/j/k/l: 左/下/上/右移動, 這幾個鍵就在你的右手手指下, 很方便. h 在最左邊, 表示向左, l 在最右邊, 表示向右, j 像個向下的箭頭, 表示向下, k 則是向上. 多用用, 自然可以記住.
  • 數字h/j/k/l: 左/下/上/右移動 n 下, n 爲輸入的數字, 例如 3l 表示向右移動3次, 3j 表示向下移動三行
  • w: 移動到下一個單詞開頭. 同上, 也可以在前面加數字來重複多次, 例如
  • e: 移動到當前或下一個單詞結尾
  • ge: 移動到上一個單詞結尾
  • b: 移動到當前或上一個單詞開頭
  • f/t: 在當前行, 移動到下一個出現某字符的位置/前, 例如 fa, 光標會移動到下一個字母a的位置
  • F/T: 在當前行, 移動到上一個出現某字符的位置/前, 例如 Fa, 光標會移動到上一個字母a的位置
  • 數字f/t: 在當前行向後移動到第 n 次出現 a 的位置/前, 例如 3fa, 光標會向後移動到第三次出現字母a的位置
  • 數字F/T: 在當前行向前移動到第 n 次出現 a 的位置/前, 例如 3Fa, 光標會向前移動到第三次出現字母a的位置
  • 0/$: 光標移動到行首/行尾
  • ^: 光標移動到到非空格的行首
  • %: 在兩個匹配的符號 (, ", { 等等中切換, 光標需先移動到其中一個符號, 如果不在, 則會向後找到最近的一個
  • gg: 光標移動到第一行行首
  • G: 光標移動到最後一行行首
  • 行號G: 光標移動到對應行號行首
  • 數字%: 光標移動到指定百分比的文檔位置, 例如 80%, 光標會移動到文本的 80% 處
  • {/}: 光標移動到上一段/下一段(Paragraph)的行首
  • g;/g,: Vim 內部維護着一個編輯位置歷史, 使用這兩個指令可在編輯位置歷史中跳轉.
  • H: 光標移動到當前屏幕的最上邊(High)
  • M: 光標移動到當前屏幕的中間(Middle)
  • L: 光標移動到當前屏幕的最下邊(Low)
  • zt/zb/zz: 把當前行置爲屏幕正頂部/底部/中間
  • ``: 在兩次 非行內移動 的位置之間跳轉, 例如你現在在第一行, 使用 G 到達文件末尾, 此時按``, 就可以回到第一行, 另外注意, 這個指令只能在非行內的移動之間跳轉, 如果你的上一次移動是行內移動, 則無效
  • J: 將下一行移動到這一行末尾(合併當前行和下一行)

注意: 數字+指令表示執行多次指令, 數字一般放在指令之前, 很多指令前面都可以加數字, 這個技巧很重要.

複製/剪切/粘貼

在普通模式下, 可以進行文本的複製, 剪切和粘貼, 這裏要注意的是, 在 Vim 中, 剪切和刪除的表現效果是一樣的, 剪切或刪除的文本都會進入到 Vim 的寄存器裏(寄存器是什麼鬼, 以後會講).

  • y: 開始複製
  • yy/Y: 複製當前行
  • 數字yy: 從當前行開始, 複製多行, 例如: 3yy 表示複製三行.
  • yh/yl: 向左/向右複製一個字符, 即 y 指令後面可以跟"移動指令"
  • y0/y$: 從光標處複製到本行開頭/末尾
  • yw/ye: 複製一個單詞, 或從光標處複製到本單詞末尾
  • yt: 從光標處開始複製, 直到遇見某字符. 例如 yta, 表示從光標處開始複製, 直到遇見a, a不復制, 同理可使用 yf, yF, yT
  • yG: 從當前行開始複製直到最後一行
  • ygg: 從當前行開始複製直到第一行

  • d: 開始剪切, 之後仍留在普通模式, 其用法和 y 類似, 請自行嘗試
  • D: 從光標處開始剪切, 直到行尾
  • x: 剪切光標所在的字符, 之後仍留在普通模式
  • 數字x: 剪切從光標開始往後的 n 個字符, 之後仍留在普通模式, 例如 3x, 表示向後剪切3個字符
  • X: 剪切當前光標左邊的字符
  • 數字X: 剪切從光標開始往前的 n 個字符, 之後仍留在普通模式, 例如 3X, 表示向前剪切3個字符

  • c 開始剪切, 之後進入插入模式, 用法和 d 類似, 請自行嘗試
  • 數字c: 剪切從光標開始往後的 n 個字符, 並進入插入模式
  • C 剪切至行尾, 並進入插入模式
  • s 剪切光標所在字符, 並進入插入模式, 和 x 類似
  • S 剪切當前行, 並進入插入模式

  • p: 將複製/剪切的內容粘貼到光標後面, 如果複製/剪切的內容是整行的, 則粘貼到當前行的下面
  • P: 將複製/剪切的內容粘貼到光標前面, 如果複製/剪切的內容是整行的, 則粘貼到當前行的上面
  • 數字p/P: 粘貼多次
  • ddp: 其實就是剪切當前行再粘貼了, 但是你會發現, 當前行和下一行換位置了
  • xp: 其實就是剪切當前光標所在字符再粘貼, 但是你會發現, 兩個字符交換位置了

注意: 幾乎所有的移動, 複製, 粘貼命令前面都可以加數字, 表示重複的次數, 複製和剪切指令也幾乎都可以加上移動指令, 表示向某個方向複製/剪切.

查找

在普通模式下輸入 / , 即可對當前文件進行文本查找.

  • /xxx: 在全文中查找 xxx, 並高亮顯示, 字符 .*[]^%/?~$<> 等有特殊意義, 需要用 \ 轉義
  • ?xxx: 和 / 效果一樣, 只是查找方向反向
  • N/n: 在查找到的高亮位置之間前後切換, 前面可以加數字, 表示第n次出現的位置
  • /\\<xxx\\>: 匹配完整的單詞, 如果某單詞中只是包含 xxx, 則不會被匹配上, 由於 > 有特殊含義, 所以需要轉義, 由於 \ 也有特殊含義, 需要二次轉義…
  • #/*: 在某個單詞上使用這兩個指令, 可以移動到上一個/下一個與光標所在單詞相同的單詞上, 同時高亮所有相同單詞, 這個指令很有用

PS. Vim 會記錄已經查找過的內容, 再次查找時, 可通過上下鍵來切換之前的輸入

注意: 一個有用的命令: nohlsearch, 此命令可以取消當前的查找的高亮, 簡寫 nohl

文本操作

在普通模式下, 可以使用如下指令進行簡單的文本操作:

  • >>/<<: 當前行向右/向左縮進一個 Tab
  • 行號1 行號2 >>: 從行號1到行號2向右縮進一個 Tab
  • 行號1 行號2 <<: 從行號1到行號2向左縮進一個 Tab
  • gU/gu/g~: 將選中的內容轉化爲大/小寫/大小寫切換
  • u: u 指令可以對之前的操作進行 Undo, 即撤銷操作
  • Ctrl-r: Ctrl-r 這個快捷鍵可以對之前的操作進行 Redo, 即撤銷上次撤銷.

其他

  • .: 普通模式中按 . (即句號鍵)可以重複上次的指令, 除了 u 指令. 除此之外, 從進入插入模式開始, 到回到普通模式爲止, 這個過程中發生的所有操作 也可以使用 . 來回放. . 本質上是一個"宏"(什麼鬼, 後面會詳細講"宏").
  • ZZ: 退出當前的文件. 我在查看不可編輯的文件時, 經常用這個指令退出文件, 比如 git log.

可視模式

普通模式中按 v 鍵可進入可視模式(選擇模式), 按 Esc 或 v 退出, 選擇過程中可使用普通模式的移動指令改變選擇區域, 選擇之後可以對選擇的內容進行復制/刪除等操作.

普通模式中按 V 鍵進入整行可視化選擇, 再按 Esc/V 退出, 以"行"爲單位進行選擇.

可視模式下的一些技巧:

  • o: 在可視化選擇模式下, 使光標移動到選擇區域的另一頭
  • O: 在塊可視化選擇模式下, 使光標移動到這一行的另一頭
  • gg, 然後 vG, 就可以全選.
  • Ctrl-q: 塊可視化選擇, 其實應該是 Ctrl-v, 但是對於 Windows 的 gVim, Ctrl-v 是粘貼, 所以改爲 Ctrl-q.
  • gg, 然後 Ctrl-q(Ctrl-v), 然後按 G, 就可以選擇文本的第一列

命令模式

在普通模式下按 : 進入命令模式, 可以執行一些 Vim 命令, 也可執行系統命令.

在我這系列 Vim 的文章中, 我會將普通模式下的操作稱之爲 “指令”, 而命令模式下的操作稱之爲 “命令”, 雖然在英文中, 它們都是 “command”, 但是我這裏還是想區分開來, 以後我只要說 “指令”, 指的就是普通模式的操作, 而 “命令”, 指的就是命令模式下的操作.

常用命令

  • :w: 保存當前文件, 但不退出. 注意, 如果你是直接打開 Vim, 然後開始編輯, 你是無法直接使用 w 命令保存的, Vim 會提示你沒有文件名, 要解決這個問題, 你需要在 w 命令後面跟上一個路徑及文件名, 比如: :w d:/temp/test.txt, 這樣你才能保存當前文件. 這就好比你在其他編輯器裏新建個文件, 當你要保存時, 其他編輯器會彈一個對話框, 讓你選擇保存路徑, 只是 Vim 把這個過程命令化了.
  • :q/:q!: 退出/強制不保存退出, 在任何命令後加 ! 表示強制執行此命令.
  • :wq: 保存並退出當前文件
  • :e!: 放棄所有修改, 載入文件的初始狀態, 慎用!
  • :pwd: 顯示當前目錄
  • :行號: 定位到對應行號, 例如 :20 可定位到第20行, 和普通模式下的 20G 效果一樣.
  • 行號1,行號2 d: 刪除從行號1到行號2的內容, 例如: :3,5 d 表示刪除第3行到第5行, y 指令也同樣適用.
  • 行號1,行號2 >>: 從行號1到行號2向右縮進一個 Tab, 同理, 也可以向左縮進
  • :! shell指令: 執行 shell(dos) 指令, 例如: :! ipconfig
  • :r! shell指令: 將 shell(dos) 指令的執行結果寫到當前行的下面

PS: 在命令模式裏按上下箭頭可以切換之前輸入的命令

替換命令

在普通模式下, 按 / 可以進行查找操作, 在命令模式下, 可使用一些替換命令, 將查找到的文本的進行替換.

替換的基本表達式 [range]s/from/to/[flags], 表示將 range 範圍的 from 替換成 to, flags 表示替換範圍. 替換指令使用起來很複雜, 暫時不需要掌握.

  • :%s/aaa/bbb/g: 把全文中的所有 aaa 替換成 bbb, %s 表示全部行(range), g 表示所有匹配的(flags)
  • :s/aaa/bbb/: 把當前行的第一個 aaa 替換成 bbb, s 表示當前行(range), 不指定 flag 就只替換第一個
  • :行號1,行號2s/aaa/bbb/g: 把行號1和行號2之間的 aaa 替換成 bbb.
  • :行號1,行號2s/^/aaa/g: 把行號1和行號2之間的行前面都加上aaa(即可以使用正則, ^表示行首)
  • :行號1,行號2s/^/\/\//g: 從行號1和行號2之間的行都加上//註釋(/需要轉義)
  • :行號1,行號2s/\/\//g: 從行號1和行號2之間的行都去掉//註釋

PS. 在替換命令中 . 代表當前行, $ 表示最後一行

小結

好了, 到此爲止, Vim 的基本操作已經講完了, 我相信你已經可以打開 Vim, 進行文字編輯, 並保存文件了.

上面列出的指令命令非常多, 需要你在使用過程中慢慢記憶, 還是那句話, Vim 不是學會的, 是用會的.

Vim 教程

其實我這一系列教程就不錯. emmm… 真的, 看完之後, 你一定可以掌握 Vim 的基本使用以及進階用法, 而且我還講了一些初學者會遇到的問題, 能夠解釋很多奇怪的現象.

Vim 自帶一個交互式教程, 在 Linux/Mac 的 Vim 中, 你可以在命令模式下輸入 vimtutor 開啓這個教程, 在 Windows 下, 你可以打開 Vim 安裝目錄下的 vim81/vimtutor.bat 來開啓這個教程. 這個交互式教程會開啓一個 Vim 副本, 你可以隨便在裏面操作, 不必擔心搞壞. 教程比較精煉, 一小時左右可以學完, 掌握 Vim 的基本操作.

當然了, 如果你想看更詳細的教程, 我推薦 Vim 的官方文檔. Vim 有非常詳細的官方文檔, 文檔就是最權威的 Vim 教程. 要查看文檔, 可在命令模式下輸入 help 即可. 如果要查看某個主題的幫助文檔, 則輸入 help <主題> 即可. 看文檔的時候按 Ctrl-] 跳入某個子主題, Ctrl-t/o 跳回來.

這裏有個問題: 默認情況下文檔是英文的, 看起來還是很費勁, 這裏給出一份中文文檔:
鏈接:https://pan.baidu.com/s/1jpCwdBPHIhMNxOHWbR5KeA 提取碼:cyqf
裏面有 PDF 版本, 還有一個安裝程序, 會自動將中文文檔安裝到你的 Vim 安裝目錄下, 很貼心吧.

不過現在還是不建議你看文檔, 很容易看懵. 還是繼續把我這系列教程看完吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章