The Missing Semester of Your CS Education 學習筆記以及一些拓展知識(三)

文章目錄

  • 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種模式,即普通模式、插入模式、可視模式、替換模式和命令行模式,前三種模式最為基礎。

  1. 普通模式
    此模式下,你的鍵盤不是用來輸入文本的,而是用來發布命令的。你可以在代碼間飛速移動、刪除、復制、粘貼和修改結構,而雙手完全不需要離開主鍵區。

打開 Vim 時默認就是這個模式。從任何其他模式按 Esc(Ctrl + [) 鍵,都可以返回到普通模式。

常見操作:

  • 移動光標:h (左), j (下), k (上), l (右), w (到下一個詞首), b (到上一個詞首), gg (到文件首), G (到文件尾)。
  • 編輯命令(動詞):d (刪除), c (修改), y (復制/提取)。
  • 執行/撤銷:p (粘貼), u (撤銷), . (重復上一個命令)。

狀態欄指示:通常沒有任何指示,或者為空。如果你看到左下角有 – INSERT – 之類的提示,說明你不在普通模式。

  1. 插入模式
    此模式下,你的鍵盤只用來輸入文本

如何進入?從普通模式按以下任意鍵(這里不全):

  • i (insert): 在光標前開始插入。
  • a (append): 在光標后開始追加。
  • I (大寫): 在當前行的行首(第一個非空字符)開始插入。
  • A (大寫): 在當前行的行尾開始追加。
  • o (小寫): 在當前行的下方新建一行并進入插入模式。
  • O (大寫): 在當前行的上方新建一行并進入插入模式。

此狀態下一般就是進行打字操作。

在此狀態下,狀態欄左下角通常會顯示 – INSERT --。

  1. 可視模式
    此模式用來選中文本塊,類似于用鼠標拖拽選中一段文字。

如何進入?從普通模式按以下任意鍵:

  • v (小寫): 字符可視模式。光標移動經過的字符都會被選中。
  • V (大寫): 行可視模式。光標移動經過的所有行都會被整行選中。
  • Ctrl + v: 塊可視模式。可以選擇一個矩形文本塊,非常適合對齊或編輯表格數據。

常見操作:

  • 進入可視模式并移動光標以選中區域。
  • 對選中區域執行一個操作符,例如:d: 刪除選中的文本。y: 復制選中的文本。c: 修改選中的文本。>: 將選中的文本向右縮進。

狀態欄指示:左下角會顯示 – VISUAL --, – VISUAL LINE – 或 – VISUAL BLOCK --。

  1. 替換模式(可以視為插入模式的拓展模式)
    此模式用來和插入模式類似都是編輯文本,只不過此模式下的所有操作都會覆蓋原文本

如何進入?普通模式下按大寫R 或者 按“insert”鍵和插入模式相互轉換。

此狀態下一般就是進行打字操作。

狀態欄指示:左下角會顯示 – REPLACE --。

  1. 命令行模式(可以視為普通模式的拓展模式)
    嚴格來說,這是普通模式的一個派生,用于執行更復雜或不常用的命令

如何進入?從普通模式按:(冒號)/(斜線)?(問號)。

常見操作:

  • :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中操作符并不是必須的,只有移動范圍也可以,此時只去移動光標

普通模式的常用操作:

  1. 光標移動(屬于“(移動)范圍”)
    1. 基礎移動:h(左) j(下) k(上) l(右)

      注意這里也可以使用方向鍵,但是方向鍵離鍵盤主體區比較遠,建議強迫自己使用hjkl慢慢習慣

    2. 單詞級移動:
      w: word - 移動到下一個單詞的詞首;
      b: backward - 移動到上一個單詞的詞首;
      e: end of word - 移動到當前或下一個單詞的詞尾。
    3. 行內移動
      0: 移動到當前行的第1列;
      ^: 移動到當前行第一個非空白字符;
      $: 移動到當前行的行尾;
      f{char}: find - 移動到當前行下一個 {char} 字符上。例如 f" 會跳到下一個雙引號。
      t{char}: till - 移動到當前行下一個 {char} 字符的前一個位置。
    4. 屏幕級移動
      H: High - 移動到屏幕的頂部;
      M: Middle - 移動到屏幕的中間;
      L: Low - 移動到屏幕的底部。
    5. 文件級移動(全局)
      gg: 移動到文件的第1行;
      G: 移動到文件的最后一行;
      {N}G 或 :{N}: 移動到第 N 行。例如 10G 就是移動到第10行;
      %: 在匹配的括號 (), [], {} 之間跳轉。
    6. 搜索移動(進入了命令行模式)
      /pattern: 向下搜索 pattern
      ?pattern: 向上搜索 pattern。
      n: 重復上一次的搜索(同方向)。
      N: 重復上一次的搜索(反方向)。
  2. 文本編輯(屬于“操作符”)
    1. 可組合操作符:
      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: 復制整行。
    1. 獨立操作符號
      p: paste - 粘貼。
    • p (小寫): 在光標之后粘貼。
    • P (大寫): 在光標之前粘貼。
      x: 刪除光標下的字符(等效于 delete)。
      r{char}: replace - 將光標下的字符替換為 {char},執行后保持在普通模式。
      s: substitute - 刪除光標下的字符并進入插入模式
  3. 撤銷與重復(屬于“操作符”)
    u: undo - 撤銷上一步操作。
    Ctrl + r: redo - 重做上一步被撤銷的操作。
    . (點命令): 重復上一次的修改操作。 這是 Vim 中最強大、最能提升效率的命令之一!例如,你用 dd 刪除了一行,移動到另一行按 . 就會再次執行 dd。你用 ciw 修改了一個詞,移動到另一個詞按 . 就會再次執行 ciw。
  4. 模式切換
    進入插入模式:i, a, o, I, A, O 等。
    進入可視模式:v, V, Ctrl+v。
    進入命令行模式:: / ?。
Vim的插入模式

進入插入模式

命令全稱具體行為適用場景
iinsert在光標前開始插入在單詞中間插入字符
aappend在光標后開始追加在單詞末尾添加字符
I(大寫)在當前行的行首(第一個非空字符處)插入在行首添加代碼(如 public)
A(大寫)在當前行的行尾追加在行尾添加分號或注釋
oopen在當前行的下方新建一行并進入插入模式在代碼塊下方添加新的一行
O(大寫)在當前行的上方新建一行并進入插入模式在代碼塊上方添加新的一行
ssubstitute刪除光標下的字符,然后進入插入模式替換一個字符并繼續輸入
S或 cc(大寫)刪除整行,然后進入插入模式重寫一整行代碼
insertinsert在replace模式下切換到插入模式不推薦使用,因為insert鍵離主鍵區遠

插入模式下除了打字的操作

  1. 基本編輯
    Backspace:刪除前一個字符,這是標準操作。
    Ctrl + h:功能同 Backspace。
    Ctrl + w:刪除光標前的一個單詞。這個極其常用和高效!當你打錯一個長單詞時,不必狂按退格鍵。
    Ctrl + u:刪除從光標到行首的所有內容。當你發現一行開頭就寫錯了,用這個可以快速清空重來
  2. 自動補全
    Vim 提供了相當不錯的內置補全功能。
    Ctrl + n:在當前文件中向下查找匹配的單詞并補全(next)。
    Ctrl + p:在當前文件中向上查找匹配的單詞并補全(previous)。
  3. 插入寄存器內容
    你可以在不退出的情況下,粘貼之前復制過的內容。
    Ctrl + r {register}:插入指定寄存器的內容。
    Ctrl + r 0:插入上次復制(yank)的內容。
    Ctrl + r ":插入未命名寄存器的內容(通常是上次刪除或復制的內容)。
    Ctrl + r +:插入系統剪貼板的內容。
  4. 執行單個普通模式命令
    這是從“新手”到“進階用戶”的一個重要技巧。
    Ctrl + o:臨時切換到普通模式,讓你執行一個普通模式的命令,執行完畢后自動返回插入模式。
Vim的可視模式

可視模式的三種類型

  1. 字符可視模式 (Character-wise Visual Mode)
    如何進入:在普通模式下按 v (小寫)。
    選擇方式:以單個字符為單位進行選擇。你的光標經過的所有字符都會被高亮。
    適用場景:這是最常用的可視模式。非常適合選擇一行中的一部分文字、幾個單詞、或者跨越多行的不完整文本。
    狀態欄提示:-- VISUAL –

  2. 行可視模式 (Line-wise Visual Mode)
    如何進入:在普通模式下按 V (大寫)。
    選擇方式:以整行為單位進行選擇。無論你的光標在哪一列,只要移動到另一行,整行都會被選中。
    適用場景:處理代碼塊的利器。比如復制一個完整的函數、刪除一段 if 語句、或者對多行進行縮進。
    狀態欄提示:-- VISUAL LINE –

  3. 塊可視模式 (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):不關心對齊,先刪除指定范圍的文本,然后進入插入模式,后續文本會根據輸入內容向后推移。

替換模式的三種形式

  1. 單字符替換
    這嚴格來說是一個普通模式命令,因為它執行完后會立即返回普通模式。
    如何使用:r{char}在普通模式下,將光標移動到你想替換的那個字符上。按下 r 鍵。再按下你想要替換成的新字符 {char}。
    效果:光標下的舊字符會被新字符取代,整個過程你都停留在普通模式,可以立即進行下一個操作。
    適用場景:修正單個拼寫錯誤。這是它最常見的用途,效率極高。

  2. 連續替換模式
    這是真正的“替換模式”,一旦進入,你會持續處于該模式下,直到按 Esc 退出。
    如何進入:在普通模式下按 R (大寫)。
    效果了你會進入替換模式,之后你輸入的每個字符都會覆蓋光標下的字符,光標向右移動。狀態欄提示:左下角會顯示 – REPLACE --。
    適用場景:修改一段固定長度的字符串,例如日期、UUID、十六進制顏色碼或者格式化文本中的特定字段。

  3. 虛擬替換模式
    這是 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]
  1. [range] - 范圍(對誰執行?)
    這是 Ex 命令強大能力的關鍵。你可以精確地指定命令作用的行范圍。如果省略,通常只對當前行生效。
    {N}: 第 N 行。例如 :10d 刪除第10行。
    .: 當前行。
    $: 文件最后一行。
    %: 整個文件(等價于 1,$)。
    '{mark}: 標記 mark 所在的行(例如 'a)。
    ‘<,’>: 上一次可視模式下選擇的范圍。這是一個超級有用的特性!當你在可視模式下選中一段文本后按 :,這個范圍會自動幫你填好。

    范圍組合示例:
    :1,10d:刪除第1到第10行。
    :.,$s/foo/bar/g:從當前行到文件末尾,替換所有 foo 為 bar。
    :%s/foo/bar/g:在整個文件中替換。

  2. command - 命令(做什么?)
    這是具體的操作動詞。

  3. [!] - 強制標志
    感嘆號 ! 通常用來強制執行一個命令,忽略警告。最典型的例子就是 :q!(不保存強制退出)。

  4. [arguments]-參數
    命令所需要的額外信息,例如文件名、搜索模式、目標地址等。

