Vim键映射不匹配

时间:2016-01-14 11:37:28

标签: python ruby vim

我使用vim在ruby和python中编码,我的vimrc有一个设置可以轻松输入断点:

au FileType python  map <silent> <leader>b oimport ipdb; ipdb.set_trace()<esc>
au FileType python  map <silent> <leader>B Oimport ipdb; ipdb.set_trace()<esc>
au FileType ruby    map <silent> <leader>b orequire 'pry'; binding.pry<esc>
au FileType ruby    map <silent> <leader>B Orequire 'pry'; binding.pry<esc>

然而,偶尔我会得到错误的命令,例如在ruby文件中ipdb,我必须重新启动vim。可能是什么问题?

1 个答案:

答案 0 :(得分:5)

问题在于您全局定义映射。

解决方案很简单:将<buffer>参数添加到映射中以使它们成为#34;缓冲区本地&#34;。

au FileType python  map <buffer> <silent> <leader>b oimport ipdb; ipdb.set_trace()<esc>
au FileType python  map <buffer> <silent> <leader>B Oimport ipdb; ipdb.set_trace()<esc>
au FileType ruby    map <buffer> <silent> <leader>b orequire 'pry'; binding.pry<esc>
au FileType ruby    map <buffer> <silent> <leader>B Orequire 'pry'; binding.pry<esc>

请参阅:help <buffer>

此外:

  • 您应该使用:nmap:nnoremap代替:map。首选:nnoremap
  • 您应该将这些行包装在自动命令组中并重置它们,以防止在您重新获取vimrc时自动命令堆积起来:

    augroup python
        autocmd!
        autocmd FileType python nnoremap <buffer> <silent> <leader>b oimport ipdb; ipdb.set_trace()<esc>
        autocmd FileType python nnoremap <buffer> <silent> <leader>B Oimport ipdb; ipdb.set_trace()<esc>
    augroup END
    
    augroup ruby
        autocmd!
        autocmd FileType ruby nnoremap <buffer> <silent> <leader>b orequire 'pry'; binding.pry<esc>
        autocmd FileType ruby nnoremap <buffer> <silent> <leader>B Orequire 'pry'; binding.pry<esc>
    augroup END