Come posso eseguire un autocmd quando avvio Vim senza un file, un file inesistente o un file vuoto (ma non quando si inizia con un file esistente)?


11

Vorrei eseguire un autocmd nei seguenti scenari quando avvio Vim:

  • Senza nome file specificato.
  • Quando il file è nuovo.
  • Quando il file esiste ma è completamente vuoto.

In tutti e tre i casi precedenti, vorrei eseguire un autocmd; in particolare, vorrei avviare automaticamente la modalità di inserimento solo per gli scenari di cui sopra (e non quando apro un file che esiste già e non è vuoto).


AGGIORNARE:

Ho provato a inserire quanto segue nel mio _vimrc, ma senza fortuna (in più non sono sicuro che esista una funzione in vim che conti il ​​numero di caratteri in un file (per vedere se è zero) prima di aprirlo:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif

No, questo non è un duplicato. Voglio che vi inizi in modalità inserimento SOLO PER I TRE SCENARI CHE HO Citato.
John Sonderson,

3
Va bene, sono preoccupato, ma è davvero assomigliato a un duplicato. ;-) Ho modificato un po 'la tua domanda per rendere più chiare le differenze.
Martin Tournoij,


2
@JohnSonderson il primo link ti dice come trovare se non viene dato alcun nome file, il secondo può essere adattato usando normalinvece di exec.
Muru,

1
Il file vimrc viene letto una sola volta : all'avvio di Vim. Il contenuto di autocmd viene eseguito ogni volta che viene attivato. Quindi l' ifistruzione non dovrebbe essere attorno ad autocmd, se dovrebbe essere all'interno di autocmd, quindi verrà eseguita ogni volta che viene attivato autocmd.
Martin Tournoij,

Risposte:


10

Questo funziona per tutti e 3 i casi per me:

function InsertIfEmpty()
    if @% == ""
        " No filename for current buffer
        startinsert
    elseif filereadable(@%) == 0
        " File doesn't exist yet
        startinsert
    elseif line('$') == 1 && col('$') == 1
        " File is empty
        startinsert
    endif
endfunction

au VimEnter * call InsertIfEmpty()

Questi potrebbero probabilmente essere condensati nell'ultimo controllo per un file vuoto, poiché nessun nome file o file che non esiste in genere inizia come buffer vuoti. Tuttavia, è probabilmente possibile che alcuni altri plug-in pre-riempiano alcune cose in uno dei primi due casi (come alcuni plugin modello), quindi è meglio controllare tutti e tre.

Il primo test che hai già avuto.

Il secondo test deve verificare filereadableil valore zero (non esiste) per decidere se è nuovo (opposto a quello che avevi).

L'ultimo test verifica che il numero dell'ultima riga nel file sia 1 (che è anche la prima riga, il che significa che esiste solo una riga) e che il numero di colonna della fine della riga (colonna dopo l'ultimo carattere in la linea) è 1, il che significa che ci sono 0 caratteri. Se contiene solo 1 riga con 0 caratteri, il file deve essere vuoto.

Un'ultima nota: il modo in cui hai le tue dichiarazioni nella domanda può portare a risultati sorprendenti. Vale a dire, stai impostando BufReade BufNewFilesolo se all'avvio sono soddisfatte le condizioni, ma poi quei autocomandi esistono per il resto della sessione. Quindi, se dovessi iniziare su un file vuoto, che imposta questi comandi, ogni file successivo aperto (nuovo o no, vuoto o no) verrebbe avviato in modalità inserimento.

Il comando automatico VimEnterviene eseguito al termine dell'avvio di Vim e solo una volta per l'intera sessione. In questo modo, i test vengono eseguiti solo quando avvii Vim e non in nessun altro momento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.