Costumo encontrar a necessidade de inserir caracteres Unicode que não possuem ligação padrão iso-transl-ctl-x-8-map
, ou seja, caracteres que não podem ser inseridos usando C-x 8seguidos por uma ou mais letras / caracteres de pontuação.
Para adicionar ligações ao C-x 8mapa de teclas , eu normalmente
defina um comando personalizado para inserir um determinado caractere Unicode, como:
(defun ucs-rightwards-arrow () "Insert unicode symbol: →" (interactive) (insert-char #x2192))
adicione uma ligação para este comando ao mapa via
(define-key iso-transl-ctl-x-8-map (kbd "a") 'ucs-rightwards-arrow)
Como o C-x 8mapa de teclas realmente apenas emparelha combinações de teclas com caracteres únicos, estou me perguntando:
P: Existe uma maneira mais leve / idiomática de estender o C-x 8mapa de teclas?
fonte
Biblioteca
ucs-cmds.el
pode ajudar.Ele fornece uma macro,
ucsc-make-commands
para criar rapidamente um conjunto de comandos que inserem caracteres Unicode. Você fornece uma regexp, que é comparada com todos os nomes de caracteres Unicode (polucs-names
). Um comando de inserção é criado para cada um dos caracteres cujo nome corresponde. (Os nomes dos comandos são essencialmente os mesmos que os nomes dos caracteres - veja abaixo.)Criações de comando de amostra:
Esta é a sequência de documentos:
Se você quiser vincular os comandos criados às chaves de maneira sistemática, poderá criar facilmente uma macro com base no código, para
ucsc-make-commands
que ambos criem os comandos desejados e os vinculem. A macroucsc-make-commands
apenas itera sobre todos os carros Unicode e cria comandos para aqueles cujos nomes correspondem aoREGEXP
argumento.Durante uma iteração, você tem acesso ao nome do personagem e seu ponto de código. Descobrir um mapeamento regular conveniente de pontos de código ou nomes de caracteres para chaves, e sua macro pode adicionar os
define-key
s apropriados , além dos comandosdefun
s.A biblioteca também fornece um comando,,
ucsc-insert
que pode substituir o comando vanillainsert-char
. O comportamento e o código deucsc-insert
são idênticos aos deinsert-char
exceto pelo que acontece quando você usa um argumento de prefixo negativo:Ele age como se o valor do prefixo-arg fosse positivo. Portanto, um valor de -3 insere três cópias do caractere, assim como 3.
Além de inserir o caractere, ele define um comando que você pode usar posteriormente para inserir esse caractere. Você pode usar um argumento de prefixo com esse comando para inserir várias cópias do caractere especificado.
Isso fornece um comando personalizado para inserir um determinado caractere Unicode. Em seguida, você pode vincular o comando a uma sequência de teclas, adicionando efetivamente caracteres Unicode ao teclado.
Sempre que
insert-char
faz alguma coisa (não faz nada para um prefixo negativo arg),ucsc-insert
faz a mesma coisa. Devido a isso, você pode ligarucsc-insert
paraC-x 8 RET
como um substituto parainsert-char
:Se você precisar de apenas alguns desses comandos para inserir caracteres Unicode específicos, usar
ucsc-insert
para defini-los é suficientemente conveniente. Se você precisar de muitos desses comandos, a macroucsc-make-commands
é sua amiga.fonte
ucsc-insert
parece que isso poderia ajudar a cobrir meus casos de uso. Definir novos comandos interativamente (viaM--
M-x
ucsc-insert
RET
#x2190
RET
) funciona bem, mas quando tento executá-los (depois de(define-key iso-transl-ctl-x-8-map (kbd "b") 'left-arrow)
vinculá- los ), recebo "Argumento de tipo errado: wholenump, nil". Você poderia dar um exemplo de comoucsc-insert
pode ser usado para definir programaticamente uma ligação para um caractere Unicode específico?ucs-cmds.el
. Deve ser espelhado para MELPA dentro de 24 horas. Valeu.(ucsc-insert #x2192 -1) (define-key ctl-x-map (kbd "8 a") 'right-arrow)
, o que é definitivamente mais conciso do que minha abordagem original. Preciso perguntar, no entanto, se esta é a maneira pretendida de usarucsc-insert
para definir comandos para símbolos Unicode que persistem nas sessões? Tenho a sensação de que talvez não seja, porque faz com que o Emacs insira caracteres para os quais estou definindo comandos personalizados no*scratch*
buffer na inicialização ...ucsc-insert
é para que se comportam comoucs-insert
, akainsert-char
, a menos que você use um negativo prefixo arg - ele sempre insere um char . Se você não deseja inserir um caractere, mas apenas deseja definir um comando para inserir um caractere, use macroucsc-make-commands
. Mas você está certo (de novo) que seria bom ter uma função que apenas define um único comando. Então eu adicionei a função (comando)ucsc-define-char-insert-cmd
. Por exemplo:(ucsc-define-char-insert-cmd 8592)
define o comando e retorna seu símbololeft-arrow
,. Por favor, tente o mais recente. Valeu.