vim技巧实战——关于宏记录的一个例子
2011-11-08 20:53
295 查看
嘛,人都说vim效率高,可是究竟高在什么地方呢?
有人说,双手不用离开主键盘区。。。
有人说,Ex模式最方便。。。
有人说,vimrc可编程性能简单又好用。。。
这一切的一切都让Vim变得不可战胜,让水深火热的用户们暂且有了一种“无敌”的安全感。
今天跟大家分享一个初学者进阶级别的技巧——宏记录。
所谓宏记录,就是说vim会记录下你所执行的一个操作序列,然后你可以在记录完成后的任意时间(Normal模式下)一键重复这个操作流——用过北通游戏手柄的“一键大招”功能么?就是这个了,嘿嘿。
宏的使用方法很简单。在Normal模式下按下q再加任意字母(用于标记一个宏)即可开始录制一个宏,录制完毕之后再来一下q表示结束(也就意味着宏是不能嵌套的,想通过宏生成宏的同学你们可以走了。。。哈哈);触发一个宏使用@,例如用qa录制的一个大招(名词不要乱换啊喂!!),可以通过@a来触发。
除了过程中不能嵌套宏以及最好不要:q!或者ZZ等,其他操作都是可以记录的。
Ok,原理性的东西讲完了,牛逼就是这么简单。下面来看一个实战例子。
话说,我有一个类,用于存储一个程序的所有配置参数。里面有很多变量,有int,bool,IPEndPoint等等。
然后我花了九牛二虎之力写了一个Load函数,可以把这个类里的值搬到一个GUI上面。。。
【危险动作请勿模仿——实现该函数将会导致精神烦躁、小猫被杀死、键盘断裂等异常情况。要练习的话你可以直接拷这份去。】
然后在GUI上High够了,总得把值再下载回来吧。。。这个时候是不是有种“什么都不想做了啊!!”的感觉呢?
别怕!这种时候你就应该想到——其实你是有“一键大招”技能的!
我们来分析一下问题——我们在LoadFromYadliConfig()中,把YadliConfig中的变量赋值给了GUI中的控件。现在其实我们要把等号两边的东西反转过来。
把上面这段拷进vim。
定位到第一行。
qa
你的光标后面应该是"currentRunningModeBox.SelectedIndex = ( int ) YadliConfig.CurrentRunningMode;"对吧
此时你应该处于Normal模式。
按键 /=回车,找到等号
x删掉等号
d$将当前光标至末尾的内容放进剪切板
0回行首
p粘出来
x去掉分号
i=Esc 插入一个等号,再回到Normal模式
$i;Esc 跳转行尾插入分号,回到Normal模式
q 结束记录。
然后你得数数一共有多少行,假设30吧(注意是有效行的数量,空行等等不算)
30@a 重复a大招30次
啪,等号左右已经全部对换了。你得到了:
Ok,离成功已经不远了。
下一个问题,ToString(),要想办法转换成int.Parse
qb 记录一个Q币(。。。)
/.ToString()回车 定位ToString()
xdwxx 删除ToString()
l跳过等号
iint.Parse( 插入前半。。。
$i) 插入后半。。。
esc
q Q币录制成功。
接下来仿照上面的例子来一次,你得到了:
然后修掉少部分大招搞不定的地方,再传给indent程序搞一搞,就基本成功了。
是不是瞬间有了一种无敌的感觉。
就说到这里吧,祝大家好运。 :-)
有人说,双手不用离开主键盘区。。。
有人说,Ex模式最方便。。。
有人说,vimrc可编程性能简单又好用。。。
这一切的一切都让Vim变得不可战胜,让水深火热的用户们暂且有了一种“无敌”的安全感。
今天跟大家分享一个初学者进阶级别的技巧——宏记录。
所谓宏记录,就是说vim会记录下你所执行的一个操作序列,然后你可以在记录完成后的任意时间(Normal模式下)一键重复这个操作流——用过北通游戏手柄的“一键大招”功能么?就是这个了,嘿嘿。
宏的使用方法很简单。在Normal模式下按下q再加任意字母(用于标记一个宏)即可开始录制一个宏,录制完毕之后再来一下q表示结束(也就意味着宏是不能嵌套的,想通过宏生成宏的同学你们可以走了。。。哈哈);触发一个宏使用@,例如用qa录制的一个大招(名词不要乱换啊喂!!),可以通过@a来触发。
除了过程中不能嵌套宏以及最好不要:q!或者ZZ等,其他操作都是可以记录的。
Ok,原理性的东西讲完了,牛逼就是这么简单。下面来看一个实战例子。
话说,我有一个类,用于存储一个程序的所有配置参数。里面有很多变量,有int,bool,IPEndPoint等等。
然后我花了九牛二虎之力写了一个Load函数,可以把这个类里的值搬到一个GUI上面。。。
【危险动作请勿模仿——实现该函数将会导致精神烦躁、小猫被杀死、键盘断裂等异常情况。要练习的话你可以直接拷这份去。】
public void LoadFromYadliConfig() { //Application currentRunningModeBox.SelectedIndex = ( int ) YadliConfig.CurrentRunningMode; ReadonlyDatabaseBox.Checked = YadliConfig.ReadonlyDatabase; ReadSlaveListFromConfBox.Checked = YadliConfig.ReadSlaveListFromConf; ExperimentalFeatureOnBox.Checked = YadliConfig.ExperimentalFeatureOn; CompatibleMessageModeBox.Checked = YadliConfig.CompatibleMessageMode; IsStandaloneServerBox.Checked = YadliConfig.IsStandaloneServer; //Network ClientBufferSizeBox.Text = YadliConfig.ClientBufferSize.ToString(); ClientMaxBufferSizeBox.Text = YadliConfig.ClientMaxBufferSize.ToString(); ServerSocketBufferSizeBox.Text = YadliConfig.ServerSocketBufferSize.ToString(); ClientSocketBufferSizeBox.Text = YadliConfig.ClientSocketBufferSize.ToString(); ClientMaxConnBox.Text = YadliConfig.ClientMaxConn.ToString(); BacklogBox.Text = YadliConfig.BackLog.ToString(); ServerMaxConnBox.Text = YadliConfig.ServerMaxConn.ToString(); ServerMaxAcceptOpsBox.Text = YadliConfig.ServerMaxAcceptOps.ToString(); //Protocol bbServerBox.Text = YadliConfig.BlackboardServer; bbPortBox.Text = YadliConfig.BlackboardPort.ToString(); RGraphPortBox.Text = YadliConfig.RGraphPort.ToString(); slavePortBox.Text = YadliConfig.SlavePort.ToString(); YadliProxyPortBox.Text = YadliConfig.YadliProxyPort.ToString(); AggregatorPortBox.Text = YadliConfig.AggregatorPort.ToString(); //Slaves slaveListBox.Items.Clear(); slaveListBox.BeginUpdate(); foreach ( IPEndPoint ipe in YadliConfig.SlaveList ) { slaveListBox.Items.Add( ipe.Address.ToString() + ":" + ipe.Port ); } slaveListBox.EndUpdate(); //Storage MemoryPoolSizeBox.Text = YadliConfig.MemoryPoolSize.ToString(); MemoryTrunkIncrementSizeBox.Text = YadliConfig.MemoryTrunkIncrementSize.ToString(); IndexMemoryTrunkSizeBox.Text = YadliConfig.MemoryTrunkIncrementSize.ToString(); StorageRootBox.Text = YadliConfig.StorageRoot; //Internal UseYadliStarterBox.Checked = YadliConfig.UseYadliStarter; QueryAggregatorOnBox.Checked = YadliConfig.QueryAggregatorOn; CellCacheOnBox.Checked = YadliConfig.CellCacheOn; ReadonlyCellLoadBox.Checked = YadliConfig.ReadonlyCellLoad; CreateConnectionWhenUnavailableBox.Checked = YadliConfig.CreateConnectionWhenUnavailable; NeighborAsListBox.Checked = YadliConfig.NeighborAsList; RGraphOnBox.Checked = YadliConfig.RGraphOn; GraphBufferSizeBox.Text = YadliConfig.GraphBufferSize.ToString(); XHashSetGroupSizeBox.Text = YadliConfig.XHashSetGroupSize.ToString(); DebugBox.Checked = YadliConfig.Debug; OneBoxTestBox.Checked = YadliConfig.OneBoxTest; }
然后在GUI上High够了,总得把值再下载回来吧。。。这个时候是不是有种“什么都不想做了啊!!”的感觉呢?
别怕!这种时候你就应该想到——其实你是有“一键大招”技能的!
我们来分析一下问题——我们在LoadFromYadliConfig()中,把YadliConfig中的变量赋值给了GUI中的控件。现在其实我们要把等号两边的东西反转过来。
把上面这段拷进vim。
定位到第一行。
qa
你的光标后面应该是"currentRunningModeBox.SelectedIndex = ( int ) YadliConfig.CurrentRunningMode;"对吧
此时你应该处于Normal模式。
按键 /=回车,找到等号
x删掉等号
d$将当前光标至末尾的内容放进剪切板
0回行首
p粘出来
x去掉分号
i=Esc 插入一个等号,再回到Normal模式
$i;Esc 跳转行尾插入分号,回到Normal模式
q 结束记录。
然后你得数数一共有多少行,假设30吧(注意是有效行的数量,空行等等不算)
30@a 重复a大招30次
啪,等号左右已经全部对换了。你得到了:
//Application ( int ) YadliConfig.CurrentRunningMode= currentRunningModeBox.SelectedIndex; YadliConfig.ReadonlyDatabase= ReadonlyDatabaseBox.Checked; YadliConfig.ReadSlaveListFromConf= ReadSlaveListFromConfBox.Checked; YadliConfig.ExperimentalFeatureOn= ExperimentalFeatureOnBox.Checked; YadliConfig.CompatibleMessageMode= CompatibleMessageModeBox.Checked; YadliConfig.IsStandaloneServer= IsStandaloneServerBox.Checked; //Network YadliConfig.ClientBufferSize.ToString()= ClientBufferSizeBox.Text; YadliConfig.ClientMaxBufferSize.ToString()= ClientMaxBufferSizeBox.Text; YadliConfig.ServerSocketBufferSize.ToString()= ServerSocketBufferSizeBox.Text; YadliConfig.ClientSocketBufferSize.ToString()= ClientSocketBufferSizeBox.Text; YadliConfig.ClientMaxConn.ToString()= ClientMaxConnBox.Text; YadliConfig.BackLog.ToString()= BacklogBox.Text; YadliConfig.ServerMaxConn.ToString()= ServerMaxConnBox.Text; YadliConfig.ServerMaxAcceptOps.ToString()= ServerMaxAcceptOpsBox.Text; //Protocol YadliConfig.BlackboardServer= bbServerBox.Text; YadliConfig.BlackboardPort.ToString()= bbPortBox.Text; YadliConfig.RGraphPort.ToString()= RGraphPortBox.Text; YadliConfig.SlavePort.ToString()= slavePortBox.Text; YadliConfig.YadliProxyPort.ToString()= YadliProxyPortBox.Text; YadliConfig.AggregatorPort.ToString()= AggregatorPortBox.Text; //Slaves slaveListBox.Items.Clear(); slaveListBox.BeginUpdate(); foreach ( IPEndPoint ipe in YadliConfig.SlaveList ) { slaveListBox.Items.Add( ipe.Address.ToString() + ":" + ipe.Port ); } slaveListBox.EndUpdate(); //Storage YadliConfig.MemoryPoolSize.ToString()= MemoryPoolSizeBox.Text; YadliConfig.MemoryTrunkIncrementSize.ToString()= MemoryTrunkIncrementSizeBox.Text; YadliConfig.MemoryTrunkIncrementSize.ToString()= IndexMemoryTrunkSizeBox.Text; YadliConfig.StorageRoot= StorageRootBox.Text; //Internal YadliConfig.UseYadliStarter= UseYadliStarterBox.Checked; YadliConfig.QueryAggregatorOn= QueryAggregatorOnBox.Checked; YadliConfig.CellCacheOn= CellCacheOnBox.Checked; YadliConfig.ReadonlyCellLoad= ReadonlyCellLoadBox.Checked; YadliConfig.CreateConnectionWhenUnavailable= CreateConnectionWhenUnavailableBox.Checked; YadliConfig.NeighborAsList= NeighborAsListBox.Checked; YadliConfig.RGraphOn= RGraphOnBox.Checked; YadliConfig.GraphBufferSize.ToString()= GraphBufferSizeBox.Text; YadliConfig.XHashSetGroupSize.ToString()= XHashSetGroupSizeBox.Text; YadliConfig.Debug= DebugBox.Checked; YadliConfig.OneBoxTest= OneBoxTestBox.Checked;
Ok,离成功已经不远了。
下一个问题,ToString(),要想办法转换成int.Parse
qb 记录一个Q币(。。。)
/.ToString()回车 定位ToString()
xdwxx 删除ToString()
l跳过等号
iint.Parse( 插入前半。。。
$i) 插入后半。。。
esc
q Q币录制成功。
接下来仿照上面的例子来一次,你得到了:
//Application YadliConfig.CurrentRunningMode=(RunningMode) currentRunningModeBox.SelectedIndex; YadliConfig.ReadonlyDatabase= ReadonlyDatabaseBox.Checked; YadliConfig.ReadSlaveListFromConf= ReadSlaveListFromConfBox.Checked; YadliConfig.ExperimentalFeatureOn= ExperimentalFeatureOnBox.Checked; YadliConfig.CompatibleMessageMode= CompatibleMessageModeBox.Checked; YadliConfig.IsStandaloneServer= IsStandaloneServerBox.Checked; //Network YadliConfig.ClientBufferSize=int.Parse( ClientBufferSizeBox.Text); YadliConfig.ClientMaxBufferSize=int.Parse( ClientMaxBufferSizeBox.Text); YadliConfig.ServerSocketBufferSize=int.Parse( ServerSocketBufferSizeBox.Text); YadliConfig.ClientSocketBufferSize=int.Parse( ClientSocketBufferSizeBox.Text); YadliConfig.ClientMaxConn=int.Parse( ClientMaxConnBox.Text); YadliConfig.BackLog=int.Parse( BacklogBox.Text); YadliConfig.ServerMaxConn=int.Parse( ServerMaxConnBox.Text); YadliConfig.ServerMaxAcceptOps=int.Parse( ServerMaxAcceptOpsBox.Text); //Protocol YadliConfig.BlackboardServer= bbServerBox.Text; YadliConfig.BlackboardPort=int.Parse( bbPortBox.Text); YadliConfig.RGraphPort=int.Parse( RGraphPortBox.Text); YadliConfig.SlavePort=int.Parse( slavePortBox.Text); YadliConfig.YadliProxyPort=int.Parse( YadliProxyPortBox.Text); YadliConfig.AggregatorPort=int.Parse( AggregatorPortBox.Text); //Slaves slaveListBox.Items.Clear(); slaveListBox.BeginUpdate(); foreach ( IPEndPoint ipe in YadliConfig.SlaveList ) { slaveListBox.Items.Add( ipe.Address int.Parse(+ ":" + ipe.Port ); } slaveListBox.EndUpdate(); //Storage YadliConfig.MemoryPoolSize=int.Parse( MemoryPoolSizeBox.Text); YadliConfig.MemoryTrunkIncrementSize=int.Parse( MemoryTrunkIncrementSizeBox.Text); YadliConfig.MemoryTrunkIncrementSize=int.Parse( IndexMemoryTrunkSizeBox.Text); YadliConfig.StorageRoot= StorageRootBox.Text; //Internal YadliConfig.UseYadliStarter= UseYadliStarterBox.Checked; YadliConfig.QueryAggregatorOn= QueryAggregatorOnBox.Checked; YadliConfig.CellCacheOn= CellCacheOnBox.Checked; YadliConfig.ReadonlyCellLoad= ReadonlyCellLoadBox.Checked; YadliConfig.CreateConnectionWhenUnavailable= CreateConnectionWhenUnavailableBox.Checked; YadliConfig.NeighborAsList= NeighborAsListBox.Checked; YadliConfig.RGraphOn= RGraphOnBox.Checked; YadliConfig.GraphBufferSize=int.Parse( GraphBufferSizeBox.Text); YadliConfig.XHashSetGroupSize=int.Parse( XHashSetGroupSizeBox.Text); YadliConfig.Debug= DebugBox.Checked; YadliConfig.OneBoxTest= OneBoxTestBox.Checked;
然后修掉少部分大招搞不定的地方,再传给indent程序搞一搞,就基本成功了。
是不是瞬间有了一种无敌的感觉。
就说到这里吧,祝大家好运。 :-)
相关文章推荐
- 一个关于指针+记录数据类型的使用技巧
- 关于JbpmCenter和Mule整合实现一个审核的简单例子
- 照着网上做了一个小例子关于spring mvc
- 关于EJB3的一个简单例子
- 关于Response.Write一个提高性能的技巧测试
- 一个关于gravity和layout_gravity的例子
- 关于js内存泄露的一个好例子
- flask学习笔记(二)——记录一下关于命名的一个坑,ImportError:can't import name 'Flask'
- 关于ExpandableListView用法的一个简单小例子
- C#中关于委托练习的一个例子
- 关于between and 的一个例子
- 一个关于python类成员变量的例子,求解释
- 一个关于解决序列化问题的编程技巧
- 关于代码规范的一个例子
- 记录一个java.util.logging.Logger 使用中关于时间格式的问题
- 关于Linq的.distinct()方法的运用(一个简单的例子)
- 一个关于ACE Service Configurator的小例子
- 关于私有继承的一个小例子
- 【记录】Vim经典贴子大整理,配置、插件、技巧
- 关于CDN原理的一个形象例子