Emacs 29 目前适合作为日常生产力工具了么?

今天看到 Org-roam(v2) 以及 org-roam-ui 的使用姿势(已支持Emacs 29 内置的 sqlite) - #151,来自 aqua0210 提到,emacs 29内置sqlite,感觉有些心动。不过比起尝鲜,我更倾向稳定的工作环境。另外,我还带着组内的非技术小伙伴在用win版emacs,希望能保证版本的一致,以便我能协助解决一些奇奇怪怪的问题 :joy:

所以想问下:

  1. mac和windows的Emacs 29是否足够稳定?
  2. 与28相比,有哪方面的重要提升或亮点功能?
  3. 29有没有一些兼容不好的情况?例如与EAF等的兼容? Emacs 29 中 Xinput2 与 EAF 的兼容性问题 (好像最后解决了,抱歉我还没细看)
  4. 29版本的哪个mac版本体验较好?emacs-mac 还是 emacs-plus?
  5. 29版本emacs推荐哪种安装方式?
3 个赞

emac-mac 只跟进最新稳定的版本,没有29

我在天天在 macOS 和 windows 下用 emacs 29。很稳定,目前没遇到什么兼容性问题。 主要看重以下几点:

  1. 支持像素级滚动,可以像浏览器一样用触摸板滚动屏幕
  2. 内置支持 sqlite,可以用于 org-roam 和 epkg
  3. 支持双缓冲,Windows 下滚动屏幕不闪烁
  4. desktop.el 支持 utf-8 以外的编码
2 个赞

我前两个星期msys2下编译安装的29,从27.2到29.50速度的确提升很大。org-roam也快了好多,大多数工作正常,目前遇到个问题: elisp语法着色有问题,像这样(Emacs -Q)

另外,原来使用的 helpful 也有经常会出现这种错误:

font-lock-fontify-keywords-region: No match 2 in highlight (2 font-lock-function-name-face prepend)

能贴个代码链接吗?我这边也试试看

tumashu 的 pyim.el这个文件,也不止这个。

你可以弄一个最简单的能重现的例子代码,大家试试。如果有问题,最好向上游反馈一下。

我截取下面这段:

