Закрыть HTML-теги, как только они открываются
Мне бы хотелось, чтобы соответствующий закрывающий HTML-тег автоматически вставлялся при каждом его открытии.
Так что, если я наберу
<div>
Я должен получить
<div></div>
Без необходимости звонить sgml-close-tag
себя.
Как этого добиться?
5 ответов
Вместо того, чтобы вызывать функцию перехвата после каждого нажатия клавиши, имеет смысл вызывать ее только после ввода >. Это может быть достигнуто путем повторного связывания символа > в раскладке sgml-mode
использует.
К тому же, sgml-close-tag
не должен вызываться, если тег уже закрыт. Следовательно, следующий код добавляет простую проверку регулярного выражения для этого:
(defun my-sgml-insert-gt ()
"Inserts a `>' character and calls
`my-sgml-close-tag-if-necessary', leaving point where it is."
(interactive)
(insert ">")
(save-excursion (my-sgml-close-tag-if-necessary)))
(defun my-sgml-close-tag-if-necessary ()
"Calls sgml-close-tag if the tag immediately before point is
an opening tag that is not followed by a matching closing tag."
(when (looking-back "<\\s-*\\([^</> \t\r\n]+\\)[^</>]*>")
(let ((tag (match-string 1)))
(unless (and (not (sgml-unclosed-tag-p tag))
(looking-at (concat "\\s-*<\\s-*/\\s-*" tag "\\s-*>")))
(sgml-close-tag)))))
(eval-after-load "sgml-mode"
'(define-key sgml-mode-map ">" 'my-sgml-insert-gt))
Если хочешь paredit
(и если вы пользователь emacs, скорее всего, вы это делаете), вас может заинтересовать tagedit
пакет emacs, написанный Магнаром Свином, который обеспечивает paredit
-подобные функции для редактирования HTML.
Библиотека находится здесь: https://github.com/magnars/tagedit и может быть установлена через Melpa / Marmalade (package-install tagedit
).
Если вы включите экспериментальные функции (tagedit-add-experimental-features)
затем он автоматически закроет теги и сохранит соответствующий текст закрывающего тега в соответствии с текстом открывающего тега. Это в дополнение к возможности склеивать, глотать, грызть и все другие сумасшедшие вещи, которые paredit
позволяет делать это при работе со сбалансированными выражениями... Я думаю, это здорово!
Вы можете проверить это в своем sgml-буфере или добавить ii в свой sgml-хук:
(add-hook 'post-self-insert-hook
(lambda () (and (eq (char-before) ?>) (sgml-close-tag))) nil t)
Всякий раз, когда вы вставляете ">", функция sgml-close-tag
будет работать для вас
Я использую yasnippet
для этого. Чтобы набрать ярлыки этот ответ, как <kbd>C-o</kbd>
У меня есть следующий фрагмент:
# -*- mode: snippet -*-
# name: kbd
# key: kbd
# --
<kbd>$0</kbd>
Так что я печатаю kbd
Со, и это расширилось до <kbd></kbd>
с курсором прямо посередине. Вы можете иметь такое же поведение для div
,
Использование режима sgml для меня является проблемой... Когда я нажимаю "Cc Ct" в html-файле, открывается минибуфер, и я вводю атрибуты... Но он продолжает запрашивать дополнительные атрибуты в бесконечном цикле... Если Я нажимаю Cg, чтобы выйти из бессмысленного цикла, он удаляет все, что я ввел ранее.... Как мне выйти из цикла минибуфера sgml-тегов, не стирая при этом мои теги в файле?