Vim最有效的快捷方式是什么?


1126

我听说过很多有关Vim的信息,无论是利弊。看来,使用Vim(作为开发人员)应该比使用任何其他编辑器更快。我正在使用Vim来做一些基本的事情,而我最多只能将Vim的生产率降低 10倍。

在谈论速度时,您只需要注意两件事(您可能不太在意速度,但应该注意):

  1. 交替使用左右手是使用键盘的最快方法。
  2. 永远不要触摸鼠标是尽可能快的第二种方法。您需要花费很多时间才能动手,抓住鼠标,移动鼠标,然后将其重新带回键盘(而且您经常必须查看键盘以确保将手正确地放回正确的位置)

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

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

使用Vim太可怕了:

  • yy 复制一行(您几乎从不想要整行!)
  • [number xx]yyxx行复制到缓冲区。但是您永远不会确切知道是否选择了想要的东西。我经常必须做[number xx]dd然后u撤消!

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

  • PSPad中Ctrl+,f然后输入要搜索的内容,然后按Enter
  • 在Vim:中/,然后键入要搜索的内容,然后\每个特殊字符之前放置一些特殊字符,然后按Enter

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

注:我已经阅读Vim的备忘 :)

我的问题是:

与现代编辑器相比,使用Vim的方式有何提高?


“交替使用左右手是使用键盘的最快方法。” 奇怪的是,不适合我。当我可以用一只手键入单词时,我发现自己的速度要快得多。
本·莫迪凯

Answers:


2860

Vim的问题是您不喜欢vi

您提到用剪切,yy并抱怨您几乎从不希望剪切整条线。实际上,在编辑源代码时,程序员经常希望处理整行,行范围和代码块。但是,yy这只是将文本吸引到匿名复制缓冲区(或在vi中称为“注册” )的多种方法中的一种。

vi的“ Zen” 是您在说一种语言。初始y是动词。该语句yy是的同义词y_。将y是成倍上涨,使之更容易输入,因为它是这样一个常见的操作。

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

如果您仅了解基本的上,下,左和右光标移动,那么vi不会比复制“记事本”更有效。(好吧,您仍然可以突出显示语法,并能够处理大于45KB左右的文件;不过请在这里与我合作)。

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

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

