你最爱的一个 Vim 命令是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你最爱的一个 Vim 命令是啥?相关的知识,希望对你有一定的参考价值。

说不出最爱的,有几个比较常用的,也有的几个是不是很常用但是确实是十分强大的功能。

计算器

在插入模式中,使用Ctrl + r键,然后输入=,然后输入一个简单的公式。按下Enter键,结果将被插入到文件中。例如,试着输入:

寻找重复的连续单词。

当快速键入时,很可能会连续键入同一个单词两次,即使你自己再读一次可能也不会发现这种错误。幸运的是,有一个简单的表达式可以用来防止这个错误。使用search命令(默认/),将显示所有重复的单词。

自动完成单词

这是另一个让我感到羞愧的功能,但我发现身边的很多人都不知道。Vim默认为自动完成功能。这个功能是比较基本的,可以通过插件来增强,但他本身也很有帮助。该方法很简单。Vim试图通过已经输入的单词来预测单词。例如,在同一文件中第二次输入“编译器”时,只需键入“com”并将其保存在插入模式中。按Ctrl+n查看Vim来完成这个单词。简单,但很有用。

Vim命令有很多,根据个人的习惯和行业的要求不同可能有不同的喜好,对于大多数人来说,可能比较常用的就是ctrl+c或者ctrl+v这样的基本的复制粘贴的命令,这足以让我们感叹一下技术的进步可以为人类节省多少的时间和资源,用好Vim命令,会让生活更轻松一点。

参考技术A

第一个想到最最喜欢的就是xp,调换2个相邻字符的位置

下面是些常用的命令

:x 保存并退出,比:wq少敲一个键

:Sex (打开当前文件所在的目录)

:e 刷新文件内容,适用于实时变化的文

:e . (打开CWD目录)

:sp 分屏,也有水平分屏的:vsp,有时候只有一个屏幕的时候用来对照2个文件看

:bro ol (Browse old,浏览之前的打开过的文件目录)

:NERDTree(plugin)  目录插件

:ToggleTaglist(plugin)  taglist插件

: q[macro]  [num]@[marco]录制运行宏

:terminal可以直接从vim中打开terminal。不必先退出,也不必新开窗口。

m和' 书签的切换,适合编辑整屏放不下内容的文件

*和#,向下或向上搜索关键字

] 跳到匹配的括号,别的编辑器里没这么简单的命令

Ctrl+F,Ctrl+B 上一页和下一页

gg,G 文件首行和文件尾行

 di"删除引号之间的内容

 *  跳到下一个

ctrl+v  列选择

m[mark] '[mark]  标记书签

 /reg  查找

Ctrl-W t (把当前Window转为Tab)

使用 Vim 最高效的捷径是啥?

【中文标题】使用 Vim 最高效的捷径是啥?【英文标题】:What is your most productive shortcut with Vim?使用 Vim 最高效的捷径是什么? 【发布时间】:2010-11-16 03:29:57 【问题描述】:

我听说过很多关于Vim 的信息,既有优点也有缺点。 看起来你应该(作为开发人员)使用 Vim 比使用任何其他编辑器更快。 我正在使用 Vim 做一些基本的事情,而我在使用 Vim 时最多效率低 10 倍

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

    交替使用左右 双手是最快的使用方式 键盘。 永远不要触摸鼠标是 第二种方法尽可能快。 你需要很长时间才能移动你的手, 抓住鼠标,移动它,然后带上它 回到键盘(你经常有 看看键盘以确保你 把你的手正确地放回了正确的地方)

这里有两个例子说明了为什么我使用 Vim 的工作效率要低得多。

复制/剪切和粘贴。我一直这样做。对于所有当代编辑器,您可以用左手按 Shift,然后用右手移动光标来选择文本。然后 Ctrl+C 复制,移动光标并 Ctrl+V 粘贴。

Vim 太可怕了:

yy 复制一行(你几乎从不想要整行!) [number xx]yyxx 行复制到缓冲区中。但是你永远不知道你是否选择了你想要的东西。我经常需要执行 [number xx]dd 然后 u 来撤消!

另一个例子? 搜索和替换。

在PSPad:Ctrl+f 然后输入你想要搜索的内容,然后按Enter。 在 Vim 中:/,然后输入要搜索的内容,如果有特殊字符,请在 每个 特殊字符,然后按 Enter

Vim 的一切都是这样:看来我不知道如何正确处理它。

注意:我已经读过 Vim cheat sheet :)

我的问题是:

您使用 Vim 的哪种方式比使用现代编辑器更高效?

【问题讨论】:

"交替使用左右手是使用键盘的最快方式。"不适合我,奇怪。当我可以用一只手打字时,我发现我的速度要快得多。 【参考方案1】:

Vim 的问题在于你不了解 vi

您提到使用yy 进行剪切,并抱怨您几乎从不想剪切整行。事实上,编辑源代码的程序员经常希望在整行、行范围和代码块上工作。但是,yy 只是将文本拉入匿名复制缓冲区(或在 vi 中调用的“注册”)的众多方法之一。

vi 的“禅”是你在说一种语言。开头的y 是动词。声明yyy_ 的同义词。 y 被加倍以便于输入,因为它是一种常见的操作。

这也可以表示为ddP(删除当前行并将副本粘贴回原处;在匿名寄存器中留下副本作为副作用)。 yd“动词”将任何动作作为它们的“主语”。因此yW 是“从这里(光标)拉到当前/下一个(大)单词的末尾”,y'a 是“从这里拉到包含名为 'a的标记的行>'。”

如果您只了解基本的向上、向下、向左和向右光标移动,那么 vi 对您来说不会比“记事本”副本更有效率。 (好吧,您仍然可以使用语法高亮和处理大于约 45KB 左右的文件的能力;但请在此处与我合作)。

vi 有 26 个“标记”和 26 个“寄存器”。使用m 命令将标记设置到任何光标位置。每个标记由一个小写字母指定。因此ma 将'a' 标记设置为当前位置,mz 设置'z' 标记。您可以使用'(单引号)命令移动到包含标记的行。因此'a 移动到包含'a' 标记的行的开头。您可以使用`(反引号)命令移动到任何标记的精确位置。因此 `z 将直接移动到“z”标记的确切位置。

因为这些是“运动”,它们也可以用作其他“陈述”的主题。

