Ich muss häufig Unicode-Zeichen einfügen, die keine Standardbindung haben iso-transl-ctl-x-8-map
, dh Zeichen, die nicht eingefügt werden können, C-x 8gefolgt von einem oder mehreren Buchstaben / Satzzeichen.
Um der C-x 8Keymap Bindungen hinzuzufügen, habe ich normalerweise
Definieren Sie einen benutzerdefinierten Befehl zum Einfügen eines bestimmten Unicode-Zeichens, z.
(defun ucs-rightwards-arrow () "Insert unicode symbol: →" (interactive) (insert-char #x2192))
Fügen Sie der Karte über eine Bindung für diesen Befehl hinzu
(define-key iso-transl-ctl-x-8-map (kbd "a") 'ucs-rightwards-arrow)
Da die C-x 8Keymap wirklich nur Tastenkombinationen mit einzelnen Zeichen verbindet, frage ich mich:
F: Gibt es eine leichtere / idiomatischere Möglichkeit, die C-x 8Keymap zu erweitern?
quelle
Bibliothek
ucs-cmds.el
kann helfen.Es bietet ein Makro
ucsc-make-commands
zum schnellen Erstellen einer Reihe von Befehlen zum Einfügen von Unicode-Zeichen. Sie geben einen regulären Ausdruck an, der mit allen Unicode-Zeichennamen (inucs-names
) abgeglichen wird . Für jedes Zeichen, dessen Name übereinstimmt, wird ein Einfügebefehl erstellt. (Die Befehlsnamen sind im Wesentlichen dieselben wie die Char-Namen - siehe unten.)Beispiel für Befehlskreationen:
Dies ist die Dokumentzeichenfolge:
Wenn Sie die von Ihnen erstellten Befehle systematisch an Schlüssel binden
ucsc-make-commands
möchten , können Sie auf einfache Weise ein Makro erstellen, das auf dem Code basiert, mit dem die gewünschten Befehle erstellt und gebunden werden. Das Makroucsc-make-commands
durchläuft nur alle Unicode-Fahrzeuge und erstellt Befehle für diejenigen, deren Namen mit demREGEXP
Argument übereinstimmen .Während einer Iteration haben Sie Zugriff auf den Zeichennamen und dessen Codepunkt. Finden Sie eine bequeme regelmäßige Zuordnung von Codepunkten oder Zeichennamen zu Schlüsseln heraus, und Ihr Makro kann zusätzlich zu den Befehlen
define-key
s die entsprechenden s hinzufügendefun
.Die Bibliothek bietet auch einen Befehl, der
ucsc-insert
den Vanilla-Befehl ersetzen kanninsert-char
. Das Verhalten und der Code vonucsc-insert
sind identisch mit denen von,insert-char
außer was passiert, wenn Sie ein negatives Präfixargument verwenden:Es verhält sich so, als ob der Präfix-Arg-Wert positiv wäre. Ein Wert von -3 fügt also drei Kopien des Zeichens ein, genau wie 3.
Zusätzlich zum Einfügen des Zeichens wird ein Befehl definiert, mit dem Sie das Zeichen anschließend einfügen können. Mit diesem Befehl können Sie ein Präfixargument verwenden, um mehrere Kopien des angegebenen Zeichens einzufügen.
Dies gibt Ihnen einen Befehl, der maßgeschneidert ist, um ein bestimmtes Unicode-Zeichen einzufügen. Anschließend können Sie den Befehl an eine Tastenfolge binden und Ihrer Tastatur effektiv Unicode-Zeichen hinzufügen.
Wann immer
insert-char
etwasucsc-insert
getan wird (es tut nichts für ein negatives Präfix arg), tut es dasselbe. Aus diesem Grund können Sie bindenucsc-insert
anC-x 8 RET
als Ersatz fürinsert-char
:Wenn Sie nur wenige solcher Befehle zum Einfügen bestimmter Unicode-Zeichen benötigen, ist die Verwendung
ucsc-insert
zum Definieren dieser Befehle ausreichend praktisch. Wenn Sie viele solcher Befehle benötigen,ucsc-make-commands
ist das Makro Ihr Freund.quelle
ucsc-insert
es könnte helfen, meine Anwendungsfälle abzudecken. Das interaktive Definieren neuer Befehle (viaM--
M-x
ucsc-insert
RET
#x2190
RET
) funktioniert einwandfrei, aber wenn ich versuche, sie auszuführen (nachdem(define-key iso-transl-ctl-x-8-map (kbd "b") 'left-arrow)
ich sie via gebunden habe ), erhalte ich das Argument "Falscher Typ: wholenump, nil". Können Sie ein Beispiel geben, wieucsc-insert
eine Bindung für ein bestimmtes Unicode-Zeichen programmgesteuert definiert werden kann?ucs-cmds.el
. Sollte innerhalb von 24 Stunden auf MELPA gespiegelt werden. Danke.(ucsc-insert #x2192 -1) (define-key ctl-x-map (kbd "8 a") 'right-arrow)
, was definitiv prägnanter ist als mein ursprünglicher Ansatz. Ich muss jedoch fragen, ob dies die beabsichtigte Methode istucsc-insert
, um Befehle für Unicode-Symbole zu definieren, die über Sitzungen hinweg bestehen bleiben. Ich habe das Gefühl, dass dies möglicherweise nicht der Fall ist, da Emacs*scratch*
beim Start Zeichen, für die ich benutzerdefinierte Befehle definiere, in den Pufferucsc-insert
ist, dass es sich wieucs-insert
, auch bekannt alsinsert-char
, verhält , es sei denn, Sie verwenden ein negatives Präfix arg - es fügt immer ein Zeichen ein . Wenn Sie kein Zeichen einfügen möchten, sondern nur einen Befehl zum Einfügen eines Zeichens definieren möchten, können Sie ein Makro verwendenucsc-make-commands
. Aber Sie haben (wieder) Recht, dass es gut wäre, eine Funktion zu haben, die nur einen einzigen Befehl definiert. Also habe ich Funktion (Befehl) hinzugefügtucsc-define-char-insert-cmd
. Beispiel:(ucsc-define-char-insert-cmd 8592)
Definiert den Befehl und gibt sein Symbol zurückleft-arrow
. Bitte versuchen Sie es mit dem neuesten. Danke.