标签 EMACS 下的文章

本文简短地对 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 并再次点击回车。

图 1: Emacs 迷你缓冲区中编译命令

这将在 Emacs 中开启另一个缓冲区,显示编译的状态。如果你的代码输入没有错误,你将预期得到如图 2 所示的缓冲区。

图 2: 编译状态

要想隐藏编译缓冲区,首先确保你的光标在编译缓冲区中(你可以不使用鼠标,而是通过 C-x o 快捷键将光标从一个缓冲区移动到另一个),然后按下 C-x 0。下一步就是运行代码,并观察是否运行良好。按下 M-! 快捷键并在迷你缓冲区的提示符后面输入 ./a.out

图 3: 代码在迷你缓冲区中的输出

你可以看到迷你缓冲区中显示断言失败。很明显代码中有错误,因为 5 的阶乘是 120。那么让我们现在开始调试吧。

使用 GUD 调式代码

现在,我们的代码已经编译完成,是时候看看到底哪里出错了。按下 M-x 快捷键并在提示符后输入 gdb。在接下来的提示符后,输入 gdb -i=mi a.out。如果一切顺利,GDB 会在 Emacs 缓冲区中启动,你会看到如图 4 所示的窗口。

图 4: Emacs 中的 GDB 缓冲区

gdb 提示符后,输入 break main 来设置断点,并输入 r 来运行程序。程序会开始运行并停在 main() 函数处。

一旦 GDB 到达了 main 处设置的断点,就会弹出一个新的缓冲区显示你正在调试的代码。注意左侧的红点,正是你设置断点的位置,同时会有一个小的标志提示你当前代码运行到了哪一行。当前,该标志就在断点处(如图 5)。

图 5: GDB 与代码显示在两个分离的窗口

为了调试 factorial 函数,我们需要单步运行。想要达到此目的,你可以在 GBD 提示符使用 GDB 命令 step,或者使用 Emacs 快捷键 C-c C-s。还有其它一些快捷键,但我更喜欢 GDB 命令。因此我将在本文的后续部分使用它们。

单步运行时让我们注意一下局部变量中的阶乘值。参考图 6 来设置在 Emacs 帧中显示局部变量值。

图 6: 在 Emacs 中使用独立帧显示局部变量

在 GDB 提示符中进行单步运行并观察局部变量值的变化。在循环的第一次迭代中,我们发现了一个问题。此处乘法的结果应该是 5 而不是 4。

本文到这里也差不多结束了,读者可以自行探索发现 GUD 模式这片新大陆。GDB 中的所有命令都可以在 GUD 模式中运行。我将此代码的修复留给读者作为一个练习。看看你在调试的过程中,可以做哪一些定制化,来使你的工作流更加简单和高效。


via: https://opensourceforu.com/2019/09/debugging-in-emacs-the-grand-unified-debugger/

作者:Vineeth Kartha 选题:lujun9972 译者:cycoe 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

即使你的操作系统是闭源的,你仍然可以使用这个流行的开源文本编辑器。

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

 title=

下载适用于 Windows 的 GNU Emacs

要在 Windows 上手动安装 GNU Emacs,你必须下载 Emacs

 title=

它会打开连接到离你最近的服务器,并展示所有可用的 Emacs 版本。找到发行版本号最高的目录,然后单击进入。Windows 有许多不同的 Emacs 构建,但是最通用的版本只是被命名为 emacs-VERSION-ARCHITECTURE.zipVERSION 取决于你要下载的版本,而 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 文件启动应用。

 title=

你可以在桌面上创建 emacs.exe 的快捷方式,以便于访问。

学习 Emacs

Emacs 并不像传闻那样难用。它具有自己的传统和惯例,但是当你其中输入文本时,你可以像在记事本或者网站的文本框中那样使用它。

重要的区别是在你编辑输入的文本时。

但是,学习的唯一方法是开始使用它,因此,使 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中国 荣誉推出

在 2020 年用开源实现更高生产力的二十种方式的第十九篇文章中,访问 Twitter、Reddit、 交谈、电子邮件 、RSS 和你的待办事项列表。

去年,我在 19 天里给你介绍了 19 个新(对你而言)的生产力工具。今年,我换了一种方式:使用你在使用或者还没使用的工具,构建一个使你可以在新一年更加高效的环境。

使用 Emacs 做(几乎)所有的事情,第 2 部分

