Substitua um caractere por uma string à medida que é digitada

Aug 20 2020

Eu gostaria de fazer o seguinte: ativar algum modo para que, quando eu digitar o $caractere no meu buffer, ele seja imediatamente substituído por <m>.

Melhor ainda: quando digito $, ele coloca <m></m>e posiciona o cursor entre o par de tags correspondente.

Não tenho nenhum problema com a solução ser rápida e suja, mas precisaria ser capaz de ligá-la e desligá-la.

Contexto: Comecei a usar o PreTeXt , que é basicamente "laTeX encontra xml", para escrever um texto de matemática. Funciona muito bem, mas ficar digitando <m>toda hora está prejudicando minha produtividade (já estou aproveitando c-C ]para fechar as tags).

Respostas

1 ideasman42 Aug 20 2020 at 11:56

Isso pode ser feito usando o modo abreviado:

;; Hook to go back N chars after completion.
(defun my-abbrev-back-4-no-self-insert ()
  (progn
    (forward-char -4)
    t))
(put 'my-abbrev-back-4-no-self-insert 'no-self-insert t)

(define-abbrev-table
  'global-abbrev-table
  (list
    (list "$" "<m></m>" 'my-abbrev-back-4-no-self-insert 0)
    ;; More typical examples of abbrev mode usage.
    (list "btw" "by the way" nil 3)
    (list "pov" "point of view" nil 1)))

;; Enable abbrev mode.
(add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (or (derived-mode-p 'prog-mode)
              (derived-mode-p 'text-mode))
      (abbrev-mode 1))))

O bloco de código acima pode ser copiado e colado em seu emacsarquivo init.


Para modelos mais avançados, você pode querer olhar para: yasnippets .