11

在使用 Vim 时(在家和工作中),我经常发现自己反复做类似的事情。例如,我可能会将一堆 CSV 文本转换为一系列 SQL 插入。我已经使用 Vim 多年了,但直到最近我才开始认真思考如何在使用它的同时提高工作效率。

我的问题是.. 有没有一种好方法(或正确的方法)来存储常用命令或命令序列?以及如何执行它们的最佳方式是什么?如果能够在实时会话中使用相同的脚本,也可以通过命令行对某个文件使用相同的脚本,那就太好了。

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

4

4 回答 4

14

您可以将常用任务宏存储在 .vim 文件中,例如这样,然后您可以使用命令:so file.vim加载它们

在这里你可以找到一堆好用的宏,另外我推荐你好好学习好用的q 宏录制命令,它非常非常强大...

使用q命令创建的宏存储在一个寄存器中,qq将宏存储在q寄存器中,所以当你结束录制时你可以简单地粘贴宏,用“qp保存它,以后你可以通过简单的拉动来加载它将宏放入寄存器,即:“qY,宏只是文本,记住您可以使用任何寄存器代替 q。有一个用于存储q宏的 Vim 脚本:

marvim : VIM 的宏持久存储和可共享存储库

还可以查看Vim Scripting Language

于 2008-11-01T07:57:32.833 回答
3

我经常使用q/来录制/重放宏。@

下一步是尝试编写 3 个或更少的 ex 命令。

如果某些东西如此复杂以至于宏或短的 ex 序列都不够用,我倾向于将其编写为 Perl 脚本。根据我的口味,vim 脚本语言有点太有限,无法尝试做大事。(尽管 vim 7 在这方面取得了长足的进步,从 Python 中借用了很多东西。)

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

于 2008-11-02T03:59:35.077 回答
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'

可能有更好的方法,但这有效。

于 2008-11-01T08:28:22.350 回答
1

就个人而言,可能部分是因为我在 vim 存在之前很久就使用 Unix(见鬼,我使用的第一个 Unix 版本也没有“vi”——但那是另一回事),我通常会使用“shell 脚本”(或者更可能是 Perl 脚本)来进行转换。为了将 CSV 数据转换为 INSERT,完全通用地处理引号/非引号和嵌入的逗号是很麻烦的——我可能打算使用带有 Text::CSV_XS 的 Perl 脚本来保证正确的解析。然后,我会在需要转换的文本范围内运行该脚本。

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

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

于 2008-11-01T16:18:47.830 回答