Idiomatische Möglichkeit, die Keymap zum Einfügen von Unicode-Symbolen zu erweitern?

7

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

  1. Definieren Sie einen benutzerdefinierten Befehl zum Einfügen eines bestimmten Unicode-Zeichens, z.

    (defun ucs-rightwards-arrow ()
      "Insert unicode symbol: →"
      (interactive)
      (insert-char #x2192))
    
  2. 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?

itsjeyd
quelle

Antworten:

7

Es ist nicht erforderlich, einen Befehl zum Binden eines Unicode-Zeichens zu definieren:

(define-key 'iso-transl-ctl-x-8-map "a" [?α])

bindet α an C-x 8 a. Während

(define-key 'iso-transl-ctl-x-8-map (kbd "M-s") [?ς])

bindet ς an C-x 8 M-s.

Adobe
quelle
1
Das Array kann übrigens gegen einen String ausgetauscht werden, wodurch es ein Byte kürzer würde.
Wasamasa
4

Bibliothek ucs-cmds.elkann helfen.

Es bietet ein Makro ucsc-make-commandszum schnellen Erstellen einer Reihe von Befehlen zum Einfügen von Unicode-Zeichen. Sie geben einen regulären Ausdruck an, der mit allen Unicode-Zeichennamen (in ucs-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:

 (ucsc-make-commands "^math") ; Math symbols
 (ucsc-make-commands "latin") ; Latin alphabet characters
 (ucsc-make-commands "arabic")
 (ucsc-make-commands "^cjk")  ; Chinese, Japanese, Korean characters
 (ucsc-make-commands "^box drawings ")
 (ucsc-make-commands "^greek [a-z]+ letter") ; Greek characters
 (ucsc-make-commands "\\(^hangul\\|^circled hangul\\|^parenthesized hangul\\)")

Dies ist die Dokumentzeichenfolge:

ucsc-make-commands is a Lisp macro in `ucs-cmds.el'.

(ucsc-make-commands REGEXP)

Create commands to insert Unicode characters whose names match REGEXP.
Letter case is ignored for matching.

The set of char names used is taken from `ucs-names'.  There are
*many* such chars, so consider using a tighter regexp to limit the
number of commands created.

The commands created have the same names as the chars they insert,
except that `SPC' chars in the character names are replaced by
hyphens (`-'), and the command names are lowercase.

Wenn Sie die von Ihnen erstellten Befehle systematisch an Schlüssel binden ucsc-make-commandsmö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 Makro ucsc-make-commandsdurchläuft nur alle Unicode-Fahrzeuge und erstellt Befehle für diejenigen, deren Namen mit dem REGEXPArgument ü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-keys die entsprechenden s hinzufügen defun.


Die Bibliothek bietet auch einen Befehl, der ucsc-insertden Vanilla-Befehl ersetzen kann insert-char. Das Verhalten und der Code von ucsc-insertsind identisch mit denen von, insert-charaußer was passiert, wenn Sie ein negatives Präfixargument verwenden:

  1. 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.

  2. 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-charetwas ucsc-insertgetan wird (es tut nichts für ein negatives Präfix arg), tut es dasselbe. Aus diesem Grund können Sie binden ucsc-insertan C-x 8 RETals Ersatz für insert-char:

(define-key global-map [remap insert-char] 'ucsc-insert)

Wenn Sie nur wenige solcher Befehle zum Einfügen bestimmter Unicode-Zeichen benötigen, ist die Verwendung ucsc-insertzum Definieren dieser Befehle ausreichend praktisch. Wenn Sie viele solcher Befehle benötigen, ucsc-make-commandsist das Makro Ihr Freund.

Drew
quelle
Vielen Dank, ucsc-insertes könnte helfen, meine Anwendungsfälle abzudecken. Das interaktive Definieren neuer Befehle (via M-- 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, wie ucsc-inserteine Bindung für ein bestimmtes Unicode-Zeichen programmgesteuert definiert werden kann?
Itsjeyd
Du hast Recht! Hier gab es einen Fehler. Jetzt im Emacs Wiki behoben ucs-cmds.el. Sollte innerhalb von 24 Stunden auf MELPA gespiegelt werden. Danke.
Drew
Ich bin froh, dass ich Ihnen helfen konnte, einen Fehler zu finden und zu beheben :) Ich kann jetzt Befehle zum Einfügen bestimmter Unicode-Symbole über definieren und binden (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 ist ucsc-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 Puffer
einfügt
Die beabsichtigte Verwendung von ucsc-insertist, dass es sich wie ucs-insert, auch bekannt als insert-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 verwenden ucsc-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ügt ucsc-define-char-insert-cmd. Beispiel: (ucsc-define-char-insert-cmd 8592)Definiert den Befehl und gibt sein Symbol zurück left-arrow. Bitte versuchen Sie es mit dem neuesten. Danke.
Drew
Danke, werde es ausprobieren, sobald das Update es in MELPA schafft!
Itsjeyd