Вы хотите взглянуть на некоторые примеры функций electric
(соглашение об именах, используемое при дополнительном вводе или форматировании, когда набираются определенные видимые символы).
В реализации нет ничего особенного. Соответствующий ключ в пределах таблицы режимов привязан к функции, которая выполняет эту работу. Помимо того, что вы должны обрабатывать вставку набираемого символа, это так же, как любое другое связывание клавиш.
cc-mode имеет несколько примеров. Основной подход выглядит так:
(define-key c-mode-base-map "{" 'c-electric-brace)
(defun c-electric-brace (arg)
(interactive "*P")
;; [...]
(self-insert-command (prefix-numeric-value arg))
;; [...]
)
По общему признанию, c-electric-brace - гораздо более сложная функция, чем вы могли бы ожидать, но было бы тривиально иметь функцию, которая просто вставляла бы то же число }
s после вставки {
s.
(defun my-electric-brace (arg)
"Automatically add a closing '}' for every '{' inserted."
(interactive "*P")
(let ((count (prefix-numeric-value arg)))
(self-insert-command count)
(save-excursion
(insert-char ?} count))))
(defun my-css-mode-hook ()
(local-set-key (kbd "{") 'my-electric-brace))
(add-hook 'css-mode-hook 'my-css-mode-hook)
Вы можете обнаружить, что это немного упрощенно, и есть обстоятельства, при которых вы не хотите вставлять соответствующую скобку. Возможно, вы также захотите иметь дело с автоматическим удалением соответствующих скобок при удалении одной из них, определяя электрические функции удаления.
Ваше требование к электрическому двоеточию также менее тривиально, чем скобка, так как оно должно происходить только в правильном контексте (хотя на практике вам может не понравиться наивная реализация, поскольку я не думаю, что вы будете вводить двоеточия в Файл CSS, который не был в правильном контексте.)
Надеюсь, это направит вас в правильном направлении, если вы решите написать свои собственные решения.
Очевидно, что вы захотите прочитать некоторые учебные пособия по elisp, но для понимания приведенного выше кода просто отметьте, что вы можете использовать Ch f (describe-function
), чтобы прочитать документацию по любой функции elisp (или Mx find-function
для просмотра кода).