Позиция курсора Vim после расширения html-тега

Я больше всего IDE и современных текстовых редакторов (Sublime Text 3) курсор правильно отступы после вставки новой строки между тегом html (так называемый "расширение" тега):

До:

<div>|</div>

После нажатия CR:

<div>
    |
</div>

Но в Vim это то, что я получаю:

<div>
|</div>

Как я могу получить такое же поведение в Vim, как в большинстве других редакторов (см. выше)?

Ответ 1

Единственное правильное поведение <CR> в режиме вставки - это разбить строку на курсор.

Что вы хотите - это улучшенное поведение, и вам нужно добавить что-то в свою конфигурацию, чтобы получить его: отображение, короткую функцию или полноценный плагин.

Когда я начал использовать vim, это поведение было на самом деле одной из первых вещей, которые я добавил в мой vimrc. Я изменил его много раз в прошлом, но это сопоставление было довольно стабильным на некоторое время:

inoremap <leader><CR> <CR><C-o>==<C-o>O

Я использовал <leader><CR>, чтобы сохранить нормальное поведение <CR>.


Вот небольшая функция, которая, кажется, делает то, что вы хотите:

function! Expander()
  let line   = getline(".")
  let col    = col(".")
  let first  = line[col-2]
  let second = line[col-1]
  let third  = line[col]

  if first ==# ">"
    if second ==# "<" && third ==# "/"
      return "\<CR>\<C-o>==\<C-o>O"

    else
      return "\<CR>"

    endif

  else
    return "\<CR>"

  endif

endfunction

inoremap <expr> <CR> Expander()

Ответ 2

Этот небольшой фрагмент переназначит Enter в режиме вставки, чтобы проверить, находится ли курсор между > и < и действует соответственно, если это так. В зависимости от настроек отступа возможно удалить \<Tab>.

Он не будет хорошо работать с другими плагинами, которые также могут быть сопоставлены с ключом Enter, поэтому имейте в виду, что, если вам нужна эта совместимость, возможно, потребуется больше работы.

function EnterOrIndentTag()
  let line = getline(".")
  let col = getpos(".")[2]
  let before = line[col-2]
  let after = line[col-1]

  if before == ">" && after == "<"
    return "\<Enter>\<C-o>O\<Tab>"
  endif
   return "\<Enter>"
endfunction

inoremap <expr> <Enter> EnterOrIndentTag()

Я тестировал только простые случаи (начало строки, конец строки, внутри и вне ><), вероятно, есть случаи краев, которые это не будет ловить.

Ответ 3

@RandyMorris и @romainl опубликовали хорошие решения для вашей конкретной проблемы.

Есть несколько других возможностей, которые могут вас заинтересовать, если вы сами вводите эти теги: ragtag.vim для редактирования HTML/XML.

С помощью ragtag.vim вы вводите это, чтобы создать свою "до" ситуацию (в режиме вставки):

div<C-X><Space>

Чтобы создать свою "после" ситуацию, вы должны ввести:

div<C-X><Enter>

Итак, если вы заранее знаете, что собираетесь "развернуть" тег, достаточно ввести только имя элемента и комбо Ctrl X, а затем Enter.

Существуют также другие более продвинутые плагины для сохранения нажатий клавиш при редактировании HTML, таких как ZenCoding.vim и Sparkup.

Ответ 4

Поскольку никто не упомянул об этом, я это сделаю. Существует отличный плагин, который делает именно это delemitmate