Emacs 的正确之处,或者说我希望现代应用程序更像 50 年前的文本编辑器
刚开始使用 Emacs 时,我觉得它很奇怪。我有过这样的疑问:”为什么窗口叫框架,而标签页叫窗口?”以及 “C-x C-s 到底是什么意思?”。
但我坚持了下来,因为我觉得这让我看起来很酷,而且随着时间的推移,我逐渐理解了 Emacs 架构的精妙和实用性。它很简单,但却非常有用。
所以现在我觉得,其他应用程序不更像 Emacs 才是怪事。我认为这个拥有 50 年历史的文本编辑器有很多值得学习的地方。
几乎所有东西都是命令
现在很多应用程序和网站都有一个 “命令调板”,通常用⌘K来调用。命令调板通常会列出一系列可用命令及其相关热键,并允许你对它们进行模糊搜索。下面是来自 Superhuman, Linear, Sublime,和 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
你也许感兴趣的:
- 【译文】我多年来一直使用的 Emacs 命令
- 我的 IDE 太重了,所以迁到了 Emacs
- RMS:GNU Emacs最不应该支持的语言是JavaScript
- 十大必知的 Emacs 小技巧
- 我是怎样使用Emacs文本编辑器的
- 【外评】电脑从哪里获取时间?
- 【外评】为什么 Stack Overflow 正在消失?
- Android 全力押注 Rust,Linux 却在原地踏步?谷歌:用 Rust 重写固件太简单了!
- 【外评】哪些开源项目被广泛使用,但仅由少数人维护?
- 【外评】好的重构与不好的重构
你对本文的反应是: