# 使用鼠标可以提升编程效率吗?

# 引言

当听到 "纯键盘操作" 的时候,恐怕不少人会嗤之于鼻,甚至会觉得奉行这一理念的人是古怪 的 Vim/Emacs nerd,以用键盘敲出来 g/re/p 这种又长又臭的咒语为荣。

这是完全的偏见。我可以说 Emacs 里有各种 IDE 都难以媲美的鼠标编程操作体验--在 Emacs 的『任何操作都是可执行的函数』的设计理念下,你可以为鼠标绑定任何你可以在键盘上执 行的操作。在这么强大的鼠标支持下,大部份的 Emacs 用户却不约而同地选择了全键盘导向 操作,其中必然有道理。

本文试图通过分析读者解答全键盘导向的操作在编程工作中的优点和鼠标的劣势。值得注意的是, 我的论点更多基于自己的编程经验进行的分析,而非列举大量统计数据;事实上,这种数据 往往充满个人差异而难以提供参考价值。如果你感觉我是在胡说八道,请记住,your milage may very very vary 😛.

# 编程时我们究竟在做什么?

部分赞同鼠标编辑可以提高效率的人可能持有这种论点:『编辑器的鼠标操作可以设计得像 Photoshop,Zbrush 的计算机图形软件那样灵活高效。』借这个论点,我们首先来思考一下 一个人编程时需要的是什么。

不得不说在很久很久以前,我也是个电子视觉艺术VFX爱好者,直 到我成为了一名 Lisp 用户Believer。在我的心目中 VFX 和编程都是 一种美丽的艺术,然而这两种艺术的创作过程却大相径庭,不能把视觉艺术创造的经验生搬 硬套到编程中。

视觉艺术类的创作,灵感往往是天启式出现的。你可能长达好几天脑海中没有任何可能的创 作线索,可能在暴雨中的半夜惊醒,在闪烁的灵光指引下创作出令人惊叹的艺术品。因此, 艺术家们需要各种不同效果立杆见影的反馈,从这些反馈碰撞出来的火花中寻找灵感。

然而,编程的灵感,往往来自于对程序的反复琢磨与挣扎中。比起 VFX 创作,编程更类似于 写文章,每字每句都需要反复精炼和推敲,才能写出来最好的文章。我喜欢这样比喻,编程 就像一个就要渴死的人面对着一个严重生锈的水龙头,拼命敲打才勉强能出来一点水......

受限制于大多数编程语言的基础设施,像艺术家一样的探索式编程体验是很难有的[1],令 一方面,编程中往往需要处理与现实世界的交互--读取数据库,创立网络请求等。这些要 打破沙箱的副作用无疑增加了交互式编程的难度[2]。更多的时候,编程人员是把程序的模 型放在人脑中模拟运行,用大脑做『人肉静态分析』。这种脑内程序模型的建构和维持需要 耗费大量心智和脑力,但是其本身十分脆弱,受到轻微的打扰就有可能被破坏。

我们常开玩笑道:『打字慢的程序员不是好程序员。』我觉得正确的表述应该是『打字不流 畅的程序员不是好程序员。』因为打字不流畅意味着你的思考回路不通顺,思考间缺乏逻辑 关联。脑子混沌一片的程序员又怎么能写出正确无误的程序呢?

在编程作业中,最好的操作应当是『没有操作』。能自动的决不手动,要手动的除了基本的 打字以外,其他任何操作都应该尽可能无意识化,交给手指的肌肉记忆来处理。别忘了任何 操作都是为了更好地写出来程序而服务的,如果你连程序都写不出来,醉心于各种操作,那 不是舍本逐末吗?

# 鼠标不适合承担复杂的功能

在确立了『尽可能减轻编程时操作的思维负担』这一宗旨后。我们不得不面对一个严竣的真 相:几乎所有程序的编写,都是用键盘录入字符串,再由编译器 / 解释器『翻译』给计算机, 变成可以执行的程序…… 单凭这一点,就几乎可以判鼠标死刑。想想你打字打到一半,突然想 看看某个函数的定义,于是你双手离开键盘,拿起鼠标。找到那个函数…… 等等,我想找哪一 个函数来着?

为了使下面的讨论成立,我们暂且忽视手在键盘和鼠标间反复移动产生的思维『开销』,而 且假设使用鼠标是为了执行打字以外的上层编辑命令(如快速注释,查找定义等)。

