文章目錄
- The Missing Semester of Your CS Education 學習筆記以及一些拓展知識
- Vim編輯器
- 筆記部分
- 程序員常用的編輯器
- Vim的模式
- Vim的普通模式
- Vim的插入模式
- Vim的可視模式
- Vim的替換模式
- Vim的命令行模式
- Vim的高級功能
- 文本對象
- 宏
- 寄存器
- 緩沖區
- 標記
- 代碼折疊
- Vim的常用配置
- Vim的常用插件
- 插件的安裝和刪除
- 常用插件
- 插件的使用和配置
- 習題部分
The Missing Semester of Your CS Education 學習筆記以及一些拓展知識
以下是使用The Missing Semester of Your CS Education的個人學習筆記,方便之后翻閱
Vim編輯器
筆記部分
程序員常用的編輯器
程序員當然需要一個好的文本編輯器,在Linux下常用的三款面向程序員的文本編輯器如下:
編輯器 | 特點 | 學習曲線 |
---|---|---|
nano | 新手友好、有快捷提示、功能簡單 | 平緩 |
vim | 模式編輯、高效、高度可定制 | 陡峭 |
emacs | 非模式編輯、極高可擴展性、集成環境 | 陡峭 |
nano的使用非常簡單,這里就聊一聊vim和emacs。首先是vim的特點:
- 模式編輯: 擁有普通模式(用于移動和操作文本)、插入模式(用于輸入文本)、可視模式(用于選中文本)和命令模式(用于執行命令)等多種模式。
- 高度可定制: 用戶可以通過修改 .vimrc 配置文件和安裝大量插件來根據自己的工作流定制 Vim。
- 強大的鍵盤快捷鍵: 幾乎所有的操作都可以通過鍵盤完成,大大提高了編輯速度。
- 跨平臺: 在幾乎所有的操作系統上都可用。
vim就是一個把鍵盤輸入式的文本編輯功能做到了極致,而emacs是另一個程序員會使用的綜合工具,其特點如下:
- 極高的可擴展性: 核心是一個 Emacs Lisp 解釋器,用戶可以編寫或使用現有的 Lisp 代碼來擴展其功能。
- 非模式編輯: 與 Vim 不同,Emacs 使用 Ctrl和Alt鍵組合來進行各種操作,更接近現代的文本編輯器。
- 豐富的功能: 內置了文件管理器 (dired)、郵件客戶端 (mu4e)、日程管理 (org-mode) 等眾多功能。
綜合來看,vim是一個很純粹的文本編輯工具(這一點符合Linux哲學),而emacs則像是一個綜合環境,文本編輯只是emacs的一個主要功能。如果你追求極致的效率,選擇vim就對了。
這里再補充一下現代常用的IDE(集成開發環境)工具吧:
IDE | 特點 |
---|---|
VS Code | 宇宙級IDE,什么語言都能用,什么文本編輯的活都能干 |
JetBrains IDEA | 寫java常用 |
Pycharm | 寫python腳本常用 |
VSCodeVim工具可以將VScode和Vim結合在一起
下面就是正題,如何學習vim呢?第一就是官方教程vimtutor(直接在命令行中輸入就可以進入),并且時不時做一遍;第二就是多練,強迫自己使用vim,一個月之后就發現離不開它了。
下面是總結的一些關于vim的知識點。
Vim的模式
Vim的模式是其設計的精髓,將“輸入文本”和“編輯/操縱文本”這兩個完全不同的任務分開,讓你在執行每個任務時都有最高效的“工具集”(即鍵盤指令)。
vim主要有5種模式,即普通模式、插入模式、可視模式、替換模式和命令行模式,前三種模式最為基礎。
- 普通模式
此模式下,你的鍵盤不是用來輸入文本的,而是用來發布命令的。你可以在代碼間飛速移動、刪除、復制、粘貼和修改結構,而雙手完全不需要離開主鍵區。
打開 Vim 時默認就是這個模式。從任何其他模式按 Esc(Ctrl + [) 鍵,都可以返回到普通模式。
常見操作:
- 移動光標:h (左), j (下), k (上), l (右), w (到下一個詞首), b (到上一個詞首), gg (到文件首), G (到文件尾)。
- 編輯命令(動詞):d (刪除), c (修改), y (復制/提取)。
- 執行/撤銷:p (粘貼), u (撤銷), . (重復上一個命令)。
狀態欄指示:通常沒有任何指示,或者為空。如果你看到左下角有 – INSERT – 之類的提示,說明你不在普通模式。
- 插入模式
此模式下,你的鍵盤只用來輸入文本。
如何進入?從普通模式按以下任意鍵(這里不全):
- i (insert): 在光標前開始插入。
- a (append): 在光標后開始追加。
- I (大寫): 在當前行的行首(第一個非空字符)開始插入。
- A (大寫): 在當前行的行尾開始追加。
- o (小寫): 在當前行的下方新建一行并進入插入模式。
- O (大寫): 在當前行的上方新建一行并進入插入模式。
此狀態下一般就是進行打字操作。
在此狀態下,狀態欄左下角通常會顯示 – INSERT --。
- 可視模式
此模式用來選中文本塊,類似于用鼠標拖拽選中一段文字。
如何進入?從普通模式按以下任意鍵:
- v (小寫): 字符可視模式。光標移動經過的字符都會被選中。
- V (大寫): 行可視模式。光標移動經過的所有行都會被整行選中。
- Ctrl + v: 塊可視模式。可以選擇一個矩形文本塊,非常適合對齊或編輯表格數據。
常見操作:
- 進入可視模式并移動光標以選中區域。
- 對選中區域執行一個操作符,例如:d: 刪除選中的文本。y: 復制選中的文本。c: 修改選中的文本。>: 將選中的文本向右縮進。
狀態欄指示:左下角會顯示 – VISUAL --, – VISUAL LINE – 或 – VISUAL BLOCK --。
- 替換模式(可以視為插入模式的拓展模式)
此模式用來和插入模式類似都是編輯文本,只不過此模式下的所有操作都會覆蓋原文本。
如何進入?普通模式下按大寫R 或者 按“insert”鍵和插入模式相互轉換。
此狀態下一般就是進行打字操作。
狀態欄指示:左下角會顯示 – REPLACE --。
- 命令行模式(可以視為普通模式的拓展模式)
嚴格來說,這是普通模式的一個派生,用于執行更復雜或不常用的命令
如何進入?從普通模式按:(冒號)/(斜線)?(問號)。
常見操作:
- :w 保存文件 (write)。
- :q 退出 (quit)。
- :wq 保存并退出。
- :q! 強制退出(不保存修改)。
- :%s/old/new/g 全局查找 old 并替換為 new。
- :!ls 執行外部 shell 命令 ls。
- /char 向后搜索文本
- ?char 向前搜索文本
狀態欄指示:光標會移動到屏幕左下角,并顯示一個:(或者/和?)等待你輸入。
Vim的普通模式
Vim的普通模式是核心中的核心,是Vim之所以高效的關鍵,需要好好花時間學一學。
大家有沒有思考過,為什么vim一打開并不是插入模式而是一個不能寫東西的普通模式呢?為什么其余的所有模式的進入都依賴于普通模式呢(除了替換模式可由插入模式進入)?這背后有著程序員的一個重要習慣:一個程序員花在“思考、閱讀、導航和修改代碼”上的時間,遠比“純粹地輸入新代碼”的時間要多。
普通模式就是用來輸入文本控制命令的,很多命令都遵循這樣的語法:
[操作符][次數][移動范圍]
- 操作符:你想做什么?(例如:d 刪除, c 修改, y 復制)
- 次數:你想重復這個動作多少次?(例如:2, 3, 10)
- (移動)范圍:你想作用于哪個范圍?(例如:w 一個單詞, $ 到行尾, } 一個段落)
vim中操作符并不是必須的,只有移動范圍也可以,此時只去移動光標
普通模式的常用操作:
- 光標移動(屬于“(移動)范圍”)
- 基礎移動:h(左) j(下) k(上) l(右)
注意這里也可以使用方向鍵,但是方向鍵離鍵盤主體區比較遠,建議強迫自己使用hjkl慢慢習慣
- 單詞級移動:
w: word - 移動到下一個單詞的詞首;
b: backward - 移動到上一個單詞的詞首;
e: end of word - 移動到當前或下一個單詞的詞尾。 - 行內移動
0: 移動到當前行的第1列;
^: 移動到當前行第一個非空白字符;
$: 移動到當前行的行尾;
f{char}: find - 移動到當前行下一個 {char} 字符上。例如 f" 會跳到下一個雙引號。
t{char}: till - 移動到當前行下一個 {char} 字符的前一個位置。 - 屏幕級移動
H: High - 移動到屏幕的頂部;
M: Middle - 移動到屏幕的中間;
L: Low - 移動到屏幕的底部。 - 文件級移動(全局)
gg: 移動到文件的第1行;
G: 移動到文件的最后一行;
{N}G 或 :{N}: 移動到第 N 行。例如 10G 就是移動到第10行;
%: 在匹配的括號 (), [], {} 之間跳轉。 - 搜索移動(進入了命令行模式)
/pattern: 向下搜索 pattern
?pattern: 向上搜索 pattern。
n: 重復上一次的搜索(同方向)。
N: 重復上一次的搜索(反方向)。
- 基礎移動:h(左) j(下) k(上) l(右)
- 文本編輯(屬于“操作符”)
- 可組合操作符:
d: delete - 刪除。
- dw: 刪除一個單詞
- d$或D:刪除到行尾
- dd: 刪除整行
- d2j: 刪除當前行及下面2行(共3行)。
- di: delete inside-修改雙引號內的內容(這是 Vim 的超級特性之一!)。
c: change - 修改。它會先刪除,然后立即進入插入模式。 - cw: 修改一個單詞。
- c$或C: 修改到行尾。
- cc: 修改整行。
- ci:change inside-修改雙引號內的內容(這是 Vim 的超級特性之一!)。
y: yank - 復制(在 Vim 里叫 “yank”,可以理解為“提取”)。 - yw: 復制一個單詞。
- y$或Y: 復制到行尾。
- yy: 復制整行。
- 獨立操作符號
p: paste - 粘貼。
- p (小寫): 在光標之后粘貼。
- P (大寫): 在光標之前粘貼。
x: 刪除光標下的字符(等效于 delete)。
r{char}: replace - 將光標下的字符替換為 {char},執行后保持在普通模式。
s: substitute - 刪除光標下的字符并進入插入模式
- 可組合操作符:
- 撤銷與重復(屬于“操作符”)
u: undo - 撤銷上一步操作。
Ctrl + r: redo - 重做上一步被撤銷的操作。
. (點命令): 重復上一次的修改操作。 這是 Vim 中最強大、最能提升效率的命令之一!例如,你用 dd 刪除了一行,移動到另一行按 . 就會再次執行 dd。你用 ciw 修改了一個詞,移動到另一個詞按 . 就會再次執行 ciw。 - 模式切換
進入插入模式:i, a, o, I, A, O 等。
進入可視模式:v, V, Ctrl+v。
進入命令行模式:: / ?。
Vim的插入模式
進入插入模式
命令 | 全稱 | 具體行為 | 適用場景 |
---|---|---|---|
i | insert | 在光標前開始插入 | 在單詞中間插入字符 |
a | append | 在光標后開始追加 | 在單詞末尾添加字符 |
I | (大寫) | 在當前行的行首(第一個非空字符處)插入 | 在行首添加代碼(如 public) |
A | (大寫) | 在當前行的行尾追加 | 在行尾添加分號或注釋 |
o | open | 在當前行的下方新建一行并進入插入模式 | 在代碼塊下方添加新的一行 |
O | (大寫) | 在當前行的上方新建一行并進入插入模式 | 在代碼塊上方添加新的一行 |
s | substitute | 刪除光標下的字符,然后進入插入模式 | 替換一個字符并繼續輸入 |
S或 cc | (大寫) | 刪除整行,然后進入插入模式 | 重寫一整行代碼 |
insert | insert | 在replace模式下切換到插入模式 | 不推薦使用,因為insert鍵離主鍵區遠 |
插入模式下除了打字的操作
- 基本編輯
Backspace:刪除前一個字符,這是標準操作。
Ctrl + h:功能同 Backspace。
Ctrl + w:刪除光標前的一個單詞。這個極其常用和高效!當你打錯一個長單詞時,不必狂按退格鍵。
Ctrl + u:刪除從光標到行首的所有內容。當你發現一行開頭就寫錯了,用這個可以快速清空重來 - 自動補全
Vim 提供了相當不錯的內置補全功能。
Ctrl + n:在當前文件中向下查找匹配的單詞并補全(next)。
Ctrl + p:在當前文件中向上查找匹配的單詞并補全(previous)。 - 插入寄存器內容
你可以在不退出的情況下,粘貼之前復制過的內容。
Ctrl + r {register}:插入指定寄存器的內容。
Ctrl + r 0:插入上次復制(yank)的內容。
Ctrl + r ":插入未命名寄存器的內容(通常是上次刪除或復制的內容)。
Ctrl + r +:插入系統剪貼板的內容。 - 執行單個普通模式命令
這是從“新手”到“進階用戶”的一個重要技巧。
Ctrl + o:臨時切換到普通模式,讓你執行一個普通模式的命令,執行完畢后自動返回插入模式。
Vim的可視模式
可視模式的三種類型
-
字符可視模式 (Character-wise Visual Mode)
如何進入:在普通模式下按 v (小寫)。
選擇方式:以單個字符為單位進行選擇。你的光標經過的所有字符都會被高亮。
適用場景:這是最常用的可視模式。非常適合選擇一行中的一部分文字、幾個單詞、或者跨越多行的不完整文本。
狀態欄提示:-- VISUAL – -
行可視模式 (Line-wise Visual Mode)
如何進入:在普通模式下按 V (大寫)。
選擇方式:以整行為單位進行選擇。無論你的光標在哪一列,只要移動到另一行,整行都會被選中。
適用場景:處理代碼塊的利器。比如復制一個完整的函數、刪除一段 if 語句、或者對多行進行縮進。
狀態欄提示:-- VISUAL LINE – -
塊可視模式 (Block-wise / Columnar Visual Mode)
如何進入:在普通模式下按 Ctrl + v。
選擇方式:以矩形塊為單位進行選擇。你可以選擇文本的特定“列”,無論這些列有多長。這是普通編輯器難以做到的 Vim 超級功能之一。
適用場景:處理表格數據、給多行代碼同時添加或刪除前綴(如注釋符號)、在多行代碼的同一位置插入文本。
狀態欄提示:-- VISUAL BLOCK –
可視模式的工作流程
無論使用哪種可視模式,工作流程都驚人地一致和簡單:
- 第一步:進入并選擇 (Enter & Select)
使用 v, V, 或 Ctrl+v 進入相應的可視模式。
使用你在普通模式下學到的所有移動命令來擴大或縮小選區。是的,h,j,k,l, w,b, gg,G, f{char}, /search 等所有移動命令在這里都適用! - 第二步:執行操作 (Perform an Action)
當你對高亮選區感到滿意后,按下一個操作符鍵來對整個選區執行命令。
常用操作
按鍵 | 命令名稱 | 功能描述 |
---|---|---|
d | 或x刪除(delete) | 刪除選中的文本塊。 |
y | 復制 (yank) | 復制選中的文本塊。 |
c | 修改 (change) | 刪除選中的文本塊,并立即進入插入模式。 |
> | 向右縮進 | 將選中的所有行增加一級縮進。 |
< | 向左縮進 | 將選中的所有行減少一級縮進。 |
= | 自動縮進 | 對選中的所有行應用 Vim 的自動格式化/縮進規則。 |
u | 變小寫 | 將選中的所有英文字符變為小寫。 |
U | (大寫) | 將選中的所有英文字符變為大寫。 |
~ | 翻轉大小寫 | 將選中的所有英文字符大小寫互換。 |
J | (大寫) | 將選中的所有行合并為一行,并用空格隔開。 |
: | 執行Ex命令 | 對選區執行命令行命令。Vim 會自動填充范圍 ‘<,’>,表示“對選中的行”。例如,:‘<,’>s/old/new/g 只會在選中的行內進行替換。 |
一些特殊操作:
1.在普通模式下按 gv 即可重選擇上一次選擇的選區。
2.當你在可視模式下選擇文本時,可以用 o 鍵在選區的起點和終點之間來回切換光標。這在你選擇范圍過大或過小時,可以非常方便地從另一端進行微調。
Vim的替換模式
首先需要說一說替換模式和修改命令(c)有什么區別:
- 替換 (Replace):保持對齊,逐字覆蓋。如果新舊字符串長度不同,會留下舊字符或覆蓋到后面的字符。
- 修改 (Change):不關心對齊,先刪除指定范圍的文本,然后進入插入模式,后續文本會根據輸入內容向后推移。
替換模式的三種形式
-
單字符替換
這嚴格來說是一個普通模式命令,因為它執行完后會立即返回普通模式。
如何使用:r{char}在普通模式下,將光標移動到你想替換的那個字符上。按下 r 鍵。再按下你想要替換成的新字符 {char}。
效果:光標下的舊字符會被新字符取代,整個過程你都停留在普通模式,可以立即進行下一個操作。
適用場景:修正單個拼寫錯誤。這是它最常見的用途,效率極高。 -
連續替換模式
這是真正的“替換模式”,一旦進入,你會持續處于該模式下,直到按 Esc 退出。
如何進入:在普通模式下按 R (大寫)。
效果了你會進入替換模式,之后你輸入的每個字符都會覆蓋光標下的字符,光標向右移動。狀態欄提示:左下角會顯示 – REPLACE --。
適用場景:修改一段固定長度的字符串,例如日期、UUID、十六進制顏色碼或者格式化文本中的特定字段。 -
虛擬替換模式
這是 R 的一個增強版,解決了 R 在處理制表符(Tab)時的對齊問題。
如何進入:在普通模式下按 gR。
與 R 的區別:
R (普通替換):基于字符進行替換。一個 Tab 是一個字符,所以你輸入一個普通字符 X 就會把整個 Tab 替換掉,導致后續文本的對齊被破壞。
gR (虛擬替換):基于屏幕列寬 (screen columns) 進行替換。它會把一個 Tab 當作它實際占據的多個空格來看待。當你輸入字符時,它會用新字符和必要的空格來填充 Tab 原有的屏幕寬度,從而完美地保持視覺上的對齊。
適用場景:當你需要修改用 Tab 分隔的、嚴格對齊的列式數據時,gR 是唯一正確的選擇。
插入模式、虛擬替換和普通替換模式在按鍵使用上還是有一些其他的區別的,如下:
- Backspace: R或gR按下退格鍵,不會刪除你剛剛輸入的字符,而是會恢復被覆蓋的原始字符,并將光標向左移動一格。這是替換模式的獨特之處。
- Enter: R和插入模式一樣,會插入一個新行;gR會拿新行覆蓋舊行。
一個簡單總結:
命令 | 名稱 | 工作模式 | 核心用途 | 何時使用 |
---|---|---|---|---|
r | 單字符替換 | 普通模式下的單次命令 | 修正單個拼寫錯誤 | 90% 的替換場景 |
R | 連續替換模式 | 持續性模式 | 修改固定長度的字符串 | 修改日期、ID、常量等 |
gR | 虛擬替換模式 | 持續性模式 | 修改含Tab的對齊文本 | 處理列對齊數據 |
c | 修改命令 | 普通模式下的組合命令 | 修改可變長度的文本 | 大部分需要重寫單詞/短語的場景 |
Vim的命令行模式
Vim的命令行模式里很多命令都繼承自Vim的前身行編輯器ex,因此命令行模式下的命令也常被稱為Ex命令。
命令行模式有以下三種進入方式:
- : 冒號 最常用的入口,用于執行絕大多數 Ex 命令(保存、退出、替換、設置等)。
- / 斜杠 用于向前搜索文本。
- ? 問號 用于向后搜索文本。
其中絕大多數命令都是通過:進入的,以下是Ex命令的基本結構:
:[range] command[!] [arguments]
-
[range] - 范圍(對誰執行?)
這是 Ex 命令強大能力的關鍵。你可以精確地指定命令作用的行范圍。如果省略,通常只對當前行生效。
{N}: 第 N 行。例如 :10d 刪除第10行。
.: 當前行。
$: 文件最后一行。
%: 整個文件(等價于 1,$)。
'{mark}: 標記 mark 所在的行(例如 'a)。
‘<,’>: 上一次可視模式下選擇的范圍。這是一個超級有用的特性!當你在可視模式下選中一段文本后按 :,這個范圍會自動幫你填好。范圍組合示例:
:1,10d:刪除第1到第10行。
:.,$s/foo/bar/g:從當前行到文件末尾,替換所有 foo 為 bar。
:%s/foo/bar/g:在整個文件中替換。 -
command - 命令(做什么?)
這是具體的操作動詞。 -
[!] - 強制標志
感嘆號 ! 通常用來強制執行一個命令,忽略警告。最典型的例子就是 :q!(不保存強制退出)。 -
[arguments]-參數
命令所需要的額外信息,例如文件名、搜索模式、目標地址等。
常用命令
-
文件操作
:w (write): 保存當前文件。
:w {filename}: 將當前內容另存為 {filename}。
:wq 或 ? 保存并退出。
:q (quit): 退出。如果文件有未保存的修改,Vim 會警告你。
:q!: 強制退出,丟棄所有未保存的修改。
:e {filename} (edit): 打開或新建一個文件。
:e!: 重新加載當前文件,放棄所有修改,回到上次保存的狀態。
:ls: 列出所有打開的緩沖區(文件)。
:b{N} 或 :bnext / :bprev: 在緩沖區之間切換。
:r {filename}:將 {filename} 文件的內容讀入并插入到光標所在行的下方。 -
文本編輯與操作
:{range}d:刪除指定范圍的行。例如 :%d 刪除所有行。
:{range}y:復制指定范圍的行。
:{range}m {address}:將 {range} 指定的行移動到 {address} 指定的行下方。
示例::1,5m 10 將第1到5行移動到第10行之后。
:{range}t {address} (或 :co a.k.a copy): 將 {range} 指定的行復制到 {address} 指定的行下方。 -
搜索與替換(最強大的功能)
語法: :[range]s/{pattern}/{string}/[flags]- pattern: 你要查找的內容,支持正則表達式。
- string: 你要替換成的內容。
- flags (標志位):
- g (global): 全局替換。如果沒有 g,每行只會替換第一個匹配項。
- c (confirm): 確認。每次替換前都會詢問你 (y/n/a/q/l)。
- i (ignorecase): 忽略大小寫。
常用替換示例:
:%s/apple/orange/g: 在整個文件中,將所有的 apple 替換為 orange。
s/apple/orange/: 只替換當前行第一個 apple。
:‘<,’>s/apple/orange/gc: 在之前可視模式選中的區域內,進行交互式替換。 -
與外部 Shell 交互
:!{command}: 執行一個外部 shell 命令,并顯示其輸出。
示例::!ls -l 或 :!python -V。
:r !{command}: 執行一個外部命令,并將其輸出結果讀入到當前文件中。
示例::r !date 會將當前日期和時間插入到文件中。
:[range]!{filter}: 將指定范圍的行作為輸入,傳遞給外部程序進行過濾,然后用程序的輸出替換原文
示例::%!sort 會對整個文件內容進行排序。 -
Vim 環境設置
:set {option}: 開啟一個選項。例如 :set number 顯示行號。
:set no{option}: 關閉一個選項。例如 :set nonumber。
:set {option}={value}: 設置一個有值的選項。例如 :set tabstop=4。
:set {option}?: 查詢某個選項當前的值。
:help {topic}: 最重要的命令。用它來查詢任何你想知道的 Vim 功能。例如 :help:s。
其他技巧
- Tab 自動補全: 在命令行模式下,可以像在 shell 中一樣使用 Tab 鍵自動補全命令和文件名。
- 歷史記錄: 按下 : 后,可以使用 上/下 方向鍵來瀏覽和重新執行之前用過的命令。
- 重復上一個Ex命令: 在普通模式下,輸入 @: 可以重復執行上一次的命令行命令。
Vim的高級功能
上面所說的都是Vim的基礎功能,其實Vim還有非常多的其他特性。
文本對象
文本對象讓你能快速選中并操作由特定符號(如括號、引號)包圍的或具有特定語義的文本塊。
語法:
[操作符][i/a][對象]
- i (inner): 表示內部。例如 i" 指的是雙引號里面的內容。
- a (around/a): 表示周圍。例如 a" 指的是雙引號里面的內容加上雙引號本身。
常用文本對象:
- w: 單詞 (word)
- s: 句子 (sentence)
- p: 段落 (paragraph)
- " / ’ / `: 各種引號
- ( / ): 小括號,也用 b (block) 代替
- [ /]: 中括號
- { / }: 大括號,也用 B (Block) 代替
- t: XML/HTML 標簽 (tag)
示例:
ci": change inside " - 快速修改雙引號內的字符串。
dap: delete around paragraph - 刪除整個段落(包括段落后的空行)。
ysiw): (需要 vim-surround 插件,即you surround inside word with的縮寫 ) - 用括號把一個單詞括起來。
宏
宏可以錄制并回放一系列按鍵操作,用于處理任何重復性的、有規律的機械勞動。
宏的操作流程:
- q{register}: 按下 q 和一個寄存器名(如 a),開始錄制。狀態欄會顯示“recording @a”。
- 執行你的操作序列。
- q: 再次按下 q 停止錄制。
- @{register}: 在普通模式下按 @ 和你之前用的寄存器名(如 @a),即可回放剛才錄制的所有操作。
- @@: 重復上一次的回放。
- {N}@{register}} 執行一個宏{N}次。
這種方式特別適合需要重復工作的場景,例如:將一個 CSV 列表的每一行 apple,10 轉換成 JSON格式 {“name”: “apple”, “count”: 10},。你只需對第一行操作并錄制,然后對剩下所有行重復回放即可。
注意宏名不要使用數字
寄存器
Vim中的寄存器類似于剪切板,但功能強大得多,因為Vim有這多個獨立的剪切板。
使用方法:
在 d, y, p 等命令前加上 "{register}。
常用寄存器
- ": 未命名寄存器。默認情況下,d 和 y 的內容都存放在這里。
- 0 到 9: 數字寄存器。0 保存最近一次復制(yank)的內容,1 保存最近一次刪除的內容,2 是上上次刪除的,以此類推。當你誤刪了一段內容后,可以用 "1p 把它找回來
- + 和 *: 系統剪貼板寄存器。“+y 可以將內容復制到系統剪貼板,”+p 可以粘貼系統剪貼板的內容。這讓你能和外部程序(如瀏覽器)無縫交互。
- _: 黑洞寄存器。用 "_d 刪除內容時,它會直接消失,不會進入任何寄存器,也就不會污染你的剪貼板。
這個功能非常非常好用,尤其是代碼中有一部分總是重復時
緩沖區
想要了解什么是緩沖區,需要先明確三個概念:窗口、標簽頁與緩沖區 (Windows, Tabs & Buffers),這是新手最容易混淆的概念,但理解它至關重要。
- 緩沖區 (Buffer):你在 Vim 中打開的每一個文件都會被加載到一個緩沖區。它是在內存中的文件副本,你看不到它,但它確實存在。
- 窗口 (Window):是查看緩沖區的視口。你可以將一個屏幕分割成多個窗口(分屏),每個窗口可以顯示不同的緩沖區,或者同一個緩沖區的不同部分。
- 標簽頁 (Tab):是窗口的集合或布局(功能類似于布局而非書簽)。你可以把標簽頁想象成瀏覽器里的 Tab,每個 Tab 頁里可以有自己獨立的一套分屏(窗口)布局。
緩沖區是全局的,在所有標簽頁和窗口中共享。
常用操作
- 緩沖區相關
- :e filename 打開一個文件,Vim 就會為它創建一個緩沖區。它是文件的內存映像,你所有的修改都先發生在緩沖區里,直到你用 :w 保存,才會寫入磁盤。
- :ls: 列出所有緩沖區。列出當前所有的緩沖區。你會看到它們的編號、狀態(% 表示當前窗口的, a 表示活動的, h 表示隱藏的)和文件名。
- :b{N}: 跳轉到第 N 個緩沖區。
- :bn (bnext): 跳轉到下一個緩沖區。
- :bp (bprevious): 跳轉到上一個緩沖區。
- :bd (bdelete): 刪除(卸載) 當前緩沖區。如果緩沖區有未保存的修改,Vim 會警告你。
- 窗口操作
- Ctrl+w s (split): 水平分割當前窗口(上下)。
- Ctrl+w v (vertical): 垂直分割當前窗口(左右)。
- :new / :vnew: 打開一個水平/垂直分屏的新窗口,并創建一個新的空緩沖區。
- Ctrl+w w: 在窗口之間循環切換。
- Ctrl+w {h,j,k,l}: 向左/下/上/右切換到指定的窗口。
- Ctrl+w c 或 :close: 關閉當前窗口。
- Ctrl+w o 或 :only: 只保留當前窗口,關閉所有其他窗口。
- Ctrl+w =: 讓所有窗口的大小變得均等。
- Ctrl+w +: 增加當前窗口的高度(多一行)。
- Ctrl+w -: 減少當前窗口的高度(少一行)。
- {N} Ctrl+w +: 增加 N 行高度。例如 5 Ctrl+w +。
- Ctrl+w >: 增加當前窗口的寬度(多一列)。
- Ctrl+w <: 減少當前窗口的寬度(少一列)。
- {N} Ctrl+w >: 增加 N 列寬度。例如 10 Ctrl+w >。
- Ctrl+w _: 將當前窗口的高度最大化。
- Ctrl+w |: 將當前窗口的寬度最大化。
- 標簽操作
- :tabnew 或 :tabe {filename} (tab edit): 打開一個新的標簽頁,如果提供了文件名,就在新標簽頁的第一個窗口里打開它。
- gt 或 :tabn (tab next): 前進到下一個標簽頁。
- gT 或 :tabp (tab previous): 后退到上一個標簽頁。
- {N}gt: 跳轉到第 N 個標簽頁。例如 3gt。
- :tabc (tab close): 關閉當前標簽頁及其中的所有窗口。
- :tabo (tab only): 只保留當前標簽頁,關閉所有其他標簽頁。
- Ctrl+w T: 將當前窗口移動到一個全新的標簽頁
注意事項:
- 最重要的一點:不要把標簽頁當成文件! 關閉一個標簽頁(:tabc)并不會關閉它里面的文件(緩沖區)。那些緩沖區只是被隱藏了,它們的修改依然在內存中。
- 保存和退出:當你用 :q 退出時,Vim 會檢查所有緩沖區是否有未保存的修改,而不僅僅是當前可見的。這是 Vim 保護你數據的方式。
- 關閉窗口不等于刪除緩沖區:用 Ctrl+w c 關閉一個窗口,如果它是顯示某個緩沖區的唯一窗口,那么這個緩沖區會變成隱藏狀態 (h in :ls),而不是被刪除。要真正從內存中卸載一個文件,請使用 :bd。
標記
標記就像是文件中的書簽,可以讓你在不同位置間快速跳轉。
- m{char}: 在當前光標位置設置一個標記,{char} 是標記名(a-z)。
- `{char}: 跳轉到標記 {char} 的精確位置(行和列)。
- '{char}: 跳轉到標記 {char} 所在行的行首。
- 全局標記:用大寫字母 A-Z 設置的標記是全局的,可以讓你在不同文件之間快速跳轉。
代碼折疊
可以將代碼塊(如函數體、if 語句)暫時“折疊”起來,隱藏細節,讓你專注于代碼的整體結構。
- zc: 折疊光標下的代碼塊。
- zo: 打開(展開)光標下的折疊。
- za: 切換光標下折疊的狀態(開/關)。
:vim的標記功能、復制功能,緩存功能
最后附上幾個文章,可以參考著一起看,畢竟Vim的功能呢個實在太多,一篇文章根本總結不完,建議相互補充著看:文章1;文章2。
Vim的常用配置
想要配置Vim可以自己更改Vim的配置文件,其中系統級的配置文件是/etc/vim/vimrc,但不建議直接修改這個文件,因為這個是Vim默認的配置文件,對所有用戶生效。所以建議的方法是在家目錄下創建一個屬于自己的配置:
touch ~/.vimrc
隨后我們更改這個文件即可。
例如:
" --- 界面與體驗 ---
set number " 顯示行號
set relativenumber " 顯示相對行號(與 number 結合使用,方便跳轉)
set cursorline " 高亮當前行
set nowrap " 關閉自動換行
set scrolloff=8 " 光標上下保留8行,讓視野更開闊
set showcmd " 在右下角顯示未完成的命令
set wildmenu " 開啟命令行模式的Tab自動補全菜單
set mouse=a " 在所有模式下啟用鼠標(對新手友好)
syntax on " 開啟語法高亮" --- 縮進與制表符 ---
set tabstop=4 " 一個Tab鍵顯示為4個空格
set shiftwidth=4 " 執行縮進操作時,一次縮進4個空格
set softtabstop=4 " 按下Tab鍵時,實際插入4個空格
set expandtab " (極其重要)將Tab自動轉換為空格
" --- 智能縮進 ---
set autoindent " 開啟自動縮進
set smartindent " 開啟更智能的縮進(識別C風格語言)
filetype indent on " 根據文件類型開啟特定的縮進規則" --- 搜索設置 ---
set hlsearch " 高亮所有搜索結果
set incsearch " (增量搜索)邊輸入邊顯示匹配結果
set ignorecase " 搜索時忽略大小寫
set smartcase " (智能大小寫)如果搜索詞中包含大寫字母,則變為大小寫敏感
關于其他配置就不展示了,可根據需要自行上網搜索
這里再補充一個點,那就是有時我們更改完配置文件后希望在打開的Vim中立即生效,可以使用如下命令:
:source ~/.vimrc 或者 :so %
Vim的常用插件
和VsCode一樣,Vim有著非常豐富的插件生態。
插件的安裝和刪除
- 安裝vim-plug
打開終端,運行下面的命令來下載 plug.vim 文件
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 在配置文件中添加插件列表
打開你的配置文件(~/.vimrc),添加如下結構的代碼:
" 插件列表開始
call plug#begin()" 在這里列出你想要的所有插件
" 格式是 Plug '作者名/倉庫名'
Plug 'tpope/vim-fugitive'
Plug 'preservim/nerdcommenter'
Plug 'vim-airline/vim-airline'" 插件列表結束
call plug#end()
- 在vim中安裝插件(和刪除插件)
- 保存你的配置文件并重新打開 Vim(或者執行 :so %)。
- 在 Vim 中,執行命令 :PlugInstall。
- 你會看到一個新的分屏窗口打開,并自動從 GitHub 下載和安裝你列出的所有插件。安裝完成后,狀態會顯示為 “OK”。
- 刪除插件只需在列表中刪除那一行,然后運行 :PlugClean。
常用插件
-
UI美化
vim-airline/vim-airline: 經典選擇,讓你的底部狀態欄變得美觀且信息豐富。
ryanoasis/vim-devicons: 為你的文件樹和狀態欄添加漂亮的文件類型圖標。
主題配色:morhetz/gruvbox (復古,對眼睛友好) folke/tokyonight.nvim (現代,華麗) catppuccin/nvim (溫暖,柔和的馬卡龍色系) -
文件與項目導航
preservim/nerdtree: 經典的文件瀏覽器,在左側提供一個可交互的文件樹。
junegunn/fzf.vim (還可配合fzf二進制程序): 通用的模糊搜索工具,可以用來搜文件、搜歷史命令、搜 Git 提交記錄等等。 -
代碼編寫插件
preservim/nerdcommenter: 經典選擇,用簡單的快捷鍵(如 cc)快速注釋或取消注釋代碼行。
jiangmiao/auto-pairs: 經典選擇,輸入左括號時自動補全右括號。
片段庫: honza/vim-snippets (包含了幾乎所有語言的常用代碼片段)。引擎: UltiSnips。讓你輸入簡短的觸發詞(如 for)然后按 Tab,就能擴展成一個完整的代碼塊。 -
Git插件
- tpope/vim-fugitive: 它不是一個簡單的 Git 封裝,而是讓你用 Vim 的思維方式去操作 Git。你可以用 :G 打開 Git 狀態窗口,用 :Gblame 查看每行代碼的作者,用 :Gdiffsplit 對比差異。
- IDE插件 (LSP - Language Server Protocol)
- 這是讓 Vim/Neovim 擁有現代 IDE 功能(智能補全、定義跳轉、實時錯誤檢查、重構)的核心。一體化解決方案 : neoclide/coc.nvim (Conqueror of Completion)。它像 VS Code 一樣,將 LSP 客戶端、補全、代碼片段等功能打包好,開箱即用,配置相對簡單。
插件的使用和配置
-
閱讀文檔!:這是最重要的一步。每個插件都有自己的文檔。你可以在 Vim 中通過 :help {plugin-name} (例如 :help fugitive) 來查看它的詳細用法和配置選項。
-
配置:大多數插件通過在你的配置文件中設置全局變量來進行配置。例如,對于 nerdtree:
" 在 .vimrc 中
let g:NERDTreeShowHidden = 1 " 顯示隱藏文件
- 設置快捷鍵:為你最常用的插件功能設置快捷鍵。
" 在 .vimrc 中,用 <leader>f 打開 FZF
nnoremap <leader>f :FZF<CR>" 在 init.lua 中
vim.keymap.set('n', '<leader>f', ':FZF<CR>', { desc = 'Find files with FZF' })
進入這個網頁,可以搜索一些Vim插件的配置。
習題部分
題目一:
完成vimtutor
題目二:
配置.vimrc文件(主要是優化了一下界面并且禁用了方向鍵)
題目三:
安裝插件,雖然官網沒有使用插件管理器,但我還是這樣安裝的。
關于CtrlP:是一個非常簡單有用的模糊查找工具。關于使用和配置不再羅嗦。
題目四:
這一部分是要講xml文件轉換為json文件。
其實這一部分就是要觀察出重復部分,即“person”部分的內容,將這部分錄成宏,注意宏的最后一定要更新到一個新行。 最后講宏執行很多次(好像是幾百次)。關于People部分我們手工更改一次就好。
答案上這一部分使用了宏的嵌套,其實不用嵌套完全可以,我就是這么做的。但是對于復雜的宏功能,還是建議使用嵌套。