Jak mogę uruchomić autocmd podczas uruchamiania Vima bez pliku, nieistniejącego pliku lub pustego pliku (ale nie przy uruchamianiu z istniejącym plikiem)?

11

Chciałbym uruchomić autocmd w następujących scenariuszach po uruchomieniu Vima:

  • Bez określenia nazwy pliku.
  • Kiedy plik jest nowy.
  • Gdy plik istnieje, ale jest całkowicie pusty.

We wszystkich powyższych trzech przypadkach chciałbym uruchomić autocmd; konkretnie, chciałabym zacząć wkładka trybie automatycznie za jedynie powyższych scenariuszy (a nie kiedy jestem otwierania pliku, który już istnieje i nie jest pusty).


AKTUALIZACJA:

Próbowałem umieścić następujące elementy w moim _vimrc, ale bez powodzenia (plus nie jestem pewien, czy w vimie jest funkcja, która zlicza liczbę znaków w pliku (aby sprawdzić, czy jest to zero) przed otwarciem:

if @% == "" || filereadable(@%)
  autocmd BufRead,BufNewFile * startinsert
endif
John Sonderson
źródło
Nie, to nie jest duplikat. Chcę, aby vi zaczęło się w trybie wstawiania TYLKO DLA TRZY SCENARIUSZY, KTÓRE WYMIENIONO.
John Sonderson
3
OK, PRZEPRASZAM, ALE NAPRAWDĘ WYGLĄDAŁEM JAK DUPLIKAT. ;-) Zmieniłem nieco twoje pytanie, aby wyjaśnić różnice.
Martin Tournoij
2
@JohnSonderson pierwszy link mówi, jak znaleźć, jeśli nie podano nazwy pliku, drugi można dostosować za pomocą normalzamiast exec.
muru
1
Plik vimrc jest odczytywany tylko raz : po uruchomieniu Vima. Zawartość autocmd jest uruchamiana przy każdym uruchomieniu. Zatem ifinstrukcja nie powinna znajdować się w pobliżu autocmd, jeśli powinna znajdować się w autocmd, więc będzie uruchamiana za każdym razem, gdy zostanie uruchomiona autocmd.
Martin Tournoij,

Odpowiedzi:

10

Działa to dla wszystkich 3 twoich spraw dla mnie:

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()

Można je prawdopodobnie skondensować do ostatniego sprawdzenia, czy plik jest pusty, ponieważ żadna nazwa pliku lub plik, który nie istnieje, zwykle nie jest uruchamiany jako puste bufory. Prawdopodobnie jest jednak możliwe, że niektóre inne wtyczki wstępnie wypełniają niektóre rzeczy w jednym z dwóch pierwszych przypadków (np. Niektóre wtyczki szablonu), więc najlepiej sprawdzić wszystkie trzy.

Pierwszy test, który już miałeś.

Drugi test musi sprawdzić filereadablewartość zero (nie istnieje), aby zdecydować, czy jest nowy (odwrotnie niż w przypadku wcześniejszych testów ).

Ostatni test sprawdza, czy numer ostatniego wiersza w pliku wynosi 1 (który jest również pierwszym wierszem, co oznacza, że ​​jest tylko jeden wiersz) i czy numer kolumny na końcu wiersza (kolumna po ostatnim znaku w wiersz) wynosi 1, co oznaczałoby, że jest 0 znaków. Jeśli jest tylko 1 linia z 0 znakami, plik musi być pusty.

Ostatnia uwaga: sposób, w jaki wypowiadasz się w pytaniu, może przynieść zaskakujące wyniki. Mianowicie ustawiasz BufReadi BufNewFiletylko wtedy, gdy warunki są spełnione podczas uruchamiania, ale wtedy te polecenia automatyczne istnieją przez resztę sesji. Tak więc, jeśli miałbyś zacząć od pustego pliku, który ustawia te polecenia, każdy kolejny otwarty plik (nowy lub nie, pusty lub nie) zacząłby się w trybie wstawiania.

Autocommand VimEnterjest uruchamiany pod koniec uruchamiania Vima i tylko raz dla całej sesji. W ten sposób twoje testy będą uruchamiane tylko po uruchomieniu Vima, a nie w żadnym innym momencie.

John O'M.
źródło