2008-11-01 79 views
9

在使用Vim(在家中和在工作中)时,我经常发现自己在重复做类似的事情。例如,我可能会将一堆CSV文本转换为一系列SQL插入。我一直在使用Vim多年,但直到最近我才想到认真考虑如何在使用Vim时提高生产力。编写Vim中的常见任务脚本

我的问题是..有没有一种好的方法(或正确的方法)来存储常用的命令或命令序列?那么执行它们的最好方法是什么?能够在实时会话中使用相同的脚本以及在命令行上针对某个文件使用该脚本将会很好。

我希望我可以将它们存储在.vim文件中,以便我可以将它们交给同事(对vim不熟练),供他们使用。

回答

13

您可以将您的共同任务宏在vim的文件,如this例如,然后你可以使用命令加载它们:所以file.vim

Here你可以找到一堆有用的宏,我也建议你好好学习有用qmacro recording命令,这是很好很强大...

q命令创建的宏存储在寄存器中,QQ专卖店宏在q寄存器,所以当你结束时他记录你可以简单地粘贴宏,与“qp并保存它,稍后,您可以加载它只需将宏放入一个寄存器即:”qY,宏只是文本,并记住您可以使用任何寄存器而不是q。有一个Vim脚本,用于存储q宏:

marvim : Macro Persistent Storage and Shareable Repository for VIM

也看看到Vim Scripting Language

+0

这可能会在您的一个链接中回答,但可以记录一次qq宏吗?我一直使用它们,但我不知道它们是否可以在会话中持续存在。 – 2008-11-01 08:02:00

+0

使用q命令创建的宏存储在寄存器中,qq将宏存储在q寄存器中,因此当您结束录制时,您可以简单地将宏粘贴到“qp并保存”,稍后可以通过简单撇开宏观文本,通过“qY记住你可以使用任何寄存器,而不是q ... – CMS 2008-11-01 08:06:40

2

您可以将命令序列存储在您的.vimrc中,并为其分配与:map命令的键绑定。例如:

echo >>~/.vimrc ":map ,c :%s/,/','/g<CR>:%s/^/('/g<CR>:%s/$/'),/g<CR>" 

当按下“,c”,在实时会话,这将转换成CSV文件的INSERT语句的一部分。

就在那同一块编辑可以通过被应用到一个文件中(这将覆盖,一定要备份第一)命令行:

vim file.txt -c ':normal ,c | :x' 

有可能是一个更好的办法,但这个工程。

1

个人而言,也许部分原因是因为我早在vim存在之前就使用了Unix(哎呀,我用的第一版Unix也没有“vi” - 但那是另一回事),我通常会使用' shell脚本“(或更可能是Perl脚本)来执行转换。为了将CSV数据转换为INSERT,处理引号/非引号和嵌入逗号是非常麻烦的 - 我可能会尝试使用带有Text :: CSV_XS的Perl脚本来保证正确的解析。然后我会在需要转换的文本范围上运行该脚本。

这样做的一个优势是专注的工具方法 - 一个工具可以做一件正确的工作。我的私人bin目录中有300个或更多的脚本和程序; RCS目录中有超过500个脚本。

这并不是说vim中的脚本编写不好。我使用(或多或少)复杂的地图命令来编写复杂的操作,通常当我要对整套文件进行相同的更改时,以及当我认为不值得创建用于工作。但是,如果我认为我可能需要更改多次,那么我会编写脚本。例如,GCC开始获得uppity(大约在2005年)关于不在对象文件中嵌入未使用的静态字符串 - 这意味着我的版本控制信息不可见。因此,在一段时间内,当我编辑源文件时,我已经从静态(固定)名称转换为公开名称 - 不情愿,但必须AFAIAC。我有一个为我编辑的脚本,所以当我需要在文件中进行更改时,我会运行该脚本来执行此操作。我有另一个更新版权信息的脚本;每次我第一次修改给定年份的文件时,我都需要这样做。是的,我可以把它当作vim中的东西 - 我长大后认为单独的脚本更好,尤其是因为如果我切换到任何其他编辑器,我仍然可以使用脚本。

3

我用q/@很频繁地记录/重放一个宏。

下一步是尝试写入类似3或更少的ex命令。

如果某件事情如此复杂以至于无论是宏还是短序列都不够用,我倾向于将它写成Perl脚本。为了我的口味,vim脚本语言有点太有限,无法尝试做大事。 (尽管vim 7在这方面已经取得了很大的进步,通过借用Python的一堆东西)。

请注意,@做一些非常简单的事情:它需要一个寄存器的内容,并重播它们,就像你键入它们一样在正常模式下。同样,q只是将您输入的序列记录到您的名称中。这些是自己同样的寄存器,用于放置/放置 - 这意味着您可以直接将录制的序列粘贴到文件中(.vimrc任何人?)或从文件中抽出一系列命令并重播它(这样可以保留他们中的一群在~/my-vim-macros.txt或其他)。