在vimrc中将 映射为Vim命令
这是我的 vimrc:
set hlsearch
nmap <silent> <Esc> :nohl<CR>
我用 / 进行搜索 => 匹配将被高亮显示
我期望的是:在普通模式下按Esc就会执行 :nohl,这样就不会再高亮匹配。
实际结果是:匹配仍然保持高亮。
我测试了 :echo 123 而不是 :nohl,结果相同,因此问题不在 :nohl。
另外,我发现把完全相同的映射(nmap <silent> <Esc> :nohl<CR>)直接写在vim命令中就能按预期工作。
还有一点:
- 在 vimrc 中进行映射时,
:map会显示n <Esc> :nohl<CR>,但 - 直接在vim中进行映射时,
:map会显示n <t_ýk> * :nohl<CR>
我在Vim的帮助文档中看到
一些说明——我在Hyprland上使用了这样的配置选项 input:kb_options=caps:escape。它把Caps Lock重映射为Escape,因此按Caps Lock时的行为就像按Escape。我尝试禁用这个选项,但没有任何变化。
我也尝试按如下方式映射——nmap <silent> ^[ :nohl<CR>,其中 ^[ 需要通过按Ctrl-V再按Escape来输入。再次没有任何变化(看起来它会映射到 <C-[>,而不是 <Esc>)。
那么,谁能给出关于如何正确映射 <Esc> 的想法?或者有没有其他更方便的方法来禁用搜索匹配的高亮?
还有一个问题——vim有没有“按键映射调试器”?就像vscode中的Troubleshooting keyboard shortcuts那样。
解决方案
似乎是Vim与 kitty之间的集成问题。不清楚到底是哪一端的问题。再者,Vim在 vimrc 中对 <Esc> 进行重映射时也有问题,因为它在启动时就会使用转义码与终端通信。
简而言之,最简单的解决方案是改用除 <Esc> 以外的其他按键。
给勇敢者的离奇技巧:
func! EscMapSetup(timerid)
nnoremap <Esc> :nohlsearch<CR>
endfunc
autocmd VimEnter * call timer_start(100, 'EscMapSetup')
相关链接:
- https://github.com/vim/vim/issues/16401
- https://vi.stackexchange.com/questions/2614/why-does-this-esc-normal-mode-mapping-affect-startup
- https://vi.stackexchange.com/questions/28269/command-already-typed-in-when-i-open-vim
- https://vi.stackexchange.com/questions/19069/why-does-terminal-vim-enter-replace-mode-with-my-vimrc-file/19073#19073
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。