【发布时间】:2011-08-31 23:50:58
【问题描述】:
我正在玩一个小的 Vim 函数,它会突出显示空白。
但是execute 命令的行为与直接调用时不同。
所以函数看起来像这样:
function! ShowWhitespace()
execute "/\\s\\+$"
endfunction
它被映射为:
command! SW call ShowWhitespace()
当:SW 被执行时,它只是简单地搜索并将光标移到存在空格的位置。
然而,当我在命令行中执行此操作时:
:exe "/\\s\\+$"
它正确地突出了空白。我还确保highlightsearch 始终处于打开状态,因此这不是打开或关闭它的问题。
作为旁注,我需要在函数中包含它,因为我想要其他尚未添加到其中的东西以实现灵活性(例如切换)。
为什么这在函数中的行为与直接执行不同?我在 Vim 中编写了很多函数,并且从未见过这样的工作有什么不同。
编辑和解决方案:
所以看来 Vim 不喜欢用函数改变搜索。一旦函数退出,搜索模式就会被清除(正如:help function-search-undo 所指出的那样。
这可能看起来很难看,但我一开始就想做:
command! -bang Ws let orig_line = line('.') | exe ((<bang>0)?":set hls!":":set hls") | exe '/\s\+$' | exe orig_line
一点一点解释:
- 将(bang-accepting)
Ws命令映射到以下操作: - 保存光标所在的原始行
- 取决于 bang 或 no bang(例如
:Ws!或:Ws)它设置highlightsearch - 执行搜索以查找空格
- 如果改变了就回到原来的行
【问题讨论】: