Czy można symulować dowolne zdarzenie klucza z elisp? Wiem, w jaki sposób mogę znaleźć powiązanie dla danego klucza, a następnie wywołać to polecenie interaktywnie, ale co, jeśli to zdarzenie klucza nie jest powiązane z poleceniem?
Jako przykład , co jeśli chciałbym powiązać, C-`
aby zachowywał się tak samo jak ESC
klucz we wszystkich kontekstach ?
elisp
key-bindings
events
nispio
źródło
źródło
key-bindings
to, że jest to zły tag, jeśli nie próbujesz aliasu powiązania klucza. Być może powinieneś zmienić przykład na coś innego, aby się nie pomylić.key-events
tagu. Powinienem zrobić?key-translation-map
ułatwienia ułatwiają to drugie, więc jeśli to wszystko, czego chcesz, sugerowałbym użycie go zamiast robienia czegokolwiek bardziej ręcznego.Odpowiedzi:
Możesz podać dowolne zdarzenia (naciśnięcia klawiszy, kliknięcia myszą itp.) Do pętli poleceń, umieszczając je na
unread-command-events
. Na przykład następujące polecenie spowoduje, że pętla poleceń wykona przerwanie przy następnym uruchomieniu:Zauważ, że to tylko przekazuje zdarzenia do pętli poleceń, więc nie zrobi nic interesującego, jeśli zapętlasz swój własny kod.
Innym podejściem, o którym zdajesz się być świadomy, jest znalezienie funkcji, do której przypisany jest dany klucz, i wykonanie go samodzielnie:
Spowoduje to natychmiastowe wykonanie polecenia. Uważaj jednak na to, że niektóre polecenia zachowują się inaczej w zależności od tego, czy są wywoływane interaktywnie, na przykład domyślne argumenty. Będziesz chciał to zrekompensować, używając
call-interactively
:źródło
unread-command-events
ale nie byłem w stanie dowiedzieć się, jak go używać. Ustawienie tego nie miało dla mnie żadnego efektu. Czy istnieje dobry przykład tego, w jaki sposób jest wykorzystywany?unread-command-events
.unread-command-events
tak właśnie mówi jego nazwa. Możesz zbadać zdarzenie, a następnie, w zależności od tego, co jest, warunkowo wepchnij je z powrotemu-c-e
, aby następnie zostało przetworzone normalnie. Istnieje wiele przykładów jego zastosowania w kodzie źródłowym Emacsa -grep
jest twoim przyjacielem.unread-command-events
do pracy. Elementem, którego wcześniej brakowało, byłalistify-key-sequence
funkcja. Właśnie korzystałem z surowego wektora klucza.with-simulated-input
makro, które ocenia dowolne wyrażenie zunread-command-events
let-bound do określonej sekwencji klawiszy: github.com/DarwinAwardWinner/ido-ubiquitous/blob/…Najprostszy sposób, jaki znam, to po prostu użyć
execute-kbd-macro
:źródło
C-`
powoduje błądapply: Wrong number of arguments: #[(ad--addoit-function ...
.emacs -Q
tym błędem nie występuje. NadalAfter 0 kbd macro iterations: foo: Lisp nesting exceeds `max-lisp-eval-depth'
evil
) bezpośrednie wywołanie żądanej funkcji miało nieoczekiwany efekt w moim przypadku (evilmi-jump-items
) i musiałem użyć(execute-kbd-macro (kbd "%"))
Na podstawie tej odpowiedzi można użyć globalnego zestawu kluczy w ten sposób
Co będzie traktowane
C-`
jakoescapeTo wydaje się mieć pewne problemy, jeśli druga kombinacja nie wykonuje funkcji. Więc jeśli escapejest używany tak
Meta
, to nie działa poprawnie. Ale wydaje się, że działa w przypadku poleceń powiązanych z funkcjami.źródło
C-`
daje mi błąd:After 0 kbd macro iterations: command-execute: Lisp nesting exceeds `max-lisp-eval-depth'
.C-
` związałeś sięESC
z jakąś inną metodą, więc przechodzi ona w nieskończoną pętlę.eval-sexp
dzieje się w jednej sesji. :-) Ale spróbuj ponownie zemacs -Q
przyczynami,C-`
aby po prostu nic nie robić.(kbd "<escape>")
a(kbd "ESC")
może oznaczać różne rzeczy - czy próbowałeś obu?Po przeczytaniu sugestii z jch do użycia
unread-command-events
, byłem w stanie zhakować razem rozwiązanie, które zrobi niektóre z rzeczy, których szukam.Nadal jest wiele spraw do załatwienia. Mianowicie nie otrzymuję poprawnego wyniku, jeśli wywołam tę funkcję dwa razy z rzędu w ciągu jednego
defun
.Dygresja:
Po zapoznaniu się z sugestią Filipa dotyczącą zastosowania
key-translation-map
, mogłem znaleźć,local-function-key-map
która jest również bardzo pomocna w osiągnięciu niektórych z moich szerszych celów.źródło