Vim技能修炼教程(5) - 操作符实务
操作符实务
操作符复习
上次我们讲了操作符与文本对象的组合这样一个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) - 操作符实务的更多相关文章
- Vim技能修炼教程(2) - 语法高亮速成
语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成 ...
- Vim技能修炼教程(10) - 代码跳转
程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...
- Vim技能修炼教程(8) - 多窗口
多窗口 如果一个vim只能开一个窗口,那肯定是有点low.尤其是写代码的时候,打开多个文件是经常的需求. 速成教程 横着切成两个 :split 文件名 上下切换窗口 Ctrl-W加上上下键,可以实现上 ...
- Vim技能修炼教程(3) - 语法高亮进阶
语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...
- Vim技能修炼教程(1) - 使用vundle管理插件
世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它 ...
- Vim技能修炼教程(17) - 编译自己的Vim
编译自己的Vim 前面我们已经对Vim有比较丰富的了解了.我们也知道Vim有很多编译时的选项,很多功能依赖于这些编译选项.其中最重要的就是脚本语言的支持,很多发行版本是不全的.为了支持我们所需要的功能 ...
- Vim技能修炼教程(16) - 浮点数计算函数
浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...
- Vim技能修炼教程(15) - 时间和日期相关函数
Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimsc ...
- Vim技能修炼教程(14) - 写个ex命令吧
写个ex命令吧 我们第二节开始就写了语法高亮的插件.这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令. 自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目 ...
随机推荐
- 20145331 《Java程序设计》第10周学习总结
20145331 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置 ...
- 再也不学AJAX了!(一)AJAX概述
"再也不学AJAX了"是一个与AJAX主题相关的文章系列,包含以下三个部分的内容: AJAX概述:主要回答"AJAX是什么"这个问题: 使用AJAX:介绍如何通 ...
- Linux 动态链接库包含静态链接库的方法
今天老司机们在讨论一个编译问题 A是一个静态库 C是一个动态库 B是运行程序,能不能将A打包到C 然后B只需要链接C 就可以了. 这个问题我以前在出来zlib库版本冲突的时候有点印象,所以写了个 ...
- LeetCode——4Sum
1. Question Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + ...
- maven(一)maven自带的插件
关于org.apache.maven.plugins 前言 maven提供了很多插件给我们使用,解释3个java环境常用的maven插件, maven-jar-plugin, maven-compli ...
- apache配置ssl
1.确认是否安装ssl模块 是否有mod_ssl.so文件 2.生成证书和密钥 linux下 步骤1:生成密钥 命令:openssl genrsa 1024 > server.key 说 ...
- ubuntu 18. use gnome-tweaks
<<install gnome-tweaks sudo apt-get install gnome-tweaks <<run gnome-tweaks >>pres ...
- 深入浅出-Binding的源与路径
1.把控件作为Binding源与Binding标记扩展<TextBox x:Name="textBox1" Text="{Binding Path=Value, E ...
- 【Python】更优的字符串格式化方式 -- "format"替代"%s"
背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...
- jQuery中兄弟元素、子元素和父元素的获取
我们这里主要总结jQuery中对某元素的兄弟元素.子元素和父元素的获取,原声的Javascript代码对这些元素的获取比较麻烦一些,而jQuery正好对这些方法进行封装,让我们更加方便的对这些元素进行 ...