You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在宏展开时正确禁用Corfu自动补全,避免干扰操作?

宏/批量编辑时临时禁用Corfu的解决方案

修复键盘宏的Advice(解决C-g中断后Corfu未恢复问题)

之前的代码未处理异常退出场景(如C-g中断宏),导致Corfu无法自动恢复。改用unwind-protect确保无论宏正常结束还是被中断,都能还原Corfu的原始状态:

(defun my-kmacro-disable-corfu (fn &rest args)
  (let ((original-corfu corfu-mode))
    (unwind-protect
        (progn
          (corfu-mode -1)
          (apply fn args))
      (if original-corfu
          (corfu-mode 1)
        (corfu-mode -1)))))

(advice-add #'kmacro-end-or-call-macro :around #'my-kmacro-disable-corfu)

处理Evil多行插入场景

Evil visual-line模式下按I进入的批量插入属于类宏操作,同样用unwind-protect给对应命令加保护:

(defun my-evil-visual-insert-disable-corfu (fn &rest args)
  (let ((original-corfu corfu-mode))
    (unwind-protect
        (progn
          (corfu-mode -1)
          (apply fn args))
      (if original-corfu
          (corfu-mode 1)
        (corfu-mode -1)))))

(advice-add #'evil-visual-line-insert :around #'my-evil-visual-insert-disable-corfu)

全局通用方案

若想覆盖所有宏运行场景,可利用kmacro-running-p变量在Corfu钩子中自动开关:

;; 宏启动时记录Corfu原始状态
(add-hook 'kmacro-start-hook
          (lambda ()
            (setq my-previous-corfu-state corfu-mode)))

;; 宏运行时禁用Corfu
(add-hook 'corfu-pre-hook
          (lambda ()
            (when kmacro-running-p
              (corfu-mode -1))))

;; 宏结束后恢复Corfu状态
(add-hook 'kmacro-end-hook
          (lambda ()
            (if my-previous-corfu-state
                (corfu-mode 1)
              (corfu-mode -1))
            (makunbound 'my-previous-corfu-state)))

这个方案无需单独给每个命令加advice,能自动识别宏运行状态并处理Corfu的开关。

内容的提问来源于stack exchange,提问作者ntriisii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:33:24