タグがあるとしましょう(そして*にカーソルがあります):
<h1 class="blah" id="moo">H*Ello!</h1>
変更したい:
*<h2 class="blah" id="moo">Hello</h2>
つまり、タグのタイプを変更しますが、すべての要素は保持します。
Surround.vimを使用すると、次のことができます。
cst<h2>
ただし、HTMLは次のように変更されます。
*<h2>Hello</h2>
タグを変更するだけで、すべての属性を維持できますか?サラウンドドキュメントに次のようなものが含まれていないようです...
Xml.vimプラグインがあります( https://github.com/othree/xml.vim )。あなたもそれを持っているなら、あなたの要件はかなり簡単です。
カーソルをタグに移動し、<leader>c
(小文字のc)を押して新しいタグ名を入力するだけで、タグ名のみが変更されます。
<leader>C
(Big C)を押すと、タグ/要素の名前も変更されますが、元の属性も削除されます。
属性を保持しながらタグを置き換える 追加されました をSurround.vimに
cst<p>
はタグ全体を置き換えますが、cst<p
(閉じ括弧なし)は属性を保持します。
cstt
を使用すると、下部に<
が表示され、>
なしでタグ名を入力できます
この場合、cstth2
を押してEnterキーを押します。
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
を参照してください。
私の場合は、matchit.vim
またはtext-object
。
matchit.vim
はvimに含まれています。
source $VIMRUNTIME/macros/matchit.vim
その後 0l%%lr2<Ctrl-o>llr20
。
Htmlコンテンツを置き換える前に、レジスタに退避することもできます。
dit:.s/h1/h2/g<Ctrl-o>P0