当前位置:  开发笔记 > 编程语言 > 正文

Vim最有效的捷径是什么?

如何解决《Vim最有效的捷径是什么?》经验,为你挑选了43个好方法。

我听过很多关于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的一切都是这样的:似乎我不知道如何以正确的方式处理它.

NB:我已经阅读过Vim 备忘 单了 :)

我的问题是:

你使用Vim的方式是什么让你比现代编辑更有效率?



1> Jim Dennis..:

你和Vim的问题在于你没有理解vi.

你提到切割yy并抱怨你几乎从不想切割整条线.事实上,编程源代码的程序员经常想要在整行,行范围和代码块上工作.但是,yy只是将文本移入匿名复制缓冲区(或在vi中调用"注册")的许多方法之一.

vi的"禅" 是你说的一种语言.最初y是一个动词.该声明yy是其同义词y_.将y是成倍上涨,使之更容易输入,因为它是这样一个常见的操作.

这也可以表示为dd P(删除当前行并将副本粘贴回原位;将副本留在匿名寄存器中作为副作用).在yd"动词"采取任何行动作为他们的"主题".因此yW,"从这里(光标)猛拉到当前/下一个(大)单词的结尾",y'a并且"从这里拉到包含名为' a ' 的标记的行."

如果您只了解基本的向上,向下,向左和向右光标移动,那么vi将不会比您的"记事本"副本更高效.(好吧,你仍然会有语法高亮和处理文件大于大约45KB左右的文件;但是在这里和我一起工作).

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

因为这些是"运动",所以它们也可以用作其他"陈述"的主题.

