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种模式,即普通模式、插入模式、可视模式、替换模式和命令行模式,前三种模式最为基础。
- 普通模式
此模式下,你的键盘不是用来输入文本的,而是用来发布命令的。你可以在代码间飞速移动、删除、复制、粘贴和修改结构,而双手完全不需要离开主键区。
打开 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部分我们手工更改一次就好。
答案上这一部分使用了宏的嵌套,其实不用嵌套完全可以,我就是这么做的。但是对于复杂的宏功能,还是建议使用嵌套。