2011-06-30 13 views
6

Bir yerden çaldığım/değiştirdiğim bir sekme işlevim var, ancak diske yazıldığından beri değiştirilmişse dosya adının yıldız işareti olmasını istiyorum (yani: bir eylem gerçekleştirirse)).Bir arabellek değiştirilmiş olup olmadığını belirlemek için vimrc işlevi nedir?

*file1.txt file2.txt file3.txt 

Benim tabline: Örneğin

bu ben file1.txt değiştirebilir ve kaydedin yok sonra Sonra

file1.txt file2.txt file3.txt 

.txt vim -p dosya * açtığınızda benim tabline olduğunu fonksiyonu:

if exists("+showtabline") 
    function MyTabLine() 
     let s = '' 
     let t = tabpagenr() 
     let i = 1 
     while i <= tabpagenr('$') 
     let buflist = tabpagebuflist(i) 
     let winnr = tabpagewinnr(i) 
     let s .= ' %*' 
     let s .= (i == t ? '%#TabLineSel#' : '%#TabLine#') 
     let file = bufname(buflist[winnr - 1]) 
     let file = fnamemodify(file, ':p:t') 
     if file == '' 
      let file = '[No Name]' 
     endif 
     let s .= file 
     let i = i + 1 
     endwhile 
     let s .= '%T%#TabLineFill#%=' 
     let s .= (tabpagenr('$') > 1 ? '%999XX' : 'X') 
     return s 
    endfunction 
    set stal=2 
    set tabline=%!MyTabLine() 
endif 
+0

olası kopyası [Vim Buffer değiştirildi] (http://stackoverflow.com/questions/5606914/vim-buffer-has-been-modified) –

cevap

13

Sadece aynı şeyi arıyordum ve şu anda açık arabelleğin değiştirilip değiştirilmediğini bildiren %m ve %M'un uygun olmadığını buldum. Yani diğer tamponların değiştirilip değiştirilmediğini göremezsiniz (özellikle sekmeler için bu önemlidir).

Çözüm, getbufvar işlevidir. Kabaca yardımından:

let s .= (getbufvar(buflist[winnr - 1], "&mod")?'*':'').file 

yerine

let s .= file 

ait hile yapmak gerekir. Bu, tüm tamponların bir sekmede açılmasını (çoklu ayırmalarda) göstermek için kullanılabilir.

1

tablinestatusline gibi benzer bayrakları kullanır (bakınız). Yani %m kaydedilmemiş değişiklikler varsa otomatik olarak geçerli sekmede dosya adından sonra varsayılan [+] yerleştirecektir ihtiyaç ve sadece endwhile

olarak
let s .= file 
let s .= (i == t ? '%m' : '') 
let i = i + 1 

önce hatlarını değiştirerek şeydir.

+0

Teşekkürler! Woovarım, 10k'dan fazla itti;) Modifikasyonunuzdaki tek sorun, [+] 'nın sadece odaklanmış sekme değiştirilmişse görünmesidir. Şu anda görüntülemekte olduğunuz sekme değiştirilmediyse, diğer sekmelerden hiçbiri değiştirilmese bile [+] içermez. – Philip

+0

@Philip: Teşekkürler :) Evet, normalde bunu kullanırım ve sadece vimrc'imden kopyalarım. Şartlı ifadenin yerine 's' = '% m' olarak bırakmayı deneyebilir misiniz? Çalışırsa haberim olsun. Şu anda çalışıp çalışmadığını kontrol etmek için zamanım yok, ama belki de daha sonra ... (tabiki işe yaramıyorsa) – abcd

+0

@yoda Sekmeler üzerinde odaklandığınızda tüm sekmelerde [+] değiştirilmiş ve değiştirilmemiş bir sekmeye odaklandığınızda tüm sekmelerin hiçbir şeyi yoktur. – Philip

İlgili konular