因此,剪切任意文本选择的一种方法是删除一个标记(我通常使用 'a' 作为我的“第一个”标记,'z ' 作为我的下一个标记,'b' 作为另一个标记,以及 'e' 作为另一个标记(我不记得在 15 年中交互使用过超过四个标记使用 vi;一个人创建自己的约定,关于宏如何使用标记和寄存器,不会干扰一个人的交互式上下文)。然后我们转到所需文本的另一端;我们可以开始在任何一端都没有关系。然后我们可以简单地使用d`a 剪切或y`a 复制。因此整个过程有5 次击键开销(如果我们以“插入”模式开始并且需要Esc out 命令模式)。一旦我们已经剪切或复制,然后粘贴复制是一个单一的按键:p

我说这是剪切或复制文本的一种方法。然而,它只是众多之一。通常,我们可以更简洁地描述文本范围,而无需四处移动光标并放下标记。例如,如果我在一段文本中,我可以分别使用 移动到段落的开头或结尾。所以,为了移动一段文字,我使用d(3 次击键)剪切它。 (如果我碰巧已经在段落的第一行或最后一行,我可以分别使用dd

“段落”的概念默认为通常直观合理的东西。因此,它通常适用于代码和散文。

我们经常知道一些模式(正则表达式)来标记我们感兴趣的文本的一端或另一端。向前或向后搜索是 vi 中的动作。因此,它们也可以用作我们“陈述”中的“主题”。所以我可以使用d/foo 从当前行剪切到包含字符串“foo”的下一行,并使用y?bar 从当前行复制到包含“bar”的最近(上一个)行。如果我不想要整行,我仍然可以使用搜索动作(作为它们自己的语句),删除我的标记并使用前面描述的 `x 命令。

除了“动词”和“主语”之外,vi还有“宾语”(在语法意义上)。到目前为止,我只描述了匿名寄存器的使用。但是,我可以通过使用"(双引号修饰符)前缀“对象”引用来使用26 个“命名”寄存器中的任何一个。因此,如果我使用"add,我会将当前行剪切到“a”寄存器中,如果我使用"by/foo,那么我会将文本的副本从这里拉到下一行包含“foo”到 'b' 寄存器中。要从寄存器粘贴,我只需在粘贴前加上相同的修饰符序列:"ap 将 'a' 寄存器内容的副本粘贴到光标后的文本中,"bP 粘贴来自'b' 到当前行之前。

“前缀”这一概念还将语法“形容词”和“副词”的类似物添加到我们的文本操作“语言”中。大多数命令(动词)和动作(动词或对象,取决于上下文)也可以采用数字前缀。因此,3J 的意思是“加入接下来的三行”,d5 的意思是“从当前行删除到第五段的末尾。”

这都是中级vi。这些都不是 Vim 特有的,如果你准备好学习的话,vi 中还有更高级的技巧。如果您只掌握这些中间概念,那么您可能会发现您很少需要编写任何宏,因为文本操作语言足够简洁和富有表现力,可以使用编辑器的“原生”语言轻松完成大多数事情。


更高级技巧的示例:

有许多: 命令,最著名的是:% s/foo/bar/g 全局替换技术。 (这不是高级的,但其他: 命令可以)。整个: 命令集在历史上被vi 以前的化身继承为ed(行编辑器)和后来的ex(扩展行编辑器)实用程序。实际上 vi 之所以如此命名,是因为它是 ex 的可视界面。

: 命令通常在文本行上运行。 edex 是在终端屏幕不常见并且许多终端是“电传打字机”(TTY)设备的时代编写的。因此,从文本的打印副本开始工作是很常见的,通过极其简洁的界面使用命令(常见的连接速度为 110 波特,或者大约每秒 11 个字符 - 这比快速打字员慢;滞后在多用户互动会话;此外,通常还有一些节省纸张的动机)。

所以大多数: 命令的语法包括一个地址或地址范围(行号),后跟一个命令。自然可以使用文字行号::127,215 s/foo/bar 在 127 到 215 之间的每一行上将第一次出现的“foo”更改为“bar”。也可以使用一些缩写,例如 .$ 表示当前和最后一行分别。也可以使用相对前缀+- 分别表示当前行之后或之前的偏移量。因此::.,$j 意思是“从当前行到最后一行,将它们全部连接成一行”。 :%:1,$ 的同义词(所有行)。

:... g:... v 命令有一些解释,因为它们非常强大。 :... g 是“全局”的前缀,将后续命令应用于与模式(正则表达式)匹配的所有行,而 :... v 将此类命令应用于与给定模式不匹配的所有行(“conVerse”中的“v” ”)。与其他 ex 命令一样,这些命令可以以寻址/范围引用作为前缀。因此:.,+21g/foo/d 表示“从当前行到接下来的 21 行中删除包含字符串“foo”的任何行”,而:.,$v/bar/d 表示“从这里到文件末尾,删除任何不包含字符串的行“酒吧。”

有趣的是,常见的 Unix 命令 grep 实际上是受此 ex 命令的启发(并以其记录方式命名)。 ex 命令:g/re/p(grep)是他们记录如何“全局”“打印”包含“正则表达式”(re)的行的方式。当使用 edex 时,:p 命令是任何人最先学会的命令之一,并且通常是在编辑任何文件时使用的第一个命令。这是您打印当前内容的方式(通常使用:.,+25p 或类似的方式一次只打印一页)。

请注意,:% g/.../d 或(它的反向/conVerse 对应物::% v/.../d 是最常见的使用模式。但是还有一些其他的 ex 命令值得记住:

我们可以使用m 来移动线条,使用j 来连接线条。例如,如果您有一个列表,并且想要分隔所有匹配的内容(或者相反地不匹配某些模式)而不删除它们,那么您可以使用类似::% g/foo/m$ ... 并且所有“foo”行都将具有已移至文件末尾。 (注意关于使用文件末尾作为暂存空间的另一个提示)。这将保留所有“foo”行的相对顺序,同时从列表的其余部分中提取它们。 (这相当于执行以下操作:1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d(将文件复制到自己的尾部,通过 grep 过滤尾部,并从头部删除所有内容)。

要连接行,通常我可以为所有需要连接到其前身的行找到一个模式(例如,在某些项目符号列表中,所有以“^”而不是“^ *”开头的行)。对于这种情况,我会使用::% g/^ /-1j(对于每个匹配的行,向上一行并加入它们)。 (顺便说一句:对于试图搜索项目符号行并加入下一个项目符号列表的原因有几个原因......它可以将一个项目符号行连接到另一个项目符号行,并且它不会将任何项目符号行加入到 所有它的延续;它只会在匹配时成对工作)。

几乎不用说,您可以将我们的老朋友s(替代)与gv(全局/converse-global)命令一起使用。通常你不需要这样做。但是,考虑某些情况,您只想对匹配其他模式的行执行替换。通常,您可以使用带有捕获的复杂模式并使用反向引用来保留您不想更改的行部分。但是,将匹配项与替换项分开通常会更容易::% g/foo/s/bar/zzz/g——对于包含“foo”的每一行,将所有“bar”替换为“zzz”。 (像:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g 之类的东西只适用于那些在同一行上由“foo”之前的“bar”实例的情况;它已经够难看的了,必须进一步处理以捕捉所有“bar”的情况" 在 "foo" 之前)

关键在于ex 命令集中的行不只是psd

: 地址也可以引用标记。因此,您可以使用::'a,'bg/foo/j 将包含字符串 foo 的任何行连接到其后续行,如果它位于 'a' 和 'b' 之间的行之间分数。 (是的,前面的所有ex 命令示例都可以通过使用这些寻址表达式作为前缀来限制为文件行的子集)。

这很模糊(在过去的 15 年中,我只使用过几次类似的东西)。但是,我坦率地承认,我经常以迭代和交互方式完成一些事情,如果我花时间思考正确的咒语,这些事情可能会更有效地完成。

另一个非常有用的 viex 命令是:r,用于读取另一个文件的内容。因此::r foo 在当前行插入名为“foo”的文件的内容。

更强大的是:r! 命令。这将读取命令的结果。这与暂停 vi 会话、运行命令、将其输出重定向到临时文件、恢复您的 vi 会话以及从临时文件中读取内容相同。文件。

更强大的是! (bang) 和:... ! (ex bang) 命令。它们还执行外部命令并将结果读入当前文本。但是,它们还通过命令过滤我们的文本选择!我们可以使用1G!Gsort 对文件中的所有行进行排序(Gvi "goto" 命令;它默认转到文件的最后一行,但可以添加前缀行号,例如 1,第一行)。这相当于 ex 变体 :1,$!sort。作者经常将! 与Unix fmtfold 实用程序一起使用,以重新格式化或“自动换行”文本选择。一个非常常见的宏是!fmt(重新格式化当前段落)。程序员有时通过 indent 或其他代码重新格式化工具使用它来运行他们的代码,或者只是其中的一部分。

使用:r!! 命令意味着任何外部实用程序或过滤器都可以被视为我们编辑器的扩展。我偶尔会将这些与从数据库中提取数据的脚本一起使用,或者与从网站中提取数据的 wgetlynx 命令或 ssh 一起使用从远程系统中提取数据的命令。

另一个有用的ex 命令是:so:source 的缩写)。这会将文件的内容作为一系列命令读取。当您启动 vi 时,它通常会隐式地在 ~/.exinitrc 文件上执行 :source(而 Vim 通常会在 ~/.vimrc 上执行此操作,这很自然)。这样做的用途是,您可以通过简单地获取一组新的宏、缩写和编辑器设置来即时更改您的编辑器配置文件。如果您很狡猾,您甚至可以将其用作存储 ex 编辑命令序列以按需应用于文件的技巧。

例如,我有一个七行文件(36 个字符),它通过 wc 运行一个文件,并在包含该字数数据的文件顶部插入一个 C 样式的注释。我可以使用如下命令将该“宏”应用于文件:vim +'so mymacro.ex' ./mytarget

(viVim+ 命令行选项通常用于在给定的行号处启动编辑会话。然而,鲜为人知的事实是可以通过任何有效的 ex 命令/表达式跟随+,例如我在这里所做的“源”命令;举个简单的例子,我有脚本可以调用:vi +'/foo/d|wq!' ~/.ssh/known_hosts在我重新映像一组服务器时,以非交互方式从我的 SSH 已知主机文件中删除一个条目)。

通常使用 Perl、AWK、sed 编写这样的“宏”要容易得多(实际上,就像 grep 一个受 启发的实用程序ed 命令)。

@ 命令可能是最不起眼的 vi 命令。在近十年间偶尔教授高级系统管理课程的过程中,我遇到的人很少使用它。 @ 执行寄存器的内容,就好像它是 viex 命令。 示例:我经常使用::r!locate ... 在我的系统上查找某个文件并将其名称读入我的文档中。从那里我删除任何无关的点击,只留下我感兴趣的文件的完整路径。而不是费力地 Tab 遍历路径的每个组件(或者更糟,如果我碰巧vi 的副本中卡在没有 Tab 补全支持的机器上)我只是使用:

    0i:r(将当前行变成有效的:r命令), "cdd(将行删除到“c”寄存器中)和 @c 执行该命令。

这只是 10 次击键(而表达式 "cdd @c 对我来说实际上是一个手指宏,所以我几乎可以像输入任何常见的六个字母单词一样快速地输入它)。


发人深省的想法

我只是触及到了 vi 强大功能的表面,我在这里所描述的甚至都不是 vim 的“改进”的一部分命名!我在这里描述的所有内容都应该适用于 20 或 30 年前的任何旧版 vi

有些人使用 vi 的力量比我以往任何时候都多。

【讨论】:

圣典猴子,..这是一个深入的答案。很棒的是,您可能会在大约 10 次击键后用 vim 编写代码。 @Wahnfieden -- grok 正是我的意思:en.wikipedia.org/wiki/Grok (这显然甚至在 OED 中——我们英语使用者最接近规范的词典)。 “理解”编辑器就是发现自己流利地使用它的命令……就好像它们是你的自然语言一样。 哇,答案写得非常好!我完全同意,虽然我经常使用@ 命令(结合q:记录宏) 绝妙的答案彻底解决了一个非常可怕的问题。我将赞成这个问题,通常我会反对,只是为了让这个答案变得更容易找到。 (而且我是一个 Emacs 人!但这样我就可以找到一些新人,他们想要很好地解释 vi 高级用户对 vi 的乐趣。然后我会告诉他们有关 Emacs 的信息,他们可以决定。) 你能不能做一个网站把这个教程放在那里,这样就不会在***上被埋没了。我还没有读到比这个更好的 vi 介绍。【参考方案2】:

你说的是文本选择和复制,我认为你应该看看Vim Visual Mode。

在可视模式下,您可以使用 Vim 命令选择文本,然后您可以对选择进行任何操作。

考虑以下常见场景:

您需要选择下一个匹配的括号。

你可以这样做:

v% 如果光标在开始/结束括号上 vib 如果光标在括号内

您想在引号之间选择文本:

vi" 表示双引号 vi' 用于单引号

你想选择一个花括号块(在 C 风格的语言中很常见):

viB vi

您要选择整个文件:

ggVG

Visual block selection 是另一个非常有用的功能,它允许你选择一个矩形的文本区域,你只需要按 Ctrl-V 来启动它,然后然后选择您想要的文本块并执行任何类型的操作,例如 yank、删除、粘贴、编辑等。编辑 面向列的文本非常棒

【讨论】:

每个编辑器都有这样的东西,不是vim特有的。 是的,但这是发帖人的具体投诉。可视模式是 Vim 直接选择和操作文本的最佳方法。而且由于 vim 的缓冲区遍历方法非常棒,我发现 vim 中的文本选择相当令人愉快。 我认为还值得一提的是 Ctrl-V 来选择一个块 - 即一个任意的文本矩形。当您需要它时,它就是救命稻草。 @viksit:我正在使用 Camtasia,但有很多选择:codinghorror.com/blog/2006/11/screencasting-for-windows.html 另外,如果你有一个视觉选择并想要调整它,o 会跳到另一端。因此,您可以随意移动所选内容的开头和结尾。【参考方案3】:

一些生产力提示:

智能动作

*# 向前/向后搜索光标下的单词。 w 下一个单词 W 到下一个以空格分隔的单词 b / e 到当前单词的开头/结尾。 (B / E 仅用于空格分隔) gg / G 跳转到文件的开头/结尾。 % 跳转到匹配的 .. 或 ( .. ) 等。 / 跳转到下一段。 '. 跳回最后编辑的行。 g; 跳回到上次编辑的位置。

快速编辑命令

I 在开头插入。 A 追加到末尾。 o / O 在当前行之后/之前打开一个新行。 v / V / Ctrl+V 视觉模式(选择文本!) Shift+R替换文字 C 更改行的剩余部分。

组合命令

大多数命令都接受数量和方向,例如:

cW = 更改到词尾 3cW = 更改 3 个字 BcW = 以全字开头,更改全字 ciW = 更改内词。 ci" = 在“..”之间更改内部 ci( = 在 (..) 之间更改文本 ci< = 在 之间更改文本(在 vimrc 中需要 set matchpairs+=<:>4dd = 删除 4 行 3x = 删除 3 个字符。 3s = 替换 3 个字符。

有用的程序员命令

r 替换一个字符(例如rd 将当前字符替换为d)。 ~ 更改大小写。 J 加入两行 Ctrl+A / Ctrl+X 增加/减少一个数字。 . 重复上一条命令(一个简单的宏) ==修复行缩进 > indent 块(在可视模式下) < unindent 块(在可视模式下)

宏录制

q[ key ] 开始录制。 然后点击q 停止录制。 可以用@[ key ]播放宏。

通过使用非常具体的命令和动作,VIM 可以为下一行重播这些确切的动作。 (例如 A 表示追加到结尾,b / e 分别将光标移动到单词的开头或结尾)

完善的设置示例

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0,0,!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

可以将设置存储在~/.vimrc 中,或在系统范围内存储在/etc/vimrc.local 中,然后使用以下命令从/etc/vimrc 文件中读取:

source /etc/vimrc.local

(您必须将 # 注释字符替换为 " 以使其在 VIM 中工作,我想在此处给出正确的语法突出显示)。

我在这里列出的命令非常基本,也是我目前使用的主要命令。它们已经让我变得更有效率,而无需了解所有花哨的东西。

【讨论】:

'.更好的是g;,它通过changelist跳转回来。转到最后编辑的位置,而不是最后编辑的行【参考方案4】:

Control+R 机制非常有用:-) 在插入模式命令模式(即在输入命令时在: 行上),继续使用编号或命名的寄存器:

a - z 命名寄存器 " 未命名寄存器,包含上次删除或抽出的文本 % 当前文件名 # 备用文件名 * 剪贴板内容(X11:主要选择) + 剪贴板内容 / 最后的搜索模式 : 最后一个命令行 . 最后插入的文本 -最后一个小(不到一行)删除 =5*5 将 25 插入文本(迷你计算器)

请参阅 :help i_CTRL-R:help c_CTRL-R 了解更多详情,并在附近探听更多 CTRL-R 优点。

【讨论】:

仅供参考,这是指 插入模式中的 Ctrl+R。普通模式下,Ctrl+R是redo。 +1 表示当前/备用文件名。 Control-A 也可以在插入模式下插入最后插入的文本,Control-@ 可以插入最后插入的文本并立即切换到正常模式。【参考方案5】:

Vim 插件

这里有很多很好的答案,其中一个关于 vi 之禅的令人惊叹的答案。我没有看到提到的一件事是 vim 通过插件非常可扩展。有一些脚本和插件可以让它做原作者从未考虑过的各种疯狂的事情。以下是一些非常方便的 vim 插件示例:

rails.vim

Rails.vim 是 tpope 编写的插件。对于从事 Rails 开发的人来说,这是一个令人难以置信的工具。它做了神奇的上下文相关的事情,使您可以轻松地从控制器中的方法跳转到关联的视图,跳转到模型,并下到该模型的单元测试。作为 Rails 开发人员,它已经节省了数十甚至数百小时。

gist.vim

此插件允许您在可视模式下选择文本区域并键入快速命令将其发布到gist.github.com。这允许轻松访问 pastebin,如果您通过 IRC 或 IM 与某人协作,这将非常方便。

space.vim

这个插件为空格键提供了特殊的功能。它将空格键变成类似于句号的东西,但不是重复动作,而是重复动作。这对于以您动态定义的方式快速浏览文件非常方便。

surround.vim

此插件使您能够处理以某种方式分隔的文本。它为您提供了表示括号内的事物、引号内的事物等的对象。它可以方便地处理分隔文本。

supertab.vim

此脚本为 vim 带来了精美的制表符补全功能。自动完成功能已经存在于 vim 的核心中,但这会将它带到一个快速选项卡上,而不是多个不同的多键快捷键。非常方便,使用起来非常有趣。虽然它不是 VS 的智能感知,但它是一个伟大的步骤,并带来了您希望从选项卡完成工具中获得的大量功能。

syntastic.vim

此工具将外部语法检查命令带入 vim。我没有亲自使用过它,但我听说过关于它的好消息,而且这个概念很难被击败。无需手动检查语法可以节省大量时间,并且可以帮助您在引入语法错误时而不是在最终停止测试时发现它们。

fugitive.vim

从 vim 内部直接访问 git。同样,我没有使用过这个插件,但我可以看到该实用程序。不幸的是,我所处的文化中 svn 被认为是“新的”,所以在相当长的一段时间内我不太可能看到 git 在工作。

nerdtree.vim

vim 的树形浏览器。我最近开始使用它,它真的很方便。它使您可以将树视图垂直拆分并轻松打开文件。这对于一个有很多源文件的项目来说非常棒,你经常在它们之间跳转。

FuzzyFinderTextmate.vim

这是一个无人维护的插件,但仍然非常有用。它提供了使用“模糊”描述性语法打开文件的能力。这意味着在稀疏的文件树中,您只需键入足够的字符即可将您感兴趣的文件与其他文件区分开来。

结论

有很多令人难以置信的工具可用于 vim。我敢肯定我在这里只触及了表面,值得搜索适用于您的域的工具。结合了传统 vi 的强大工具集、vim 对其的改进以及进一步扩展 vim 的插件,它是有史以来最强大的文本编辑方式之一。 Vim 很容易与 emacs、eclipse、visual studio 和 textmate 一样强大。

谢谢

感谢duwanis 他的vim configs,我从中学到了很多,并借用了这里列出的大部分插件。

【讨论】:

rails.vim 中神奇的测试类导航是我希望 Vim 拥有 TextMate 绝对适用于所有语言的更通用的事情之一:如果我正在研究 Person.scala 并且我这样做了Cmd+T,通常列表中的第一个是PersonTest.scala。 我认为是时候将 FuzzyFinderTextmate 替换为 github.com/wincent/Command-T +1 表示 Syntastic。这与 JSLint 相结合,使我的 Javascript 更不容易出错。请参阅superuser.com/questions/247012/…,了解如何设置 JSLint 以使用 Syntastic。 @Benson 很棒的名单!我也会加入snipMate。非常有用的常见编码自动化。 if 即时 if 块等 我认为 nerdcommenter 也是一个不错的插件:here。就像它的名字一样,它是用来注释你的代码的。【参考方案6】:

.重复上一个文本更改命令

我用这个节省了很多时间。

之前提到了可视模式,但是块可视模式在编辑文本文件中的固定大小列时为我节省了很多时间。 (使用 Ctrl-V 访问)。

【讨论】:

另外,如果你使用简洁的命令(例如 A 表示 append-at-end)来编辑文本,vim 可以在你按下 . 键的下一行重复同样的动作.【参考方案7】:

gi

转到最后编辑的位置(如果您执行了一些搜索并且不想返回编辑,这非常有用)

^P 和 ^N

完成上一个 (^P) 或下一个 (^N) 文本。

^O 和 ^I

转到上一个(^O - "O" for old)位置或下一个(^I - "I" 就在"O"附近)。 当您执行搜索、编辑文件等操作时,您可以在这些“跳转”中前后导航。

【讨论】:

@Kungi `。将带你到最后一次编辑 `` 将带你回到你在最后一次“跳跃”之前的位置 - 这 / 可能 / 也是最后一次编辑的位置。【参考方案8】:

我最近(得到)发现了这个网站:http://vimcasts.org/

它很新,而且非常好。运行该站点的人从 textmate 切换到 vim,并就特定的 vim 主题主持了非常出色和简洁的演员表。看看吧!

【讨论】:

如果你喜欢 vim 教程,也可以查看Derek Wyatt's vim videos。他们很棒。【参考方案9】:

CTRL + A 增加你站立的数字。

【讨论】:

... 和 CTRL-X 递减。 这是一个简洁的捷径,但到目前为止我还没有找到任何用处。 如果你在屏幕上运行 vim 并想知道为什么这不起作用 - ctrl+A, A @SolutionYogi:假设您想在每行的开头添加行号。解法:ggI10qqyawjP00q9999@q 对 Vimperator 非常有用,它增加(或减少,Ctrl-X)URL 中的最后一个数字。用于快速浏览图片库等。【参考方案10】:

全部处于正常模式:

f 移动到当前行上特定字符的下一个实例,; 重复。

F 移动到当前行上特定字符的上一个实例,; 重复。

如果巧妙地使用,以上两个可以让你在一条线上快速移动。

* 在单词上搜索下一个实例。

# 在单词上搜索前一个实例。

【讨论】:

哇,我不知道 * 和 # (向前/向后搜索光标下的单词)绑定。这有点酷。 f/F 和 t/T 和 ;命令是快速跳转到当前行的字符。 f/F 将光标放在指定的字符上,而 t/T 将光标放在“到”字符(根据选择的方向在它之前或之后的字符。;简单地重复最近的 f/F/t/T跳跃(朝同一方向)。 :) vim.org 提示页面顶部的标语:“如果我及时知道“*”命令,你能想象可以节省多少击键吗?” - 于尔根·索尔克,2001 年 1 月 19 日" 正如 Jim 所提到的,“t/T”组合通常同样好,如果不是更好的话,例如,ct( 将删除单词并将您置于插入模式,但保留括号!【参考方案11】:

会话

一个。保存会话

:mks 会话名称

b.强制保存会话

:mks! 会话名称

c。加载会话

gvim 或 vim -S 会话名称


加减法

一个。加减法

CTRL-A ;将 [count] 添加到数字或字母字符 或光标后。 Vi 无此功能

CTRL-X ;从数字或字母中减去 [count] 光标处或之后的字符。 Vi 无此功能

b.窗口键解映射

在窗口中, Ctrl-A 已经映射为您需要在 rc 文件中取消映射的整个文件选择。 将 mswin.vim CTRL-A 映射部分标记为注释 要么 用 unmap 添加你的 rc 文件

c。用宏

CTRL-A 命令在宏中非常有用。例子: 使用以下步骤制作编号列表。

    创建第一个列表条目,确保它以数字开头。 qa - 开始记录到缓冲区“a”中 Y - 抽出条目 p - 将条目的副本放在第一个条目的下方 CTRL-A - 增加数字 q - 停止录制 @a - 重复 yank、put 和 increment 次

【讨论】:

知道 Windows 中的快捷方式是什么吗?【参考方案12】:

上周在工作中,我们的项目从另一个项目中继承了很多 Python 代码。不幸的是,代码不适合我们现有的架构——它都是用全局变量和函数完成的,这在多线程环境中是行不通的。

我们有大约 80 个文件需要重新设计为面向对象 - 所有的函数都移到类中、更改了参数、添加了导入语句等。我们有一个大约 20 种类型的修复列表需要完成每个文件。我估计一个人每天可以做 2-4 次。

所以我手工完成了第一个,然后编写了一个 vim 脚本来自动进行更改。其中大部分是 vim 命令的列表,例如

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

最后一个值得解释一下:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

对于一些更复杂的转换,例如生成所有导入语句,我将一些 python 嵌入到 vim 脚本中。

经过几个小时的工作,我有一个脚本可以完成至少 95% 的转换。我只是在 vim 中打开一个文件,然后运行:source fixit.vim,文件在眨眼之间就被转换了。

我们仍然需要更改剩余 5% 的不值得自动化的部分并测试结果,但是通过花费一天时间编写此脚本,我估计我们节省了数周的工作量。

当然,使用 Python 或 Ruby 之类的脚本语言可以自动执行此操作,但编写时间会长得多,而且灵活性会降低 - 最后一个示例会很困难,因为单独的正则表达式不会能够处理嵌套的括号,例如将bar(foo(xxx)) 转换为foo(xxx).bar()。 Vim 非常适合这项任务。

【讨论】:

非常感谢分享,从“有用而不是经典”的宏中学习真的很棒。 %s/\(bar\)(\(.\+\))/\2.\1()/ 也会这样做。 (转义符与:set magic 兼容。)仅作记录。 :) 如果你不喜欢 vim 风格的转义,请使用 \v 打开 Very Magic:%s/\v(bar)\((.+)\)/\2.\1()/ @lpsquiggle:您的建议不会处理带有一组以上括号的复杂表达式。例如if bar(foo(xxx)) or wibble(xxx): 变成 if foo(xxx)) or wibble(xxx.bar(): 这是完全错误的。【参考方案13】:

使用内置文件浏览器!该命令是:Explore,它允许您非常快速地浏览您的源代码。我的.vimrc 中有这些映射:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

资源管理器也允许您进行文件修改。我会发布一些我最喜欢的键,按&lt;F1&gt; 会给你完整的列表:

-:最有用的:切换到上层目录(cd ..mf:标记文件 D:删除标记的文件或光标所在的文件,如果没有标记。 R:重命名光标所在的文件。 d:在当前目录下新建目录 %:在当前目录新建文件

【讨论】:

我一直认为默认的浏览方法对于大多数东西来说有点糟糕。如果你知道你想去哪里,它只是浏览速度很慢。 vim.org 脚本部分的 LustyExplorer 是一项非常需要的改进。 你的第二个映射可能更简单:map :Sexplore 我推荐 NERDtree 而不是内置的资源管理器。它改变了我在项目中使用 vim 的方式,让我更有效率。只需谷歌即可。 我从不觉得有必要探索源码树,我只是使用:find:tag 和各种相关的按键来跳转。 (也许这是因为我处理的源代码树很大并且组织方式与我所做的不同?:))【参考方案14】:

我是美国密码协会的成员。双月刊杂志包括 100 多种不同类型的密码。其中大约有 15 个是“密码”——各种类型的算术问题,用字母代替数字。其中两个或三个是数独,除了用字母而不是数字。当网格完成后,九个不同的字母会在网格某处的某条线上、对角线、螺旋线等处拼出一个或多个单词。

我没有使用铅笔或手写输入问题,而是从他们网站的会员区下载问题。

在处理这些数独游戏时,我使用 vi,只是因为我使用了 vi 所具备的其他编辑器很少具备的功能。主要是把字母格转换成编号格,因为我觉得更容易解决,然后把完成的编号格重新转换成字母格来寻找解题词。

问题被格式化为九组,每组九个字母,-s 代表空白,写成两行。第一步是将它们格式化为九行,每行九个字符。这没什么特别的,只是在适当的地方插入了八个换行符。

结果将如下所示:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

因此,将其转换为数字的第一步是列出不同字母的列表。首先,我制作了块的副本。我将光标放在块的顶部,然后输入:yp: 让我进入命令模式,y 猛拉下一个移动命令。由于 是移动到下一段的末尾,所以y 将段落拉出。 然后将光标移动到段落的末尾,p 将我们在光标后面拉出的内容粘贴。所以yp 创建了下一段的副本,并以光标在两个副本之间结束。

接下来,我将其中一个副本变成不同字母的列表。该命令有点复杂:

:!tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

: 再次让我进入命令模式。 ! 表示下一个 yank 的内容应该通过命令行传递。 抽出下一段,然后命令行使用tr 命令删除除大写字母之外的所有内容,sed 命令将每个字母打印在一行上,sort 命令对这些行进行排序,删除重复项,然后tr 删除换行符,将九个不同的字母留在一行中,替换最初组成段落的九行。在这种情况下,字母是:ACELNOPST

下一步是制作另一个网格副本。然后使用我刚刚确定的字母将每个字母替换为从 1 到 9 的数字。这很简单::!tr ACELNOPST 0-9。结果是:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

这可以用通常的方式解决,或者输入您可能喜欢的任何数独求解器。然后可以使用:!tr 1-9 ACELNOPST 将完成的解决方案转换回字母。

vi 的强大功能是很少有人能比得上的。最大的问题是,只有极少数的 vi 教程书籍、网站、帮助文件等,几乎没有触及可能的表面。

【讨论】:

令人恼火的是,一些发行版(例如 ubuntu)具有从单词“vi”到“vim”的别名,因此人们不会真正看到 vi。很好的例子,必须尝试... +1 vim 不检查它开始时的名称以便它可以出现在正确的“模式”中吗? 我对这个重复的错误感到困惑:你说你需要: 进入命令模式,但你总是指定正常模式命令(如yp ) 这不可能在命令模式下工作?! 我对独特字符挑战的看法::se tw=1 fo=(准备)VG:s/./&amp; /g(插入空格),gvgq(分成单独的行),V:sort u(排序和删除重复项) 【参考方案15】:

批量文本操作!

通过宏:

开始录制:qq 做事 停止录制:q 重复:@q(第一次),之后@@。 重复20次:20@@

或者通过正则表达式:

替换东西::%s/[fo]+/bar/g

(但请注意:如果您使用后者,您将遇到 2 个问题 :)。)

