`
lantian_123
  • 浏览: 1370065 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

每日一Vim(23)宏---Record、Play

 
阅读更多

每日一Vim(23)宏---Record、Play

写这篇文章的时候想到了读高中那会儿买的第一个电子产品,某某高复读机,话说是为了学英语,呵呵,你懂的,其实是为了好玩。当时差不多花了300担,父母在子女的教育方面可是毫不手软,想想如果那时开始接触计算机互联网相关的东西了,买的就是一台电脑,我离那“一万小时定律”就要早几年完成了...言归正传。
tu

今天要说的其实就和这个复读机相关,复读机在按下复读的按钮后,就开机录制需要复读的内容,再按一下录制完成,接下来就可以播放了。Vim中也有与之惊人相似的操作,如果想重复某个操作,就可以用**宏**来完成,还记得以前讲过的一个命令吗:.就是这个**点**可以重复执行最后一次操作,但是这个.的功能比较弱,没法组合使用,如下代码,想在每行末加上分号";":

int a = 1
int b = 2
int c = a+b
print a
print b
print c

如果是用.来实现的话,首先在第一行执行$a;,然后重复5次执行j$.,这样算下来你要敲击的键总数在15次之多,但是我们用Record/Play的话,即使是100行代码,按键也不会超过10次。命令闪亮登场:q,就是这个q,它的威力很猛。接下来就详细介绍如何操作q来实现上述需求。

  1. normal 模式下输入q启动recoding,q后面跟任意a-z的小写字母比如m,这个字母就是宏的名字,接下来你要执行的操作就会记录在这个宏中。
  2. 执行我们的任务:“行末加分号”,命令是:$a;<Esc>j$,这条命令意思就是:移动行尾插入分号,退到normal模式,光标移动到下一行的末尾。
  3. 再次输入q,表示录制结束
  4. 录制结束后我们就可以play了,输入@m就会执行宏中的操作,m是第一步中使用的宏的名称,5@m表示重复执行5次。这样,所有行都给加上分号了,真是好使。

再举一例:实现如下效果:从1到100,每行+1。

1
2
3
...
100

命令:首先在第一行插入1,然后光标定位了“1”处,进入normal模式,开始录制:qmyyp<Ctrl>aq,(解释:yyp:拷贝一行再粘贴在新的一行,<Ctrl>a:数字+1)后然执行98@m,收工。

转载请注明出处,谢谢合作!作者---zhijun

答应推荐一个微信号的:Mac技巧,主人是70后程序员,主要讲人文科技+mac技巧相关内容。

2
1
分享到:
评论
9 楼 qdujunjie 2016-06-16  
学会了recording,感谢~~
8 楼 kidneyball 2013-04-10  
再补一个: 在normal下@@是重复执行上一次执行的宏
7 楼 kidneyball 2013-04-10  
帮楼主补充几点:

1. 楼主的宏中第2步用 A;<Esc>j 就行了。定义宏的一个惯用套路是: 行内跳转定位 + 真正操作 + 移动到下一目标行。 把行内跳转定位放在开头可以让你replay时不用事先把光标放在特定的列位置。而因此在宏末尾再做一次行内定位就多余了。

2. 宏与yank是共享寄存器的,最好有某种策略保证不会冲突。我个人的习惯是qwer四个寄存器用来录制临时用完即弃的宏(靠近q和@比较好按)。uiop四个键预留给yank (靠近"和y,p键。也就是除了常用的“和0号寄存器外,再预留四个寄存器来做复制粘贴,通常够用了),其他字母键用来记录固定宏(也就是关了vim下次打开还会接着用的常用宏)

3. 可以用 :put 寄存器名称 命令把宏输出到编辑区进行编辑,改好后再yank回去。改动时在插入模式下可以用ctrl+v后跟组合键来输入组合键(例如你要在宏中回车,在修改宏时可以按 ctrl+v ctrl+m ),当然直接用尖括号括住的特殊键名称亦可。 (例如<CR>表示回车)
具体可以参考 :h keycodes 。 利用这一点可以把一些常用的但又比较复杂的宏的导出到文件中,使用时再yank进去,突破26个字母寄存器的限制。
6 楼 kidneyball 2013-04-10  
isensen 写道
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了


新安装的gvim for windows打开后,:e $MYVIMRC 打开配置文件,应该能看到已经有一些预设内容了,开头4行是这样的:
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin


把第三和第四行注释掉(或者干脆dd掉)
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
"source $VIMRUNTIME/mswin.vim
"behave mswin

即可。这样会把针对windows习惯的预设mapping都去掉。你觉得有需要的自己再单独map回去就是了。
5 楼 lantian_123 2013-04-10  
isensen 写道
lantian_123 写道
isensen 写道
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了

应该是你做了映射,可以在vimrc文件查看一下,把映射关系去掉就行了,看看以前讲的maphttp://liuzhijun.iteye.com/blog/1833814这篇文章

这个我记得.每一篇我都有看,GVIM为了保留用户习惯,默认映射了ctrl+a是全选,这个我不想去掉,还有别的办法吗?

:nnoremap <A-a> <C-a>
:nnoremap <A-x> <C-x>

用Alt+A替换Ctrl+A,同理Alt+x替换Ctrl+x
4 楼 isensen 2013-04-10  
lantian_123 写道
isensen 写道
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了

应该是你做了映射,可以在vimrc文件查看一下,把映射关系去掉就行了,看看以前讲的maphttp://liuzhijun.iteye.com/blog/1833814这篇文章

这个我记得.每一篇我都有看,GVIM为了保留用户习惯,默认映射了ctrl+a是全选,这个我不想去掉,还有别的办法吗?
3 楼 leftcopychenhx 2013-04-10  
isensen 写道
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了

http://stackoverflow.com/questions/289681/why-does-c-a-ctrla-not-work-under-gvim-on-windows

另外$a换成A可以少一次按键
2 楼 lantian_123 2013-04-10  
isensen 写道
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了

应该是你做了映射,可以在vimrc文件查看一下,把映射关系去掉就行了,看看以前讲的maphttp://liuzhijun.iteye.com/blog/1833814这篇文章
1 楼 isensen 2013-04-10  
gvim下ctrl+a是全选 怎么破
微信摇过两天妹子.....然后...就没然后了

相关推荐

Global site tag (gtag.js) - Google Analytics