2017-12-10 3 views
0

私のカーソルを悪の状態に基づいて変更します。しかし、私はミニバッファに入力すると通常モードになっていることに気付きました。カーソルをミニバッファの中に挿入する状態に変更します

私はミニバッファをタイプしている間、状態を挿入する状態から状態を変更するコードを作ろうとしており、ミニバッファを終了すると元の状態に戻ります。注意してください、私は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) 

ミニバッファに何かを入力している間、私はカーソルが右の色と書き込み形状であることを期待しています。そして、ミニバッファに入る前の状態の適切な形に戻るために。

実際には、カーソルは正しい色ですが、形状が間違っています。そして、私が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))) 

だけ迷惑な副作用はESCが押されるたびにNo recursive edit is in progressが出力に出力されることです。

以下のバージョンは私のコードで使用しているバージョンです。通常の状態に戻るのではなく、変数を使用して、ミニバッファが開かれる前の以前の悪状態に戻ります。また、ミニバッファがアクティブな場合は、minibuffer-keyboard-quitしか使用しません。

ミニバッファが選択されたウィンドウである場合にのみ終了することを確認します。さもなければ、ミニバッファの内容を見ながらバッファを編集するなら、ミニバッファは終了します。

関連する問題