昨天,我谈到了如何在 Emacs 中读取电子邮件、访问电子邮件地址和显示日历。Emacs 功能繁多,你还可以将它用于 Twitter、交谈、待办事项列表等等!

 title=

要完成所有这些,你需要安装一些 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 中发推

 title=

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 追踪你的待办事项

 title=

Todotxt.el 是一个很棒的 todo.txt 待办列表管理器接口。它的快捷键几乎无所不包。

输入 Meta+x todotxt 启动它将加载 todotxt-file 变量中指定的 todo.txt 文件(本文的第一部分中设置了该文件)。在 todo.txt 的缓冲区(窗口),你可以按 a 添加新任务并和按 c 标记它已被完成。你还可以使用 r 设置优先级,并使用 t 添加项目和上下文。完成事项后只需要按下 A 即可将任务移如 done.txt。你可以使用 / 过滤列表,也可以使用 l 刷新完整列表。同样,你可以按 q 退出。

在 Emacs 中使用 ERC 进行交谈

 title=

Vim 的缺点之一是很难用它与人交谈。另一方面,Emacs 则将 ERC 客户端内置到默认发行版中。使用 Meta+x ERC 启动 ERC,系统将提示你输入服务器、用户名和密码。你可以使用几天前介绍设置 BitlBee 时使用的相同信息:服务器为 localhost,端口为 6667,相同用户名,无需密码。

ERC 使用起来与其他 IRC 客户端一样。每个频道单独一个缓冲区(窗口),你可以使用 Ctrl+x ctrl+b 进行频道间切换,这也可以在 Emacs 中的其他缓冲区之间进行切换。/quit 命令将退出 ERC。

使用 Gnus 阅读电子邮件,Reddit 和 RSS

 title=

我相信昨天在我提及在 Emacs 中阅读邮件时,许多 Emacs 的老用户会问,“怎么没有 Gnus 呢?”

这个疑问很合理。Gnus 是一个内置在 Emacs 中的邮件和新闻阅读器,尽管它这个邮件阅读器不支持以 Notmuch 作为搜索引擎。但是,如果你将其配置来阅读 Reddit 和 RSS feed(稍后你将这样做),那么同时使用它来阅读邮件是个聪明的选择。

Gnus 是为阅读 Usenet 新闻而创建的,并从此发展而来。因此,它的很多外观和感觉(以及术语)看起来很像 Usenet 的新闻阅读器。

Gnus 以 ~/.gnus 作为自己的配置文件。(该配置也可以包含在 ~/.emacs.d/init.el 中)。使用 Ctrl+x Ctrl+f 打开 ~/.gnus,并添加以下内容:

