转载时请注明出处和作者联系方式
作者联系方式:会飞的鱼 <parker30_liu at hotmail dot com>
最近在用VIM写程序时,想要使用一个功能,但在命令中没有(可能是我没找到),在网上找了半天也没有,于是只有自己想办法了。后来通过外部命令的组合实现了,将其记录在此,以后有了新发现的VIM的实用也都放在这里吧。
技巧一:读取文件的部分内容并插入到指定的行。
在编辑某个程序文件时经常需要将其他文件的部分代码拷贝过来粘贴到当前编辑的文件,而要拷贝的代码已经在另一个终端的VIM打开的情况下,这种功能就比较有用。不知大家是否有其他的实现方法。
实现方法为通过read命令读取head和tail命令的输出来实现,如下所示。
:read !head 20 test.c | tail 11
这是将test.c文件的第10行到第20行的代码拷贝到当前行的下一行。
技巧二:根据上下文字符串转换后生成新字符串插入。
最近在修改我们的工程的编译配置文件时,需要为每个软件包增加一个环境变量设置,根据不同的软件包名使用不同的环境变量。如下所示,红色是需增加的部分:
scim-handwrite_config: check mkdir -p $(IME_SCIM_HANDWRITE)/$(ARCH) && cd $(IME_SCIM_HANDWRITE)/$(ARCH) && / cd .. && ./autogen.sh && cd - && / export CFLAGS="$(SCIM_HANDWRITE_OPTIM_FLAGS) $(CFLAGS)" && / ../$(CONFIG) $(PREFIX_USR_LOCAL)
scim-handwrite_config_clean: check rm -rf $(IME_SCIM_HANDWRITE)/$(ARCH)
scim-letter_config: check mkdir -p $(SCIM_LETTER_DIR)/$(ARCH) && cd $(SCIM_LETTER_DIR)/$(ARCH) && / cd .. && ./autogen.sh && cd - && / export CFLAGS="$(SCIM_LETTER_OPTIM_FLAGS) $(CFLAGS)" && / ../$(CONFIG) $(PREFIX_USR_LOCAL)
scim-letter_config_clean: check rm -rf $(SCIM_LETTER_DIR)/$(ARCH) |
这事若是只有几个软件包的话,直接手工添加就可以了,可我们已经有好几十个包了,手工添加不仅费时而且容易出错。于是,按照尽量让机器去做大量重复单调工作的基本原则,想到了使用VIM的宏来完成这件事情。可是VIM的宏只是机械的重复你的动作,并不能根据不同的包产生不同的字符串,这就需要有根据上下文字符串按规则转换生成新字符串的能力。很自然想到用外部shell命令来实现,可是如何将文本的字符串内容传递给外部命令,又如何得到外部命令的结果呢。
记得前些时间看VIM使用手册时,发现VIM可以保存编辑缓冲区的部分内容到新文件中,还可将外部命令的执行结果输出到编辑缓冲区。于是想到用临时文件保存上下文字符串,通过外部tr命令转换该字符串并将其输出到编辑缓冲区的指定位置,这样就实现了字符串的转换。
下面是实现我所需要的功能的宏记录: