2011-06-30 59 views
6

我有一個tabline函數,我從某個地方偷走/修改過,但是我希望文件名前面有一個星號,如果它自上次寫入磁盤以來已被修改過(例如:up會執行一個動作)。什麼是vimrc函數來確定緩衝區是否被修改?

例如,這是我的tabline當我打開VIM -p文件* .TXT

file1.txt file2.txt file3.txt 

後來我一改FILE1.TXT,不保存:

*file1.txt file2.txt file3.txt 

我tabline功能:

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

[Vim Buffer has been modified]可能重複(http://stackoverflow.com/questions/5606914/vim-buffer-has-been-modified) –

回答

13

我只是在找同樣的東西,發現%m%M不太合適,因爲它告訴你當前打開的緩衝區是否被修改。所以你不能看到其他緩衝區是否被修改(特別是對於選項卡,這很重要)。

解決方案是功能getbufvar。大致從幫助:的

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

代替

let s .= file 

應該做的伎倆。這可以很好地用於顯示在一個選項卡中打開的所有緩衝區(在多個分割的情況下)。

1

tabline使用類似的標誌爲statusline(見:h statusline)。所以%m是你需要的,只是作爲endwhile

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

之前修改行究竟會自動將默認[+]文件名後的當前選項卡,如果有未保存的更改。

+0

謝謝!嗚呼我的upvote把你推到了10K以上;)你修改的唯一問題是[+]只有在焦點標籤被修改時纔會出現。如果您當前正在查看的選項卡沒有被修改,其他選項卡即使被修改也不會有[+]。 – Philip

+0

@Philip:謝謝:)是的,這就是我通常使用它,並從我的vimrc複製。你可以試試把它放在'let s。='%m''而不是條件語句嗎?讓我知道這是否有效。我沒有時間檢查它現在是否有效,但也許在當天晚些時候...(除非當然,它的工作原理) – abcd

+0

@yoda,當你專注於一個標籤時,所有標籤都有[+]已經被修改,並且當您關注未修改的選項卡時,所有選項卡都沒有任何內容。 – Philip