常用命令

  1. 文件操作
    :w (write): 保存當前文件。
    :w {filename}: 將當前內容另存為 {filename}。
    :wq 或 ? 保存并退出。
    :q (quit): 退出。如果文件有未保存的修改,Vim 會警告你。
    :q!: 強制退出,丟棄所有未保存的修改。
    :e {filename} (edit): 打開或新建一個文件。
    :e!: 重新加載當前文件,放棄所有修改,回到上次保存的狀態。
    :ls: 列出所有打開的緩沖區(文件)。
    :b{N} 或 :bnext / :bprev: 在緩沖區之間切換。
    :r {filename}:將 {filename} 文件的內容讀入并插入到光標所在行的下方。

  2. 文本編輯與操作
    :{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} 指定的行下方。

  3. 搜索與替換(最強大的功能)
    語法: :[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: 在之前可視模式選中的區域內,進行交互式替換。

  4. 與外部 Shell 交互
    :!{command}: 執行一個外部 shell 命令,并顯示其輸出。
    示例::!ls -l 或 :!python -V。
    :r !{command}: 執行一個外部命令,并將其輸出結果讀入到當前文件中。
    示例::r !date 會將當前日期和時間插入到文件中。
    :[range]!{filter}: 將指定范圍的行作為輸入,傳遞給外部程序進行過濾,然后用程序的輸出替換原文
    示例::%!sort 會對整個文件內容進行排序。

  5. 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 頁里可以有自己獨立的一套分屏(窗口)布局。

緩沖區是全局的,在所有標簽頁和窗口中共享。

常用操作

  1. 緩沖區相關
  • :e filename 打開一個文件,Vim 就會為它創建一個緩沖區。它是文件的內存映像,你所有的修改都先發生在緩沖區里,直到你用 :w 保存,才會寫入磁盤。
  • :ls: 列出所有緩沖區。列出當前所有的緩沖區。你會看到它們的編號、狀態(% 表示當前窗口的, a 表示活動的, h 表示隱藏的)和文件名。
  • :b{N}: 跳轉到第 N 個緩沖區。
  • :bn (bnext): 跳轉到下一個緩沖區。
  • :bp (bprevious): 跳轉到上一個緩沖區。
  • :bd (bdelete): 刪除(卸載) 當前緩沖區。如果緩沖區有未保存的修改,Vim 會警告你。
  1. 窗口操作
  • 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 |: 將當前窗口的寬度最大化。
  1. 標簽操作
  • :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有著非常豐富的插件生態。

插件的安裝和刪除
  1. 安裝vim-plug
    打開終端,運行下面的命令來下載 plug.vim 文件
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  1. 在配置文件中添加插件列表
    打開你的配置文件(~/.vimrc),添加如下結構的代碼:
" 插件列表開始
call plug#begin()" 在這里列出你想要的所有插件
" 格式是 Plug '作者名/倉庫名'
Plug 'tpope/vim-fugitive'
Plug 'preservim/nerdcommenter'
Plug 'vim-airline/vim-airline'" 插件列表結束
call plug#end()
  1. 在vim中安裝插件(和刪除插件)
  • 保存你的配置文件并重新打開 Vim(或者執行 :so %)。
  • 在 Vim 中,執行命令 :PlugInstall。
  • 你會看到一個新的分屏窗口打開,并自動從 GitHub 下載和安裝你列出的所有插件。安裝完成后,狀態會顯示為 “OK”。
  • 刪除插件只需在列表中刪除那一行,然后運行 :PlugClean。
常用插件
  1. UI美化
    vim-airline/vim-airline: 經典選擇,讓你的底部狀態欄變得美觀且信息豐富。
    ryanoasis/vim-devicons: 為你的文件樹和狀態欄添加漂亮的文件類型圖標。
    主題配色:morhetz/gruvbox (復古,對眼睛友好) folke/tokyonight.nvim (現代,華麗) catppuccin/nvim (溫暖,柔和的馬卡龍色系)

  2. 文件與項目導航
    preservim/nerdtree: 經典的文件瀏覽器,在左側提供一個可交互的文件樹。
    junegunn/fzf.vim (還可配合fzf二進制程序): 通用的模糊搜索工具,可以用來搜文件、搜歷史命令、搜 Git 提交記錄等等。

  3. 代碼編寫插件
    preservim/nerdcommenter: 經典選擇,用簡單的快捷鍵(如 cc)快速注釋或取消注釋代碼行。
    jiangmiao/auto-pairs: 經典選擇,輸入左括號時自動補全右括號。
    片段庫: honza/vim-snippets (包含了幾乎所有語言的常用代碼片段)。引擎: UltiSnips。讓你輸入簡短的觸發詞(如 for)然后按 Tab,就能擴展成一個完整的代碼塊。

  4. Git插件

  • tpope/vim-fugitive: 它不是一個簡單的 Git 封裝,而是讓你用 Vim 的思維方式去操作 Git。你可以用 :G 打開 Git 狀態窗口,用 :Gblame 查看每行代碼的作者,用 :Gdiffsplit 對比差異。
  1. IDE插件 (LSP - Language Server Protocol)
  • 這是讓 Vim/Neovim 擁有現代 IDE 功能(智能補全、定義跳轉、實時錯誤檢查、重構)的核心。一體化解決方案 : neoclide/coc.nvim (Conqueror of Completion)。它像 VS Code 一樣,將 LSP 客戶端、補全、代碼片段等功能打包好,開箱即用,配置相對簡單。
插件的使用和配置
  1. 閱讀文檔!:這是最重要的一步。每個插件都有自己的文檔。你可以在 Vim 中通過 :help {plugin-name} (例如 :help fugitive) 來查看它的詳細用法和配置選項。

  2. 配置:大多數插件通過在你的配置文件中設置全局變量來進行配置。例如,對于 nerdtree:

" 在 .vimrc 中
let g:NERDTreeShowHidden = 1 " 顯示隱藏文件
  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部分我們手工更改一次就好。

答案上這一部分使用了宏的嵌套,其實不用嵌套完全可以,我就是這么做的。但是對于復雜的宏功能,還是建議使用嵌套。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89948.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89948.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89948.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PyTorch常用的簡單數學運算

一、基礎算術運算1. 逐元素運算a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6])# 加減乘除 a b # [5, 7, 9] a - b # [-3, -3, -3] a * b # [4, 10, 18] a / b # [0.25, 0.4, 0.5]# 冪運算、平方根 a ** 2 # [1, 4, 9] torch.sqrt(a) # [1.0, 1.414, 1.732]2. 標…

