2759 字
14 分钟
VIM基础教程
2023-06-20
2023-11-28

1、vim 三种基本的工作模式#

vim有三种基本的工作模式,分别为:命令模式、末行模式、编辑模式。关于这三种工作模式的介绍,请见下文。

1.1、命令模式#

使用vim打开文件之后,首先进入命令模式,它是vim编辑器的入口模式。在命令模式下,通过使用命令对文件进行常规的编辑操作,例如:复制、粘贴、删除、定位、翻页等等。

1.2、末行模式#

末行模式是vim编辑器的出口,要退出vim,必须要在末行模式下。在末行模式下,执行退出文件、保存并退出文件等操作。

1.3、编辑模式#

正常的编辑文字模式。

2、三种模式的切换操作#

(1)vim打开一个文件进入的就是命令模式,另外两种模式需要回到命令模式才能进入彼此。

(2)在命令模式中按下i,I,o,O,a,A,r,R任何一个字母后进入编辑模式,进入编辑模式后,下方会出现INSERT或者REPLACE字样,按Esc键退出编辑模式,回到命令模式。

(3)在命令模式中按下:,/,?中任意一个即可进入末行模式,末行模式可以对文档或者vim环境进行操作,例如查找、读取、存盘、替换、离开、显示行号等。

3、各种模式切换#

普通模式 - - NORMAL - - ———> 插入模式 - - INSERT - -#

  • insert
    • i 在光标前插入
    • I 在行首插入
  • open a new line
    • o 在下一行插入
    • O 在上一行插入
  • append
    • a 在光标后插入
    • A 在行尾插入

普通模式 - - NORMAL - - <——— 插入模式 - - INSERT - -#

  • ESC
  • jj / CapsLock

普通模式 - - NORMAL - - ———> 可视模式 - - VISUAL - -#

  • v

普通模式 - - NORMAL - - <——— 可视模式 - - VISUAL - -#

  • v
  • Esc

普通模式 - - NORMAL - - ———> 命令模式#

  • :

普通模式 - - NORMAL - - <——— 命令模式#

  • Esc

总结#

先区分输入内容与执行命令:普通模式下按键用于移动和编辑,不会直接写入文本;按 i 进入插入模式后才开始输入正文,按 Esc 回到普通模式。若不确定当前状态,先按 Esc 再执行下一步,比连续尝试不同按键更容易判断行为。后续的移动、删除与复制示例,除非另有说明,都以普通模式为起点。

进入插入模式要先选好位置:i 在光标前插入,a 在光标后追加;I 移到当前行第一个非空白字符前插入,A 移到行尾追加。练习时在同一行分别尝试这些入口,输入少量文字后按 Esc,观察光标位置与文本变化。这里的大写和小写是不同命令,不能把 I 简单当作 i 的另一种写法。

需要新增一行时,在普通模式按 o 会在当前行下方打开新行并进入插入模式,按 O 则在上方打开新行。它们不同于只移动光标的命令,也不同于在原行内部插入字符;如果只是想定位到邻行,应使用移动命令。输入完成后按 Esc 返回普通模式,下一次按键才会继续作为编辑指令解释。

可视模式用于先选范围再执行操作:普通模式按 v 开始按字符选择,随后通过移动命令扩大或缩小选区,再决定复制、删除或修改。放弃当前选择时按 Esc 返回普通模式,不必执行破坏性操作来退出。要留意状态栏显示的模式,避免把选择阶段的移动按键误认为已经在插入正文。

普通模式按 : 进入命令行后,可以输入保存、退出或设置命令,按回车执行,按 Esc 取消本次命令输入。jj 或把 CapsLock 当作退出键并不是 Vim 原生的统一行为,它们需要相应映射或系统配置;迁移到新环境时先使用 Esc。单字符替换 r 也不同于持续输入的插入模式,不应把所有编辑入口混为一类。

4、光标移动#

光标移动先从 h、j、k、l 开始:分别向左、下、上、右移动。可以在命令前加次数,例如 3j 向下移动三行,这里的数字属于移动次数,不会写入正文。移动只改变位置,不会删改文本;在普通模式熟悉方向后,再把相同的移动范围组合进删除或复制命令,能更清楚地判断操作影响。

按单词移动时,w 去下一个单词开头,b 返回当前或前一个单词开头,e 到当前或下一个单词结尾,ge 向后寻找前一个单词结尾。大写的 W、B、E 以空白分隔的较大文本块为单位,对包含标点的代码行尤其有区别。练习时把光标放在单词中间再比较各命令,注意起始位置会影响实际落点。

解释:

  • w : word
  • b : begin
  • e : end
  • ge : 不太常用

行内与文件级定位分开记忆:0 到行的第一个字符,^ 到第一个非空白字符,$ 到行尾;gg 到文件首行,G 到末行,nG 或 ngg 到指定行号。处理有缩进的代码时,0 与 ^ 的落点不同,前者包含缩进位置。先准确到行,再用单词或字符查找细调,通常比重复逐字符移动更容易控制。

当前行内查找字符可用 f{字符} 向前落在目标字符上,t{字符} 向前停在目标字符之前;大写 F 与 T 反向查找。按 ; 沿原方向重复,按 , 反向重复,不需要重新输入目标字符。跨越更大文本结构时,可以使用 (、) 按句子移动,或 {、} 按段落边界移动,先分清搜索范围再选择命令。

字符单词行跳转句和段
h 左w下一个单词开头0 行首f char 跳到char位置( 到句首
j 下b本单词或上一个单词开头^ 行首非空字符F char 反向) 到句尾
k 上e本单词或下一个单词结尾$ 行尾t char char前一位置{ 到段首
l 右ge上一个单词结尾gg 首行T char char后一位置} 到段尾
W长单词 E长单词 B长单词G 尾行; 重复上次的跳转
ngg 第n行, 反向查找上次的查找

