什么是最后一个教程呢?就是说看完这个教程,以后再也不需要诸如:Vim快速入门,3小时学会Vim等等之类的入门教程了。
为什么可以写出最后一个教程?因为Vim操作其实是一种语言系统,这个语言系统是针对文字编辑设计的。是系统就是有结构的,这个文章就是要告诉你的Vim的基本语言结构以及如果用这个语言表达文字编辑的各种场景。
掌握Vim,提高效率最主要的事情是掌握Vim的语言,并且在这个语言框架内描述问题。
最后我会用Vim语言说一些话,猜猜他们都是什么意思?不过让我们先来看看Vim语言的基本元素和规则。
0、Vim 语言
编辑文字主要涉及定位和操作,定位就是找到想要操作的位置,比如移动光标,翻页,搜索等等;操作就是实际的动作,比如删除、替换、复制、粘贴等等。
为了完成上述操作,Vim的语言中主要包含三种词汇:动词,名词和形容词。通常Vim语言中的词汇用一个字母就可以表示,换句话说,一个字母或者符号就是一个词。后面我们会发现,有时候名词可以做动词用(就像我们的自然语言)。需要注意的是,Vim中大写和小写通常代表了类似词意的不同应用形式。
其中有一些词汇会将我们带入不同的“模式”中,或者说切换“语境”。也就是说,在不同的语境中,同的词会有不一样的意义。
1、基本元素
动词,表达动作:
v
:选择。(大写)选择一行d
:删除。(大写)删除一行y
:复制。(大写)复制一行yy
: 另一种复制一行p
:粘贴。(大写) 在光标前粘贴c
:改变。r
:替换/
:搜索~
:改变大小写t
:到,搜索并把光标停在目标前。(大写)向前搜索f
:到,搜索并把光标停在目标上 。(大写)向前搜索hjkl
:经典的移动光标的词汇,左、下、上、右u
:Undo.
: Redo:
:切换到执行模式
名词,Vim中叫文字对象(Text Ovjects),他们是我们表达基本客体。
w
:词,大写意味着忽略标点。动名词,光标移动一个词,大写则向前移动s
:句子。动名词,光标移动一个句子,大写则向前移动p
:段落。动名词,光标移动一个段落,大写则向前移动(
or)
:句子, 当在某个语境 s 有其他意思的时候,用这个{
or}
:也是段落的意思,当在某个语境 p 有其他意思的时候,用这个
需要注意的是这些名词都可以当作动词使用。
形容词,这些词用在动词或者名词前面:
i
:里面a
:周围- 数字:表达数量
用Vim说句话
我们用上面的元素尝试组成几句话:
- 删除2个词:
d2w
- 选择1个字母:
v
. 这并没有太多意义,因为你的光标所在的那个字母已经代表了选择 - 改变词以及周边标点:
caw
。Vim会删除这个词,然后进入插入模式,你就可以输入新的内容了 - 拷贝2个词:
y2w
- 改变从光标到下一个分号之间的内容:
ct;
- 改变""内部的内容:
ci"
。会删除"" 内部的内容,并且进入插入模式 - 选择()内的内容:
vi(
- 选择2级()的内容:
v2i(
一开始这些操作听起来很奇怪,但是一旦你习惯了这种表达方式,就会发现这是一种可以表达更加复杂编辑逻辑的方式。你基本上用几个字母就告诉了编辑器你想要做的事情。
2、模式(语境)
Vim与其他编辑器最大的不同在于它包含了多种模式,每种模式下,字符命令都有不同的意义,换句话说,在不同的语境下,基本词汇具有不同的意思。这在自然语言里非常常见。
Vim主要包含三个模式:命令模式、插入模式、选择模式和执行模式。下面这个图表达了如何在不同模式之间切换。执行模式没有话在图里,:可以进入执行模式。
命令模式下,绝大部分的名词、形容词如果单独使用,他们都会变成动词,多数是跟移动光标相关,少数与切换状态有关。当然,如果他们跟在动词后面,那么很自然他们还是名词。比如 w就是向前移动一个词,而d2w
中,w还是名词,意为删除2个词。
形容词,在命令状态单独使用时:
i
:切换插入状态,插入在光标前。I
:切换插入状态,插入在本行前a
:切换插入状态,插入在光标后A
: 切换插入状态,插入在本行后o
:切换插入状态,插入在下一行O
:切换插入状态,插入在上一行
名词,在命令状态单独使用时,都会变成移动光标的动词。类似hjkl
。
选择模式,是进行复杂选择和操作的模式。在这模式中,所有的动词均有效。需要注意的是按照句子移动和段落移动,只能使用{(而不能使用s和p,因为他们是替换和粘贴的意思。
v
: 进入选择模式V
:进入选择模式,以行为单位Ctrl+v
:以列为单位选择
执行模式,就是通过:,让vim执行一些命令
- :w 写入文件
- :q 退出
- :q! 强制退出
- :wq 写入并退出
- :saveas ~/path 另存为
ESC
是一个特殊的键,他会从把编辑器从任意状态切换会默认的命令行状态。
3、一些问题
我列出一些命令,大家看看他们的功能是什么?
vwwy
Vjjd
vip
vipyjjp
0i:j0vG.
参考
- https://vim.rtorr.com/
- https://danielmiessler.com/study/vim/
- https://www.math.usm.edu/lambers/cos702/cos702_files/documentation/utilities_doc/vim_tutorial.html#fn1
- https://medium.com/usevim/vim-101-quick-movement-c12889e759e0
Change Log
- 2020-03-07 完成初稿