我听说过很多关于Vim的事,包括优点和缺点。 (作为一名开发人员)使用Vim确实应该比使用其他任何编辑器都要快。 我用Vim来做一些基本的事情,我用Vim最多只能减少10倍的效率。

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

左右交替使用的 用手是最快的方法 键盘。 永远不要碰鼠标 第二种方法是尽可能快。 你要花很长时间才能移动你的手, 抓住鼠标,移动它,把它带来 回到键盘上(你经常这样做 看看键盘,确保你 将你的手正确地回到正确的位置)

下面的两个例子说明了为什么我使用Vim效率低得多。

复制/剪切和粘贴。我一直都这么做。在所有当代编辑器中,你用左手按Shift键,用右手移动光标来选择文本。然后按Ctrl+C复制,移动光标,按Ctrl+V粘贴。

Vim的情况很糟糕:

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

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

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

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

注:我已经读了Vim小抄:)

我的问题是:

与当代编辑器相比,您使用Vim的哪些方式使您的工作效率更高?


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

在可视模式下,您可以使用Vim命令选择文本,然后可以对所选内容做任何您想做的事情。

考虑以下常见场景:

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

你可以这样做:

如果光标位于开始/结束括号上,则为V % 如果光标位于圆括号块内,则返回Vib

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

Vi”表示双引号 Vi '表示单引号

你想要选择一个大括号块(在c风格语言中非常常见):

