当前位置:  开发笔记 > 开发工具 > 正文

在vim中删除文本的"块"

如何解决《在vim中删除文本的"块"》经验,为你挑选了2个好方法。

我有类似以下的文件:

>>Start-pattern
some text
some more text
>>Start-pattern
some other text

some more other text
>>Start-pattern
[and so on]

我想要的是一个允许我删除文本当前"块"的映射.其中"块"被定义为从">> Start-pattern"到下一个">> Start-pattern"行之前的所有行.

我所拥有的是以下内容:

nnoremap ,d $:?^>>Start-pattern?,/^>>Start-pattern/-1delete

这是有效的,除非我站在文件中的最后一个"块".

我怎样才能使这个地图(或完全不同的地图做同样的事情)处理文件中的所有"块"?



1> Whaledawg..:

我想,再一次,我们正在推动正则表达式的界限超越他们所擅长的.他们擅长将一个字符串与另一个字符串交换,这是一个副作用,您可以用它们删除文本.

相反,为什么不利用vim提供的迷人脚本语言.它更容易,就像回程机器上的旅行一样.如果将以下函数添加到.vimrc文件中,它将执行您想要的操作并且更具可重用性/灵活性:

fun! DelBlock(thePattern)
  let origLineNumber = line(".")
  let lineNumber = origLineNumber

  let lineString = getline(lineNumber)
  while lineString !~ a:thePattern
    let lineNumber = lineNumber - 1
    if lineNumber < 0
      echo "Function not found :/"
    endif
    let lineString = getline(lineNumber)
  endwhile
  let startLine = lineNumber

  let lastLineInFile = line("$")
  let lineNumber = origLineNumber + 1
  let lineString = getline(lineNumber)
  while lineNumber != lastLineInFile && lineString !~ a:thePattern
    let lineNumber = lineNumber + 1
    let lineString = getline(lineNumber)
  endwhile
  let endLine = lineNumber
  if endLine != lastLineInFile
    let endLine = endLine - 1
  end

  execute startLine.","endLine."d"
endfunction

map ,d :call DelBlock("^>>Start-pattern")


在过去,我确实玩过getline搜索周围的东西,而且它太慢了.更喜欢简单地使用search().首先倒退,然后前进.

2> Brian Carper..:

你可以用一个正则表达式来做到这一点:

nnoremap ,d :1,.s/\v%(%(.*%#&(\>\>Start-pattern))%(\1@!\_.)+)\|%((\>\>Start-pattern)%(\2@!\_.)*%#%(\2@!\_.)+)//

你是否应该是另一个问题......

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有