【Vim】流畅切换buffer或者tab

作者: 饶曉文 | 来源:发表于2017-03-05 12:01 被阅读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

    相关文章

      网友评论

        本文标题:【Vim】流畅切换buffer或者tab

        本文链接:https://www.haomeiwen.com/subject/tcvsgttx.html