Emacs 的正确之处,或者说我希望现代应用程序更像 50 年前的文本编辑器

刚开始使用 Emacs 时,我觉得它很奇怪。我有过这样的疑问:”为什么窗口叫框架,而标签页叫窗口?”以及 “C-x C-s 到底是什么意思?”。

但我坚持了下来,因为我觉得这让我看起来很酷,而且随着时间的推移,我逐渐理解了 Emacs 架构的精妙和实用性。它很简单,但却非常有用。

所以现在我觉得,其他应用程序不更像 Emacs 才是怪事。我认为这个拥有 50 年历史的文本编辑器有很多值得学习的地方。

几乎所有东西都是命令

现在很多应用程序和网站都有一个 “命令调板”,通常用⌘K来调用。命令调板通常会列出一系列可用命令及其相关热键,并允许你对它们进行模糊搜索。下面是来自 SuperhumanLinearSublime,和 Godspeed 的一些示例:

命令调板非常棒!你无需记住每个热键或每个按钮的位置。相反,只需调出命令调板,然后键入你要找的内容即可。如果你做的事情足够频繁,你就能学会热键。

Emacs 也有类似于命令调板的东西,你可以用 M-x 触发它,这是 Emacs 热键语法 Meta+X(现代键盘上是 Option+X):

但 Emacs 则更胜一筹,因为在 Emacs 中,你能做的所有事情都是命令。请注意截图左上角的 8073。

命令并不只是排序行或列表进程等花哨的东西,它们无所不能。这甚至包括最基本的交互,如 forward-char,没错,就是将光标向右移动一个位置的命令。

在 Emacs 中做任何事情,包括按热键或点击,实际上都是在执行命令。

由于以下几个原因,这被证明是一种非常有用的架构:

Emacs 中的所有热键都是可编辑的

Emacs 的体系结构使得这一点很容易做到。因为归根结底,你始终只是在执行命令,所以 Emacs 只需要保存一个热键与命令的映射查找表(比这要复杂一些–你还需要知道你所处的 “模式”–但这基本上是正确的)。

更改热键就像调换查找表中的一个值一样简单。没有什么特别或神圣的。而且这些热键都不是绝对必要的,因为你总是可以直接从 M-x 运行命令(当然,你也可以重新映射)。

某些应用程序中热键的不可更改性是常见的挫败感来源。有时,某个热键并不是你想要的,它被全局热键覆盖了,或者根本就不存在。而你对此却无能为力。

但 Emacs 的热键却因为其底层架构而免费获得了这种可编辑性。但这并不是架构的全部。

为 Emacs 编写脚本既简单又实用

编写 Emacs 脚本的最简单方法就是编写一条新命令,然后运行其他一些现有命令。通常情况下,脚本的形式本质上是宏–将一系列按键打包成一个可重复使用的命令。然后,你可以像其他命令一样将其绑定到热键上,或者通过 M-x 访问它。

虽然你必须学习一些 Elisp 才能做到这一点,但在实践中,只需掌握最基本的语法就足够了。

但还有一个问题:你可能知道按哪个热键可以实现某些功能,但你怎么知道这些热键对应哪些命令呢?

为了解决这个问题,Emacs 还有一个小窍门:describe-key 命令。当你运行 describe-key 命令时,Emacs 会开始监听你按下的下一个热键。但当你按下该热键时,它不会实际运行相关的命令,而是会向你显示本应运行的命令。这样,你就拥有了定制 Emacs 所需的一切。

例如,我经常发现自己想在下一行添加一个 TODO: 注释,我想如果能有一个自定义命令就好了。当然,我知道如何用热键来实现这个功能,所以我会一个接一个地使用 describe-key 命令来了解每个热键的作用。有了这些,再加上谷歌的一点帮助,我想出了这个方法:

(defun todo-comment-on-next-line ()
  (interactive)          ;; Makes the function show up in `M-x`
  (move-end-of-line nil) ;; Jump to end of current line
  (newline)              ;; Insert a newline
  (back-to-indentation)  ;; Move cursor to current indent level
  (insert "// TODO: "))  ;; Insert the comment text

 

然后,我把这个命令绑定到一个热键上,从那以后,我每天都在使用它。

我不需要设置复杂的开发环境,也不需要学习扩展 API。我只需运行一系列命令,就像在 Emacs 中做任何事情一样。这种以命令为中心的架构再一次得到了回报。

Emacs 100% 面向键盘

Emacs 中的每一项操作都可以通过键盘完成。

在大多数应用程序中,图形用户界面是第一位的,而热键则是在图形用户界面之上。但 Emacs 是键盘优先的。虽然有图形用户界面,但它是次要的。你可以点击一些东西,但这就像热键一样触发命令。

在 Emacs 中,没有任何鼠标操作无法通过键盘实现的功能。

我不会把话说得太满,但如果你的双手完全放在键盘上,就能获得无与伦比的流畅性,而有时你不得不用鼠标来代替键盘。我对 Emacs 也有了更多的信任,因为我知道用键盘做什么事情都是有方法的,而不是怀疑它是否可行。

现代应用程序可以向 Emacs 学习什么?

这种以命令为中心的架构非常强大,我希望看到更多的现代应用程序采用这种架构。任何带有命令调色板的应用程序都已经非常接近实现这一目标了。

电子和网络应用程序可以通过利用开发者控制台来实现这一点。你已经拥有了一个完整的 JavaScript 编程环境。在窗口上粘贴几个 API 函数,任何人都可以定制你的应用程序。

以下是一些我希望能在幻想中的开发者控制台中实现的功能示例:

  • 我经常会对 Slack 中的最后一条信息作出👍的反应。这就是我想要的命令:
function reactWithThumbsUp() {
  window.executeCommand('react-to-last-message', ':+1:');
}
  • Slack 跳转到 Unreads 的热键是 ⌘+Shift+A 。但我希望改成⌘U:
window.setCommandHotkey('jump-to-unreads', 'command+u');
  • 我收到过很多人的邮件,要求我为他们提供学生折扣。我生成优惠券代码,用模板回复,贴上标签,然后存档。下面是我想要的命令:
  • function respondToStudentDiscountRequest() {
      window.executeCommand('insert-template', 'Student discount request');
      window.executeCommand('replace-text', '{COUPON_CODE}', window.getClipboardText());
      window.executeCommand('send');
      window.executeCommand('add-label', 'Discount request');
      window.executeCommand('archive');
    }
    

本文文字及图片出自 What Emacs got right, or how I wish modern apps were more like a 50 year old text editor

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注