Vim:<leader>键序列与正常模式映射混合

izh*_*hak 0 vim

我正在尝试为"cpp"文件类型定义映射:

autocmd! FileType cpp map <leader>c echo "test c"

autocmd! FileType cpp map <leader>r echo "test r"

autocmd! FileType cpp map <leader>t echo "test t"
Run Code Online (Sandbox Code Playgroud)

我的领导钥匙被重新定义:

let mapleader = ","
Run Code Online (Sandbox Code Playgroud)

当我打开*.cpp文件时,只有一个映射按预期工作:","t序列使"echo"发生,但另外两个表现就好像没有定义任何映射:",r"使Vim成为切换到替换模式,",c"使Vim进入插入模式.

我究竟做错了什么?

ZyX*_*ZyX 5

我不知道你的例子(包括,c一个)如何工作:你忘了用冒号前缀回声.但还有另一个错误:根据帮助:

:AU [tocmd]![group] {event} {pat} [nested] {cmd}

删除与{event}和{pat}关联的所有自动命令,并添加命令{cmd}.

所以,最后一个(,t)应该替换以前的所有.

您还应该考虑另外一些事项:

  1. 不要使用map,noremap改为使用:在添加一些映射后,它可能会使您免于执行调试作业.
  2. 如果定义文件类型映射,通常应将其<buffer>作为参数添加到:noremap之前的位置{lhs}:它将使此映射本地到当前缓冲区.
  3. 如果你想重新发送vimrc,你应该将所有命令放入augroup:

    augroup VimrcCpp
        autocmd!
        autocmd FileType cpp nnoremap <buffer> <leader>c :echo "c"<CR>
        autocmd FileType cpp nnoremap <buffer> <leader>r :echo "r"<CR>
        autocmd FileType cpp nnoremap <buffer> <leader>t :echo "t"<CR>
    augroup END
    
    Run Code Online (Sandbox Code Playgroud)
  4. 我会将它从vimrc中删除并添加到〜/ .vim/ftplugin/cpp.vim(after目录仅用于覆盖您不喜欢的选项,如果它们是由插件无条件定义的.如果没有映射冲突,不要使用after).