【讨论】:

+1 表示Jamie Zawinski 参考。 (甚至没有因为未能链接到它而被扣分)。 :) @Jim 我什至不知道这是 Jamie Zawinski 的名言 :)。从现在开始,我会努力记住它。 我发现以下技巧越来越有用......对于您想要将匹配(或不匹配)某些模式的行连接到前一行的情况::% g/foo/-1j:'a,'z v/bar/-1j示例(其中前者是“所有行并匹配模式”,而后者是“标记 a 和标记 z 之间的行与模式不匹配”​​)。 gv ex命令中pattern后面的部分可以是任何其他ex命令,-1j只是相对的线移动和连接命令。 当然,如果您将宏命名为“2”,那么在使用它时,您甚至不必将手指从“@”键移至“q”钥匙。每次在那里可能节省 50 到 100 毫秒。 =P @JustJeff 完全取决于您的键盘布局,我的 @ 键位于我的 2 键的另一侧。【参考方案16】:

我最近发现了q:。它打开“命令窗口”并显示您最近的前模式(命令模式)命令。您可以像往常一样在窗口内移动,然后按&lt;CR&gt; 执行命令。您也可以编辑等。当您在处理一些复杂的命令或正则表达式并且您不想重新输入整个内容时,或者您想要做的复杂事情是 3 个命令返回时,这是无价的。这几乎就像 bash 的 set -o vi,但对于 vim 本身(呵呵!)。

