Vim - Wie führe ich einen Befehl sofort aus, wenn ich vim starte?

103

Ich habe ein Plugin (FindFile.vim), das ausgeführt werden muss, :FindFileCache .wenn ich vim starte , um einen Datei-Cache zum schnellen Öffnen zu sammeln. Ich muss dies jedoch jedes Mal ausführen, wenn ich vim starte .

Wie kann ich einen Befehl schreiben, der jedes Mal ausgeführt wird, wenn vim gestartet wird?

Prüfer
quelle

Antworten:

145

Der beste Ort, um Ihre Konfigurationssachen aufzubewahren, ist in Ihrer .vimrc- Datei. Es wird jedoch zu früh bezogen. Überprüfen Sie :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

Wie Sie sehen können, wird Ihre .vimrc vor Plugins geladen. Wenn Sie setzen:FindFileCache . es eingeben, tritt ein Fehler auf, da dieser Befehl noch nicht vorhanden ist. (Es wird existieren, sobald das Plugin in Schritt 4 geladen wurde.)

Um dies zu lösen, erstellen Sie einen automatischen Befehl, anstatt den Befehl direkt auszuführen. Auto-Befehle führen einen Befehl aus, wenn ein Ereignis auftritt. In diesem Fall sieht das VimEnter- Ereignis angemessen aus (von :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.

Dann setzen Sie einfach diese Zeile in Ihre .vimrc :

autocmd VimEnter * FindFileCache .
Sidyll
quelle
2
+1, dies sollte die akzeptierte Antwort sein, es ist viel sauberer als das Erstellen einer separaten Datei für einen Befehl.
Ich möchte hinzufügen, dass ich diese Pause mit E172 hatte, weil ich danach ein Leerzeichen hatte.
Caroline
Ich habe versucht, diesen Ansatz zum Aufrufen von: AnsiEsc zu verwenden, aber er hatte nicht wirklich den gewünschten Effekt. Gibt es eine Möglichkeit, zu erkennen, ob ein Befehl wie: AnsiEsc bereits ausgeführt wurde?
Serup
89

Es gibt auch die -c Flagge von vim. Ich mache dies in meiner tmuxp-Konfiguration, damit vim mit einer vertikalen Aufteilung beginnt:

vim -c "vnew"

Zumindest mit neovim können Sie gleichzeitig auch eine Datei öffnen:

nvim -c "colorscheme mustang" some_file
Djangonaut
quelle
6
Danke, das habe ich gesucht. Manchmal muss ich nur einen temporären Startbefehl wie split ausführen, wie Sie gezeigt haben, und muss diesen nicht in meiner vimrc-Datei speichern
verboze
Dies kann keine Datei öffnen:vim -c ':colo default' test.txt
van abel
1
Perfekt auch für mich - ich benutze xolox/vim-notesund ich möchte eine Fischfunktion, die Vim mit einer neuen Note öffnet.
wsams
13

Erstellen Sie eine Datei mit dem Namen ~/.vim/after/plugin/whatever_name_you_like.vimund füllen Sie sie mit

FindFileCache .

Die Reihenfolge, in der Skripte in den vim-Verzeichnissen gelesen und ausgeführt werden, ist in beschrieben :help 'runtimepath'

Benoit
quelle
2

Verwenden Sie einen Timer in .vimrc, um noch später als andere Antworten zu erhalten, aber noch kurz nach dem Start. Beispielsweise wartet dieser Code in .vimrc nach dem Start eine halbe Sekunde, bevor eine Variable festgelegt wird.

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

(Die Variable im Beispiel ist die Blacklist des YouCompleteMe-Plugins. Ich gehe davon aus, dass das Plugin einen anderen Prozess asynchron startet, der dann Variablen erstellt, aber zum Zeitpunkt des Starts von vim noch nicht ganz fertig ist. Die Variable existiert nicht, wenn ich es versuche Legen Sie es in .vimrc, einer After-Datei oder einem VimEnter-Ereignis fest. Dies ist irgendwie spezifisch für mein Windows-System. Laut YCM-Dokumentation sollte .vimrc zum Festlegen von Optionen funktionieren.)

lessthanideal
quelle
1

Setzen Sie FindFileCacheIhre.vimrc .

Autload-Befehle sind unterschiedlich und funktionieren in Ihrem Szenario nicht.

Matpie
quelle
Vielen Dank für den Hinweis, eigentlich war es pluginnicht autoload.
Benoit