;; Required packages
(require 'nnir)
(require 'nnrss)

;; Primary Mailbox
(setq gnus-select-method
      '(nnmaildir "Local"
                  (directory "~/Maildir")
                  (nnir-search-engine notmuch)
      ))
(add-to-list 'gnus-secondary-select-methods
             '(nnreddit ""))

Ctrl+x Ctrl+s 保存文件。这分配置告诉 Gnus 从 ~/Maildir 这个本地邮箱中读取邮件作为主源(参见 gnus-select-method 变量),并使用 nnreddit 插件添加辅源(gnus-secondary-select-methods 变量)。你还可以定义多个辅助源,包括 Usenet 新闻(nntp)、IMAP (nnimap)、mbox(nnmbox)和虚拟集合(nnvirtual)。你可以在 Gnus 手册 中了解更多有关所有选项的信息。

保存文件后,使用 Meta+x Gnus 启动 Gnus。第一次运行将在 Python 虚拟环境中安装 Reddit 终端查看器,Gnus 通过它获取 Reddit 上的文章。然后它会启动浏览器来登录 Reddit。之后,它会扫描并加载你订阅的 Reddit 群组。你会看到一个有新邮件的邮件夹列表和一个有新内容的看板列表。在任一列表上按回车将加载该组中的消息列表。你可以使用箭头键导航并按回车加载和读取消息。在查看消息列表时,按 q 将返回到前一个视图,从主窗口按 q 将退出 Gnus。在阅读 Reddit 群组时,a 会创建一条新消息;在邮件组中,m 创建一个新的电子邮件;并且在任何一个视图中按 r 回复邮件。

你还可以向 Gnus 接口中添加 RSS 流,并像阅读邮件和新闻组一样阅读它们。要添加 RSS 流,输入 G+R 并填写 RSS 流的 URL。会有提示让你输入 RSS 的标题和描述,这些信息可以从流中提取出来并填充进去。现在输入 g 来检查新消息(这将检查所有组中的新消息)。阅读 RSS 流 就像阅读 Reddit 群组和邮件一样,它们使用相同的快捷键。

Gnus 中有很多功能,还有大量的键组合。Gnus 参考卡为每个视图列出了所有这些键组合(以非常小的字体显示在 5 页纸上)。

使用 nyan-mode 查看位置

最后,你可能会一些截屏底部注意到 Nyan cat。这是 nyan-mode,它指示了你在缓冲区中的位置,因此当你接近文档或缓冲区的底部时,它会变长。你可以使用包管理器安装它,并在 ~/.emacs.d/init.el 中使用以下代码进行设置:

;; Nyan Cat
(setq nyan-wavy-trail t)
(setq nyan-bar-length 20)
(nyan-mode)

Emacs 的基本功能

这只是 Emacs 所有功能的皮毛。Emacs 非常强大,是我用来提高工作效率的必要工具之一,无论我是在追踪待办事项、阅读和回复邮件、编辑文本,还是与朋友和同事交流我都用它。这需要一点时间来适应,但是一旦你习惯了,它就会成为你桌面上最有用的工具之一。


via: https://opensource.com/article/20/1/emacs-social-track-todo-list

作者:Kevin Sonney 选题:lujun9972 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

又是周一,你正在为你的老板 Lumbergh (LCTT 译注:《上班一条虫》中的副总裁)努力倒腾那些 无聊之极的文档。为什么不玩玩 Emacs 中类似 zork 的文字冒险游戏来让你的大脑从单调的工作中解脱出来呢?

但说真的,Emacs 中既有游戏,也有古怪的玩物。有些你可能有所耳闻。这些玩意唯一的共同点就是,它们大多是很久以前就添加到 Emacs 中的:有些东西真的是相当古怪(如你将在下面看到的),而另一些则显然是由无聊的员工或学生们编写的。它们全有一个共同点,都带着一种奇思妙想和随意性,这在今天的 Emacs 中很少见。Emacs 现在变得十分严肃,在某种程度上,它已经与 20 世纪 80 年代那些游戏被编写出来的时候大不一样。

汉诺塔

汉诺塔 是一款古老的数学解密游戏,有些人可能对它很熟悉,因为它的递归和迭代解决方案经常被用于计算机科学教学辅助。

Tower of Hanoi Screenshot

Emacs 中有三个命令可以运行汉诺塔:M-x hanoi 默认为 3 个碟子; M-x hanoi-unixM-x hanoi-unix-64 使用 unix 时间戳的位数(32 位或 64 位)作为默认盘子的个数,并且每秒钟自动移动一次,两者不同之处在于后者假装使用 64 位时钟(因此有 64 个碟子)。

Emacs 中汉诺塔的实现可以追溯到 20 世纪 80 年代中期——确实是久得可怕。它有一些自定义选项(M-x customize-group RET hanoi RET),如启用彩色碟子等。当你离开汉诺塔缓冲区或输入一个字符,你会收到一个讽刺的告别信息(见上图)。

5x5

5x5 game grid

5x5 的游戏是一个逻辑解密游戏:你有一个 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 并给出你的名字来显示一个奇特的生日礼物动画。它看起来很酷!

xkcd

这里用的 animate 包也用在了 M-x butterfly 命令中,这是一个向上面的 XKCD 漫画致敬而添加到 Emacs 中的命令。当然,漫画中的 Emacs 命令在技术上是无效的,但它的幽默足以弥补这一点。

黑箱

我将逐字引用这款游戏的目标:

游戏的目标是通过向黑盒子发射光线来找到四个隐藏的球。有四种可能: 1) 射线将通过盒子不受干扰; 2) 它将击中一个球并被吸收; 3) 它将偏转并退出盒子,或 4) 立即偏转,甚至不能进入盒子。

所以,这有点像我们小时候玩的战舰游戏),但是……是专为物理专业高学历的人准备的吧?

这是另一款添加于 20 世纪 80 年代的游戏。我建议你输入 C-h f blackbox 来阅读玩法说明(文档巨大)。

泡泡

Bubbles game

M-x bubble 游戏相当简单:你必须用尽可能少移动清除尽可能多的“泡泡”。当你移除气泡时,其他气泡会掉落并粘在一起。这是一款有趣的游戏,此外如果你使用 Emacs 的图形用户界面,它还支持图像显示。而且它还支持鼠标。

