Skip to main content

VIM 教程

窗口命令,分屏

  • ctrl+w w 切换窗口

  • ctrl+w s 水平分割窗口

  • ctrl+w v 垂直分割窗口

  • vim -on file1 file2 ... filen 上下分屏

  • vim -On file1 file2 ... filen 左右分屏

  • ctrl+w h j k l 移动分屏光标

  • ctrl+w H J K L 移动分屏

  • ctrl+w c 关闭分屏

  • ctrl+w q 关闭分屏并退出当前窗口(由于同时有多个文件,此命令不会影响其他窗口)

  • :e file 把 file 加载到新的缓冲区中

  • :sp fn 上下分屏打开新文件,并将 fn 加载到新的窗口中

  • :sp fn 分割窗口,并将 fn 加载到新的窗口中

缓冲区

  • :ls 列出缓冲区
  • :bn 跳转到下一个缓冲区
  • :bn/:bp 多个文件间切换
  • :b number 切换缓冲区
  • :b fileName 加载文件
  • :bd 删除缓冲区(关闭文件)

保存,退出编辑器

  • :w 将缓冲区写入文件,即保存修改

  • :w! 强制保存不退出

  • :q 退出,如果对缓冲区进行过修改,则会提示

  • :q! 强制退出,放弃修改

  • :qa! 退出所有不保存

  • :wq 保存修改并退出

  • :e file 打开文件

  • :e! 放弃修改,恢复文件到上次保存的位置

  • :x 保存并退出

  • :w file 保存到文件

  • :saves file 另存为

标签命令

  • :tabnew tabName 创建新 tab

  • :tabe fn 在一个新的标签页中编辑文件 fn

  • :tabn 切换下一个 tab

  • :tabp 切换上一个 tab

  • :tabr 切换到第一个标签页

  • :tabl 切换到最后一个标签页

  • :tabm [N] 把当前 tab 移动到第 N 个 tab 之后

  • :tabc 关闭 tab

  • :tabs 查看共几个 tab

  • gt 切换到下一个标签页

  • gT 切换到上一个标签页

  • g/t 切换 tab

  • ngt 切换第 n 个 tab

标记、书签

  • ma 文件内标记,把当前位置存成标签 a
  • mA 文件间标记
  • `a 跳转到标记处
  • 'a 跳转到标记行首
  • :marks 查看标记
  • :delmarks a 删除标记
  • :delmarks! 删除所有小写标记

插入模式

  • i 光标前
  • I 光标行首
  • a 光标后
  • A 光标行尾
  • o 光标下一行首插入
  • O 光标上一行首插入
  • s 删除光标处字符再插入
  • S 删除光标行,再在行首输入
  • Esc 退出插入模式

编辑

  • J 将下一行和当前行连接为一行
  • cc 删除当前行并进入编辑模式
  • cw 删除当前字,并进入编辑模式
  • c$ 擦除从当前位置至行末的内容,并进入编辑模式
  • xp 交换当前字符和下一个字符

选择模式 - 标记文本

  • v 进入可视模式,单字符模式
  • V 进入可视模式,行模式
  • Ctrl+v 进入可视模式,列模式,类似于 UE 的列模式
  • va" 选中 "" 内的所有内容包括双引号
  • vi" 选中 "" 内的所有内容,不包括 ""
  • o 跳转光标到选中块的另一个端点
  • U 将选中块中的内容转成大写
  • O 跳转光标到块的另一个端点
  • aw 选中一个字
  • ab 选中括号中的所有内容,包括括号本身
  • aB 选中{}括号中的所有内容
  • ib 选中括号中的内容,不含括号
  • iB 选中{}中的内容,不含{}

移动

  • 0 移动到行首,不管有无缩进,就是跳到第 0 个字符

  • ^ 移动到本行第一个不是 blank 的字符

  • $ 移动到行尾

  • g_ 移动到本行最后一个不是 blank 的字符

  • fa 移到本行下个 a 处

  • nfa 移到本行光标后第 n 个 a 处

  • Fa 移到上个 a 处

  • nFa 移到本行光标前第 n 个 a 处

  • ta 移动光标至 a 字符的前一个字符

  • nta 移动到第二个 a 字符的前一个字符处

  • Ta 同 ta 移动光标方向相反

  • nTa 同 nta 移动光标方向相反

  • w 移到下个单词开头,按标点或单词分割

  • W 移到下个单词结尾,跳到下一个字首,长跳,如 end-of-line 被认为是一个字

  • e 跳到下一个字尾

  • E 跳到下一个字尾,长跳

  • b 跳到上一个字

  • B 跳到上一个字,长跳

  • ; 跳前一个指定字符

  • , 跳后一个指定字符

跨行移动

  • nG 移到 n 行行首,如 0G,就等价于 gg,100G 就是第 100 行

  • gg 移到文件第一行行首

  • gd 跳至当前光标所在的变量的声明处

  • G 移到最后一行行首

  • H 移到当前屏幕第一行行首

  • M 移到当前屏幕中间

  • L 移到当前屏幕尾部

  • zt 当前行移到第一行

  • zz 当前行移到中间

  • zb 当前行移动到尾部

  • `. 跳转至上次编辑位置 在屏幕上移动

  • % 匹配括号移动(跳到与当前括号匹配的括号处,如当前在{,则跳转到与之匹配的}处)

  • * 上一个单词

  • # 下一个单词

