Замените символ строкой при вводе

Aug 20 2020

Я хотел бы сделать следующее: активировать какой-нибудь режим, чтобы, когда я набираю $символ в моем буфере, он немедленно заменяется на <m>.

Еще лучше: когда я печатаю, $он помещает <m></m>курсор между соответствующей парой тегов.

У меня нет проблем с тем, что решение получается быстрым и грязным, но мне нужно иметь возможность включать и выключать его.

Контекст: я начал использовать PreTeXt , который по сути представляет собой «laTeX встречает xml», для написания математического текста. Он работает очень хорошо, но <m>постоянный набор текста вредит моей продуктивности (мне уже нравится c-C ]закрывать теги).

Ответы

1 ideasman42 Aug 20 2020 at 11:56

Это можно сделать в сокращенном режиме:

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

Вышеупомянутый блок кода можно скопировать в ваш emacsфайл инициализации.


Для более продвинутого создания шаблонов вы можете изучить: yasnippets .