【问题标题】:Executing Vim commands in a shell script在 shell 脚本中执行 Vim 命令
【发布时间】:2013-09-22 11:48:30
【问题描述】:

我正在编写一个 Bash 脚本,它运行命令行程序 (Gromacs)、保存结果、修改输入文件,然后再次循环该过程。

我正在尝试使用 Vim 来修改输入文本文件,但我无法在打开后从 .sh 文件中找到执行内部 Vim 命令(如:1234、w、x、dd 等)的方法我在 Vim 中的输入文件(“vim conf.gro”)。

有没有从 shell 脚本执行 Vim 命令的实用方法?

【问题讨论】:

  • 您确定需要使用vim 而不是其他编辑器,例如sed?您可以在不使用全屏的ex 模式下使用vim(因此,在脚本中使用更好)?您到底想在脚本编辑中做什么?

标签: macos bash shell vim vi


【解决方案1】:

您可以通过 -c 标志为 Vim 编写脚本。

vim  -c "set ff=dos" -c wq mine.mak

然而,这只能让你走这么远。

  • 从您提供的命令看来,您正在尝试运行一些正常的命令。您将需要使用:normal。例如:norm dd
  • 在命令行上写所有这些是自找麻烦。我建议你制作一个 Vim 文件(例如 commands.vim),然后通过 -S 制作 :source
  • 您可能希望获得良好且符合要求的 Vim 的 ex 命令。看看:h ex-cmd-index

所以你最终会得到这样的东西。在 commands.vim 中包含所有 Vim 命令。

vim -S commands.vim mine.mak

您可能还想研究使用sed 和/或awk 进行文本处理。

【讨论】:

  • 这正是我想要的。我已经有了 vim 的解决方案,所以我不想选择其他语言/工具。
【解决方案2】:

我认为vim -w/W and vim -s 是您正在寻找的。​​p>

你也可以用vim -w test.keys input.file 记录“Vim 操作/键序列”。你也可以写test.keys。例如,将其保存在文件中:

ggwxjddZZ

这样就可以了:

Move to the first line,
move to the next word,
delete one character,
move to the next line,
delete the line, and
save and quit.

有了这个test.keys 文件,你可以这样做:

vim -s test.keys myInput.file

您的“myInput.file”将通过上述操作进行处理,并保存。您可以在您的 shell 脚本中包含该行。

VimGolf 正在使用相同的方式保存用户的解决方案。

【讨论】:

    【解决方案3】:

    替代方案

    除非您真的需要特殊的 Vim 功能,否则最好使用 非交互式工具,例如 sedawk 或 Perl/Python/Ruby/您最喜欢的脚本语言在这里

    也就是说,你可以以非交互方式使用 Vim:

    静默批处理模式

    对于非常简单的文本处理(即像增强的 'sed' 或 'awk' 一样使用 Vim,也许只是受益于 :substitute 命令中增强的正则表达式),请使用 Ex-mode .

    REM Windows
    call vim -N -u NONE -n -es -S "commands.ex" "filespec"
    

    注意:静默批处理模式 (:help -s-ex) 会弄乱 Windows 控制台,因此您可能需要在 Vim 运行后执行 cls 来清理。

    # Unix
    vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"
    

    注意:如果"commands.ex" 文件不存在,Vim 将挂起等待输入;最好事先检查它的存在!或者,Vim 可以从标准输入读取命令。如果使用 - 参数,您还可以使用从标准输入读取的文本填充新缓冲区,并从标准错误读取命令。

    全自动化

    对于涉及多个窗口的更高级处理,以及 Vim 的真正自动化(您可能与用户交互或让 Vim 运行以让用户接管),请使用:

    vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"
    

    这里是使用的参数的摘要:

    -T dumb           Avoids errors in case the terminal detection goes wrong.
    -N -u NONE        Do not load vimrc and plugins, alternatively:
    --noplugin        Do not load plugins.
    -n                No swapfile.
    -es               Ex mode + silent batch mode -s-ex
                    Attention: Must be given in that order!
    -S ...            Source script.
    -c 'set nomore'   Suppress the more-prompt when the screen is filled
                    with messages or output to avoid blocking.
    

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多