Sostituisci un carattere con una stringa mentre viene digitato

Aug 20 2020

Vorrei fare quanto segue: attivare una modalità in modo che ogni volta che digito il $carattere nel mio buffer, venga immediatamente sostituito da <m>.

Ancora meglio: quando digito $, inserisce <m></m>e posiziona il cursore tra la coppia di tag corrispondente.

Non ho alcun problema con la soluzione rapida e sporca, ma dovrei essere in grado di accenderla e spegnerla.

Contesto: ho iniziato a usare PreTeXt , che è fondamentalmente "laTeX incontra xml", per scrivere un testo matematico. Funziona molto bene, ma dover digitare <m>tutto il tempo sta danneggiando la mia produttività (mi sto già divertendo c-C ]a chiudere i tag.)

Risposte

1 ideasman42 Aug 20 2020 at 11:56

Questo può essere fatto usando la modalità abbreviata:

;; 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))))

Il blocco di codice sopra può essere copiato e incollato nel emacsfile init.


Per modelli più avanzati potresti voler esaminare: yasnippets .