ユニコード記号を挿入するためのキーマップを拡張する慣用的な方法は?


7

でデフォルトのバインディングがないUnicode文字iso-transl-ctl-x-8-map、つまり、を使用しC-x 8て挿入できない文字の後に1つ以上の文字/句読文字を挿入する必要があることがよくあります。

C-x 8キーマップにバインディングを追加するには、通常、

  1. 次のような特定のUnicode文字を挿入するためのカスタムコマンドを定義します。

    (defun ucs-rightwards-arrow ()
      "Insert unicode symbol: →"
      (interactive)
      (insert-char #x2192))
  2. このコマンドのバインディングをマップに追加します

    (define-key iso-transl-ctl-x-8-map (kbd "a") 'ucs-rightwards-arrow)

C-x 8キーマップは実際にはキーバインディングと単一の文字のみをペアにしているので、疑問に思っています。

Q:C-x 8キーマップを拡張するより軽量で慣用的な方法はありますか?

回答:


7

Unicode文字をバインドするコマンドを定義する必要はありません。

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

αをにバインドしC-x 8 aます。ながら

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

ςをにバインドしC-x 8 M-sます。


1
配列は文字列btwと交換でき、1バイト短くなります。
wasamasa 2015年

4

ライブラリucs-cmds.elが役立ちます。

これは、Unicode文字を挿入する一連のコマンドucsc-make-commandsをすばやく作成するためのマクロを提供します。正規表現を指定すると、すべてのUnicode文字名(内ucs-names)と照合されます。名前が一致する文字ごとに挿入コマンドが作成されます。(コマンド名は基本的に文字名と同じです-以下を参照してください。)

コマンド作成の例:

 (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\\)")

これはドキュメント文字列です:

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.

作成したコマンドを体系的な方法でキーにバインドしたい場合は、そのコードに基づいてマクロを簡単に作成し、必要なコマンドを作成してバインドすることができますucsc-make-commands。マクロucsc-make-commandsは、すべてのUnicode車を反復処理し、名前がREGEXP引数と一致するコマンドを作成します。

イテレーション中、キャラクター名とそのコードポイントにアクセスできます。コードポイントまたは文字名のキーへの便利な通常のマッピングを理解し、マクロdefine-keyはコマンドdefuns に加えて適切なsを追加できます。


ライブラリは、ucsc-insertvanillaコマンドを置き換えることができる コマンドも提供しますinsert-char。の動作とコードは、負の接頭引数を使用したときに何が起こるかucsc-insertinsert-char除いて、それらと同じです 。

  1. prefix-arg値が正であるかのように機能します。したがって、値-3は、3と同様に、文字の3つのコピーを挿入します。

  2. 文字を挿入するだけでなく、後でその文字を挿入するために使用できるコマンドを定義します。そのコマンドで前置引数を使用して、指定した文字の複数のコピーを挿入できます。

これにより、特定のUnicode文字を挿入するためにカスタマイズされたコマンドが提供されます。次に、コマンドをキーシーケンスにバインドして、キーボードにUnicode文字を効果的に追加できます。

insert-char何かを行うときは常に(負の接頭引数に対しては何もしません)、ucsc-insert同じことを行います。このため、あなたはバインドできるucsc-insertまでC-x 8 RETの代替としてinsert-char

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

特定のUnicode文字を挿入するためにそのようなコマンドが少しだけ必要な場合は、を使用ucsc-insertしてそれらを定義すると十分便利です。あなたがそのようなコマンドをたくさん必要とするなら、マクロucsc-make-commandsはあなたの友達です。


おかげで、ucsc-insertそれは私のユースケースをカバーするのに役立つように見えます。新しいコマンドをインタラクティブに(を介してM-- M-x ucsc-insert RET #x2190 RET)定義すると問題なく機能しますが、それらを実行しようとすると(を介してバインドした後(define-key iso-transl-ctl-x-8-map (kbd "b") 'left-arrow))、「間違った型の引数:wholenump、nil」が表示されます。ucsc-insertプログラムを使用して特定のUnicode文字のバインディングを定義する方法の例を教えていただけませんか?
itsjeyd 2015年

その通りその通り!ここにバグがありました。Emacs Wikiで修正されましたucs-cmds.el。24時間以内にMELPAにミラーリングする必要があります。THX。
ドリュー

バグを見つけて修正できるようになったことを嬉しく思います:)特定のUnicodeシンボルを挿入するためのコマンドを定義してバインドできるようになりました(ucsc-insert #x2192 -1) (define-key ctl-x-map (kbd "8 a") 'right-arrow)。これは、元のアプローチよりもはるかに簡潔です。しかし、これがセッション全体で持続するUnicodeシンボルのコマンドを定義するために使用する意図された方法であるかどうかを尋ねる必要ucsc-insertがありますか?それは私がにカスタムコマンドを定義していたために文字を挿入するためにEmacsのが発生するため、私は、それがないかもしれない気持ちを持って*scratch*、起動時にバッファを...
itsjeyd

の使用目的ucsc-insertは、負の接頭辞argを使用しない限りucs-insert、別名insert-charと同様に動作することです。これは常にcharを挿入します。charを挿入するのではなく、charを挿入するコマンドを定義するだけの場合は、macroを使用できますucsc-make-commands。しかし、あなたは正しい(もう一度)単一のコマンドを定義するだけの関数があると良いでしょう。そこで、関数(コマンド)を追加しましたucsc-define-char-insert-cmd。例:(ucsc-define-char-insert-cmd 8592)コマンドを定義し、そのシンボルを返しますleft-arrow。最新版をお試しください。THX。
2015年

ありがとうございます。アップデートがMELPAになったら、試してみます!
itsjeyd 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.