在 Org-mode 中使用 completion-preview-mode

Emacs 30.1 引入了 completion-preview-mode,相比 companycorfu,它所使用的行内补全更加简单,用于比较简单的场景比较方便,比如 Org-mode 的关键字补全。

但是,在 Org-mode 中直接开启 completion-preview-mode 无法生效,Org-mode 使用 org-self-insert-command 取代了 self-insert-command 导致无法触发 completion-preview-mode。以下帖子的解决方法可用:

(setq-local completion-preview-commands
            '(;; self-insert-command
              org-self-insert-command
              insert-char
              ;; delete-backward-char
              org-delete-backward-char
              backward-delete-char-untabify
              analyze-text-conversion
              completion-preview-complete))

Animation

4 个赞

感觉还挺有用的。

为何这中间要包含这些删除字符等等操作?

这样删除操作也能触发补全,不过可能不太需要…

我一般用C-c C--来插入这些src/quote/example之类的。

1 个赞

默认情况下一下就补全完了,对 #+begin_xxx 不会中途补全到 _ 再进行二次选择。

看了下注释随便糊了个支持选择候选项的配置,这个配置只能说能用:

(add-hook
   'org-mode-hook
   (defun yy/set-completion-preview ()
     (completion-preview-mode)
     (let ((kmap (make-sparse-keymap)))
       (keymap-set kmap "C-i" #'completion-preview-insert)
       (keymap-set kmap "M-i" #'completion-preview-complete)
       (keymap-set kmap "C-n" #'completion-preview-next-candidate)
       (keymap-set kmap "C-p" #'completion-preview-prev-candidate)
       (keymap-set kmap "C-f" #'completion-preview-insert-word)
       (setq-local completion-preview-active-mode-map kmap))
     (setq-local completion-preview-commands
                 '(;; self-insert-command
                   org-self-insert-command
                   insert-char
                   ;; delete-backward-char
                   org-delete-backward-char
                   backward-delete-char-untabify
                   analyze-text-conversion
                   completion-preview-complete))))

C-f 可以移动到以 word 为单位的分隔,C-nC-p 切换候选词。