你的vim问题是你没有grok vi

2021-05-07 12:08:57

我听到了很多关于vim,vim的很多似乎你真的似乎应该是(作为开发人员)与vim比任何其他编辑器更快.i' m使用vim做一些基本的东西和我#39; m最多10倍的vim效率低10倍。

当你谈论速度时,你应该关心的唯一两件事(你可能不够关心他们,但你应该)是:

从来没有触摸鼠标是第一个尽可能快的方式。需要年龄的时间来移动手,抓住鼠标,移动它,并向键盘带来麻烦(并且您经常HAVETO查看键盘以确定键盘你的手正确到正确的地方)

复制/削减&粘贴。我一直这样做。通过所有当代编辑器,您用左手按Shift,您将使用右手移动光标以选择文本。然后Ctrl + C复制,移动光标和Ctrl + V粘贴。

[number xx] yy将xx行复制到缓冲区中。但是你永远不会知道你是否选择了你想要的东西。我经常要做[编号xx] dd然后你撤消!

在Vim中:/,然后键入要搜索的内容,然后如果在每个特殊字符之前都有一些特殊字符,请按Enter键。

vim的一切都是如此:看起来我不知道如何处理它正确的方式。

您使用Vim的方式是什么让您更高效,而不是与当代编辑更具效率?

1"或者左手和右手是使用键盘的最快方法。"不适合我,奇怪。当我可以用一只手键入一个单词时,我发现我' m更快。 - Ben Mordecai.

你提到用YY切割并抱怨你几乎不想削减整行。实际上是程序员,编辑源代码,通常希望在整行上工作,线条和代码块。然而,YY只是yank文本进入匿名副本缓冲区(或" register"作为vi)的许多方式中的许多方式之一。

" ZEN" VI是你&#​​39;讲一种语言。初始y是动词。声明YY是Y_的同义词。 y加倍,以便更容易地键入,因为它是如此常见的操作。

这也可以表示为DD P(删除当前行并将复制粘贴到位;将副本留在匿名寄存器中作为副作用)。 Y和D"动词"以他们的"主题。"因此,YW是"从这里(光标)到当前/下一个(大)字和#34的结尾;和y' a是"从这里到包含标记名为&#39的线; A'。"

如果您只能了解基本,向下,左和右光标移动,那么VI将不会比&#34副本更高效;记事本"为你。 (好的,你' ll仍然有语法突出显示,并且能够处理大于Piddling〜45kb左右的文件;但在这里与我合作)。

vi有26" marks"和26"寄存器。"使用M命令将标记设置为任何光标位置。每个标记由单个小写字母指定。因此,马设置了' A'标记到当前位置,MZ设置' Z'标记。您可以移动到使用&#39的标记的行; (单引号)命令。因此'一个移动到包含&#39的行的开始; A'标记。您可以使用`(backquote)命令移动到任何标记的精确位置。因此,“Z将直接移动到”&“第39条的确切位置; Z'标记。

