开了一个新的系列——大模型时代我们怎么玩Emacs

大家好啊,好久不见,最近在写一个新的系列。

在大模型时代,一切皆有可能。对于 Emacs 同样如此,大模型拉低学习了 Emacs 的门槛,我们通过大模型可以做到以前我们敢想不敢做,或敢做没时间做,或有时间不会做的事。

今天开始一个新的系列,跟大家分享在大模型时代,我们可以如何“玩” Emacs,我们应该怎么用大模型来满足自己对 Emacs 使用的需求。

第一篇:1. 中英文输入时的空格

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

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

17 个赞

太强了,我想我们需要的是一个 输入时的hook检测 + 一个linter来检测出已有文章中潜在的需要加空格的地方,pangu-spacing的强制性确实过了头。 建议楼主下一步 试试用chatgpt 写一个检测中英文相邻的flymake backend,这样就完满了。

非常好用!为楼主点赞!

期待更新,紫薯补丁

赞!已经添加到自己的配置文件了。期待后续!

更新来啦。

第二篇:2. 中文按词移动和删除

1 个赞

两篇文章感觉都在讲中文空格, 这个问题我刚开始使用emacs时就感觉不便了,键盘上占地最大的两个键: 空格和左右shift在中文里面都基本没什么用、浪费。

后面我的处理办法是把空格作为了选词查询, shift则作了 快捷键前缀, 部分取代ctrl.

如果是 Mac 的话建议用这个来解决中文分词 GitHub - roife/emt: Emacs macOS Tokenizer, tokenizing CJK words with macOS's built-in NLP tokenizer.

2 个赞

我也碰到了 jieba.el 出这个错误,分享一下解决办法,浅歪一下楼

我是 emacs-plus@29 升级到 emacs-plus@30 之后出的错误,在比较了29和30的jsonrpc,发现新增了 :after,这个会导致 jsonrpc 的 initialize-instance 会在 jieba.el 的 initialize-instance 之后执行,jieba.el 拿到的是 proc 就是一个函数而不是 jsonrpc 处理后的 process 对象了

将 jieba-node.el 按如下方式修改即可

2 个赞

真好,还是得多交流,要不然我可能很难找到这个包!感谢感谢!

非常感谢,可以给 @cireu 大佬提一个PR。

第三篇:3. Org mode 代码块执行错误信息优化

1 个赞

增加了一些功能。

  1. 对于粘贴的文字自动增加中英文空格 2.对于粘贴前后接壤的文字,如果存在中英文接壤,自动添加空格。
(defun process-pasted-text (text prev-char next-char)
  "Process pasted TEXT to add spaces between Chinese and English characters, considering PREV-CHAR and NEXT-CHAR."
  (with-temp-buffer
    (insert (if prev-char (concat (char-to-string prev-char) text) text))
    (goto-char (point-min))
    (while (not (eobp))
      (let ((current-char (char-after))
            (next-char-internal (char-after (1+ (point)))))
        (when (and current-char next-char-internal
                   (should-insert-space current-char next-char-internal)
                   (not (eq (char-after) ?\s)))
          (save-excursion
            (goto-char (1+ (point)))
            (insert " "))))
      (forward-char))
    (let ((buffer-content (buffer-string)))
      (if prev-char
          (setq buffer-content (substring buffer-content 1)))
      ;; Add space between the last char of pasted text and next-char
      (setq buffer-content (insert-space-if-needed
                            (aref buffer-content (1- (length buffer-content)))
                            next-char
                            buffer-content))
      buffer-content)))

(defun auto-space-yank-advice (orig-fun &rest args)
  "Advice to automatically add spaces between Chinese and English characters after yanking."
  (let ((beg (point))
        (prev-char (char-before)))
    (apply orig-fun args)
    (let ((end (point))
          (next-char (char-after)))
      (let ((pasted-text (buffer-substring-no-properties beg end)))
        (delete-region beg end)
        (insert (process-pasted-text pasted-text prev-char next-char))))))

(advice-add 'yank :around #'auto-space-yank-advice)
(advice-add 'yank-pop :around #'auto-space-yank-advice)

另外原本他在文字中间输入新文本时,只有前面根据中英文输入加了空格,后面没有。修改了下 add-space-between-chinese-and-english 函数,如下。

(defun add-space-between-chinese-and-english ()
  "Automatically add a space between Chinese and English characters."
  (let ((current-char (char-before))
        (prev-char (char-before (1- (point))))
        (next-char (char-after)))
    (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))) ; Check if the previous character is a space
      (save-excursion
        (goto-char (1- (point)))
        (insert " ")))
    (when (and current-char next-char
               (or (and (is-chinese-character current-char) (is-halfwidth-character next-char))
                   (and (is-halfwidth-character current-char) (is-chinese-character next-char)))
               (not (eq current-char ?\s))) ; Check if the current character is a space
      (save-excursion
        (goto-char (point))
        (insert " ")))))
5 个赞

太赞了,很好用!

同样是 ai 编写,感谢 gpt-4o。

前些年学elisp时写过一个调用c 动态模块的分词插件,不用服务器,非常流畅,感兴趣的可以看看。 未命名

2 个赞

另外还有个问题,对于非字母的英文符号,并没有算作是英文,修改了一下判断函数,想法来自 Telegram

(defun is-halfwidth-character (char)
  "Determine if a character is a halfwidth character using char-width."
  (and char (not (eq char ?\s)) (= (char-width char) 1)))

2024-05-31 对于一些英文字符不希望插入空格,可以在里面添加

(defun is-halfwidth-character (char)
  "Determine if a character is a halfwidth character using char-width."
  (and char (not (member char '(?\s ?~ ?“ ?”))) (= (char-width char) 1)))

我的解决办法是换了个网格布局的键盘

这也是我的一个痛点,没想到用 ChatGPT这么简单就解决了!

rime 输入英文的时候没有生效。有办法解决不?