Подтвердить что ты не робот

Измените 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>

Является ли только изменение тега возможным, но сохраняя все атрибуты? Документация объемного звучания, похоже, не содержит ничего подобного...

4b9b3361

Ответ 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