Как быстро закрыть HTML-теги в Vim?

Прошло много времени с тех пор, как я должен был сделать любой HTML-подобный код в Vim, но недавно я столкнулся с этим снова. Скажем, я пишу несколько простых HTML:

<html><head><title>This is a title</title></head></html>

Как быстро написать эти закрывающие теги для заголовка, заголовка и HTML? Я чувствую, что упускаю какой-то очень простой способ, который не требует, чтобы я записывал их все по одному.

Конечно, я могу использовать CtrlP для автозаполнения имен отдельных тегов, но на клавиатуре моего ноутбука я получаю правильные скобки и косую черту.

11 ответов

Решение

Проверь это..

closetag.vim

Functions and mappings to close open HTML/XML tags

https://www.vim.org/scripts/script.php?script_id=13

Я использую что-то подобное.

Я считаю использование плагина xmledit довольно полезным. это добавляет две части функциональности:

  1. Когда вы открываете тег (например, введите <p>), он расширяет тег, как только вы вводите закрывающий > в <p></p> и помещает курсор внутри тега в режиме вставки.
  2. Если вы сразу же введите другой > (например, вы вводите <p>>), это расширяет это в

    <p>

    </p>

и помещает курсор внутри тега, с отступом один раз, в режиме вставки.

Плагин xml vim добавляет свертывание кода и сопоставление вложенных тегов с этими функциями.

Конечно, вам не нужно беспокоиться о закрытии тегов, если вы пишете HTML-контент в Markdown и используете его. %! фильтровать ваш буфер Vim через процессор Markdown по вашему выбору:)

Мне нравятся минимальные вещи,

imap ,/ </<C-X><C-O>

Я считаю более удобным сделать так, чтобы vim писал для меня как открывающий, так и закрывающий тег, а не только закрывающий. Вы можете использовать отличный плагин Ragtag от Tim Pope. Использование выглядит следующим образом (пусть | пометить позицию курсора) вы набираете:

пролет |

нажмите CTRL+x ПРОБЕЛ

и вы получите

|

Вы также можете использовать CTRL+x ENTER вместо CTRL+x SPACE, и вы получите

|

Ragtag может сделать больше, чем просто (например, вставить <% = вещи вокруг этого%> или DOCTYPE). Вы, вероятно, хотите проверить другие плагины автора ragtag, особенно Surround.

Если вы делаете что-то сложное, спаркап очень хорош.

Пример с их сайта:

ul > li.item-$*3 расширяется до:

<ul>
    <li class="item-1"></li>
    <li class="item-2"></li>
    <li class="item-3"></li>
</ul>

с <C-e>,

Чтобы сделать пример, приведенный в вопросе,

html > head > title{This is a title}

доходность

<html>
  <head>
    <title>This is a title</title>
  </head>
</html>

Существует также плагин zencoding vim: https://github.com/mattn/zencoding-vim

учебное пособие: https://github.com/mattn/zencoding-vim/blob/master/TUTORIAL


Обновление: теперь это называется Emmet: http://emmet.io/


Выдержка из учебника:

1. Expand Abbreviation

  Type abbreviation as 'div>p#foo$*3>a' and type '<c-y>,'.
  ---------------------
  <div>
      <p id="foo1">
          <a href=""></a>
      </p>
      <p id="foo2">
          <a href=""></a>
      </p>
      <p id="foo3">
          <a href=""></a>
      </p>
  </div>
  ---------------------

2. Wrap with Abbreviation

  Write as below.
  ---------------------
  test1
  test2
  test3
  ---------------------
  Then do visual select(line wize) and type '<c-y>,'.
  If you request 'Tag:', then type 'ul>li*'.
  ---------------------
  <ul>
      <li>test1</li>
      <li>test2</li>
      <li>test3</li>
  </ul>
  ---------------------

...

12. Make anchor from URL

  Move cursor to URL
  ---------------------
  http://www.google.com/
  ---------------------
  Type '<c-y>a'
  ---------------------
  <a href="http://www.google.com/">Google</a>
  ---------------------

картографирование

