¿Forma idiomática de extender el mapa de teclas para insertar símbolos unicode?

7

A menudo encuentro que necesito insertar caracteres Unicode que no tienen un enlace predeterminado iso-transl-ctl-x-8-map, es decir, caracteres que no se pueden insertar usando C-x 8seguido de una o más letras / caracteres de puntuación.

Para agregar enlaces al C-x 8mapa de teclas , generalmente

  1. definir un comando personalizado para insertar un carácter Unicode dado, como:

    (defun ucs-rightwards-arrow ()
      "Insert unicode symbol: →"
      (interactive)
      (insert-char #x2192))
  2. agregue un enlace para este comando al mapa mediante

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

Dado que el C-x 8mapa de teclas realmente solo combina las combinaciones de teclas con caracteres individuales, me pregunto:

P: ¿Existe una forma más ligera / idiomática de extender el C-x 8mapa de teclas?

itsjeyd
fuente

Respuestas:

7

No es necesario definir un comando para vincular un carácter unicode:

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

une α a C-x 8 a. Mientras

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

se une a C-x 8 M-s.

Adobe
fuente
1
La matriz se puede cambiar por una cadena por cierto, lo que lo haría un byte más corto.
wasamasa
4

La biblioteca ucs-cmds.elpuede ayudar.

Proporciona una macro ucsc-make-commandspara crear rápidamente un conjunto de comandos que insertan caracteres Unicode. Le proporciona una expresión regular, que se compara con todos los nombres de caracteres Unicode (en ucs-names). Se crea un comando de inserción para cada uno de los caracteres cuyo nombre coincide. (Los nombres de los comandos son esencialmente los mismos que los nombres de caracteres; consulte a continuación).

Ejemplos de creaciones de comandos:

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

Esta es la cadena de documentación:

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.

Si desea vincular los comandos que crea a las teclas de manera sistemática, puede crear fácilmente una macro basada en el código ucsc-make-commandsque crea los comandos que desea y los vincula. Macro ucsc-make-commandssimplemente itera sobre todos los autos Unicode y crea comandos para aquellos cuyos nombres coinciden con el REGEXPargumento.

Durante una iteración, tiene acceso al nombre del personaje y su punto de código. Calcule un mapeo regular conveniente de puntos de código o nombres de caracteres a las teclas, y su macro puede agregar los correos define-keyelectrónicos apropiados además de los comandos defun.


La biblioteca también proporciona un comando ucsc-insert, que puede reemplazar el comando vanilla insert-char. El comportamiento y el código de ucsc-insertson idénticos a los de insert-charexcepto lo que sucede cuando usa un argumento de prefijo negativo:

  1. Actúa como si el valor del prefijo-arg fuera positivo. Entonces, un valor de -3 inserta tres copias del personaje, al igual que 3.

  2. Además de insertar el carácter, define un comando que puede usar posteriormente para insertar ese carácter. Puede usar un argumento de prefijo con ese comando para insertar varias copias del carácter dado.

Esto le da un comando hecho a medida para insertar un carácter Unicode dado. Luego puede vincular el comando a una secuencia de teclas, agregando efectivamente caracteres Unicode a su teclado.

Siempre que insert-charhace algo (no hace nada por un prefijo negativo arg), ucsc-inserthace lo mismo. Debido a esto, se puede obligar ucsc-inserta C-x 8 RETcomo un reemplazo para insert-char:

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

Si solo necesita unos pocos de estos comandos para insertar caracteres Unicode particulares, utilizarlos ucsc-insertpara definirlos es lo suficientemente conveniente. Si necesita muchos de estos comandos, entonces macro ucsc-make-commandses su amigo.

Dibujó
fuente
Gracias, ucsc-insertparece que podría ayudar a cubrir mis casos de uso. La definición de nuevos comandos de forma interactiva (vía M-- M-x ucsc-insert RET #x2190 RET) funciona bien, pero cuando trato de ejecutarlos (después de vincularlos vía (define-key iso-transl-ctl-x-8-map (kbd "b") 'left-arrow)) me sale "Argumento de tipo incorrecto: wholenump, nil". ¿Podría dar un ejemplo de cómo ucsc-insertse puede utilizar para definir mediante programación un enlace para un carácter Unicode específico?
itsjeyd
¡Estás en lo correcto! Hubo un error aquí. Reparado ahora en Emacs Wiki ucs-cmds.el. Debe reflejarse en MELPA dentro de las 24 horas. Gracias.
Dibujó el
Me alegro de haber podido ayudarlo a encontrar y corregir un error :) Ahora puedo definir y vincular comandos para insertar símbolos Unicode específicos a través de (ucsc-insert #x2192 -1) (define-key ctl-x-map (kbd "8 a") 'right-arrow), lo que definitivamente es más conciso que mi enfoque original. Sin embargo, debo preguntar si esta es la forma prevista de usar ucsc-insertpara definir comandos para símbolos Unicode que persisten en las sesiones. Tengo la sensación de que podría no serlo, porque hace que Emacs inserte caracteres para los que estoy definiendo comandos personalizados en el *scratch*búfer al inicio ...
itsjeyd
El uso previsto de ucsc-insertes para que se comporte de la misma manera que ucs-insert, a insert-charmenos que use un prefijo negativo arg: siempre inserta un carácter . Si no desea insertar un carácter, pero solo desea definir un comando para insertar un carácter, puede usar macro ucsc-make-commands. Pero tiene razón (nuevamente) de que sería bueno tener una función que simplemente defina un solo comando. Entonces agregué la función (comando) ucsc-define-char-insert-cmd. Por ejemplo: (ucsc-define-char-insert-cmd 8592)define el comando y devuelve su símbolo, left-arrow. Por favor intente lo último. Gracias.
Dibujó el
¡Gracias, lo probaré una vez que la actualización llegue a MELPA!
itsjeyd