Vim: 搜索光标下的词(不是 * 或 # 请)

Vim: search word under cursor (not * or # pls)

我想复制 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 一次才能显示突出显示,但移动光标,而不是 "manual"方法。

为什么像手动打字一样难搞定?

我正在使用 NVIM v0.2.2。

感谢任何帮助并提前致谢。

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

第二个不起作用,因为这些是键,不是 Ex-commands,所以你必须在适当的地方输入 :<CR>(还要转义所有 "bars" 带反斜杠,因为第一个 "bar" 将结束 "map"-command 否则)。

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

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

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

使用 :match NONE 将其关闭。

  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> 而不是 | 分隔命令,并传递 所有 您按下的键,包括 Enter :

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

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

nnoremap <C-D> *N

我解决这个问题的尝试:

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