Vim: ¿cómo ejecutar un comando inmediatamente al iniciar vim?

103

Tengo un complemento (FindFile.vim) que debe ejecutarse :FindFileCache .cada vez que inicio vim para recopilar un archivo de caché para una apertura rápida. Sin embargo, tengo que ejecutar esto cada vez que inicio vim.

¿Cómo puedo escribir un comando que se ejecute una vez, cada vez que se inicie vim?

ensayador
fuente

Respuestas:

145

El mejor lugar para guardar su configuración es en su archivo .vimrc . Sin embargo, se obtiene demasiado pronto, verifique :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

Como puede ver, su .vimrc se cargará antes que los complementos. Si lo pones :FindFileCache ., se producirá un error, ya que ese comando aún no existe. (Existirá una vez que se cargue el complemento en el paso 4.)

Para solucionar esto, en lugar de ejecutar el comando directamente, cree un comando automático. Los comandos automáticos ejecutan algún comando cuando ocurre un evento. En este caso, el evento VimEnter parece apropiado (desde :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.

Luego, simplemente coloque esta línea en su .vimrc :

autocmd VimEnter * FindFileCache .
Sidyll
fuente
2
+1, esta debería ser la respuesta aceptada, es mucho más limpio que crear un archivo separado para un comando.
Quiero agregar que tuve este descanso con E172 porque tuve un espacio después.
Caroline
Intenté usar este enfoque para llamar a: AnsiEsc, sin embargo, realmente no tuvo el efecto deseado. ¿Alguna posibilidad de que sepa cómo detectar si un comando como: AnsiEsc se ha ejecutado antes?
serup
89

También está la bandera -c de vim. Hago esto en mi configuración tmuxp para que vim comience con una división vertical:

vim -c "vnew"

Al menos con neovim también puede abrir un archivo al mismo tiempo:

nvim -c "colorscheme mustang" some_file
djangonaut
fuente
6
Gracias, esto es lo que estaba buscando. A veces, solo necesito ejecutar un comando de inicio temporal como dividir como ha mostrado, y no necesito almacenar esto en mi archivo
vimrc
Esto no puede abrir un archivo:vim -c ':colo default' test.txt
van abel
1
Perfecto para mí también: estoy usando xolox/vim-notesy quiero una función de pesca que abra Vim con una nueva nota lista para usar .
wsams
13

Crea un archivo con nombre ~/.vim/after/plugin/whatever_name_you_like.vimy rellénalo con

FindFileCache .

El orden en el que se leen y ejecutan los scripts en los directorios vim se describe en :help 'runtimepath'

Benoit
fuente
2

Para llegar incluso más tarde que otras respuestas, pero aún justo después del inicio, use un temporizador en .vimrc. Por ejemplo, este código en .vimrc espera medio segundo después del inicio antes de establecer una variable.

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

(La variable en el ejemplo es la lista negra del complemento YouCompleteMe. Supongo que el complemento inicia algún otro proceso de forma asincrónica que luego crea variables, pero no está del todo listo para cuando vim ha comenzado. La variable no existe cuando intento configúrelo en .vimrc, un archivo posterior o evento VimEnter. Esto es específico de mi sistema Windows de alguna manera, la documentación de YCM dice que .vimrc debería funcionar para configurar las opciones).

menos ideal
fuente
1

Pon FindFileCachetu .vimrc.

Los comandos de carga automática son diferentes y no funcionarán para su escenario.

matpie
fuente
gracias por señalarlo, en realidad era pluginno autoload.
Benoit