你可以通过调用 M-x bubbles-set-game-<difficulty> 来设置难度,其中 <difficulty> 可以是这些之一:easymediumdifficultharduserdefined。此外,你可以使用:M-x custom-group bubbles 来更改图形、网格大小和颜色。

由于它即简单又有趣,这是 Emacs 中我最喜欢的游戏之一。

幸运饼干

我喜欢 fortune 命令。每当我启动一个新 shell 时,这些与文学片段、谜语相结合的刻薄、无益、常常带有讽刺意味的“建议”就会点亮我的一天。

令人困惑的是,Emacs 中有两个包或多或少地做着类似的事情:fortunecookie。前者主要用于在电子邮件签名中添加幸运饼干消息,而后者只是一个简单的 fortune 格式阅读器。

不管怎样,使用 Emacs 的 cookie 包前,你首先需要通过 customize-option RET cookie RET 来自定义变量 cookie-file 告诉它从哪找到 fortune 文件。

如果你的操作系统是 Ubuntu,那么你先安装 fortune 软件包,然后就能在 /usr/share/games/fortune/ 目录中找到这些文件了。

之后你就可以调用 M-x cookie 随机显示 fortune 内容,或者,如果你想的话,也可以调用 M-x cookie-apropos 查找所有匹配的饼干。

破译器

这个包完美地抓住了 Emacs 的功利本质:这个包为你破解简单的替换密码(如“密码谜题”)提供了一个很有用的界面。你知道,二十多年前,有些人确实迫切需要破解很多基本的密码。正是像这个模块这样的小玩意让我非常高兴地用起 Emacs 来:一个只对少数人有用的模块,但是,如果你突然需要它了,那么它就在那里等着你。

那么如何使用它呢?让我们假设使用 “rot13” 密码:在 26 个字符的字母表中,将字符旋转 13 个位置。 通过 M-x ielm (Emacs 用于 运行 Elisp 的 REPL 环境)可以很容易在 Emacs 中进行尝试:

*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (rot13 "Hello, World")
"Uryyb, Jbeyq"
ELISP> (rot13 "Uryyb, Jbeyq")
"Hello, World"
ELISP>

简而言之,你将明文旋转了 13 个位置,就得到了密文。你又旋转了一次 13 个位置,就返回了最初的明文。 这就是这个包可以帮助你解决的问题。

那么,decipher 模块又是如何帮助我们的呢?让我们创建一个新的缓冲区 test-cipher 并输入你的密文(在我的例子中是 Uryyb,Jbeyq)。

你现在面对的是一个相当复杂的界面。现在把光标放在紫色行的密文的任意字符上,并猜测这个字符可能是什么:Emacs 将根据你的选择更新其他明文的猜测结果,并告诉你目前为止字母表中的字符是如何分配的。

你现在可以用下面各种助手命令来关闭选项,以帮助推断密码字符可能对应的明文字符:

  • D: 列出示意图(该加密算法中双字符对)及其频率
  • F: 表示每个密文字母的频率
  • N: 显示字符的邻近信息。我不确定这是干啥的。
  • MR: 保存和恢复一个检查点,允许你对工作进行分支以探索破解密码的不同方法。

总而言之,对于这样一个深奥的任务,这个包是相当令人印象深刻的!如果你经常破解密码,也许这个程序包能帮上忙?

医生

doctor

啊,Emacs 医生。其基于最初的 ELIZA,“医生”试图对你说的话进行心理分析,并试图把问题复述给你。体验几分钟,相当有趣,它也是 Emacs 中最著名的古怪玩意之一。你可以使用 M-x doctor 来运行它。

Dunnet

Emacs 自己特有的类 Zork 文字冒险游戏。输入 M-x dunnet 就能玩了。这是一款相当不错的游戏,简单的说,它是另一款非常著名的 Emacs 游戏,很少有人真正玩到通关。

如果你发现自己能在无聊的文档工作之间空出时间来,那么这是一个超级棒的游戏,内置“老板屏幕”,因为它是纯文本的。

哦,还有,不要想着吃掉那块 CPU 卡 :)

五子棋

gomoku

另一款写于 20 世纪 80 年代的游戏。你必须将 5 个方块连成一条线,井字棋风格。你可以运行 M-x gomoku 来与 Emacs 对抗。游戏还支持鼠标,非常方便。你也可以自定义 gomoku 组来调整网格的大小。

生命游戏

