2011-06-30 10 views
6

Tengo una función de tabulación que robé/modifiqué de alguna parte, pero me gustaría que el nombre de archivo tenga un asterisco antes si ha sido modificado desde la última vez que se escribió en el disco (es decir, si: up realizaría una acción)¿Qué es una función vimrc para determinar si un buffer ha sido modificado?

Por ejemplo, este es mi tabline al abrir el archivo .txt Vim * -p

file1.txt file2.txt file3.txt 

A continuación, después de cambiar file1.txt y no lo guarda:

*file1.txt file2.txt file3.txt 

Mi tabline función:

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

posible duplicado de [Vim Buffer ha sido modificado] (http://stackoverflow.com/questions/5606914/vim-buffer-has-been-modified) –

Respuesta

13

Estaba buscando lo mismo y encontré que %m y %M no son adecuados, ya que le dicen si el búfer abierto actualmente se ha modificado. Por lo tanto, no puede ver si se modifican otros almacenamientos intermedios (especialmente para las pestañas, esto es importante).

La solución es la función getbufvar. Más o menos de la ayuda:

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

en lugar de

let s .= file 

debe hacer el truco. Esto se puede usar muy bien para mostrar todos los búferes abiertos en una sola pestaña (en caso de múltiples divisiones).

1

tabline utiliza banderas similares a statusline (ver :h statusline). Así %m es lo que necesita y la modificación de las líneas justo antes de la endwhile como

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

colocará automáticamente el valor por defecto [+] después de que el nombre del archivo en la pestaña actual si hay cambios sin guardar.

+0

¡Gracias! Woohoo mi upvote lo empujó más de 10k;) El único problema con su modificación es que el [+] solo aparece si se modifica la pestaña enfocada. Si la pestaña que está viendo actualmente no se modifica, ninguna de las otras pestañas tiene el [+], incluso si se modifican. – Philip

+0

@Philip: Gracias :) Sí, así es como normalmente lo uso y acabo de copiar desde mi vimrc. ¿Podría intentar simplemente dejarlo como 'let s. = '% M'' en lugar del enunciado condicional? Avísame si eso funciona. No tengo tiempo para comprobar si funciona en este momento, pero quizás más tarde en el día ... (a menos, por supuesto, funciona) – abcd

+0

@yoda que hace que todas las pestañas tengan [+] cuando se enfoca en una pestaña eso ha sido modificado, y todas las pestañas no tienen nada cuando te centras en una pestaña no modificada. – Philip

Cuestiones relacionadas