在迷你缓冲区中将光标更改为插入状态
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。否则,如果我们在查看迷你缓冲区的内容时编辑缓冲区,迷你缓冲区将退出。
我根据邪恶的状态改变我的光标。但是我注意到,当我输入迷你缓冲区时,我处于正常模式。
我正在尝试编写代码,在我输入迷你缓冲区时将状态从任何状态更改为插入状态,并在我退出迷你缓冲区时切换回来。请注意,我使用 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。否则,如果我们在查看迷你缓冲区的内容时编辑缓冲区,迷你缓冲区将退出。