Vim
模式
正常模式(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
(代替 <ESC>
上文有提到)退出。
大小写转换
~
将光标下的字母改变大小写
n~
将光标位置开始的 n 个字母改变其大小写
g~~
改变当前行字母的大小写
gUU
将当前行的字母改成大写
guu
将当前行的字母全改成小写
ngUU
将从光标开始到下面 n 行字母改成大写
gUw
将光标下的单词改成大写
guw
将光标下的单词改成小写
VIM 的重复命令
==.
== 重复上一个操作的命令
n<command>
重复某个命令 n 次,如 10p 复制 10 次,10dd 删除十次。
插入模式(Insert-mode)
在命令模式下按下 i
就进入了插入模式,进入编辑状态,通过键盘输入内容
从正常模式进入插入模式时
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>
,可以看到选中的区域前面或者后面会有输入的内容。
词汇表
语法规则
verb + noun # 动词 + 名词
名词(动作 Motion)
动作对象
h 左
j 下
k 上
l 右
w 向前移动到下一个单词的开头
} 跳转到下一个段落
$ 跳转到当前行的末尾
文本对象
i + object 内部文本对象
a + object 外部文本对象
w 一个单词*
p 一个段落
s 一个句子
(或) 一对()
{或} 一对{}
[或] 一对[]
<或> 一对<>
t XML标签
" 一对""
' 一对''
` 一对``
动作(操作符 Operator)
y 复制(yank)
d 删除(delete)
c 删除(change)文本,将删除的文本存到寄存器中,进入插入模式
动作也接受数字作为参数
移动
字符导航
上下左右移动一个字符
h 左
j 下
k 上
l 右
对移动计数
[计数] + 移动
单词导航
w 移动到下一个单词的开头*
W 移动到下一个词组的开头
e 移动到下一个单词的结尾
E 移动到下一个词组的结尾
b 移动到前一个单词的开头*
B 移动到前一个词组的开头
ge 移动到前一个单词的结尾
gE 移动到前一个词组的结尾
一个单词指的是一个只包含 a-zA-Z0-9
字符串,一个词组指的是一个包含除了空字符 (包括空格,tab,EOL) 以外的字符的字符串
当前行导航
0 跳到本行第一个字符*
^ 跳到本行第一个非空字符*
g_ 跳到本行最后一个非空字符
$ 跳到本行最后一个字符*
n| 跳到本行第n列
在本行通过 f
和 t
进行行内搜索
f 在同一行向后搜索第一个匹配*
F 在同一行向前搜索第一个匹配
t 在同一行向后搜索第一个匹配,并停在匹配前
T 在同一行向前搜索第一个匹配,并停在匹配前
; 在同一行重复最近一次搜索*
, 在同一行向相反方向重复最近一次搜索*
段落导航
一个段落从一个空行之后开始
{ 跳转到上一个段落
} 跳转到下一个段落
行号导航
gg 跳转到第一行
G 跳转到最后一行
nG 跳转到第n行
n% 跳到文件的n%
窗格导航
H 跳转到屏幕的顶部
M 跳转到屏幕的中间
L 跳转到屏幕的底部
nH 跳转到距离顶部n行的位置
nL 跳转到距离底部n行的位置
滚动
Ctrl-e 向下滚动一行*
Ctrl-d 向下滚动半屏
Ctrl-f 向下滚动一屏
Ctrl-y 向上滚动一行*
Ctrl-u 向上滚动半屏
Ctrl-b 向上滚动一屏
相对当前行进行滚动
zt 将当前行置于屏幕顶部附近
zz 将当前行置于屏幕中央
zt 将当前行置于屏幕底部
搜索导航
/ 向后搜索一个匹配
? 向前搜素一个匹配
n 重复上一次搜索(和上一次方向相同)
N 重复上一次搜索(和上一次方向相反)
快速搜索光标下的文本
* 向后查找光标所在的完整单词
# 向前查找光标所在的完整单词
g* 向后搜索光标所在的单词
g# 向前搜索光标所在的单词
位置标记
通过标记保存当前位置并在之后回到这个位置,就像文本编辑中的书签。通过 mx
设置一个标记,其中 x
可以是 a-zA-Z
。
ma 用a标签标记一个位置
`a 精确回到a标签的位置(行和列)
'a 跳转到a标签的行