防爆模式有实际用途吗?


115

Vim具有可以通过输入进入的Ex模式和可以通过进入Q的命令行模式q:。新vim用户之间的共同抱怨是,他们在尝试退出vim时意外进入了这些模式。因此,我禁用了这些键,~/.vimrc以防止自己意外地(尤其是q:)敲击它们:

map q: <Nop>
nnoremap Q <nop>

尽管我已经阅读了Ex上vim文档,并且是一名有一定经验的Vim用户,并且了解其背后的基本思想,但我仍然很难在日常使用vim中找到任何用途。总的来说,它似乎没有比输入标准的带前缀的vim命令行命令有用的功能:,因为更改不会立即被回显。

Ex在现代Vim中有日常用途吗?在Ex模式下,有什么比使用标准命令更容易做到的吗?命令行模式和ex模式有什么区别?


13
Q并且q:完全不同。您是指Q对吗?
jamessan 2015年

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

这个问题正在Meta讨论
200_success

1
@AndrewFerrier您曾q:特别询问过,并提到过这两个关键序列中,您遇到最多的一个。并且这里的两个答案对于按正确术语搜索它的人可能很有用。
Random832

4
当你学习什么q/q:做什么,你可能会考虑他们的一些Vim中最有用的命令。是的,您已经知道如何使用它们,只是还不知道它们的作用。观看此截屏视频以找出答案
佐藤桂2015年

Answers:


81

Q如您所见,是ex模式。交互使用并不是完全有用,但是它存在是因为Vim可用于模拟旧的ex二进制文件。实际上,许多系统ex只是通过将其符号链接到来提供命令vim

q::<C-f>,提供了一种浏览命令行历史记录并像普通缓冲区一样对其进行编辑的方法。这使得查找先前运行的命令,使用普通的Vim命令对其进行编辑,然后运行修改后的命令变得容易。该q/q?命令存在提供搜索历史相同的功能。


63

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

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

基本上vi是可视模式,ex因此Vim Ex Mode只是仿真ex(它们仍然运行相同的代码),因此可以ex从vi内进入命令模式,反之亦然。实际上有两种模式:Ex模式(vim -e)和改进的Ex模式,与vi兼容的Ex模式(vim -E)相比,它允许更多的高级命令。请参阅:Ex模式和改进的Ex模式有什么区别?

Ex是一族编辑者的根editexvi。Ex是的超集ed,最引人注目的扩展是显示编辑功能。例(1)

非交互编辑文件是最常见的用法,人们使用的方式与sed和类似awk,但它们更面向流-他们只从头到尾读取文件(它们不设计用于多行) )vim面向缓冲区-您可以根据需要在文件中前后移动,因此功能如此强大。

基本上:

sedS tream ED管理员,不是文件编辑器。

但是,人们似乎滥用它来尝试编辑文件,事实是它不编辑文件。其次,它的诸如in-(-i)之类的选项是非标准的FreeBSD扩展名,在其他操作系统上可能不可用。因此,如果您想避免代码不便,I / O开销和不良副作用(例如破坏符号链接),则应使用BashFAQex,它是标准的基于UNIX命令的编辑器(以及ed)。


我发现在Ex模式下有用的其他事情是将其用作游乐场(类似于python控制台),在这里您可以连续执行许多命令,工作/调试正则表达式,检查vim配置,执行外部命令或使用寄存器等。 。

例如:

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

在Ex模式下,这比在普通模式下(您只能看到最后一条命令)要容易得多。


实际用法

我的别名如下.bash_aliases

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

注意:使用bufdo不是exPOSIX兼容的方法(按照手册),因此您可以考虑将其与一起使用find。所述!用于强制切换缓冲器而不保存(否则警告生成)。

我用来修剪所有源文件中尾随空格的第一个,例如:

trim **/*.php

第二个将所有选项卡(递归)转换为空格,例如:

retab **/*.php

对我来说,使用retab是足够的,但在描述一些缺点这里。添加更多内容-V以增加详细度输出。

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

有关更实际的示例(例如解析html文件),请检查:

也可以通过以下网址进一步了解Ex-mode:


能否请您发布的“编辑(多)文件中的非交互式”的操作,更易于实现用一个例子ex比它与edsedawk
佐藤桂2015年

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

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

@Wildcard !基本上没有任何用处,因为每次切换缓冲区时,ex都会抱怨未保存的更改(并且我们最终使用来保存更改xa)。可以禁用警告,但是添加起来要容易得多!
kenorb '16

我明白了……我想我是在看错文档。它规定,没有!,如果缓冲区不能放弃命令就会失败,但它并没有明确规定,!会导致缓冲区没有被丢弃....那么,是否在这种情况下,“抛弃”的意思是“下降,因为它不包含任何未写入磁盘的内容”?要不然是啥?(我正在查看:help bufdo
通配符

18

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

我有时会通过ssh over VPN访问系统,而这些连接有时会变慢。使问题变得更糟的是,有时我需要在远程端编辑文件,该文件除了位于ssh和VPN之后,还通过缓慢的串行连接(因此9600波特和大量的网络延迟)。

像这样的时候,由于我看到的东西被延迟了,因此视觉反馈和屏幕更新变得更加成为障碍(这种效果有点像和麦克风说话,但扬声器却很远,比如在体育馆里。一个人的动作变得杂乱无章。有时由于反馈延迟而感到困惑)。

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

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


13

命令行窗口对于写出较长的复杂命令很有用。由于命令历史记录是作为窗口打开的,因此您可以使用任何vim导航或编辑命令/映射。

假设您要编辑一次运行但已出错的长替换命令:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

为了更改搜索字符串,您不能像b在Ex行中那样使用vim动作进行导航(尽管我相信此导航有一些关键的映射)。相反,大多数人会多次按下左箭头键。

更好的方法:点击q:进入命令行窗口,k移至最后一个命令,并以正常动作导航至要更改的命令部分。想要更改整个单词,没问题:ciw


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

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

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

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

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

6

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


让我想起了这次采访。我不记得是否ex专门提到过。
马丁·图尔诺伊

极好的洞察力,我永远都不会想到这一点。非常感谢,很好的答案。
安德鲁·费里尔

2

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


-1

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

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

您还可以通过以下方式进入其插入模式

 :i 

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

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

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

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