因此,剪切任意选择的文本的一种方法是删除标记(我通常使用' a '作为我的“第一个”标记,' z '作为我的下一个标记,' b '作为另一个标记,以及' e '作为还有另一种(我不记得在使用vi的 15年中曾经交互式使用过四个以上的标记;一个创建了自己的约定,关于不干扰一个人的交互上下文的宏如何使用标记和寄存器)。到我们想要的文本的另一端;我们可以从任一端开始都没关系。然后我们可以简单地使用d`a剪切或y`a复制。因此,整个过程有5次击键开销(如果以“插入”模式和需要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是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的)是他们记载如何“全局”,“打印正则表达式”(RE)“含有一个行”的方式。使用edex时,该: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(替代)和gand v(全局/反向全局)命令。通常您不需要这样做。但是,考虑某些情况,您只想在与某些其他模式匹配的行上执行替换。通常,您可以对捕获使用复杂的模式,并使用向后引用保留不想更改的行部分。但是,将匹配与替换分开通常会更容易::% g/foo/s/bar/zzz/g-对于包含“ foo”的每一行,将所有“ bar”替换为“ zzz”。(就像是:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g仅适用于同一行上以“ foo”开头的“ bar”实例的情况;它已经足够笨拙了,必须进行进一步的处理才能捕获“ bar”在“ foo”之前的所有情况)

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

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

这非常晦涩(在过去的15年中,我仅使用过几次类似的东西)。但是,我会自由地承认,我经常迭代地进行交互操作,如果我花时间考虑正确的咒语,可能会更有效率。

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

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

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

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

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

例如,我有一个七行文件(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的副本中,我只使用:

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

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


一个发人深省的想法

我只接触过vi的功能,在这里我所描述的甚至都不是vim所命名的“改进”的一部分!我在这里描述的所有内容都可以在20或30年前的vi的任何旧版本上使用。

有些人使用了vi的力量比我用过的要多得多。


440
神圣的猴子,..那是一个深入的答案。很棒的是,您大概在10次击键中就在vim中进行了编写。
八十一团结

48
@Wahnfieden-grok正是我的意思:en.wikipedia.org/wiki/Grok(甚至在OED中也很明显-我们英语员对规范词典的距离最近)。要“赚钱”,就是要流畅地使用其命令……就像他们是您的自然语言一样。
吉姆·丹尼斯

22
哇,一个非常好的书面答案!我完全不同意,尽管我@q
经常

63
绝妙的答案完全赎回了一个非常可怕的问题。我要赞成这个问题,通常我会赞成,以便使这个答案更容易找到。(而且我是Emacs的家伙!但是这样,我将在某个地方指出一些新人,他们想要很好地解释vi威力用户会从中获得关于vi的乐趣。然后,我将向他们介绍Emacs,他们可以做出决定。)
布兰登·罗兹

8
您能否建立一个网站并将本教程放在那里,所以这里不会在stackoverflow上埋葬。我还没有阅读关于vi的更好的介绍。
Marko'4

504

您在谈论文本选择和复制,我认为您应该看一下Vim Visual Mode

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

请考虑以下常见情况:

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

您可以这样做:

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

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

  • vi“中使用双引号
  • vi'单引号

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

  • viB
  • vi{

您要选择整个文件:

  • ggVG

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


2
每个编辑器都有这样的东西,它不是特定于vim的。
finnw

22
是的,但这是对发帖人的特别抱怨。可视模式是Vim进行直接文本选择和操作的最佳方法。而且由于vim的缓冲区遍历方法非常出色,所以我发现vim中的文本选择相当令人愉快。

9
我认为也值得一提的是Ctrl-V选择一个块-即文本的任意矩形。当您需要它时,它可以挽救生命。
Hamish Downer 2010年

6
@viksit:我正在使用Camtasia,但还有很多替代方法:codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
另外,如果您有视觉选择并想要对其进行调整,o则将跳至另一端。因此,您可以根据需要随意移动选择的开始和结束。
弥敦道(Nathan Long)

207

一些生产力提示:

智能机芯

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

宏录制

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

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

完善设置的示例

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

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

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

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

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

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


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

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

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

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

  # if bash is sh.
  let bash_is_sh=1

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

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

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

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

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


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

endif # has("autocmd")

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

source /etc/vimrc.local

(您必须用来替换#注释字符"才能使其在VIM中工作,我想在此处突出显示适当的语法)。

我在这里列出的命令是非常基本的命令,也是到目前为止我使用的主要命令。他们已经使我变得更加高效,而不必了解所有奇特的东西。


4
比更好的'.g;,它跳回了过去changelist。转到最后编辑的位置,而不是最后编辑的行
naught101

98

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

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

请参阅:help i_CTRL-R:help c_CTRL-R了解更多详细信息,并在附近窥探以获取更多CTRL-R优点。


10
仅供参考,这是指为Ctrl + R在插入模式。在正常模式下,Ctrl + R重做。
vdboor 2010年

2
+1为当前/备用文件名。 Control-A也可以在插入模式下处理最后插入的文本,并Control-@插入最后插入的文本并立即切换到普通模式。
Aryeh Leib Taurog

91

Vim插件

这里有很多很好的答案,其中一个关于禅宗禅的惊人的答案。我没有看到的一件事是,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的智能感知,但这是迈出的一大步,并带来了您希望通过制表符完成工具获得的大量功能。

协同病毒

该工具将外部语法检查命令引入v​​im。我没有亲自使用过它,但是我听说过很多很棒的东西,而且这个概念很难被超越。无需手动进行语法检查即可节省大量时间,并且可以在引入语法错误时(而不是最终停止测试时)帮助您捕获语法错误。

逃犯

从vim内部直接访问git。同样,我没有使用过该插件,但可以看到该实用程序。不幸的是,我所处的文化是svn被认为是“新的”,因此很长一段时间我都不会看到git。

nerdtree.vim

vim的树形浏览器。我最近开始使用它,非常方便。它使您可以将树视图垂直拆分并轻松打开文件。这对于具有经常在其间跳转的许多源文件的项目非常有用。

FuzzyFinderTextmate.vim

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

结论

有很多不可思议的工具可用于vim。我敢肯定,我只是在这里打了水漂,值得搜索适用于您的域的工具。传统vi强大的工具集,vim的改进以及进一步扩展vim的插件的结合,这是有史以来最强大的文本编辑方法之一。Vim与emacs,eclipse,visual studio和textmate一样强大。

谢谢

感谢duwanisvim配置,我从中学到了很多,并借用了这里列出的大多数插件。


在rails.vim中进行神奇的测试到类导航是我希望Vim拥有TextMate绝对适用于所有语言的更普遍的功能之一:如果我在Person.scala上工作并且我执行Cmd + T,通常是第一件事列表中是PersonTest.scala。
汤姆·莫里斯

5
我认为是时候FuzzyFinderTextmate开始被github.com/wincent/Command-T
Gavin Gilmour

2
+1为Syntastic。结合JSLint,这使我的Javascript不易出错。有关如何设置JSLint与Syntastic一起使用的信息,请参见superuser.com/questions/247012/…
弥敦道(Nathan Long)

1
@Benson很棒的清单!我也会在snipMate中折腾。通用编码的自动化非常有帮助。如果<TAB>瞬间如果块等
ALG

2
我认为nerdcommenter也是一个不错的插件:在这里。就像它的名字所说的那样,它用于注释您的代码。
斯蒂芬2012年

53

. 重复最后一个文本更改命令

我节省了很多时间。

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


3
另外,如果您使用简洁的命令(例如,A表示末尾追加)来编辑文本,vim可以在您按键的下一行重复相同的操作.
vdboor'4

48

gi

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

^ P和^ N

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

^ O和^ I

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


4
@ Kungi`。将您带到最后一个编辑``将您带回到上一个'跳转'之前的位置-/ might /也是最后一个编辑的位置。
格兰特·麦克莱恩


42

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


19
...和CTRL-X减量。
innaM

9
这是一个简洁的捷径,但到目前为止,我从未发现它有任何用途。
SolutionYogi'2

8
如果您在屏幕上运行vim并想知道为什么这不起作用
-ctrl

13
@SolutionYogi:考虑您要在每行的开头添加行号。解决方案:ggI1 <space> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42 2010年

10
对于Vimperator极其有用,它可以递增(或递减,Ctrl-X)URL中的最后一个数字。有用的过程图像画廊等快速冲浪
blueyed

38

全部在普通模式下:

f <char>移至当前行中特定字符的下一个实例,以及; 重复。

F <char>移至当前行上特定字符的先前实例重复。

如果明智地使用,则以上两项可以使您快速地沿线移动。

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

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


6
哇,我不知道*和#(在光标下向前/向后搜索单词)绑定。挺酷的。f / F和t / T以及; 命令可以快速跳转到当前行上的字符。f / F将光标置于所指示的字符上,而t / T则将光标恰好位于该字符上(根据所选方向恰好在该字符之前或之后的字符。;仅重复最近的f / F / t / T跳(朝同一方向)
吉姆·丹尼斯

10
:)在vim.org的提示页面顶部的标语:“如果我只及时知道“ *”命令,您能想象可以保存多少个击键?”
-Juergen

1
正如Jim所提到的,“ t / T”组合通常也一样好,即使不是更好,例如,它ct(会删除单词并将您置于插入模式,但请保持括号!
puk 2012年

34

届会

一个。保存会议

:mks 会话名称

b。强制保存会话

:mks!会话名称

C。加载会话

gvim或vim -S 会话名


加减法

一个。加减法

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

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

b。窗口键解映射

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

C。带宏

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

  1. 创建第一个列表项,确保它以数字开头。
  2. qa-开始记录到缓冲区“ a”
  3. Y-拉入条目
  4. p-将条目的副本放在第一个条目的下方
  5. CTRL-A-增加数字
  6. q-停止录制
  7. @a-重复拉动,放置和增加时间

1
知道Windows中的快捷方式是什么吗?
唐·雷巴

32

上周工作时,我们的项目从另一个项目继承了许多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之类的脚本语言将其自动化,但是编写起来将花费更长的时间,而且灵活性较差-最后一个示例非常困难,因为仅regex无法处理嵌套括号,例如转换bar(foo(xxx))foo(xxx).bar()。Vim非常适合该任务。


1
非常感谢您的分享,从“有用的而不是经典的”宏中学到的东西真是太好了。
奥利维尔·庞斯

%s/\(bar\)(\(.\+\))/\2.\1()/也会这样做。(转义与兼容:set magic。)仅供参考。:)
Ipsquiggle 2010年

1
如果您不喜欢vim风格的转义%s/\v(bar)\((.+)\)/\2.\1()/

@lpsquiggle:您的建议不会处理带有多于一组括号的复杂表达式。例如 if bar(foo(xxx)) or wibble(xxx): 变得 if foo(xxx)) or wibble(xxx.bar(): 完全错误。
戴夫·柯比

28

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

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

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

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

1
我一直认为大多数东西的默认浏览方法有点烂。如果您知道要去哪里,浏览起来就很慢。vim.org脚本部分的LustyExplorer是急需的改进。
Svend

您的第二个映射可能更简单:映射<silent> <S-F8>:Sexplore <CR>
Taurus Olson 2009年

8
我建议使用NERDtree而不是内置的资源管理器。它改变了我在项目中使用vim的方式,使我的工作效率更高。只是谷歌它。
kprobst'4

我从来没有感觉到需要探索源代码树,我只是使用:find:tag以及各种相关的击键来跳转。(也许这是因为我从事的源代码树很大并且组织得与我做的有所不同?:))
dash-tom-bang

25

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

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

当使用这些数独时,我使用vi,这仅仅是因为我正在使用vi具有其他编辑器所没有的功能。通常是在将带字母的网格转换为带编号的网格时,因为我发现它更容易解决,然后将完整的带编号的网格重新带回到带字母的网格中以查找解词。

该问题的格式为9组,每组9个字母,其中-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教程书,网站,帮助文件等能做的事情远不止可能。


令人不安的是,某些发行版(例如ubuntu)的别名从“ vi”到“ vim”,因此人们不会真正看到vi。优秀的例子,必须尝试... +1
hhh

1
vim是否不检查其开头的名称,以便它可以以正确的“模式”出现?
dash-tom-bang

3
我对这个重复的错误感到困惑:您说您需要:进入命令模式,但是总是指定正常模式命令(例如y}}p),该命令可能无法在命令模式下工作?!
sehe 2012年

我对独特的chars挑战的看法是:(:se tw=1 fo=准备)VG:s/./& /g(插入空格),gvgq(分割成单独的行),V{:sort u(排序和删除重复项)
2012年

23

大量文字操作!

通过宏:

  • 从记录开始: qq
  • 做东西
  • 停止录制: q
  • 重复:(@q第一次),@@之后。
  • 重复20次: 20@@

或通过正则表达式:

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

(但要警告:如果您选择后者,则会遇到两个问题:)。


5
+1供Jamie Zawinski参考。(即使没有链接,也不会收回任何分数)。:)
Jim Dennis 2010年

1
@Jim我什至都不知道这是Jamie Zawinski的名言:)。从现在开始,我将尽力记住它。
jqno 2010年

我发现下面的技巧越来越有用......在您想加入行案件匹配(或不匹配)的一些模式上一行: :% g/foo/-1j:'a,'z v/bar/-1j例如(其中前者是“所有线路和匹配模式”而后者是“标记a和标记z之间的线与模式不匹配”​​)。gvex命令中的模式后面的部分可以是任何其他命令,-1j只是相对行移动和连接命令。
吉姆·丹尼斯

当然,如果您将宏命名为“ 2”,那么当需要使用它时,您甚至不必将手指从“ @”键移至“ q”键。每次都可能节省50到100毫秒。= P
JustJeff

@JustJeff完全取决于您的键盘布局,我的@键位于我的2键的键盘另一侧。
西蒙·斯蒂尔

23

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

请参阅参考资料,:help q:以获取更多有趣的来回信息。


22

前几天,我刚刚发现Vim的功能不全,尽管我承认我对该功能有些朦胧,但在插入模式下混搭Ctrl+ x Ctrl+ uCtrl+ n/ Ctrl+ p时,我取得了令人惊讶的好结果。它还不是IntelliSense,但我仍在学习。

试试看! :help ins-completion


20

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

  1. 使大写锁定额外的ESC(或Ctrl)
  2. 使用以下命令将地图领导者定位为“,”(逗号):let mapleader =“,”

他们提高了我的生产力。


嘿关于“ \”的好提示!键入“,”要比“ \”好得多。
奥利维尔·庞斯

2
为了让Caps Lock键在Windows附加Esc键(?什么是大写锁定为一个“任意键”键),试试这个:web.archive.org/web/20100418005858/http://webpages.charter.net/...
R.Martinho Fernandes'4

在Mac上,你需要PCKeyboardHack -在细节superuser.com/questions/34223/...
汤姆-莫里斯

1
在Windows上,我将AutoHotKey与Capslock::Escape
Jeromy Anglim

19

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


3
Xp走另一条路
测试人员

5
在Windows XP出现的那段时间,我经常开玩笑说这是唯一的好用法。
kguest

18

<Ctrl> + W,V垂直拆分屏幕
<Ctrl> + W,W在窗口之间切换

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

可视模式下的ZF可以折叠任意线


2
<Ctrl> + W和j / k将让您进行绝对导航(与正常vim一样,向上,向下滚动)。当您进行3次以上拆分时,这很棒。
Andrew Scagnelli

1
在可视模式下为zf +1,我喜欢代码折叠,但对此一无所知。
coder_tim 2012年

2
击打键盘后,我推断出是<C-w>n还是<C-w>s新的水平窗口,<C-w>b是右下窗口,<C-w>c或者<C-w>q是关闭窗口,<C-w>x是增加然后减小窗口宽度(??),<C-w>p是最后一个窗口,<C-w>backspace是向左移动(ish)窗口
puk

:help ctrl-wFTW ...帮自己一个忙,强迫自己尝试至少15分钟!
sjas 2012年

18

视觉模式

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

与吉姆·丹尼斯(Jim Dennis)在vi中剪切/复制/粘贴的描述相比,vim的可视模式的优势在于,您不必完全正确地放置位置。有时,使用快速动作到达您想去的大致区域,然后再用其他动作进行优化比想出一个更复杂的单动作命令来准确地将您想去的地方更有效。

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

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

有效使用键盘

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

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

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

在Emacs上

为了避免emacs狂热者由于最后的括号注释而完全无视我的整个帖子,我觉得我必须描述emacs和vim宗教之间差异的根源。我从没在编辑大战中大声疾呼,也可能不会再做,但我从未听说有人用这种方式描述差异,所以就这样。区别在于以下权衡:

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

盲目的vim狂热者会声称vim具有脚本语言。但这是一种晦涩的特殊语言,旨在为编辑人员提供服务。Emacs有Lisp!说够了。如果您不理解最后两个句子的重要性,或者想了解足够的关于函数式编程和Lisp的知识以发展这种欣赏,那么您应该使用vim。

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

我认为这些差异是正交的。我相信vim和emacs的好处如我所说,都是有效的。这意味着最终的编辑器还不存在。emacs可能是最终编辑器最简单的平台。但是模态编辑并没有根植于emacs的思维模式中。emacs社区将来可能会以这种方式发展,但这似乎不太可能。

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


17

花30分钟做vim教程(在终端中运行vimtutor而不是vim)。您将学习基本的动作和一些按键,这将使您至少像以前使用的文本编辑器一样,使vim的工作效率更高。之后,再次阅读吉姆·丹尼斯(Jim Dennis)的答案:)


1
这是我在阅读OP时想到的第一件事。显然,海报从未如此运行过。我在两年前第一次学习vim时就经历了它,并牢记了Vim在我使用过的其他任何编辑器中的优越性(对我来说,包括Emacs,因为关键组合很讨厌在Mac上使用) 。
dash-tom-bang

16

与现代编辑器相比,使用Vim的哪种方法可以提高您的工作效率?

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

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


16

使用\c任何地方进行搜索,忽略大小写(重写你的忽略大小写或智能大小写设置)。例如,/\cfoo/foo\c将匹配fooFoofOOFOO,等。

使用\C在搜索力情况匹配任何地方。例如/\Cfoo/foo\C仅会匹配foo。



16

奇怪的是没有人提到ctags。下载“旺盛的ctags”,并将其放在搜索路径中已经存在的the脚的预装版本之前。将CD复制到您正在处理的所有内容的根目录中;例如Android内核发行版。键入“ ctags -R”。在名为“ tags”的文件中该目录下任何位置的源文件建立索引。它在一个文件中包含所有标签,语言以及目录中的位置,因此跨语言工作很容易。

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

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

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


14

自动缩进:

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

您需要在文件中添加“文件类型插件缩进” .vimrc,并可能需要适当的“ shiftwidth”和“ expandtab”设置。


4
或者只是使用自开始以来就已经存在的“:set ai”(自动缩进)功能。
xcramps

14

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

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

您投入vim的所有投资将返还一千倍。在死亡之前,您将要在文本编辑器中呆很多很多小时。Vim将成为您的伴侣。


13

多个缓冲区,尤其是它们之间的快速跳转,用于比较与:bp和的两个文件:bn(正确地映射为单个Shift+ pShift+ n

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

Ctrl+的区域复制v

最后,标识符的制表符完成(搜索“ mosh_tab_or_complete”)。那是改变生活的人。


12

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

我最经常使用它来“粘贴”事物:

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

这样我不必摆弄:set paste


3
最好将clipboard选项设置为unnamedset clipboard=unnamed.vimrc中的)以默认使用系统剪贴板。或者,如果您仍然希望系统剪贴板与未命名的寄存器分开,请使用适当命名的剪贴板寄存器:"*p
R. Martinho Fernandes'4

2
爱它!在从网络上粘贴代码示例激怒之后,我才刚刚开始精通vim。那是我当场梦dream以求的命令。这是vim完全吸引我的时候。
kevpie 2010年

如果您在Mac上进行开发,请使用系统剪贴板复制和粘贴Command + C和Command + V,而无需重新映射。
本·莫迪凯

仅适用于GVIm…从控制台,:set paste如果启用了自动缩进,则不进行粘贴将无法很好地进行。
David Wolever
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.