操作符实务

操作符复习

上次我们讲了操作符与文本对象的组合这样一个vim的强大功能。但是上节的知识点过于密集,可读性可能差了一点。不过没关系,重要的知识点在后面用到的时候我们可以先复习一下。

我们还是先复习操作符。上节说过了,vi的方式是{操作符}{次数}{移动命令},代表例子就是d2w,删除两个单词。

vim将其扩展成了文本对象,有aw, iw, as, is, ap, ip, a], a[, i[, i]等一系列。

我们举几个小例子说明文本对象的用法:

比如有这样一段代码:

void main(int argc,char* agrv[])

光标在括号内,我们输入”yi(“,得到的是”int argc,char* agrv[]”, 如果是”ya(“,复制的将是”(int argc,char* agrv[])”

“i(“与”a(“的区别是,”a(“会包含括号本身,而”i(“不含括号内容。

再举个例子,我们用下搜索来定位:

    return 0;

我们要复制不带分号的”return 0”,可以这么写『^yt;』

定制操作符

既然操作符这么有用,我们可以尝试来定制它。这个定制功能,叫做Operator-pending mapping.

首先我们可以定制文本对象,也就是移动的命令。

我们看一个简单的例子,比如用p来代表刚才我们用的”i(“,因为”i(“是两个字符,而且括号还是个组合键。

:onoremap p i(

使用onoremap而不是omap的原因,是为了防止map产生递归定义。

我们看一下官方文档中的例子:

onoremap <silent> F :<C-U>normal! 0f(hviw<CR>

F是按键。我们可以将其换成 F或者直接是”ah(“之类的。

我们照抄就好,是为了防止Vim自动给我们自动添加些私货。

normal!后面我们还会学习,它是用于执行正常模式下的命令。

前面的都是例行公事,后面才是真正需要我们开发的命令组合:0f(hviw

0是移动到行首,还记得吧,如果要是移到行首非空字符是^。

“f(“是向后搜索到第一个左括号,h是左移一个字符,viw是在visual模式下选中一个单词,会退出visual模式

综上,上面的命令就是选中一个左括号左边的一个完整单词。

但是,还有一个问题,normal!命令没法处理转义字符和特殊字符。如果遇到这种情况,我们需要用execute命令再把normal包装一下。

最简单的情况就是对于的处理。在搜索中,是经常需要的输入。但是,在normal命令中是不会处理为回车的,而是当成四个字符。

我们只好再加点料,把特殊字符字符串先传给execute命令:

onoremap <silent> F :<C-U>execute "normal! 0f(hviw<CR>"

execute命令是会处理特殊字符和转义的,当它执行 normal!的时候,后面的已经正确转义了。normal!就可以正确运行了。

Vim技能修炼教程(5) - 操作符实务的更多相关文章

  1. Vim技能修炼教程(2) - 语法高亮速成

    语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成 ...

  2. Vim技能修炼教程(10) - 代码跳转

    程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...

  3. Vim技能修炼教程(8) - 多窗口

    多窗口 如果一个vim只能开一个窗口,那肯定是有点low.尤其是写代码的时候,打开多个文件是经常的需求. 速成教程 横着切成两个 :split 文件名 上下切换窗口 Ctrl-W加上上下键,可以实现上 ...

  4. Vim技能修炼教程(3) - 语法高亮进阶

    语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...

  5. Vim技能修炼教程(1) - 使用vundle管理插件

    世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它 ...

  6. Vim技能修炼教程(17) - 编译自己的Vim

    编译自己的Vim 前面我们已经对Vim有比较丰富的了解了.我们也知道Vim有很多编译时的选项,很多功能依赖于这些编译选项.其中最重要的就是脚本语言的支持,很多发行版本是不全的.为了支持我们所需要的功能 ...

  7. Vim技能修炼教程(16) - 浮点数计算函数

    浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...

  8. Vim技能修炼教程(15) - 时间和日期相关函数

    Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimsc ...

  9. Vim技能修炼教程(14) - 写个ex命令吧

    写个ex命令吧 我们第二节开始就写了语法高亮的插件.这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令. 自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目 ...

随机推荐

  1. 20145322《Java程序设计》第4次实验报告

    实验内容 1.搭建Android环境 2.运行Android 3.修改代码并输出自己的学号 实验步骤 搭建Android环境 安装Android,核心是配置JDK.SDK 运行Android 最终结果 ...

  2. 快用Visual Studio(五)- 语言特性

    HTML 自带Emment $ SHIFT + OPTION + F:格式化代码 其他语言特性提示 CSS & LESS hover属性,提示样式对象标签 $ CMD + SHIFT + O: ...

  3. MR案例:分区和排序

    现有一学生成绩数据,格式如下:<学号,姓名,学院,成绩>  //<id, name, institute, grade>. 需求描述:查询成绩大于等于60分的学生数据,按学院分 ...

  4. 分分钟解决 MySQL 查询速度慢与性能差

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的 ...

  5. grafana二次开发

    grafana官方地址: https://github.com/grafana/grafana 开发文档:http://docs.grafana.org/project/building_from_s ...

  6. Android开发-网络通信2

    调试了三种通信方法:HttpClient.AsyncHttpClient 和 Volley . HttpClient 测试代码[1]: public class HttpUtil { public s ...

  7. ubuntu如何U盘启 动制作

    先到出 U盘的位置, 方法有很多,terminal 用root权限,采用fdisk -f 命令 unmount /dev/sdb -I //U盘拨出 sdb为U盘挂载的位置 mkfs.fat /dev ...

  8. Office.资料

    1.JAVA+JS如何在HTML页面上显示WORD文档内容?ActiveX只能兼容IE不考虑!_百度知道.html(https://zhidao.baidu.com/question/74594982 ...

  9. 【Python】更优的字符串格式化方式 -- "format"替代"%s"

    背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...

  10. 树 & 二叉树

    2018-01-04 19:13:46 一.树 在计算机科学中,树(英语:tree)是一种数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把 ...