Vim中文指南

Enjoy this cheat sheet at its fullest within Dash, the macOS documentation browser.

帮助

:help command

查找帮助

例如:help v查找关于命令v的帮助文档, 养成查找帮助文档的好习惯~

退出Vim

:q[uit]

退出Vim

操作在当文件有更改时会失败.

:q[uit]!

忽略更改并退出Vim

:qa

退出所有打开的文件

:cq[uit]

忽略更改并退出所有打开的文件

:wq

保存并退出Vim

:wqa

保存并退出所有文件

:wq!

强制保存并退出Vim

:wq {file}

保存当前文件到{file}, 文件如果在编辑的话会失败

:wq! {file}

强制保存当前文件到{file}

:[range]wq[!]

只保存指定行范围内的内容并且退出

例如1,2wq!表示只保存第一和第二行的内容,其他的的删除,然后退出

ZZ

保存并且强制退出Vim

等同于wq!

ZQ

强制退出不保存

相当于q!

编辑文件

:e[dit]

编辑(重新载入)当前文件

当文件被另一个用户重新保存时,:e命令会重新从文件系统加载文件

:e[dit]!

强制编辑(重新载入)当前文件

忽略当前更改,强制从文件系统重新加载文件,当需要忽略当前更改时有用

:e[dit] {file}

编辑{file}

:e[dit]! {file}

编辑{file}

忽略当前文件的更改,强制编辑{file}

gf

编辑光标下文件名所代表的文件

助记: goto file

插入文本

a

在光标后开始插入

A

在光标所在行尾开始插入

i

在光标前开始插入

I

在光标所在行头开始插入

o

在当前光标下新起一行开始编辑

O

在当前光标上新起一行开始编辑

插入文件

:r[ead] [name]

读取并插入[name]的文件内容到当前光标下

例如 :r sys.log 将sys.log的内容插入到当前光标下

:r[ead] !{cmd}

执行命令并且将命令的标准输出插入到当前光标下

例如 :r !date 把当前日期插入到当前光标下一行

删除文本

x

删除光标之后的字符

<Del>

X

删除光标之前的字符

d{motion}

删除{motion}所代表范围内的文本

例如 dw删除光标所在单词中光标以及后面的单词 ; daw删除光标所在单词; d$删除光标所在行后面的字符; d0删除光标所在行前面的字符

[count]dd

删除光标及以下一共[count]行, 如不指定[count]则删除光标所在行

D

删除光标所在行后面的字符

相当于 d$

{Visual}x

{Visual}d

在可视化模式下删除选中的字符

查看可视化模式下的文本选择类目

{Visual}CTRL-H

{Visual}<BS>

在选择模式下删除选中的文本, gh进入选择模式

{Visual}X

{Visual}D

在可视化模式下删除选中的行

:[range]d[elete]

删除[range]范围内的行

默认情况下删除当前光标所在行, 例如:2d删除第二行, :2,3d删除第二到第三行

:[range]d[elete] {count}

从指定范围开始删除{count}行

例如:2d 10从第二行开始删除十行

变更/替换文本

r{char}

用{char}替换光标下的字符

R

进入插入模式,但是对于输入是替换而不是插入

例如按R后输入1234,如果插入的位置原本有字符,那么原来的字符将被替换成1234,行的长度不会增加

~

切换光标所在字符的大小写,并且光标向右移

可以在光标所在处连续将后面的字符的大小写更改

g~{motion}

替换{motion}范围内的文本的大小写

{Visual}~

切换选中文本的大小写

{Visual}U

切换选中文本到大写

SHIFT+I+<comment-char>+ESC+ESC

块插入

CTRL+V进入块选择,选择完之后按照上述操作输入想插入的字符

x

块删除

CTRL+V进入块选择,然后x删除选中的字符

信息

%

跳转和光标上的字符对应的字符上去

例如文本[error], 在[上%会跳转到]上,反之跳转到[上

*

搜索光标所在单词并高亮

范围

范围允许将命令应用于当前缓冲区中的一组行。对于大多数命令,默认范围是当前行。

  • :21s/old/new/g - 替换第21行的old为new
  • :1s/old/new/g - 第一行
  • :$s/old/new/g - 最后一行
  • :%s/old/new/g - 所有行
  • :.,$s/old/new/g - 当前行到最后一行

替换(substitute)

对范围内的每一行替换{pattern}为{string}

:[range]s[ubstitute]/{pattern}/{string}/[c][e][g][p][r][i][I] [count]

重复上一步:使用相同的搜索模式和替换字符串进行替换,但不使用相同的标志

:[range]s[ubstitute] [c][e][g][r][i][I] [count] :[range]&[c][e][g][r][i][I] [count]

你可以添加其他的标志。

替换时你能使用的参数如下:

  • [c] 确认每一次替换,Vim会执行对应匹配的内容. 你能输入以下命令:

    • y 替换(Y)
    • n 跳过(N)
    • a 替换其余所有
    • q 退出
    • CTRL-E 向上滚动屏幕
    • CTRL-Y 向下滚动屏幕
  • [e] 当搜索模式失败时,不要发出错误消息,继续进行

  • [g] 替换行中出现的所有项。如果没有此参数,则仅对每行中的第一个匹配进行替换

  • [i] 忽略匹配时的大小写

  • [I] 不忽略匹配时的大小写

  • [p] 打印替换的最后一行内容

拷贝/移动文本

"{a-zA-Z0-9.%#:-"}

