2011-06-30 33 views
6

Tôi có một chức năng tabline mà tôi đã đánh cắp/sửa đổi từ một nơi nào đó, nhưng tôi muốn tên tệp có dấu hoa thị trước khi nó được sửa đổi kể từ lần cuối nó được ghi vào đĩa (tức là nếu: up sẽ thực hiện một hành động).Chức năng vimrc là gì để xác định xem bộ đệm đã được sửa đổi chưa?

Đối với ví dụ này là tabline của tôi khi tôi mở vim -p tập tin * .txt

file1.txt file2.txt file3.txt 

Sau đó, sau khi tôi thay đổi file1.txt và không lưu nó:

*file1.txt file2.txt file3.txt 

tabline My chức năng:

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

bản sao có thể có của [Vim Buffer đã được sửa đổi] (http://stackoverflow.com/questions/5606914/vim-buffer-has-been-modified) –

Trả lời

13

Tôi chỉ tìm kiếm tương tự và thấy rằng %m%M không phù hợp, vì nó cho bạn biết liệu bộ đệm hiện đang mở có được sửa đổi hay không. Vì vậy, bạn không thể nhìn thấy nếu bộ đệm khác được sửa đổi (đặc biệt là cho các tab, điều này là quan trọng).

Giải pháp là chức năng getbufvar. Khoảng từ sự giúp đỡ:

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

thay vì

let s .= file 

nên làm các trick. Điều này có thể được sử dụng độc đáo để hiển thị tất cả các bộ đệm mở trong một tab (trong trường hợp có nhiều phần tách).

1

tabline sử dụng lá cờ tương tự như statusline (xem :h statusline). Vì vậy, %m là những gì bạn cần và sửa đổi dòng ngay trước endwhile như

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

sẽ tự động đặt mặc định [+] sau tên tập tin trong tab hiện tại nếu có sự thay đổi chưa được lưu.

+0

Cảm ơn! Woohoo upvote của tôi đẩy bạn hơn 10k;) Vấn đề duy nhất với sửa đổi của bạn là [+] chỉ xuất hiện nếu tab tập trung được sửa đổi. Nếu tab bạn hiện đang xem không được sửa đổi, thì không có tab nào khác có [+] ngay cả khi chúng được sửa đổi. – Philip

+0

@Philip: Cảm ơn :) Vâng, đó là cách tôi thường sử dụng nó và chỉ cần sao chép từ vimrc của tôi. Bạn có thể thử chỉ để nó như 'let s. = '% M'' thay vì câu lệnh điều kiện? Cho tôi biết nếu nó hiệu quả. Tôi không có thời gian để kiểm tra xem nó hoạt động ngay bây giờ, nhưng có lẽ sau đó trong ngày ... (trừ khi tất nhiên, nó hoạt động) – abcd

+0

@yoda mà làm cho tất cả các tab có [+] khi bạn đang tập trung vào một tab đã được sửa đổi và tất cả các tab không có gì khi bạn tập trung vào một tab chưa sửa đổi. – Philip

Các vấn đề liên quan