蚊章汇 - EMACS
type: channel
link: https://linuxcn.bwsl.wang/tag/EMACS/
items: 一个更好的视频码头
items: 为什么我喜欢 Emacs
items: 10 个让你进入 Emacs 世界的技巧
items: #新闻拍一拍# 你家的智能咖啡机可能会被黑
items: 关于 Emacs 中的变量你需要知道的事情
items: 6 件你应该用 Emacs 做的事
items: Emacs 调试秘籍之 GUD 调试器
items: 在 Windows 上安装 GNU Emacs
items: 使用 Emacs 进行社交并跟踪你的待办事项列表
items: “Emacs 游戏机”完全指南

一个更好的视频码头
type: item
date: 2023-04-11T23:02:00+08:00
description: 之前，我在写 有关 embark 的内容，我的第一设备为启动远程视频流设计了一个新的 embark。embark 的作者 Omar Antolín Camarena 不仅阅读了这篇内容，还点评了一下我认为值得跟进的一些重大改进。首先，你应该记得我们曾定义过一个检测视频 URL 的函数： (defun jao-video-finder () "Check whether we're looking at a video URL. Return (video-url . <URL>) if so." (when-let ((url (thing-at-point-url-at-point))) (when (string-match-p jao-video-url-rx url) (cons 'video-url url)))) 当我们得到了一个非空的 url 值，即便它不是一个视频链接，但它仍然是一个确切的 URL，并且 embark 已有了一个 url 类别，所以我们可以借助默认的 URL 寻检器存储一个新的句法分析,语句如下： (when-let ((url (thing-at-point-url-at-point))) (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url)) 这里有一个潜在的缺点就是：我们重写了 embark 的寻检器，embark-target-url-at-point，所以我们可能更愿意保留后者。实际上多亏了 embark 的 目标转换器 我们才能做成。我们可以在 embark-transformers-alist 中添加任意一个函数，应用于任何一个给定类别的目标，而 embark 会将其转换后的值应用于它的操作中。Omar 很贴切地把这个过程称为“目标的精化”;我们具体做法如下： (defun jao-refine-url-type (url) "Refine type of URL in case it is a video." (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url)) (add-to-list 'embark-transformer-alist '(url . jao-refine-url-type)) 通过这种策略，我们就不再需要 jao-video-finder 了，而且从概念上来说，我们的 video-url 应该被定义为一个精化操作而并非是一个目标 [脚注 1]。Omar 的第二个提议也与这个概念相契合：想必我们都希望所有关于 url 和我们的 video-url 的操作都是可用的，不是吗？ 唔，这就是为什么我们用来定义行为的 embark-define-keymap 的宏可以通过使用关键字 [脚注 2] :parent 继承其他键映射中已经定义的所有操作的原因： (embark-define-keymap jao-video-url-map "Actions on URLs pointing to remote video streams." :parent embark-url-map ("p" jao-play-video-url)) (add-to-list 'embark-keymap-alist '(video-url . jao-video-url-map)) 这种继承键映射的功能并非是 embark 的附属功能：vanilla Emacs 键映射通过标准函数 set-keymap-parent 已经搞定它了。你可以完全不用 embark-define-keymap 来定义 jao-video-url-map，工作原理是一样的。这样，我们的代码就能够更短，特征更多：谢谢你，Omar！脚注 1：在某些情况下，保留 jao-video-finder 是有意义的，即，如果我们想要改变检测 URL 的功能的话。例如，我在使用 emacs-w3m 的时候，经常有一个 URL 作为文本属性储存了起来(实际文本是个链接文本)。要通过那里检索 URL，就需要调用 w3m-anchor，而用 embark-target-url-at-point 就会错过它。对于这种情况，我最终编写(并使用)jao-video-finder 将其通过下文定义: (when-let ((url (or (w3m-anchor) (thing-at-point-url-at-point)))) (cons (if (string-match-p jao-video-url-rx url) 'video-url 'url) url))…

为什么我喜欢 Emacs
type: item
date: 2020-12-16T07:42:33+08:00
description: Emacs 并不是一个单纯的文本编辑器，它将掌控置于你手中，让你几乎可以解决你遇到的任何问题。我是一个典型的 Emacs 用户。不是我选择的 Emacs，而是它选择了我。早在我刚开始学习 Unix 的时候，我偶然发现了一个奇怪的名为 Emacs 的应用程序，它隐藏在我的电脑上，其中有一个鲜为人知的功能。传说中（而且被证明是真的），如果你在终端上输入 emacs，按 Alt+X，然后输入 tetris，你就可以玩一个掉方块的游戏。那就是我对 GNU Emacs 的印象。虽然这很肤浅，但它也准确地表明了 Emacs 的意义：用户可以重新编程他们的（虚拟）世界，并且可以用一个应用程序做任何他们想做的事情。在你的文本编辑器中玩俄罗斯方块可能不是你日常的主要目标，但这说明 Emacs 是一个值得骄傲的编程平台。事实上，你可以把它看作是 Jupyter 的一种先驱，它把一种强大的编程语言（准确的说叫 elisp）和自己的实时环境结合起来。因此，Emacs 作为一个文本编辑器是灵活的、可定制的、强大的。如果你习惯于 Bash、Python 或类似的语言，elisp（以及扩展的 Common Lisp）不一定是最容易入门的语言。但是这种 LISP 方言是很强大的，而且因为 Emacs 是一个 LISP 解释器，所以你可以用它构建应用程序，不管它们是 Emacs 插件还是你想开发成一个独立项目的原型。极其流行的 org 模式项目就是一个例子：它是一个 Emacs 插件，同时也是一个标记语法，有移动应用可以解释和扩展其功能。类似的有用的 Emacs 内应用的例子还有很多，包括电子邮件客户端、PDF 浏览器、Web 浏览器、shell 和文件管理器。两个界面GNU Emacs 至少有两个用户界面：图形用户界面（GUI）和终端用户界面（TUI）。这有时会让人感到惊讶，因为 Emacs 经常与运行在终端中的 Vi 相提并论（尽管 gVim 为现代 Vi 的实现提供了一个 GUI）。如果你想把 GNU Emacs 以终端程序来运行，你可以用 -nw 选项来启动它。$ emacs -nw 有了 GUI 程序，你可以直接从应用程序菜单或终端启动 Emacs。你可能会认为 GUI 会降低 Emacs 的效率，好像“真正的文本编辑器是在终端中运行的”，但 GUI 可以使 Emacs 更容易学习，因为它的 GUI 遵循了一些典型的惯例（菜单栏、可调节的组件、鼠标交互等）。事实上，如果你把 Emacs 作为一个 GUI 应用程序来运行，你可能在一天的时间里会完全没有意识到你在 Emacs 中。只要你使用过 GUI，大多数常用的惯例都适用。例如，你可以用鼠标选择文本，导航到编辑菜单，选择复制，然后将光标放在其他地方，选择粘贴。要保存文档，你可以进入文件，然后选择保存或另存为。你可以按 Ctrl 键并向上滚动，使屏幕字体变大，你可以使用滚动条来浏览你的文档，等等。了解 Emacs 的 GUI 形式是拉平学习曲线的好方法。Emacs 键盘快捷键GNU Emacs 以复杂的键盘组合而恶名远扬。它们不仅陌生（Alt+W 来复制？Ctrl+Y 来粘贴？），而且还用晦涩难懂的术语来标注（Alt 被称为 Meta），有时它们成双成对（Ctrl+X 后是 Ctrl+S 来保存），有时则单独出现（Ctrl+S 来搜索）。为什么有人会故意选择使用这些呢？嗯，有些人不会。但那些喜欢这些的人是因为这些组合很容易融入到日常打字的节奏中（而且经常让 Caps Lock 键充当 Ctrl 键）。然而，那些喜欢不同的东西的人有几个选择：“邪恶”模式让你在 Emacs 中使用 Vim 键绑定。就是这么简单。你可以保留你的肌肉记忆中的按键组合，并继承最强大的文本编辑器。通用用户访问（CUA）键保留了所有 Emacs 常用的组合键，但最令人头疼的键（复制、剪切、粘贴和撤消）都被映射到现代的键盘绑定中（分别为 Ctrl+C、Ctrl+X、Ctrl+V 和 Ctrl+Z）。global-set-key 函数，是 Emacs 编程的一部分，允许你定义自己的键盘快捷键。传统上，用户定义的快捷键以 Ctrl+C 开头，但没有什么能阻止你发明自己的方案。Emacs 并不敝帚自珍，欢迎你按照自己的意愿来扭转它。学习 Emacs要想很好地使用 Emacs 是需要时间的。对我来说，这意味着打印出一张速记表，每天都把它放在键盘旁边。当我忘了一个键组合时，我就在我的速记表上查找它。如果它不在我的速记表上，我就学习这个键盘组合，要么通过执行该函数，并注意 Emacs 告诉我如何更快地访问它，要么通过使用 describe-function：M-x describe-function: save-buffer save-buffe…

10 个让你进入 Emacs 世界的技巧
type: item
date: 2020-11-29T18:38:00+08:00
description: 10 个技巧，让你深入这个有用的开源文本编辑器的世界。很多人都说想学 Emacs，但很多人在短暂的接触后就退缩了。这并不是因为 Emacs 不好，也不是 Emacs 复杂。我相信，问题在于人们其实并不想“学习” Emacs，而是他们想习惯 Emacs 的传统。他们想了解那些神秘的键盘快捷键和不熟悉的术语。他们想按照他们认为的“使用目的”来使用 Emacs。我很同情这一点，因为我对 Emacs 的感觉就是这样。我以为真正的 Emacs 用户都只会在终端里面运行，从来不用方向键和菜单，更不会用鼠标。这是个阻止自己开始使用 Emacs 的好办法。有足够多的独特的 .emacs 配置文件证明，如果说 Emacs 用户有一个共同的变化，那就是每个人使用 Emacs 的方式不同。学习 Emacs 很容易。爱上 Emacs 才是最难的。要爱上 Emacs，你必须发现它所拥有的功能，而这些功能是你一直在寻找的，有时你并不知道你已经错过了它们。这需要经验。获得这种经验的唯一方法就是从一开始就积极使用 Emacs。这里有十个小提示，可以帮助你找出最适合你的方法。从 GUI 开始Emacs（以及它的友好竞争者 Vim）最伟大的事情之一是它可以在终端中运行，这在你 SSH 进入服务器时很有用，但在过去 15 年来制造的计算机上意义不大。Emacs 的 GUI 版本可以在极度低功耗的设备上运行，它有很多实用的功能，无论是新手还是有经验的用户都可以使用它。例如，如果你不知道如何在 Emacs 中只用键盘快捷键复制一个单词，编辑菜单的复制、剪切和粘贴选择提供了最轻松的路径。没有理由因为选择了 Emacs 而惩罚自己。使用它的菜单，用鼠标选择区域，点击缓冲区内的按钮，不要让陌生感阻碍你的工作效率。这些功能被内置到 Emacs 中，是因为用户在使用它们。你应该在你需要的时候使用它们，而当你最终在 VT100 终端上通过 SSH 使用 Emacs，没有 Alt 或方向键的时候，你才应该使用这些晦涩的命令。习惯术语Emacs 的 UI 元素有着特殊的术语。个人计算的发展并不是建立在相同的术语上，所以很多术语对现代计算机用户来说比较陌生，还有一些术语虽然相同，但含义不同。下面是一些最常见的术语。 框架 Frame 。在 Emacs 中，“框架”就是现代计算机所说的“窗口”。 缓冲区 Buffer ：“缓冲区”是 Emacs 的一个通信通道。它可以作为 Emacs 进程的命令行，也可以作为 shell，或者只是一个文件的内容。 窗口 Window ：“窗口”是你进入一个缓冲区的视角。 迷你缓冲区 Mini-buffer 。它是主要的命令行，位于 Emacs 窗口的底部。让 Emacs 的修饰键变得更有意义在 PC 键盘上，Ctrl 键被称为 C，Alt 键被称为 M，这些键并不是 C 和 M 键，由于它们总是与相应的字母或符号键配对，所以在文档中很容易识别。例如，C-x 在现代键盘符号中的意思是 Ctrl+X，M-x 是 Alt+X。就像你从任何应用程序中剪切文本时一样，同时按下这两个键。不过，还有另一个层次的键盘快捷键，与现代电脑上的任何东西都完全不同。有时，键盘快捷键并不只是一个键组合，而是由一系列的按键组成。例如，C-x C-f 的意思是像往常一样按 Ctrl+X，然后再按 Ctrl+C。有时，一个键盘快捷键有混合的键型。组合键 C-x 3 意味着像往常一样按 Ctrl+X，然后按数字 3 键。Emacs 之所以能做到这些花哨的强力组合，是因为某些键会让 Emacs 进入一种特殊的命令模式。如果你按 C-X（也就是 Ctrl+X），就是告诉 Emacs 进入空闲状态，等待第二个键或键盘快捷键。Emacs 的文档，无论是官方的还是非官方的，都有很多键盘快捷键。在心里练习把 C 键翻译成 Ctrl 键，M 键翻译成 Alt 键，那么这些文档对你来说都会变得更有意义。剪切、复制和粘贴的备用快捷方式从规范上，复制文本是通过一系列的键盘快捷键进行的，这些快捷键取决于你想要复制或剪切的方式。例如，你可以用 M-d（Alt+d 的 Emacs 行话）剪切一整个单词，或者用C-k（Ctrl+K）剪切一整行，或者用 M-m（Alt+M）剪切一个高亮区域。如果你想的话，你可以习惯这样，但如果你喜欢 Ctrl+C 和 Ctrl+X 和 Ctrl-V，那么你可以用这些来代替。启用现代的“剪切-复制-粘贴”需要激活一个名为 CUA（ 通用用户访问 Common User Access ）的功能。要激活 CUA，请单击“选项”菜单并选择“使用 CUA 键”。启用后，C-c 复制高亮显示的文本，C-x 剪切高亮显示的文本，C-v 粘贴文本。这个模式只有在你选择了文本之后才会实际激活，所以你仍…

#新闻拍一拍# 你家的智能咖啡机可能会被黑
type: item
date: 2020-09-29T01:29:53+08:00
description: 你家的智能咖啡机可能会被黑安全公司 Avast 的研究员 Martin Hron 发现 Smarter 公司的联网智能咖啡机与智能手机应用之间的连接是没有加密的，没有身份验证，没有代码验证，最新的固件就储存在手机应用，可以很容易导出进行逆向工程。利用这些漏洞，他能触发咖啡机打开燃烧器，出水，启动磨豆机，显示勒索信息，让咖啡机重复发出哔哔的声音。唯一阻止这一切混乱的方法是拔掉电源插头。来源：solidot拍一拍：越来越多的智能产品，可是安全却没有跟上，这有可能带来意想不到的负面后果。Emacs 开发者讨论如何构建更“现代”的 Emacs开发者认为需要做一些“看得见”的改变让现有的功能更容易接近用户。比如采用更中心化的方法管理颜色主题。改变键盘按键与鼠标绑定方式。Emacs 原作者 Richard Stallman 认为改变基本按键绑定去模仿较新的编辑器是不可取的，将创造一个 Emacs 用户永远不会切换过去的新编辑器。鼠标行为的情况与之类似。Stallman 建议提供一个“重组模式”。他指出现有的鼠标行为是源自 1990 年左右的 X Windows 标准。他不想太仓促，但现在是时候去更新了。来源：solidot拍一拍：在讨论了如何让 Emacs 再次流行起来之后，正在准备 Emacs 28 的开发者又热烈讨论如何构建更“现代”的 Emacs。EdX 的“Linux 入门”免费课程注册人数突破一百万该课程帮助学生使用图形界面和命令行在主要的 Linux 发行系列中学习 Linux 知识。该课程不需要任何知识或经验，因此对于有兴趣从事 IT 行业的个人来说，该课程是受欢迎的第一步。edX 创始人表示，“这是 Linux 基金会的第一个产品，是我们有史以来最受欢迎的十大课程之一。”来源：Linux 基金会拍一拍：可喜可贺，Linux 的普及了这么多人了！

关于 Emacs 中的变量你需要知道的事情
type: item
date: 2020-04-26T03:09:00+08:00
description: 学习 Elisp 是如何处理变量的，以及如何在你的脚本与配置中使用它们。GNU Emacs 是由 C 和 Emacs Lisp（Elisp，Lisp 编程语言的一种方言）写成，它是一个编辑器的同时，又碰巧是 Elisp 的沙盒。因此，理解 Elisp 中的一些基本编程概念会对你有一些帮助。如果你是 Emacs 新手，请先阅读 Sacha Chua 的《给 Emacs 新手的资源》精品帖。本篇文章假定你熟悉常见的 Emacs 术语，并且能够阅读并求值 Elisp 代码的简单片段。最好你也听说过变量作用域的概念，知道它在其它编程语言中的作用。本篇文章中的示例假定你使用的是相对较新的 Emacs 版本（v.25 之后的版本）。Elisp 手册 包含了 Elisp 的方方面面，但它是写给那些有明确查找目标的人们的（它在这方面也做得相当棒）。但是很多人想要能够在更高的层次上解释 Elisp 概念的材料，同时将信息压缩成最精华的部分。本篇文章也正是我回应这种呼声的一次尝试，为读者描绘基础的大体轮廓。使他们能在配置中用上这些技巧，也让他们在手册中查询细节变得更容易。全局变量用 defcustom 定义的用户设置和用 defvar 或 defconst 定义的变量是全局的。使用 defcustom 或 defvar 声明变量的一个非常重要的原因是，当一个变量已经被 绑定 bind ，对它们进行重新求值不会覆盖掉已有的值。举个栗子，如果你在初始化文件中对 my-var 进行如下绑定：(setq my-var nil)对如下表达式求值不会将变量覆盖为 t：(defvar my-var t)注意此处有一个例外：如果你用 C-M-x 快捷键对上述声明求值，它将调用 eval-defun 函数，并将变量覆盖为 t。通过此方式，你可以按需将变量强制覆盖。这种行为是刻意而为之的：你可能知道，Emacs 中的许多特性是按需加载的，也可以称为自动加载。如果那些文件中的声明将变量覆盖为它们的默认值，那它也就覆盖了你初始化文件中的设置。用户选项用户选项就是使用 defcustom 声明的全局变量。与使用 defvar 声明的变量不同，这些变量可以用 M-x customize 界面来配置。据我所知，大部分人因为觉得它开销较大而不经常使用。一旦你知道如何在你的初始化文件中设置变量，也就没有理由一定要去使用它了。许多用户没有意识到的一个细节是，通过 customize 的方式设置用户选项能够执行代码，有的时间可用来运行一些附加的配置说明：(defcustom my-option t "My user option." :set (lambda (sym val) (set-default sym val) (message "Set %s to %s" sym val)))若你对这段代码求值，并键入 M-x customize-option RET my-option RET 运行 customize 界面，lambda 匿名函数就会被调用，回显区域就会显示出该选项的符号名与值。如果你在初始化文件中使用 setq 改变该选项的值，那么匿名函数不会运行。要想在 Elisp 中正确设置一个选项，你需要使用函数 customize-set-variable。或者，人们在他们的配置文件中使用了各种版本的 csetq 宏来自动处理（如你所愿，你可以通过 GitHub 的代码搜索发现更复杂的变体）。(defmacro csetq (sym val) `(funcall (or (get ',sym 'custom-set) 'set-default) ',sym ,val))若你正在使用 use-package 宏，:custom 关键字会替你处理好以上这些。在你将以上代码放入到你的初始化文件中之后，你便可以使用 csetq 宏在设置变量的同时运行任何现存的 setter 函数。要证明这点，你可以使用此宏来改变上面定义的选项，并观察回显区域的消息输出。(csetq my-option nil)动态绑定与词法绑定当你在使用其它编程语言时，你可能不会意识到动态绑定与词法绑定的区别。当今的大部分编程语言使用词法绑定，并且在学习变量作用域与变量查找时也没有必要去了解它们之间的区别。如此看来，Emacs Lisp 比较特殊因为动态绑定是默认选项，词法绑定需要显式启用。这里有一些历史遗留原因，但在实际使用中，你应该时刻启用词法绑定，因为它更快并且不容易出错。要启用词法绑定，只需将如下的注释行作为你的 Emacs Lisp 文件的第一行：;;; -*- lexical-binding: t; -*-另一种方式，你可以调用 add-file-local-variable-prop-line，在你…

6 件你应该用 Emacs 做的事
type: item
date: 2020-03-17T21:37:00+08:00
description: 下面六件事情你可能都没有意识到可以在 Emacs 下完成。此外还有我们的新备忘单，拿去，充分利用 Emacs 的功能吧。想象一下使用 Python 的 IDLE 界面来编辑文本。你可以将文件加载到内存中，编辑它们，并保存更改。但是你执行的每个操作都由 Python 函数定义。例如，调用 upper() 来让一个单词全部大写，调用 open 打开文件，等等。文本文档中的所有内容都是 Python 对象，可以进行相应的操作。从用户的角度来看，这与其他文本编辑器的体验一致。对于 Python 开发人员来说，这是一个丰富的 Python 环境，只需在配置文件中添加几个自定义函数就可以对其进行更改和开发。这就是 Emacs 对 1958 年的编程语言 Lisp) 所做的事情。在 Emacs 中，运行应用程序的 Lisp 引擎与输入文本之间无缝结合。对 Emacs 来说，一切都是 Lisp 数据，因此一切都可以通过编程进行分析和操作。这造就了一个强大的用户界面（UI）。但是，如果你是 Emacs 的普通用户，你可能对它的能力知之甚少。下面是你可能没有意识到 Emacs 可以做的六件事。使用 Tramp 模式进行云端编辑Emacs 早在网络流行化之前就实现了透明的网络编辑能力了，而且时至今日，它仍然提供了最流畅的远程编辑体验。Emacs 中的 Tramp 模式（以前称为 RPC 模式）代表着 “ 透明的远程（文件）访问，多协议 Transparent Remote (file) Access，Multiple Protocol ”，这准确说明了它提供的功能：通过最流行的网络协议轻松访问你希望编辑的远程文件。目前最流行、最安全的能用于远程编辑的协议是 OpenSSH，因此 Tramp 使用它作为默认的协议。在 Emacs 22.1 或更高版本中已经包含了 Tramp，因此要使用 Tramp，只需使用 Tramp 语法打开一个文件。在 Emacs 的 “File” 菜单中，选择 “Open File”。当在 Emacs 窗口底部的小缓冲区中出现提示时，使用以下语法输入文件名：/ssh:user@example.com:/path/to/file如果需要交互式登录，Tramp 会提示你输入密码。但是，Tramp 直接使用 OpenSSH，所以为了避免交互提示，你可以将主机名、用户名和 SSH 密钥路径添加到你的 ~/.ssh/config 文件。与 Git 一样，Emacs 首先使用你的 SSH 配置，只有在出现错误时才会停下来询问更多信息。Tramp 非常适合编辑并没有放在你的计算机上的文件，它的用户体验与编辑本地文件没有明显的区别。下次，当你 SSH 到服务器启动 Vim 或 Emacs 会话时，请尝试使用 Tramp。日历如果你喜欢文本多过图形界面，那么你一定会很高兴地知道，可以使用 Emacs 以纯文本的方式安排你的日程（或生活），而且你依然可以在移动设备上使用开源的 Org 模式查看器来获得华丽的通知。这个过程需要一些配置，以创建一个方便的方式来与移动设备同步你的日程（我使用 Git，但你可以调用蓝牙、KDE Connect、Nextcloud，或其他文件同步工具），此外你必须在移动设备上安装一个 Org 模式查看器（如 Orgzly）以及 Git 客户程序。但是，一旦你搭建好了这些基础，该流程就会与你常用的（或正在完善的，如果你是新用户）Emacs 工作流完美地集成在一起。你可以在 Emacs 中方便地查阅日程、更新日程，并专注于任务上。议程上的变化将会反映在移动设备上，因此即使在 Emacs 不可用的时候，你也可以保持井然有序。感兴趣了？阅读我的关于使用 Org mode 和 Git 进行日程安排的逐步指南。访问终端有许多终端模拟器可用。尽管 Emacs 中的 Elisp 终端仿真器不是最强大的通用仿真器，但是它有两个显著的优点：打开在 Emacs 缓冲区之中：我使用 Emacs 的 Elisp shell，因为它在 Emacs 窗口中打开很方便，我经常全屏运行该窗口。这是一个小而重要的优势，只需要输入 Ctrl+x+o（或用 Emacs 符号来表示就是 C-x o）就能使用终端了，而且它还有一个特别好的地方在于当运行漫长的作业时能够一瞥它的状态报告。在没有系统剪贴板的情况下复制和粘贴特别方便：无论是因为懒惰不愿将手从键盘移动到鼠标，还是因为在远程控制台运行 Emacs 而无法使用鼠标，在 Emacs 中运行终端有时意味着可以从 Emacs 缓冲区中很快地传输数据到 Bash。要尝试 Emacs 终端，输入 Alt+x（用 Emacs 符号表示就是 M-x），然后输入 shell，然后按回车。使用 Racket 模式Racket 是…

Emacs 调试秘籍之 GUD 调试器
type: item
date: 2020-03-14T20:31:00+08:00
description: 本文简短地对 Emacs 的调试工具 GUD 的特性进行了探索。如果你是一个 C 或 C++ 开发者，你很可能已经使用过 GDB（GNU 调试器），毫无疑问，它是现今最强大、最无可匹敌的调试器之一。它唯一的缺点就是它基于命令行，虽然仍能提供许多强大的功能，但有时也会具有一些局限性。这也就是为什么聪明的人们开始追求整合了编辑器和调试器的 图形化 GUI 集成开发环境 Integrated Development Environment 。仍有些开发者坚信使用鼠标会降低工作效率，在 GUI 上用鼠标点～点～点～是来自恶魔的诱惑。因为 Emacs 是现今最酷的文本编辑器之一，我将为你展示如何在不碰鼠标且不离开 Emacs 的情况下，实现写代码、编译代码、调试代码的过程。GUD（LCTT 译注：全称 大统一调试器 Grand Unified Debugger ，鉴于其缩写形式更为人熟知，以下全文将使用缩写替代此全称）是 Emacs 下的一个 模式 mode ，用于在 Emacs 中运行 GDB。它向 GDB 提供了 Emacs 的所有特性，使用户无需离开编辑器就可以对代码进行调试。使用 GUD 的前期准备如果你正在使用一个 Linux 机器，很可能你已经安装了 GDB 和 gcc，接下来就是要确保已经安装了 Emacs。以下的内容我将假设读者熟悉 GDB 并且至少用它做过基本的调试。如果你未曾接触过 GDB，你可以做个快速入门，这些资料在网上随处可得。对于那些 Emacs 新手，我将向你介绍一些基本术语。纵览整篇文章，你将看到诸如 C-c M-x 等快捷键。此处 C 代表 Ctrl 键，M 代表 Alt 键。C-c 代表 Ctrl 键和 c 键被同时按下。如果你看到 C-c c，它代表同时按下 Ctrl 键和 c 键，释放后紧接着按下 c 键。在 Emacs 中，编辑文本的主要区域被称为 主缓冲区 main buffer ，而在 Emacs 窗口下方用于输入命令的区域被称为 迷你缓冲区 mini buffer 。启动 Emacs，并按下 C-x C-f 来创建一个新文件。Emacs 将提示你输入一个文件名，此处让我们将文件命名为 buggyFactorial.cpp。一旦文件打开，输入如下代码：#include<iostream> #include <assert.h> int factorial(int num) { int product = 1; while(num--) { product *= num; } return product; } int main() { int result = factorial(5); assert(result == 120); }使用 C-x C-s 快捷键保存文件。文件保存完毕，是时候进行编译了。按下 M-x，在弹出的 提示符 prompt 后输入 compile 并点击回车。然后在提示符后，将内容替换为 g++ -g buggyFactorial.cpp 并再次点击回车。这将在 Emacs 中开启另一个缓冲区，显示编译的状态。如果你的代码输入没有错误，你将预期得到如图 2 所示的缓冲区。要想隐藏编译缓冲区，首先确保你的光标在编译缓冲区中（你可以不使用鼠标，而是通过 C-x o 快捷键将光标从一个缓冲区移动到另一个），然后按下 C-x 0。下一步就是运行代码，并观察是否运行良好。按下 M-! 快捷键并在迷你缓冲区的提示符后面输入 ./a.out。你可以看到迷你缓冲区中显示断言失败。很明显代码中有错误，因为 5 的阶乘是 120。那么让我们现在开始调试吧。使用 GUD 调式代码现在，我们的代码已经编译完成，是时候看看到底哪里出错了。按下 M-x 快捷键并在提示符后输入 gdb。在接下来的提示符后，输入 gdb -i=mi a.out。如果一切顺利，GDB 会在 Emacs 缓冲区中启动，你会看到如图 4 所示的窗口。在 gdb 提示符后，输入 break main 来设置断点，并输入 r 来运行程序。程序会开始运行并停在 main() 函数处。一旦 GDB 到达了 main 处设置的断点，就会弹出一个新的缓冲区显示你正在调试的代码。注意左侧的红点，正是你设置断点的位置，同时会有一个小的标志提示你当前代码运行到了哪一行。当前，该标志就在断点处（如图 5）。为了调试 factorial 函数，我们需要单步运行。想要达到此目的，你可以在 GBD 提示符使用 GDB 命令 step，或者使用 Emacs 快捷键 C-c C-s。还有其它一些快捷键，但我更喜欢 GDB 命令。因此我将在本文的后续部分使用它们。单步运行时让我们注意一下局部变量中的阶乘值。参考图 6 来设置在 Emacs 帧中显示局…

在 Windows 上安装 GNU Emacs
type: item
date: 2020-03-08T17:49:56+08:00
description: 即使你的操作系统是闭源的，你仍然可以使用这个流行的开源文本编辑器。GNU Emacs 是一个专为各种程序员设计的流行的文本编辑器。因为它是在 Unix 上开发的，并在 Linux（macOS 中也有）上得到了广泛使用，所以人们有时没有意识到它也可用于微软 Windows 上。你也无需成为有经验的或专职的程序员即可使用 Emacs。只需单击几下就可以下载并安装 Emacs，本文向你展示了如何进行。你可以手动安装 Windows，也可以使用包管理器安装，例如 Chocolatey。7-zip如果还没在 Windows 中安装 7-zip，那么就先安装它。7-zip 是一个开源的归档程序，能够创建和解压 ZIP、7z、TAR、XZ、BZIP2 和 GZIP（以及更多）文件。对于 Windows 用户来说，这是一个宝贵的工具。安装 7-zip 后，在 Windows 资源管理器中浏览文件时，右键单击菜单中就有新的 7-zip 归档选项。Powershell 和 Chocolatey要在 Windows 上使用 Chocolatey 安装 GNU Emacs ：PS> choco install emacs-full安装后，在 Powershell 中启动 Emacs：PS> emacs下载适用于 Windows 的 GNU Emacs要在 Windows 上手动安装 GNU Emacs，你必须下载 Emacs。它会打开连接到离你最近的服务器，并展示所有可用的 Emacs 版本。找到发行版本号最高的目录，然后单击进入。Windows 有许多不同的 Emacs 构建，但是最通用的版本只是被命名为 emacs-VERSION-ARCHITECTURE.zip。VERSION 取决于你要下载的版本，而 ARCHITECTURE 取决于你使用的是 32 位还是 64 位计算机。大多数现代计算机都是 64 位的，但是如果你有疑问，可以下载 32 位版本，它可在两者上运行。如果要下载 64 位计算机的 Emacs v26，你应该点击 emacs-26.2-x86_64.zip 的链接。有较小的下载包（例如 “no-deps” 等），但是你必须熟悉如何从源码构建 Emacs，知道它需要哪些库以及你的计算机上已经拥有哪些库。通常，获取较大版本的 Emacs 最容易，因为它包含了在计算机上运行所需的一切。解压 Emacs接下来，解压下载的 ZIP 文件。要解压缩，请右键单击 Emacs ZIP 文件，然后从 7-zip 子菜单中选择 “Extract to Emacs-VERSION”。这是一个很大的压缩包，因此解压可能需要一段时间，但是完成后，你将拥有一个新目录，其中包含与 Emacs 一起分发的所有文件。例如，在此例中，下载了 emacs-26.2-x86_64.zip，因此解压后的目录为 emacs-26.2-x86_64。启动 Emacs在 Emacs 目录中，找到 bin 目录。此文件夹存储随 Emacs 一起分发的所有二进制可执行文件（EXE 文件）。双击 emacs.exe 文件启动应用。你可以在桌面上创建 emacs.exe 的快捷方式，以便于访问。学习 EmacsEmacs 并不像传闻那样难用。它具有自己的传统和惯例，但是当你其中输入文本时，你可以像在记事本或者网站的文本框中那样使用它。重要的区别是在你编辑输入的文本时。但是，学习的唯一方法是开始使用它，因此，使 Emacs 成为完成简单任务的首选文本编辑器。当你通常打开记事本、Word 或 Evernote 或其他工具来做快速笔记或临时记录时，请启动 Emacs。Emacs 以基于终端的应用而闻名，但它显然有 GUI，因此请像使用其他程序一样经常使用它的 GUI。从菜单而不是使用键盘复制、剪切和粘贴（paste）（或用 Emacs 的术语 “yank”），然后从菜单或工具栏打开和保存文件。从头开始，并根据应用本身来学习它，而不是根据你以往对其他编辑器的经验就认为它应该是怎样。下载速查表！感谢 Matthias Pfuetzner 和 Stephen Smoogen。via: https://opensource.com/article/20/3/emacs-windows作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

使用 Emacs 进行社交并跟踪你的待办事项列表
type: item
date: 2020-03-04T18:09:26+08:00
description: 在 2020 年用开源实现更高生产力的二十种方式的第十九篇文章中，访问 Twitter、Reddit、 交谈、电子邮件 、RSS 和你的待办事项列表。去年，我在 19 天里给你介绍了 19 个新（对你而言）的生产力工具。今年，我换了一种方式：使用你在使用或者还没使用的工具，构建一个使你可以在新一年更加高效的环境。使用 Emacs 做（几乎）所有的事情，第 2 部分昨天，我谈到了如何在 Emacs 中读取电子邮件、访问电子邮件地址和显示日历。Emacs 功能繁多，你还可以将它用于 Twitter、交谈、待办事项列表等等！要完成所有这些，你需要安装一些 Emacs 包。和昨天一样，用 Meta+x package-manager 打开 Emacs 包管理器（Meta 键在大多数键盘上是 Alt，在 MacOS 上是 Option）。然后通过 i 选择以下带有的软件包，然后输入 x 进行安装：nnreddit todotxt twittering-mode安装之后，按下 Ctrl+x ctrl+f 打开 ~/.emacs.d/init.el，并在 (custom-set-variables 行前加上：;; Todo.txt (require 'todotxt) (setq todotxt-file (expand-file-name "~/.todo/todo.txt")) ;; Twitter (require 'twittering-mode) (setq twittering-use-master-password t) (setq twittering-icon-mode t) ;; Python3 for nnreddit (setq elpy-rpc-python-command "python3")按下 Ctrl+x Ctrl+s 保存文件，使用 Ctrl+x Ctrl+c 退出 Emacs，然后重启 Emacs。使用 twittering-mode 在 Emacs 中发推Twittering-mode 是 Twitter 最好的 Emacs 接口之一。它几乎支持 Twitter 的所有功能，并且键盘快捷键也易于使用。首先，输入 Meta+x twit 来启动 twittering-mode。它会提供一个 URL 并提示你启动浏览器来访问它，你登录该 URL 后就能获得授权令牌。将令牌复制并粘贴到 Emacs 中，你的 Twitter 时间线就会加载了。你可以使用箭头键滚动，使用 Tab 从一个项目移动到另一个项目，并按回车访问光标所在的 URL。如果光标在用户名上，按回车将在 web 浏览器中打开时间轴。如果你在一条推文的文本上，按回车将回复该推文。你可以用 u 创建一个新的推文，用 Ctrl+c+Enter 转发一些内容，然后用 d 发送一条即时消息——它打开的对话框中有关于如何发送、取消和缩短 URL 的说明。按 V 会打开一个提示让你跳转到其他时间线。输入 :mentions 打开你的提及。输入 :home 打开你的主时间线，输入用户名将进入该用户的时间线。最后，按 q 会退出 twittering-mode 并关闭窗口。twitter-mode 还有更多功能，我鼓励你阅读它 GitHub 页面上的完整功能列表。在 Emacs 上使用 Todotxt.el 追踪你的待办事项Todotxt.el 是一个很棒的 todo.txt 待办列表管理器接口。它的快捷键几乎无所不包。输入 Meta+x todotxt 启动它将加载 todotxt-file 变量中指定的 todo.txt 文件（本文的第一部分中设置了该文件）。在 todo.txt 的缓冲区（窗口），你可以按 a 添加新任务并和按 c 标记它已被完成。你还可以使用 r 设置优先级，并使用 t 添加项目和上下文。完成事项后只需要按下 A 即可将任务移如 done.txt。你可以使用 / 过滤列表，也可以使用 l 刷新完整列表。同样，你可以按 q 退出。在 Emacs 中使用 ERC 进行交谈Vim 的缺点之一是很难用它与人交谈。另一方面，Emacs 则将 ERC 客户端内置到默认发行版中。使用 Meta+x ERC 启动 ERC，系统将提示你输入服务器、用户名和密码。你可以使用几天前介绍设置 BitlBee 时使用的相同信息：服务器为 localhost，端口为 6667，相同用户名，无需密码。ERC 使用起来与其他 IRC 客户端一样。每个频道单独一个缓冲区（窗口），你可以使用 Ctrl+x ctrl+b 进行频道间切换，这也可以在 Emacs 中的其他缓冲区之间进行切换。/quit 命令将退出 ERC。使用 Gnus 阅读电子邮件，Reddit 和 RSS我…

“Emacs 游戏机”完全指南
type: item
date: 2020-03-02T17:36:00+08:00
description: 又是周一，你正在为你的老板 Lumbergh （LCTT 译注：《上班一条虫》中的副总裁）努力倒腾那些 无聊之极的文档。为什么不玩玩 Emacs 中类似 zork 的文字冒险游戏来让你的大脑从单调的工作中解脱出来呢？但说真的，Emacs 中既有游戏，也有古怪的玩物。有些你可能有所耳闻。这些玩意唯一的共同点就是，它们大多是很久以前就添加到 Emacs 中的：有些东西真的是相当古怪（如你将在下面看到的），而另一些则显然是由无聊的员工或学生们编写的。它们全有一个共同点，都带着一种奇思妙想和随意性，这在今天的 Emacs 中很少见。Emacs 现在变得十分严肃，在某种程度上，它已经与 20 世纪 80 年代那些游戏被编写出来的时候大不一样。汉诺塔汉诺塔 是一款古老的数学解密游戏，有些人可能对它很熟悉，因为它的递归和迭代解决方案经常被用于计算机科学教学辅助。Emacs 中有三个命令可以运行汉诺塔：M-x hanoi 默认为 3 个碟子; M-x hanoi-unix 和 M-x hanoi-unix-64 使用 unix 时间戳的位数（32 位或 64 位）作为默认盘子的个数，并且每秒钟自动移动一次，两者不同之处在于后者假装使用 64 位时钟（因此有 64 个碟子）。Emacs 中汉诺塔的实现可以追溯到 20 世纪 80 年代中期——确实是久得可怕。它有一些自定义选项（M-x customize-group RET hanoi RET），如启用彩色碟子等。当你离开汉诺塔缓冲区或输入一个字符，你会收到一个讽刺的告别信息（见上图）。5x55x5 的游戏是一个逻辑解密游戏：你有一个 5x5 的网格，中间的十字被填满；你的目标是通过按正确的顺序切换它们的空满状态来填充所有的单元格，从而获得胜利。这并不像听起来那么容易！输入 M-x 5x5 就可以开始玩了，使用可选的数字参数可以改变网格的大小。这款游戏的有趣之处在于它能向你建议下一步行动并尝试找到该游戏网格的解法。它用到了 Emacs 自己的一款非常酷的符号 RPN 计算器 M-x calc（在《Emacs 快乐计算》这篇文章中，我使用它来解决了一个简单的问题）。所以我喜欢这个游戏的原因是它提供了一个非常复杂的解题器——真的，你应该通过 M-x find-library RET 5x5 来阅读其源代码——这是一个试图通过暴力破解游戏解法的“破解器”。创建一个更大的游戏网格，例如输入 M-10 M-x 5x5，然后运行下面某个 crack 命令。破解器将尝试通过迭代获得最佳解决方案。它会实时运行该游戏，观看起来非常有趣：M-x 5x5-crack-mutating-best： 试图通过变异最佳解决方案来破解 5x5。M-x 5x5-crack-mutating-current： 试图通过变异当前解决方案来破解 5x5。M-x 5x5-crack-random： 尝试使用随机方案解破解 5x5。M-x 5x5-crack-xor-mutate： 尝试通过将当前方案和最佳方案进行异或运算来破解 5x5。文本动画你可以通过运行 M-x animation-birthday-present 并给出你的名字来显示一个奇特的生日礼物动画。它看起来很酷！这里用的 animate 包也用在了 M-x butterfly 命令中，这是一个向上面的 XKCD 漫画致敬而添加到 Emacs 中的命令。当然，漫画中的 Emacs 命令在技术上是无效的，但它的幽默足以弥补这一点。黑箱我将逐字引用这款游戏的目标：游戏的目标是通过向黑盒子发射光线来找到四个隐藏的球。有四种可能： 1) 射线将通过盒子不受干扰； 2) 它将击中一个球并被吸收； 3) 它将偏转并退出盒子，或 4) 立即偏转，甚至不能进入盒子。所以，这有点像我们小时候玩的战舰游戏)，但是……是专为物理专业高学历的人准备的吧？这是另一款添加于 20 世纪 80 年代的游戏。我建议你输入 C-h f blackbox 来阅读玩法说明（文档巨大）。泡泡M-x bubble 游戏相当简单：你必须用尽可能少移动清除尽可能多的“泡泡”。当你移除气泡时，其他气泡会掉落并粘在一起。这是一款有趣的游戏，此外如果你使用 Emacs 的图形用户界面，它还支持图像显示。而且它还支持鼠标。你可以通过调用 M-x bubbles-set-game-<difficulty> 来设置难度，其中 <difficulty> 可以是这些之一：easy、medium、difficult、hard 或 userdefined。此外，你可以使用：M-x custom-group bubbles 来更改图形、网格大小和颜色。由于它即简单又有趣，这是 Emacs 中我最喜欢的游戏之一。幸运饼干我喜欢 fortun…