【问题标题】:Vim: search word under cursor (not * or # pls)Vim:在光标下搜索单词(不是 * 或 # pls)
【发布时间】:2019-12-17 01:13:29
【问题描述】:

我想复制 Sublime Text 的“CTRL-D”行为,它突出显示光标下的当前单词。

*# 在这里不起作用,因为它们会自动移动光标(如 n 和 N),这是我明确不想要的。

为了高亮光标下的当前单词,我发现以下是有效的:

yiw
:let @/=@@
:set hls

如果您手动输入,它会按预期正常工作。

我的问题是我只是不明白我做错了什么将它放在键盘映射上以便我可以绑定它。

到目前为止我尝试过的是:

  1. 创建一个函数,然后将其映射到一个键:
function SearchWordUnderCursor()
    silent! yiw
    silent! :let @/ = @@
    silent! :set hls
endfunction
  1. 使用内联键绑定,如下所示:
nmap <C-D> yiw | :let @/ = @@ | :set hls

这两种方法按预期工作,我不知道我做错了什么。

搜索模式/寄存器设置得很好,但立即突出显示不起作用,您必须手动 n 或 N 一次才能显示突出显示,但这会移动光标,而不是“手动”方法.

为什么像手动输入一样难以完成?

我正在使用 NVIM v0.2.2。

任何帮助表示感谢并提前感谢您。

【问题讨论】:

  • 你考虑过插件吗? Vim Mark 效果很好。

标签: vim neovim


【解决方案1】:

第一个不起作用,因为您必须在 VimScript 中使用 normal! yiw(因为 VimScript 语句是 :commands,而不是普通模式键)。

第二个不起作用,因为这些是键,而不是 Ex-commands,因此您必须在适当的位置输入 :&lt;CR&gt;(并且还要用反斜杠转义所有“条”,因为第一个“bar”将结束“map”命令,否则)。

所以您应该阅读更多关于普通模式与命令行模式的信息。

另外,使用hlsearch 看起来不太好,因为您没有搜索任何内容。 IMO 最好改用:h :match。例如,

nnoremap <C-D> :execute 'match Search /\V' . escape(expand('<cword>'), '\/') . '/'<CR>

使用:match NONE 将其关闭。

【讨论】:

    【解决方案2】:

    一个简单的、非光标移动的解决方案是

    nnoremap <C-D> *N
    

    【讨论】:

      【解决方案3】:
      1. 如果你从代码中删除silent!,vim 会很有帮助地哭泣yiw: not an editor command

      在函数中,每一行都是:(前)命令。您的yiw 等同于:yiw,这不是编辑器命令。 (这也意味着您可以安全地在命令前省略:)。要运行正常模式命令,请明确说 :normal

      function SearchWordUnderCursor()
          silent! normal yiw
          silent! let @/ = @@
          silent! set hls
      endfunction
      
      1. 在映射中,您需要使用&lt;BAR&gt; 而不是| 分隔命令,并传递您按下的所有键,包括Enter

      nmap <C-D> yiw <BAR> :let @/ = @@<CR> <BAR> :set hls<CR>
      

      【讨论】:

        【解决方案4】:

        我尝试解决这个问题:

        " [I shows lines with word under the cursor
        nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
        nnoremap <Leader>* :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
        
        if !exists('*CountWordFunction')
            fun! CountWordFunction()
                try
                    let l:win_view = winsaveview()
                    exec "%s/" . expand("<cword>") . "//gn"
                finally
                    call winrestview(l:win_view)
                endtry
            endfun
        endif
        

        您可以使用这些选项

        1 - double mouse clik
        2 - <leader>*
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-13
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          • 2015-08-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-17
          相关资源
          最近更新 更多