VIM:如何根据缓冲区类型映射命令?

13

我知道我的标题不是很描述清楚,所以让我解释一下。

昨天我接触到了Vimgrep和copen,所以我在.vimrc中添加了以下行:

nnoremap <silent> ,/ :execute 'vimgrep /'.@/.'/g %'<CR>:copen<CR>

它打开了Vim中搜索(高亮)单词的quickfix列表。

现在,当你在快速修复列表中按下Enter<CR>,它会带你到主Vim窗口中对应的行。

现在,我遇到的问题是我已经将<CR>键映射成map <CR> o<Esc>,这会在当前行下面创建一行新的空行。

因此,你可以看到两者之间存在冲突。所以,我正在尝试编写一个像这样的Vim函数:

伪代码

function IfNotInsideQuickFix()
    if buffer != QuickFix
        then map <CR> o<Esc>
    elif buffer == QuickFix
         Normal behaviour

Call function

这是:buffers的输出结果:

:buffers
  1 #a   "test.cs"                      line 0
  2 %a-  "[Quickfix List]"              line 1
Press ENTER or type command to continue

我没有编写 vim 函数的经验。所以,可以有人指导一下我吗?

附注:我知道我可以更改 Vim 映射来创建新行,但我想学习如何通过 Vim 函数实现。


你尝试过使用 autocmd,然后在其中映射你的快捷键吗? - tuxtimo
@tuxtimo:我不知道怎么做。如果你能给我一个起点,那我就可以开始工作了。我看了一下:h autocmd,但是无法弄清楚如何在我的情况下使用它。 - RanRag
你能否通过文件类型检测出它是否为QuickFix文件? - tuxtimo
1个回答

25

你可以保留全局的<CR>映射,但在快速修复窗口中本地恢复原始行为。这可以通过一个:autocmd(当快速修复窗口打开时触发)来完成,该命令将<CR>(在本地通过<buffer>)映射到它自身而不进行重新映射。

:autocmd BufReadPost quickfix nnoremap <buffer> <CR> <CR>

谢谢,它起作用了。您能否解释/详细说明您的解决方案,以便我可以学习它? - RanRag
2
我以为我已经解释清楚了一切;我已经更加详细和明确地表达了。你可以通过 :help <topic> 阅读所有内容;Vim 的帮助非常好。保持冷静;学习曲线最初是陡峭的 :-) - Ingo Karkat
2
我试图将autocmd添加到我的vimrc中,但它找不到quickfix缓冲区。autocmd BufReadPost quickfix nnoremap <buffer> <CR> <CR> 我应该使用BufReadPost *fix*吗? - Sten Kin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接