2011-05-08 71 views
10

在Vim中,使用tabline選項配置在屏幕頂部形成一行製表符的文本(使用製表符時)。Vim默認的'tabline'函數的實現是什麼?

我想對默認的標籤頁行做一些小的調整,比如用選項卡的索引替換標籤中的窗口數量。不幸的是,這個默認版本(在tabline未設置時處於活動狀態)很複雜且沒有記錄。我沒有什麼可以調整的。

是否有一塊Vim腳本提供默認實現,我可以根據需要進行調整?

回答

7

我使用自定義功能重置標籤號碼和視口號碼,從here(請參閱Tonymec的評論)。您可以使用它來更改顯示標籤的方式。

這就是我在我的.vimrc。它只是一個稍微修改過的版本,它改變了tab#和viewport#的顯示方式。

"Rename tabs to show tab# and # of viewports 
if exists("+showtabline") 
    function! MyTabLine() 
     let s = '' 
     let wn = '' 
     let t = tabpagenr() 
     let i = 1 
     while i <= tabpagenr('$') 
      let buflist = tabpagebuflist(i) 
      let winnr = tabpagewinnr(i) 
      let s .= '%' . i . 'T' 
      let s .= (i == t ? '%1*' : '%2*') 
      let s .= ' ' 
      let wn = tabpagewinnr(i,'$') 

      let s .= (i== t ? '%#TabNumSel#' : '%#TabNum#') 
      let s .= i 
      if tabpagewinnr(i,'$') > 1 
       let s .= '.' 
       let s .= (i== t ? '%#TabWinNumSel#' : '%#TabWinNum#') 
       let s .= (tabpagewinnr(i,'$') > 1 ? wn : '') 
      end 

      let s .= ' %*' 
      let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#') 
      let bufnr = buflist[winnr - 1] 
      let file = bufname(bufnr) 
      let buftype = getbufvar(bufnr, 'buftype') 
      if buftype == 'nofile' 
       if file =~ '\/.' 
        let file = substitute(file, '.*\/\ze.', '', '') 
       endif 
      else 
       let file = fnamemodify(file, ':p:t') 
      endif 
      if file == '' 
       let file = '[No Name]' 
      endif 
      let s .= file 
      let s .= (i == t ? '%m' : '') 
      let i = i + 1 
     endwhile 
     let s .= '%T%#TabLineFill#%=' 
     return s 
    endfunction 
    set stal=2 
    set tabline=%!MyTabLine() 
endif 

在這裏,在我的函數中定義的

set tabpagemax=15 
hi TabLineSel term=bold cterm=bold ctermfg=16 ctermbg=229 
hi TabWinNumSel term=bold cterm=bold ctermfg=90 ctermbg=229 
hi TabNumSel term=bold cterm=bold ctermfg=16 ctermbg=229 

hi TabLine term=underline ctermfg=16 ctermbg=145 
hi TabWinNum term=bold cterm=bold ctermfg=90 ctermbg=145 
hi TabNum term=bold cterm=bold ctermfg=16 ctermbg=145 
+0

@Mr。嚮導:謝謝! – abcd 2011-05-08 15:14:09

+0

我弄不清楚的唯一問題:如果存在髒緩衝區,如何添加「+」?我甚至不知道在搜索幫助中找到函數...... :) – Peeja 2011-05-13 19:21:25

+0

@Peeja:我已經修改了上面的函數(參見'endwhile'上面的第二行),它會顯示一個'[+]'在未保存的緩衝區中的文件名旁邊_if它是當前的buffer_。所以,當你切換到一個緩衝區並且它變髒時,它會顯示'[+]'符號。 – abcd 2011-05-13 19:49:21

2

Yoda的解決方案是正確的顏色。要具體回答這個問題,tabline沒有默認值。如果沒有設置,Vim將自行構建顯示的行。在Vim 7.3源代碼中,實現位於src/screen.c,地址爲draw_tabline()。我希望在這裏找到一個隱藏的默認值,它是通過同一個引擎運行的,但是這是一個純粹的C實現。讓我想知道爲什麼他們不只是構造一個tabline值並使用引擎來解析它,而是在CPU週期計算的那一天寫回了Vim,而且這肯定會稍微快一點。

2

這不是你要求的答案,但我會與你分享我自己的標準。

the wikia page的幫助下完成了,這裏是我的版本。

這是第一個選項卡中有三個窗口打開的位置,其中兩個在一個編輯文件上打開。

enter image description here

(約8個空格的突片對不起)

set showtabline=1 " 1 to show tabline only when more than one tab is present 
set tabline=%!MyTabLine() " custom tab pages line 
function MyTabLine() 
     let s = '' " complete tabline goes here 
     " loop through each tab page 
     for t in range(tabpagenr('$')) 
       " set highlight 
       if t + 1 == tabpagenr() 
         let s .= '%#TabLineSel#' 
       else 
         let s .= '%#TabLine#' 
       endif 
       " set the tab page number (for mouse clicks) 
       let s .= '%' . (t + 1) . 'T' 
       let s .= ' ' 
       " set page number string 
       let s .= t + 1 . ' ' 
       " get buffer names and statuses 
       let n = ''  "temp string for buffer names while we loop and check buftype 
       let m = 0  " &modified counter 
       let bc = len(tabpagebuflist(t + 1))  "counter to avoid last ' ' 
       " loop through each buffer in a tab 
       for b in tabpagebuflist(t + 1) 
         " buffer types: quickfix gets a [Q], help gets [H]{base fname} 
         " others get 1dir/2dir/3dir/fname shortened to 1/2/3/fname 
         if getbufvar(b, "&buftype") == 'help' 
           let n .= '[H]' . fnamemodify(bufname(b), ':t:s/.txt$//') 
         elseif getbufvar(b, "&buftype") == 'quickfix' 
           let n .= '[Q]' 
         else 
           let n .= pathshorten(bufname(b)) 
         endif 
         " check and ++ tab's &modified count 
         if getbufvar(b, "&modified") 
           let m += 1 
         endif 
         " no final ' ' added...formatting looks better done later 
         if bc > 1 
           let n .= ' ' 
         endif 
         let bc -= 1 
       endfor 
       " add modified label [n+] where n pages in tab are modified 
       if m > 0 
         let s .= '[' . m . '+]' 
       endif 
       " select the highlighting for the buffer names 
       " my default highlighting only underlines the active tab 
       " buffer names. 
       if t + 1 == tabpagenr() 
         let s .= '%#TabLineSel#' 
       else 
         let s .= '%#TabLine#' 
       endif 
       " add buffer names 
       if n == '' 
         let s.= '[New]' 
       else 
         let s .= n 
       endif 
       " switch to no underlining and add final space to buffer list 
       let s .= ' ' 
     endfor 
     " after the last tab fill with TabLineFill and reset tab page nr 
     let s .= '%#TabLineFill#%T' 
     " right-align the label to close the current tab page 
     if tabpagenr('$') > 1 
       let s .= '%=%#TabLineFill#%999Xclose' 
     endif 
     return s 
endfunction 
+0

注意:(可能也適用於tabline的大多數vimscript impl)當您填充時無助於擠壓/縮短標籤酒吧。這在大多數情況下將我限制在5個選項卡上(這對我來說並不理想),所以我做了一個控件來切換這個選項和默認選項卡實現。 – 2013-08-02 14:56:03

相關問題