Vim key mapping mismatch

I have code in ruby ​​and python using vim, and mine vimrchas a parameter to easily enter breakpoints:

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>

However, sometimes I get the wrong command, for example. ipdbin the ruby ​​file, and I have to restart vim. What could be the problem?

+4
source share
1 answer

The problem is that you define your mappings globally.

The solution is simple: add an argument <buffer>to your mappings to make them "buffer-local".

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>

See :help <buffer>.

also:

  • You should use :nmapor :nnoremapinstead :map. Prefer :nnoremap.
  • autocommand reset, 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
    
+5

Source: https://habr.com/ru/post/1624263/


All Articles