希望大家早点知道的Vim技巧

从2009年开始Vim一直是我主要(并且是唯一的)文本编辑器。这几年,我发现了许多希望当初能早点知道的Vim技巧,因为他们显著改善了我的文本编辑效率。在这片博文中,我想和你们分享最重要的几点。

“不要使用方向键,使用h/j/k/l替代!”通常是给Vim新手的第一条建议。很长一段时间我忽略了它因为这似乎对我有些荒唐。我到底为什么需要那么做?终于有一天我决定尝试一番。从那以后,再也没有回过头。我用了许多天来习惯,当我习惯后,我惊讶于我所失去的。h/j/k/l键在本列位,你不必过多移动你的手。这不仅帮助我移动得更快,而且让我的手更加放松。我相信这是我的腕部疼痛消失的原因之一。另一个是我在手下放了一个腕垫。

如果你想使用h/j/k/l代替方向键,我建议要么禁用,要么重映射为更有用的键。另一个不用方向键的好处是你会习惯更好的移动命令,如f/F/t/T, w/W/b/B, 0/^/$,或查找。使用这些命令使得你比单纯的使用方向键或h/j/k/l移动得更快。在Vim里揪住一个键不放是反面模式。

相对行号

和许多使用者一样,我使用绝对行号因为所有编辑者都这么用。直到一天我看到这个文章,让我陷入思考。万一相对行号更好呢?我决定尝试一下。结果和Ben在这个视频中说的一样,我意识到用绝对行号的生活是一个谎言。相对行号才是使用Vim的正确方式。

我建议在你的.vimrc中输入以下组合来使用相对行号:

set number
set relativenumber

他们一起使Vim显示当前行的绝对行号和其他行的相对行号。

接下来,让我阐述相对行号的用处。在Vim中,很多命令可以前缀数字。例如,移动到当前行的后10行你可以使用10j。移动到当前行的前4行,使用4k。缩进当前行和后两行使用>2j。你懂的。使用相对行号,你单纯地看其他行有多远。如果你使用绝对行号,需要口算减2(可能很大)的数字得出之间的行数。相对行号的使用减少了心算的必要。

尽管如此,你仍然可以使用绝对行号。例如,当你编译一个源代码,编译器告诉你943行有语法错误,你可以通过键入943G 或 :943去到这一行。

Vim一个非常有用的特性是你可以将它设置成虚拟长行回绕。许多使用者包括我,将j/k映射成gj/gk,使j/k按虚拟行移动而不是实际行。但是这种重映射打破了上述的计数功能。使用下面的映射作为弥补,基于stackoverflow.com的博文。
noremapj (v:count == 0 ? 'gj' : 'j')
noremapk (v:count == 0 ? 'gk' : 'k')
这使得gj/gk在没有计数的时候按虚拟行移动,有计数的时候按实际行移动。这和相对行数是绝配。

Vim和Tmux

很长一段时间,我用GVim代替了终端Vim。它看起来更好,如整合更好的窗口环境等。之后,我发现了Tmux,它显著改善了我的工作流。简而言之,它允许你在一个终端窗口中拥有分离的终端会话。在每一个会话中你可以拥有多窗口,每一个窗口可以被分离成多个方框。戳截图,一窥究竟。

使用Tmux使我陷入一个困境。如何与GVim一起使用?TMux是一个终端应用而GVim是一个独立的GUI应用。幸运的是,我能将Vim设置的看起来和GVim几乎一模一样。最有用的插件是CSApprox。它使我的GVim独有的颜色主题在终端Vim上看起来像透明的一样。看看我的.vimrc其他设置是如何帮助我过渡到终端Vim。

Tmux+Vim的组合带来的最大优势是使得你可以在一个终端里执行所有开发。这允许你,比如,ssh到一个远端服务器并在那开发。你可以无缝地从其他地方继续工作,即使是一个不同的电脑,因为你通过SSH在一个远端机器上工作。另一个好处是开发服务器一般比笔记本和桌面电脑快很多。取决于你公司的预算,你可能在一个多cpu大内存的机器上开发。这样的经历使得你绝对不想再回到自己的工作机上。

