Vim具有可以通过输入Q进入的Ex模式和可以通过q:输入的命令行模式。新vim用户之间的共同抱怨是,他们在尝试退出vim时意外进入了这些模式。因此,我在我的~/.vimrc中禁用了这些键,以防止意外击中它们(尤其是q :):我是一位具有一定经验的Vim用户,并且了解其背后的基本概念,但我仍然很难在日常使用Vim中找到任何用途。总的来说,它似乎没有比输入带有::前缀的标准vim命令行命令有用的功能,因为更改不会立即被回显。

Ex在现代Vim中有日常实用性吗?在Ex模式下,有什么比标准命令更容易执行的工作吗?命令行模式和ex模式有什么区别?

评论

问和问:完全不同。你是在问Q对吗?

@jamessan,实际上,我不确定...你是对的,尽管我认为它们基本上是相同的,但它们似乎确实在做不同的事情。如果您回答了这个问题,那么在那里可能会有所帮助,因为我显然很困惑。

正在Meta上讨论此问题。

@AndrewFerrier您问了q:特别是,并提到它是在两个关键序列中,您最常遇到的一个。而且这里的两个答案可能对按正确术语搜索它的人很有用。

当您了解q /和q:的功能时,您可能会认为它们是Vim中一些最有用的命令。是的,您已经知道如何使用它们,只是还不知道它们的作用。观看此截屏视频以查找答案。

#1 楼

如您所见,Q是ex模式。交互使用并不是完全有用,但是它存在是因为Vim可用于模拟旧的ex二进制文件。实际上,许多系统只是通过将其符号链接到ex来提供vim命令。这样可以很容易地找到之前运行的命令,使用普通的Vim命令对其进行编辑,然后运行修改后的命令。存在q::<C-f>命令可为搜索历史提供相同的功能。

#2 楼

在以下情况下,Ex模式下的Vim非常有用:



您需要非交互地(作为脚本的一部分)编辑(多个)文件。
您的连接非常紧密动作后速度变慢或屏幕未更新。
映射和缩写被禁用。
Escape或Control等公用键无法正常工作。 vi的模式,因此Vim Ex Mode只是ex的仿真(它们仍然运行相同的代码),因此可以从vi内进入ex的命令模式,反之亦然。实际上有两种模式:Ex模式(ex)和改进的Ex模式,与vi兼容的Ex模式(vim -e)相比,它允许更多的高级命令。请参阅:Ex模式和改进的Ex模式有什么区别?


Ex是一系列编辑器的基础:vim -Eeditex。 Ex是vi的一个超级集,其中最引人注目的扩展是显示编辑。最常见的用法,人们以与edsed类似的方式使用它,但是它们更加面向流-他们仅从头到尾读取文件(它们不设计用于多行)而awk面向缓冲区-您可以根据需要在文件中前后移动,这使它功能如此强大。

基本上:


文件编辑器。


然而,人们似乎滥用它来尝试编辑文件,事实是它不编辑文件。其次,它的就地选项(vim)是非标准的FreeBSD扩展,可能在其他操作系统上不可用。因此,如果要避免代码不便,I / O开销和不良副作用(例如破坏符号链接),则应使用sed,它是标准的基于UNIX命令的编辑器(以及-i)BashFAQ。 >
我发现在Ex模式下有用的其他功能是将其用作游乐场(类似于ex控制台),在这里您可以连续执行许多命令,工作/调试正则表达式,检查vim配置,执行外部命令或使用寄存器等。

例如:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg


在Ex模式下比在普通模式下更容易请参阅最后一条命令。)


实际用法

我在ed中具有以下别名: />
注意:使用python不是.bash_aliases的POSIX兼容方法(按照手册),因此您可以考虑将其与bufdo一起使用。 ex用于在不保存的情况下强制切换缓冲区(否则会生成警告)。
alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"


第二个将所有制表符转换为空格,例如:

trim **/*.php


对我来说,使用find就足够了,但此处描述了一些缺点。添加额外的!以增加详细度输出。

请注意,上面的示例使用zsh / bash4 globlob(retab),因此请确保您的外壳程序支持并启用了它。

更多信息实际示例(例如解析html文件),请检查:


如何非交互地编辑文件(例如在管道中)?

如何转换源代码文件转换成HTML?

例如,

retab **/*.php



还可以通过以下方式进一步了解Ex-mode:


学习vi编辑器/ Vim /模式:前模式


评论


您能否发布一个示例,该示例“用非交互方式编辑(多个)文件”的操作比用ed,sed或awk更容易用ex实现?

–佐藤桂
15-10-17在6:20



@SatoKatsura添加了两个处理多个文件的实际用法。

– Kenorb
2015年10月17日在11:00

我一直在仔细阅读文档,以更好地了解ex模式。我不明白为什么您的修剪别名bufdo命令中有一个爆炸(!)。那会不会只是放弃除最后一个文件以外的所有文件中的所有更改?如果没有,为什么不呢?

–通配符
16年1月7日在9:11

@Wildcard没有!基本上是行不通的,因为每次切换缓冲区时,ex都会抱怨未保存的更改(并且在最后用xa保存更改)。可以禁用警告,但是添加!会容易得多。

– Kenorb
16年1月7日在9:54



我看到了……我想我是看错了文档;它指定没有!如果不能放弃该缓冲区,该命令将失败,但是它没有明确指定!会导致缓冲区不被丢弃。...那么,在这种情况下,“放弃”是否意味着“已丢弃,因为它不包含任何未写入磁盘的内容”?还是什么? (我在看:help bufdo)

–通配符
16年1月7日在10:03



#3 楼

