Jak zmusić emacsa do opuszczenia minibufora jednym naciśnięciem ESC?

1

Często naciskam niewłaściwą kombinację klawiszy i otwieram niejasny tryb minibufora. Muszę nacisnąć ESC trzy razy (chyba), co jest dość denerwujące. Jak zmusić emacsa do opuszczenia minibufora za pomocą jednego naciśnięcia ESC?

The Unfun Cat
źródło
1
C-g powinien być domyślny abort-recursive-edit który wyjdzie z minibufora, chyba że masz inny recursive-edit aktywny. Możesz także napisać własną funkcję za pomocą top-level który przerywa wszystkie poziomy recursive-edit i wychodzi z minibufora. Podoba mi się niestandardowa funkcja napisana przez Stefana, która pozwala mi kontrolować klawisz escape, aby używać go zarówno jako klawisza modyfikującego, jak i klucza, który działa tylko z jednym naciśnięciem: stackoverflow.com/questions/20026083/…
lawlist
Czy można to przesunąć na SO, abym mógł postawić nagrodę na pytanie i zdobyć jakiś użyteczny elisp?
The Unfun Cat
Oto coś, czego szukasz, ale tak jest nie Zalecana. Zawsze możesz to skomentować później, jeśli zdecydujesz się na zachowanie domyślne: (global-set-key (kbd "<escape>") 'top-level) (define-key minibuffer-local-map "<escape>" 'top-level) (define-key minibuffer-local-ns-map "<escape>" 'top-level) (define-key minibuffer-local-completion-map "<escape>" 'top-level) (define-key minibuffer-local-must-match-map "<escape>" 'top-level) (define-key minibuffer-local-isearch-map "<escape>" 'top-level) Moim zaleceniem jest jednak użycie funkcji napisanej przez Stefana (powyżej).
lawlist

Odpowiedzi:

2

Wierzę w to ergoemacs używa ESC klucz tak, jak chcesz. Zmienia także wiele innych powiązań z kluczami Emacsa - ale prawdopodobnie w sposób, który zgadza się z twoją chęcią „uniknięcia długich nieporęcznych naciśnięć klawiszy”.

[ Uwaga: Nie jestem ekspertem od ergoemaców i tak nie polecam używanie ESC w ten sposób. ESC ma szczególną rolę w Emacs wrt the Meta modyfikator i mapy klawiszy, a traktowanie go inaczej prędzej czy później prosi o kłopoty. (Podobnie, C-g ma fundamentalne znaczenie dla Emacsa, aw niektórych przypadkach jest nawet na stałe zakodowany, więc nie można go w 100% zastąpić innym kluczem.)]

Drew
źródło
1

Zazwyczaj używam następującej kombinacji klawiszy: Ctrl - X (wprowadź tryb poleceń) K (Zabij) Wchodzić .

Powinno to zabić bieżący mini-bufor.

perror
źródło
Dzięki, ale staram się unikać długich naciśnięć klawiszy emacs. To jeszcze jedno naciśnięcie klawisza niż obecnie używam (ESC ESC ESC); Chciałbym tylko raz nacisnąć ESC, aby wyjść z minibufora.
The Unfun Cat
0

Dzięki za wszystkie twoje pomysły. Wygląda na to, że powinno to załatwić:

(define-key minibuffer-local-map (kbd "ESC") 'keyboard-escape-quit)

Działało tylko dla isearch. Wygląda na to, że musiałbym go ponownie związać dla każdej funkcji (smex, ibuffer i wszystkie inne, które używają minibufora).

The Unfun Cat
źródło
0

Chcę robić podobne rzeczy: naciśnij ESC, aby anulować funkcję save-buffers-kill-terminal podczas monitu „Zapisz plik”.

Próbowałem ponownie powiązać ESC w wielu mapach minibufora, jak wspomniano w to pytanie i odpowiedź . Jednak nadal nie mogę anulować monitu „Zapisz plik” przez ESC.

Po wykopaniu niektórych kodów źródłowych elisp, odkryłem, że query-replace-map jest rodzicem mapy-y-or-n-p, używanym przez save-buffers-kill-terminal. Moja ostatnia poprawka to:

(define-key query-replace-map (kbd "<escape>") 'keyboard-quit)

Zauważ, że wyłącza wszystkie skróty klawiszem meta.

AhLeung
źródło