在文章 Vim 高级功能 Mapping 映射 中我介绍了映射功能,今天这篇来介绍更高级的 Operator-Pending 映射


Vim 高级功能 Operator-Pending 映射-LMLPHP

基础操作

我们还是先来看效果,在图中我们做了两件事

  • 快速替换输入括号中的文本
  • 快速选中一个段落
    这两个操作都用到了 Operator-Pending 映射,这个映射的本质是一个 Operator(操作)命令,再输入一个 Movement (移动)命令,这个操作命令会从当前位置开始,到移动命令结束为止。

常用的 Operator(操作)命令有 d, c, y,常用的组合有

1
2
3
4
5
6
dw      " 删除  到下个单词开始
de " 删除 到当前单词结束
diw " 删除 当前单词
dip " 高亮 当前段落内容
ci( " 修改 括号内的内容(光标要在括号内)
yt, " 复制 到逗号

以上提到的 Operator 命令和 Movement 命令可以任意组合,实现想要的效果。

Movement

Vim 灵活性决定它是不会限制我们做自己想做的事情,同样的我们可以任意修改自己想要的 Movement 命令,先来看一个简单例子

1
onoremap , t,

另外我们准备这样一段文本

1
Hello, World

将光标放到这行开头,输入 d,,会发现他删除到逗号之前的内容,因为我们替换了上边提到的官方移动操作

自定义 Movement

在了解到基本规则后,我们开始自定义 Movement 命令,开始之前我们还需要一点小思路, Movement 是跟在 d, c, y 之后出现,他们都有一个共同点,需要操作一个可视区的部分,所以不管移动的开始和结束在哪都需要先进入可视模式

1
2
3
4
5
---
title: Vim 高级功能 Operator-Pending 映射
date: 2017-12-02 10:25:32
tags: [vim]
---

这个是 hexo 文章的文件头,每次新建文章后我都需要手动找到标题的位置,并将默认标题替换成我想要的,我想要通过修改 Movement 一步修改

1
onoremap ih :<c-u>normal! ggjf:llvg_<cr>

先将这个它复制到你的配置文件中,然后按下 cih 试试效果,如果你已经试过,我们来谈谈它是怎样做到的,开头的 :<c-u>normal! 先不多说,你只需要知道它可以让后边的命令可以在 normal 模式进行,然后剩下的命令我们做了这样几件事

  • ggjf 跳到第一行,再下移一行,查找 :
  • llv 右移两格,进入可视模式
  • g_ 将可视区域移动到当前行最后一个非空白字符,$ 会包含回车符,所以不用它
  • <cr> 因为这个条命令其实是在 command 模式中进行的,所以需要回车返回结果

了解了这些,你已经可以写一些简单的映射来丰富自己的 ~/.vimrc,至于刚才我们没有提到的部分,我会在以后更新出来。

03-16 17:32