Vim - Comment exécuter une commande immédiatement lors du démarrage de vim?

103

J'ai un plugin (FindFile.vim) qui doit s'exécuter :FindFileCache .chaque fois que je lance vim pour rassembler un cache de fichiers pour une ouverture rapide .. Je dois cependant l'exécuter à chaque fois que je lance vim.

Comment pourrais-je écrire une commande qui s'exécute une fois, chaque fois que vim démarre?

testeur
la source

Réponses:

145

Le meilleur endroit pour conserver vos éléments de configuration est dans votre fichier .vimrc . Cependant, il est fourni trop tôt, vérifiez :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

Comme vous pouvez le voir, votre .vimrc sera chargé avant les plugins. Si vous y mettez :FindFileCache .une erreur se produira, puisque cette commande n'existe pas encore. (Il existera une fois le plugin chargé à l'étape 4.)

Pour résoudre ce problème, au lieu d'exécuter la commande directement, créez une commande automatique. Les commandes automatiques exécutent une commande lorsqu'un événement se produit. Dans ce cas, l' événement VimEnter semble approprié (de :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.

Ensuite, placez simplement cette ligne dans votre .vimrc :

autocmd VimEnter * FindFileCache .
sidylle
la source
2
+1, cela devrait être la réponse acceptée, c'est beaucoup plus propre que de créer un fichier séparé pour une commande.
Je veux ajouter que j'ai eu cette pause sur moi avec E172 car j'avais un espace après.
Caroline
essayé d'utiliser cette approche pour appeler: AnsiEsc mais cela n'a pas vraiment eu l'effet souhaité - vous savez comment détecter si une commande telle que: AnsiEsc a déjà été exécutée?
serup du
89

Il y a aussi le drapeau -c de vim. Je fais cela dans ma configuration tmuxp pour que vim démarre avec une division verticale:

vim -c "vnew"

Au moins avec neovim, vous pouvez également ouvrir un fichier en même temps:

nvim -c "colorscheme mustang" some_file
djangonaute
la source
6
Merci, c'est ce que je cherchais. Parfois, j'ai juste besoin d'exécuter une commande de démarrage temporaire comme split comme vous l'avez montré, et je n'ai pas besoin de stocker cela dans mon fichier
vimrc
Cela ne peut pas ouvrir un fichier:vim -c ':colo default' test.txt
van abel
1
Parfait pour moi aussi - j'utilise xolox/vim-noteset je veux une fonction poisson qui ouvre Vim avec une nouvelle note prête à l'emploi.
wsams
13

Créez un fichier nommé ~/.vim/after/plugin/whatever_name_you_like.vimet remplissez-le avec

FindFileCache .

L'ordre dans lequel les scripts sont lus et exécutés dans les répertoires vim est décrit dans :help 'runtimepath'

Benoit
la source
2

Pour obtenir même plus tard que les autres réponses, mais toujours juste après le démarrage, utilisez une minuterie en .vimrc. Par exemple, ce code en .vimrc attend une demi-seconde après le démarrage avant de définir une variable.

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

(La variable dans l'exemple est la liste noire du plugin YouCompleteMe. Je suppose que le plugin démarre un autre processus de manière asynchrone qui crée ensuite des variables, mais n'est pas tout à fait prêt au moment où vim a démarré. La variable n'existe pas lorsque j'essaye de définissez-le dans .vimrc, un fichier après, ou un événement VimEnter. Ceci est spécifique à mon système Windows d'une manière ou d'une autre, la documentation YCM indique que .vimrc devrait fonctionner pour la configuration des options.)

moins idéal
la source
1

Mettez FindFileCachedans votre .vimrc.

Les commandes de chargement automatique sont différentes et ne fonctionneront pas pour votre scénario.

matpie
la source
merci d'avoir souligné cela, en fait ce n'était pluginpas le cas autoload.
Benoit