删除vim中的周围线条

时间:2013-07-08 20:55:08

标签: vim surround

我经常用一些其他文本行包围一些代码/文本。为了一个具体的例子,说我有一些文字:

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,但还没有找到使用该软件包的方法。

2 个答案:

答案 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 thenend;。如果你不在这样一对的“范围”中,它将删除最近的两个,也许是以一种奇怪的方式!随意称之为“未定义的行为”。

:?^\s*if\ false\ then?,/^\s*end;/ g/^\s*if\ false\ then\|^\s*end;/d

您可以在那里挖掘并找到实际的字符串,并将其更改为实际适合您的字符串。而且,如果你愿意对正则表达式感到沮丧,那么你可以使它与if false thenif true then以及if <something> then s匹配,并且各种有趣的东西。

如果你想要一个不那么粗略(读:不存在)解释它是如何工作的,请随意这样说。我在这里假设你至少和我一样了解:g就像我一样。