请参阅:help q: 了解更多有趣的来回信息。

【讨论】:

【参考方案17】:

前几天我刚刚发现了 Vim 的全补全功能,虽然我承认我对具体做什么有点模糊,但我已经获得了令人惊讶的好结果,只是将 Ctrl + x Ctrl + uCtrl + n/Ctrl +p 插入模式。不完全是IntelliSense,但我还在学习。

试试吧! :help ins-completion

【讨论】:

【参考方案18】:

这些不是捷径,但它们是相关的:

    将大写锁定设置为额外的 ESC(或 Ctrl) 将领导者映射到“,”(逗号),使用以下命令:let mapleader=","

它们提高了我的工作效率。

【讨论】:

嘿,关于“\”的好提示!输入“,”比输入“\”要好得多。 要在 Windows 中使 Caps Lock 成为一个额外的 Esc(大写锁定键有什么用?“任意键”?),试试这个:web.archive.org/web/20100418005858/http://webpages.charter.net/… 在 Mac 上,您需要 PCKeyboardHack - 详情请参阅superuser.com/questions/34223/… 在 Windows 上我使用 AutoHotKey 和 Capslock::Escape【参考方案19】:

我经常使用的另一个有用的vi“快捷方式”是'xp'。这会将光标下的字符与下一个字符交换。