如果你还没有用过TMux,我劝你至少试一下。它是一个极好的工具。为了帮助你更好的开始,我在这里描述了我的Tmux配置。告诉你,你也许会找到一些很好的加速你工作流的调整。例如,文章描述了一种Vim和Tmux之间的无缝导航方式。

操作和移动

Vim的一个独有特性是你感觉像是可以通过一种语言和它对话。例如,类动词d(delete删除)或y(yank复制),名词像b(brackets括号)或s(sentence句子),还有类形容词像i(inside/inner内部的)或a(a/all/around全部/附近)。你可以自由组合,所以dib会删除括号内所有文本,yap会复制当前段落。在你学会了这门简单的语言后,你从不需要记住删除一个段落怎么做:简单输入dap,无需考虑。许多人认为Vim很难得原因是他们不习惯这么思考他们的编辑器。

锦上添花的部分是Vim语言是可扩展的。实际上,你可以创建自己的动词和名词(Vim类操作和移动/文本对象)。日常中有一些非常有用的插件,如下所述。

操作

1、tcomment-vim -添加代码注释/取消注释操作:gc。例如,使用gcap注掉当前段落。把它想成是(gcap首字母)注掉一段。注释当前和后5行,使用gc5j(感谢相对行号!)

2、vim-sort-motion -添加排序操作:gs.例如,使用gsip排序当前光标的Python导入包。把它想成是去给内部段落排序(gsip首字母)

3、ReplaceWithRegister -添加替换操作:gr。它允许你不需要重写寄存器中排序好的其他文本进行文本替换。例如,用默认寄存器内容替换当前词,使用griw。把它想成是去替换内部词。gr操作也可以和 .命令(.命令重复上一个操作)更好的配合。这是我最喜欢的操作之一。

移动/文本对象
1、targets.vim -添加许多有用的文本对象。例如,daa删除一个函数调用参数,ci$ 改变美元符之间的文本(在LaTeX中非常有用)。这个插件的另一个特性是允许你不直接在文本对象中时使用它们。例如,删除最近双引号中的文本,使用di”(删除内部引用)。

2、vim-indent-object-允许你对当前缩进水平施加操作。例如,将当前块移动到左边,使用<ii(左移内部缩进)。这在使用空白符代替大括号构造代码的python中非常有用。

3、vim-surround -允许你操作周围事物。例如, cs"' 改变附近双引号为单引号,dsb删除附近小括号。

当然,你可以结合上述插件的操作和移动。例如,给每一个元素在独立行的Python列表排序,使用gsii(排序内部缩进)
一些简单的文本对象可以不需要插件定义。例如,操作整个文件在你的.vimrc中输入:
onoremap af :normal! ggVG

然后,使用yaf(复制一个文件)复制整个文件内容(更准确的说,整个缓存)。

模糊查询
在Vim中打开文件,你可以相应的在当前缓冲区或新标签上使用edit 或 tabnew 。这有一点不好的地方是当你在一个拥有嵌套目录和文件的大型项目中时特别慢。例如,要编辑 frontend/scripts/js/view/viewer.js这个文件你需要输入整个路径。

嗯… 需要更好的办法…

幸运的是,有!可以使用模糊查询,例如Command-T.它允许你简单地开始查询器(如键入 ,t)编辑上面的文件,键入fsviewer (f和s是部分文件路

径),在当前缓冲区、一个拆分的或新标签中打开文件。一旦你知道工程中文件名的分级,模糊查询器的使用可以极大提高文件打开的速度。

正则匹配
你经常想要列出所有包含给定词组或单词的文件,如一个函数名。当我开始使用Vim时,我会切换到终端输入gvim grep -r FUNC | cut -d: -f1 来打开GVim中找到的文件。但是,为什么要离开Vim去做这么一件简单的任务?

你可以使用Vim内置的grep命令,或者使用更高级的插件,例如 vim-grepper.它允许你选择一个搜索工具(grep, git grep,甚至ag)并选择如何呈现结果。例如,你可以设置一个映射 ,/ 在所有文件中查询某个词组,或者 ,* 执行光标下单词的工程内查询。待查询完成后,它打开一个查询结果窗口,你可以直接在你当前工作Vim实例中打开它们。

Vim作为外部文本编辑器
当你使用一个文本编辑器时,尽可能多的尝试使用它很重要。毕竟当你已经知道Vim时为什么要学习另一个编辑器,如web上的textarea?随处使用Vim允许你利用之前你无法想象的力量和特性。