翻页

  • ctrl + f 下一页
  • ctrl + b 上一页

查找

  • fx 在当前行中找 x 字符,找到了就跳转至
  • Fx 跟 fx 的方向相反
  • ; 重复上一个 f 命令,而不用重复的输入 fx
  • tx 与 fx 类似,但是只是跳转到 x 的前一个字符处
  • ),( 跳转到上/下一个语句
    • 查找光标所在处的单词,向下查找

查找替换

  • /pattern 向后搜索字符串 pattern
  • ?pattern 向前搜索字符串 pattern
  • n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个)
  • N 上一个匹配(同上)
  • :%s/old/new/g 搜索整个文件,将所有的 old 替换为 new
  • :%s/old/new/gc 搜索整个文件,将所有的 old 替换为 new,每次都要你确认是否替换

复制、粘贴、删除、撤销、重作

d 删除

  • dw 删除一个单词
  • dnw 删除 n 个单词,
  • dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
  • dnfa 删除光标处到第 n 个 a 的字符处
  • dd 删除一整行
  • ndd 删除光标处开始的 n 行
  • d$ 删除光标到本行的结尾
  • dH 删除屏幕显示的第一行文本到光标所在的行
  • dG 删除光标所在行到文本的结束
  • :n1,n2d 删除 n1 到 n2 行
  • x 删除当前字符
  • X 删除前一个字符
  • D 删除到行末

y 复制

  • yw 复制一个单词,还有 ynw
  • yfa 复制光标到下一个 a 的字符处,还有 ynfa
  • yy 复制一行,还有 nyy,,此命令前可跟数字,标识复制多行,如 - 6yy,表示从当前行开始复制 6 行
  • y$ 复制到行末
  • yH 复制屏幕显示的第一行文本到光标所在的行
  • yG 复制光标所在行到文本的结束

p 粘贴

  • p 粘贴粘贴板的内容到当前行的下面
  • P 粘贴粘贴板的内容到当前行的上面
  • ]p 有缩进的粘贴,vim 会自动调节代码的缩进
  • "a 将内容放入/存入 a 寄存器,可以支持多粘贴板

移动

  • >> 将当前行右移一个单位
  • << 将当前行左移一个单位(一个 tab 符)
  • > 块右移
  • < 块左移,将当前行左移一个单位(一个 tab 符)
  • == 自动缩进当前行

撤销和重作

  • u 撤销
  • ctrl + r 重作

重复命令

  • . 该命令是重复上一个操作的命令
  • n command 重复某个命令 n 次,如 10p 复制 10 次,10dd 删除十次。

删除和替换

  • x 删除光标当前所在的字符
  • r 替换掉光标当前所在的字符,替换一个字符
  • R 替换掉从光标开始以后的所有字符

大小写转换

  • ~ 将光标下的字母改变大小写
  • 3~ 将光标位置开始的 3 个字母改变其大小写
  • g~~ 改变当前行字母的大小写
  • gUU 将当前行的字母改成大写
  • guu 将当前行的字母全改成小写
  • 3gUU 将从光标开始到下面 3 行字母改成大写
  • gUw 将光标下的单词改成大写。
  • guw 将光标下的单词改成小写
  • g~iw 切换当前字的大小写
  • gUiw 将当前字变成大写
  • guiw 将当前字变成小写

代码提示

  • Ctrl+n 代码提示
  • Ctrl+p 代码提示

寄存器

  • :reg 查看寄存器
  • :reg a 查看寄存器内容

命令

  • :!command 执行命令
  • :r !command 执行命令,并添加结果到光标处
  • :r !date 显示时间在光标处

宏录制

假设需将如下的多行文本的首行键入一个 tab 键。

hello
hello world
hello world , vim

先将光标移动到第一行,在普通模式下按下 q 键,在按一个 a (字母随意),表示该宏注册为 a ,按下 I 在行首插入一个 tab 键,按下 jj 或者 ESC 退出编辑模式,按下 j 将光标移动到下一行行首,最后按下 q 键完成录制操作。

q → a → I → tab → jj → j → q

宏录制的使用

在普通模式下,按 @a 执行宏录制的一系列动作,将会在第二行执行插入 tab 。 @@ 是对上一次宏使用的重复操作。n@a 就会执行 n 次一系列的动作。使用宏录制可以一次执行一系列的操作。

设置

  • :set nu 显示行号
  • :set nonu 取消小时行号
  • :set ic 区分大小写
  • :set noic 取消区分大小写

参考