【讨论】:

在Windows xp出来的时候,我曾经开玩笑说这是它唯一的好用处。【参考方案20】:

+ W, V 垂直分割屏幕 + W, W 在窗口之间切换

!python % [args] 在这个窗口中运行我正在编辑的脚本

ZF 在可视模式下折叠任意线

【讨论】:

+ W 和 j/k 将让您绝对导航(j 向上,k 向下,与普通 vim 一样)。当你有 3 次以上的分裂时,这很棒。 +1 for zf in visual mode,我喜欢代码折叠,但不知道。 在敲击我的键盘后我推断&lt;C-w&gt;n&lt;C-w&gt;s是新的水平窗口,&lt;C-w&gt;b是右下窗口,&lt;C-w&gt;c&lt;C-w&gt;q是关闭窗口,&lt;C-w&gt;x是增加然后减少窗口宽度(??),&lt;C-w&gt;p 是最后一个窗口,&lt;C-w&gt;backspace 是向左移动(ish)窗口 :help ctrl-w FTW...帮自己一个忙,强迫自己尝试这些东西至少 15 分钟!【参考方案21】:

视觉模式

正如其他几个人所说,视觉模式是您的复制/剪切和粘贴问题的答案。 Vim 为您提供 'v'、'V' 和 C-v。 vim 中的小写 'v' 与记事本中的 shift 键基本相同。好处是你不必按住它。您可以使用任何移动技术有效地导航到您选择的起点(或终点)。然后点击“v”,再次使用有效的移动技术导航到选择的另一端。然后“d”或“y”允许您剪切或复制该选择。