C++ Lambda 表達式詳解:從基礎到實戰

Lambda 表達式是 C11 引入的重要特性&#xff0c;它允許我們在代碼中定義匿名函數&#xff0c;極大地簡化了代碼編寫&#xff0c;尤其是在使用 STL 算法和多線程編程時。本文將詳細介紹 Lambda 表達式的語法、特性及實際應用場景。什么是 Lambda 表達式&#xff1f;Lambda 表達…

Spring Boot注解詳解

文章目錄前言1. 核心啟動注解SpringBootApplicationEnableAutoConfigurationSpringBootConfiguration2. 組件注解Component及其衍生注解ComponentServiceRepositoryControllerRestController3. 依賴注入注解AutowiredQualifierPrimary4. Web相關注解請求映射注解RequestMapping…

Web開發:ABP框架12——中間件Middleware的創建和使用

一、簡介中間件可以用于鑒權、日志&#xff0c;攔截器可以用于指定方法或url的業務邏輯處理&#xff0c;兩者分工不同&#xff0c;實現效果相似&#xff0c;先執行中間件&#xff0c;后執行攔截器&#xff0c;再到WebAPI接口。二、示例一個Token驗證中間件三、代碼1.Startup.cs…

京東商品評論如何獲取?API接口實戰指南

一、API接入準備1. 注冊開發者賬號訪問京東開放平臺&#xff1a;前往京東開放平臺注冊賬號&#xff0c;完成企業或個人實名認證。創建應用&#xff1a;在控制臺創建應用&#xff0c;獲取App Key和App Secret&#xff08;用于簽名認證&#xff09;。2. 申請API權限搜索接口&…

