Vim - jak uruchomić polecenie natychmiast po uruchomieniu Vima?

103

Mam wtyczkę (FindFile.vim), która musi być uruchamiana :FindFileCache .za każdym razem, gdy uruchamiam vima, aby zebrać pamięć podręczną plików w celu szybkiego otwarcia. Muszę to jednak uruchamiać za każdym razem, gdy uruchamiam vima.

Jak mógłbym napisać polecenie uruchamiane raz, za każdym razem, gdy uruchamia się vim?

próbnik
źródło

Odpowiedzi:

145

Najlepszym miejscem do przechowywania rzeczy konfiguracyjnych jest plik .vimrc . Jednak jest pozyskiwany zbyt wcześnie, sprawdź :h startup:

At startup, Vim checks environment variables and files and sets values
accordingly.  Vim proceeds in this order:

1. Set the 'shell' and 'term' option                *SHELL* *COMSPEC* *TERM*
2. Process the arguments
3. Execute Ex commands, from environment variables and/or files *vimrc* *exrc*
4. Load the plugin scripts.                                 *load-plugins*
5. Set 'shellpipe' and 'shellredir'
6. Set 'updatecount' to zero, if "-n" command argument used
7. Set binary options
8. Perform GUI initializations
9. Read the viminfo file
10. Read the quickfix file
11. Open all windows
12. Execute startup commands

Jak widać, plik .vimrc zostanie załadowany przed wtyczkami. Jeśli go wstawisz :FindFileCache ., wystąpi błąd, ponieważ to polecenie jeszcze nie istnieje. (Będzie istnieć po załadowaniu wtyczki w kroku 4).

Aby rozwiązać ten problem, zamiast wykonywać polecenie bezpośrednio, utwórz polecenie automatyczne. Polecenia automatyczne wykonują jakieś polecenie, gdy wystąpi zdarzenie. W tym przypadku zdarzenie VimEnter wygląda odpowiednio (z :h VimEnter):

                                                    *VimEnter*
VimEnter                    After doing all the startup stuff, including
                            loading .vimrc files, executing the "-c cmd"
                            arguments, creating all windows and loading
                            the buffers in them.

Następnie umieść tę linię w swoim .vimrc :

autocmd VimEnter * FindFileCache .
sidyll
źródło
2
+1, to powinna być akceptowana odpowiedź, jest znacznie czystsza niż tworzenie osobnego pliku dla jednego polecenia.
Chcę dodać, że miałem tę przerwę na mnie z E172, ponieważ miałem spację po.
Caroline
próbowałem użyć tego podejścia do wywołania: AnsiEsc, jednak nie przyniosło to pożądanego efektu - czy wiesz, jak wykryć, czy polecenie takie jak: AnsiEsc zostało uruchomione wcześniej?
serup
89

Istnieje również opcja -c programu vim. Robię to w mojej konfiguracji tmuxp, aby Vim zaczął się od podziału pionowego:

vim -c "vnew"

Przynajmniej z neovimem możesz także otworzyć plik w tym samym czasie:

nvim -c "colorscheme mustang" some_file
djangonaut
źródło
6
Dzięki, właśnie tego szukałem. Czasami po prostu muszę uruchomić tymczasowe polecenie startowe, takie jak split, jak pokazano, i nie muszę zapisywać tego w moim pliku vimrc
verboze
To nie może otworzyć pliku:vim -c ':colo default' test.txt
van abel
1
Również dla mnie idealne - używam xolox/vim-notesi chcę mieć funkcję ryby, która otwiera Vima z nową notatką gotową do pracy.
wsams
13

Utwórz plik o nazwie ~/.vim/after/plugin/whatever_name_you_like.vimi wypełnij go

FindFileCache .

Kolejność, w jakiej skrypty są odczytywane i wykonywane w katalogach vim, jest opisana w :help 'runtimepath'

Benoit
źródło
2

Aby uzyskać jeszcze później niż inne odpowiedzi, ale nadal tuż po uruchomieniu, użyj licznika czasu w .vimrc. Na przykład ten kod w .vimrc czeka pół sekundy po uruchomieniu przed ustawieniem zmiennej.

function DelayedSetVariables(timer)
    let g:ycm_filetype_blacklist['ignored'] = 1
endfunction
let timer=timer_start(500,'DelayedSetVariables')

(Zmienna w przykładzie to czarna lista z wtyczki YouCompleteMe. Zakładam, że wtyczka uruchamia inny proces asynchronicznie, który następnie tworzy zmienne, ale nie jest jeszcze gotowa do czasu uruchomienia vima. Zmienna nie istnieje, gdy próbuję ustaw go w .vimrc, pliku after lub w zdarzeniu VimEnter. Jest to w jakiś sposób specyficzne dla mojego systemu Windows, dokumentacja YCM mówi, że .vimrc powinno działać przy ustawianiu opcji.)

lessthanideal
źródło
1

Włóż FindFileCacheswój .vimrc.

Polecenia automatycznego ładowania są różne i nie będą działać w Twoim scenariuszu.

matpie
źródło
dzięki za zwrócenie uwagi, właściwie to pluginnie był autoload.
Benoit,