我有类似以下的文件:
>>Start-pattern
some text
some more text
>>Start-pattern
some other text
some more other text
>>Start-pattern
[and so on]
Run Code Online (Sandbox Code Playgroud)
我想要的是一个允许我删除文本当前"块"的映射.其中"块"被定义为从">> Start-pattern"到下一个">> Start-pattern"行之前的所有行.
我所拥有的是以下内容:
nnoremap ,d $:?^>>Start-pattern?,/^>>Start-pattern/-1delete<CR>
Run Code Online (Sandbox Code Playgroud)
这是有效的,除非我站在文件中的最后一个"块".
我怎样才能使这个地图(或完全不同的地图做同样的事情)处理文件中的所有"块"?
我想,再一次,我们正在推动正则表达式的界限超越他们所擅长的.他们擅长将一个字符串与另一个字符串交换,这是一个副作用,您可以用它们删除文本.
相反,为什么不利用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")<CR>
Run Code Online (Sandbox Code Playgroud)
你可以用一个正则表达式来做到这一点:
nnoremap ,d :1,.s/\v%(%(.*%#&(\>\>Start-pattern))%(\1@!\_.)+)\|%((\>\>Start-pattern)%(\2@!\_.)*%#%(\2@!\_.)+)//
你是否应该是另一个问题......