我有类似以下的文件:
>>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
这是有效的,除非我站在文件中的最后一个"块".
我怎样才能使这个地图(或完全不同的地图做同样的事情)处理文件中的所有"块"?
我想,再一次,我们正在推动正则表达式的界限超越他们所擅长的.他们擅长将一个字符串与另一个字符串交换,这是一个副作用,您可以用它们删除文本.
相反,为什么不利用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")
你可以用一个正则表达式来做到这一点:
nnoremap ,d :1,.s/\v%(%(.*%#&(\>\>Start-pattern))%(\1@!\_.)+)\|%((\>\>Start-pattern)%(\2@!\_.)*%#%(\2@!\_.)+)//
你是否应该是另一个问题......