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

mlnl4t2r  于 2023-03-02  发布在  其他
关注(0)|答案(4)|浏览(153)

我想复制崇高文本的“CTRL-D”行为,突出显示光标下的当前单词。

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

为了突出显示光标下的当前单词,我发现以下方法很有效:

yiw
:let @/=@@
:set hls

如果您手动键入此****,它将按预期正常工作。
我的问题是,我只是不明白我做错了什么,把它放在一个键Map,所以我可以绑定它。
我目前尝试的是:
1.创建一个函数,然后将其Map到一个键:

function SearchWordUnderCursor()
    silent! yiw
    silent! :let @/ = @@
    silent! :set hls
endfunction

1.使用内联键绑定,如下所示:

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

这两种方法都没有按预期工作,我不知道我做错了什么。
搜索模式/寄存器设置得很好,但立即突出显示不起作用,您必须手动n或N一次才能显示突出显示,但这会移动光标,与“手动”方法相反。
为什么要把它做好就像是手工打出来的那么难呢?
我使用的是NVIM v0.2.2。

r8uurelv

r8uurelv1#

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

nnoremap <C-D> *N
ogsagwnx

ogsagwnx2#

第一个方法不起作用,因为您必须在VimScript中使用normal! yiw(因为VimScript语句是:commands,而不是normal-mode键)。
第二个不起作用,因为这些是键,而不是Ex命令,所以必须在适当的地方输入:<CR>(也要用反斜杠转义所有“bar”,因为第一个“bar”将结束“map”命令)。
因此,您应该阅读更多关于正常模式与命令行模式的信息。
另外,使用hlsearch看起来不太好,因为你没有搜索任何东西。IMO最好使用:h :match。例如,

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

使用:match NONE将其关闭。

svmlkihl

svmlkihl3#

1.如果您从代码中删除silent!,vim会调用yiw: not an editor command
在一个函数中,每一行都是:(ex-)命令。你的yiw等价于:yiw,并且这不是一个编辑器命令。(这也意味着你可以安全地在命令前省略:)。要运行一个正常模式的命令,明确地说:normal

function SearchWordUnderCursor()
    silent! normal yiw
    silent! let @/ = @@
    silent! set hls
endfunction

1.在Map中,您需要使用<BAR>(而不是|)分隔命令,并传递所有按键,包括Enter:

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

z9ju0rcb4#

我尝试解决这个问题:

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

您可以使用以下选项

相关问题