在文章 Vim 高级功能 Mapping 映射 中我介绍了映射功能,今天这篇来介绍更高级的 Operator-Pending 映射
基础操作
我们还是先来看效果,在图中我们做了两件事
- 快速替换输入括号中的文本
- 快速选中一个段落
这两个操作都用到了 Operator-Pending 映射,这个映射的本质是一个 Operator(操作)命令,再输入一个 Movement (移动)命令,这个操作命令会从当前位置开始,到移动命令结束为止。
常用的 Operator(操作)命令有 d, c, y
,常用的组合有1
2
3
4
5
6dw " 删除 到下个单词开始
de " 删除 到当前单词结束
diw " 删除 当前单词
dip " 高亮 当前段落内容
ci( " 修改 括号内的内容(光标要在括号内)
yt, " 复制 到逗号
以上提到的 Operator 命令和 Movement 命令可以任意组合,实现想要的效果。
Movement
Vim 灵活性决定它是不会限制我们做自己想做的事情,同样的我们可以任意修改自己想要的 Movement 命令,先来看一个简单例子1
onoremap , t,
另外我们准备这样一段文本1
Hello, World
将光标放到这行开头,输入 d,
,会发现他删除到逗号之前的内容,因为我们替换了上边提到的官方移动操作
自定义 Movement
在了解到基本规则后,我们开始自定义 Movement 命令,开始之前我们还需要一点小思路, Movement 是跟在 d, c, y
之后出现,他们都有一个共同点,需要操作一个可视区的部分,所以不管移动的开始和结束在哪都需要先进入可视模式
1 | --- |
这个是 hexo 文章的文件头,每次新建文章后我都需要手动找到标题的位置,并将默认标题替换成我想要的,我想要通过修改 Movement 一步修改1
onoremap ih :<c-u>normal! ggjf:llvg_<cr>
先将这个它复制到你的配置文件中,然后按下 cih
试试效果,如果你已经试过,我们来谈谈它是怎样做到的,开头的 :<c-u>normal!
先不多说,你只需要知道它可以让后边的命令可以在 normal 模式进行,然后剩下的命令我们做了这样几件事
ggjf
跳到第一行,再下移一行,查找:
llv
右移两格,进入可视模式g_
将可视区域移动到当前行最后一个非空白字符,$
会包含回车符,所以不用它<cr>
因为这个条命令其实是在 command 模式中进行的,所以需要回车返回结果
了解了这些,你已经可以写一些简单的映射来丰富自己的 ~/.vimrc
,至于刚才我们没有提到的部分,我会在以后更新出来。