1984 字
10 分钟
Vim 教程
Vim 的核心模式
在深入了解快捷键之前,首先需要理解 Vim 的几种核心模式:
- 命令模式 (Normal Mode): 启动 Vim 后默认进入的模式,此模式下所有按键都会被解释为命令,用于移动光标、删除文本等,但不能直接输入文字。这是 Vim 最主要的模式。
- 插入模式 (Insert Mode): 在此模式下,您可以像在普通编辑器中一样输入文本。在命令模式下按
i,a,o等键即可进入。 - 可视模式 (Visual Mode): 用于选中文本块,类似于用鼠标拖拽选择。选中的文本可以进行复制、删除、替换等操作。 在命令模式下按
v(字符选择),V(行选择), 或Ctrl+v(块选择) 进入。 - 命令模式 (Command-line Mode): 以冒号 (:) 开始,用于执行保存、退出、查找替换、执行外部命令等复杂操作。
通过按 Esc 键可以从其他模式切换回命令模式,这是 Vim 操作的基石。
Vim 命令的语法结构
Vim 的许多命令遵循一种类似”语法”的结构:[operator][count][motion]。
- operator (操作符): 如
d(删除),c(修改),y(复制)。 - count (次数): 表示重复执行的次数。
- motion (动作): 定义了操作的范围,如
w(一个单词),$(到行尾)。 例如: d2w: 删除 (d) 2 个 (2) 单词 (w)。3dd: 删除3行y5j: 向下复制5行
常用快捷键详解
以下是 Vim 中常用的一些快捷键,主要在 命令模式 下使用:
光标移动
h: 左移一个字符。j: 下移一行。k: 上移一行。l: 右移一个字符。
单词移动:
w: 跳转到下一个单词的开头,按标点或单词分割。(word)W: 跳转到下一个单词的开头,仅以空格分割。b: 跳转到上一个单词的开头。(backward)B: 跳转到上一个单词的开头,仅以空格分割。e: 跳转到当前或下一个单词的结尾。(end of word)E: 跳转到当前或下一个单词的结尾,仅以空格分割。
行内移动:
0: 移动到行首。(第 0 列)^: 移动到行首的第一个非空白字符。$: 移动到行尾。(正则中’$‘表示最后)f{char}: 移动到当前行下一个出现的{char}字符上。(find)F{char}: 移动到当前行上一个出现的{char}字符上。(Find)t{char}: 移动到当前行下一个出现的{char}字符的前一个字符上。(till)T{char}: 移动到当前行上一个出现的{char}字符的前一个字符上。(Till);: 重复上一次的移动操作。,: 反向重复上一次的移动操作。
屏幕移动:
gg: 移动到文件的第一行。(gogo)G: 移动到文件的最后一行。(Go)H: 移动到屏幕的顶部。(High)M: 移动到屏幕的中间。(Middle)L: 移动到屏幕的底部。(Low)zz: 将当前行置于屏幕中央。zt: 将当前行置于屏幕顶部。(top)zb: 将当前行置于屏幕底部。(bottom):{行号}: 移动到指定行号。
翻页:
Ctrl + f: 向下翻一页。(forward)Ctrl + b: 向上翻一页。(backward)Ctrl + d: 向下翻半页。(down)Ctrl + u: 向上翻半页。(up)
文本编辑
插入文本:
i: 在光标前进入插入模式。(insert)a: 在光标后进入插入模式。(append)I: 在当前行的第一个非空白字符处进入插入模式。(Insert)A: 在当前行的结尾进入插入模式。(Append)o: 在当前行的下方新建一行并进入插入模式。(open a new line below)O: 在当前行的上方新建一行并进入插入模式。(Open a new line above)5otemplate<class T>: 快速新建
删除、复制和粘贴:
d: 删除 (delete)。可以和移动命令结合使用。dd: 删除当前行。dw: 删除从光标到下一个单词开头的内容。(delete word)d$或D: 删除从光标到行尾的内容。
c: 修改 (change),删除指定内容并进入插入模式。cc或S: 删除当前行并进入插入模式。cw: 删除一个单词并进入插入模式。ce: 删除一个单词并进入插入模式。c$或C: 修改从光标到行尾。ci(: 删除括号内的内容并进入插入模式。
y: 复制 (yank)。可以和移动命令结合使用。(yank)yy或Y: 复制当前行。yw: 复制一个单词。
r: 替换单个字符。R- 进入替换模式p: 在光标后粘贴。(paste)P: 在光标前粘贴。x: 删除光标所在处的字符。X: 删除光标前的字符。.: 重复上一次的修改命令。
撤销与重做:
u: 撤销上一步操作。(undo)Ctrl + r: 重做上一步被撤销的操作。(redo)
缩进调整
>>: 向右缩进。<<: 向左缩进。=: 自动缩进当前行。==: 自动缩进。gg=G: 自动缩进全文。gg=G+Ctrl + r: 重做上一步被撤销的自动缩进。
数字
Ctrl+a增加数字Ctrl+x减少数字
可视模式
v: 进入字符可视模式V: 进入行可视模式Ctrl + v: 进入块可视模式:'<,'> norm I#: 批量操作(示例:添加注释):1,10 norm C::1,10 s/old/new/g:vi<: 选中尖括号内的内容va<: 选中尖括号的内容(“)同理
查找与替换
/pattern: 向下查找pattern。?pattern: 向上查找pattern。n: 重复上一次的查找。(next)N: 反向重复上一次的查找。*: 向下查找光标当前所在的单词。#: 向上查找光标当前所在的单词。:%s/old/new/g: 全文查找old并替换为new。(substitute):%s/old/new/gc: 全文查找并替换,每次替换前进行确认。(gobal confirm)
窗口与标签页
:sp或:split: 水平分割窗口。(Ctrl+w):vsp或:vsplit: 垂直分割窗口。Ctrl+w+hjkl: 切换到左/下/上/右侧的窗口。Ctrl+w+w: 循环切换窗口。:tabnew: 新建一个标签页。gt: 切换到下一个标签页gT: 切换到上一个标签页。:bn :bp: 下一个/上一个缓冲区
宏 (Macro)
宏可以录制并回放一系列操作,是处理重复性任务的利器。
q{register}: 开始录制宏,并存入指定寄存器 (a-z)。例如qa开始录制名为 a 的宏。(query)- 执行你的操作序列。
q: 停止录制。(quite)@{register}: 回放指定寄存器中的宏。例如@a回放宏 a。@@: 重复上一次执行的宏。
:reg
保存与退出
:w: 保存文件。:wq或ZZ: 保存文件并退出。(write and quite):q: 退出 (如果文件有未保存的修改则会失败)。:q!: 强制退出,不保存修改。:saveas 路径: 保存文件到指定路径。
set
vim ~/.vimrc: 修改配置文件:set mouse=a: 允许使用鼠标:set nu: 开启行号:set et: Tab转换为空格(expandtab):set sw=4: 缩进为4个空格(shiftwidth):set sts=4: 删除缩进为4个空格(softtabstop):set hlsearch: 高亮显示所有搜索匹配项:set cursorline: 高亮显示当前光标所在行nnoremap <F8> :sh<CR>: 设置在普通模式下按F8键的快捷键nnoremap <F9> :nohlsearch<CR>::set nohlsearch: 取消高亮显示所有搜索匹配项
! 魔法 (! 表示后面跟的是一个外部 Shell 命令)
-
%: 代表当前文件名,%<: 代表当前文件名去掉扩展名, -
:!gcc % -o %< && ./%<: 编译成功执行后,运行 -
:!ls -l: 同理有 mkdir rm cp 等常见命令 -
:!sort -u: 排序并移除重复行 -
:!sort -n: 按数值大小排序 -
:%!jq .: 格式化 JSON -
:r !ls -l: 读取外部命令的输出并插入到当前光标的下一行 -
:r filename: 将另一个文件的内容插入 -
:!cat /proc/<pid>/map: 查看 /proc
Vim Buffer
-
vim a b c d: 一次性指定多个文件 -
:e 文件名: 为文件创建 buffer -
:enew: 创建一个空的、未命名的 buffer(edit new) -
:badd 文件名: buffer add -
:ls: 列出所有当前的缓冲区 -
:b 2: 切换到编号为2的 buffer(也支持文件名+Tab补全) -
:bd 2: buffer delete 2 -
:bn: buffer next -
:bp: buffer previous -
:b#/Ctrl + ^:#表示上一个编辑的 Buffer