【问题标题】:Remove surrounding lines in vim在vim中删除周围的行
【发布时间】:2013-07-08 20:55:07
【问题描述】:

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

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

【问题讨论】:

  • if-end 块?它也可以有“else, elif/else if...end”吗?嵌套的if/else/end 呢? “这是一些文本”总是正确缩进吗?它可以有类似 //if true we don't do this 的 cmets 吗?或者您只是想对上述问题中的示例进行“删除周围的线条”?
  • 进行这项工作对我来说已经很简单了。是的,下一步将是处理更复杂的结构(尽管我所描述的理想情况下会自动处理“嵌套”行——因为它只会删除光标周围的第一组)。

标签: vim surround


【解决方案1】:

尝试以下脏功能并检查是否可以帮助解决您的问题。从光标位置向前和向后查找这些字符串。仅当两者都匹配时才删除它们:

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>

【讨论】:

  • 非常感谢您花时间发布此消息! - 效果很好。
  • 这...可能好多了。很好的答案。
【解决方案2】:

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

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

您可以在那里挖掘并找到实际的字符串,然后将它们更改为真正适合您的字符串。而且,如果您愿意使用正则表达式,例如,您可以使其匹配if false thens 和if true thens 以​​及真正的if &lt;something&gt; thens,以及各种有趣的东西。

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

【讨论】:

  • 感谢发帖。在我的情况下,只有当光标位于它们之间的文本中时,这些行才会被删除(这似乎是上面 Birei 的解决方案)。
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2012-01-23
  • 2014-04-12
  • 2010-10-16
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多