在VIM中缩进文件夹中的所有文件

har*_*ari 34 vim indentation

我有一个包含数百个TTL(TeraTermLanguage)文件的文件夹.现在我想缩进所有这些文件.

我已经创建了teraterm.vim用于缩进,我使用VIM打开一个文件并执行"gg = G"并且整个文件正确缩进.

但有什么办法,我可以缩进文件夹中的所有文件.

我想在壳牌的帮助下做.但在VIM中,我无法将文件缩进命令作为VIM的参数传递.

请建议哪些是我可以缩进VIM中所有文件的最佳方法.

nic*_*ans 60

比bash命令行编写vim更简单的方法是从vim内部使用vimscript(或者可能是一个更简单的单行程序,用于从命令行编写vim脚本).我个人更喜欢使用arg列表进行所有多文件操作.例如:

:args ~/src/myproject/**/*.ttl | argdo execute "normal gg=G" | update
Run Code Online (Sandbox Code Playgroud)
  • args使用通配符设置arglist(**将匹配当前目录以及子目录)
  • | 让我们在一行上运行多个命令
  • argdo在每个arg上运行以下命令(它会吞下第二个|)
  • execute防止normal吞下下一根管子.
  • normal 运行以下正常模式命令(您首先使用的是什么)
  • update就像:w,但只有在修改缓冲区时才会保存.

:args ... | argdo ... | update模式对于任何类型的项目范围文件操作非常有用(例如,通过%s/foo/bar/ge或设置统一fileformat或搜索和替换fileencoding).

(其他人喜欢使用缓冲区列表的类似模式:bufdo,但是使用arg列表我不需要担心关闭当前缓冲区或打开新的vim会话.)

  • 如果它妨碍了你,你应该能够避免"--More--"提示并通过自由应用`:silent`来触及每个屏幕的空间.例如`:argdo silent execute"normal gg = G"| 无声更新 (5认同)

amp*_*ine 12

打开一个终端.类型:

$ vim -w indentme.scr foo.c
Run Code Online (Sandbox Code Playgroud)

然后,准确输入(在命令模式下):

gg=G:wq
Run Code Online (Sandbox Code Playgroud)

这将关闭vim,从而节省了将文件中的所有行缩进到调用的Vim脚本的过程indentme.scr.

注意: indentme.scr将包含键入的所有键命令的记录,因此当您完成缩进文件时,不要花费大量时间使用箭头键来查看文件,因为这将导致更大的脚本并且将会严重减慢批量操作.

现在,为了缩进文件中的所有行,只需键入以下命令:

$ vim -s indentme.scr unindented-file.c
Run Code Online (Sandbox Code Playgroud)

Vim将闪烁打开 - 关闭(如果你在快速计算机上而不是编辑大文件),缩进所有行,然后就地保存文件.

不幸的是,这只会在一个文件上一次的工作,但你可以很容易地使用缩放功能shfor循环:

for filename in *.ttl ; do
    vim -s indentme.scr "$filename"
done
Run Code Online (Sandbox Code Playgroud)

注意:这将保存任何文件.除非set bk在您的身上~/.vimrc,否则不要指望保存备份.