leetcode-sql-627變更性別

題目&#xff1a; Salary 表&#xff1a; --------------------- | Column Name | Type | --------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | --------------------- id 是這個表的主鍵…

【學習路線】C#企業級開發之路:從基礎語法到云原生應用

一、C#基礎入門&#xff08;1-2個月&#xff09; &#xff08;一&#xff09;開發環境搭建Visual Studio安裝配置 Visual Studio Community&#xff1a;免費版本&#xff0c;功能完整Visual Studio Code&#xff1a;輕量級&#xff0c;跨平臺支持JetBrains Rider&#xff1a;專…

Planning Agent:基于大模型的動態規劃與ReAct機制,實現復雜問題自適應執行求解

引言 在當今數據驅動的商業環境中&#xff0c;企業面臨著日益復雜的決策問題。傳統的數據分析工具往往難以應對多步驟、多依賴的復雜問題求解。例如&#xff0c;當企業需要分析"北美市場 Q1-Q2 主要產品的銷售增長趨勢并識別關鍵驅動因素"時&#xff0c;傳統工具可能…

人該怎樣活著呢?55

人該怎樣活著呢&#xff1f; A思考現實問題并記錄自己的靈感 。【生活的指南針】 &#xff08;20250212&#xff09; a1如何思考&#xff1f; 當有人問他用什么方法得到那么多發現時&#xff0c;牛頓說&#xff1a;“我只不過對于一件事情&#xff0c;總是花很長時間很熱…