viB vi {

你想要选择整个文件:

ggVG

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


在代码中插入文本:

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 Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x

" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y

" CTRL-V and SHIFT-Insert are Paste
map <C-V>       "+gP
map <S-Insert>      "+gP

cmap <C-V>      <C-R>+
cmap <S-Insert>     <C-R>+

(直接从mswin中取出。来自vim发行版的vim)。这将给你Ctrl-C, Ctrl-V等复制和粘贴。

Personally, I find the copying and pasting much better with the standard Vim. In Vim I can have the cursor on a line, type yy to copy it, 10p to paste 10 copies of it. With the Align plugin, I can then use Ctrl-V (assuming the windows mappings above aren't used) to visual-block select a column of numbers that has been created; :II then auto-increments that column of numbers. Similarly, with YankRing, I can copy 10 (or more) lines one after another and then paste them back out one after another.

至于Vim让我更有效率的方式,我想说标签文件是我再也离不开的东西。当光标在标签上时,我可以按Ctrl-]去函数(和Ctrl- t返回,尽可能多的级别)或,p在预览窗口中打开函数或宏定义(或任何东西)(然后可以用:pcl快速关闭)或[I只是在状态栏上显示宏定义。对于浏览复杂的源代码,这些工具是无价的。

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

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

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


前几天我刚刚发现Vim的全功能完成,虽然我承认我有点模糊,但我已经获得了令人惊讶的好结果,只是混合Ctrl + x Ctrl + u或 Ctrl + n/Ctrl +p插入模式。这不是智能感知,但我还在学习。

试试吧!:帮助ins-completion


批量文本操作!

通过宏:

开始录音:qq 做的东西 停止录制:q 重复:@q(第一次),然后@@。 重复20次:20@@

或者通过正则表达式:

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

(但要注意的是:如果你选择后者,你会遇到两个问题:))


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

Vimdiff模式(在两个垂直缓冲区中分割,用颜色显示差异)

区域复制Ctrl + v

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


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

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

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


gi

转到上次编辑的位置(如果你进行了一些搜索,然后想要返回编辑,这非常有用)

^P和^N

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

^O和^I

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


提高编辑速度的第三个标准是所需的击键次数。我得说这比你的其他两个更重要。在vim中,几乎所有的操作都比我熟悉的任何其他编辑器需要更少的按键。

You mention that you are having trouble with cut & paste, but it sounds like you need more experience with general motion commands in vim. yank 3 words: y3w yank from the cursor to the next semi-colon: yf; yank to the next occurrence of your most recent search: yn All of those are much faster than trying to navigate with a mouse while holding down a modifier key. Also, as seen in some of the examples in CMS's response, vim's motion commands are highly optimized for efficient navigation in C and C++ source code.

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


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


正常模式:

F <char>移动到当前行上特定字符的下一个实例,并且;重复。

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

如果使用得当,以上两点可以让你在队列中快速移动。

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

#来搜索前一个实例。


你用Vim的问题是你不懂vi。

你提到用yy剪,抱怨说你几乎从来不想剪整行。事实上,程序员在编辑源代码时,经常希望处理整行、整行或整块代码。然而,yy只是将文本拉入匿名复制缓冲区(或在vi中称为“寄存器”)的许多方法之一。

vi的“禅意”是你在说一种语言。开头的y是动词。语句yy是y_的同义词。由于y是一种很常见的操作,所以将y改为两倍以便更容易输入。

这也可以表示为dd P(删除当前行并将副本粘贴回原位;在匿名登记册中留下一份作为副作用)。y和d“动词”以任何动作为主语。因此yW是“从这里(光标)拉到当前/下一个(大)单词的末尾”,y’a是“从这里拉到包含标记为‘a’的行”。

如果你只了解基本的上下左右光标移动,那么vi对你来说不会比“notepad”的拷贝更有效率。(好吧,你仍然有语法高亮显示和处理大于45KB左右的文件的能力;但在这里和我一起工作)。

vi has 26 "marks" and 26 "registers." A mark is set to any cursor location using the m command. Each mark is designated by a single lower case letter. Thus ma sets the 'a' mark to the current location, and mz sets the 'z' mark. You can move to the line containing a mark using the ' (single quote) command. Thus 'a moves to the beginning of the line containing the 'a' mark. You can move to the precise location of any mark using the ` (backquote) command. Thus `z will move directly to the exact location of the 'z' mark.

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

So, one way to cut an arbitrary selection of text would be to drop a mark (I usually use 'a' as my "first" mark, 'z' as my next mark, 'b' as another, and 'e' as yet another (I don't recall ever having interactively used more than four marks in 15 years of using vi; one creates one's own conventions regarding how marks and registers are used by macros that don't disturb one's interactive context). Then we go to the other end of our desired text; we can start at either end, it doesn't matter. Then we can simply use d`a to cut or y`a to copy. Thus the whole process has a 5 keystrokes overhead (six if we started in "insert" mode and needed to Esc out command mode). Once we've cut or copied then pasting in a copy is a single keystroke: p.

I say that this is one way to cut or copy text. However, it is only one of many. Frequently we can more succinctly describe the range of text without moving our cursor around and dropping a mark. For example if I'm in a paragraph of text I can use { and } movements to the beginning or end of the paragraph respectively. So, to move a paragraph of text I cut it using { d} (3 keystrokes). (If I happen to already be on the first or last line of the paragraph I can then simply use d} or d{ respectively.

“段落”的概念通常是直觉上合理的。因此,它不仅适用于散文,也适用于代码。

Frequently we know some pattern (regular expression) that marks one end or the other of the text in which we're interested. Searching forwards or backwards are movements in vi. Thus they can also be used as "subjects" in our "statements." So I can use d/foo to cut from the current line to the next line containing the string "foo" and y?bar to copy from the current line to the most recent (previous) line containing "bar." If I don't want whole lines I can still use the search movements (as statements of their own), drop my mark(s) and use the `x commands as described previously.

In addition to "verbs" and "subjects" vi also has "objects" (in the grammatical sense of the term). So far I've only described the use of the anonymous register. However, I can use any of the 26 "named" registers by prefixing the "object" reference with " (the double quote modifier). Thus if I use "add I'm cutting the current line into the 'a' register and if I use "by/foo then I'm yanking a copy of the text from here to the next line containing "foo" into the 'b' register. To paste from a register I simply prefix the paste with the same modifier sequence: "ap pastes a copy of the 'a' register's contents into the text after the cursor and "bP pastes a copy from 'b' to before the current line.

“前缀”的概念也为我们的文本操作“语言”增加了语法“形容词”和“副词”的类似物。大多数命令(动词)和移动(动词或对象,取决于上下文)也可以带数字前缀。因此,3J表示“连接接下来的三行”,d5}表示“从当前行删除,直到第五段结束。”

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


以下是一些更高级的技巧:

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

: commands normally operate over lines of text. ed and ex were written in an era when terminal screens were uncommon and many terminals were "teletype" (TTY) devices. So it was common to work from printed copies of the text, using commands through an extremely terse interface (common connection speeds were 110 baud, or, roughly, 11 characters per second -- which is slower than a fast typist; lags were common on multi-user interactive sessions; additionally there was often some motivation to conserve paper).

So the syntax of most : commands includes an address or range of addresses (line number) followed by a command. Naturally one could use literal line numbers: :127,215 s/foo/bar to change the first occurrence of "foo" into "bar" on each line between 127 and 215. One could also use some abbreviations such as . or $ for current and last lines respectively. One could also use relative prefixes + and - to refer to offsets after or before the curent line, respectively. Thus: :.,$j meaning "from the current line to the last line, join them all into one line". :% is synonymous with :1,$ (all the lines).

The :... g and :... v commands bear some explanation as they are incredibly powerful. :... g is a prefix for "globally" applying a subsequent command to all lines which match a pattern (regular expression) while :... v applies such a command to all lines which do NOT match the given pattern ("v" from "conVerse"). As with other ex commands these can be prefixed by addressing/range references. Thus :.,+21g/foo/d means "delete any lines containing the string "foo" from the current one through the next 21 lines" while :.,$v/bar/d means "from here to the end of the file, delete any lines which DON'T contain the string "bar."

It's interesting that the common Unix command grep was actually inspired by this ex command (and is named after the way in which it was documented). The ex command :g/re/p (grep) was the way they documented how to "globally" "print" lines containing a "regular expression" (re). When ed and ex were used, the :p command was one of the first that anyone learned and often the first one used when editing any file. It was how you printed the current contents (usually just one page full at a time using :.,+25p or some such).

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

We can use m to move lines around, and j to join lines. For example if you have a list and you want to separate all the stuff matching (or conversely NOT matching some pattern) without deleting them, then you can use something like: :% g/foo/m$ ... and all the "foo" lines will have been moved to the end of the file. (Note the other tip about using the end of your file as a scratch space). This will have preserved the relative order of all the "foo" lines while having extracted them from the rest of the list. (This would be equivalent to doing something like: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d (copy the file to its own tail, filter the tail through grep, and delete all the stuff from the head).

To join lines usually I can find a pattern for all the lines which need to be joined to their predecessor (all the lines which start with "^ " rather than "^ * " in some bullet list, for example). For that case I'd use: :% g/^ /-1j (for every matching line, go up one line and join them). (BTW: for bullet lists trying to search for the bullet lines and join to the next doesn't work for a couple reasons ... it can join one bullet line to another, and it won't join any bullet line to all of its continuations; it'll only work pairwise on the matches).

Almost needless to mention you can use our old friend s (substitute) with the g and v (global/converse-global) commands. Usually you don't need to do so. However, consider some case where you want to perform a substitution only on lines matching some other pattern. Often you can use a complicated pattern with captures and use back references to preserve the portions of the lines that you DON'T want to change. However, it will often be easier to separate the match from the substitution: :% g/foo/s/bar/zzz/g -- for every line containing "foo" substitute all "bar" with "zzz." (Something like :% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g would only work for the cases those instances of "bar" which were PRECEDED by "foo" on the same line; it's ungainly enough already, and would have to be mangled further to catch all the cases where "bar" preceded "foo")

关键是在ex命令集中不止有p、s和d行。

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

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

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

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

Even more powerful are the ! (bang) and :... ! (ex bang) commands. These also execute external commands and read the results into the current text. However, they also filter selections of our text through the command! This we can sort all the lines in our file using 1G!Gsort (G is the vi "goto" command; it defaults to going to the last line of the file, but can be prefixed by a line number, such as 1, the first line). This is equivalent to the ex variant :1,$!sort. Writers often use ! with the Unix fmt or fold utilities for reformating or "word wrapping" selections of text. A very common macro is {!}fmt (reformat the current paragraph). Programmers sometimes use it to run their code, or just portions of it, through indent or other code reformatting tools.

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

Another useful ex command is :so (short for :source). This reads the contents of a file as a series of commands. When you start vi it normally, implicitly, performs a :source on ~/.exinitrc file (and Vim usually does this on ~/.vimrc, naturally enough). The use of this is that you can change your editor profile on the fly by simply sourcing in a new set of macros, abbreviations, and editor settings. If you're sneaky you can even use this as a trick for storing sequences of ex editing commands to apply to files on demand.

例如,我有一个七行文件(36个字符),它通过wc运行一个文件,并在包含单词计数数据的文件顶部插入一个c风格的注释。我可以使用vim +'so mymacro '这样的命令将“宏”应用到文件中。“交货。/ mytarget

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

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

The @ command is probably the most obscure vi command. In occasionally teaching advanced systems administration courses for close to a decade I've met very few people who've ever used it. @ executes the contents of a register as if it were a vi or ex command. Example: I often use: :r!locate ... to find some file on my system and read its name into my document. From there I delete any extraneous hits, leaving only the full path to the file I'm interested in. Rather than laboriously Tab-ing through each component of the path (or worse, if I happen to be stuck on a machine without Tab completion support in its copy of vi) I just use:

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

这只需要10次按键(表达式“cdd @c”对我来说实际上是一个手指宏,所以我几乎可以像打任何常见的六个字母的单词一样快)。


发人深省的想法

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

有人比我更能使用vi的力量。


自动缩进:

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

你需要在你的.vimrc文件中设置“filetype plugin indent on”,可能还需要适当设置“shiftwidth”和“expandtab”。


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

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

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

这样我就不必摆弄:设置粘贴。


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

:%s

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


实际上我总是丢失我的缓冲区,所以我通常复制一行的方式是把它写到一个临时文件,然后在适当的位置读入。

e.g.

Ka(设定标记)

”,。w !T(将标记中的所有内容复制到文件T)

. .移动你的光标。

:.rt(将t读入当前点)。

与使用缓冲区相比,这可能需要更少的击键,更容易跟踪,并且您可以拥有长期存在的粘贴文件。为了速度,我通常用一个字母来命名文件。

快速移动光标的关键原因是,你只需使用搜索函数“/”,如果你在到达你想去的地方之前遇到另一个模式,则使用“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 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语句,我在vim脚本中嵌入了一些python。

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

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

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


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

将capslock设置为额外的ESC(或Ctrl) 用下面的命令将领导者映射到“,”(逗号):let mapleader=“,”

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


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

Esc - exit Insert mode (skip if you are already in Normal mode) v - turn on visual mode move about the file to select the text you want - visual mode will show you what characters are selected. For a few words w, e and b are useful (move to start of next word, end of next word and start of this/previous word respectively). d - cut the text (use y if you want to copy the text) move about to where you want the text to go p - paste (this pastes after the current character, P pastes before the current character.

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


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

复制/剪切和粘贴。我一直都在做 时间。用所有经典的编辑器 用左手按Shift键, 你用你的 用右手选择文本。然后按Ctrl + C 复制时,移动光标并按Ctrl+V 贴。 Vim的情况很糟糕: * yy复制一行(你几乎不需要整行!) * [number xx]yy复制xx行到缓冲区。但世事难料 如果你选择了 想要的。我经常要做[数字] Xx]dd then u to undo!

我相信其他答案解释得更好,但是你做错了。我经常使用可视模式来选择要删除或删除的文本,这类似于shift + select的例子,但Vim在这里有一个明显的优势,因为你的手永远不会离开主行来做这件事。yy是一个很好的命令,但如果我想拉整行,我经常用Vy代替。


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

非常新,而且非常非常好。运行网站的人从textmate切换到vim,并在特定的vim主题上进行了非常出色和简洁的cast。点击这里查看详情!


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


维姆插件

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

rails.vim

Rails。Vim是tpope编写的插件。对于从事rails开发的人来说,这是一个不可思议的工具。它做了一些神奇的上下文敏感的事情,允许您轻松地从控制器中的方法跳转到相关视图,再跳转到模型,再向下跳转到该模型的单元测试。它为rails开发人员节省了数十甚至数百个小时的时间。

gist.vim

这个插件允许你在视觉模式下选择一个文本区域,然后输入一个快速命令将其发布到gi.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配置,从中我学到了很多,并借鉴了这里列出的大部分插件。


一些提高效率的技巧:

智能运动

*和#在向前/向后光标下搜索单词。 W到下一个单词 W到下一个空格分隔的单词 B /e到当前单词的开头/结尾。(B / E只代表空格) gg / G跳转到文件的开始/结束。 %跳转到匹配{..}或(..)等. . {/}跳转到下一段。 ”。跳转回上次编辑的行。 g;跳回上次编辑的位置。

快速编辑命令

我在开头插入。 end的附加语句。 o / o打开一个新的行后/前电流。 v / v / Ctrl+ v可视模式(选择文本!) Shift+R替换文本 C更改剩余部分行。

结合命令

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

改变直到单词结束 改变3个单词 BcW =开始全字,更改全字 ciW =改变内心的词。 Ci " =改变内部之间的".." Ci(=更改文本之间(..) Ci < = change text between < ..>(需要在vimrc中设置匹配对+=<:>) 4dd =删除4行 3x =删除3个字符。 3s =替换3个字符。

有用的程序员命令

R替换一个字符(例如rd用d替换当前字符)。 ~改变情况。 J连接两条线 Ctrl+A / Ctrl+X增加/减少一个数字。 . 重复最后一个命令(一个简单的宏) ==修复行缩进 >缩进块(可视模式下) < unindent block(在可视模式下)

宏录制

按q[键]开始录音。 然后按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中工作,您必须将# comment字符替换为“”,我想在这里给出正确的语法高亮显示)。

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


我惊讶地发现没有人提到t运动。我经常把它和参数表一起用dt或者yt,


In addition to the great reply about grokking vi, it should be noted that vim does add some very vi-like features that make using vi commands nicer. The one that comes to mind first are text objects: instead of {!}fmt to reformat the current paragraph, !apfmt does the same. It works by first specifying that we want to select a text object, which is the current paragraph. Similar, to change the current string literal (foo to bar for an example), instead of T"ct"bar (move to just after the previous ", change until just before the next ", insert bar), you can say ci"bar: change inside (innermost) quotes, inserting bar.

从文本对象而不是移动命令的角度思考是非常不错的。


视觉模式

As several other people have said, visual mode is the answer to your copy/cut & paste problem. Vim gives you 'v', 'V', and C-v. Lower case 'v' in vim is essentially the same as the shift key in notepad. The nice thing is that you don't have to hold it down. You can use any movement technique to navigate efficiently to the starting (or ending) point of your selection. Then hit 'v', and use efficient movement techniques again to navigate to the other end of your selection. Then 'd' or 'y' allows you to cut or copy that selection.

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

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

我还要再次强调,视觉线条和视觉块模式可以让你在相同的主题上产生非常强大的变化,尤其是视觉块模式。

关于键盘的有效使用

I also disagree with your assertion that alternating hands is the fastest way to use the keyboard. It has an element of truth in it. Speaking very generally, repeated use of the same thing is slow. This most significant example of this principle is that consecutive keystrokes typed with the same finger are very slow. Your assertion probably stems from the natural tendency to use the s/finger/hand/ transformation on this pattern. To some extent it's correct, but at the extremely high end of the efficiency spectrum it's incorrect.

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

更困难的问题是为此进行优化。优化键盘上的绝对距离非常简单。Vim做到了这一点。在“运行”级别上进行优化要困难得多,但是vi(m)与它的模态编辑相比,任何非模态方法(嗯哼,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(或编写自己的模式)。如果你想两全其美,那你现在就不走运了。


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

我不用铅笔,也不用手写,而是从他们网站的会员区下载问题。

在处理这些数独游戏时,我使用vi,只是因为我使用了vi所具有的其他编辑器所没有的功能。主要是在把字母网格转换成有编号的网格,因为我觉得这样更容易解决,然后把完成的有编号的网格转换回字母网格中,找到解单词或单词。

这个问题被格式化为9组,每组9个字母,-s代表空格,写在两行中。第一步是将它们格式化成每行9个字符的9行。这没有什么特别的,只是在适当的位置插入8个换行符。

结果如下所示:

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

So, first step in converting this into numbers is to make a list of the distinct letters. First, I make a copy of the block. I position the cursor at the top of the block, then type :y}}p. : puts me in command mode, y yanks the next movement command. Since } is a move to the end of the next paragraph, y} yanks the paragraph. } then moves the cursor to the end of the paragraph, and p pastes what we had yanked just after the cursor. So y}}p creates a copy of the next paragraph, and ends up with the cursor between the two copies.

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

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

: again puts me in command mode. ! indicates that the content of the next yank should be piped through a command line. } yanks the next paragraph, and the command line then uses the tr command to strip out everything except for upper-case letters, the sed command to print each letter on a single line, and the sort command to sort those lines, removing duplicates, and then tr strips out the newlines, leaving the nine distinct letters in a single line, replacing the nine lines that had made up the paragraph originally. In this case, the letters are: 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教程书籍、网站、帮助文件等,几乎触及了可能的表面。


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

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

参见:help i_CTRL-R和:help c_CTRL-R了解更多细节,并在附近搜索更多CTRL-R的好处。


在搜索的任何地方使用\c来忽略大小写(覆盖你的ignorecase或smartcase设置)。 例如/\cfoo或/foo\c将匹配foo, foo, foo, foo等。

在搜索的任何地方使用\C强制大小写匹配。 例如/\Cfoo或/foo\C只匹配foo。


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

你一定注意到了两件事。Vim功能强大,而且很难学习。它的强大之处在于它的可扩展性和无穷无尽的命令组合。不要感到不知所措。走慢。一次一个命令,一个插件。不要做过头。

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


会话

A.保存会话

: mks sessionname

B.强制保存会话

: mks !sessionname

C.加载会话

gvim或vim -S session


加减法

a.加减法

CTRL-A;在数字或字母字符at后添加[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 -重复拉,放和增加次数


以插入模式转换空标记的内容

复制标签的内容


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


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

你使用Vim的方式是什么 你比带着一个更有效率 当代编辑?

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

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


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

如果你在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


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


奇怪的是没人提到标签。下载“exuberant ctags”,把它放在你搜索路径中已经有的蹩脚的预装版本之前。Cd到你正在工作的根目录;例如Android内核发行版。键入“ctags -R .”,在名为“tags”的文件中,在该目录下的任何位置建立源文件的索引。在一个文件中包含了所有标签,无论使用何种语言,也不管在目录中的位置,因此跨语言工作很容易。

然后打开该文件夹中的vim,并阅读:help ctags中的一些命令。我经常使用的几个:

将光标放在一个方法调用上,并键入CTRL-]以进入该方法 定义。 输入:ta name进入name的定义。


在将以下内容映射为一个简单的组合键后,以下内容对我来说非常有用:

在浏览文件路径时跳转到文件中

gf

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

:r!echo %:p

获取现有文件的目录

:r!echo %:p:h

运行代码:

:!ruby %:p

ruby的缩写:

ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab 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>

把它打开:

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

rspec缩写:

   ab shared_examples shared_examples_for "behavior here" do<cr>end
   ab 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>end
   ab context_do describe "description here" do<cr>end
   ab it_do it "description here" do<cr>end
   ab 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:

"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"))<cr>
   map go y:call open_url_in_firefox:(@0)<cr> 

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"))<cr>

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"))<cr>

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")) <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
  "abbreviations
   ab 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>ko
   ab 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 < 18
       let entry = 'includes_' . j
       call feedkeys( {entry}, 't' )
       call feedkeys( "\<cr>", 't' )
       let j = j + 1
     endwhile

   endfunction

"jquery

  "abbreviations

     ab docr $(document).ready(function(){});
     ab jqfun $(<cr>function(){<cr>}<cr>);

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

参见:help q:获取更多有趣的来回操作。


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

VIM Adventures是一款基于VIM键盘快捷键的在线游戏 (命令,动作和操作符)。这是《塞尔达传说》与文本编辑的结合 游戏。这是一个练习和记忆VIM命令的益智游戏 (当然,不错的老VI也包括在内)。这是一种简单的学习方法 VIM没有陡峭的学习曲线。


还有更多的捷径吗?

输入你的。vimrc: nnoremap;:

这样进入命令模式更容易: q或者w功,而不是q或者w功。

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


对系统管理员来说是不好的,因为他们需要开箱即用的相同功能在每个地方的每个盒子上都是相同的。

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


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

假设你的寄存器x包含

字符串搜索

要搜索此字符串,必须在普通模式下键入 / CTRL-rxENTER

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


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

成立[成文]


巧妙的TAB补全^^

http://vim.wikia.com/wiki/Smart_mapping_for_tab_completion


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


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

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

可以使用以下命令:

Ct <标识符>为正向切割。

cT<identifier>用于反向切割。

行中要剪切到的字符在哪里。

例子:假设这是你想编辑的行,你的光标在I。

嗨。我是一名程序员,我用Python和R编程。

你想切到:,然后用I am a programmer覆盖,你输入:ct:,然后输入I am a programmer。这将导致:你好。我是程序员:Python和R。

快速删除一行的部分:

就像上面的命令一样,从当前光标位置删除内容,直到'identifier'

Dt <identifier>用于前向删除

dT<identifier>用于反向删除

希望这对你也有用。