Позиция курсора 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