web-dev-qa-db-ja.com

vimでHTMLタグを変更しますが、属性は維持します(サラウンド)

タグがあるとしましょう(そして*にカーソルがあります):

<h1 class="blah" id="moo">H*Ello!</h1>

変更したい:

*<h2 class="blah" id="moo">Hello</h2>

つまり、タグのタイプを変更しますが、すべての要素は保持します。

Surround.vimを使用すると、次のことができます。

cst<h2>

ただし、HTMLは次のように変更されます。

*<h2>Hello</h2>

タグを変更するだけで、すべての属性を維持できますか?サラウンドドキュメントに次のようなものが含まれていないようです...

41
cazgp

Xml.vimプラグインがあります( https://github.com/othree/xml.vim )。あなたもそれを持っているなら、あなたの要件はかなり簡単です。

カーソルをタグに移動し、<leader>c(小文字のc)を押して新しいタグ名を入力するだけで、タグ名のみが変更されます。

<leader>C(Big C)を押すと、タグ/要素の名前も変更されますが、元の属性も削除されます。

7
Kent

属性を保持しながらタグを置き換える 追加されました をSurround.vimに

cst<p>はタグ全体を置き換えますが、cst<p(閉じ括弧なし)は属性を保持します。

95

csttを使用すると、下部に<が表示され、>なしでタグ名を入力できます

この場合、cstth2を押してEnterキーを押します。

20
Surahman

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>

注:これは、g:surround_101またはb:surround_101を介して作成されたものがある場合、eで周囲の一部のケースをシャドウします。その場合は、マッピング形式cseを他のノードに変更するためにcsnに変更してください。

[〜#〜]編集[〜#〜]

2015年2月22日現在 この回答は古くなっています。これをサラウンドでネイティブに行う方法については、@ Wojtek Kruszewskiの投稿または:h surround-replacementsを参照してください。

2
Peter Rincker

私の場合は、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

1
ernix