vim 的高效非交互使用
Efficient non-interactive use of vim
我使用 vim 以非交互方式将单个 C 语言函数写入文件。
首先使用 ctags 创建一个 tags
文件。
要将 main()
函数写入文件 func.c
,然后我使用
vim -R -U NONE -u NONE -c ":ta main" -c ":.,/^}/w!func.c" -c :q
换句话说,这个 运行s 3 vim 非交互命令:
:ta main
跳转到 main()
:.,/^}/w!func.c
从当前行写到行首的下一个结束卷曲
:q
退出
我试图通过不浪费时间阅读用户或系统启动文件 (-U NONE -u NONE
) 和避免创建 .swp 文件 (-R
) 来提高效率。
还有两个问题我无法摆脱:
- 如果这是 运行 作为管道的一部分,我会收到
Vim: Warning: Output is not to a terminal
警告和(显然)一秒钟的延迟。
- 如果我保存此命令的标准输出,我仍然会看到使用了很多终端转义序列,并且生成了诸如
"func.c" 58 lines, 1707 characters written
之类的消息。
有没有办法避免这些问题?
这听起来像 静默批处理模式 (:help -s-ex
) 可能适用于您的用例。否则,您无法绕过完全自动化(具有您描述的一些缺点)。
静默批处理模式
对于非常简单的文本处理(即使用 Vim 作为增强的 'sed' 或 'awk',也许只是受益于 :substitute
命令中增强的正则表达式) , 使用 Ex-mode.
REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"
注意:静默批处理模式 (:help -s-ex
) 会扰乱 Windows 控制台,因此您可能需要在 Vim 运行.
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
注意:如果"commands.ex"
文件不存在,Vim将挂起等待输入;最好事先检查它的存在!或者,Vim 可以从标准输入读取命令。如果使用 -
参数,您还可以使用从 stdin 读取的文本填充新缓冲区,并从 stderr 读取命令。
全自动
对于涉及多个 windows 的更高级处理,以及 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.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-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.
我使用 vim 以非交互方式将单个 C 语言函数写入文件。
首先使用 ctags 创建一个 tags
文件。
要将 main()
函数写入文件 func.c
,然后我使用
vim -R -U NONE -u NONE -c ":ta main" -c ":.,/^}/w!func.c" -c :q
换句话说,这个 运行s 3 vim 非交互命令:
:ta main
跳转到 main():.,/^}/w!func.c
从当前行写到行首的下一个结束卷曲:q
退出
我试图通过不浪费时间阅读用户或系统启动文件 (-U NONE -u NONE
) 和避免创建 .swp 文件 (-R
) 来提高效率。
还有两个问题我无法摆脱:
- 如果这是 运行 作为管道的一部分,我会收到
Vim: Warning: Output is not to a terminal
警告和(显然)一秒钟的延迟。 - 如果我保存此命令的标准输出,我仍然会看到使用了很多终端转义序列,并且生成了诸如
"func.c" 58 lines, 1707 characters written
之类的消息。
有没有办法避免这些问题?
这听起来像 静默批处理模式 (:help -s-ex
) 可能适用于您的用例。否则,您无法绕过完全自动化(具有您描述的一些缺点)。
静默批处理模式
对于非常简单的文本处理(即使用 Vim 作为增强的 'sed' 或 'awk',也许只是受益于 :substitute
命令中增强的正则表达式) , 使用 Ex-mode.
REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"
注意:静默批处理模式 (:help -s-ex
) 会扰乱 Windows 控制台,因此您可能需要在 Vim 运行.
# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"
注意:如果"commands.ex"
文件不存在,Vim将挂起等待输入;最好事先检查它的存在!或者,Vim 可以从标准输入读取命令。如果使用 -
参数,您还可以使用从 stdin 读取的文本填充新缓冲区,并从 stderr 读取命令。
全自动
对于涉及多个 windows 的更高级处理,以及 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.
-i NONE Ignore the |viminfo| file (to avoid disturbing the
user's settings).
-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.