49

タグ (および * にカーソル) があるとします。

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

私はそれを次のように変更したい:

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

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

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

cst<h2>

しかし、それはHTMLを次のように変更します:

*<h2>Hello</h2>

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

4

5 に答える 5

122

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

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

于 2015-06-28T10:26:10.547 に答える
7

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

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

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

于 2013-05-03T08:48:36.030 に答える
2

サラウンドにはこれが組み込まれていません。属性をヤンクし<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_101b:surround_101csecsn

編集

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

于 2013-05-02T16:01:45.307 に答える
1

私の場合、matchit.vimまたはを試しtext-objectます。

matchit.vim ソリューション:

matchit.vimvimに含まれています。

source $VIMRUNTIME/macros/matchit.vim

そして0l%%lr2<Ctrl-o>llr20

テキスト オブジェクト ソリューション:

また、html コンテンツを置換する前にレジスターに退避させることもできます。

dit:.s/h1/h2/g<Ctrl-o>P0

于 2013-05-03T06:19:58.843 に答える