Wie binde ich einen Befehl mit einem Cu-Präfix an einen anderen Schlüssel?

7

C-c C-x C-vruft org-toggle-inline-imagesFunktion auf. Mit dem Präfixschlüssel werden einige Argumente an diese Funktion übergeben (ich weiß nicht, welches).

Wie kann ich die Funktion mit Argumenten der F12Schaltfläche zuordnen, damit sie dasselbe tut wie C-u C-c C-x C-v?

Kossak
quelle

Antworten:

11

C-uist das universelle Präfixargument. Es wird häufig für Befehle verwendet, die nur zwei Zustände haben (mit und ohne Argument), kann jedoch auch als numerisches Präfix interpretiert werden (4).

In diesem Fall wird beim Betrachten des Quellcodes org-toggle-inline-imagesfestgestellt, dass nur geprüft wird, ob das Argument festgelegt ist, sodass der von Ihnen übergebene spezifische Wert keine Rolle spielt.

Sie können eine Funktion definieren, die aufruft (org-toggle-inline-images t). Um es mit einem Lambda zu tun:

(define-key org-mode-map  (kbd "<f12>")
    (lambda () (interactive) (org-toggle-inline-images t)))

Dies bindet F12 im org-Modus und lässt die globale Bindung für andere Modi bestehen.

Weitere Informationen zu Tastenkombinationen finden Sie hier: Beherrschen von Tastenkombinationen in Emacs . Und natürlich enthält das Emacs Lisp-Handbuch viele Details .

Glucas
quelle
3

Die Antwort im Allgemeinen besteht darin, sich den Code anzusehen, der den Befehl definiert. Insbesondere (aber nicht unbedingt nur) die interactiveSpezifikation.

Was Sie suchen, ist, was die Funktion mit einem Präfix arg macht. Und dann definieren Sie einen Befehl, der dasselbe tut.

In der Regel wird das Präfix arg verwendet, um einen Wert zu definieren, der dann im Code an eine andere Funktion übergeben wird. Sie müssen dann nur diese andere Funktion aufrufen und ihr das Argument übergeben, das über das Präfix arg im ursprünglichen Befehl bereitgestellt worden wäre. IOW, Sie können normalerweise denselben Code verwenden und nur einen Wert anstelle des Werts übergeben, der aus dem Präfix arg ermittelt wird.

Drew
quelle
3
Sie können auch ein C-uPräfix mit folgendem emulieren : (let ((current-prefix-arg '(4))) (call-interactively #'whatever-command)). Dies kann nützlich sein, wenn Sie nicht herausfinden können, was der von Ihnen aufgerufene Befehl mit seinem Argument tut.
Glucas
@glucas: Dies ist nur dann angemessen, wenn das verwendete Präfix arg für den angegebenen Befehl keine Rolle spielt oder wenn das von dem Befehl gewünschte Verhalten das von plain ist C-u. Es ist nicht angemessen, wenn der Befehl ein unterschiedliches Verhalten aufweist, je nachdem, ob Plain C-uverwendet wird oder nicht (z. B. Unterscheidung von C--oder C-3oder C-u C-uvon Just C-u. Mein Rat ist, immer zu überprüfen, wie der Befehl tatsächlich ein Präfix arg behandelt.
Drew
Richtig, guter Punkt. Nur als Option für den speziellen Fall "Rufen Sie dies so an, als hätte ich zuerst Cu gedrückt".
Glucas
@glucas: Darüber hinaus können Sie in dem von Ihnen zitierten Fall in der Regel (aber nicht immer) ganz auf die interaktive Verwendung verzichten und einfach '(4)an den Befehl übergeben (ohne sich darum zu kümmern call-interactively). (Aber das funktioniert nicht, z. B. wenn der Befehl keinen Parameter hat, der dem Präfix arg entspricht, sondern current-prefix-argim Befehlstext testet .)
Drew
@glucas: Ja, es war gut, dass du es erwähnt hast.
Drew