众所周知,vim
里面最具特色的东西就是它可以切换模式,那什么是模式呢?可以简单的理解为在不同的模式下面按相同的键而得到不同的效果。比如Vim
在插入模式下面连按两次d
,那么就会在光标位置插入两个字母d
,如果在普通模式下面连按两次d
,那么光标所在当前行将会被删除。
既然说是Vim
的四大模式,那么Vim
到底有那四大模式呢?
用户可以通过按<ESC>
来在各个模式之间进行切换,下面我们将详细的介绍普通模式,其他模式我们将在后续的文章中进行详细介绍
像Emacs
,Sublime Text
这些主流的编辑器在打开以后直接就可以向里面输入自己的想要的内容,但是对于第一次使用Vim
的新手来说,并不和自己想象中的一样,倒腾了一会儿就会开始抓狂:
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 | 光标所在单词加上一个空格 |
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>
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/ii1245712564/article/details/46768097