Vim 教程

Vim

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/vi-vim-cheat-sheet-sch.gif

模式

正常模式(Normal-mode)

正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作

启动 VIM 后默认位于正常模式。

不论是什么模式,按 <Esc> 键都会进入正常模式 ( 插入模式按一下 Esc ,就会切换到正常模式,命令模式或者可视模式下执行完操作以后,就会自动进入正常模式,如果进入命令模式或者可视模式没有执行任何操作,按两下 Esc 即可 )

快速移动光标

h,j,k,l 左,下,上,右

当前行移动光标

==0== 移动到行头

==^== 移动到本行第一个不是blank的位置

==$== 移动到行尾

g_ 移动到本行最后一个不是blank的位置

==w== 光标移动到下一个单词的开头

e 光标移动到下一个单词的结尾

==fa== 移动到本行下一个为 a 的字符处

nfa 移动到本行光标处开始的第 n 个 字符为 a 的地方

Fa 移动到本行上一个为 a 的字符处

nFa 移动到本行上一个第 n 个 字符为 a 的地方

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

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

Ta 移动光标至 a 字符的后一个字符

nTa 移动到第 n 个 a 字符的后一个字符处

;, 当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 可以快速跳转到写一个指定的字符,, 是跳到前一个指定的字符

跨行移动光标

==nG == 光标定位到第 n 行的行首

==gg == 光标定位到第一行的行首

==G == 光标定位到最后一行的行首

H 光标定位到当前屏幕的第一行行首

M 光标移动到当前屏幕的中间

L 光标移动到当前屏幕的尾部

==zt== 把当前行移动到当前屏幕的最上方,也就是第一行

==zz== 把当前行移动到当前屏幕的中间

==zb== 把当前行移动到当前屏幕的尾部

% 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上

==*== 和 ==#== 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( * 是下一个,# 是上一个)

翻页操作

==ctrl+f== 查看下一页内容

==ctrl+b== 查看上一页内容

VIM 的复制,黏贴 ,删除

三个重要的快捷键 d , y , p

d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:

==dw== 删除一个单词

==dnw== 删除 n 个单词,

dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )

dnfa 删除光标处到第 n 个 a 的字符处

==dd== 删除一整行

ndd 删除光标处开始的 n 行

d$ 删除光标到本行的结尾

dH 删除屏幕显示的第一行文本到光标所在的行

dG 删除光标所在行到文本的结束

y 复制,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:

==yw== 复制一个单词,还有 ==ynw==

yfa 复制光标到下一个 a 的字符处,还有 ynfa

==yy== 复制一行,还有 nyy

y$ 复制光标到本行的结尾

yH 复制屏幕显示的第一行文本到光标所在的行

yG 复制光标所在行到文本的结束

p 黏贴,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。

==p== 在光标后开始复制

P 大写的 P 光标前开始复制

撤销操作和恢复

==u== 撤销刚才的操作

ctrl + r 恢复撤销操作

删除字符操作和替换

==x== 删除光标当前所在的字符

==r== 替换掉光标当前所在的字符

R 替换掉从光标开始以后的所有字符,除非 <ESC > 退出,或者 jj (代替 上文有提到)退出。

大小写转换

~ 将光标下的字母改变大小写

n~ 将光标位置开始的 n 个字母改变其大小写

g~~ 改变当前行字母的大小写

gUU 将当前行的字母改成大写

guu 将当前行的字母全改成小写

ngUU 将从光标开始到下面 n 行字母改成大写

gUw 将光标下的单词改成大写

guw 将光标下的单词改成小写

VIM 的重复命令

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

插入模式(Insert-mode)

在命令模式下按下i就进入了插入模式,进入编辑状态,通过键盘输入内容

从正常模式进入插入模式时

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
i	在光标所在的字符前插入文本。

I 	在光标所在行的行首插入文本。

a 	在光标所在的字符之后插入文本。

A 	在光标所在行的行尾插入文本。

o 	光标所在行的下一行行首文本。

O 	光标所在行的上一行行首文本。

s 	除光标所在处的字符然后插入文本。

S 	除光标所在行,在当前行的行首开始插入需要录入的文本。

cw	删除从光标处开始到该单词结束的所有字符,然后插入文本

在输入模式下, 如果你按下Ctrl-o,你就会进入到insert-normal(输入-普通)子模式。如果你关注一下左下角的模式指示器,通常你将看到-- INSERT -- ,但是按下Ctrl-o后就会变为-- (insert) --。 在这一模式下,你可以执行一条普通模式的命令

命令模式(Command-mode)

在正常模式中,按下(冒号)键或者/ (斜杠),会进入命令模式。

在命令模式中可以执行一些输入并执行一些 VIM 或插件提供的指令

行操作

==:set nu== 显示行号。

==:set nonu== 不显示行号

==:n== 定位到第n

关键字查找

==:/{word}==

输入==n==定位到下一个匹配,==N ==定位到上一个匹配。

:set ic 查找时不区分大小写

:set noic 查找时区分大小写

删除

:n1,n2d

删除多行文本。n1 n2 指的是起始行号和结束行号,d 是删除关键字

替换

:{作用范围}s/{目标}/{替换}/{替换标志}

作用范围

  • s 当前行
  • %s 全文
  • n1,n2s n1 到 n2 行

替换标志

  • 空替换标志表示只替换从光标位置开始,目标的第一次出现
  • g 全局(global)替换
  • i 大小写不敏感
  • I 大小写敏感
  • c 需要确认

