目前我的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的缓冲区怎么样呢。
有没有一种智能映射这些的方法,以便用户可以输入然后输入任何缓冲区号来打开缓冲区?
答案 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>
。