Maneira linguística de estender o mapa de teclas para inserir símbolos unicode?

7

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

  1. defina um comando personalizado para inserir um determinado caractere Unicode, como:

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

itsjeyd
fonte

Respostas:

7

Não há necessidade de definir um comando para vincular um caractere unicode:

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

liga α a C-x 8 a. Enquanto

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

vincula ς a C-x 8 M-s.

Adobe
fonte
11
A matriz pode ser trocada por uma string btw, o que tornaria um byte mais curto.
wasamasa
4

Biblioteca ucs-cmds.elpode ajudar.

Ele fornece uma macro, ucsc-make-commandspara criar rapidamente um conjunto de comandos que inserem caracteres Unicode. Você fornece uma regexp, que é comparada com todos os nomes de caracteres Unicode (pol ucs-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:

 (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 é a sequência de documentos:

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.

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-commandsque ambos criem os comandos desejados e os vinculem. A macro ucsc-make-commandsapenas itera sobre todos os carros Unicode e cria comandos para aqueles cujos nomes correspondem ao REGEXPargumento.

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-keys apropriados , além dos comandos defuns.


A biblioteca também fornece um comando,, ucsc-insertque pode substituir o comando vanilla insert-char. O comportamento e o código de ucsc-insertsão idênticos aos de insert-charexceto pelo que acontece quando você usa um argumento de prefixo negativo:

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

  2. 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-charfaz alguma coisa (não faz nada para um prefixo negativo arg), ucsc-insertfaz a mesma coisa. Devido a isso, você pode ligar ucsc-insertpara C-x 8 RETcomo um substituto para insert-char:

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

Se você precisar de apenas alguns desses comandos para inserir caracteres Unicode específicos, usar ucsc-insertpara defini-los é suficientemente conveniente. Se você precisar de muitos desses comandos, a macro ucsc-make-commandsé sua amiga.

Desenhou
fonte
Obrigado, ucsc-insertparece que isso poderia ajudar a cobrir meus casos de uso. Definir novos comandos interativamente (via M-- 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 como ucsc-insertpode ser usado para definir programaticamente uma ligação para um caractere Unicode específico?
itsjeyd
Você está certo! Houve um erro aqui. Corrigido agora no Emacs Wiki ucs-cmds.el. Deve ser espelhado para MELPA dentro de 24 horas. Valeu.
Tirou
Ainda bem que pude ajudá-lo a encontrar e corrigir um bug :) Agora posso definir e vincular comandos para inserir símbolos Unicode específicos via (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 usar ucsc-insertpara 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 ...
itsjeyd
O uso pretendido ucsc-inserté para que se comportam como ucs-insert, aka insert-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 macro ucsc-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ímbolo left-arrow,. Por favor, tente o mais recente. Valeu.
Tirou
Obrigado, experimentá-lo assim que a atualização entrar no MELPA!
itsjeyd