Vim - 如何在使用“/”搜索时启用智能大小写,但在使用“*”搜索时禁用忽略大小写?

4

我喜欢smartcase和*和#搜索命令。但是,我希望*和#搜索命令区分大小写,而/和?搜索命令则遵循smartcase启发式规则。

是否有一些隐藏的设置我还没有找到?我不想重新映射*和#命令。

总之:我希望在/ 和 ?搜索命令中使用smartcase行为,而在*和#搜索命令中使用noic行为。

谢谢, Keith

3个回答

4
不完全是你要找的,但如果你不使用 smartcase,并且只在想忽略大小写时在你的 / 搜索前加上 \c,它几乎是相同的东西。请参见这里的大小写敏感性部分

编辑:根据我看到的所有文档,你所要求的是期望的行为,然而通过测试,看起来 Vim 也将 smartcase 应用于 *#

谢谢 Ryan。我在 Linux 下测试了7.4和8.0,* 和 # 将忽略文档中记录的 smartcase 设置。如果我启用了 smartcase,我的光标位于 "Thread",并且我键入 '*',则仅当设置了 'ic' 时,'thread' 的出现次数才会被突出显示。感谢您提供“大小写敏感性”文档的参考。其中一部分说:“在编程时,通常不希望在按 * 键时应用 'smartcase'。”这个理由是正确的,但实现还不完全符合我的要求。即使我启用了 "ic" 和 "smartcase",我仍希望 * 和 # 使用 "noic"。 - Keith Hanlan
很高兴能帮忙,我理解你想要什么,文档上说应该可以这样工作,但实际上似乎不行。如果你有8.0版本,请尝试Christian建议的:au CmdlineEnter /,\? :set noignorecase:au CmdlineLeave /,\? :set ignorecase.vimrc中,并查看是否有效。目前我手头没有8.0版本可用。 - RyanArr

3
总结一下:我希望在使用 / 和 ? 命令时实现smartcase行为,但在使用 * 和 # 命令时实现noic行为。
这有点棘手,因为您没有明确指定哪些选项的 "smartcase" 和 "ignorecase" 应该应用于哪些命令。但是请注意,默认情况下,*# 命令默认忽略 'smartcase' 选项。
因此,也许设置 :set smartcase noignorecase 已经足够了?否则,您可以更具体地使用 CmdlineEnterCmdlineLeave 自动命令来针对 ?/ 搜索命令进行操作。
:au CmdlineEnter /,\? :set noignorecase
:au CmdlineLeave /,\? :set ignorecase

(类似这样,根据需要进行调整)。 注意,这需要CmdlineEnterCmdlineLeave自动命令,这些命令仅在较新的8.0版本中可用。


谢谢你,Christian。这似乎是我正在寻找的内容,而且非常简洁明了。 - Keith Hanlan

3

您可以通过CmdLineEnter自动命令事件,更改*/#和任何ex命令以及通过/搜索的'ignorecase''smartcase'的值,并将它们重新启用。

nnoremap <expr> * <SID>star_power('*')
nnoremap <expr> # <SID>star_power('#')
function! s:star_power(cmd)
    let [&ignorecase, &smartcase] = [0, 0]
  return a:cmd
endfunction

augroup StarPower
    autocmd!
    autocmd CmdLineEnter * let [&ignorecase, &smartcase] = [1, 1]
augroup END

如果您执行 * 命令,然后执行任何 ex 命令,'ignorecase''smartcase' 的值会发生改变。这可能不是您想要的。您可能希望使用 getcmdtype() 来将其限制为仅适用于 /? 模式,或者使用 CmdLineLeave 和/或计时器来实现更复杂的操作。

注意:这需要 Vim 8.0.1206+ 来支持 CmdLineEnter

欲了解更多帮助,请参见:

:h :map-expression
:h :let-&
:h :let-unpack
:h autocommand
:h :augroup
:h :autocmd
:h CmdLineEnter

谢谢你 Peter,这个方法可行,但出于简洁起见我会选择 Christian 的方法。如果我发现 Christian 的方法有不足之处,我可能会回到这个方法上来。CmdLineEnter/Leave 是一个很聪明的工具。 - Keith Hanlan
@KeithHanlan,我也喜欢Christian的解决方案!由于你在做搜索类似的事情,你可能会对traces.vim或NeoVim的'inccommand'感兴趣。 - Peter Rincker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接