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

Ran*_*Rag 11 windows vim

我知道我的标题不是描述性/清晰的,所以让我解释一下.

昨天我可以穿过,Vimgrep and copen所以我在下面添加了以下内容.vimrc

nnoremap <silent> ,/ :execute 'vimgrep /'.@/.'/g %'<CR>:copen<CR>
Run Code Online (Sandbox Code Playgroud)

它所做的是一个开放quickfix listsearched(highlighted)vim的话.

现在,当您按下Enter<CR>quickfix列表时,它会将您带到主Vim窗口中的相应行.

现在,我遇到的问题是我已经映射了我的<CR喜欢map <CR> o<Esc>,它在当前行的正下方创建了一个新行.

所以,你可以看到两者之间存在冲突.所以,我想要的是想出一个类似的vim函数

伪代码

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

Call function
Run Code Online (Sandbox Code Playgroud)

这是输出 :buffers

:buffers
  1 #a   "test.cs"                      line 0
  2 %a-  "[Quickfix List]"              line 1
Press ENTER or type command to continue
Run Code Online (Sandbox Code Playgroud)

我没有编写vim函数的经验.所以,有人可以指导我.

PS:我知道我可以改变我的Vim映射来创建一个新行,但我想通过Vim函数学习如何做到这一点

Ing*_*kat 22

您可以<CR>按原样保留全局映射,但在quickfix窗口中本地可以恢复原始行为.这是通过:autocmd(在快速修复窗口打开时触发)完成的,它将(无需重新映射)<CR>(本地通过<buffer>)映射到自身.

:autocmd BufReadPost quickfix nnoremap <buffer> <CR> <CR>
Run Code Online (Sandbox Code Playgroud)

  • 我以为我已经解释了一切; 我让它变得更加冗长和明确.你可以通过`:help <topic>`阅读所有内容.Vim的帮助很棒.保持冷静; 最初的学习曲线很陡:-) (2认同)
  • 我正在尝试将autocmd添加到我的vimrc,但它找不到quickfix缓冲区.`autocmd BufReadPost quickfix nnoremap <buffer> <CR> <CR>`我应该使用`BufReadPost*fix*`吗? (2认同)