与 Jim Dennis 对 vi 中剪切/复制/粘贴的描述相比,vim 的可视化模式的优势在于您不必完全正确地获取位置。有时,使用快速移动到达您想去的地方的大致附近,然后用其他移动对其进行改进,而不是想出一个更复杂的单一移动命令来准确地到达您想去的地方,这样会更有效。

以这种方式广泛使用可视化模式的不利之处在于,它可能会成为您一直使用的拐杖,这会阻止您学习可能使您更有效地做事的新 vi(m) 命令。但是,如果您非常积极主动地学习 vi(m) 的新方面,那么这可能不会对您产生太大影响。

我还要再次强调,视觉线和视觉块模式为您提供了同一主题的变体,它们可能非常强大……尤其是视觉块模式。

关于有效使用键盘

我也不同意您关于交替双手是使用键盘的最快方式的说法。它里面有真理的成分。很笼统地说,重复使用同一个东西是很慢的。这个原理最重要的例子是用同一根手指连续击键非常慢。您的断言可能源于在此模式上使用 s/finger/hand/ 转换的自然趋势。在某种程度上它是正确的,但在效率谱的极高端它是不正确的。

只要问任何钢琴家。询问他们是交替演奏连续几个音符还是按顺序使用单手的连续手指是否更快。键入 4 次击键的最快方法不是交替双手,而是用同一只手的 4 个手指按升序或降序键入(称之为“运行”)。一旦你考虑了这种可能性,这应该是不言而喻的。

