如何在宏展开时正确禁用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
相关产品推荐
相关产品推荐