rtthread - V5.1.0版本 HOOK 鉤子函數總結

rtthread - V5.1.0版本 鉤子函數 相對于V4.0.3版本做了很大的修改和優化&#xff1a;舊版本 V4.0.3&#xff1a;rt_thread_inited_sethook(thread_inited_hook);rt_thread_deleted_sethook(thread_deleted_hook);rt_scheduler_sethook(scheduler_hook);新版本 V5.1.0&#xff1…

Python特性:裝飾器解決數據庫長時間斷連問題

前言 在基于 Python 的 Web 應用開發里&#xff0c;數據庫連接是極為關鍵的一環。不過&#xff0c;像網絡波動、數據庫服務器維護這類因素&#xff0c;都可能造成數據庫長時間斷連&#xff0c;進而影響應用的正常運作。本文將詳細介紹怎樣運用 retry_on_failure 裝飾器來解決數…

療愈之手的智慧覺醒:Deepoc具身智能如何重塑按摩機器人的觸覺神經

療愈之手的智慧覺醒&#xff1a;Deepoc具身智能如何重塑按摩機器人的觸覺神經康復中心的理療室內&#xff0c;一位運動員正俯臥在治療床上。機械臂的硅膠觸頭沿腰背肌群緩緩移動&#xff0c;當傳感器捕捉到豎脊肌的異常僵直時&#xff0c;觸頭自動切換高頻震顫模式&#xff1b;…

