1 概述 🔗
在大模型时代,一切皆有可能。对于 Emacs 同样如此,大模型拉低学习了 Emacs 的门槛,我们通过大模型可以做到以前我们敢想不敢做,或敢做没时间做,或有时间不会做的事。
今天开始一个新的系列,跟大家分享在大模型时代,我们可以如何“玩” Emacs,我们应该怎么用大模型来满足自己对 Emacs 使用的需求。
2 大模型 🔗
这个系列的几个案例,均基于 OpenAI 的 ChatGPT-4o
模型(主要是花了钱,不用浪费不是😀)。大模型能做很多事,这里简单说说我们可以通过 ChatGPT 对 Emacs 做什么:
- 让 ChatGPT 帮忙阅读代码,解释代码,这样以前看不懂的代码可以通过 ChatGPT 看明白
- 让 ChatGPT 帮忙写代码,尤其是我们对 Emacs 的配置进行调整,需要写一些函数甚至插件
- 让 ChatGPT 优化已经写好的代码,让代码更加规范和可读
- 让 ChatGPT 充当 Emacs 百科,充当 Google 的角色,回答各种配置问题
- …
所有的这一切,都需要有一个前提,就是你需要学会「正确的问问题」。我想这个技能,不是因为 ChatGPT 的出现才出现,这个问题亘古至今如此,只是对象,从以前问夫子,到网络时代问网友,再到 AI 时代问大模型,其原理不变其宗。
我们与 ChatGPT 的交流,主要通过提示工程。提示词是有方法论的,网上有很多教程,这里不做介绍。与 AI 交流,其实就跟练剑一样,练的多了,也就会了剑,无他,惟手熟耳!
关于这些案例,我在与 ChatGPT 交谈时,实际上并没有很好地遵循提示工程的“三段式”,比较随性,仅供参考。
3 中英文输入时的空格 🔗
3.1 背景 🔗
中文和英文的输入,到底要不要加空格,是一个很有意思的话题。很多人喜欢在中文和英文之间加上空格,有些人不喜欢。如果要加空格,又会遇到一致性的问题,就是如何保证一篇文章的整体风格的统一,要么都加,要么都不加。除了一致性问题,还会遇到在某些特殊的场合不应该加,比如在一个链接里,就不应该在中英文之间加空格。
我自己倾向于加上空格,这样在阅读和导出为 HTML 或其他格式时,更加美观。
前几年,试用过 pangu-spacing 这个包,用了一段时间之后发现几个问题:
-
默认情况下, 它只是通过 Overlay 让你看上去在中英文之间加了空格,实际上没有加,这会导致在导出为其他文件如 HTML 时没有加空格。
-
如果通过
(setq pangu-spacing-real-insert-separtor t)
设置在中英文之间真实加上空格,那会出现一个致命的问题,它会默认把整个文档的所有中英文之间加上空格,甚至类似[[file:中文English文件夹名/中文English.png]]
这种链接,也会自动在中英文之间加上空格,这样就破坏了链接的结构。请注意,它的修改范围是整个文档,这在一个很大的已经有很多内容的 Org 文档里,简直就是一个灾难。
-
具有强制性,无法删除我们不想要的空格
3.2 正确的描述我们的问题 🔗
下面我们通过 ChatGPT 看看能否解决这个痛点问题,首先,我们需要将问题正确的描述出来,让大模型理解我们的需求是什么。
3.2.1 第一次描述问题 🔗
3.2.2 测试之后的问题描述 🔗
3.2.3 额外的需求描述 🔗
…
3.3 最终的效果 🔗
通过不断的测试 ChatGPT 生成的代码,我们得到了一个非常好的实现(对我个人来说满足我的需求),我们可以通过 (auto-space-mode t)
的方式开启中英文之间自动加空格,也可以通过 (auto-space-mode nil)
来关闭这个模式。
它与 pangu-spacing
相比有哪些特点呢:
- 足够安全:只作用于输入的时候,不会改变文件原有的中英文布局
- 真实空格:添加的是空格,并且可以删除,非强制
- 兼容性考虑:如果已经手动输入了空格就不会再插入空格
- 不考虑标点符号:先只考虑中英文和数字,因为标点在 org 里比较复杂,有很多表示强调的符号不应该自动加空格
3.4 最终生成的代码 🔗
(defun add-space-between-chinese-and-english ()
"在中英文之间自动添加空格。"
(let ((current-char (char-before))
(prev-char (char-before (1- (point)))))
(when (and current-char prev-char
(or (and (is-chinese-character prev-char) (is-halfwidth-character current-char))
(and (is-halfwidth-character prev-char) (is-chinese-character current-char)))
(not (eq prev-char ?\s))) ; 检查前一个字符不是空格
(save-excursion
(goto-char (1- (point)))
(insert " ")))))
(defun is-chinese-character (char)
"判断字符是否为中文字符。"
(and char (or (and (>= char #x4e00) (<= char #x9fff))
(and (>= char #x3400) (<= char #x4dbf))
(and (>= char #x20000) (<= char #x2a6df))
(and (>= char #x2a700) (<= char #x2b73f))
(and (>= char #x2b740) (<= char #x2b81f))
(and (>= char #x2b820) (<= char #x2ceaf)))))
(defun is-halfwidth-character (char)
"判断字符是否为半角字符,包括英文字母、数字和标点符号。"
(and char (or (and (>= char ?a) (<= char ?z))
(and (>= char ?A) (<= char ?Z))
(and (>= char ?0) (<= char ?9))
)))
(defun delayed-add-space-between-chinese-and-english ()
"延迟执行,在中英文之间自动添加空格。"
(run-with-idle-timer 0 nil 'add-space-between-chinese-and-english))
(define-minor-mode auto-space-mode
"在中英文之间自动添加空格的模式。"
:lighter " Auto-Space"
:global t
(if auto-space-mode
(add-hook 'post-self-insert-hook 'add-space-between-chinese-and-english)
(remove-hook 'post-self-insert-hook 'add-space-between-chinese-and-english)))
3.5 完整的聊天记录 🔗
4 结语 🔗
这个系列的分享,只是提供了一个新的思路,我们在这个伟大的时代,要善于利用大模型达到我们的目标。当然,我的这些分享,在大牛面前,什么都不是,大佬分分钟都能做到而且做的更好。但从一个产品经理的角度,从一个代码经验近乎小白的角度,似乎有那么一些意义。
后续,将会继续分享几个案例。
- 中文按词移动和删除
- Org mode 代码块的出错信息
- org-super-links 链接与反链改造
- …
我也会持续的使用 ChatGPT 和 Emacs,持续分享我的心得,感谢您的阅读。