在使用Vim(在家和工作中)时,我经常发现自己反复做类似的事情。例如,我可能会将一堆CSV文本转换为一系列SQL插入。我多年来一直在使用Vim,但直到最近我才开始认真考虑如何在使用VI时提高效率。
我的问题是..是否有一种存储常用命令或命令序列的好方法(或正确方法)?如何执行它们的最佳方式是什么?能够在实时会话中使用相同的脚本并且通过命令行对某个文件使用相同的脚本会很好。
我希望我可以将它们存储在.vim文件中,以便我可以将它们交给同事(他们不熟悉vim)供他们使用。
答案 0 :(得分:14)
您可以将常用任务宏存储在.vim文件中,例如this,然后您可以使用命令加载它们:so file.vim
Here你可以找到一堆有用的宏,我建议你学习一下有用的 q macro recording命令,它非常强大......
使用 q 命令创建的宏存储在寄存器中,qq将宏存储在q寄存器中,因此当您结束录制时,只需粘贴宏,使用“ qp 并保存它,稍后你可以通过简单地将宏放入寄存器来加载它,即:“qY ,宏只是文本,记住你可以使用任何寄存器而不是q。有一个用于存储 q 宏的Vim脚本:
marvim : Macro Persistent Storage and Shareable Repository for VIM
答案 1 :(得分:3)
我使用q
/ @
来经常录制/重播宏。
下一步是尝试写3个或更少的ex命令。
如果某些东西如此复杂以至于宏和短序列都不够,我倾向于将其写为Perl脚本。根据我的口味,vim脚本语言有点太有限了,无法尝试做大事。 (尽管vim 7在这方面已经取得了很大的进步,但是借用了Python的一些东西。)
请注意@
执行的操作非常简单:它会获取寄存器的内容并重放它们,就好像您在正常模式下键入它们一样。同样地,q
只是将您输入的序列记录到您命名的寄存器中。这些是用于yanking / put的自相同寄存器 - 这意味着您可以直接将记录的序列粘贴到文件中(.vimrc
任何人?)或从一个文件中拉出一系列命令文件并重播(所以你可以在~/my-vim-macros.txt
或其他东西中保留一堆)。
答案 2 :(得分: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'
可能有更好的方法,但这有效。
答案 3 :(得分:1)
就个人而言,也许部分原因是因为我在vim存在之前很久就使用了Unix(哎呀,我使用的第一个版本的Unix也没有“vi” - 但这是另一个故事),我通常会使用'shell脚本'(或者,更有可能是Perl脚本)来进行转换。为了将CSV数据转换为INSERT,完全通用地处理引号/非引号和嵌入式逗号是混乱的 - 我可能的目标是使用带有Text :: CSV_XS的Perl脚本来保证正确的解析。然后我会在需要转换的文本范围上运行该脚本。
这样做的一个优点是专注的工具方法 - 一个工具可以完成一项工作。我的私人bin目录中有300个或更多的脚本和程序; RCS目录中有超过500个脚本。
这并不是说vim中的脚本编写很糟糕。我使用(或多或少)复杂的地图命令来编写复杂的操作,通常当我不得不在一套文件中进行相同的更改时,当我不认为值得创建脚本时工作。但是,如果我认为我可能不止一次需要更改,那么我将编写脚本。例如,GCC开始变得高兴(大约2005年)关于不在目标文件中嵌入未使用的静态字符串 - 这意味着我的版本控制信息不可见。因此,在我编辑源文件的过程中,我已经从静态(固定)名称转换为公共名称 - 不情愿,但必然是AFAIAC。我有一个脚本可以为我编辑,所以当我需要在文件中进行更改时,我会运行该脚本来执行此操作。我有另一个更新版权信息的脚本;每当我第一次修改给定年份的文件时,我都需要这样做。是的,我可能会把它当作vim中的东西藏起来 - 我一直认为单独的脚本更好,尤其是因为如果我切换到任何其他编辑器,我仍然可以使用该脚本。