Закрыть 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-тегов, не стирая при этом мои теги в файле?

Другие вопросы по тегам