康威的生命游戏 是细胞自动机的一个著名例子。Emacs 版本提供了一些启动模式,你可以(通过 elisp 编程)调整 life-patterns 变量来更改这些模式。

你可以用 M-x life 触发生命游戏。事实上,所有的东西,包括显示代码、注释等等一切,总共不到 300 行,这也让人印象深刻。

乒乓,贪吃蛇和俄罗斯方块

tetris

这些经典游戏都是使用 Emacs 包 gamegrid 实现的,这是一个用于构建网格游戏(如俄罗斯方块和贪吃蛇)的通用框架。gamegrid 包的伟大之处在于它同时兼容图形化和终端 Emacs:如果你在 GUI 中运行 Emacs,你会得到精美的图形;如果你没有,你看到简单的 ASCII 艺术。

你可以通过输入 M-x pongM-x snakeM-x tetris 来运行这些游戏。

特别是俄罗斯方块游戏实现的非常到位,会逐渐增加速度并且能够滑块。而且既然你已经有了源代码,你完全可以移除那个讨厌的 Z 形块,没人喜欢它!

Solitaire

solitaire image

可惜,这不是纸牌游戏,而是一个基于“钉子”的游戏,你可以选择一块石头(o)并“跳过”相邻的石头进入洞中(.),并在这个过程中去掉你跳过的石头,最终只能在棋盘上留下一块石头,重复该过程直到棋盘被请空(只保留一个石头)。

如果你卡住了,有一个内置的解题器名为 M-x solitire-solve

Zone

我的另一个最爱。这是一个屏幕保护程序——或者更确切地说,是一系列的屏幕保护程序。

输入 M-x zone,然后看看屏幕上发生了什么!

你可以通过运行 M-x zone-when-idle(或从 elisp 调用它)来配置屏幕保护程序的空闲时间,时间以秒为单位。你也可以通过 M-x zone-leave-me-alone 来关闭它。

如果在你的同事看着的时候启动它,你的同事肯定会抓狂的。

乘法解谜

mpuz

这是另一个脑筋急转弯的益智游戏。当你运行 M-x mpuz 时,将看到一个乘法解谜题,你必须将字母替换为对应的数字,并确保数字相加(相乘?)符合结果。

如果遇到难题,可以运行 M-x mpuz-show-solution 来解决。

杂项

还有更多好玩的东西,但它们就不如刚才那些那么好玩好用了:

  • 你可以通过 M-x morse-regionM-x unmorse-region 将一个区域翻译成莫尔斯电码。
  • Dissociated Press 是一个非常简单的命令,它将一个类似随机穿行的马尔可夫链生成器应用到缓冲区中的文本中,并以此生成无意义的文本。试一下 M-x dissociated-press
  • gametree 软件包是一个通过电子邮件记录和跟踪国际象棋游戏的复杂方法。
  • M-x spook 命令插入随机单词(通常是到电子邮件中),目的是混淆/超载 “NSA 拖网渔船” —— 记住,这个模块可以追溯到 20 世纪 80 年代和 90 年代,那时应该有间谍们在监听各种单词。当然,即使是在十年前,这样做也会显得非常偏执和古怪,不过现在看来已经不那么奇怪了……

总结

我喜欢 Emacs 附带的游戏和玩具。它们大多来自于,嗯,我们姑且称之为一个不同的时代:一个允许或甚至鼓励奇思妙想的时代。有些玩意非常经典(如俄罗斯方块和汉诺塔),有些对经典游戏进行了有趣的变种(如黑盒)——但我很高兴这么多年后它们依然存在于 Emacs 中。我想知道时至今日,类似这些的玩意是否还会再纳入 Emacs 的代码库中;嗯,它们很可能不会——它们将被归入包管理仓库中,而在这个干净而无菌的世界中,它们无疑属于包管理仓库。

Emacs 要求将对 Emacs 体验不重要的内容转移到包管理仓库 ELPA 中。我的意思是,作为一个开发者,这是有道理的,但是……对于每一个被移出并流放到 ELPA 的包,我们是不是在蚕食 Emacs 的精髓?


via: https://www.masteringemacs.org/article/fun-games-in-emacs

作者:Mickey Petersen 选题:lujun9972 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你知道吗,Emacs 捆绑了一个俄罗斯方块的实现?只需要输入 M-x tetris 就行了。

