本教程提到Ex模式用于批处理。因为对我来说这是一个麻烦而不是工具,所以我想看看一些实际的例子。谁使用它?为什么?
批处理的EX模式是什么?
本教程提到Ex模式用于批处理。因为对我来说这是一个麻烦而不是工具,所以我想看看一些实际的例子。谁使用它?为什么?
批处理的EX模式是什么?
Answers:
在以下情况下,Ex模式下的Vim(也称为ex
)很有用:
非交互编辑文件是最常见的用法,人们使用的方式与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)
这是改变的简单的例子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
您也可以使用vim插件执行一些任务。
例如,以下一种代码将使用标准插件之一将您的源代码文件转换为html:
ex -s '+let g:html_no_progress=1' '+syntax on' '+set ft=c' '+runtime syntax/2html.vim' -cwqa my_code.c
它将从您的代码(以任何受支持的语言编写)中生成html文件(带有语法突出显示),该文件可用于打印或在您的网站上发布。
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
以下脚本将通过下载示例站点的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
以查看运行中的脚本。
更多示例:
也可以看看:
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
for file in *.html; do vim -es -c '%s/home\.html/index.html/g' -c wq "$file"; done
。
从最新的7.3开始,作为持久撤消支持,ex模式和其他形式的vim批处理优于其他非vim方法,因为它不会破坏撤消历史。
添加:'persistent undo'(如果启用了),将在vim编辑会话中将对文件的所有更改(不超过限制)保留在撤消历史记录中。如果文件是由外部程序编辑的,则vim将通过校验和检测到已更改的撤消历史记录来重置它。vim -E将允许您批量编辑文件,并且该编辑将在撤消历史记录中。
这不会回答您有关批处理的问题,但这是解释什么是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主体,应将其分解为插件)。
:!python
等。