你使用Vim最有效率的捷径是什么?

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

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

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

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

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

对于Vim来说,这太可怕了:

  • #0复制一行(你几乎永远不会想要整行!)
  • #0xx行复制到缓冲区中。但是你永远不知道你是否选择了你想要的。我经常不得不做#2然后#3来撤消!

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

  • PSPadCtrl+f中键入您想要搜索的内容,然后按输入
  • 在Vim:#0中,然后键入要搜索的内容,然后如果有一些特殊字符,请将#1放在每个特殊字符之前,然后按输入

与Vim的一切都是这样的:似乎我不知道如何以正确的方式处理它。

NB:我已经阅读了Vim作弊工作表:)

我的问题是:

与当代编辑器相比,您使用Vim的方式是什么?

932624 次浏览

你说的是文本选择和复制,我认为你应该看看Vim可视模式

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

考虑以下常见场景:

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

你可以这样做:

  • #0如果光标在开始/结束括号上
  • #0如果光标在括号块内

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

  • vi”双引号
  • vi'单引号

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

  • viB
  • vi{

您要选择整个文件:

  • #0

可视块选择是另一个非常有用的功能,它允许您选择矩形文本区域,您只需按Ctrl-V即可启动它,然后选择您想要的文本块并执行任何类型的操作,例如Yank,删除,粘贴,编辑等。

将文本插入代码中的某个位:

ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC

录制宏以编辑文本并运行N次:

q, a (or some other letter), (do the things I want to record), q, ESC,(type N, as in the number of times I want to run the macro), @, a

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

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

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

  • -:最有用的:更改到上层目录(cd ..
  • mf:标记文件
  • D:如果没有标记,则删除标记的文件或光标所在的文件。
  • R:重命名光标所在的文件。
  • d:在当前目录中创建一个新目录
  • %:在当前目录中创建一个新文件

暂时忽略这个问题(我的答案如下),有几件事可能会帮助你解决vim的问题:

:map <C-F> /\V

这将使Ctrl-F开始搜索,搜索的第一个字符为\V,这会关闭所有的“魔法”,因此您不必转义任何内容(就像PsPad一样)。

" CTRL-X and SHIFT-Del are Cutvnoremap <C-X> "+xvnoremap <S-Del> "+x
" CTRL-C and CTRL-Insert are Copyvnoremap <C-C> "+yvnoremap <C-Insert> "+y
" CTRL-V and SHIFT-Insert are Pastemap <C-V>       "+gPmap <S-Insert>      "+gP
cmap <C-V>      <C-R>+cmap <S-Insert>     <C-R>+

(直接从Vim发行版的mswin.vim中获取)。这将为您提供Ctrl-C、Ctrl-V等用于复制和粘贴。

就个人而言,我发现使用标准Vim复制和粘贴要好得多。在Vim中,我可以将光标放在一行上,键入yy来复制它,10p粘贴10个副本。使用对齐插件,我可以使用Ctrl-V(假设不使用上面的窗口映射)来可视化阻止选择已创建的一列数字;:II然后自动递增该列数字。类似地,使用YankRing,我可以一个接一个地复制10(或更多)行,然后一个接一个地粘贴回来。

至于Vim让我更有效率的方式,我会说标签文件是我再也离不开的一件事。当光标位于标签上时,我可以按Ctrl-]进入函数(并按Ctrl-T返回,我喜欢多少级别就多少级别),或者按,p在预览窗口中打开函数或宏定义(或任何东西)(然后可以使用: pcl快速关闭)或按[i在状态栏上显示宏定义。对于导航复杂的源代码,这些工具是无价的。

预览窗口确实依赖于. vimrc中的映射,但是:

:map ,p :ptag <C-R><C-W><CR>

标签文件还允许使用几个(我的)插件,这些插件提供语法突出显示,更清楚地显示错误(通过突出显示已识别的标签而不是突出显示未识别的标签)和标签签名,当您将鼠标移动到关键字上时。

前几天我刚刚发现Vim的全能,虽然我承认我对它的作用有点模糊,但我已经有了惊人的好结果,只是混搭Ctrl+xCtrl+uCtrl+n/Ctrl+p在插入模式下。它不完全是智能感知,但我仍在学习它。

试试看!:help ins-completion

批量文本操作!

通过宏:

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

或者通过正则表达式:

  • 替换内容::%s/[fo]+/bar/g

(但要注意:如果你这样做,你会有两个问题:)。

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

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

使用Ctrl+v进行区域复制

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

+W, V垂直分割屏幕
+W,W在窗口之间移动

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

ZF在视觉模式下折叠任意线条

gi

转到上次编辑的位置(如果您执行了一些搜索并且想要返回编辑,则非常有用)

^p和^n

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

^o和^i

转到上一个(^O-"O"为旧)位置或下一个(^I-"I"靠近"O")。当您执行搜索,编辑文件等时,您可以向前和向后导航这些“跳跃”。

使编辑更快的第三个标准是所需的击键次数。我会说这比你的其他2更重要。在vim中,几乎所有的操作都需要比我熟悉的任何其他编辑器更少的击键。

你提到你在使用剪切和粘贴时遇到了麻烦,但听起来你需要更多使用vim中一般运动命令的经验。此外,正如CMS响应中的一些示例所示,vim的运动命令经过高度优化,可以在C和C++源代码中高效导航。

至于“我如何使用vim使我更有效率?”的问题,我希望答案是:“有效”。

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

所有在正常模式:

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

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

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

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

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

你对Vim的问题是你不理解vi

你提到用yy剪切,并抱怨你几乎永远不想剪切整行。事实上,程序员,编辑源代码,经常想处理整行、行范围和代码块。然而,yy只是将文本拖入匿名复制缓冲区(或vi中所说的“注册”)的众多方法之一。

vi的“禅”是您在说一种语言。最初的y是一个动词。语句yyy_的同义词。y被加倍以使其更容易键入,因为它是如此常见的操作。

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

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

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

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

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

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

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

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

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

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

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


更高级的技巧示例:

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

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

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

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

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

请注意,:% g/.../d或(其reVerse/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的任何行连接到其后续行,如果它位于'一个'和'b'标记之间的行之间。(是的,前面的所有ex命令示例都可以通过前缀这些类型的寻址表达式限制为文件行的子集)。

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

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

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

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

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

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

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

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

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

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

  1. 0i:r(将当前行转换为有效的: r命令),
  2. "cdd(删除“c”寄存器中的行)和
  3. @c执行该命令。

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


发人深省的想法

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

有些人比我更多地使用了vi的力量。

自动缩进:

gg(转到文档的开头)
=
创建时间shift-g(转到文档末尾)

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

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

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

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

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

我最有效的vi/Vim技巧是:

:%s

我喜欢能够动态使用正则表达式来替换文件中我想要的任何内容。每个文本编辑器都应该支持正则表达式IMHO。

实际上,我总是丢失我的缓冲区,所以我通常复制一系列行的方法是将其写入临时文件,然后在适当的位置读取它。

e. g.

ka(设置标记)

'a,. w! t(将标记中的所有内容复制到文件t中)

…移动你的光标…

:. r t(将t读入当前位置)。

这可能涉及比使用缓冲区更少的击键,更容易跟踪,并且您可以长期粘贴文件。为了速度,我通常使用1个字母的文件名。

快速移动光标的关键原因是,只需使用搜索功能“/”,如果您在到达想要去的地方之前遇到另一个模式,则使用“n”。

.重复上次文本更改命令

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

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

上周在工作中,我们的项目从另一个项目继承了很多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 moden        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 af(       moves forward to the next opening bracketl        moves right one character, so the cursor is now inside the bracketsdi(      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 positiona.       go into insert mode and add a "."

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

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

我们仍然需要改变剩下的5%不值得自动化和测试结果的工作,但是通过花一天时间编写这个脚本,我估计我们已经节省了数周的工作。

当然,使用Python或Ruby等脚本语言可以自动执行此操作,但编写时间要长得多,灵活性也会降低——最后一个示例会很困难,因为仅靠regex无法处理嵌套括号,例如将bar(foo(xxx))转换为foo(xxx).bar()。Vim非常适合这项任务。

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

  1. 使capslock成为额外的ESC(或Ctrl)
  2. 将leader映射到","(逗号),使用此命令:let mapleader=","

他们提高了我的生产力。

特别是对于复制/剪切和粘贴,使用可视化模式可以更容易地适应其他编辑器。所以我通常剪切和粘贴的方式是:

  • Esc-退出插入模式(如果您已经处于正常模式,则跳过)
  • v-打开视觉模式
  • 移动文件以选择您想要的文本-视觉模式将显示您选择了哪些字符。对于一些单词web很有用(分别移动到下一个单词的开头、下一个单词的结尾和这个/上一个单词的开头)。
  • d-剪切文本(如果要复制文本,请使用y
  • 移动到你想要文本的位置
  • p-粘贴(此粘贴在当前字符之后,P粘贴在当前字符之前。

使用V进入视觉模式(行)也很有用,它会自动选择整行,无论光标在哪里。

http://www.viemu.com/a-why-vi-vim.html是一篇很好的宣传文章。它解释了使用.命令重复上次编辑的能力。

复制/剪切和粘贴。我做这一切时间和所有的古典编辑你用左手按Shift,你用你的鼠标移动光标右手选择文本。然后Ctrl+C复制,您移动光标并Ctrl+V粘贴。

对于Vim来说,这太可怕了:

* yy to copy one line (you almost never want the whole line!)* [number xx]yy to copy xx lines into the buffer. But you never know

如果你选择了你想要的我经常要做[号码]xx]dd然后u撤消!

我相信其他答案已经解释得更好了,但是你做错了。我经常使用可视模式来选择要拉取或删除的文本,这类似于你的Shift+选择示例,但是Vim在这里有明显的优势,因为你的手永远不会离开本行去做。

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

这是一个非常新的,非常非常好的网站。这个网站的负责人从文本伙伴切换到vim,并且在特定的vim主题上主持了非常好和简洁的演员阵容。看看吧!

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

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和text ate一样强大。

谢了

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

生产力小贴士:

聪明的动作

  • *#向前/向后搜索光标下的单词。
  • 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递增/递减数字。
  • .重复最后一个命令(一个简单的宏)
  • ==修复行缩进
  • >缩进块(在可视模式下)
  • <未缩进块(在可视模式下)

宏录音

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

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

构建良好的设置示例

# reset to vim-defaultsif &compatible          # only if not set before:set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)endif
# display settingsset background=dark     # enable for dark terminalsset nowrap              # dont wrap linesset scrolloff=2         # 2 lines above/below cursor when scrollingset number              # show line numbersset showmatch           # show matching bracket (briefly jump)set showmode            # show mode in status bar (insert/replace/...)set showcmd             # show typed command in status barset ruler               # show cursor position in status barset title               # show file in titlebarset wildmenu            # completion with menuset wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svnset laststatus=2        # use 2 lines for the status barset matchtime=2         # show matching bracket for 0.2 secondsset matchpairs+=<:>     # specially for html
# editor settingsset esckeys             # map missed escape sequences (enables keypad keys)set ignorecase          # case insensitive searchingset smartcase           # but become case sensitive if you type uppercase charactersset smartindent         # smart auto indentingset smarttab            # smart tab handling for indentingset magic               # change the way backslashes are used in search patternsset bs=indent,eol,start # Allow backspacing over everything in insert mode
set tabstop=4           # number of spaces a tab counts forset 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 settingsset lazyredraw          # no redraws in macrosset confirm             # get a dialog when :q, :w, or :wq failsset 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 quittingset history=50          # keep 50 lines of command historyset 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 colorsset 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 supportfiletype plugin indent on
# file type specific settingsif has("autocmd")# For debugging#set verbose=9
# if bash is sh.let bash_is_sh=1
# change to directory of current file automaticallyautocmd BufEnter * lcd %:p:h
# Put these in an autocmd group, so that we can delete them easily.augroup mysettingsau FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtabau FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab
# Confirm to PEP8au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,classaugroup 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中工作,我想在这里给出适当的语法突出显示)。

我在这里列出的命令非常基本,也是我目前使用的主要命令。它们已经让我更有效率,而不必知道所有花哨的东西。

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

除了关于grokking vi的伟大回复之外,应该注意的是vim确实添加了一些非常类似vi的功能,使使用vi命令更好。首先想到的是文本对象:而不是{!}fmt来重新格式化当前段落,!apfmt也这样做。它的工作原理是首先指定我们要选择a文本对象,即当前的!apfmt0。类似的,要更改当前字符串文字(例如foobar),而不是T"ct"bar(移动到前一个"之后,!apfmt1直到下一个"之前,插入!apfmt2),您可以说ci"bar:更改内部(最内部)引号,插入!apfmt2。

考虑文本对象而不是移动命令是非常好的。

可视模式

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

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

以这种方式广泛使用可视模式的缺点是,它可能成为你一直使用的拐杖,阻止你学习新的vi(m)命令,这些命令可能会让你更有效地做事。然而,如果你非常积极地学习vi(m)的新方面,那么这可能不会对你产生太大影响。

我还将再次强调,视觉线条和视觉块模式为您提供了相同主题的变体,这些变体可能非常强大……尤其是视觉块模式。

论键盘的有效使用

我也不同意你的断言,即交替双手是使用键盘的最快方式。它有一定的道理。一般来说,重复使用同样的东西是缓慢的。这个原则最重要的例子是,用同一根手指连续击键非常慢。你的断言可能源于在这种模式上使用s/手指/手/转换的自然倾向。在某种程度上,这是正确的,但在效率谱的极端高端,这是不正确的。

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

更困难的问题是为此进行优化。优化键盘上的绝对距离非常容易。Vim做到了这一点。在“运行”级别进行优化要困难得多,但是具有模态编辑功能的vi(m)比任何非模态方法(嗯,emacs)都有更好的机会做到这一点。

在emacs

为了避免emacs狂热者完全忽视我的整个帖子,因为最后一个附加评论,我觉得我必须描述emacs和vim宗教之间差异的根源。我从未在编辑器战争中发言,我可能不会再这样做了,但我从未听过有人这样描述差异,所以在这里。区别是以下权衡:

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

盲目的vim狂热者会声称vim有一种脚本语言。但它是一种晦涩难懂的临时语言,旨在为编辑器服务。Emacs有Lisp!说够了。如果你不理解最后两句话的意义,或者不想学习足够多的函数式编程和Lisp来培养这种欣赏,那么你应该使用vim。

emacs狂热者会声称emacs有毒蛇模式,所以它是vim的超集。但毒蛇模式不是标准的。我的理解是大多数emacs用户不使用毒蛇模式。由于这不是默认值,大多数emacs用户可能不会真正欣赏模态范式的好处。

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

因此,如果你想要原始编辑效率,请使用vim。如果你想要脚本和编程的终极环境,请使用emacs。如果你想要两者都强调可编程性,请使用带有毒蛇模式(或编程自己的模式)的emacs。如果你想要两全其美,你现在运气不好。

我是美国密码协会的成员。双月刊收录了100多种密码。其中大约15种是“密码”——用字母代替数字的各种算术问题。其中两三个是数独,除了用字母代替数字。当网格完成时,九个不同的字母将在网格中的某个地方拼出一个或多个单词,在某条线上,对角线上,螺旋线上,等等。

而不是用铅笔工作,或者用手输入问题,我从他们网站的成员区域下载问题。

在使用这些数独时,我使用vi,仅仅是因为我使用了vi拥有的其他编辑器所拥有的工具。主要是将字母网格转换为编号网格,因为我发现它更容易解决,然后将完成的编号网格返回到字母网格以找到解决方案的单词或单词。

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

结果将看起来像这样:

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

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

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

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

:再次让我进入命令模式。!表示下一个yank的内容应该通过命令行传输。} 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的教程书籍、网站、帮助文件等中,只有很少一部分能够触及到可能的表面。

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

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

有关更多详细信息,请参阅:help i_CTRL-R:help c_CTRL-R,并在附近窥探更多CTRL-R优点。

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

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

你问的是高效快捷方式,但我认为你真正的问题是:vim值得吗?这个堆栈溢出问题的答案是->“是”

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

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

会议

保存会话

: mks会话名

强制保存会话

: mks!会话名

c.加载会话

gvim或vim-S会话名


加法和减法

a.加减

CTRL-A;在数字或字母字符中添加[计数]或者在光标之后。{不在Vi中

CTRL-X;从数字或字母中减去[计数]光标处或之后的字符。{不在Vi中}

b.窗口键取消映射

在窗口中,Ctrl-A已经映射了整个文件选择,您需要在rc文件中取消映射。mswin.vimCTRL-A映射部分标记为注释或使用unmap

添加您的rc文件

c.宏观

CTRL-A命令在宏中非常有用。示例:使用以下步骤创建有序列表。

  1. 创建第一个列表条目,确保它以数字开头。
  2. qa-开始记录到缓冲区'a'
  3. 把入口拉出来
  4. p-在第一个条目下面放一个条目的副本
  5. CTRL-A-增加数字
  6. q-停止录制
  7. @a-重复yank,put和增量时间

cit-在插入模式下使用转换清空标记的内容

yit-复制标签的内容

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

Ctrl-w Ctrl-f ............ open file under cursor in new windowCtrl-6 ................... alternate file'0 ....................... open last file:x ....................... close if save

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

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

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

您可以在替换字符串中使用\=,这是我经常做的事情。

如果你在vim中有一个无序列表,比如使用#作为标记,你可以将其转换为有序列表。

# CSSLINT# PHPCS# Charlie# Delta

如果它从一号线开始,你可以

:1,6s/#/\=line(".")/g

将其转换为

1 CSSLINT2 PHPCS3 Charlie4 Delta

如果它没有从第一行开始,只需做数学:

:16,20s/#/\=line(".") - 15/g

更多信息:帮助子替换表达式

有很多vim技巧,但到目前为止,我真正喜欢的是Ctrl+一个,因为我碰巧正在处理一些硬编码数组索引的st**d代码。

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

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

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

  • 类型:ta name转到名称的定义。

将下面的内容映射到一个简单的按键组合后,以下内容对我非常有用:

跳转到一个文件,而在其路径

gf

获取现有文件的完整路径名

:r!echo %:p

获取现有文件的目录

:r!echo %:p:h

运行代码:

:!ruby %:p

ruby缩写:

ab if_do if end<esc>bi<cr><esc>xhxOab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$Oab meth def method<cr>end<esc>k<esc>:s/method/ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/ab mod module ModName<cr>end<esc>k<esc>:s/ModName/

运行当前程序:

   map ,rby :w!<cr>:!ruby %:p<cr>

检查当前程序的语法:

   map ,c :w!<cr>:!ruby -c %:p<cr>

运行当前规范程序的所有规范:

   map ,s :w!<cr>:!rspec %:p<cr>

打开irb:

   map ,i :w!<cr>:!irb<cr>

rspec简化:

   ab shared_examples shared_examples_for "behavior here" do<cr>endab shared_behavior describe "description here" do<cr>  before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>ab describe_do describe "description here" do<cr>endab context_do describe "description here" do<cr>endab it_do it "description here" do<cr>endab before_each before :each do<cr>end<cr>

rails缩写:

用户认证:

     ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>

在Firefox中打开可视选择的URL:

"functionfunction open_url_in_firefox:(copy_text)let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""exe g:open_url_in_firefoxendfunction
"abbreviationsmap ,d :call open_url_in_firefox:(expand("%:p"))<cr>map go y:call open_url_in_firefox:(@0)<cr>

rspec:运行包含当前行的规范:

"functionfunction run_single_rspec_test:(the_test)let g:rake_spec="!rspec ".a:the_test.":".line(".")exe g:rake_specendfunction
"abbreviationsmap ,s :call run_single_rspec_test:(expand("%:p"))<cr>

rspec-rails:运行包含当前行的规范:

"functionfunction run_single_rails_rspec_test:(the_test)let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""exe g:rake_specendfunction
"abbreviationsmap ,r :call run_single_rails_rspec_test:(expand("%:p"))<cr>

rspec-rails:运行spec,其中包含带有调试的当前行:

"functionfunction run_spec_containing_current_line_with_debugging:(the_test)let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""exe g:rake_specendfunction
"abbreviationsmap ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>

html

"abbreviations
"ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>ab template_html <script type = 'text/template' id = 'templateIdHere'></script>ab script_i <script src=''></script>ab script_m <script><cr></script>ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>
"function to render common html template
function html:()call feedkeys( "i", 't' )call feedkeys("<html>\<cr>  <head>\<cr></head>\<cr><body>\<cr> ", 't')call feedkeys( "\<esc>", 't' )call feedkeys( "i", 't' )call include_js:()call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')endfunction

javascript

"jasmine.js"abbreviationsab describe_js describe('description here', function(){<cr>});ab context_js context('context here', function(){<cr>});ab it_js it('expectation here', function(){<cr>});ab expect_js expect().toEqual();ab before_js beforeEach(function(){<cr>});ab after_js afterEach(function(){<cr>});
"function abbreviations
ab fun1 function(){}<esc>i<cr><esc>koab fun2 x=function(){};<esc>hi<cr>ab fun3 var x=function(){<cr>};
"method for rendering inclusion of common js files
function include_js:()let includes_0  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"let includes_1  = "  <link   type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"let includes_2  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"let includes_3  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"let includes_4  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"let includes_5  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"let includes_6  = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"let includes_7  = "<script>"let includes_8  = "  describe('default page', function(){ "let includes_9  = "it('should have an html tag', function(){ "let includes_10 = "  expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"let includes_11  = "});"let includes_12 = "});"let includes_13 = "$(function(){"let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"let includes_15 = "jasmine.getEnv().execute();"let includes_16 = "});"let includes_17 = "\<bs>\<bs><\/script>"
let j = 0
while j < 18let entry = 'includes_' . jcall feedkeys( {entry}, 't' )call feedkeys( "\<cr>", 't' )let j = j + 1endwhile
endfunction
"jquery
"abbreviations
ab docr $(document).ready(function(){});ab jqfun $(<cr>function(){<cr>}<cr>);

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

请参阅:help q:以获取更多有趣的来回位。

这是另一个网站,我发现它对学习Vim很有帮助。它也很有趣!:)

VIM冒险是一款基于VIM键盘快捷键的网络游戏(命令、动作和操作符)。这是“塞尔达遇到文本编辑”这是一个用于练习和记忆VIM命令的益智游戏(好的旧VI也包括在内,当然)。这是一种简单的学习方法没有陡峭的学习曲线的VIM。

如何进一步的快捷键?


放入您的. vimrc:
nnoremap;:#新映射

这样进入逗号模式更容易:;q;w工作,而不是:q:w

两次击键而不是三次,你会经常需要这个。


对系统管理员不好,因为它们需要开箱即用的相同功能,以便在任何地方的每个盒子上都相同。

但是对于使用vi的程序员来说,这是一个巨大的改进。

您可以搜索寄存器的内容。

假设您的寄存器x包含

要搜索的字符串

要搜索此字符串,您必须在正常模式下键入
/ctrl-rx输入

它将粘贴x寄存器的内容。

一系列vim命令ggVGg?将Rot13密码应用于当前文档中的文本。

Gung vf zl zbfg cebqhpgvir fuegphg fvr v nyjnlf glcr va Ebg13。

智能标签完成^^

nnoremap q; q:在我的. vimrc中,在制作复杂的搜索和替换时保持流程。

快速剪切和覆盖一行的部分:

编辑一行时,一个非常常见的任务是从当前光标位置剪切到某个位置并覆盖新内容。

您可以使用以下命令:

ct<identifier>用于向前切割。

cT<identifier>用于向后切割。

你要切到的线中的字符在哪里。

示例:假设这是您要编辑的行,并且您的光标位于I

Hi There. I am a Coder and I code in : Python and R

您想剪切到:并用I am a programmer覆盖,您键入:ct:然后键入I am a programmer。这将导致:Hi There. I am a programmer: Python and R

快速删除一行的一部分:

就像上面的以下命令一样,从当前光标位置删除内容,直到“标识符”

dt<identifier>转发删除

dT<identifier>向后删除

希望这对你也有用。