2017-12-10 23 views
0

악의 상태를 기반으로 커서를 변경합니다. 그러나 나는 미니 버퍼에 입력 할 때 정상 모드임을 알았다.커서를 minubuffer에서 삽입 상태로 변경하십시오.

필자는 미니 버퍼를 입력하고 미니 버퍼를 종료 할 때 상태를 바꾸기 위해 상태를 변경하는 코드를 만들려고합니다. 참고, 나는 미니 버퍼 완성을 위해 ivy을 사용합니다 (차이는 없다고 생각합니다).

(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) 

(setq evil-insert-state-cursor '((bar . 3) "chartreuse3")) 

본인은 미니 버퍼에 뭔가를 입력하는 동안 커서가 바로 색상과 쓰기 형태가 될 것으로 기대합니다. 그리고 내가 미니 패드에 들어가기 전에 있었던 상태의 적절한 모양으로 돌아 가기 위해서.

실제로 어떻게되는지는 커서가 올바른 색상이지만 잘못된 모양입니다. 그리고 C-g으로 미니 패드를 종료하면 삽입 상태가 유지됩니다. 결코 원래 상태로 돌아 가지 않습니다. 내 생각에 C-g은 내 충고의 실행을 중단한다고 생각합니다.

+0

필자는'evil' 또는'ivy'를 사용하지 않지만 도움이 될 수있는'minibuffer-exit-hook'과'minibuffer-setup-hook'이 있음을 알고 있습니다. 나는 미니 버퍼로 들어가고 나가기를 원한다면 (사용자가 추가 정보를 입력하거나 리턴 키를 누를 때까지 기다리는 것과 같이 계속 일어나고있는 상태로 남겨두고 싶다면) 외형을 바꾸는 커스텀 함수를 설정했다. 또한 종료 신호를 보내기 직전에 타이머 기능을 설정하여 취소되지 않도록합니다. 즉, 내 타이머 기능을 모두 실행하는 약 3 개의 서로 다른 사용자 지정 키보드 종료 기능을 설정합니다. – lawlist

+0

귀하의 제안은 내가 아래에 게시 한 답변에 영감을주었습니다. – Piglet

답변

0

이 코드로 원하는 동작을 얻었습니다.

(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))) 

유일한 성가신 부작용

ESCNo recursive edit is in progress을 누를 때마다 출력에 인쇄되어있다.

아래 버전은 내 코드에서 사용하는 버전입니다. 정상 상태로 돌아가는 대신 변수를 사용하여 미니 버퍼가 열리기 전에 이전의 악의적 인 상태로 돌아갑니다. 또한 미니 버퍼가 활성화되어있는 경우에만 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)))) 

필자는 미니 버퍼가 선택된 창에서만 종료되는지 확인합니다. 그렇지 않으면 미니 버퍼의 내용을 보면서 버퍼를 편집하려고하면 미니 버퍼가 종료됩니다.