在对文本编辑器的讨论中,Emacs 鼓吹者经常提到这一点。“没错,但是你那个编辑器能运行俄罗斯方块吗?”我很好奇,这会让大家相信 Emacs 更优秀吗?比如,为什么有人会关心他们是否可以在文本编辑器中玩游戏呢?“没错,但是你那台吸尘器能播放 mp3 吗?”

有人说,俄罗斯方块总是很有趣的。像 Emacs 中的所有东西一样,它的源代码是开放的,易于检查和修改,因此 我们可以使它变得更加有趣。所谓更加有趣,我的意思是更难。

让游戏变得更难的一个最简单的方法就是“隐藏下一个块预览”。你无法在知道下一个块会填满空间的情况下有意地将 S/Z 块放在一个危险的位置——你必须碰碰运气,希望出现最好的情况。下面是没有预览的情况(如你所见,没有预览,我做出的某些选择带来了“可怕的后果”):

预览框由一个名为 tetris-draw-next-shape 1 的函数设置:

(defun tetris-draw-next-shape ()
  (dotimes (x 4)
    (dotimes (y 4)
      (gamegrid-set-cell (+ tetris-next-x x)
                         (+ tetris-next-y y)
                         tetris-blank)))
  (dotimes (i 4)
    (let ((tetris-shape tetris-next-shape)
          (tetris-rot 0))
      (gamegrid-set-cell (+ tetris-next-x
                            (aref (tetris-get-shape-cell i) 0))
                         (+ tetris-next-y
                            (aref (tetris-get-shape-cell i) 1))
                         tetris-shape))))

首先,我们引入一个标志,决定是否允许显示下一个预览块 2

(defvar tetris-preview-next-shape nil
  "When non-nil, show the next block the preview box.")

现在的问题是,我们如何才能让 tetris-draw-next-shape 遵从这个标志?最明显的方法是重新定义它:

(defun tetris-draw-next-shape ()
  (when tetris-preview-next-shape
    ;; existing tetris-draw-next-shape logic
    ))

但这不是理想的解决方案。同一个函数有两个定义,这很容易引起混淆,如果上游版本发生变化,我们必须维护修改后的定义。

一个更好的方法是使用 advice。Emacs 的 advice 类似于 Python 装饰器,但是更加灵活,因为 advice 可以从任何地方添加到函数中。这意味着我们可以修改函数而不影响原始的源文件。

有很多不同的方法使用 Emacs advice(查看手册),但是这里我们只使用 advice-add 函数和 :around 标志。advice 函数将原始函数作为参数,原始函数可能执行也可能不执行。我们这里,我们让原始函数只有在预览标志是非空的情况下才能执行:

(defun tetris-maybe-draw-next-shape (tetris-draw-next-shape)
  (when tetris-preview-next-shape
    (funcall tetris-draw-next-shape)))

(advice-add 'tetris-draw-next-shape :around #'tetris-maybe-draw-next-shape)

这段代码将修改 tetris-draw-next-shape 的行为,而且它可以存储在配置文件中,与实际的俄罗斯方块代码分离。

去掉预览框是一个简单的改变。一个更激烈的变化是,让块随机停止在空中

本图中,红色的 I 和绿色的 T 部分没有掉下来,它们被固定下来了。这会让游戏变得 极其困难,但却很容易实现。

和前面一样,我们首先定义一个标志:

(defvar tetris-stop-midair t
  "If non-nil, pieces will sometimes stop in the air.")

目前,Emacs 俄罗斯方块的工作方式 类似这样子:活动部件有 x 和 y 坐标。在每个时钟滴答声中,y 坐标递增(块向下移动一行),然后检查是否有与现存的块重叠。如果检测到重叠,则将该块回退(其 y 坐标递减)并设置该活动块到位。为了让一个块在半空中停下来,我们所要做的就是破解检测函数 tetris-test-shape

这个函数内部做什么并不重要 —— 重要的是它是一个返回布尔值的无参数函数。我们需要它在正常情况下返回布尔值 true(否则我们将出现奇怪的重叠情况),但在其他时候也需要它返回 true。我相信有很多方法可以做到这一点,以下是我的方法的:

(defun tetris-test-shape-random (tetris-test-shape)
  (or (and
       tetris-stop-midair
       ;; Don't stop on the first shape.
       (< 1 tetris-n-shapes )
       ;; Stop every INTERVAL pieces.
       (let ((interval 7))
         (zerop (mod tetris-n-shapes interval)))
       ;; Don't stop too early (it makes the game unplayable).
       (let ((upper-limit 8))
         (< upper-limit tetris-pos-y))
       ;; Don't stop at the same place every time.
       (zerop (mod (random 7) 10)))
      (funcall tetris-test-shape)))

