【问题标题】:Highlight entire line when there are matches匹配时突出显示整行
【发布时间】:2012-11-03 05:43:30
【问题描述】:

有谁知道在搜索后如果有匹配项或匹配项,如何突出显示整行。

p.e.我搜索 /user

现在,如果有匹配项,我想突出显示整行。

编辑
我想在搜索突出显示中使用突出显示。
我不想使用突出显示组。

【问题讨论】:

    标签: vim line match highlight


    【解决方案1】:

    我不知道你是否可以接受:

    首先您需要定义一个突出显示group:例如userline

    :highlight userline ctermbg=darkred guibg=darkred
    

    那么你可以:

    :match userline /.*user.*/
    

    所有包含“用户”的行都会被突出显示。

    【讨论】:

    • 感谢您回复肯特。不,这不是我想要的。我想像搜索突出显示一样突出显示该行。原因是我有很多脚本可以对搜索匹配进行操作。我正在尝试将它们应用于整个生产线。希望我说清楚了。 (我会将此添加到我的问题中)
    【解决方案2】:

    突出显示行的替代方法可能是使用quickfix 列表。例如,执行以下操作会将与模式 /user/ 匹配的所有行放入当前文件 (%) 的快速修复列表中。

    :vimgrep /user/ %
    

    您可以通过执行:copen 在单独的窗口中显示quickfix 列表的内容。您可以通过:cnext:cprev 和朋友在匹配行之间移动。我个人推荐 Tim Pope 出色的 unimpaired.vim 插件,以提供一些相当不错和自然的感觉映射,例如 [q]q 以在 quickfix 列表中移动。您还可以添加 g 标志来查找每行的多个匹配项,并将它们也添加到 quickfix 列表中。

    您可能希望映射到此vimgrep 命令以使其更快一些。我个人在我的~/.vimrc中使用以下内容

    nnoremap <leader>/ :vimgrep/<c-r>//g %<cr>:copen<cr>
    

    使用:vimgrep 命令的一个缺点是它需要一个已保存的文件,因此必须先保存未保存的缓冲区。您可以结合使用:global:cgetexpr 来克服这个问题,如下所示。

    :cexpr []
    :g//caddexpr expand("%").":".line(".").":".getline(".")
    

    但是,也许您真的只想突出显示匹配的行,而不是使用 quickfix 列表。我建议像这样使用:match

    :match Search /.*user.*/
    

    您可以使用任何您想要的高亮组。我选择Search,因为它看起来很合适。要关闭突出显示,只需执行:match,不带任何参数。

    我个人更喜欢使用:vimgrepquickfix 列表,但您的需求可能与我的不同。

    如需更多帮助,请参阅:

    :h quickfix
    :h :vimgrep
    :h :cnext
    :h :cexpr
    :h :caddexpr
    :h :match
    

    【讨论】:

    • Tnx 获取 vimgrep 信息。我使用它,但这不是我想要的。我只想用匹配突出显示线条。 ...我曾经尝试过/.*search-item.*,但它在所有情况下都不起作用 p.e.它不适用于很多正则表达式搜索。
    【解决方案3】:

    如果你使用

    :let @/ = '.*\%(' . @/ . '\m\).*'
    

    这应该适用于大多数正则表达式模式(例如,括号处理 \| 分支)。你可以改进它以识别^$,以及像\V 这样的魔法修饰符。

    【讨论】:

    • 谢谢 Ingo,这似乎可行。细化以识别 ^ 和 $ 是什么意思?是的,我在正则表达式中也使用了很多 \V 和 \%V。您认为您的解决方案不适用于这些吗?
    • ^ 和 $ 仅在它们出现在开头/结尾(可能在分组括号内)时才特殊,因此 .*\(^... 将匹配文字 ^,不再匹配行首。您必须检查@/ 并调整连接。
    • \V 改变了尾随.* 的含义;那么它需要是\.\*。我在答案中添加了一个中和的\m
    • 谢谢。如果进行搜索然后选择一个文本块并只想突出显示该文本块中匹配的整行,您的代码是什么?我尝试将\%V( 放在您的代码之前,将\) 放在您的代码之后,但它不起作用。
    • 呃,这是一个不同的问题。你必须split(text, "\n"),像我的回答一样修改每个部分,然后重新join(text, "\n")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2016-11-30
    • 2020-05-28
    • 1970-01-01
    • 2023-01-08
    相关资源
    最近更新 更多