我经常用一些其他文本行包围一些代码/文本。为了一个具体的例子,说我有一些文字:
this is
some text
然后我有一个宏,让我将其转换(突出显示行之后)
if false then
this is
some text
end;
我用来做这个的宏是:
nmap <space>i ccif false then<CR><c-r>"end;<esc>
vmap <space>i cif false then<CR><c-r>"end;<esc>
但是我希望能够创建宏来删除周围的文本。也就是说,如果光标被行包围,“if false then”和“end;”那些线应该被删除。
如何创建像这样的宏?
请注意,我已经查看了surround.vim,但还没有找到使用该软件包的方法。
答案 0 :(得分:2)
尝试以下脏功能并检查是否可以帮助解决您的问题。从光标位置开始,它会向前和向后查看这些字符串。仅在两者匹配时删除它们:
function! RemoveSurrondingIfCondition()
let s:current_line = line('.')
"" Look backwards for the key string.
let s:beginif = search( '\v^if\s+false\s+then\s*$', 'bWn' )
if s:beginif == 0 || s:current_line <= s:beginif
return
endif
"" Set a mark where the _if_ begins
execute s:beginif 'mark b'
"" Look forward for the end of the _if_
let s:endif = search( '\v^end;\s*$', 'Wn' )
if s:endif == 0 || s:endif <= s:beginif || s:current_line >= s:endif
return
endif
"" Delete both end points if searches succeed.
execute s:endif . 'delete'
'b delete
endfunction
noremap <space>d :call RemoveSurrondingIfCondition()<CR>
答案 1 :(得分:1)
我把一个答案放在一起,这样做就行了 - 你和我都知道只能拼写“正则表达式”。无论如何,这将适用于最近的if false then
和end;
。如果你不在这样一对的“范围”中,它将删除最近的两个,也许是以一种奇怪的方式!随意称之为“未定义的行为”。
:?^\s*if\ false\ then?,/^\s*end;/ g/^\s*if\ false\ then\|^\s*end;/d
您可以在那里挖掘并找到实际的字符串,并将其更改为实际适合您的字符串。而且,如果你愿意对正则表达式感到沮丧,那么你可以使它与if false then
和if true then
以及if <something> then
s匹配,并且各种有趣的东西。
如果你想要一个不那么粗略(读:不存在)解释它是如何工作的,请随意这样说。我在这里假设你至少和我一样了解:g就像我一样。