用 Tmux 和 Vim 打造 IDE
| 2015-06-23 10:17 收藏: 8
我的一个朋友在参观一个办公室时发现其雇员都在使用 tmux 和 vim 工具来开发 Ruby 项目。他很好奇为什么人们宁可放弃鼠标输入的便利而选择使用控制台版本的 vim 进行工作。
最终我发现这个是一个非常好的工作方式。起初使用控制台 vim 强迫我去正确地学习 vim 快捷键(motion commands)。结合盲打后,vim 提供了在多文件以及多代码行跳转的强大指令,这无疑比使用鼠标更加高效。
我习惯于将终端工具与代码编辑器平铺在一起。在 web 开发工作通常需要一个控制台用于输入 ad-hoc 命令,一个控制台操作数据库,以及一个控制台查看日志。同时我的一些项目还会使用测试工具来对有修订的文件进行自动化测试,因此我也希望同时能看到这些测试执行的状态。
vim 提供了很多插件可以将上述功能集成在一起,但我更喜欢 vim/tmux 这个组合。这是个可视化的操作工具。
通用这种方式使用命令行工具,我们可以高效地打造一个轻量级、可定制化 IDE 。我还发现在 tmux 的多个控制台窗格(pane)中输入 Unix 命令的方式很好用,因为这种方式可以很容易地将命令结合起来从而提供复杂的脚本化操作,而不需要臃肿的IDE工具。
这种使用方法与使用传统的IDE的区别在于其提供的界面非常契合我当下的工作,且它仅受限于我所安装命令行工具以及脚本语言。我可以按需创建 tmux 窗格(pane)以及 vim 分割(split)窗口,而不要开发什么模板。尽管 Eclipse 和 Xocde 有提供一些以任务为中心( task-foruce) 的界面,我还是觉得这些有些碍事。尤其是 Xcode,它所提供的快捷键感觉像是后面才补上去的,我还是得不停地使用鼠标进行操作。
支持任务间快速切换则是另一个优点。我是一个自由职业者,通常一天中我需要在 3、4 个项目间进行切换。在使用 tmux 之后, 我可以先断开(detach)一个会话稍后再切回来继续,这使我能够专注于当前工作。我觉得这个是控制台 vim 工具相比于 GUI vim 或是同时开一堆控制台工作而言的一个极大优势,因为 Eclipse 以及 Xcode 总是在关闭工程时尝试保存界面状态(不过最新的版本的 Xcode 在关闭工程貌似总是将我打开的分割窗口关闭掉)。
为什么使用 hjkl 键
这种操作方式看起来可能很别扭,不过如果你能够熟练地盲打,vim 和 tmux (配置成 vim 键风格)可以很容易让手指远离鼠标而只保持在键盘主键区(home row)进行操作。(译者注:home row 指的是键盘上的 “A、S、D、F、J、K、L、;” 这 8 个按键。)
这正是 hjkl 键的秘密:对于哪些盲打正确率高的人而言。 对于那些不习惯使用这些按键的人,可以先慢慢尝试几天。并先专注于打字的正确性,充分利用好你的十个手指。
使用 hjkl 键的道理让我想起说服游戏初学者去使用 wasd 键而不使用方向键情况。 起初 wasd 的确会觉得不太直观,但这使得同时使用键盘以及鼠标操作变得更加容易。当适应这种操作方式之后,其优点是显而易见的。
配置提示
我在 ~/.tmux.conf 文件中做了如下的配置:
set-window-option -g mode-keys vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
这个能让我在 tmux 中使用 vim 的快捷键。
如果你正在努力掌握 vim 的快捷键,请在 vim 的编辑模式下关闭方向键,具体可以参考:Vim: Making those Arrow Keys Work With You 。
如果你是个 vim 新手,这里值得一提的是 vim 支持 ctags。同时还有 TagHighlight 插件可以在 pane 中动态地显示当前文件编辑缓存区的多个标签(tags),这是个类似于 IDE 的功能。
Dotfiles文件
你的 IDE 配置文件是否能够在多台电脑间同步?
我有一个名为 dotfiles 的私个 git 库,专门用于存储 vim 和 ctags 配置以及插件。我写了一个安装脚本用于自动为本地 dotfiles 库创建配置文件的符号链接。一旦我使用一台新电脑时,我首先做的是检出(check out)这个 git 库。之后当我再开项目进行编辑时,vim 和 tmux 就已按我习惯的使用方式配置好了。
拷贝与粘贴
我经常需要使用 tmux 的拷贝与粘贴命令将控制台的输出拷贝到 vim 中。基于 tmux 的不同配置,快捷键有很大差异,因此非常值得去阅读一下 tmux 的手册并了解其工作原理。默认是使用 “ctrl-b [" 进入拷贝模式,使用空格键(space)开始内容选取,回车键(Enter)进行拷贝,然后使用 "ctrl-b ]” 进行粘贴。
快捷键
如果想要高效地使用 vim,对于重度依赖键盘的操作一定要思考是否有相关的快捷键。举个例子,当我第一次使用 ~ 快捷键时(用于大小写转换),我觉得“这个真是搞笑了,我肯定再不会使用它”。哈,实际上在我写这篇文章时,我已经使用三次了。
我之后找到了使用快捷键的窍门,因为我注意到一些有经验的 vim 使用者都在尽可能地避免使用编辑模式(insert mode)。因此一定要多看看 vim 的帮助手册,之后你就会发现居然有这么多好方法可以改进你的编辑技能。