在迷你缓冲区中将光标更改为插入状态

Change cursor to insert state while in minubuffer

我根据邪恶的状态改变我的光标。但是我注意到,当我输入迷你缓冲区时,我处于正常模式。

我正在尝试编写代码,在我输入迷你缓冲区时将状态从任何状态更改为插入状态,并在我退出迷你缓冲区时切换回来。请注意,我使用 ivy 完成迷你缓冲区(尽管我认为这没有什么区别)。

(setq evil-insert-state-cursor '((bar . 3) "chartreuse3"))
(defun void-ivy-insert-state (orig-func &rest args)
   "Wrapper around ivy, so it goes into insert state."

   ;; minibuffer is different so I have to manually change the state
   (let ((saved-evil-state evil-state))
     (evil-insert-state) 
     (setq cursor-type (elt evil-insert-state-cursor 0))
     (set-cursor-color (elt evil-insert-state-cursor 1))
     (apply orig-func args)
     (evil-change-state saved-evil-state)))

(advice-add 'ivy-read :around #'void-ivy-insert-state)

我希望在向迷你缓冲区中输入内容时光标颜色和书写形状正确。并 return 进入迷你缓冲区之前我所处状态的适当形状。

实际发生的是光标颜色正确,但形状错误。如果我用 C-g 退出迷你缓冲区,插入状态仍然存在。它永远不会 return 回到原始状态。我认为 C-g 中止执行我的建议。

我用这段代码实现了预期的行为。

(add-hook 'minibuffer-setup-hook (lambda () (evil-insert-state)))
(add-hook 'minibuffer-exit-hook (lambda () (evil-normal-state)))
(define-key evil-insert-state-map [escape] (lambda () (interactive)
                                                      (evil-normal-state)
                                                      (minibuffer-keyboard-quit)))

唯一烦人的副作用是每当按下 ESC 时,都会将 No recursive edit is in progress 打印到输出中。

下面的版本是我在代码中使用的版本。它不是 return 进入正常状态,而是使用一个变量 return 到打开迷你缓冲区之前的前一个邪恶状态。如果迷你缓冲区处于活动状态,它也只使用 minibuffer-keyboard-quit

(defvar evil-state-before-minibuffer-setup 'normal)

(add-hook 'minibuffer-setup-hook
      (lambda () (setq evil-state-before-minibuffer-setup evil-state) 
                 (evil-insert-state)))

(add-hook 'minibuffer-exit-hook (lambda () 
              (evil-change-state evil-state-before-minibuffer-setup)))

(define-key evil-insert-state-map [escape] 
      (lambda () (interactive) (evil-normal-state) 
                               (when (eq (active-minibuffer-window))
                                         (selected-window))
                                        (minibuffer-keyboard-quit))))

我确保只在选择了迷你缓冲区时退出 window。否则,如果我们在查看迷你缓冲区的内容时编辑缓冲区,迷你缓冲区将退出。