文中所谈及代码在这里t-vim。
最终目的:
- 在只有一个tab的情况下,按<Leader>➕数字,切换buffer,而且不需要关心真正的buffer number是多少(真正的Buffer number通常不是从1开始的,而且Buffer删除之后不会重新排序),所见即所得。
- 在多个tab的情况下,按<Leader>➕数字,切换tab。
分两种情况:
第一种情况:使用vim-airline自带功能进行tab和Buffer之间的切换,如下配置
airline 部分关键的配置,主要是设置tabline扩展:
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#tab_nr_type = 1 " tab number
let g:airline#extensions#tabline#show_tab_nr = 1
let g:airline#extensions#tabline#formatter = 'default'
let g:airline#extensions#tabline#buffer_nr_show = 0
let g:airline#extensions#tabline#fnametruncate = 16
let g:airline#extensions#tabline#fnamecollapse = 2
let g:airline#extensions#tabline#buffer_idx_mode = 1
第二种情况,使用vim-bufferline,在cmd窗口显示buffer。
关键配置:
这里设置不显示buffer number,因为对我们来说已经没有意义。
let g:bufferline_show_bufnr = 0
按键映射:
" tab or buf 1
nnoremap <leader>1 :call te#utils#tab_buf_switch(1)<cr>
" tab or buf 2
nnoremap <leader>2 :call te#utils#tab_buf_switch(2)<cr>
" tab or buf 3
nnoremap <leader>3 :call te#utils#tab_buf_switch(3)<cr>
" tab or buf 4
nnoremap <leader>4 :call te#utils#tab_buf_switch(4)<cr>
" tab or buf 5
nnoremap <leader>5 :call te#utils#tab_buf_switch(5)<cr>
" tab or buf 6
nnoremap <leader>6 :call te#utils#tab_buf_switch(6)<cr>
" tab or buf 7
nnoremap <leader>7 :call te#utils#tab_buf_switch(7)<cr>
" tab or buf 8
nnoremap <leader>8 :call te#utils#tab_buf_switch(8)<cr>
" tab or buf 9
nnoremap <leader>9 :call te#utils#tab_buf_switch(9)<cr>
函数:
function! te#utils#tab_buf_switch(num) abort
if exists('g:feat_enable_airline') && g:feat_enable_airline == 1
execute 'normal '."\<Plug>AirlineSelectTab".a:num
else
if exists( '*tabpagenr' ) && tabpagenr('$') != 1
" Tab support && tabs open
execute 'normal '.a:num.'gt'
else
let l:temp=a:num
let l:buf_index=a:num
let l:buf_count=len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
if l:temp > l:buf_count
return
endif
while l:buf_index != 0
while !buflisted(l:temp)
let l:temp += 1
endw
let l:buf_index -= 1
if l:buf_index != 0
let l:temp += 1
endif
endw
execute ':'.l:temp.'b'
endif
endif
endfunction
上面函数首先做了这些判断:
- 是否使用vim-airline,那么使用airline统一接口切换tab或者bufer
- 是否存在多于一个tab,那么切换tab
- 切换buffer