2011-06-30 6 views
6

私はどこかから盗んだ/変更したタブライン機能を持っていますが、最後にディスクに書き込まれてから変更されている場合はファイル名の前にアスタリスクを付けることを望みます)。バッファが変更されたかどうかを判断するvimrc関数とは何ですか?

私はFILE1.TXT変えて保存していない後、私はその後

file1.txt file2.txt file3.txt 

の.txtのvim -pファイル*を開いたときにたとえば、これは私のtablineです:

*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が修正されました](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つのタブですべてのバッファを開いて表示するのにうまく使えます(複数の分割の場合)。

1

tablinestatuslineと同様のフラグを使用しています(を参照してください)。だから、%mは何が必要で、未保存の変更がある場合は

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

としてだけendwhile前の行を変更すると、自動的に現在のタブにファイル名の後にデフォルト[+]を配置します。

+0

ありがとう!私のupvoteが10kを超えました;)あなたの変更の唯一の問題は、フォーカスされたタブが変更された場合にのみ[+]が表示されることです。現在表示しているタブが変更されていない場合、他のタブは変更されていても[+]は表示されません。 – Philip

+0

@Philip:ありがとう:)ええ、それは私が通常それを使用し、ちょうど私のvimrcからコピーしたものです。条件文の代わりに 'let s。= '%m''として残してみてください。そのことが分かれば教えてください。私はそれが今働いているかどうかを確認する時間はありませんが、おそらく後でその日に...(もちろん、それが動作しない限り) – abcd

+0

@yodaは、タブに集中しているときにすべてのタブに[+]変更されていないタブに集中しているときは、すべてのタブには何も表示されません。 – Philip

関連する問題