如何在Vim中制作“智能”键映射?

时间:2014-08-05 13:53:15

标签: vim dry

目前我的Vimrc中有以下映射:

" Quick Buffer switch mappings {{{
" The idea is to press <leader> and then the number from normal mode to switch
" e.g. `,2` would switch to the second buffer (listed at the top of the
" airline strip
nnoremap <Leader>1 :1b<CR>
nnoremap <Leader>2 :2b<CR>
nnoremap <Leader>3 :3b<CR>
nnoremap <Leader>4 :4b<CR>
nnoremap <Leader>5 :5b<CR>
nnoremap <Leader>6 :6b<CR>
nnoremap <Leader>7 :7b<CR>
nnoremap <Leader>8 :8b<CR>
nnoremap <Leader>9 :9b<CR>
nnoremap <Leader>10 :10b<CR>
nnoremap <Leader>11 :11b<CR>
nnoremap <Leader>12 :12b<CR>
nnoremap <Leader>13 :13b<CR>
nnoremap <Leader>14 :14b<CR>
nnoremap <Leader>15 :15b<CR>
nnoremap <Leader>16 :16b<CR>

" Quick Buffer wipe/delete keys. Press <Leader> and then d and buffer number
" e.g. `,d2` would wipe buffer 2

nnoremap <Leader>d1 :Bdelete 1<CR>
nnoremap <Leader>d2 :Bdelete 2<CR>
nnoremap <Leader>d3 :Bdelete 3<CR>
nnoremap <Leader>d4 :Bdelete 4<CR>
nnoremap <Leader>d5 :Bdelete 5<CR>
nnoremap <Leader>d6 :Bdelete 6<CR>
nnoremap <Leader>d7 :Bdelete 7<CR>
nnoremap <Leader>d8 :Bdelete 8<CR>
nnoremap <Leader>d9 :Bdelete 9<CR>
nnoremap <Leader>d10 :Bdelete 10<CR>
nnoremap <Leader>d11 :Bdelete 11<CR>
nnoremap <Leader>d12 :Bdelete 12<CR>
nnoremap <Leader>d13 :Bdelete 13<CR>
nnoremap <Leader>d14 :Bdelete 14<CR>
nnoremap <Leader>d15 :Bdelete 15<CR>
nnoremap <Leader>d16 :Bdelete 16<CR>
" }}}

他们工作得很好,但我无法帮助他们认为这应该更加智能/干扰vimrc。如果我打开一个数字为17的缓冲区怎么样呢。

有没有一种智能映射这些的方法,以便用户可以输入然后输入任何缓冲区号来打开缓冲区?

3 个答案:

答案 0 :(得分:4)

您可以使用:execute元编程来自动创建这些映射:

for i in range(1, 99)
    execute printf('nnoremap <Leader>%d :%db<CR>', i, i)
endfor

还可以定义单个映射(仅带前缀),然后通过getchar()查询数字。这里的挑战是确定何时结束这个,你得到的东西是免费的(由于'timeout')与单独的映射。这就是为什么我更喜欢这里的第一个解决方案。

答案 1 :(得分:2)

<c-6>切换到上一个缓冲区。但是,您也可以提供用于切换到该缓冲区的计数。例如。 6<c-6>相当于:b 6

我仍然无法帮助,但认为这些缓冲区命令有点尴尬,因为必须保持缓冲区数字和文件直接在脑中。我认为使用一些:b原生功能对您有所帮助:

  • :b命令可以采用部分文件名。例如:b foo
  • :b可以使用globs,因此您可以添加一些模糊性。例如:b foo*bar.c
  • <tab>完成文件名
  • <c-d>列出了缓冲区名称
  • 使用:sb命令拆分,该命令采用与:b
  • 相同的参数

我发现:bdelete对你来说有点危险。我建议你只需切换到缓冲区,然后执行:bd删除当前缓冲区。但是,:bd可以使用部分文件名和全局,就像:b一样。

我还看到了~/.vimrc个文件,其中人们使用映射来调用:ls,然后使用:b启动提示。想想更多基于菜单的方法。

nnoremap <leader>b :ls<cr>:b<space>

如需更多帮助,请参阅:

:h ctrl-6
:h :b
:h :sb
:h :bd
:h :ls

答案 2 :(得分:0)

这是一种略有不同的策略,只使用一个映射:

:nnoremap <silent> <key> :<C-u>try \| execute "b" . v:count \| catch \| endtry<CR>

现在,您可以3<key>转到第3号缓冲区。我会留给您找到正确的<key>