我正在尝试为<C-]>设置映射,该映射根据缓冲区的文件类型触发不同的功能。例如,如果我在Javascript缓冲区中,则希望<C-]>触发:TernDef。如果我在C缓冲区中,则希望它触发:YcmCompleter GoTo。我尝试过autocmd FileType c nnoremap <C-]> :YcmCompleter GoTo<CR>,但似乎只是忽略了这一点。

评论

vi.stackexchange.com/questions/7722/how-to-debug-a-mapping

首先,您要尝试使映射在不使用autocmd的情况下工作,只是为了确保它可以工作(如果不起作用,@ muru给您一个指向我的问题的链接,该链接应该对您有所帮助)。我还认为您想在映射中使用:在当前命令中,当您打开c文件时,将被重新映射为所有缓冲区(无论是否为C)。使用时,您的映射将仅存在于C缓冲区中,请参见:h:map-

#1 楼

那个autocmd看起来不错;但是,您应该定义本地缓冲区映射(使用<buffer>);否则,编辑一种类型的文件将覆盖另一种文件的(全局)映射:

autocmd FileType c          nnoremap <buffer> <C-]> :YcmCompleter GoTo<CR>
autocmd FileType javascript nnoremap <buffer> <C-]> :TernDef<CR>


对autocmd方法的批评

您可以定义通过在:autocmd Filetype {filetype} ...前面添加某些文件类型的映射,并将其放入您的~/.vimrc中。但是,当您为各种文件类型添加映射和其他设置时,这变得很麻烦。最好将:map命令放入~/.vim/ftplugin/{filetype}_mappings.vim中。 (这要求您具有:filetype plugin on。)

评论


一个很好的功能,任何教程都未涉及。

–mtk
20/04/27在7:48

#2 楼

对我而言,该行确实有效(使用Vim可以识别的命令,并在命令开头包含一个冒号)。您可以尝试在没有插件的情况下启动Vim,然后查看该行是否被正确识别。

另一种选择是将要运行的命令放在ftplugin目录的c.vim文件中。这样,当您打开该类型的文件时,它们将运行。可以在:help ftplugin<cr>中找到更多信息。