在vimrc中将 映射为Vim命令

编程语言 2026-07-12

这是我的 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的帮助文档中看到 与termcap有关,不过具体含义不太清楚。

一些说明——我在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')

相关链接:

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章