(advice-add 'tetris-test-shape :around #'tetris-test-shape-random)

这里的硬编码参数使游戏变得更困难,但仍然可玩。当时我在飞机上喝醉了,所以它们可能需要进一步调整。

顺便说一下,根据我的 tetris-scores 文件,我的 最高分 是:

01389   Wed Dec  5 15:32:19 2018

该文件中列出的分数默认最多为五位数,因此这个分数看起来不是很好。

给读者的练习

  1. 使用 advice 修改 Emacs 俄罗斯方块,使得每当方块下移动时就闪烁显示讯息 “OH SHIT”。消息的大小与块堆的高度成比例(当没有块时,消息应该很小的或不存在的,当最高块接近天花板时,消息应该很大)。
  2. 在这里给出的 tetris-test-shape-random 版本中,每隔七格就有一个半空中停止。一个玩家有可能能计算出时间间隔,并利用它来获得优势。修改它,使间隔随机在一些合理的范围内(例如,每 5 到 10 格)。
  3. 另一个对使用 Tetris 使用 advise 的场景,你可以试试 autotetris-mode
  4. 想出一个有趣的方法来打乱块的旋转机制,然后使用 advice 来实现它。

  1. Emacs 只有一个巨大的全局命名空间,因此函数和变量名一般以包名做前缀以避免冲突。
  2. 很多人会说你不应该使用已有的命名空间前缀而且应该将自己定义的所有东西都放在一个预留的命名空间中,比如像这样 my/tetris-preview-next-shape,然而这样很难看而且没什么意义,因此我不会这么干。

via: https://nickdrozd.github.io/2019/01/14/tetris.html

作者:nickdrozd 选题:lujun9972 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 2020 年用开源实现更高生产力的二十种方式的第十八篇文章中,使用 Emacs 文本编辑器管理电子邮件和查看日程安排。

去年,我给你们带来了 2019 年的 19 天新生产力工具系列。今年,我将采取一种不同的方式:建立一个新的环境,让你使用已用或未用的工具来在新的一年里变得更有效率。

使用 Emacs 做(几乎)所有的事情,第 1 部分

两天前,我曾经说过我经常使用 VimEmacs,在本系列的 1617 天,我讲解了如何在 Vim 中做几乎所有的事情。现在,Emacs 的时间到了!

 title=

在深入之前,我需要说明两件事。首先,我这里使用默认的 Emacs 配置,而不是我之前写过Spacemacs。为什么呢?因为这样一来我使用的就是默认快捷键,从而使你可以参考文档,而不必将“原生的 Emacs” 转换为 Spacemacs。第二,在本系列文章中我没有对 Org 模式进行任何设置。Org 模式本身几乎可以自成一个完整的系列,它非常强大,但是设置可能非常复杂。

配置 Emacs

配置 Emacs 比配置 Vim 稍微复杂一些,但以我之见,从长远来看,这样做是值得的。首先我们创建一个配置文件,并在 Emacs 中打开它:

mkdir ~/.emacs.d
emacs ~/.emacs.d/init.el

接下来,向内置的包管理器添加一些额外的包源。在 init.el 中添加以下内容:

(package-initialize)
(add-to-list 'package-archives '("melpa" . "<http://melpa.org/packages/>"))
(add-to-list 'package-archives '("org" . "<http://orgmode.org/elpa/>") t)
(add-to-list 'package-archives '("gnu" . "<https://elpa.gnu.org/packages/>"))
(package-refresh-contents)

使用 Ctrl+x Ctrl+s 保存文件,然后按下 Ctrl+x Ctrl+c 退出,再重启 Emacs。Emacs 会在启动时下载所有的插件包列表,之后你就可以使用内置的包管理器安装插件了。输入 Meta+x 会弹出命令提示符(大多数键盘上 Meta 键就是的 Alt 键,而在 MacOS 上则是 Option)。在命令提示符下输入 package-list-packages 就会显示可以安装的包列表。遍历该列表并使用 i 键选择以下包:

bbdb
bbdb-vcard
calfw
calfw-ical
notmuch

