~/.vimrc
中禁用了这些键,以防止意外击中它们(尤其是q :):我是一位具有一定经验的Vim用户,并且了解其背后的基本概念,但我仍然很难在日常使用Vim中找到任何用途。总的来说,它似乎没有比输入带有::前缀的标准vim命令行命令有用的功能,因为更改不会立即被回显。Ex在现代Vim中有日常实用性吗?在Ex模式下,有什么比标准命令更容易执行的工作吗?命令行模式和ex模式有什么区别?
#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 -E
,edit
和ex
。 Ex是vi
的一个超级集,其中最引人注目的扩展是显示编辑。最常见的用法,人们以与ed
和sed
类似的方式使用它,但是它们更加面向流-他们仅从头到尾读取文件(它们不设计用于多行)而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用户,我很欣赏使用普通模式键在文本中移动的速度。我更喜欢使用h
和l
而不是left arrow
和right 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
评论
问和问:完全不同。你是在问Q对吗?@jamessan,实际上,我不确定...你是对的,尽管我认为它们基本上是相同的,但它们似乎确实在做不同的事情。如果您回答了这个问题,那么在那里可能会有所帮助,因为我显然很困惑。
正在Meta上讨论此问题。
@AndrewFerrier您问了q:特别是,并提到它是在两个关键序列中,您最常遇到的一个。而且这里的两个答案可能对按正确术语搜索它的人很有用。
当您了解q /和q:的功能时,您可能会认为它们是Vim中一些最有用的命令。是的,您已经知道如何使用它们,只是还不知道它们的作用。观看此截屏视频以查找答案。