VIM 常用操作

发布于 2023-12-25
本文是使用 vimtutor 对 vim 的学习总结,vimtutor 命令是 VIM 自带的一个教程,推荐使用它来学习 VIM,它会带你一步一步学习 VIM 的基本操作。 进入 VIM

VIM 常用操作

本文是使用 vimtutor 对 vim 的学习总结,vimtutor 命令是 VIM 自带的一个教程,推荐使用它来学习 VIM,它会带你一步一步学习 VIM 的基本操作。

进入 VIM

可通过 vi filename 或 vim filename 命令打开文件,如果文件不存在则会新建一个文件。

大部分 Linux 发行版都会默认安装 VIM,且 vi 命令会指向 vim 命令,所以 vi 和 vim 命令是等价的。但为了避免不同发行版的差异,建议使用 vim 命令。

退出 VIM

  • :q 退出 VIM
  • :q! 强制退出 vim 不保存修改的内容
  • :w 保存修改,但不退出 VIM。
  • :wq 保存修改并退出 VIM。
  • :w filename 将修改保存到 filename 文件中,但不退出 VIM。
  • :wq! filename 将当前正在编辑的文件保存到 filename 文件中,并退出 VIM,忽略对当前文件的修改。

进入编辑模式

在 VIM 中,可以通过 i 命令进入编辑模式,此时可以对文件进行编辑。

  • i 在当前光标所在位置进入编辑模式
  • I 在当前行的第一个字符进入编辑模式
  • a 在当前光标所在位置的下一个字符进入编辑模式
  • A 在当前行的最后一个字符进入编辑模式
  • o 在当前行的下一行插入一个新行,并进入编辑模式
  • O 在当前行的上一行插入一个新行,并进入编辑模式

退出编辑模式

在 VIM 中,可以通过 ESC 键退出编辑模式。这时是命令模式,可以输入命令。

命令模式

移动光标

在 VIM 中,可以通过 h j k l 键移动光标,分别对应左、下、上、右。

删除字符

字符删除:

  • x 删除光标所在位置的字符
  • X 删除光标所在位置的前一个字符

单词删除:

  • dw 删除光标所在位置到下一个单词开头的字符,包括空格 (注记:delete word)
  • db 删除光标所在位置到上一个单词开头的字符,包括空格 (注记:delete back)
  • de 删除光标所在位置到下一个单词结尾的字符 (注记:delete end)
  • dd 删除光标所在行
  • d$ 删除光标所在位置到行尾的字符

删除命令都会将删除的内容存入剪贴板,可以通过下文的粘贴命令将剪贴板的内容粘贴到文件中。

复制粘贴

  • yy 复制光标所在行
  • yw 复制光标所在位置到下一个单词开头的字符,包括空格 (注记:yank word)
  • p 粘贴剪贴板内容到光标所在行的下一行 (注记:paste)
  • P 粘贴剪贴板内容到光标所在行的上一行

还可以使用 v 进入可视模式,然后使用 h j k l 键移动光标,选中一段文本,然后按 y 复制选中的文本,再根据需要使用 p 或 P 粘贴。(有点像鼠标拖拽选中文本,然后复制粘贴)

撤销重做

  • u 撤销上一次操作
  • Ctrl + r 重做被撤销的操作,或者说撤销撤销操作
  • U 撤销对整行的修改
  • . 重复上一次修改

查找替换

查找:

  • /word 查找 word 字符串,按 n 查找下一个,按 N 查找上一个,如果想逆向查找,可以使用 ?word 命令
  • :set ic 查找时忽略大小写 (ignore case)
  • :set is 查找时显示匹配的字符串 (ignore case)
  • :set hls 查找时高亮显示匹配的字符串 (highlight search)

查找括号匹配:

  • % 查找括号匹配,如 () [] {},光标放在括号上,按 % 可以跳转到匹配的括号上
  • :set showmatch 设置括号匹配高亮

替换:

  • r 按下 r 后输入一个字符,将光标所在位置的字符替换为输入的字符
  • R 按下 R 后进入替换模式,每输入一个字符,将光标所在位置的字符替换为输入的字符,并向右移动一个字符。按 ESC 退出替换模式
  • ce 删除光标所在位置到下一个单词结尾的字符,并进入编辑模式
  • c$ 删除光标所在位置到行尾的字符,并进入编辑模式
  • :s/old/new 将当前行第一个 old 替换为 new
  • :s/old/new/g 将当前行所有 old 替换为 new (其中 g 为 global 的意思)
  • :%s/old/new/g 将所有行所有 old 替换为 new
  • :%s/old/new/gc 将所有行所有 old 替换为 new,替换前询问是否替换 (其中 c 为 confirm 的意思)
  • :n1,n2s/old/new/g 将第 n1 行到第 n2 行所有 old 替换为 new

移动光标

  • 0 移动光标到行首
  • $ 移动光标到行尾
  • gg 移动光标到文件首
  • G 移动光标到文件尾
  • nG 移动光标到第 n 行, 如 10G 移动光标到第 10 行
  • n+ 光标向下移动 n 行, 如 10+ 光标向下移动 10 行
  • n- 光标向上移动 n 行, 如 10- 光标向上移动 10 行
  • n<space> 光标向右移动 n 个字符, 如 10<space> 光标向右移动 10 个字符
  • n<enter> 光标向下移动 n 行, 如 10<enter> 光标向下移动 10 行
  • w 光标向右移动一个单词,注记:word
  • b 光标向左移动一个单词,注记:back
  • e 光标向右移动到单词结尾,注记:end

文本编辑 - 自由编辑

可以通过 i 命令进入编辑模式,此时可以对文件进行编辑。

文本编辑 - 添加

还可以通过 A 命令进入编辑模式,此时光标在当前字符的后面,可以对文件进行编辑。注意,这种模式下,无法进行删除操作。

命令量化

vim 指令中很多命令都可以量化,如删除字符, 删除行,向某个方向移动光标等,可以量化为删除多少个字符,删除多少行,向某个方向移动多少个字符等。对于这些命令,可以在命令前加上数字,如 10dd 删除 10 行,10w 向右移动 10 个单词,10b 向左移动 10 个单词,10e 向右移动 10 个单词到单词结尾,10+ 光标向下移动 10 行,10- 光标向上移动 10 行,10<space> 光标向右移动 10 个字符,10<enter> 光标向下移动 10 行。

执行外部命令

可以通过 :!command 执行外部命令,如 :!ls 执行 ls 命令,:!date 执行 date 命令。这样可以在 VIM 中执行外部命令,执行完后会返回 VIM,不会退出 VIM。

状态

  • Ctrl + g 显示当前编辑文件的状态,包括文件名,文件状态,总行数,当前行号,光标位置百分比,当前所处列号,如:
"/tmp/tutoralicW3" [已修改] 行 300 / 995 --30%-- 列 8-29                                                                                                                                                                  

辅助命令

  • :set number 显示行号

在选项前增加 no 可以关闭选项,如 :set nonumber