2017-12-10 7 views
0

Ich ändere den Cursor basierend auf dem Zustand im Bösen. Allerdings merke ich, dass ich im normalen Modus bin, wenn ich den Minipuffer eintippe.Ändern Sie den Cursor, um den Status einzufügen, während im Minipuffer

Ich versuche Code zu machen, der den Status ändert, von dem, was es ist, in den Status einzufügen, während ich den Minipuffer eintippe und zurückwechsle, wenn ich den Minipuffer verlasse. Beachten Sie, dass ich ivy für Minibuffer-Vervollständigung verwende (obwohl ich denke, dass es keinen Unterschied macht).

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

erwarte ich, dass die Cursor die richtige Farbe und die Schreibform sein, während etwas in den Minipuffer eingeben. Und um zu der entsprechenden Form des Zustands zurückzukehren, in dem ich war, bevor ich in den Minibuffer kam.

Was tatsächlich passiert ist, dass der Cursor die richtige Farbe ist, aber es ist die falsche Form. Und wenn ich den Minibuffer mit C-g verlasse, bleibt der Einfügezustand erhalten. Es kehrt nie in den ursprünglichen Zustand zurück. Ich denke C-g bricht die Ausführung meines Rates ab.

+0

Ich benutze 'evil' oder' efeu' nicht, aber mir ist bewusst, dass es einen 'minibuffer-exit-hook' und einen' minibuffer-setup-hook' gibt, die hilfreich sein können. Ich habe benutzerdefinierte Funktionen eingerichtet, die das Aussehen ändern, wenn ich mich in den Minipuffer hinein- oder hinausbewege (lasse ihn geöffnet, während etwas noch passiert, z. B. warten, bis der Benutzer zusätzliche Informationen eingibt oder die Eingabetaste drückt). Ich setze auch eine Timer-Funktion, die kurz vor dem Senden eines Quit-Signals ausgelöst wird, so dass es nicht abgebrochen wird - d. H. Etwa drei verschiedene benutzerdefinierte Tastatur-Beenden-Funktionen, die alle meine Timer-Funktion starten. – lawlist

+0

Ihr Vorschlag inspirierte die Antwort, die ich unten gepostet habe. – Piglet

Antwort

0

Ich habe mit diesem Code das gewünschte Verhalten erreicht.

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

Der einzige Effekt ärgerliche Seite ist, dass immer dann, wenn ESCNo recursive edit is in progress mit dem Ausgang gedruckt wird gedrückt wird.

Die folgende Version ist diejenige, die ich in meinem Code verwende. Anstatt in den normalen Zustand zurückzukehren, verwendet es eine Variable, um zum vorherigen schlechten Zustand zurückzukehren, bevor der Minipuffer geöffnet wurde. Es verwendet auch nur minibuffer-keyboard-quit, wenn der Minipuffer aktiv ist.

Ich stelle sicher, dass ich nur beende, wenn der Minipuffer das ausgewählte Fenster ist. Andernfalls würde der Minipuffer beendet werden, wenn wir zum Beispiel einen Puffer bearbeiten würden, während der Inhalt des Minipuffers angezeigt wird.

Verwandte Themen