2011-02-17 16 views
5

Estoy escribiendo un complemento vim en el que necesito comprobar si la pestaña actual que está viendo el usuario está vacía. Si no está vacío, por ejemplo, si el usuario ya está viendo un buffer o tiene un par de ventanas, entonces quiero crear una nueva pestaña vacía y trabajar allí con mi complemento. Pero si está vacío, quiero cargar mi complemento sin abrir una pestaña nueva.Comprueba si la pestaña actual está vacía en vim

No pude encontrar nada apropiado en los documentos, ¿alguien tiene alguna pista sobre cómo hacer esto?

Gracias.

Respuesta

4

Lo único que se me ocurre para esto es usar :windo para recorrer todas las ventanas en la pestaña actual y verificar si se carga un archivo. Algo como esto:

function! TabIsEmpty() 
    " Remember which window we're in at the moment 
    let initial_win_num = winnr() 

    let win_count = 0 
    " Add the length of the file name on to count: 
    " this will be 0 if there is no file name 
    windo let win_count += len(expand('%')) 

    " Go back to the initial window 
    exe initial_win_num . "wincmd w" 

    " Check count 
    if win_count == 0 
     " Tab page is empty 
     return 1 
    else 
     return 0 
    endif 
endfunction 

" Test it like this: 
echo TabIsEmpty() 

" Use it like this: 
if TabIsEmpty() == 1 
    echo "The tab is empty" 
else 
    echo "The tab is not empty" 
endif 

Si lo único abierto es una página de ayuda o de la ventana de vista previa o algo por el estilo, es probable que volver 1, ya que no piensan windo opera sobre aquellos.

+0

Sí, que funciona de Al, he hecho sólo un pequeño cambio, para volver a la ventana inicial, estoy haciendo 'exe 'normal' '. initial_win_num. "^ W^W" '. ¡Muchas gracias! –

+0

DrAl, gracias, esto también me ayudó con mi propio problema: http://stackoverflow.com/q/15141979/212307 – Rixius

3

Supongamos que hay varias ventanas en la pestaña, pero que todos los búferes de Windows están vacíos.

Tal vez le gustaría decir que esta pestaña NO está vacía. Si ese es el caso, no necesitamos pasar por todas las pestañas. Lo siguiente funcionará.

function! TabIsEmpty() 
    return winnr('$') == 1 && len(expand('%')) == 0 && line2byte(line('$') + 1) <= 2 
endfunction 
3

Tal vez no estoy entender la pregunta, pero para comprobar si una ficha no tiene buffer de hacer esto:

if bufname("%") == "" 
+1

Esto funciona perfectamente para que pueda iniciar NERDTree en el inicio si no hay archivo (o sesión, lo que revisa argc errores) se dio: autocmd vimenter * if bufname ("%") == "" | NERDTree | terminara si – Von

Cuestiones relacionadas