我听说过很多关于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的哪些方式使您的工作效率更高?


当前回答

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

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

可以使用以下命令:

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

cT<identifier>用于反向切割。

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

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

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

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

快速删除一行的部分:

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

Dt <identifier>用于前向删除

dT<identifier>用于反向删除

希望这对你也有用。

其他回答

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代替。

维姆插件

这里有很多很好的答案,其中一个关于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配置,从中我学到了很多,并借鉴了这里列出的大部分插件。

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

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

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

在代码中插入文本:

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

上周在工作中,我们的项目从另一个项目继承了大量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非常适合这项任务。