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
definir un comando personalizado para insertar un carácter Unicode dado, como:
(defun ucs-rightwards-arrow () "Insert unicode symbol: →" (interactive) (insert-char #x2192))
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?
key-bindings
keymap
unicode
itsjeyd
fuente
fuente
La biblioteca
ucs-cmds.el
puede ayudar.Proporciona una macro
ucsc-make-commands
para 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 (enucs-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:
Esta es la cadena de documentación:
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-commands
que crea los comandos que desea y los vincula. Macroucsc-make-commands
simplemente itera sobre todos los autos Unicode y crea comandos para aquellos cuyos nombres coinciden con elREGEXP
argumento.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-key
electrónicos apropiados además de los comandosdefun
.La biblioteca también proporciona un comando
ucsc-insert
, que puede reemplazar el comando vanillainsert-char
. El comportamiento y el código deucsc-insert
son idénticos a los deinsert-char
excepto lo que sucede cuando usa un argumento de prefijo negativo: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.
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-char
hace algo (no hace nada por un prefijo negativo arg),ucsc-insert
hace lo mismo. Debido a esto, se puede obligarucsc-insert
aC-x 8 RET
como un reemplazo parainsert-char
:Si solo necesita unos pocos de estos comandos para insertar caracteres Unicode particulares, utilizarlos
ucsc-insert
para definirlos es lo suficientemente conveniente. Si necesita muchos de estos comandos, entonces macroucsc-make-commands
es su amigo.fuente
ucsc-insert
parece que podría ayudar a cubrir mis casos de uso. La definición de nuevos comandos de forma interactiva (víaM--
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ómoucsc-insert
se puede utilizar para definir mediante programación un enlace para un carácter Unicode específico?ucs-cmds.el
. Debe reflejarse en MELPA dentro de las 24 horas. Gracias.(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 usarucsc-insert
para 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 ...ucsc-insert
es para que se comporte de la misma manera queucs-insert
, ainsert-char
menos 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 macroucsc-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.