选好软件包后按 x 安装它们。根据你的网络连接情况,这可能需要一段时间。你也许会看到一些编译错误,但是可以忽略它们。安装完成后,使用组合键 Ctrl+x Ctrl+f 打开 ~/.emacs.d/init.el,并在 (package-refresh-packages) 之后、 (custom-set-variables 之前添加以下行到文件中。 (custom-set-variables 行由 Emacs 内部维护,你永远不应该修改它之后的任何内容。以 ;; 开头的行则是注释。

;; Set up bbdb
(require 'bbdb)
(bbdb-initialize 'message)
(bbdb-insinuate-message)
(add-hook 'message-setup-hook 'bbdb-insinuate-mail)
;; set up calendar
(require 'calfw)
(require 'calfw-ical)
;; Set this to the URL of your calendar. Google users will use
;; the Secret Address in iCalendar Format from the calendar settings
(cfw:open-ical-calendar "<https://path/to/my/ics/file.ics>")
;; Set up notmuch
(require 'notmuch)
;; set up mail sending using sendmail
(setq send-mail-function (quote sendmail-send-it))
(setq user-mail-address "[[email protected]][9]"
      user-full-name "My Name")

现在,你已经准备好使用自己的配置启动 Emacs 了!保存 init.el 文件(Ctrl+x Ctrl+s),退出 Emacs(Ctrl+x Ctrl+c),然后重启之。这次重启要多花些时间。

使用 Notmuch 在 Emacs 中读写电子邮件

一旦你看到了 Emacs 启动屏幕,你就可以使用 Notmuch 来阅读电子邮件了。键入 Meta+x notmuch,你将看到 notmuch 的 Emacs 界面。

 title=

所有加粗的项目都是指向电子邮件视图的链接。你可以通过点击鼠标或者使用 tab 键在它们之间跳转并按回车来访问它们。你可以使用搜索栏来搜索 Notmuch 的数据库,语法与 Notmuch 命令行上的语法 相同。如果你愿意,还可以使用 [save] 按钮保存搜索以便未来使用,这些搜索会被添加到屏幕顶部的列表中。如果你进入一个链接就会看到一个相关电子邮件的列表。你可以使用箭头键在列表中导航,并在要读取的消息上按回车。按 r 可以回复一条消息,f 转发该消息,q 退出当前屏幕。

你可以通过键入 Meta+x compose-mail 来编写新消息。撰写、回复和转发都将打开编写邮件的界面。写完邮件后,按 Ctrl+c Ctrl+c 发送。如果你决定不发送它,按 Ctrl+c Ctrl+k 关闭消息撰写缓冲区(窗口)。

使用 BBDB 在 Emacs 中自动补完电子邮件地址

 title=

那么通讯录怎么办?这就是 BBDB 发挥作用的地方。但首先我们需要从 abook 导入所有地址,方法是打开命令行并运行以下导出命令:

abook --convert --outformat vcard --outfile ~/all-my-addresses.vcf --infile ~/.abook/addresses

Emacs 启动后,运行 Meta+x bbdb-vcard-import-file。它将提示你输入要导入的文件名,即 ~/all-my-address.vcf。导入完成后,在编写消息时,可以开始输入名称并使用 Tab 搜索和自动完成 “to” 字段的内容。BBDB 还会打开一个联系人缓冲区,以便你确保它是正确的。

既然在 vdirsyncer 中已经为每个地址都生成了对应的 .vcf 文件了,为什么我们还要这样做呢?如果你像我一样,有许多地址,一次处理一个地址是很麻烦的。这样做,你就可以把所有的东西都放在 abook 里,做成一个大文件。

使用 calfw 在 Emacs 中浏览日历

 title=

最后,你可以使用 Emacs 查看日历。在上面的配置中,你安装了 calfw 包,并添加了一些行来告诉它在哪里可以找到要加载的日历。Calfw 是 “ Emacs 日历框架 Calendar Framework for Emacs ”的简称,它支持多种日历格式。我使用的是谷歌日历,这也是我放在配置中的链接。日历将在启动时自动加载,你可以通过 Ctrl+x+b 命令切换到 cfw-calendar 缓冲区来查看日历。

Calfw 提供日、周、双周和月视图。你可以在日历顶部选择视图,并使用箭头键导航日历。不幸的是,calfw 只能查看日历,所以你仍然需要使用 khal 之类的工具或通过 web 界面来添加、删除和修改事件。

这就是 Emacs 中的邮件、日历和邮件地址。明天我会展示更多。


via: https://opensource.com/article/20/1/emacs-mail-calendar

作者:Kevin Sonney 选题:lujun9972 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出