2010-02-20 17 views
9

Normalmente abro muchos archivos en pestañas con vim -p. ¿Es posible verificar si se modificó alguno de los archivos fuera de Vim desde que comenzó la edición?¿Cómo puedo hacer que vim revise automáticamente si el archivo ha cambiado externamente?

+0

"¿Es posible verificar si alguno de los archivos se modificó desde que se inició la edición (por ejemplo, mediante algún programa externo)?" Tal como está, su pregunta es ambigua. Debería poder eliminar las declaraciones entre paréntesis sin cambiar el significado de la oración. Por favor, arregla. – nelstrom

Respuesta

10

Añadir estas líneas a su .vimrc:

au FocusGained,BufEnter * :silent! checktime 
au FocusLost,WinLeave * :silent! w 

Básicamente, compruebe y recarga (o descarte) los cambios externos cuando Vim o las ganancias del búfer actual foco, y, opcionalmente, de almacenamiento automático al salir de foco.

Fuente: Vim Wiki.

2

Uso :edit

:help :edit para obtener más información.

3

vim generalmente me avisa automáticamente si detecta un cambio externo en un archivo; sin embargo, al leer detenidamente la documentación, parece que puede invocar esa verificación manualmente con :checktime

Desafortunadamente, no sé cómo deshabilitar esa comprobación automática antes mencionada para probar y ver si el tiempo de comprobación hace lo correcto, por lo que esta respuesta podría ser completamente fuera de base.

+0

'au CursorHold * checktime' - cerca de él. Pero necesito mover el cursor para que detecte un cambio :( –

0
let s:pid=system("ps -p $$ -o ppid=")+0 
if !exists('g:watches') 
    let g:watches={} 
else 
    finish 
endif 
function! ModWatch(fname, match) 
    let fname=fnamemodify(a:fname, ':p') 
    if has_key(g:watches, fname) 
     return 
    endif 
    let shellscript= 
       \"while true ; do". 
       \" inotifywait ".shellescape(fname)." ; ". 
       \" kill -WINCH ".s:pid." ; ". 
       \"done" 
    echo shellscript 
    echo shellescape(shellscript) 
    let pid=system("sh -c ".shellescape(shellscript)." &>/dev/null & echo $!")+0 
    call extend(g:watches, { fname : pid }) 
    augroup ModWatch 
     execute "autocmd! BufWipeOut ".a:match 
     execute "autocmd BufWipeOut ".a:match.' call DeleteWatch("'. 
        \escape(fname, '\"|').'")' 
    augroup END 
endfunction 
function! DeleteWatch(fname) 
    call system("kill ".g:watches[a:fname]) 
    unlet g:watches[a:fname] 
endfunction 
augroup ModWatch 
    autocmd! 
    autocmd VimResized * checktime 
    autocmd BufNew * call ModWatch(expand("<afile>"), expand("<amatch>")) 
augroup END 
+0

Esto solo funcionará para Linux, ¿no? –

+0

Sí, en linux con inotify instalado. – ZyX

1

Puede averiguar si el búfer en la ventana activa se modifica mediante la ejecución del comando:

:set mod? 

Si devuelve nomodified, a continuación, el contenido de la memoria intermedia coinciden con los del archivo correspondiente. Si devuelve modified, entonces el buffer tiene cambios no guardados.

De forma predeterminada, la línea de estado muestra un símbolo [+] si el búfer actual se ha modificado. La línea de estado generalmente solo es visible si tiene ventanas divididas. Si desea mostrar la línea de estado, incluso cuando se tiene sólo una única ventana, ejecute:

:set laststatus=2 

Hay un buen artículo sobre customizing your status line en VIM Recetas.

+2

Creo que quiere decir si el archivo en el disco fue modificado por algo más que vim desde que se abrió el archivo. –

+1

La pregunta está mal redactada: el detalle crucial que omití está entre paréntesis. Gracias por el voto a la baja. – nelstrom

+0

En realidad tengo un [+] en la línea de tabulación si el archivo fue modificado –

6

me encontré con una interesante encontrar relacionado con esta pregunta hoy ...

Escondido en /usr/share/vim/vim71/vimrc_example.vim existe este comando:

" Convenient command to see the difference between the current buffer and the 
" file it was loaded from, thus the changes you made. 
command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis 
     \ | wincmd p | diffthis 

se abrirá una ventana de vimdiff -como con el tampón actual y el archivo subyacente que resalta todos los cambios entre los dos.

Cuestiones relacionadas