批处理的EX模式是什么?


20

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

批处理的EX模式是什么?


@Masi:链接您的帐户,以便迁移后的帖子将在迁移后与您的SU帐户相关联。
2009年

Answers:


4

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

  • 您需要非交互地(作为脚本的一部分)编辑(多个)文件。
  • 操作后,您的连接速度非常慢或屏幕未更新。
  • 映射和缩写被禁用。
  • 通用键,例如EscapeControl不能正常工作。

非交互编辑文件是最常见的用法,人们使用的方式与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的超集,最引人注目的扩展是显示编辑功能。例(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

或者一些活生生的例子RPM规格:

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以查看运行中的脚本。

更多示例:


也可以看看:


22

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

假设您有25个.html文件,它们都具有:

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

不必打开其中的每一个,您可以使用Ex-mode将其全部更改为index.html

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

7
完整(更简洁)的实现将是for file in *.html; do vim -es -c '%s/home\.html/index.html/g' -c wq "$file"; done
直觉

6

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

添加:'persistent undo'(如果启用了),将在vim编辑会话中将对文件的所有更改(不超过限制)保留在撤消历史记录中。如果文件是由外部程序编辑的,则vim将通过校验和检测到已更改的撤消历史记录来重置它。vim -E将允许您批量编辑文件,并且该编辑将在撤消历史记录中。


2
这似乎有些牵强,但肯定是合理和聪明的!+1
Tarrasch

1

这不会回答您有关批处理的问题,但这是解释什么是Ex模式的另一种方式。你知道你怎么按:进入命令行模式并输入命令?好了,Ex模式还可以让您输入相同的命令,除了Vim在输入命令后不会离开Ex模式,而是保持在Ex模式,并且您可以输入其他命令。因此,它有点像REPL(读取,评估,打印,循环),但没有打印(因此只是一个REL ...)。我将回到为什么您以后可能需要这种REL的原因。这就是为什么它称为Ex模式,它使您可以输入Ex命令,这与命令行模式一样,可以让您输入Ex命令。另一种解释方式是,它可以让您输入并立即执行Vimscript / VimL代码。Vimscript / VimL是可用于编写Vim插件的语言。它也是用于编写配置文件(可能是.vimrc)的语言。这也是从命令行模式或Ex模式输入Ex命令时使用的语言。因此,从这个角度来看,Ex模式可以看作是VimL REL。您为什么想要VimL REL?出于同样的原因,人们喜欢其他语言的REPL。它们对于调试代码或试验语言以查看其工作方式确实很有帮助,尤其是如果您在VimL中编写插件或高度自定义配置文件(这可能意味着您违反了SRP主体,应将其分解为插件)。


最好有一些例子作为视频来展示ex-mode的用处。我从来没有意识到这一点,因为我可以使用Linux窗口管理器和vim的可视模式:!python等。
LéoLéopoldHertz tz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.