Vim技巧之四大模式_普通模式
众所周知,vim
里面最具特色的东西就是它能够切换模式,那什么是模式呢?能够简单的理解为在不同的模式以下按同样的键而得到不同的效果。比方Vim
在插入模式以下连按两次d
,那么就会在光标位置插入两个字母d
,假设在普通模式以下连按两次d
。那么光标所在当前行将会被删除。
既然说是Vim
的四大模式,那么Vim
究竟有那四大模式呢?
- 普通模式
- 插入模式
- 可视模式
- 命令行模式
用户能够通过按<ESC>
来在各个模式之间进行切换,以下我们将具体的介绍普通模式,其它模式我们将在兴许的文章中进行具体介绍
一见不钟情的普通模式
像Emacs
,Sublime Text
这些主流的编辑器在打开以后直接就能够向里面输入自己的想要的内容。可是对于第一次使用Vim
的新手来说,并不和自己想象中的一样,倒腾了一会儿就会開始抓狂:
- 怎么在这个框框里面输入文本啊?
- 天啦噜,怎么退出这个黑框框???。!
(博主一開始都是kill -9关掉的。哭死)
Vim
在开启的时候默认是使用普通模式的,例如以下图所看到的
假设你须要在这个黑框框里面输入一些什么东西的话,你能够在屏幕上按以下随意一个健。Vim
就会进入插入模式。接着就能够输入文本了
按键 | 功能 |
---|---|
a | 在光标后面进行插入 |
A | 在当前光标所在行末尾插入 |
i | 从光标所在出插入 |
I | 在当前光标所在行首插入 |
o | 在当前行以下新建一行,并进行插入 |
O | 在当前行上面新建一行。并进行插入 |
那要是退出插入模式回到之间的普通模式呢?直接按<ESC>
就能够啦
这时候你可能就会问了。不是有一个插入模式就能够了么?为啥还要加一个普通模式呢?你看其它编辑器都没有这么多的模式。。。这就是Vim的精化所在,对于其它编辑器来说,假设要实现一个比較复杂的操作,基本上都是通过<Ctrl>
,<Alt>
,<Shilt>
组合来完毕的,可是Vim
偏不这样,Vim
是通过在不同模式之间的切换来实现复杂的操作。简单来说。普通模式就是用来发动技能的。而插入模式则是进行简单的文本操作
比方须要删除当前光标所在行,对于没有模式的编辑器是这样发动这个技能的
<CTRL-K>
(Emacs)
<CTRL-L><Backspace>
(Sublime Text)
假设是Vim
,那么首先进入普通模式,然后发动删除行的技能
<ESC>
(进入到普通模式)。dd
(删除当前行)
个人还是比較喜欢Vim
一点。简洁明了。之前也试过Ctrl
到死的Emacs
,组合按键真是多。对与手小的人来说简直就是一种折磨!
普通模式以下的强悍操作
普通模式以下的操作能够解释为以下这个公式:
什么是操作符?
操作符就是你打算接下来要干什么?比方上文中提到的d
,就是删除操作符,除了删了操作符。还有以下这些操作符:
操作符 | 用途 |
---|---|
c | 改动 |
d | 删除 |
y | 复制 |
g~ | 大写和小写反转 |
gu | 转为小写 |
gU | 转为大写 |
> | 向右缩进 |
< | 向佐缩进 |
= | 自己主动缩进 |
什么是动作命令?
操作符是用来指定一个操作,这个操作也不能瞎操作吧?我要删除一行文本,不能把整个文件的所有内容都给删了吧。。。所以,简单来说。动作命令就是用来指定操作符作用的范围
那动作命令有那些呢?事实上动作命令比較灵活,这里我总结为有两类:
- 一类是文本对象,比方aw , ap
- 一类是位置范围, 比方l ,j,k,f{char},$,^,0…
文本对象类型的动作命令
文本对象 | 操作范围 |
---|---|
aw | 光标所在单词加上一个空格 |
iw | 光标所在单词 |
ap | 光标所在段落 |
i< | <> 里面的文本 |
i{ | {} 里面的文本 |
i” | "" 里面的文本 |
假设如今有这样一行文本
I am a Vimer
我们须要删除Vimer
这个单词
$
(移动到行尾)
daw
(删除光标所在单词以及一个空格)
最后得到:
I am a
位置范围类型的动作命令
那什么是位置范围呢?就是从当前光标開始,经过一次移动命令以后新的光标位置之间的文本。比方3j
,10<Space>
,3l
,f{char}
等等等等。仅仅要能够移动光标的命令都能够
假设如今有这样一行文本
I am a Vimer
我们要将Vimer
这个单词字幕e
之间的文本所有转为大写
0
(移动到行首)
gUte
(操作符(gU)+(新的光标位置te))
最后得到:
I AM A VIMer
注意一点:
当一个操作符当被连续两次调用的时候。相应的作用范围就是当前行,比方dd
就是删除当前行,yy
就是复制当前行,gUgU
就是将当前行转为大写
误操作怎么办?
我们能够切换到普通模式。然后u
,就能够撤消之前进行的误操作,比方用dd
误删了一行文本。我们直接输入u
就能够撤消之前的删除操作
以下我们来看一个栗子:
输入一行文本
I am a Vimer
发现将Vimer误输为Vier,于是返回到普通模式,点击u
希望撤消这个错误的单词输入,可是惊奇的发现之前输入的I am a
文本也不见了,Vim
撤消的太多了。!
那该怎么办?怎么控制Vim
撤消的粒度呢?
u
键会触发撤消命令,它会撤消最新的改动。一次改动能够是改变文档内文本的随意操作,当中包含了在普通模式,可视模式。以及命令行模式中所触发的命令,并且一次改动也包含了在一次插入模式中输入或者删除的文本,也就是说i{insert some stuff}<ESC>
算是一次改动
所以我们还是能够控制u
撤消的粒度的。在插入模式中。每一次<ESC>
就算是一次粒度的控制
那种操作更划算?
什么叫做划算?那就是用最少的按键操作完毕很多其它的文本操作
举个栗子:
如今须要删除以下文本的最后一个单词
I am a Vimer
操作一:
$
db(向前删除单词)
x(删除x)
操作二:
$
b(最后一个单词的词首)
dw(删除单词)
操作三:
$
daw
上面三个操作都是用同样的按键数。这一步上大家打成平手,要是我们还要把剩下的两个单词都删除呢?前两个操作明显还须要从头反复一次。可是第三个操作我们仅仅须要用.
操作就能够反复改动命令,所以操作三明显更划算!所以划算的更宽广的定义不仅是当前操作,还有将来的操作也要计算进来
普通模式下的神奇大招
这个神奇大招事实上就是
<C-a>
:对数字进行加操作<C-x>
:对数字进行减操作
<C-a>
命令会把当前光标之上或者之上的数加1,假设须要加多次,能够[count]<C-a>
,这样就会使数值加上count
举个栗子:
现有一段文本:
I am 23 years old
如今须要将23
改为24
,假设如今你不知道这个技巧,那就仅仅有
f3
(移动到3
)
r4
(将3
改为4
)
未免太繁琐了
如今我们仅仅须要
<Ctrl-a>
(光标立刻跳转到23
上,并将数值加1
,变为24
)
要是如今需将23
改为1023
(千年老妖了)
仅仅须要
1000<Ctrl-a>
同理可得<C-x>