使用寄存器存储临时数据,用于下一次操作

:reg[isters]

:di[splay]

展示所有寄存器的值

:reg[isters] {arg}

:di[splay] [arg]

查看指定寄存器的值

["x]y{motion}

复制{motion}所代表的内容[到寄存器x]

["x][count]yy

["x][count]Y

复制[count]行(默认当前行)[到寄存器x]

{Visual}["x]y

可视化模式下复制选中文本[到寄存器x]

见选择文本相关内容

{Visual}["x]Y

可视化模式下复制选中行[到寄存器x]

:[range]y[ank] [x]

复制[range]行范围[到寄存器x]

:[range]y[ank] [x] {count}

复制{count}行[到寄存器x], [range]取最后一个数字

默认取当前行

["x][count]p

粘贴[寄存器x]内容[count]次到光标后

默认是匿名寄存器

["x][count]P

粘贴[寄存器x]内容[count]次到光标前

["x]gp

p, 然后将光标移至新文本后

["x]gP

P, 然后将光标移至新文本后

:[line]pu[t] [x]

粘贴[寄存器x]内容到[line]行后

默认当前行

:[line]pu[t]! [x]

粘贴[寄存器x]内容到[line]行前

撤消、重做和重复

[count]u

撤销前[count]个修改

:u[ndo]

撤销上一次操作

[count]CTRL-R

重做[count]个撤销操作,即恢复

:red[o]

重做上个撤销操作

U

恢复当前行(即一次撤销对当前行的全部操作)

.

重复上一命令对编辑缓冲区的修改

光标移动

基础命令

  k              <上>
h   l      <左>         <右>
  j              <下>

[count]h

[count]<Left>

向左移动

[count]l

[count]<Right>

[count]<Space>

向右移动

[count]k

[count]<Up>

[count]CTRL-P

向上移动

[count]j

[count]<Down>

[count]CTRL-J

[count]<NL>

[count]CTRL-N

向下移动

0

<Home>

行首

^

到行首的第一个非空字符

$

<End>

行尾

g0

g<Home>

对于超出屏幕的一行,移动到屏幕的最左边不是整行的最左边,而是屏幕的最左边

g^

g0不同的是移动到第一个非空字符

g$

g<End>

对于超出屏幕的一行,移动到屏幕的最右边不是整行的最右边,而是屏幕的最右边

f{char}

在当前行往右边寻找下一个{char}出现的位置

fd寻找下一个d出现的位置

F{char}

在当前行往左边寻找上一个{char}出现的位置

f{char}命令相反

t{char}

正向移动到下一个{char}的前一个字符上

T{char}

反向移动到上一个{char}的后一个字符上

[count];

重复上一个fFtT命令[count]次

[count],

反方向重复上一个fFtT命令[count]次

当跳转过头了之后可以使用,操作回到之前的位置

- <minus>

向上[count]行,光标回到行首第一个非空字符上

+

CTRL-M

<CR>

向下[count]行,光标回到行首第一个非空字符上

_ <underscore>

向下[count]-1行,光标回到行首第一个非空字符上

CTRL-End

G

去第[count]行首第一个非空字符

默认:最后一行

CTRL-Home

gg

去第[count]行首第一个非空字符

默认:第一行

SHIFT-Right

w

按照标点或者空格向右移动[count]个词,光标在词的开头

例如ii d d d,e,d w,dd, 对于空格和标点w都作为分隔符

CTRL-Right

W

按照空格向右移动[count]个词,光标在词的开头

例如ii d d d,e,d w,dd, 对于空格W作为分隔符

e

按照标点或者空格向右移动[count]个词,光标在词的结尾

E

按照空格向右移动[count]个词,光标在词的结尾

SHIFT-Left

b

按照标点或者空格向左移动[count]个词,光标在词的开头

CTRL-Left

B

按照空格向左移动[count]个词,光标在词的开头

ge

按照标点或者空格向左移动[count]个词,光标在词的结尾

gE

按照空格向左移动[count]个词,光标在词的结尾

H

移动光标到屏幕上方

M

移动光标到屏幕中间

L

移动光标到屏幕底部

zz

当前行滚动到屏幕中间

zt

当前行滚动到屏幕顶部

zb

当前行滚动到屏幕底部

以下命令在words或者WORDS间移动 word由字母、数字和下划线组成,或者由其他非空白字符组成,用空格(空格、制表符、<EOL>)分隔。这可以通过“iskeyword”选项进行更改。 WORD由一系列非空白字符组成,用空格分隔。空行也被认为是一个单词和一个单词。

(

向后跳过[count]个sentences

)

向前跳过[count]个sentences

{

向后跳过[count]个段落

}

向前跳过[count]个段落

]]

向前跳过[count]节或者跳到下个第一列的{

通过:help ]]获取帮助信息

][

向前跳过[count]节或者跳到下个第一列的}

通过:help ][获取帮助信息

[[

向后跳过[count]节或者跳到下个第一列的{

通过:help [[获取帮助信息

[]

向后跳过[count]节或者跳到下个第一列的}

通过:help []获取帮助信息

标记

m{a-zA-Z}

在光标所在位置设置标记{a-zA-Z}

标记可以方便在文档的不同位置之间跳转

m'

m\`

设置前面的上下文标记

通过:help m'获取更多信息

:[range]ma[rk] {a-zA-Z}

:[range]k{a-zA-Z}

在[range]的最后一个数字所在行首设置标记{a-zA-Z}

默认为光标所在行

'{a-z}

跳转到标记{a-z}

例如'a跳转到标记a

'{A-Z0-9}

跳转到标记{A-Z0-9}

大写标记可以跨越不同的缓冲区, 即可以在不同的文件之间跳转

`{a-z}

跳转到标记{a-z}

`{A-Z0-9}

跳转到标记{A-Z0-9},这个命令跨越不同的缓冲区

:marks

列出所有标记

:marks {arg}

列出指定的标记

搜索

/{pattern}[/]<CR>

往前搜索匹配{pattern}的内容

例如/df从光标处向前搜索匹配df的内容

/{pattern}/{offset}<CR>

往上或往下{offset}行向前搜索匹配{pattern}的内容

/<CR>

重复上一次向前搜索

//{offset}<CR>

重复上一次向前搜索

?{pattern}[?]<CR>

向后搜索匹配{pattern}的内容

?{pattern}?{offset}<CR>

往上或往下{offset}行向后搜索匹配{pattern}的内容

?<CR>

重复上一次向后搜索

??{offset}<CR>

重复上一次向后搜索

n

跳到下一个搜索结果

N

跳到上一个搜索结果

:lv {pattern} [g][j] {file(s)}

使用内部的grep命令在文件中搜索,,

结果放在QuickFix列表中,列表可以使用:cw打开

  • 'g' 返回所有匹配项,而不仅仅是每行一个匹配项
  • 'j' 不自动调到第一个匹配项
  • 递归搜索使用**模式例如**/*.c

选择文本(可视化模式Visual Mode)

要选择文本,请使用下面的命令之一进入可视化模式,并使用运动命令高亮显示感兴趣的文本。然后,对文本使用一些命令。

可以使用的操作符是:

  • ~ 切换大小写
  • d 删除
  • c 更改
  • y 复制
  • > 右挪
  • < 左挪
  • ! 使用外部命令过滤
  • = 使用'equalprg'过滤
  • gq 将行格式化为“textwidth”长度

v

按字符启动可视化模式

V

按行启动可视化模式(水平方向)

CTRL-V

按行启动可视化模式(垂直方向)

<Esc>

退出可视化模式

viw

可视化模式下选择当前光标所在单词

暂停

CTRL-Z

暂停Vim

将vim放置在后台, 使用jobs命令可以查看有哪些后台vim在运行, 使用fg 序号命令可以将对应的vim转到前台

:sus[pend][!]

:st[op][!]

暂停Vim!

多窗口

:e filename

编辑另一个文件

:split filename

水平拆分窗口然后打开另一个文件

CTRL-W v

垂直拆分窗口

CTRL-W s

水平拆分当前窗口

CTRL-W Arrow Up

移动光标到上一个窗口

CTRL-W CTRL-W

循环切换窗口

CTRL-W_

最大化当前矿口

CTRL-W=

所有窗口一样大

10 CTRL-W+

将当前窗口增大10行高度

:vsplit file

垂直拆分并打开另一个文件

:sview file

split的readonly模式

:hide

关闭当前窗口

:only

仅保持当前窗口打开

:ls

展示当前缓存区列表(文件列表)

:b 2

打开缓冲区中编号为2的文件

:bd[n]

关闭当前缓冲区

标签式浏览

当编辑程序时,通常需要跳转到另一个位置。Vim使用一个标记文件来列出每个单词和 的位置。标记文件必须由能够处理文件语法的实用程序创建,并且必须在进行了重要的编辑之后进行更新。

CTRL-]

LMB-on-tag+CTRL

g LMB-on-tag

跳转到标签

CTRL+t

跳转后返回

:tags

显示标签堆栈

内部列表

  • Vim使用一个全局的QuickFix列表. 列表包含了由其他命令填充的文件位置.
  • Vim每个窗口有一个位置列表。该列表类似于QuickFix列表,包含文件中的位置列表。

:cw

打开全局的QuickFix列表

:ccl

关闭QuickFix列表

:lw

打开位置列表

Notes