先来分析下鼠标的构成对于市面上最常见的三键鼠标,一般由左右两键,中间一个滚轮,下 方一个发射激光定位的激光发生器。因此可以组合成下列几种操作:

  • 移动
  • 三键点击
  • 拖拽
  • 滚动滚轮

除去基本的移动鼠标定位,我们能做的就只剩下点击鼠标按键。然而鼠标上的按键是有限的, 想想在你每天的编程任务里,经常用到的高级指令有哪些呢?恐怕远远超过三个。

上一节里我提到过,最好的操作是『没有操作』。除了常年累月训练的肌肉记忆,另一个可 以依赖的是我们的直觉。爱因斯坦说:

事情应当力求简单,但不能过于简单。

把复杂的文本操作放在简单的鼠标点击上,其实是很违悖直觉的做法。在一般人的直觉里, Ctrl-cC 代表 Copy,Emacs 的 Ctrl-ff 意味着 forward, 鼠标左键代表『确定』或者访问,鼠标右键代表打开菜单,鼠标中键,呃它很少用…… 如果把 鼠标绑定到类似『重构』的操作,则需要刻意在认知中重新对鼠标按键和『重构』产生关联, 这不仅过于复杂,而且容易出错。

可能是受一些触摸屏操作的启发,有人提出使用鼠标手势来扩展鼠标的功能。鼠标手势通常 意味着用按住鼠标拖拽出特定的图形,然后按不同的图形触发出不同的功能。

为了绘制手势,往往需要大幅度地挥动手臂,否则极易产生混淆。比起使用键盘快捷键的手 指微动,显然是过分浪费体力了。如果在频繁使用的功能上使用鼠标手势,很容易造成手臂 的疲劳。上文已经提到过集中精神对编程的重要性,绘制鼠标手势反而需要分心。

# 你不要鼠标就可以变得高效

鼠标的设计目标是给予用户输入连续的 2D 数据和快速定位的能力。恰恰相反的是,编辑程序 时需要的操作往往是离散的。我们不会在意光标到底移动到了哪一个像素点,而是在意他移 动到了哪两个字符之间;甚至,字符的概念也可以被抽象掉,只关心光标选中了哪一段文本 对象。换言之,在『雕刻』代码的时候,鼠标这种精细的输入设备并没有什么帮助。

一个常见的鼠标使用场景是通过一个 GUI 的界面执行高级编辑指令,然而这种情况下你也不 一定需要用鼠标。对于常用的命令,你可以将其绑定到快捷键上,另外一个更通用的方法是 通过 fuzzy finder(如 Emacs 的Alt-x,其他编辑器的Ctrl-p等)执 行。

此外,鼠标的精确 2D 数据记录在这种场景有时会带来弊端。假设你将光标移动到按 扭的边缘部分,这时候点击鼠标可能无法触发按钮。但鼠标的回弹依旧会给手指一个反馈, 让你产生操作成功执行的错觉。

比起原始的光标移动定位,对快速代码定位更有帮助的是类似 Surfingkeys, 或者 vimium 这样的树状跳转。通过编辑器抓去代码里的关键信 息并添加字符 tag,用键盘输入 tag 迅速定位到某一块需要操作的代码上[3]

对于更复杂的跳转,往往是利用正则搜索等更加高效,鼠标难以起到什么作用。

# 结论

从现在开始,尽量少在你的编程作业中使用鼠标。

你可以考虑直接上手 Vim 或者 Emacs 这种全键盘导向的编辑器。当然,如果你对 IDE 或者 VSCode/Atom 这种高颜值的『现代』编辑器难以割爱,那就尝试一下他们的 Vim 编辑插件[4]。 当你习惯了这种纯键盘的操作逻辑后,你会发现少了鼠标并不会有强烈的不适感。如果遇到 必须用鼠标的场景,那就尝试下用笔记本的触摸板吧!😉

# 相关链接

一篇阐述了鼠标设计理念与日常使用计算机场景的冲突的文章

个人推荐的部分 fuzzy searching and squeezing 工具,能大大提升使用键盘执行一些常 见操作的效率,可在编辑文件以外的场合使用。

Skim 是命令行下的 ncurses 工具,rofi 则带有一个 GUI 界面。


  1. Lisp 系方言可以提供这种快捷迅速的反馈体验 ↩︎

  2. 不过仍然有人在这方面做的努力,比如 Darklang ↩︎

  3. 可以参考这个 Emacs 插件 仓库内有 GIF 演示 ↩︎

  4. 不推荐 Emacs 以外的编辑器的 Emacskey 插件,因为和原有插件的快捷键冲突太严重。 ↩︎