比如,Firefox有一个很好的插件叫It’s All Text!,允许你在Vim中编辑textarea元素。通过使用你喜欢的编辑器,促进了wiki页面编辑,写博客,创建bug报告等。对Vim来说,这意味着你可以利用文本高亮、拼写检查、字典补全,代码片段或任何其他特性。

对于Thunderbird来说,也有一个叫 It’s All Text! 的插件。可以帮助你比使用内置的编辑器更舒适更快地写email。

许多终端应用也支持Vim作为外部编辑器。比如,你可以设置 Midnight Commander 在Vim中打开文件。另一个Vim的有用之处是在版本控制系统中写提交消息,如Git。是否厌倦了打错别字?打开Vim的拼写检查。想使用 Ctrl+n补全提交差异词吗?用 –verbose 参数提交。它会复制整个差异到Vim以便于你可以使用补全,如函数名。写提交消息从未如此简单。

我想说的最后一个Firefox插件是 Vimperator.它让浏览器成为Vim,允许你即使在浏览网页时也可以使用Vim准则。比如,你可以快速打开连接,复制文本,或者在页面上制作标记并在之后回到这些标记,而无须动你的鼠标。Vimperator甚至让你在一个类似.vimrc的文件中配置Firefox。这是我的。

运行外部命令
想象下你正在写Python代码,你想在当前编辑文件中运行单元测试,或者你在写一个LaTeX文档,想编译看看结果。一个方法是到一个终端运行测试或编译。但这不是非常高效因为它造成了工作流的推迟。
一个更好的方式是利用可以直接从Vim运行外部命令的事实。比如,下面的自动命令允许你简单的按下F9保存并运行当前编辑好的Python单元测试。
au FileType python nnoremap:wa:!clear; nosetests %

另一个在Tmux中运行Vim时非常有用的特性是在给定的Tmux窗口中运行外部命令的可能。比如,可以将你当前Tmux窗口拆分成两个方框,在一个编辑文件,第二个运行测试,无需来回切换。给你领略下我的工作流,我喜欢做下面的事。使用一个双显示器装置。一个工程,我用两个Tmux会话打开两个终端。其中一个放在第一个显示器,另一个放在第二个显示器。在第一个Tmux会话中,我编辑代码,当我想运行测试时,生成文档,或者通过 lint-like 工具检查代码,我从Vim向第二个Tmux会话发送一个命令,测试就会在第二个显示器上运行。为了切换两个显示器的焦点,我配置了 Fluxbox 来使用 Ctrl+Alt+h/l.见我的配置文件。最好的部分?是甚至在我通过SSH的远程服务器上运行的Tmux也能行。

配置选项和映射
Vim是高扩展的。你可以任意配置你喜欢的,添加使用频繁的动作映射和命令。几年来我的.vimrc包含了许多有用的设置和映射。你可以在下面找到其中一些。但我还是鼓励你到我的.vimrc看看所有的配置。

快速选中粘贴文本。这允许你例如,粘贴后缩进。

缩进时保持虚拟模式。你永远不需要在缩进后运行gv.

让Y复制光标当前位置到行末。这使得Y看起来像C或D因为Y默认复制当前行。(如,同yy)

让Ctrl-e在插入模式跳到当前行末。当你在行中想去到行末却又不想切换到普通模式时很方便。

允许你简单地替换当前所有词。

允许你简单地替换当前词为其他词。同上面的映射的区别在于下面的映射为你预填充要改变的词。

Tab替换4个空格。当你复制这个映射到你的.vimrc时确保第一对反斜杠之间有一个tab。

移除所编辑文件的ANSI颜色转义码。这在将彩色文本传输到Vim时很方便。
参数包裹
最后但同样重要的是,我想提下vim-argwrap 插件。它允许你快速包裹、解包函数参数,列表和字典。例如,它允许你转换
decompiler = Decompiler(api_url=args.api_url, api_key=args.api_key)

decompiler = Decompiler(
api_url=args.api_url,
api_key=args.api_key
)

反之亦然。

原文:Things About Vim I Wish I Knew Earlier

译者:杰微刊兼职翻译刘晓冬

4 Likes

你目前的身份是游客,评论请输入昵称和电邮!