更困难的问题是为此进行优化。优化键盘上的绝对距离非常容易。 Vim 就是这样做的。在“运行”级别进行优化要困难得多,但是 vi(m) 与它的模态编辑相比,任何非模态方法(ahem、emacs)都比任何非模态方法(ahem、emacs)都更有可能做到这一点。

在 Emacs 上

为了避免 emacs ***者因为最后的括号评论而完全无视我的整个帖子,我觉得我必须描述 emacs 和 vim 宗教之间差异的根源。我从来没有在编辑大战中说过话,我可能不会再这样做了,但我从来没有听过有人这样描述这些差异,所以就这样吧。不同之处在于以下权衡:

Vim 为您提供无与伦比的原始文本编辑效率 Emacs 为您提供了无与伦比的编辑器自定义和编程能力

盲目的 vim ***者会声称 vim 具有脚本语言。但它是一种晦涩难懂的临时语言,旨在为编辑服务。 Emacs 有 Lisp!说够了。如果您不理解最后两句话的重要性,或者希望充分了解函数式编程和 Lisp 以培养这种理解,那么您应该使用 vim。

emacs ***者会声称 emacs 具有 viper 模式,因此它是 vim 的超集。但毒蛇模式不是标准的。我的理解是大多数emacs用户不使用viper模式。由于它不是默认设置,因此大多数 emacs 用户可能不会真正体会到模态范式的好处。

