Vim:在光标下搜索单词(不是*或#pls)

时间:2019-12-14 12:45:52

标签: vim neovim

我想复制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。

我们将不胜感激,谢谢您。

4 个答案:

答案 0 :(得分:2)

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

第二个键不起作用,因为它们是键,而不是Ex-command,因此您必须在适当的地方放入:<CR>(并且使用反斜杠,因为第一个“栏”将以“ map”命令结尾,否则)。

因此,您应该阅读有关普通模式和命令行模式的更多信息。

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

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

使用:match NONE将其关闭。

答案 1 :(得分:1)

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

nnoremap <C-D> *N

答案 2 :(得分:0)

  1. 如果您从代码中删除silent!,vim会哭yiw: not an editor command

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

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

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

答案 3 :(得分:0)

我为解决此问题所做的尝试:

" [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>*