文章目录

  • 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; 日志打印工具 为了便…