上古神器Vim首页投稿(暂停使用,暂停投稿)

【Vim】流畅切换buffer或者tab

2017-03-05  本文已影响424人  饶曉文

文中所谈及代码在这里t-vim

最终目的:

  1. 在只有一个tab的情况下,按<Leader>➕数字,切换buffer,而且不需要关心真正的buffer number是多少(真正的Buffer number通常不是从1开始的,而且Buffer删除之后不会重新排序),所见即所得。
  2. 在多个tab的情况下,按<Leader>➕数字,切换tab。

分两种情况:

  1. 使用vim-airline
  2. 使用vim-bufferline

第一种情况:使用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

上面函数首先做了这些判断:

  1. 是否使用vim-airline,那么使用airline统一接口切换tab或者bufer
  2. 是否存在多于一个tab,那么切换tab
  3. 切换buffer
上一篇下一篇

猜你喜欢

热点阅读