因此,削减任意选择文本的一种方法是放弃一个标记(我经常使用' a'作为我的" first" mark,' z'''' z''我的下一个标记,' B'作为另一个,和' E'还有另一个(我不互动地使用vi的15年以上的四个标记。一个人创造一个'宏和#39; t打扰一个' s互动上下文的宏如何使用宏和寄存器的惯例。然后我们进入所需文本的另一端;我们可以开始无论是结束,它都没有。然后我们可以简单地使用D`a削减或y`a复制。因此,整个过程有一个5击落开销(如果我们开始&#34,则六个;插入&#34 ;模式并需要ESC输出命令模式)。一旦我们'剪切或复制,然后在副本中粘贴是一个击键:p。

我说这是削减或复制文本的一种方法。但是,它只是众多之一。经常我们可以更简洁地描述文本范围而不移动光标并丢弃标记。例如,如果我在文本的段落中,我可以分别使用{和}移动到段落的开头或结尾。因此,要移动一段文本,我使用{d}(3击键)剪切它。 (如果我碰巧已经是段落的第一个或最后一行,我可以简单地使用d}或d {分别。

&#34的概念;段落"默认为通常直观合理的东西。因此,它经常用于代码以及散文。

经常我们知道一些模式(正则表达式)标记一端或其他文本中的另一个文本;重新感兴趣。在vi中搜索前进或倒退是移动。因此,它们也可以用作"主题"在我们的"陈述。"所以我可以使用d / foo从当前行剪切到包含字符串&#34的下一行; foo"和y?栏从当前行复制到包含"栏的最近(上一个)的线路。"如果我不希望整行我仍然可以使用搜索动作(作为自己的语句),删除我的标记并使用前面描述的“X命令”。

除了"动词"和#34;主题" vi也有"物体" (在术语的语法意义上)。到目前为止,我只描述了匿名登记册的使用。但是,我可以使用26&#34中的任何一个;命名"通过预先提示"对象&#34注册;参考" (双引号修饰符)。因此,如果我使用"加入i' m切入当前线进入' A'注册和如果我使用"按/ foo然后我y' m从这里播出了一个文本的副本到了包含" foo"进入' B'登记。从注册粘贴我只是用相同的修饰符序列粘贴粘贴:" AP粘贴了&#39的副本; A'在光标和#34之后注册'" BP粘贴来自&#39的副本; B'到当前行之前。

这个概念"前缀"还添加了语法&#34的类似物;形容词"和#34;副词'到我们的文本操纵"语言。"大多数命令(动词)和移动(根据上下文的动词或对象)也可以采用数字前缀。因此,3J是指"加入下一个三行"和d5}手段"从当前行删除在此处的第五段结束。"

这是所有中级vi。如果你&#39,它没有特定于vim特定,并且在vi中有更高的技巧;重新准备好了解它们。如果你是掌握这些中级概念,那么你&#39可能会发现你很少需要编写任何宏,因为文本操纵语言足够简洁,表达,可以使用编辑器&#39更容易完成大多数东西。 34;原生"语。

有许多:命令,最值得注意的是:%s / foo / bar / g全局替代技术。 (那个'没有高级但其他:命令可以)。整体:vi'先前的化身作为ed(行编辑器)和稍后的EX(扩展线编辑器)实用程序,历史上历史上历史上历史上继承。事实上,VI是如此命名,因为它是它的视觉界面。

:命令通常在文本线上运行。当终端屏幕罕见的时代没有常见,许多终端是" Teletype" (TTY)设备。因此,常常从文本的印刷副本工作,通过一个极端的界面使用命令(常见连接速度为110波特,或大致,每秒11个字符 - 比快速打字员慢;滞后是常见的多用户互动会话;此外,还有一些动机来保护纸张)。

因此,大多数的语法:命令包括地址或地址范围(行号),然后是命令。自然可以使用字面线数字::127,215 s / foo / bar改变第一个" foo"进入"酒吧"在127到215之间的每一行。一个也可以使用一些缩写,例如。或者分别为当前和最后一行。人们还可以使用相对前缀+,并分别在密度线或之前引用偏移。因此::。,$ j意思"从当前行到最后一行,将它们全部加入一行"。 :%是:1,$(所有行)的代名词。

:...... g和:...... v命令承担一些解释,因为它们非常强大。 :... G是&#34的前缀;全球"将后续命令应用于与模式(正则表达式)匹配的所有行:... v应用于与给定模式不匹配的所有行(" v"来自"匡威& #34;)。与其他EX命令一样,这些命令可以通过寻址/范围引用来预混。因此:。,+ 21g / foo / d方式和#34;删除包含字符串&#34的行; foo"从目前的一行到下一个21行和#34;虽然:。,$ v / bar / d方式"从这里到文件的末尾,删除任何Don' t包含字符串&#34的行;"

它'很有趣的是,普通的UNIX命令Grep实际上受到此EX命令的启发(并以记录方式的方式命名)。 EX命令:G / RE / P(GREP)是他们记录了如何&#34的方式;全球" "印刷品"包含A&#34的线;正则表达" (关于)。当使用ED和EX时,:P命令是首先,任何人学到和经常在编辑任何文件时使用的第一个。这是你打印当前内容的方式(通常一次只使用:。,+ 25p或一些页面)。

请注意:%g / d./ d或(它的反向/逆转对象::%v / v / d是最常见的使用模式。但是有几个其他EX命令值得记住:

我们可以使用m移动线条,j加入行。例如,如果您有列表,并且您希望将所有内容分离匹配(或相反地与某些模式不匹配)而不删除它们,那么您可以使用类似的内容::%g / foo / m $ ...和所有的& #34; foo"线条将被移动到文件的末尾。 (注意使用文件的末尾作为暂存空间的另一个提示)。这将保留所有" foo&#34的相对顺序;在从列表的其余部分提取它们时行。 (这相当于做出如下所示:1g!ggmap!ggrep foo<输入> 1g:1,' ag / foo' / d(将文件复制到自己的尾部,通过grep筛选尾部,并从头删除所有的东西)。

加入线条通常我可以找到需要加入他们的前任的所有行的模式(所有从&#34开始的行; ^"而不是" ^ *"在例如,一些子弹列表。对于那个案例,我' d使用:%g / ^ / -1j(对于每个匹配线,上线一行并加入)。 (BTW:用于搜索子弹线并加入下一个并入的子弹列表,并在接下来的作用的原因...它可以加入另一个子弹,它赢得了' t加入任何子弹所有持续的行;它' ll只在比赛上工作)。

几乎毋庸置疑,您可以使用我们的旧朋友s(替代)与g和v(global / converse-global)命令。通常你不需要这样做。但是,考虑某些情况,您只想在匹配其他模式的行上执行替换。通常,您可以使用复杂的模式与捕获并使用后面的引用来保留您不想更改的线的部分。但是,将匹配与替换中的匹配分离通常更容易:%g / foo / s / bar / zzz / g - 每个包含" foo"替换所有"酒吧和#34; " zzz。" (类似的东西:%s / c:s / m(.** foo。* \)bar \(。* \)/ \ 1zzz \ 2 / g只会在"酒吧和#34的情况下工作由" foo"在同一条线上;它已经达到了令人难以置信的,并且必须进一步抓住所有案件"酒吧" four" foo& #34;)

重点是EX命令集中的P,S和D线路不仅仅是p。

:地址也可以指标记。因此,您可以使用:' a,' bg / foo / j加入包含字符串foo到其后续行的任何行,如果它位于&#39之间的行之间; A'和#39; B'分数。 (是的,前面的EX命令示例中的所有都可以限于文件和#39; S行的子集,通过使用这些种类的寻址表达式进行前缀)。

那个'漂亮的模糊(我在过去的15年里只使用了几次这样的东西)。然而,我可以自由承认我经常在迭代和交互方式完成事物,如果我' d时间考虑正确的咒语,可能会更有效地完成。

另一个非常有用的vi或ex命令是:r要在另一个文件的内容中读取。因此::R Foo插入名为&#34的文件的内容; foo"在当前的线路。

更强大的是:r!命令。这读取了命令的结果。它与暂停VI会话的情况相同,运行命令,将其输出重定向到临时文件,恢复您的VI会话,并从TEMP中的内容读取。文件。

更强大的是! (爆炸)和:......! (前爆炸)命令。这些也执行外部命令并将结果读入当前文本。但是,他们还通过命令过滤我们的文本的选择!这我们可以使用1g的文件中的所有行。GSORT(G是VI" GOTO"命令;它默认进入文件的最后一行,但可以以行号为前缀,如1,第一行)。这相当于前variant:1,$!排序。作家经常使用!使用UNIX FMT或折叠公用设施,用于改革或" Word包装"文本的选择。一个非常常见的宏是{!} fmt(重新格式化当前段落)。程序员有时使用它来运行其代码,或通过缩进或其他代码重新格式化工具运行它的代码。

用:r!和 !命令意味着任何外部实用程序或过滤器都可以被视为我们编辑器的扩展名。我偶尔使用这些脚本从数据库中拔出数据,或者使用WGET或Lynx命令从网站上拔下数据,或从远程系统中拉动数据的SSH命令。

另一个有用的EX命令是:所以(短为:源)。这将文件的内容作为一系列命令读取。当您正常启动VI时,隐式地,执行〜/ .exinitrc文件(并且Vim通常在〜/ .vimrc,自然)上执行源。使用这就是您可以通过简单地利用在一组新的宏,缩写和编辑器设置中来激发您的编辑器配置文件。如果您'重新窃款,您甚至可以使用它作为存储EX编辑命令序列的技巧,以按需应用于文件。

例如,我有一个七个线文件(36个字符),它通过WC运行文件,并在包含该字数数据的文件的顶部插入C样式注释。我可以申请它和#34;宏"通过使用如下命令来文件:Vim +'所以mymacro.ex' ./mytarget.

(VI和VIM的+命令行选项通常用于在给定的行号上启动编辑会话。但是它' SA很熟知的事实是通过任何有效的EX命令/表达式遵循+,如a "来源"命令作为i'在这里完成的命令;对于一个简单的例子,我有脚本调用:vi +' / foo / d | wq!'〜/ .ssh /众所周知,在i' m重新映像一组服务器时,从我的SSH已知主机文件中删除来自我的SSH已知主机文件的条目)。

通常是'非常容易写这样的"宏和#34;使用Perl,awk,sed(实际上是grep一个由ED命令启发的实用程序)。

@命令可能是最晦涩的vi命令。偶尔教授先进的系统管理课程,接近十年的我遇到了很少有人遇到过的人。 @执行寄存器的内容,就像它是vi或ex命令一样。示例:我经常使用:: r!找到...找到我的系统上的一些文件并将其名称读入我的文档。从那里,我删除了任何无关的命中,只留下了文件I' m的完整路径。而不是愤怒地通过路径的每个组件(或者更糟糕的话,如果我碰巧在没有的机器上被困) Tab完成支持VI的副本)我只需使用:

那个'■只有10个击键(和表达" CDD @c为我有效地是一个手指宏,所以我几乎可以键入一个常见的六个字母单词)。

我' ve只划伤了Vi' s的力量,没有什么是我'这里描述的甚至是&#34的一部分;改进"为哪个vim命名!这里描述的所有' ve的所有旧副本都应该在20年或30年前的任何旧副本上工作。

有些人已经使用了比我愿意的更多的vi'

27个圣洁代码猴子,......' s一个深入的答案。什么'很棒的是,你可能在大约10个击键中在Vim中写道。 - 八个阳阻团结

@wahnfieden - grok正是我的意思:en.wikipedia.org/wiki/grok(它显然甚至在OED中,我们最接近的我们的Anglophers都有一个规范词典)。 " grok"编辑器是为了找到自己流利的命令......好像他们是你的自然语言。 - 吉姆丹尼斯

哇,书面答案很好!我不能同意更多,虽然我使用了很多@命令(与q:reck宏结合) - Knittl.

卓越的答案完全赎回了一个非常可怕的问题。我将升空这个问题,通常我会追逐,只是为了让这个答案变得更容易找到。 (和我' m一个emacs guy!但是这种方式我' ll在某个地方指出了想要一个良好解释的新人,他们对vi的乐趣有所了解vi。然后我' ll告诉他们关于emacs他们可以决定。) - Brandon Rhodes.

你可以制作一个网站并在那里把这个教程放在那里,所以它没有在stackoverflow上埋葬。我尚未阅读更好的vi介绍。 - 马尔戈

您正在谈论文本选择和复制,我认为您应该查看Vim视觉模式。

在VISUAL模式下,您可以使用VIM命令选择文本,然后您可以使用选择来执行任何您想要的内容。

Visual Block Selection是另一个非常有用的功能,它允许您选择一个矩形的文本区域,只需按Ctrl-v即可启动它,然后选择所需的文本块并执行任何类型的操作,如yank,删除,粘贴,编辑等。它很高兴编辑面向栏目的文本。

16是的,但这是海报的具体抱怨。视觉模式是Vim'最佳的直接文本选择和操作方法。由于Vim' S缓冲区遍历方法很棒,我在Vim中找到文本选择相当愉快。 - 枪支

我认为它也值得一提到Ctrl-V选择块 - 即文本的任意矩形。当你需要它时它'救生员。 - 哈米什唐纳尔

@viksit:i' m使用camtasia,但有很多替代方案:codinghorror.com/blog/2006/11/screencasting-for-windows.html - Christian C.Salvadó

此外,如果您' ve获得了视觉选择并希望调整它,o会跳到另一端。 因此,您可以将选择的开始和结尾移动为 ......