webpack將組件vue進行編譯混淆,并能正常使用編譯之后的文件

介紹: 我們在開發的過程中有很多組件都需要復用,特別是我們耗費了好幾天時間寫出來的組件,比如自己寫的表格組件,流程圖組件等。總之都是自己不斷測試,不斷編寫耗費了大把的精力寫的。直接用到自己的項目中倒是無所謂,如果是把自己寫的組件給別人,這里就涉及到自己的勞動…

onenote千年老bug,字體bug (calibri微軟雅黑) 的解決

一、如何改這個bug&#xff08;bug是什么在后文&#xff09;一、注意1、有些onenote可能是版本問題&#xff0c;即使提供了設置默認字體的選項&#xff0c;但按教程設置后還是不work&#xff0c;建議升級版本2、親身測過這個方法是可行的&#xff0c;如果不行&#xff0c;考慮下…

麒麟信安參編的三項軟件供應鏈安全團體標準發布

日前&#xff0c;由中國電子商會正式發布了T/CECC 39—2025《信息安全技術 軟件供應鏈管理規范》、T/CECC 40—2025《信息安全技術 軟件供應鏈開源組件檢測要求》以及 T/CECC 41—2025《信息安全技術 軟件供應鏈軟件產品檢測要素和方法》三項重要團體標準。麒麟信安結合自身在軟…

Django ORM系統

1. ORM基礎概念1.1 什么是ORM&#xff1f;ORM&#xff08;Object Relational Mapping&#xff0c;對象關系映射&#xff09;是一種編程技術&#xff0c;用于在面向對象編程語言中實現不同類型系統的數據轉換。在Django中&#xff0c;ORM充當業務邏輯層和數據庫層之間的橋梁。核…

Tailwind CSS中設定寬度和高度的方法

在 Tailwind CSS 中&#xff0c;設定元素的寬度&#xff08;width&#xff09;和高度&#xff08;height&#xff09;有多種方式&#xff0c;涵蓋固定值、相對值、響應式調整等。以下是完整的方法分類及示例&#xff1a;一、固定寬度 / 高度類以 4px (0.25rem) 為單位遞增&…

Java行為型模式---備忘錄模式

備忘錄模式基礎概念備忘錄模式&#xff08;Memento Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是在不破壞封裝性的前提下&#xff0c;捕獲一個對象的內部狀態&#xff0c;并在該對象之外保存這個狀態&#xff0c;以便后續可以將該對象恢復到先前保存的狀態…

后端參數校驗

前端給后端傳輸數據&#xff0c;有時候參數需要校驗&#xff0c;我們自己寫代碼會比較麻煩&#xff0c;我們可以使用springboot為我們提供的注解&#xff0c;降低這些沒有必要的代碼開發。1.引入依賴<dependency><groupId>org.springframework.boot</groupId>…

C++ - 仿 RabbitMQ 實現消息隊列--服務端核心模塊實現(一)

目錄 日志打印工具 實用 Helper 工具 sqlite 基礎操作類 字符串操作類 UUID 生成器類 文件基礎操作 文件是否存在判斷 文件大小獲取 讀文件 寫文件 文件重命名 文件創建/刪除 父級目錄的獲取 目錄創建/刪除 附錄&#xff08;完整代碼&#xff09; 日志打印工具 為了便…