Мне нравится, когда мои теги блоков (в отличие от встроенных) закрываются немедленно и с помощью как можно более простого ярлыка (мне нравится избегать специальных клавиш, таких как CTRL, где это возможно, хотя я использую closetag.vim чтобы закрыть мои встроенные теги.) Мне нравится использовать этот ярлык при запуске блоков тегов (благодаря @kimilhee; это ответ на его вопрос):

inoremap ><Tab> ><Esc>F<lyt>o</<C-r>"><Esc>O<Space>

Пример использования

Тип-

<p>[Tab]

Результат-

<p>
 |
</p>

где | указывает на позицию курсора.

объяснение

  • inoremap означает создать отображение в режиме вставки
  • ><Tab> означает закрывающие угловые скобки и символ табуляции; это то, что соответствует
  • ><Esc> означает конец первого тега и выход из режима вставки в обычном режиме
  • F< значит найти последнюю открывающую угловую скобку
  • l означает переместить курсор вправо (не копировать открывающую угловую скобку)
  • yt> означает рывок от позиции курсора до до следующей закрывающей угловой скобки (т.е. копирование содержимого тегов)
  • o</ означает начать новую строку в режиме вставки и добавить открывающую угловую скобку и косую черту
  • <C-r>" означает вставку в режиме вставки из регистра по умолчанию (")
  • ><Esc> означает закрыть закрывающий тег и выйти из режима вставки
  • O<Space> означает начать новую строку в режиме вставки над курсором и вставить пробел

Проверять, выписываться vim-closetag

Это действительно простой скрипт (также доступен какvundleплагин), который закрывает (X)HTML-теги для вас. Из этогоREADME:

Если это текущий контент:

<table|

Теперь вы нажимаете>, содержимое будет:

<table>|</table>

И теперь, если вы нажмете> снова, содержимое будет:

<table>
   |
</table>

Замечания:|здесь курсор

Вот еще одно простое решение, основанное на легко обнаруживаемом веб-написании:

  1. Автоматическое закрытие тега HTML

    :iabbrev </ </<C-X><C-O>

  2. Включение завершения

    autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags

allml (теперь Ragtag) и Omni-завершение () не работают в таких файлах, как.py или.java.

если вы хотите автоматически закрыть тег в этом файле, вы можете отобразить карту следующим образом.

imap  F$ a

(^ R - это Contrl+R: вы можете напечатать как этот Control+v, а затем Control + r)

(| это позиция курсора) теперь, если вы наберете..

<Р>ABCDE |

и введите ^ J

затем закройте тег, как это..

<Р>ABCDE|

Основываясь на отличном ответе @KeithPinson (извините, репутации недостаточно, чтобы прокомментировать ваш ответ), эта альтернатива не позволит автозаполнению копировать что-либо лишнее, что может быть внутри тега html (например, классы, идентификаторы и т. Д.)..) но не следует копировать в закрывающий тег.

ОБНОВЛЕНИЕ Я обновил свой ответ для работы с filename.html.erb файлы.
Я заметил, что мой оригинальный ответ не работал в файлах, обычно используемых в представлениях Rails, например some_file.html.erb когда я использовал встроенный рубин (например, <p>Year: <%= @year %><p>). Код ниже будет работать с .html.erb файлы.

inoremap ><Tab> ><Esc>?<[a-z]<CR>lyiwo</<C-r>"><Esc>O

Пример использования

Тип:

<div class="foo">[Tab]

Результат:

<div class="foo">
  |
<div>

где | указывает на позицию курсора

И в качестве примера добавления встроенного закрывающего тега вместо стиля блока:

inoremap ><Tab> ><Esc>?<[a-z]<CR>lyiwh/[^%]><CR>la</<C-r>"><Esc>F<i

Пример использования

Тип:

<div class="foo">[Tab]

Результат:

<div class="foo">|<div>

где | указывает на позицию курсора

Это правда, что оба приведенных выше примера опираются на >[Tab] сигнализировать о закрывающем теге (то есть вы должны выбрать встроенный или блочный стиль). Лично я использую блочный стиль с >[Tab] и встроенный стиль с >>,

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