【问题标题】:Vim execute in function behaving differentlyVim 在函数中执行的行为不同
【发布时间】: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
  • 执行搜索以查找空格
  • 如果改变了就回到原来的行

【问题讨论】:

    标签: function vim highlight


    【解决方案1】:

    如果您不想移动光标(永远不要这样做),只需将 @/ 设置为正确的搜索模式,即:

    let @/ = '\s\+$'
    

    注意:函数应该已经移动了光标。

    【讨论】:

    • 这不是关于光标,而是关于行为。为什么不一样?我怎样才能达到我想要的结果? (突出显示函数中的空格)
    • 通过直接设置highlightsearch使用的变量->@/。关于你的不当行为的解释,见:h function-search-undo
    • 试过了,还是没有突出显示。
    • 这很奇怪,这与我在 Windows 上的 gvim7.3-3 完美配合——假设 &amp;hlsearch 已设置。顺便说一句,你真的不需要使用 / ;设置@/ 绰绰有余,而且最好的方法是它根本不移动光标。
    • 你是在函数内部执行的吗?还是全球?函数内部(根据我的问题)对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2021-09-26
    • 2016-03-08
    • 2019-01-17
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多