批处理的 EX 模式有何用途?

批处理的 EX 模式有何用途?

教程提到 Ex 模式用于批处理。由于它对我来说是一种麻烦,而不是一种工具,所以我想看看一些实际的例子。谁使用它?为什么?

批处理的 EX 模式有何用途?

答案1

Vim 的 Ex 模式 (也称为ex) 在以下情况下很有用:

  • 您需要以非交互方式(作为脚本的一部分)编辑(多个)文件。
  • 您的连接非常慢或执行操作后屏幕没有更新。
  • 映射和缩写被禁用。
  • Escape或等常用键Control无法正常工作。

非交互编辑文件是最常见的用法,人们使用它的方式与sed和类似awk,但它们更面向流 - 它们只从头到尾读取文件,而vim面向缓冲区 - 您可以根据需要在文件中向前和向后移动。其次,vim 的正则表达式比 awk 和 sed 的表达式更强大(它们不是为处理多行而设计的) - 例如 vim 可以匹配多行并支持零匹配。

Ex 也是一个编辑器(vi 的直接前身)并且在 Vim 中模拟 Ex 模式ex(它们仍然运行相同的代码),因此可以ex从 vi 内部进入命令模式,反之亦然。有 Ex 模式(vim -e)和改进的 Ex 模式,它们允许比 vi 兼容的 Ex 模式(vim -E)更高级的命令。请参阅:Ex 模式和改进型 Ex 模式有何区别?

Ex 是一系列编辑器的根源:edit、ex 和 vi。Ex 是 ed 的超集,最显著的扩展是显示编辑功能。ex (1)


示例 1

127以下是更改为128文件hosts并打印输出的简单示例:

ex -s +%s/127/128/g +%p +q! /etc/hosts

相当于:

sed s/127/128/g /etc/hosts

对于更高级的解决方案,您可以使用 vim 命令文件并通过更经典的方法进行 I/O 重定向:

echo :%s/127/128/g > cmds.vim
echo :%print >> cmds.vim
echo :%quit! >> cmds.vim
ex -s /etc/hosts < cmds.vim # The same as: vim -s cmds.vim /etc/hosts

示例 2

您还可以使用 vim 插件来执行一些任务。

例如下面的一行代码将使用标准插件之一将源代码文件转换为 html:

ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c

它将根据您的代码(以任何受支持的语言编写)生成可供打印或在您的网站上发布的 html 文件(带有语法高亮显示)。


示例 3

或者一些真实的例子来自每分钟转数规格:

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

示例 4

以下脚本将通过下载示例站点的 html 并用自动生成的包含随机数的 20x20 表格替换其主体来创建一个新的 html 文件:

" table.vim
%!curl -s example.com 
let @t='<table>'.repeat('<tr>'.repeat('<td>_</td>',20).'</tr>',20).'</table>'
/<body
norm!vitd"tP
%s/_/\=system('echo $RANDOM')/g
wq

用法:

ex -s table.html < table.vim

这将在安装了 curl 的 *nix 类系统上运行。添加-V以查看脚本的运行情况。

更多示例:


也可以看看:

答案2

Ex-Mode 主要用于对多个文件执行相同的操作。

假设您有 25 个 .html 文件,其中包含:

<a href="/home.html"> ...

你不用打开每一个,而是可以使用 Ex-mode 将其全部更改为index.html

vim -E -s bob.html <<-EOF
   :%substitute/home.html/index.html/
   :update
   :quit
EOF

答案3

从最近的 7.3 版本开始,作为持久撤消支持,ex 模式和其他形式的 vim 批处理优于其他非 vim 方法,因为它不会破坏撤消历史记录。

添加:如果启用“持久撤消”,则在撤消历史记录中保留对文件的所有更改(最多有限制),跨越 vim 编辑会话。如果文件由外部程序编辑,vim 将在通过校验和检测到文件已更改时重置撤消历史记录。vim -E 将允许您批量编辑文件,并且编辑将保留在撤消历史记录中。

答案4

这并没有回答你关于批处理的问题,但它是解释 Ex 模式的另一种方式。你知道你如何按:进入命令行模式并输入命令吗?好吧,Ex 模式也允许你输入相同的命令,只是 Vim 在你输入命令后不会离开 Ex 模式,它会停留在 Ex 模式,你可以输入另一个命令。所以它有点像 REPL(读取、求值、打印、循环),但没有打印(所以只是一个 REL……)。稍后我会回到为什么你可能想要那种 REL。这就是为什么它被称为 Ex 模式,它允许你输入 Ex 命令,这与命令行模式的作用相同,它允许你输入 Ex 命令。另一种解释方式是,它允许你输入并立即执行 Vimscript/VimL 代码。Vimscript/VimL 是一种可以用来编写 Vim 插件的语言。它也是你用来编写配置(可能是 .vimrc)文件的语言。它也是你从命令行模式或 Ex 模式输入 Ex 命令时使用的语言。因此从这个角度来看,Ex-mode 可以看作是 VimL REL。你为什么想要 VimL REL?出于同样的原因,人们喜欢其他语言的 REPL。它们对于调试代码或试验语言以了解其工作原理非常有用,特别是当你在 VimL 中编写插件或高度自定义配置文件时(这可能意味着你违反了 SRP 原则,应该将其分解为插件)。

相关内容