因此,削减任意文本选择的一种方法是删除标记(我通常使用' a '作为我的"第一"标记,' z '作为我的下一个标记,' b '作为另一个标记,' e '作为另一个(我不记得曾经在使用vi的 15年中交互式地使用了超过四个标记;一个人创建了一个关于如何不干扰一个人的交互环境的宏使用标记和寄存器的约定.)然后我们去到我们想要的文本的另一端;我们可以从任何一端开始,没关系.然后我们可以简单地使用d`a剪切或y`a复制.因此整个过程有5个击键开销(如果我们开始"插入"则为6个) "模式并需要Esc输出命令模式."一旦我们剪切或复制,然后粘贴副本是一个单击:p.

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

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

我们经常知道一些模式(正则表达式),它标记了我们感兴趣的文本的一端或另一端.向前或向后搜索是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意味着"删除包含字符串"foo"的任何行,从当前的一行到下一行21",同时:.,$v/bar/d意味着"从这里到文件的末尾",删除任何不包含字符串"bar"的行.

有趣的是,常见的Unix命令grep实际上是受这个ex命令启发的(并且以它的记录方式命名).该命令:g/re/p(grep的)是他们记载如何"全局","正则表达式打印"包含线""(重新)的方式.当使用edex时,该:p命令是任何人学习的第一个命令,通常是编辑任何文件时使用的第一个命令.这是你打印当前内容的方式(通常只使用一页:.,+25p或一些这样的页面).

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

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

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

几乎不用说,你可以使用我们的老朋友s(替代)gv(global/converse-global)命令.通常你不需要这样做.但是,请考虑某些情况,您只想在匹配其他模式的行上执行替换.通常,您可以使用带有捕获的复杂模式,并使用返回引用来保留您不想更改的行的部分.但是,将匹配与替换分开通常会更容易::% g/foo/s/bar/zzz/g- 对于包含"foo"的每一行,将所有"bar"替换为"zzz".(类似的:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g情况只适用于那些"bar"在同一条线上被"foo"预告的情况;它已经足够笨拙了,并且必须进一步修复以捕获所有"bar"之前的情况"富")

问题的关键是,有不仅仅是p,s以及d在线路ex命令集.

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

这是非常模糊的(在过去的15年里,我只使用了几次这样的东西).但是,我会自由地承认,如果我花时间思考正确的咒语,我经常以迭代和交互方式做事,这可能会更有效率地完成.

另一个非常有用的viex命令是:r读入另一个文件的内容.因此::r foo在当前行插入名为"foo"的文件的内容.

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

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

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

另一个有用的ex命令是:so(简称:source).这将读取文件的内容作为一系列命令.当你正常启动vi时,隐式地执行:sourceon ~/.exinitrc文件(Vim通常会自动执行此操作~/.vimrc,自然就足够了).使用此方法的是,您可以通过简单地获取一组新的宏,缩写和编辑器设置来动态更改编辑器配置文件.如果您偷偷摸摸,您甚至可以将其用作存储编辑命令序列的技巧,以便按需应用于文件.

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

(viVim+命令行选项通常用于在给定的行号处开始编辑会话.但是,一个鲜为人知的事实是,可以遵循任何有效的ex命令/表达式,例如"source"命令,如我在这里完成了;举一个简单的例子,我有调用的脚本:在我重新映像一组服务器时,以非交互方式从我的SSH已知主机文件中删除一个条目.+vi +'/foo/d|wq!' ~/.ssh/known_hosts

通常使用Perl,AWK,sed编写这样的"宏"要容易得多(事实上​​,就像grep是受ed命令启发的实用程序).

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

    0i:r(将当前行转换为有效的:r命令),

    "cdd (删除行到"c"寄存器)和

    @c 执行该命令.

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


一个发人深省的想法

我只是抓住了vi的力量,我在这里所描述的一切都不是vim命名的"改进"的一部分!我在这里描述的所有内容都应该适用于20或30年前的任何旧版本的vi.

有些人比以往任何时候都更多地使用了vi的力量.


圣典猴子,......这是一个深入的答案.什么是伟大的,你可能在vim写入大约10次击键.
完美赎回一个非常可怕的问题的绝妙答案.我将提出这个问题,通常我会投票,只是为了让这个答案变得更容易找到.(而且我是一个Emacs家伙!但是这样我就可以找到一些新人,他们希望能够很好地解释vi高级用户对vi的兴趣.然后我会告诉他们有关Emacs的信息,他们可以决定.)
@Wahnfieden - grok正是我的意思:http://en.wikipedia.org/wiki/Grok(显然甚至在OED中 - 我们最接近英语词典的规范词典)."grok"编辑器就是发现自己能够流利地使用它的命令......好像它们是你的自然语言.
哇,写得很好!我不能同意,虽然我经常使用`@`命令(与`q`结合使用:记录宏)
你可以建立一个网站并把这个教程放在那里,所以它不会在stackoverflow上被埋没.我还没有阅读更好的介绍vi然后这个.
+1的答案很棒."咒语"的另外一个+1.另一个用于解释vi伪(?)语言.还有另外一个在这个答案中有很多实用的,可用的例子.这实际上是我所见过的最精确,最易理解的微型教程.
@RobM旧的vi(和nvi)中的"q"键未绑定.这是一个vim特定的键绑定.即使我正在使用一些vim功能(例如语法高亮),我倾向于使用vi键绑定.但是,我刚刚看到了一个值得一提的巧妙技巧.@也是'前'命令.因此,如果我们将宏记录到一个命名寄存器中(使用vim'q'或将其文本插入到我们的文档中并将其放入命名寄存器中),我们就可以使用它来执行以下命令:g/foo/@ c(其中" c"是我通常用于命令的寄存器).
波特率是串行连接的时钟频率 - 110波特率约为11个字符/秒(8N1串行)
@Brandon:作为一个Emacs家伙(好吧,一个经过改革的vi家伙),看到有人提供如上所述的简洁和丰富的回应,我会感到非常印象深刻.Emacs可能拥有世界上所有的力量,但没有一种方法可以利用它的大部分.以上是纯美.
@tsocks re:写这篇文章需要花多长时间...我在看电视和/或玩WoW时几乎都做了我的事.那可能需要两三个小时.多年来我在其他一些在线论坛上写过类似的东西; 这是最广泛的单一帖子.
你应该在创意公共许可下写一本书"Advanced VIM".编程中没有多少人为了回答问题付出太多努力.向你致敬.编程社区非常感谢您
说到vi和Zen,我必须链接到Tom Christiansen的经典文章:http://oreilly.com/news/zenclavier_1299.html
来自我的+1.对于一个年轻的开发学校来说,现在(比如说15岁)读到这一点有多疯狂:"......这比快速打字员慢......另外,通常有一些动机来保存纸张...... .."不同的世界.
@Brandon Craig Rhodes这不是一个可怕的问题,只是当时的OP只是一个初学者,就像我现在一样.我绝对是同一双鞋,需要这样的答案.
Spencer:更确切地说,我说vi*是*(最好被认为是)一种语言(我的答案中几乎没有任何东西是vim特定的;*是*vs.*has*是一个相当重要的区别).当一个人能够流利地使用某种语言时,用这种语言表达自己不再被视为"工作".大部分工作是在构思而不是表达.(是的,可以付出相当大的努力来表达自己的某些特质,而不仅仅是功利主义 - 诗意,艺术,高效,简洁;这是另一回事)

2> CMS..:

你在谈论文本选择和复制,我认为你应该看看Vim可视模式.

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

请考虑以下常见情况:

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

你可以这样做:

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

vib 如果光标在括号内

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

vi"双引号

vi'单引号

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

viB

vi{

您想要选择整个文件:

ggVG

可视块选择是另一个非常有用的功能,它允许您选择文本的矩形区域,您只需按Ctrl- V启动它,然后选择所需的文本块并执行任何类型的操作,如yank,delete,粘贴,编辑等.编辑面向列的文本非常棒.


是的,但这是海报的具体投诉.可视模式是Vim直接文本选择和操作的最佳方法.由于vim的缓冲遍历方法非常棒,我发现vim中的文本选择相当令人愉快.
我认为还值得一提的是Ctrl-V来选择一个块 - 即一个任意的文本矩形.当你需要它时,它是一个救星.
@viksit:我正在使用Camtasia,但有很多选择:http://www.codinghorror.com/blog/2006/11/screencasting-for-windows.html
此外,如果你有一个视觉选择并想要调整它,`o`将跳到另一端.因此,您可以根据需要随意移动选择的开头和结尾.
每个编辑都有这样的东西,它不是特定于vim.
@CMS - BTW - 你是如何将这些击键记录到gif中的?:)
你在那里用什么字体?
@JustJeff:字体是Envy R Code,http://damieng.com/blog/2008/05/26/envy-code-r-preview-7-coding-font-released
有趣的是,如果您想在选择后更改文本,请按c.这也可以直接用:ci(
我看到人们使用`v di `很多,虽然视觉模式和文本对象都很棒,但是如果要在括号或引号之间改变文本或其他什么,那么就更直接了`ci"`或`ci(`.如果你要替换它,则不需要先选择它.

3> vdboor..:

一些生产力提示:

聪明的动作

*#向前/向后搜索光标下的单词.

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<=在<..>之间更改文本(需要set matchpairs+=<:>在vimrc中)

4dd =删除4行

3x =删除3个字符.

3s =替换3个字符.

有用的程序员命令

r替换一个字符(例如rd替换当前的字符d).

~ 改变案例.

J 加入两行

Ctrl + A/Ctrl + X递增/递减数字.

. 重复上一个命令(一个简单的宏)

== 修复行缩进

> 缩进块(在可视模式下)

< unindent block(在可视模式下)

宏录制

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  :set paste
map  :set nopaste
imap  :set paste
imap  
set pastetoggle=

# 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 shift0{,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  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> kev..:

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

a- z命名寄存器

" 未命名的寄存器,包含最后删除或猛拉的文本

% 当前的文件名

# 备用文件名

* 剪贴板内容(X11:主要选择)

+ 剪贴板内容

/ 最后的搜索模式

: 最后一个命令行

. 最后插入的文字

- 最后一小(少于一行)删除

=5*5 将25插入文本(迷你计算器)

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


仅供参考,这是指*插入模式*中的Ctrl + R. 在正常模式下,Ctrl + R是重做的.
+1表示当前/备用文件名.`Control-A`也可以在插入模式下用于最后插入的文本,``Control- @`用于插入最后插入的文本并立即切换到正常模式.

5> Benson..:
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配置,我从中学到了很多,并借用了这里列出的大部分插件.


我认为现在是时候使用https://github.com/wincent/Command-T取代了FuzzyFinderTextmate.
为Syntastic +1.与JSLint相结合,使我的Javascript更不容易出错.请参阅http://superuser.com/questions/247012/using-jslint-with-syntastic-in-vim,了解如何设置JSLint以使用Syntastic.
我认为nerdcommenter也是一个很好的插件:[这里](http://www.vim.org/scripts/script.php?script_id=1218).就像它的名字所说的那样,它用于评论你的代码.

6> 小智..:

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

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

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


另外,如果你使用一个简洁的命令(例如A for append-end-end)来编辑文本,vim可以为你按下`.`键的下一行重复完全相同的动作.

7> dimba..:

GI

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

^ P和^ N.

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

^ O和^ I

转到上一个(^O- "O"旧)位置或下一个(^I- "I"接近"O").当您执行搜索,编辑文件等时,您可以向前和向后浏览这些"跳转".


谢谢你`gi`!现在我不需要标记了!
@Kungi`.将带你到最后一次编辑``将带你回到你最后'跳'之前的位置 - 这可能/也可能是最后一次编辑的位置.

8> Ronny Brende..:

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

这是非常新的,非常好.正在运行该站点的人从textmate切换到vim,并在特定的vim主题上提供非常好的和简洁的演员.看看这个!


如果您喜欢vim教程,请查看[Derek Wyatt的vim视频](http://www.derekwyatt.org/vim/vim-tutorial-videos/vim-novice-tutorial-videos/).他们很棒.

9> hcs42..:

CTRL+A递增您所站的数字.


......和CTRL-X递减.
@SolutionYogi:考虑您要在每行的开头添加行号.解决方案:ggI1 在关键词中,我们来了解问题
对Vimperator非常有用,它增加(或减少,Ctrl-X)URL中的最后一个数字.有助于快速浏览图像画廊等.
这是一个简洁的捷径,但到目前为止,我从来没有找到任何用途.
如果你在屏幕上运行vim并想知道为什么这不起作用 - ctrl + A,A

10> Eric Smith..:

全部处于正常模式:

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

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

如果智能地使用,上面两个可以让你快速移动一行.

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

#在单词上搜索上一个实例.


:) vim.org提示页面顶部的标语:"你能想象如果我只及时知道"*"命令,可以保存多少次击键?" - Juergen Salk,1/19/2001"
哇,我不知道*和#(在光标下搜索前进/后退)绑定.那有点酷.f/F和t/T和; 命令是快速跳转到当前行上的字符.f/F将光标放在指示的字符上,而t/T只是将它放到"字符"(根据所选方向在其之前或之后的字符);只需重复最近的f/F/t/T跳(朝同一方向).

11> agfe2..:

会议

一个.保存会议

:mks sessionname

湾 强制保存会话

:MKS!SESSIONNAME

C.加载会话

gvim或vim -S sessionname


添加和减去

一个.添加和减去

CTRL-A;将[count]添加到光标处或之后的数字或字母字符处.{不在Vi

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

湾 窗口键解除映射

在窗口中,Ctrl-A已映射为需要在rc文件中取消映射的整个文件选择.mark mswin.vim CTRL-作为注释的映射部分或使用unmap添加您的rc文件

C.随着宏

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

    创建第一个列表条目,确保它以数字开头.

    qa - 开始录制到缓冲区'a'

    Y - 猛拉参赛作品

    p - 将条目的副本放在第一个下面

    CTRL-A - 增加数字

    q - 停止录制

    @a - 重复猛拉,放置和增加时间



12> Dave Kirby..:

上周,我们的项目从另一个项目继承了很多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 "." 

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

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

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

当然,使用像Python或Ruby这样的脚本语言可以实现自动化,但是编写它会花费更长的时间并且灵活性会降低 - 最后一个例子本来就很困难,因为单凭正则表达式无法处理嵌套括号,例如转换bar(foo(xxx))foo(xxx).bar().Vim非常适合这项任务.



13> soulmerge..:

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

map     :Explore
map   :sp +Explore

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

-:最有用:更改为上层目录(cd ..)

mf:标记文件

D:如果没有标记,则删除标记的文件或光标所在的文件.

R:重命名光标所在的文件.

d:在当前目录中创建一个新目录

%:在当前目录中创建一个新文件


我建议使用NERDtree而不是内置的资源管理器.它改变了我使用vim进行项目的方式,让我的工作效率更高.只是谷歌为它.

14> Jeff Dege..:

我是美国密码学会的成员.双月刊杂志包括100多种各种密码.其中大约15个是"密码" - 用字母代替数字的各种类型的算术问题.其中两个或三个是sudokus,除了字母而不是数字.当网格完成时,九个不同的字母将拼写出一些或多个单词,在某些线条,对角线,螺旋等上,在网格中的某处.

我没有使用铅笔或手工输入问题,而是从他们网站的成员区域下载问题.

当使用这些sudokus时,我使用vi,因为我使用的是vi拥有的其他编辑器所拥有的设施.主要是将字母网格转换为编号网格,因为我发现它更容易解决,然后完成的编号网格返回字母网格以找到解决方案的单词.

问题被格式化为九组九个字母,-s代表空白,用两行写成.第一步是将这些格式化为九行,每行九个字符.这没有什么特别的,只需在适当的位置插入八个换行符.

结果将如下所示:

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的内容应该通过命令行传送. }猛拉下一段,然后在命令行使用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教程书籍,网站,帮助文件等,所做的不仅仅是触及可能的表面.


我对这个重复的错误感到困惑:你说你需要`:`进入命令模式,但是你总是指定_normal mode_命令(比如`y}} p`),它们不能在命令模式下工作?!

15> jqno..:

批量文本操作!

通过宏:

从录制开始: qq

做东西

停止录制: q

重复:( @q第一次),@@之后.

重复20次: 20@@

或者通过正则表达式:

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

(但要注意:如果你做后者,你将有2个问题:).)


为[Jamie Zawinski](http://en.wikiquote.org/wiki/Jamie_Zawinski)引用+1.(即使没有链接到它也没有收回点).:)

16> David Pope..:

我最近发现了q:.它打开"命令窗口"并显示最近的ex-mode(命令模式)命令.您可以在窗口中照常移动,然后按下执行命令.你也可以编辑等.当你搞乱一些复杂的命令或正则表达式并且你不想重新输入整个事物,或者你想要做的复杂事情是3个命令时,我们无价.它几乎就像bash一样set -o vi,但对于vim本身(嘿!).

查看:help q:更多有趣的信息来回.



17> Svend..:

我前几天刚刚发现了Vim的omnicompletion,虽然我承认我对它的作用有点朦胧,但我在插入模式下混合了Ctrl+ x Ctrl+ uCtrl+ n/ Ctrl+ p,结果出奇的好.它不是智能感知,但我还在学习它.

试试看! :help ins-completion



18> tfmoraes..:

这些不是快捷方式,但它们是相关的:

    使Capslock成为一个额外的ESC(或Ctrl)

    使用以下命令将地图引导至","(逗号):let mapleader =","

它们提高了我的生产力


为了让Caps Lock键在Windows附加Esc键(?什么是大写锁定为一个"任意键"键),试试这个:http://web.archive.org/web/20100418005858/http://webpages.charter.净/ krumsick /

19> 小智..:

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


在Windows xp出现的时候,我常常开玩笑说这是它唯一的好处.
`Xp`走另一条路

20> 小智..:

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

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

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


+ W和j/k将让您绝对导航(j up,k down,与普通vim一样).当你有3个以上的分裂时,这很棒.
在敲击我的键盘后,我推断出` n`或` s`是新的水平窗口,` b`是右下窗口,` c`或` q`是关闭窗口,` x`增加然后减小窗口宽度(??),` p`是最后一个窗口,` backspace`是向左移动(ish)窗口

21> 小智..:

视觉模式

正如其他几位人士所说,视觉模式是您复制/剪切和粘贴问题的答案.Vim给你'v','V'和Cv.vim中的小写'v'与记事本中的shift键基本相同.好消息是你不必把它压低.您可以使用任何移动技术有效地导航到选择的开始(或结束)点.然后点击"v",再次使用高效的移动技术导航到选择的另一端.然后'd'或'y'允许您剪切或复制该选择.

vim的视觉模式的优势超过了Jim Dennis对vi中剪切/复制/粘贴的描述,即你不必完全正确地获取位置.有时候使用快速移动来到达你想去的地方附近,然后通过其他动作进行优化,而不是想出一个更复杂的单一移动命令,让你准确到达你想去的地方.

以这种方式广泛使用可视化模式的缺点是,它可能成为您一直使用的拐杖,这会阻止您学习可能允许您更有效地执行操作的新vi(m)命令.但是,如果您非常积极地学习vi(m)的新方面,那么这可能不会对您产生太大影响.

我还将再次强调,视觉线和视觉块模式可以为您提供相同主题的变化,这些主题可以非常强大......尤其是视觉块模式.

关于键盘的有效使用

我也不同意你的说法,交替使用手是使用键盘的最快方法.它有一个真实的元素.一般来说,重复使用相同的东西是很慢的.这个原则的最重要的例子是用同一个手指键入的连续键击非常慢.你的断言可能源于在这种模式下使用s/finger/hand/transformation的自然倾向.在某种程度上它是正确的,但在效率谱的极高端,这是不正确的.

请问任何钢琴家.询问他们是否可以更快地连续交替使用几个音符或依次使用单手的连续手指.键入4次击键的最快方法不是交替,而是用同一只手的4个手指按升序或降序键入它们(称之为"运行").一旦你考虑到这种可能性,这应该是不言而喻的.

更困难的问题是为此进行优化.在键盘上优化绝对距离非常容易.Vim那样做.这是更难在"运行"级进行优化,但六(米),它的模式编辑给你能够做到这一点比任何非模态的方式有更好的机会(啊哈,emacs的)都做不到.

在Emacs上

为了避免emacs狂热者因为最后的括号评论完全无视我的整篇文章,我觉得我必须描述emacs和vim宗教之间差异的根源.我从未在编辑大战中说过话,我可能不会再这样做了,但我从来没有听过有人用这种方式描述差异,所以就这样吧.区别在于以下权衡:

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

盲人vim狂热者会声称vim有脚本语言.但它是一种模糊的,特殊的语言,旨在为编辑服务.Emacs有Lisp!说够了.如果你不理解最后两句话的意义,或者想要充分学习函数式编程和Lisp来发展这种欣赏,那么你应该使用vim.

emacs狂热者将声称emacs具有viper模式,因此它是vim的超集.但是viper模式并不标准.我的理解是大多数emacs用户都没有使用viper模式.由于它不是默认值,因此大多数emacs用户可能不会对模态范例的好处产生真正的认识.

在我看来,这些差异是正交的.我相信vim和emacs的好处,正如我所说的那样,都是有效的.这意味着终极编辑器尚不存在.emacs可能是最简单的平台,可以作为最终编辑器的基础.但模态编辑并没有在emacs心态中根深蒂固.emacs社区可能会在未来以这种方式移动,但这似乎不太可能.

因此,如果您想要原始编辑效率,请使用vim.如果您想要编写脚本和编程的最终环境,请使用emacs.如果您希望其中一些都强调可编程性,请使用带有viper模式的emacs(或编写您自己的模式).如果你想要两全其美,那你现在运气不好.



22> konryd..:

花费30分钟做vim教程(在终端中运行vimtutor而不是vim).您将学习基本动作和一些击键,这将使您至少与vim一样高效,就像您之前使用的文本编辑器一样.在那之后,再次阅读Jim Dennis的回答:)



23> 小智..:

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


或dfx,dFx,dtx,ytx等,其中x是char,+ 1

24> kev..:

\c在搜索中的任何位置使用以忽略大小写(覆盖您的ignorecase或smartcase设置).例如,/\cfoo/foo\c将匹配foo,Foo,fOO,FOO,等.

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



25> Johnsyweb..:

你使用Vim的方式是什么让你比现代编辑更有效率?

能够用很少的击键(通常使用宏)执行复杂的重复编辑.看看VimGolf,见证Vim的力量!

经过十多年的日常使用,很难想象使用任何其他编辑器.



26> Bradjcox..:

奇怪没有人提到ctags.下载"exuberant ctags"并将其置于搜索路径中已有的预装版本之前.镉到你正在做的任何事情的根源; 例如Android内核分发.输入"ctags -R".在名为"tags"的文件中构建该目录下任何位置的源文件索引.这包含所有标签,无论是语言还是dir中的位置,在一个文件中,因此跨语言工作很容易.

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

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

键入:ta name转到name的定义.



27> David Clarid..:

自动缩进:

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

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


或者只使用":set ai"(自动缩进)工具,它从一开始就在vi中.

28> 小智..:

你问过有效的快捷方式,但我认为你真正的问题是:vim值得吗?这个stackoverflow问题的答案是 - >"是"

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

你投入到vim的所有投资都将偿还一千倍.在你死之前的许多小时,你将会在文本编辑器中.Vim将成为你的伴侣.



29> Stefano Bori..:

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

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

区域复制Ctrl+v

最后,标签完成标识符(搜索"mosh_tab_or_complete").那是改变生活的方式.



30> David Woleve..:

同意顶级海报 - :r!命令非常有用.

我经常使用它来"粘贴"东西:

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

这样我就不必乱动了:set paste.


最好将`clipboard`选项设置为`unnamed`(在.vimrc中设置`clipboard clipboard = unnamed`)以默认使用系统剪贴板.或者,如果您仍希望将系统剪贴板与未命名的寄存器分开,请使用相应命名的剪贴板寄存器:`"*p`.
爱它!通过从网络上粘贴代码示例而感到恼怒之后,我才刚刚开始对vim感到精通.这就是我当场梦寐以求的命令.这是当vim完全迷上我的时候.

31> William Purs..:

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

你提到你在剪切和粘贴方面遇到了麻烦,但听起来你需要更多使用vim中的一般动作命令的经验.猛拉3个字:y3w从光标到下一个分号:yf; 下次出现最近一次搜索:yn所有这些都比在按住修改键时尝试使用鼠标导航要快得多.此外,正如CMS的响应中的一些示例所示,vim的运动命令针对C和C++源代码中的高效导航进行了高度优化.

至于"如何使用vim让我更有效率?"的问题,我希望答案是:"有效".



32> Eric Ryan Ha..:

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

:%s

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



33> 小智..:

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

是的 - 复制标签的内容


`:帮助文本对象`了解更多这些

34> kguest..:

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

如果你在vim中有一个基本上无序的列表,比如使用#作为标记,你可以将它转换为有序列表.

# CSSLINT
# PHPCS
# Charlie
# Delta

如果它从第一行开始,你就可以做到

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

把它转换成

1 CSSLINT
2 PHPCS
3 Charlie
4 Delta

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

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

更多信息:help sub-replace-expression



35> kikuchiyo..:

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

在其路径上跳转到文件

gf

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

:r!echo %:p

获取现有文件的目录

:r!echo %:p:h

运行代码:

:!ruby %:p

ruby缩写:

ab if_do if endbixhxO
ab if_else if endbixhxO elsebhxA k$O
ab meth def methodendk:s/method/
ab klas class KlassNameendk:s/KlassName/
ab mod module ModNameendk:s/ModName/

运行当前程序:

   map ,rby :w!:!ruby %:p

检查当前程序的语法:

   map ,c :w!:!ruby -c %:p

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

   map ,s :w!:!rspec %:p

破解它打开irb:

   map ,i :w!:!irb

rspec abreviations:

   ab shared_examples shared_examples_for "behavior here" doend
   ab shared_behavior describe "description here" do  before :each doendit_should_behave_like "behavior here"end
   ab describe_do describe "description here" doend
   ab context_do describe "description here" doend
   ab it_do it "description here" doend
   ab before_each before :each doend

rails缩写:

用户认证:

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

在firefox中打开视觉选择的url:

"function
   function open_url_in_firefox:(copy_text)
     let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
     exe g:open_url_in_firefox
   endfunction

"abbreviations
   map ,d :call open_url_in_firefox:(expand("%:p"))
   map go y:call open_url_in_firefox:(@0) 

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

"function
   function run_single_rspec_test:(the_test)
     let g:rake_spec="!rspec ".a:the_test.":".line(".")
     exe g:rake_spec
   endfunction

"abbreviations
   map ,s :call run_single_rspec_test:(expand("%:p"))

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

"function
   function run_single_rails_rspec_test:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,r :call run_single_rails_rspec_test:(expand("%:p"))

rspec-rails:使用调试运行包含当前行的规范:

"function
   function run_spec_containing_current_line_with_debugging:(the_test)
     let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
     exe g:rake_spec
   endfunction

"abbreviations
   map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) 

HTML

"abbreviations

  "ab htm 
   ab template_html 
   ab script_i 
   ab script_m 
   ab Tpage :r ~/.vim/templates/pageContainer.html
   ab Ttable :r ~/.vim/templates/listTable.html

"function to render common html template

   function html:() 
     call feedkeys( "i", 't' )
     call feedkeys("\  \\\ ", 't')
     call feedkeys( "\", 't' )
     call feedkeys( "i", 't' )
     call include_js:()
     call feedkeys("\\\ \hxhxi", 't')
   endfunction

JavaScript的

"jasmine.js
  "abbreviations
   ab describe_js describe('description here', function(){});
   ab context_js context('context here', function(){});
   ab it_js it('expectation here', function(){});
   ab expect_js expect().toEqual();
   ab before_js beforeEach(function(){});
   ab after_js afterEach(function(){});

"function abbreviations

   ab fun1 function(){}iko
   ab fun2 x=function(){};hi
   ab fun3 var x=function(){};

"method for rendering inclusion of common js files

   function include_js:()
     let includes_0  = "  "
     let includes_1  = "  "
     let includes_2  = "




















    
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有