假设我有一个标签(光标在*处):
<h1 class="blah" id="moo">H*ello!</h1>
我希望您能将其改为:
*<h2 class="blah" id="moo">Hello</h2>
例如更改标签类型,但保留所有元素。
使用 surround.vim,我可以执行以下操作:cst<h2>
但是这会改变 HTML 的内容:
*<h2>Hello</h2>
只更改标签,但保留所有属性是否可能?周围的文档似乎没有类似这样的内容...
cstt
,它将在底部显示<
并输入标签名称但不包括>
。cstth2
并按Enter键。vim.keymap.set({"n", "x"}, "<leader>w", function() vim.fn.feedkeys("cstt") end, {noremap = true})
。 - run_the_racevim.keymap.set({"n",“x”},“<leader>w”,function() vim.fn.feedkeys(“cstt”)end,{noremap = true})
- run_the_race<leader>c
(小写 c),然后输入新的标签名称,只有标签名称会被更改。<leader>C
(大写 C),不仅可以重命名标签/元素,而且原始属性也会被删除。<LocalLeader>c
默认为 \c
。 - jeff_kile<c-r>”
将它们带回来,但这有点麻烦。~/.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
以了解如何使用surround原生方法执行此操作。
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
s///
。 - timsss/h1/h2/g
或set gdefault
即可。 - timss