0

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

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;”行包围。那么这些行应该被删除。

任何想法我将如何创建这样的宏?

请注意,我已经查看了环绕.vim,但还没有找到使用该包的方法。

4

2 回答 2

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>
于 2013-07-08T21:44:07.680 回答
1

我拼凑了一个答案,可以在一行中做到这一点 - 你和我都知道只能拼写“正则表达式”。无论如何,这将适用于最接近的if false thenand集合end;。如果你不在这样一对的“范围”内,它会删除最近的两个,可能会以一种奇怪的方式!随意称其为“未定义的行为”。

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

您可以在那里挖掘并找到实际的字符串,并将它们更改为真正适合您的字符串。而且,如果您愿意对正则表达式感到厌烦,例如,您可以使其同时匹配if false thens 和if true thens 以及真正if <something> then的 s,以及各种有趣的东西。

如果您想对它的工作原理进行不那么粗略(阅读:不存在)的解释,请随意说。我在这里假设您至少和我一样了解 :g 。

于 2013-07-08T22:07:17.447 回答