2011-05-08 22 views
10

Vim'de, ekranın üstündeki sekmelerin sırasını oluşturan metin (sekmeler kullanılırken), tabline seçeneği ile yapılandırılır.Vim varsayılan 'tabline' işlevinin uygulanması nedir?

Sekme dizini ile sekmedeki pencere sayısını değiştirmek gibi, varsayılan sekme sayfa satırında birkaç küçük ayar yapmak istiyorum. Ne yazık ki, bunun varsayılan sürümü (tabline unset olduğu zaman etkindir) karmaşıktır ve belgesizdir. Benim yapmam gereken bir şey yok.

Gereksinimlerime göre ayarlayabildiğim varsayılan uygulamayı sağlayan bir Vim senaryosu var mı?

cevap

7

Sekme numarası ve görünüm numarası sıfırlamak için özel bir işlev kullanıyorum, here (bkz. Tonymec'in yorumu). Sekmeleri nasıl görüntülediğinizi değiştirmek için onunla oynayabilirsiniz.

Benim .vimrc adresinde sahip olduğum şeyler. Bu sadece sekme # ve viewport # görüntülenen değiştirir biraz değiştirilmiş bir sürümüdür.

"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 

Ve burada

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. Sihirbaz: teşekkürler! – abcd

+0

Anlayamadığım tek şey: kirli bir arabellek varsa nasıl bir "+" ekleyebilirim? Fonksiyonu bulmak için neyi arayacağımı bile bilmiyorum ... :) – Peeja

+0

@Peeja: Yukarıdaki işlevi değiştirdim ('endwhile'nın üstündeki ikinci satıra bakın). Kaydedilmemiş bir tamponda dosya adının yanında _if geçerli buffer_. Yani, bir arabelleğe ve kirlenmesine her bastığınızda, '[+]' işareti görüntülenecektir. – abcd

2

yoda en çözümü doğru biridir benim fonksiyonu tanımlanır renklerdir. Soruyu özellikle cevaplamak için tabline için varsayılan değer yoktur. Ayarlanmadıysa, Vim görüntülenen çizgiyi kendisi oluşturur. Uygulama, Vim 7.3 kaynağında draw_tabline() numaralı telefondan src/screen.c sayılı belgedir. Burada aynı motorla çalıştırılan gizli bir varsayılan değer bulmayı umuyorum, ama bu saf bir C uygulaması. Neden sadece bir tabline değeri oluşturmadıklarını ve onu ayrıştırmak için motoru kullanmadıklarını merak ediyorum, ama Vim, CPU döngülerinin sayıldığı güne geri yazıldı ve bu kesinlikle biraz daha hızlı.

2

Bu, sorduğunuz yanıt değil, kendi tablomuzu sizinle paylaşacağım.

the wikia page numaralı telefondan yardım aldı mı, benim sürümüm.

Buradaki ilk sekmenin içinde üç tane açık pencere vardır, iki adet açık dosya düzenlenmiştir. (8-alan sekmeleri üzgün)

enter image description here

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

Not: (muhtemelen, çoğu vimscript impl'sının tabline için de geçerlidir) Doldurduğunuzda sekmeleri kısaltmaya/kısaltmaya yardımcı olmaz Bar Bu, beni çoğu zaman 5 sekme ile sınırlandırır (bu, şeyler yayılırken benim için ideal değildir), dolayısıyla bu ve varsayılan tablo uygulaması arasında geçiş yapmak için bir kontrol yaptım. –

İlgili konular