5、动作 motion#

移动命令描述从当前位置到目标位置的范围,文本对象则描述当前位置所属的一块结构。使用文本对象时通常先输入操作符或进入可视模式,再选择范围,例如 iw 表示单词内部,aw 包含单词及相关空白。把“要做什么”和“作用在哪一块”分开思考,能避免先手动选很长一段文本,再猜测是否漏选边界。

文本对象的 i 表示内部范围,a 通常连同外围分隔或相关空白一起选取。it 面向标签内部,is 面向句子内部,ip 面向段落内部;它们是操作范围,不是普通模式下任意单独敲击就会完成编辑的命令。可以先用 v 配合对象检查选区,再决定执行复制或修改;不同对象的边界规则不同,遇到嵌套结构时尤其要先确认范围。

  • it : inner tag
  • is : inner sentence
  • ip : inner paragraph

6、操作符#

操作符按“操作 + 范围”组合:d 删除指定范围,c 删除后进入插入模式,y 复制范围;例如 yy 复制当前行,dd 删除当前行。p 是把寄存器内容放到当前位置之后的命令,不需要再跟一个移动范围。表中的 b、B 可用于特定括号文本对象,而不是通用操作符;e 在原生 Vim 中是移到单词结尾,不能当作默认全选命令。

操作符说明
d(delete)删除
c(change)修改(删除并且进入插入模式)
y(yank)复制
v(visual)选中并且进入 VISUAL 模式
p(paste)粘贴
b(bracket)小括号的简写
B(Bracket)大括号的简写
e(entire)全选

7、大小写#

大小写转换使用明确的操作范围:gU 把范围转为大写,gu 转为小写,g~ 切换大小写;例如 gUw 对当前移动范围执行大写转换,guu 将当前行转为小写。可视模式中先选定文本,再按 U 或 u 也能转换选区。普通模式单独的 u 是撤销,不是转小写;也不要把所有 g 前缀命令都理解成跳转,应按完整命令记忆。

  • ‘g’ means goto
  • ‘U’ means Uppercase
  • ‘u’ 与上一个相反

Tips#

  • gd : goto definition 跳转到定义
  • ctrl + o : 跳回
  • gh : goto (mouse) hover 鼠标悬浮
  • gt : goto tab 跳转下一个标签页
  • gT : 与上一个相反 跳转上一个标签页
  • ngt / ngT : 跳转到第n个标签页

VSCode中的Vim#

  • vscode中默认为space
  • S{Charactor} : 寻找某个字符
  • xxx : 详见配置
Motion CommandDescription
<leader><leader> s <char>Search character
<leader><leader> f <char>Find character forwards
<leader><leader> F <char>Find character backwards
<leader><leader> t <char>Til character forwards
<leader><leader> T <char>Til character backwards
<leader><leader> wStart of word forwards
<leader><leader> bStart of word backwards
<leader><leader> lMatches beginning & ending of word, camelCase, after _, and after # forwards
<leader><leader> hMatches beginning & ending of word, camelCase, after _, and after # backwards
<leader><leader> eEnd of word forwards
<leader><leader> geEnd of word backwards
<leader><leader> jStart of line forwards
<leader><leader> kStart of line backwards
<leader><leader> / <char>... <CR>Search n-character
<leader><leader><leader> bdtTil character
<leader><leader><leader> bdwStart of word
<leader><leader><leader> bdeEnd of word
<leader><leader><leader> bdjkStart of line
<leader><leader><leader> jJumpToAnywhere motion; default behavior matches beginning & ending of word, camelCase, after _ and after #

<leader><leader> (2s|2f|2F|2t|2T) <char><char> and <leader><leader><leader> bd2t <char>char> are also available. The difference is character count required for search. For example, <leader><leader> 2s <char><char> requires two characters, and search by two characters. This mapping is not a standard mapping, so it is recommended to use your custom mapping.

  • surround
Surround CommandDescription
y s <motion> <desired>Add desired surround around text defined by <motion>
d s <existing>Delete existing surround
c s <existing> <desired>Change existing surround to desired
S <desired>Surround when in visual modes (surrounds full selection)

Some examples:

  • "test" with cursor inside quotes type cs"' to end up with 'test'
  • "test" with cursor inside quotes type ds" to end up with test
  • "test" with cursor inside quotes type cs"t and enter 123> to end up with <123>test</123>

多光标功能#

🖱️ Multi-Cursor Mode#

:warning: Multi-Cursor mode is experimental. Please report issues in our feedback thread.

Enter multi-cursor mode by:

  • On OSX, cmd-d. On Windows, ctrl-d.
  • gb, a new shortcut we added which is equivalent to cmd-d (OSX) or ctrl-d (Windows). It adds another cursor at the next word that matches the word the cursor is currently on.
  • Running “Add Cursor Above/Below” or the shortcut on any platform.

Once you have multiple cursors, you should be able to use Vim commands as you see fit. Most should work; some are unsupported (ref PR#587).

  • Each cursor has its own clipboard.
  • Pressing Escape in Multi-Cursor Visual Mode will bring you to Multi-Cursor Normal mode. Pressing it again will return you to Normal mode.

vscode中可以使用 cmd + d 批量修改

vim中可以使用 gb 批量膝盖

将光标定位到终端#

在settings.json添加如下快捷键

//由editor 转到 terminal
{
"before": ["leader", "t"],
"commands": ["workbench.action.terminal.focus"]
}

space + t 即可跳转到终端中

跳转Tab#

进入命令模式 :

  • 输入 tabn : tab next 即进入下一个标签页
  • 输入 tabp : tab prev 即进入下一个标签页