如何在终端上运行vim命令来编辑文件?

5

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

我尝试过 vim gg=G filename,但它没有起作用。

这很有用,因为我通常使用 gedit,但 vim 非常强大,所以可以使用一些其功能,而无需进入 vim 中输入文件并退出 vim,特别是因为退出需要 14 个上下文相关的指令。

与本问题名称类似的另一个问题是: 如何在 vim 自身上运行 vim 命令。而这个问题是关于在文件上运行 vim 命令。

4个回答

5

Vim可以完美地执行您所期望的命令。
只需使用ex +"<command>" <filename>vim -c "<command>" <filename>,它们是等价的。

尝试运行以下命令:

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

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


谢谢@Roger,ex +"norm gg=G" +"wq" <filename>非常好用!您能解释一下norm是什么吗?另外,当我使用vim -c "<command>" <filename>时,出现了错误:Error detected while processing command line: E492: Not an editor command: gg=G - Carlos Martins
1
一个人可以运行正常模式命令(例如G到达EOF),也可以运行执行模式命令(例如:set textwidth=79)。示例bash同时运行两者$ vim ~/.vimrc -c ":set foldcolumn=6 textwidth=0 | :execute 'normal zR' | /map",其中zR展开所有内容,/map搜索映射。 - Xopi García
我现在明白为什么 vim -c "norm gg=G" + "wq" <filename> 无法工作了。正确的语法应该是 vim -c "norm gg=G" -c "wq" <filename>。请注意,我们使用了 -c 标志两次,而不是使用 + 符号。 - Carlos Martins

3
我猜你想要遍历每个文件并缩进它,甚至不需要打开它。
  • 解决方案A.1:通过shell文件循环。自制Vim脚本。

如果indent.vim文件是:

:exec "normal gg=G"
:wq

例如,在所有JS文件中运行:

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

-e 在文件filename上以ex模式运行Vim,并从文件indent.vim中读取

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

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

如果逐个打开文件,则其他答案都很好,但仅针对自动缩进,ALE插件可以自动完成此操作。

或者检查其文件扩展名的linter,例如javascript: link,我确定eslint有一个shell命令标志只缩进一个文件。类似于:

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

首先打开所需文件(如果文件较多或较大可能会出现错误):

$ vim -p ./*.js;

任何情况下的第二次运行

:silent! argdo exec "normal gg=G"

Shell标志更好地解释了 https://dev59.com/L2jWa4cB1Zd3GeqPqWpL#12410259 - Xopi García
我正在使用MAKE来实现这个目的。我只是在make上创建了一个指令,用于缩进每个文件,然后创建一个indent all指令,调用所有其他缩进指令。我在我的make编译中调用了这个indent all指令。 - Carlos Martins
@CarlosMartins 我认为你正在试图重复造轮子。Makefile 不旨在取代 Vim 的缩进策略(linters)。也许你可以帮助社区改善 coc-nvim 的自动缩进。 - Xopi García

2

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>

1

你需要将所有命令放入一个文件中,例如:

$ cat pippo 
gg=G<enter>

然后你需要运行 vim -s script yourfile,像这样:

$ vim -s pippo yourfile.txt

这个dos命令可以工作,但我需要把命令放在我正在工作的同一个文件夹中。所以我需要将一个文件复制到我正在工作的每个文件夹中吗?我猜我可以使用别名或者其他方法来给脚本提供绝对路径。谢谢。 - Carlos Martins
pippo file is not needed to be in same directory as yourfile.txt. Run: pippo="./zzz_deleteMe.txt"; echo "gg=G" > $pippo; vim -s $pippo ~/.vimrc; - Xopi García

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接