使用ab

:ab {key} {word}

该命令执行后,然后切换到编辑模式下,输入 key 值会把输入的 key 值自动替换成 word 值

可视模式(Visual-mode)

在正常模式按下v, V, <Ctrl>+v,可以进入可视模式。

可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。

v字符可视化,按下键盘上的v以后,屏幕底部应该会有一个 VISUAl 的提示,操作 h,j,k,l就选中文本,继续按 v 退出可视化模式。

V 行可视化,按下键盘上的V以后,屏幕底部应该有一个 VISUAL LINE 的提示,操作j,k可以向上或者向下以行为单位选中文本,继续按下 V 退出可视化模式。

Ctrl+v 块状可视化,按下键盘上的 Ctrl+v 以后,屏幕底部应该会有一个提示 VISUALBLOCK ,可以通过 h,j,k,l 块状的操作选择区域,这是很多编辑器都不可以做到的,继续按下Ctrl+v会退出可视化模式。

操作文本

可视化模式下选择操作区域以后

按下 d会删除选择的区域

按下y会复制选择的区域

按下 p 会黏贴选择的区域

字符模式下的特殊操作

当操作的文本光标在 “”,‘’ ,(),{} ,[(双引号,单引号,小括号,大括号,中括号)当中时

va"选中 ”“ 内的所有内容包括双引号 ,

==vi"== 选中 "" 内的所有内容,不包括 ""

块区域下的特殊操作

Ctrl+v 选中块区域以后,按下大写的 I 或者 A 可以在区域的前面或者后面输入内容,按下jj或者 <ESC>,可以看到选中的区域前面或者后面会有输入的内容。

词汇表

语法规则

1
verb + noun # 动词 + 名词

名词(动作Motion)

动作对象

1
2
3
4
5
6
7
h	左
j	下
k	上
l	右
w	向前移动到下一个单词的开头
}	跳转到下一个段落
$	跳转到当前行的末尾

文本对象

1
2
i + object  内部文本对象
a + object  外部文本对象
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
w     一个单词*
p     一个段落
s     一个句子
(或)  一对()
{或}  一对{}
[或]  一对[]
<或>  一对<>
t     XML标签
"     一对""
'     一对''
`     一对``

动作(操作符Operator)

1
2
3
y	复制(yank)
d	删除(delete)
c	删除(change)文本,将删除的文本存到寄存器中,进入插入模式

动作也接受数字作为参数

移动

字符导航

上下左右移动一个字符

1
2
3
4
h   左
j   下
k   上
l   右

对移动计数

1
[计数] + 移动

单词导航

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
w	移动到下一个单词的开头*

W	移动到下一个词组的开头

e	移动到下一个单词的结尾

E	移动到下一个词组的结尾

b	移动到前一个单词的开头*

B	移动到前一个词组的开头

ge	移动到前一个单词的结尾

gE	移动到前一个词组的结尾

一个单词指的是一个只包含a-zA-Z0-9字符串,一个词组指的是一个包含除了空字符(包括空格,tab,EOL)以外的字符的字符串

当前行导航

1
2
3
4
5
6
7
8
9
0	跳到本行第一个字符*

^	跳到本行第一个非空字符*

g_  跳到本行最后一个非空字符

$	跳到本行最后一个字符*

n|  跳到本行第n列

在本行通过ft进行行内搜索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
f   在同一行向后搜索第一个匹配*

F   在同一行向前搜索第一个匹配

t   在同一行向后搜索第一个匹配,并停在匹配前

T   在同一行向前搜索第一个匹配,并停在匹配前

;   在同一行重复最近一次搜索*

,   在同一行向相反方向重复最近一次搜索*

段落导航

一个段落从一个空行之后开始

1
2
{   跳转到上一个段落
}   跳转到下一个段落

行号导航

1
2
3
4
5
6
7
gg	跳转到第一行

G	跳转到最后一行

nG	跳转到第n行

n%	跳到文件的n%

窗格导航

1
2
3
4
5
6
7
8
9
H   跳转到屏幕的顶部

M   跳转到屏幕的中间

L   跳转到屏幕的底部

nH  跳转到距离顶部n行的位置

nL  跳转到距离底部n行的位置

滚动

1
2
3
4
5
6
Ctrl-e    向下滚动一行*
Ctrl-d    向下滚动半屏
Ctrl-f    向下滚动一屏
Ctrl-y    向上滚动一行*
Ctrl-u    向上滚动半屏
Ctrl-b    向上滚动一屏

相对当前行进行滚动

1
2
3
zt    将当前行置于屏幕顶部附近
zz    将当前行置于屏幕中央
zt    将当前行置于屏幕底部

搜索导航

1
2
3
4
/   向后搜索一个匹配
?   向前搜素一个匹配
n   重复上一次搜索(和上一次方向相同)
N   重复上一次搜索(和上一次方向相反)

快速搜索光标下的文本

1
2
3
4
5
6
7
*   向后查找光标所在的完整单词

#   向前查找光标所在的完整单词

g*  向后搜索光标所在的单词

g#  向前搜索光标所在的单词

位置标记

通过标记保存当前位置并在之后回到这个位置,就像文本编辑中的书签。通过mx设置一个标记,其中x可以是a-zA-Z

1
2
3
4
5
ma    用a标签标记一个位置

`a    精确回到a标签的位置(行和列)

'a    跳转到a标签的行