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

我听说过很多有关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 的哪种方法可以提高您的工作效率?

答案

Vim 的问题是您不喜欢vi

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

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

这也可以表示为dd P (删除当前行,然后将副本粘贴回原处;作为副作用,将副本保留在匿名寄存器中)。 yd “动词” 将任何运动作为其 “主题”。因此, yW是 “从此处(光标)到当前 / 下一个(大)单词的y'a ”,而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 次击键开销(六个。如果我们在 “插入” 模式启动,需要Esc 键退出命令模式)一旦我们剪切或复制,然后在复制粘贴是一个按键: p

我说这是剪切或复制文本的一种方法。但是,它只是众多之一。通常,我们可以更简洁地描述文本的范围,而无需在光标周围移动和放置标记。例如,如果我在文本的段落中,则可以分别使用{}移动到段落的开头或结尾。因此,要移动一段文字,我使用{ d} (3 个击键)将其剪切了。 (如果我碰巧已经在段落的第一行或最后一行,则可以分别分别使用d}d{

“段落” 的概念默认情况下通常是直观上合理的。因此,它既适用于代码,也适用于散文。

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

除 “动词” 和 “主语” 外, vi还具有 “宾语”(在语法意义上)。到目前为止,我仅描述了匿名寄存器的用法。不过,可以通过前缀与 “对象” 参考使用任何的 26“命名为” 寄存器" (双引号改性剂)。因此,如果我使用"add我切割当前行进的‘a’寄存器,并且如果我用"by/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则将此类命令应用于与给定模式不匹配的所有行(“v “来自 “ conVerse”)。与其他ex命令一样,这些命令可以通过寻址 / 范围引用作为前缀。因此:.,+21g/foo/d意思是 “将包含字符串 “ foo” 的任何行从当前行删除到接下来的 21 行”,而:.,$v/bar/d意思是 “从此处到末尾。文件,删除任何不包含字符串 “ bar” 的行。

有趣的是,常见的 Unix 命令grep实际上是受此ex命令启发的(并以其记录方式命名)。 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,'ag/foo'/d (将文件复制到自己的尾部,通过grep过滤尾部,然后删除所有内容从头)。

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

几乎不用说,您可以在gv (全局 / 逆全局)命令中使用我们的老朋友s (代替)。通常您不需要这样做。但是,考虑某些情况,您只想在与某些其他模式匹配的行上执行替换。通常,您可以对捕获使用复杂的模式,并使用向后引用保留不想更改的行部分。但是,将匹配与替换分开通常会更容易:% g/foo/s/bar/zzz/g对于包含 “foo” 的每一行,将所有 “bar” 替换为 “zzz”。 (诸如:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g方法仅适用于 “bar” 实例被 “foo” 阻止的情况)同一行;它已经足够笨拙了,必须进行进一步的处理才能捕获 “bar” 在 “foo” 之前的所有情况)

关键是ex命令集中不仅有psd行。

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

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

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

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

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

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

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

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

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

通常,使用 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的力量比我用过的要多得多。

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

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

请考虑以下常见情况:

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

您可以这样做:

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

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

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

您要选择一个花括号块(在 C 样式语言中非常常见):

  • viB
  • vi{

您要选择整个文件:

  • ggVG

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

一些生产力提示:

智能机芯

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

快速编辑命令

  • I在开始时插入。
  • A追加结束。
  • o / O在当前值之后 / 之前打开新行。
  • v / V / Ctrl+V可视模式(选择文本!)
  • Shift+R替换文字
  • C更改行的剩余部分。

组合命令

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

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

有用的程序员命令

  • r替换一个字符(例如rdd替换当前 char)。
  • ~更改大小写。
  • 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 中起作用,我想在此处突出显示适当的语法)。

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

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

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

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

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 的智能感知,但这是迈出的一大步,并带来了您希望通过制表符完成工具获得的大量功能。

协同病毒

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

逃犯

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

nerdtree.vim

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

FuzzyFinderTextmate.vim

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

结论

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

谢谢

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

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

我节省了很多时间。

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

gi

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

^ P 和 ^ N

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

^ O 和 ^ I

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

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

这是很新的,真的非常好。运行该网站的人从 textmate 切换到了 vim,并主持了针对特定 vim 主题的非常简洁的演员表。一探究竟!

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

全部在普通模式下:

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

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

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

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

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