在Vim中编写常见任务脚本

在Vim中编写常见任务脚本,vim,scripting,automation,code-snippets,Vim,Scripting,Automation,Code Snippets,在使用Vim(在家里和工作中)时,我经常发现自己反复做类似的事情。例如,我可以将一组CSV文本转换为一系列SQL插入。我已经使用Vim很多年了,但直到最近我才认真思考如何在使用Vim的同时提高生产力 我的问题是。。有没有一种好的方法(或正确的方法)来存储常用的命令或命令序列?执行它们的最佳方式是什么?如果能够在实时会话上使用相同的脚本,并且能够通过命令行对某些文件使用相同的脚本,那就太好了 我希望我可以将它们存储在.vim文件中,这样我就可以将它们交给同事(他们对vim不太熟悉)使用。您可以将常

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

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


我希望我可以将它们存储在.vim文件中,这样我就可以将它们交给同事(他们对vim不太熟悉)使用。

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

你可以找到一些有用的宏,我也建议你好好学习有用的q命令,它非常强大


使用q命令创建的宏存储在寄存器中,qq将宏存储在q寄存器中,因此当您结束录制时,您可以简单地粘贴宏,使用“qp并保存它,稍后您只需将宏拖动到寄存器中即可加载宏,即:“qY,宏只是文本,请记住,您可以使用任何寄存器而不是q。有一个Vim脚本用于存储q宏:


还可以查看。

您可以将命令序列存储在
.vimrc
中,并使用
:map
命令为它们分配一个键绑定。例如:

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

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

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

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


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

我使用
q
/
@
非常频繁地录制/回放宏

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

如果某个非常复杂的东西,无论是一个宏还是一个简短的ex序列都不够用,我倾向于将其作为Perl脚本来编写。就我的口味而言,vim脚本语言有点太有限,无法尝试在中做大事。(尽管vim 7在这方面取得了很大的进步,从Python中借用了一些东西。)


请注意,
@
做了一件非常简单的事情:它获取寄存器的内容并重放它们,就像您在正常模式下键入它们一样。同样地,
q
只需将您正在键入的序列记录到您所命名的寄存器中。这些寄存器与您用于拖动/放置的寄存器相同–这意味着您可以直接将录制的序列粘贴到文件中(
.vimrc
any?),或者从文件中拖动一系列命令并重放(这样您就可以将它们保存在
~/my vim macros.txt
或其他文件中).

这可能会在您的一个链接中得到回答,但qq宏一经录制就可以存储吗?我一直使用它们,但我不知道它们是否可以跨会话持久化。使用q命令创建的宏存储在寄存器中,qq将宏存储在q寄存器中,因此当您结束录制时,您可以简单地粘贴宏,并使用“qp并保存它,稍后您可以通过拖动宏文本加载它,通过”请记住,你可以使用任何寄存器来代替q…在大多数情况下,我同意。出于同样的原因,我有大量的bash、zsh和python脚本。另一方面,我提出这个问题的目的是找到合适的技术来填补我工作效率中的这一特殊差距,这是我在Vim中重复执行的小任务。
vim file.txt -c ':normal ,c | :x'