vim 常用命令和语法总结

2018-05-27

文件操作

vim filename    //打开filename文件
:w              //保存文件
:w filename     //保存至filename文件
:q              //退出编辑器,如果文件已修改请使用下面的命令
:q!             //退出编辑器,且不保存
:wq             //退出编辑器,且保存文件

进入插入模式

i   //在光标所在字符前进入插入模式
a   //在光标所在字符后进入插入模式
I   //在当前行的开始处添加文本(非空字符的行首)
A   //在当前行的末尾位置添加文本
s   //删除光标所在位置字符并进入插入模式
cw  //删除光标所在位置至当前单词结尾内容并进入插入模式
c$  //删除光标所在位置至当前行结尾内容并进入插入模式
cc  //删除光标所在行所有内容并进入插入模式
o   //在当前行下方插入新行并进入插入模式
O   //在当前行上方插入新行并进入插入模式
R   //替换(覆盖)当前光标位置及后面的若干文本
r   //替换(覆盖)当前光标位置字符(依然在命令模式)

复制、粘贴

yy          //将当前行复制到缓存区,也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务
nyy、yny    //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务
yw          //复制从光标开始到词尾的字符
nyw         //复制从光标开始的n个单词
y^          //复制从光标到行首的内容
y$          //复制从光标到行尾的内容

p           //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用 "ap 进行粘贴
P           //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用 "aP 进行粘贴

删除、撤销

x           //删除光标所在位置字符
nx          //删除从光标开始的n个字符
dw          //删除光标所在位置至当前单词结尾内容
d$          //删除光标所在位置至当前行结尾内容
dd          //删除当前行,删除内容会进入 vim 剪贴板
dnd、ndd    //删除n行,例:d3d 为删除3行

u       //撤销上一步操作
U       //撤销对当前行的所有操作

移动

h,j,k,l     //左、下、上、右
空格键      //向右
Backspace   //向左
Enter       //移动到下一行首
-           //移动到上一行首
w           //正向移动到下一单词的开头
e           //正向移动到当前/下一单词的结尾
b           //反向移动到当前/上一单词的开头
ge          //反向移动到上一单词的结尾
gg          //到文档顶部
G           //到文档底部
n+          //向下跳n行
n-          //向上跳n行
ngg、nG     //到第 n 行

f{char}     //正向移动到下一个{char}所在位置
F{char}     //反向移动到上一个{char}所在位置
t{char}     //正向移动到下一个{char}的前一个字符上
T{char}     //反向移动到上一个{char}的后一个字符上

``  //当前文件上次跳转操作的位置
`.  //上次修改操作的地方
`^  //上次插入的地方
`[  //上次修改或复制的起始位置
`]  //上次修改或复制的结束位置
`<  //上次高亮选区的起始位置
`>  //上次高亮选区的结束位置

查找和替换

/str        //向光标下搜索 str 字符串
?str        //向光标上搜索 str 字符串
n           //向下搜索前一个搜素动作
N           //向上搜索前一个搜索动作

:s/old/new          //用new替换行中首次出现的old
:s/old/new/g        //用new替换行中所有的old
:n,m s/old/new/g    //用new替换从n到m行里所有的old
:%s/old/new/g       //用new替换当前文件里所有的old

其他

=               //格式化,例 gg=G 格式化整个文件
:e otherfile    //编辑文件名为 otherfile 的文件,支持编辑远程文件,可通过 ftp、sftp、scp、http、rsync 等多种方式访问
:r otherfile    //将 otherfile 文件中的内容写到当前文件,和 :e 一样可以支持远程文件,详见文末参考文档
:set  nu        //显示行号
:set nonu       //取消显示行号
:set paste      //设置插入模式为 paste,这个在复制代码块时很有用,粘贴的代码会保持原有的缩进而不会被 vim 的自动缩进打乱
:set fileformat=unix    //将文件修改为unix格式,如win下面的文本文件在linux下会出现^M
:w !sudo tee %          //保存时获取sudo权限

vim 的常规语法

动词

动词代表了我们打算对文本进行什么样的操作。例如:

  • d 表示删除(delete)
  • r 表示替换(replace)
  • c 表示修改(change)
  • y 表示复制(yank)
  • v 表示选取(visual select)

名词

名词代表了我们即将处理的文本。Vim 中有一个专门的术语叫做文本对象(text object),下面是一些文本对象的示例:

  • $ 表示行尾
  • ^ 表示行首
  • w 表示一个单词(word)
  • s 表示一个句子(sentence)
  • p 表示一个段落(paragraph)
  • t 表示一个 HTML 标签(tag)
  • 引号或者各种括号所包含的文本称作一个文本块。

介词

介词界定了待编辑文本的范围或者位置。例如:

  • i 表示“在...之内”(inside)
  • a 表示“环绕...”(around)
  • t 表示“到...位置前”(to)
  • f 表示“到...位置上”(forward)

示意图

组词为句

动词 + 介词 + 名词 (介词可选,默认介词为 i)

dip //删除一个段落: delete inside paragraph
vis //选取一个句子: visual select inside sentence
ciw //修改一个单词: change inside word
caw //修改一个单词: change around word
dtx //删除文本直到字符“x”(不包括字符“x”): delete to x
dfx //删除文本直到字符“x”(包括字符“x”): delete forward x

动词 + 数词 + 名词 or 数词 + 动词 + 名词 (数词可选,默认数词为 1)

c3w //修改三个单词:change three words
d2w //删除两个单词:delete two words

2dw //两次删除单词(等价于删除两个单词): twice delete word
3x  //三次删除字符(等价于删除三个字符):three times delete character

参考文档