我很少使用ex-mode,但是当我需要ex-mode时,我非常感谢它的存在。

我有时通过ssh over VPN访问系统,这些连接有时会变慢。使问题变得更糟的是,有时我需要在远程端编辑一个文件,该文件除了位于ssh和VPN之后,还通过缓慢的串行连接(因此9600波特和大量的网络延迟)。 >
像这样的时候,由于我看到的东西被延迟了,因此视觉反馈和屏幕更新变得更加成为障碍(效果就像是在对着麦克风讲话,而扬声器却在运动场上一样) 。

在这种情况下,不回显所做的更改是一个有用的优势,因为当我处于待解决状态时,我可以在更短的时间内完成更多的工作我没有等待屏幕更新。

完成编辑后,我回到视觉模式进行一次屏幕更新以查看我的工作。然后,我可以返回到ex-mode或保存,因为我已经完成了。

评论


我想认为那些缓慢的情况很少见,但我在工作中已经遇到了很多次,我很感激vi(m)支持这样的“最小公分母” :)

–亚历山大·伯德(Alexander Bird)
19-10-27在14:31

#4 楼

命令行窗口对于写出较长的复杂命令很有用。由于命令历史记录是作为窗口打开的,因此您可以使用任何vim导航或编辑命令/映射。 br />
:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c


为了更改搜索字符串,您不能在Ex行中使用b之类的vim动作进行导航(尽管我相信此导航有一些关键的映射) 。取而代之的是,大多数人会多次按下左箭头键。正常运动到要更改的命令部分。想要更改整个单词,没问题:q:

评论


好,谢谢。您确定q:是Ex命令行吗?对于Q提出的模式,帮助仅使用短语“ Ex”,但这不支持您所指的标准vim编辑-仅q:支持,该帮助仅称为“命令行模式”。我知道我一开始就混淆了两者,但是我们可能应该确保我们清楚这里的区别。

–安德鲁·费里尔(Andrew Ferrier)
2015年2月5日在20:40



在我决定使用该短语之前,我搜索了:help q :,但是我可能对该术语感到困惑。

–bsmith89
2015年2月5日在20:42



我也对这个术语感到困惑。我通常谈论在以下命令中键入Ex命令:,但是我可能使用的是错误的。

–bsmith89
2015年2月5日在20:45

答案的内容都是正确的,但是使用术语的方式(对我而言)有点令人困惑。我认为您对文档的解释有些错误。问:没有打开Ex命令行。它会打开命令历史记录窗口,在其中可以编辑当前和先前的Ex命令。当您在正常模式下按:时,会得到Ex命令行。

–丰富
15年2月8日在9:05

FWIW我认为Vim文档也有些混乱,因为在某些地方它把all:命令称为“ Ex”命令。恕我直言,实际上只有Ex中实际可用的命令才应视为Ex命令。

–丰富
15年2月8日在9:08

#5 楼

一位视力不佳的人告诉我,他快要盲目转向前男友,所以这是它的一种用法。我自己比vi大得多,很久以前我从ed切换到ex(是的,我知道,“ ed是标准编辑器”)。在vi模式下,我唯一要做的就是在编写Lisp代码时%反弹以匹配parens。

评论


让我想起了这次采访。我不记得是否曾提到过ex。

–马丁·图尔诺伊(Martin Tournoij)
17年7月1日在20:32



极好的洞察力,我永远都不会想到这一点。非常感谢,很好的答案。

–安德鲁·费里尔(Andrew Ferrier)
17年7月3日在13:29

#6 楼

除了这里已经提到的用法外,如果它恰好在S / 390平台上并且控制台恰好是面向行而不是面向屏幕的,那么ex也是一种在linux控制台上编辑文件的方法。

#7 楼


Ex模式有实际用途吗?


可能没有。但是,虽然进入Ex模式并不是真正有用,但是学习Ex命令仍然很有用,特别是因为您将ex编辑命令与:g/全局命令结合使用来在匹配行上进行操作。

#8 楼

作为vim用户,我很欣赏使用普通模式键在文本中移动的速度。我更喜欢使用hl而不是left arrowright arrow,因此我的手不需要移动就可以到达这些键。当我使用其他计算机键盘时,箭头键会移动,但正常模式下的键仍处于预期位置。

当我键入:%s/oldtext/newtext/gc进行搜索和替换操作时,
我不再可以使用普通模式键在此行周围移动。

我更喜欢键入g :并以普通模式进入命令编辑器以编辑文件其余部分的方式编辑命令。

通过键入g:,我可以查看命令的历史记录。

我在inoremap q; q:i中插入了.vimrc,使用q;代替了:

#9 楼

原始的“ ex”是Unix中“ ed”文本编辑器的升级版本。在2BSD中,添加了可视模式,新的编辑器称为“ vi”。

如果要使用ex命令行,他将使用“:”键切换到命令模式。因此,据我所知,ex实际上并不是怀旧之物,它是提供命令模式的一部分。

还可以通过

 :i 


,然后单击“输入并键入您的文本。用^ c退出。
或在一个命令行中全部输入,例如

 :i my multiline text \with a second line.^c


评论


鉴于Ex-mode与Command-line-mode不太一样,这似乎无法回答问题。另外需要注意的是:不幸的是,命令模式是普通模式的同义词,而不是命令行模式。

– 8bittree
17-10-28在17:34

采取“命令模式”点。唯一的借口,当我们更改为vi时,我们将其引入为“视觉”(而不是当前的vim视觉模式),而不是“命令”-现在是ex。另一方面,命令行似乎调用了与ex相同的do_cmdline()。我承认这并不意味着有任何“实际用途”。

–if2
17-10-30在16:08