大模型时代我们怎么玩Emacs:1. 中英文输入时的空格

· 1907字 · 4分钟

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 这个包,用了一段时间之后发现几个问题:

  1. 默认情况下, 它只是通过 Overlay 让你看上去在中英文之间加了空格,实际上没有加,这会导致在导出为其他文件如 HTML 时没有加空格。

  2. 如果通过 (setq pangu-spacing-real-insert-separtor t) 设置在中英文之间真实加上空格,那会出现一个致命的问题,它会默认把整个文档的所有中英文之间加上空格,甚至类似 [[file:中文English文件夹名/中文English.png]] 这种链接,也会自动在中英文之间加上空格,这样就破坏了链接的结构。

    请注意,它的修改范围是整个文档,这在一个很大的已经有很多内容的 Org 文档里,简直就是一个灾难。

  3. 具有强制性,无法删除我们不想要的空格

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 相比有哪些特点呢:

  1. 足够安全:只作用于输入的时候,不会改变文件原有的中英文布局
  2. 真实空格:添加的是空格,并且可以删除,非强制
  3. 兼容性考虑:如果已经手动输入了空格就不会再插入空格
  4. 不考虑标点符号:先只考虑中英文和数字,因为标点在 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 完整的聊天记录 🔗

与 ChatGPT 的完整聊天记录

4 结语 🔗

这个系列的分享,只是提供了一个新的思路,我们在这个伟大的时代,要善于利用大模型达到我们的目标。当然,我的这些分享,在大牛面前,什么都不是,大佬分分钟都能做到而且做的更好。但从一个产品经理的角度,从一个代码经验近乎小白的角度,似乎有那么一些意义。

后续,将会继续分享几个案例。

  • 中文按词移动和删除
  • Org mode 代码块的出错信息
  • org-super-links 链接与反链改造

我也会持续的使用 ChatGPT 和 Emacs,持续分享我的心得,感谢您的阅读。