编辑
修改
- cw
修改从光标至单词结尾 - cc
修改本行 - c$ 或 C
修改从光标至本行结束 - c0
修改从光标至本行开头 - c2b
修改从光标往前两个单词 - r
替换字符 - R
覆盖字符直至按下esc,最多覆盖一行 - ns
替换n个字符,不填数字则替换1个 - nS
替换n行,不填数字则替换本行 - ~
转换字符的大小写,并把光标右移 - g~w
转换词的大小写 - guw 或 gUw
改变词为全部小写/大写 - J
合并两行 - Ctrl-A 或 Ctrl-X
递增/递减光标下的数字
删除
- x X
删除光标处/光标前面的字符 - nx
向后删除n个字符 - dd
删除光标所在行 - "x dd
删除当前行到寄存器x - ndd
删除光标开始的向下n行 - dw
从光标处删除至下一个单词(下一个单词前的空白也会删除) - de
从光标处删除至单词结尾 - dE
从光标处删除至包括标点在内的担保结尾 - d^
删除至本行开头处 - D d$
从光标处删除至本行结尾 - d /pattern
删除至pattern首次出现处 - d1G
删除光标所在行至第一行 - dG
删除光标所在行至最后一行 - :n,m d
删除第n至m行 - :/pattern/d
删除下一个包含pattern的行 - :/pattern/;+n d
删除下一个包含pattern的行及后续n行 - :/pattern1/, /pattern2/d
从第一个包含pattern1的行删除到第一个包含pattern2的行
复制
- yy Y
复制光标所在行 - nyy
复制光标开始的向下n行 - " x yy
复制当前行到寄存器x - ye
复制文本到词尾 - yw
复制文本到词尾,包括词后的空格或标点 - m
移动行,如:160,224m23 - co t
复制行,如:23,29co100 - :n,m ya a
复制第n至m行到寄存器a
粘贴
- p P
粘贴在光标的下一行/上一行 - gp gP
与p P相同,但把光标放在被插入的文本后 - ]p [P
与p P相同,但符合当前的缩排 - "xp
粘贴寄存器x的内容
重做、撤销
- .
重复上次修改 - Ctrl+R
重做 - u
撤销 - "np
恢复倒数第n次删除 - "1pu.u.
逐一把每个缓冲区的内容放置到文件中
全局替换
- :s
等价于:s//~/,重复上一次替换 - :s/old/new/
将当前行中第一个出现的模式old替换为new - :s/old/new/g
将当前行中每一个old替换为new - :s/old/new/gc
c即confirm,表示每一次替换前做确认 - :g/pattern/s/old/new/g
对文件中所有满足pattern的行进行替换
备注
全局替换时,元字符只在命令的搜索部分有特殊意义,在替换字符串中大部分元字符会被当成一般字符,以下元字符例外:\n, , &, ~, \u, \l, \U, \L, \e, \E
移动
字符
- h j k l
左/下/上/右移1字符 - n
右移n字符,不填n则右移1字符 - backspace
左移一字符 - n |
移到当前行的第n个字符
单词
- b B
移动上一个单词的开头(小写把标点也视为单词) - w W
移到下一个单词的开头 - e E
移到下一个单词的结尾
行
- 0 $
移到行首/行尾 - ^ _
移到当前行的第一个非空格字符处 - - +
移到上一行/下一行的第一个字符 - Enter
移到下一行的第一个字符 - gg
移到文件的第一行 - G
移到文件的最后一行 - nG
移到文档第n行 - : n
移动文件的第n行 - H M L
移到屏幕最上方/中央/最下方那一行 - nH
移到屏幕顶端往下的第n行 - nL
移到屏幕底部往上的第n行 - Ctrl-G
显示当前行的编号
段落
- ( )
移到当前句子/下一句的开头 - { }
移到当前一段/下一段的开头 - [[ ]]
移到当前一节/下一节的开头 - [] ][
移到当前一节/下一节的结尾处
屏幕
- Ctrl-F Ctrl-B
向上/向下滚动一整屏 - Ctrl-D Ctrl-U
向上/向下滚动半屏 - z ENTER
把光标所在的行移到屏幕顶端 - z .
把光标所在的行移到屏幕中间 - z -
把光标所在的行移到屏幕低端 - Ctrl-L
重绘屏幕
搜索
- /pattern
向前搜索 - ?pattern
向后搜索 - n ;
同向继续搜索 - N ,
反向继续搜索 - *
向前搜索光标所在处的词,需匹配处完全相符的词 - #
向后搜索光标所在处的词,需匹配处完全相符的词 - %
搜索与当前的圆括号、花括号、方括号成对的符号 - / ENTER
向前重复前一个搜索 - ? ENTER
向后重复前一次搜索 - fx
本行中搜索下一个出现字符x的地方 - Fx
本行中搜索上一个出现字符x的地方 - tx
本行中搜索下一个出现字符x的上一个字符 - Tx
本行中搜索上一个出现字符x的下一个字符
标记
- mx
将当前位置标记成字符x - `x
移到标记x的位置 - 'x
移到标记x的位置的行首 - ``
回到最近一次移动前的位置 - ''
回到最近一次移动前的位置的行首 - :marks
列出活动中的标记 - `.
移到上一次改变的位置 - '.
移到上一次改变的位置的行首
插入
- i a
在当前光标之前/之后插入文本 - I A
在当前行的开始/结尾处插入文本 - o O
在游标位置的下面/上面插入新行 - gI
在行首处插入 - c
开始修改内容 - R
开始覆盖文本 - s
替换一个字符 - S
替换整行 - ESC
终止插入模式
与系统交互
- :r file
在光标后读入file的内容 - :r !cmd
在当前行后读入cmd的输出 - :n r !cmd
在第n行后读入cmd的输出 - :!cmd
运行cmd,然后返回 - :!!
重复上一个系统命令 - Ctrl-Z
暂停编辑器,用fg恢复
高级
配置
备注
:set opt 打开选项
:set noopt 关闭选项
- :set ic
忽略大小写 - :set windows=20
设置屏幕上窗口所显示的行数 - :set all
显示正在使用的选项 - :set option?
显示某选项的当前值 - :set autoindent
自动缩进 - :set shiftwidth=4
使用<>时左右移动的空格数 - :set tapstop=4
将tab替换成几个空格 - :set list
让tab看起来是控制字符^I,行尾看起来是$ - :set showmatch
输入闭括号时,会暂时移动到对应的开括号,再回到当前位置
缩写
- :ab abbr phrase
定义缩写,插入模式下输入缩写时会自动展开成原文 - :unab abbr
取消缩写 - :ab
列出当前所有定义的缩写
映射
- :map x command
定义字符x映射到编辑命令command - :unmap x
取消字符x的映射 - :map
列出所有被映射的字符
备注
- 命令序列的特殊按键ENTER, ESC, BACKSPACE, DEL等要在前面加上Ctrl-V
- 将控制字符作为映射命令时,Ctrl-T, Ctrl-W, Ctrl-X也要在前面加上Ctrl-V,其他不用
- 在映射命令中,换行是^M,转义是^[,退格是^H
补全
- 补全方式
以整行、当前文件关键字、dictionary关键字、thesaurus关键字、标签、文件名称、宏、Vim命名行、用户定义、omni、拼写建议、complete选项关键字补全 - 以文件中的关键字补全
Ctrl-X + Ctrl-N
标签
- :ctags file.c
在当前目录下创建一个tags文件,包含file.c定义的所有函数的信息 - :tag name
搜索name所在位置 - :tags
列出标签栈中的标签列表
缩排
- :set cindent
- 缩排方式
autoindent, smartindent, cindent, indentexpr - << >>
整行向左/右移动一个shiftwidth - < >
把接下来移动命令涵盖的文本向左/右移动一个shiftwidth
折叠
- za zA
切换折叠状态,小写表示只切换一个,大写表示递归切换 - zc zC
关闭折叠 - zd zD
删除折叠 - zE
删除所有折叠 - zf
创建折叠,范围从当前行到光标移动后到达的位置结束,借由移动命令改变光标位置 - [n]zf
创建涵盖n行的折叠,从当前行开始 - zi
切换foldenable选项的值 - zN zn
设置(zN)或复位(zn)foldenable选项 - zo zO
打开折叠 - zj zk
移动光标到下一个折叠开始处(zj),或前一个折叠结尾处(zk) - zm zr
递增(zr)或递减(zm)foldlevel选项的值 - :set foldenable
打开折叠功能 - :set foldmethod=syntax
设置折叠方式 - 折叠方式
manual, indent, expr, syntax, diff, marker
语法高亮
- :syntax on
打开语法设置 - :syntax enable
文件语法高亮 - :colorscheme
为不同语法高亮显示改变颜色 - :set background=light/dark
- :highlight comment
访问文件
- vim +n file
打开文件后直接到第n行 - vim + file
打开文件后直接到最后一行 - vim +/pattern file
打开文件后直接到pattern第一次出现的地方 - vim file1 file2
同时打开多个文件 - :e file
编辑另一个文件 - :e!
返回到当前文件上次写入的版本 - :e + file
打开文件后直接到最后一行 - :e +n file
打开文件后直接到第n行 - :e #
打开候补文件,并直接到先前编辑的位置 - :ta tag
于标签的位置编辑文件 - :n
编辑文件列表中的下一个文件 - :prev
编辑文件列表中的前一个文件 - :args
列出预备编辑的文件列表 - :n files
指定新的文件列表 - :rewind
编辑列表中的第一个文件 - % #
当前文件名 候补文件名 - Ctrl-G
显示当前的文件与行编号
窗口
- :new 或 Ctrl-W n
打开一个新窗口 - :new file
于一个新窗口打开file - :sp [file] 或 Ctrl-W s
水平切割窗口 - :vsp [file] 或 Ctrl-W v
垂直切割窗口 - :sn [file]
于新窗口编辑文件列表中的下一个文件 - :clo 或 Ctrl-W c
关闭当前窗口 - :hid
隐藏当前窗口 - :on 或 Ctrl-W o
使当前窗口成为唯一可见的窗口 - :res n
调整窗口尺寸为n行 - :wa
保存所有文件 - :qa
关闭所有文件并离开 - Ctrl-w
上/下/左/右移动窗口 - Ctrl-W +,-
递增/递减当前窗口的尺寸 - Ctrl-W =
平均分配所有窗口的高度
保存与离开
- :x ZZ
写入文件并离开编辑器。只有文件被修改才会写入。 - :w
保存修改的内容 - :w file
保存修改的内容到文件file - :wq
写入文件并离开编辑器。即使文件没有被修改也写入。 - n,m w file
将第n至m行的内容写入新文件 - n,m w >> file
将第n至m行的内容附加至现有的文件 - :q
离开vim,若已修改文件则操作失败 - :q!
强制离开,不做任何修改
ex
- :=
显示文件的总行数 - . $ %
当前行 最后一行 文件中的每一行 - :1,3d | s/here/there/
用竖线合并ex命令 - "f4yy | :w | :e filename | "fp
将4行文件复制到缓冲区f,再将缓冲区f粘贴到新文件 - :ya :pu
复制 粘贴 - :160,224ya a | :e destfile | :pu a
将弟160~224行文件复制到缓冲区a,再将缓冲区a粘贴到新文件 - :ve
列出编辑器的当前版本及前次改变的日期