(require 'cl-lib)
(require 'help-mode)
(require 'pyim-autoselector)
(require 'pyim-common)
(require 'pyim-cstring)
(require 'pyim-dhashcache)
;; NOTE: pyim 默认使用 dhashcache, 按理说不需要加载 dregcache, 但以前 pyim 支持
;; 动态加载后端,由于简化代码的原因,这个功能取消了,require dregcache 是为了向
;; 后兼容,未来也许会取消加载。
(require 'pyim-dregcache)
(require 'pyim-indicator)
(require 'pyim-page)
(require 'pyim-preview)
(require 'pyim-process)
(require 'pyim-scheme)
(require 'subr-x)

(defgroup pyim nil
  "Pyim is a Chinese input method support quanpin, shuangpin, wubi and cangjie."
  :group 'leim)

(defcustom pyim-convert-string-at-point-hook nil
  "Hook of `pyim-convert-string-at-point'.

这个 hook 运行时机:
1. 获取并删除光标处 code 字符串之后。
2. code 转换得到的中文字符串插入之前。

Tip: 用户也可以利用 `pyim-outcome-trigger-function-default' 函数
来构建适合自己的 hook 函数。"
  :type 'hook)

(defcustom pyim-select-word-by-number t
  "使用数字键来选择词条.

如果设置为 nil, 将直接输入数字,适用于使用数字做为
编码的输入法。"
  :type 'boolean)

;;;###autoload
(defvar pyim-title "PYIM ")

(defvar pyim-load-hook nil)
(defvar pyim-activate-hook nil)
(defvar pyim-deactivate-hook nil)

(defvar pyim-mode-map
  (let ((map (make-sparse-keymap))
        (i ?\ ))
    (while (< i 127)
      (define-key map (char-to-string i) #'pyim-self-insert-command)
      (setq i (1+ i)))
    (setq i 128)
    (while (< i 256)
      (define-key map (vector i) #'pyim-self-insert-command)
      (setq i (1+ i)))
    (dolist (i (number-sequence 0 9))
      (define-key map (kbd (number-to-string i))
                  (lambda ()
                    (interactive)
                    (pyim-select-word-by-number i))))
    (dolist (x '(("<f1>" . 1)
                 ("<f2>" . 2)
                 ("<f3>" . 3)
                 ("<f4>" . 4)))
      (define-key map (kbd (car x))
                  (lambda ()
                    (interactive)
                    (pyim-select-char-in-word-by-number (cdr x)))))
    (define-key map " " #'pyim-select-word)
    (define-key map (kbd "C-SPC") #'pyim-select-word-simple)
    (define-key map [backspace] #'pyim-delete-backward-char)
    (define-key map [delete] #'pyim-delete-forward-char)
    (define-key map "\C-d" #'pyim-delete-forward-char)
    (define-key map [M-backspace] #'pyim-delete-backward-imelem)
    (define-key map [M-delete] #'pyim-delete-forward-imelem)
    (define-key map [C-backspace] #'pyim-delete-backward-imelem)
    (define-key map [C-delete] #'pyim-delete-forward-imelem)
    (define-key map [?\t]      #'pyim-toggle-assistant-scheme)
    (define-key map (kbd "TAB") #'pyim-toggle-assistant-scheme)
    (define-key map "\177" #'pyim-delete-backward-char)
    (define-key map "\C-f" #'pyim-forward-point)
    (define-key map "\C-b" #'pyim-backward-point)
    (define-key map "\M-f" #'pyim-forward-imelem)
    (define-key map "\M-b" #'pyim-backward-imelem)
    (define-key map "\C-e" #'pyim-end-of-line)
    (define-key map "\C-a" #'pyim-beginning-of-line)
    (define-key map "=" #'pyim-next-page)
    (define-key map "-" #'pyim-previous-page)
    (define-key map "\C-n" #'pyim-next-word)
    (define-key map "\C-p" #'pyim-previous-word)
    (define-key map "\M-n" #'pyim-next-page)
    (define-key map "\M-p" #'pyim-previous-page)
    (define-key map "\C-m" #'pyim-quit-no-clear)
    (define-key map [return] #'pyim-quit-no-clear)
    (define-key map "\C-c" #'pyim-quit-clear)
    (define-key map "\C-g" #'pyim-quit-clear)
    map)
  "Pyim 的 Keymap.")

着色出来是这样的:

论坛的 emacs-lisp不能着色了吗?(我使用 ```emacs-lisp)

直接使用 ```就可以了。

我这边可以,不用加 emacs-lisp,论坛默认就是 elisp,你可能是用了中文的 ```

我这边是正常的。

那奇怪了,我当时是用 “e4611107e5 * master origin/master Fix dired drag and drop actions” 编译的。

我的也是msys2 下面编译 master分支。 29 滚动很顺畅,但是window下的emacs 似乎package载入多了就不太流畅,像spacemacs没办法用的。 我现在只装 evil evil-leader lsp-bridge doom-modeline 等十多个插件,用起来还可以流畅

看到这个帖子,我也尝试了下emacs-29,目前使用感觉还可以。

但是我的 restart-emacs不能正常工作,行为和save-buffers-kill-emacs一样,不能重启emacs。

@aqua0210 你那能正常工作吗?

用tab-bar 替代了awesome-tray.

mysys2下能用borg吗,我设置了home变量,但运行make bootstrap遇到了找不到目录的问题

可以的,但你要用 git-bash 启动 msys2 环境,只把 C:\msys64\mingw64\bin 加入 Path就行

Make 我是下载Eli 提供的 EZPort 版本,并加入 Path: C:\opt\make-4.3-without-guile-w32-bin\bin

1 个赞

我试过,可以用。但因为我用了 Desktop.el,就不怎么喜欢用这个功能。

我近期切到 Emacs 29,遇到两个问题:

1、M-x run-python 提示 Process Python exited abnormally with code 49 的错误,在大佬帮助下已解决。

解决方法:(setq python-shell-interpreter “python”)

2、dired buffer中按W,无法外部打开中文目录和文件,参考以下链接解决,顺便get到了打开目标文件所在的文件夹、通过Windows Terminal打开、通过VSCode打开、通过浏览器打开等等一系列新技能 :rofl:

Emacs: Open File in External App (xahlee.info)

3 个赞

你这个是咋做到的?