Измените HTML-тег в vim, но сохраните атрибуты (surround)
Скажем, у меня есть тег (и курсор в *):
<h1 class="blah" id="moo">H*ello!</h1>
Я хочу изменить его на:
*<h2 class="blah" id="moo">Hello</h2>
то есть. Измените тип тега, но сохраните все элементы.
Используя surround.vim, я мог бы сделать:
cst<h2>
но это изменяет HTML на:
*<h2>Hello</h2>
Является ли только изменение тега возможным, но сохраняя все атрибуты? Документация объемного звучания, похоже, не содержит ничего подобного...
Ответы
Ответ 1
У меня есть плагин xml.vim(https://github.com/othree/xml.vim). Если у вас его тоже, ваше требование довольно просто.
Просто переместите курсор на тег, нажмите <leader>c
(нижний регистр c), затем введите новый тэг, будет изменено только имя тега.
Если вы нажмете <leader>c
(Big C), также переименуйте тег/элемент, но также удалены исходные атрибуты.
Ответ 2
Замена тега при сохранении атрибутов добавлен в Surround.vim
cst<p>
заменяет весь тэг, а cst<p
(без закрывающей скобки) сохраняет атрибуты.
Ответ 3
Вы можете использовать cstt
, и он отобразит <
внизу и введите имя тега без >
в этом случае cstth2
и нажмите enter.
Ответ 4
Surround не имеет встроенного встроенного устройства. Вы можете вытаскивать атрибуты, а затем использовать <c-r>"
при вводе тега замены, чтобы вернуть их, но это немного хромает.
Я предлагаю новое сопоставление и функцию, которые будут автоматизировать эту задачу. Следующее предоставит отображение cse
, иначе изменяющее окружающий элемент. Поместите это в свой файл ~/.vimrc
или, возможно, ~/.vim/after/plugin/surround_change_element.vim
, если вы чувствуете чрезмерное оранжирование.
function! s:ChangeElement()
execute "normal! vat\<esc>"
call setpos('.', getpos("'<"))
let restore = @"
normal! yi>
let attributes = substitute(@", '^[^ ]*', '', '')
let @" = restore
let dounmapb = 0
if !maparg(">","c")
let dounmapb = 1
" Hide from AsNeeded
exe "cn"."oremap > <CR>"
endif
let tag = input('<', '')
if dounmapb
silent! cunmap >
endif
let tag = substitute(tag, '>*$', '', '')
exe "normal cst<" . tag . attributes . ">"
endfunction
nnoremap cse :call <SID>ChangeElement()<cr>
Примечание. Это создаст тень некоторых случаев окружения с помощью e
, если у вас есть созданные через g:surround_101
или b:surround_101
. Если это так, измените форму отображения cse
на что-то еще, возможно, csn
для изменения окружения node.
ИЗМЕНИТЬ
По состоянию на 22 февраля 2015 г. этот ответ устарел. Пожалуйста, см. Сообщение @Wojtek Kruszewski или :h surround-replacements
, как сделать это изначально с объемным звучанием.
Ответ 5
В моем случае я бы попробовал matchit.vim
или text-object
.
Решение matchit.vim:
matchit.vim
включен в vim.
source $VIMRUNTIME/macros/matchit.vim
а затем 0l%%lr2<Ctrl-o>llr20
.
решение текстового объекта:
Вы также можете эвакуировать содержимое html в регистр перед заменой.
dit:.s/h1/h2/g<Ctrl-o>P0