代码之家  ›  专栏  ›  技术社区  ›  Jeremy Cantrell

在VIM中编写常见任务的脚本

  •  11
  • Jeremy Cantrell  · 技术社区  · 16 年前

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

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

    我希望我能把它们存储在一个.vim文件中,这样我就能把它们交给同事(他们对vim不是很精通)使用。

    4 回复  |  直到 16 年前
        1
  •  14
  •   Christian C. Salvadó    16 年前

    您可以将公共任务宏存储在.vim文件中,例如 this 例如,然后可以使用命令加载它们 所以文件vim

    Here 你可以找到一堆有用的宏,我也建议你好好学习有用的 Q macro recording 命令,它非常强大…

    使用创建的宏 Q 命令存储在寄存器中,q q将宏存储在q寄存器中,因此当您结束录制时,只需粘贴宏, “QP 然后保存它,稍后您可以通过简单地将宏拉入寄存器来加载它,即: “QY” ,宏只是文本,记住您可以使用任何寄存器而不是Q。有一个VIM脚本用于存储 Q 宏指令:

    marvim : Macro Persistent Storage and Shareable Repository for VIM

    也可以看看 Vim Scripting Language .

        2
  •  3
  •   Aristotle Pagaltzis    16 年前

    我用 q / @ 经常记录/重放一个宏。

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

    如果一个宏或简短的ex序列都不够复杂,那么我倾向于将其编写为Perl脚本。VIM脚本语言有点太有限了,我不想尝试在里面做大事。(尽管Vim7在这方面取得了巨大的进步,但它从Python中借用了大量的东西。)

    注意 @ 做一些非常简单的事情:它获取寄存器的内容并重放它们,就像在正常模式下键入它们一样。同样地 Q 只需将您输入的序列记录到您所命名的寄存器中。这些是 自我相同 用于拉/放“的寄存器,这意味着您可以直接将记录的序列粘贴到文件中。( .vimrc 有人吗?)或者从一个文件中提取一系列命令并重放它(这样你就可以把它们放在 ~/my-vim-macros.txt 或某事)。

        3
  •  2
  •   ngn    16 年前

    可以将命令序列存储在 .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'
    

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

        4
  •  1
  •   Jonathan Leffler    16 年前

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

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

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