如何从终端对文件执行 运行 vim 命令?

How to run a vim command on a file from the terminal?

我想 运行 一个 vim 命令,例如 gg=G 但在终端中。

我试过vim gg=G filename但是没用。

这会很有用,因为我通常在 gedit 上工作,但是 vim 非常强大,所以不用在 vim [=28] 中输入文件就可以使用它的一些功能会很酷=] 执行命令并退出 vim,特别是因为退出需要 14 条上下文相关的指令。

另一个与这个问题同名的问题,是关于不同的主题:How to run vim commands on vim it self。虽然这个问题是关于 运行ing vim 文件上的命令

您必须将所有命令插入到一个文件中,例如:

$ cat pippo 
gg=G<enter>

之后你必须 运行 vim -s 脚本你的文件,像这样:

$ vim -s pippo yourfile.txt

vim --help 确实说明了多种可能性:

vim --cmd    run command before config is loaded
vim -c       run command after config is loaded
vim -s       read normal mode commands from <scriptin>

Vim 可以 运行 完美地按照我解释你的愿望的方式命令。
您只需使用 ex +"<command>" <filename>vim -c "<command>" <filename>,它们是等价的。

尝试运行以下操作:

$ ex +"norm gg=G" +"wq" <filename>

它将打开您的文件,使用第一个命令过滤整个文件并使用 wq 命令保存(覆盖)。

我猜你想要 loop through every file 并缩进它,甚至不打开它。

  • 解决方案 A.1:通过 shell 文件循环。自制Vim脚本

如果 indent.vim 文件将是

:exec "normal gg=G"
:wq

运行 例如在所有 js 文件中:

for filename in ./*.js; do
    vim -es ./$filename <indent.vim

-e 运行s Vim 在文件 filename 的 ex 模式下并从文件 indent.vim

中读取

-s 以静默模式运行,即不输出任何提示(如 : 提示)

  • 解决方案 A.2:通过 shell 文件循环。使用 linters。

如果您打开 1 对 1 文件。其他答案很好,但是 仅针对自动缩进,ALE 插件可以实现自动缩进。

或者检查它的 linters 是否有你的文件扩展名,例如对于 javascript: link, I am sure eslint 有一个 shell 命令标志来缩进文件。 类似于:

for filename in ./*.js; do
    eslint --flagToIndent $filename;
  • 解决方案 B: 或通过 Vim argdo, bufdo,...

第一次打开所需的文件(如果文件很多或很重可能会出错):

$ vim -p ./*.js;

第二 运行 在任何

:silent! argdo exec "normal gg=G"