在我看来,这些差异是正交的。我相信 vim 和 emacs 的好处,正如我所说的那样,它们都是有效的。这意味着终极编辑器还不存在。 emacs 可能是作为终极编辑器基础的最简单的平台,这可能是真的。但是模态编辑并没有根深蒂固于 emacs 的思维模式。未来 emacs 社区可能会朝着这个方向发展,但这似乎不太可能。

因此,如果您想要原始编辑效率,请使用 vim。如果您想要为您的编辑器编写脚本和编程的终极环境,请使用 emacs。如果您希望两者都强调可编程性,请使用带有 viper 模式的 emacs(或编写您自己的模式)。如果您想要两全其美,那么您现在就不走运了。

【讨论】:

【参考方案22】:

花 30 分钟学习 vim 教程(在终端中运行 vimtutor 而不是 vim)。您将学习基本动作和一些击键,这将使您使用 vim 至少与使用之前使用的文本编辑器一样高效。在那之后,好吧,再读一次吉姆丹尼斯的回答:)

【讨论】:

这是我在阅读OP时首先想到的。很明显,海报从来没有运行过这个;两年前第一次学习 vim 时,我经历了它,它在我心中巩固了 Vim 优于我使用过的任何其他编辑器(包括,对我来说,Emacs,因为在 Mac 上使用键组合很烦人) .【参考方案23】:

你使用 Vim 的方式是什么? 你比 当代编辑?

能够用很少的按键执行复杂、重复的编辑(通常使用macros)。看看VimGolf,见证 Vim 的强大!

经过十多年几乎每天的使用,很难想象使用任何其他编辑器。

【讨论】:

【参考方案24】:

在搜索中的任意位置使用\c 以忽略大小写(覆盖您的忽略大小写或智能大小写设置)。 例如。 /\cfoo/foo\c 将匹配 fooFoofOOFOO 等。

在搜索中的任何位置使用\C 来强制进行大小写匹配。 例如。 /\Cfoo/foo\C 只会匹配 foo。

【讨论】:

【参考方案25】:

我惊讶地发现没有人提及t 运动。我经常将它与dt,yt, 形式的参数列表一起使用

【讨论】:

或 dfx、dFx、dtx、ytx 等,其中 x 是字符,+1 是的!并且不要忘记 ct(更改为)。【参考方案26】:

奇怪的是没有人提到 ctags。下载“exuberant ctags”并将其放在搜索路径中已有的糟糕预装版本之前。 cd 到您正在处理的任何内容的根目录;例如 Android 内核分发。键入“ctags -R”。在名为“tags”的文件中,在该目录下的任何位置构建源文件索引。这包含所有标签,无论语言或目录中的位置,在一个文件中,因此跨语言工作很容易。

然后在该文件夹中打开 vim 并阅读 :help ctags 以获取一些命令。一些我经常使用的:

将光标放在方法调用上并键入 CTRL-] 以转到方法 定义。

键入 :ta name 以转到名称的定义。

【讨论】:

【参考方案27】:

自动缩进:

gg(转到文档开头)=(缩进时间!)shift-g(转到文档末尾)

您需要在 .vimrc 文件中使用“filetype plugin indent on”,并且可能需要适当的“shiftwidth”和“expandtab”设置。

【讨论】:

或者只使用“:set ai”(自动缩进)工具,它从一开始就在 vi 中。【参考方案28】:

您询问了高效的快捷方式,但我认为您真正的问题是:vim 值得吗?这个***问题的答案是->“是”

你一定注意到了两件事。 Vim 很强大,vim 很难学。它的大部分功能在于它的可扩展性和无穷无尽的命令组合。不要感到不知所措。慢慢来。一个命令,一次一个插件。不要过度。

你在 vim 上的所有投资都会得到一千倍的回报。在你死之前,你将在文本编辑器中待上很多很多小时。 Vim 将成为你的伴侣。

【讨论】:

【参考方案29】:

多个缓冲区,特别是它们之间的快速跳转以将两个文件与:bp:bn 进行比较(正确重新映射到 单个 Shift + pShift + n)

vimdiff 模式(分成两个垂直缓冲区,用颜色显示差异)

使用 Ctrl + v

进行区域复制

最后,标识符的制表符补全(搜索“mosh_tab_or_complete”)。这改变了生活。

【讨论】:

【参考方案30】:

同意上面的海报 - :r! 命令非常很有用。

我经常用它来“粘贴”东西:

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

这样我就不用摆弄:set paste了。

【讨论】:

最好将clipboard 选项设置为unnamed(.vimrc 中的set clipboard=unnamed)以默认使用系统剪贴板。或者,如果您仍希望系统剪贴板与未命名的寄存器分开,请使用适当命名的剪贴板寄存器:"*p 爱它!在被从网上粘贴代码示例激怒之后,我才开始觉得自己精通 vim。那是我当场梦寐以求的命令。这就是 vim 完全吸引我的时候。 如果你在 Mac 上开发,Command+C 和 Command+V 使用系统剪贴板复制和粘贴,不需要重新映射。 仅使用 GVIm... 从控制台,如果启用了自动缩进,则不使用 :set paste 进行粘贴效果不佳。

以上是关于你最爱的一个 Vim 命令是啥?的主要内容,如果未能解决你的问题,请参考以下文章

vim向上移动8行的快捷键是啥?

码农最爱的编辑器是vim Linux桌面当属Ubuntu

在vi编辑器中要查找某一个单词的命令是啥?

如何在任何地方使用 Vim 编辑器输入文本

好友给我分享了一份面试官最爱问的Java面试题,你值得拥有!

两个成倍提高工作效率的 Vim 使用技巧