¿Por qué vim no genera mi archivo .vimrc?

9

Hoy, descubrí que mi .vimrcno tuvo efecto. Estaba bien hace solo unas horas.

Cuando lancé vim con $vim --plugin, :scriptnamesno se hizo eco de nada: el .vimrcarchivo no tenía origen. (Nota: /etc/vimrcse eliminó para depurar este problema).

Luego intenté googlear y encontré $VIMINITvariables sospechosas.

Aquí está el valor de $VIMINIT:

$ echo $VIMINIT
set number

Documentación de Vim sobre VIMINIT:

 c. Four places are searched for initializations.  The first that exists
    is used, the others are ignored.  The $MYVIMRC environment variable is
    set to the file that was first found, unless $MYVIMRC was already set.
    -  The environment variable VIMINIT (see also |compatible-default|) (*)
       The value of $VIMINIT is used as an Ex command line.
    -  The user vimrc file(s):
                "$HOME/.vimrc"      (for Unix and OS/2) (*)
                "s:.vimrc"          (for Amiga) (*)
                "home:.vimrc"       (for Amiga) (*)
                "$VIM/.vimrc"       (for OS/2 and Amiga) (*)
                "$HOME/_vimrc"      (for MS-DOS and Win32) (*)
                "$VIM/_vimrc"       (for MS-DOS and Win32) (*)
            Note: For Unix, OS/2 and Amiga, when ".vimrc" does not exist,
            "_vimrc" is also tried, in case an MS-DOS compatible file
            system is used.  For MS-DOS and Win32 ".vimrc" is checked
            after "_vimrc", in case long file names are used.
            Note: For MS-DOS and Win32, "$HOME" is checked first.  If no
            "_vimrc" or ".vimrc" is found there, "$VIM" is tried.
            See |$VIM| for when $VIM is not set.
    -  The environment variable EXINIT.
       The value of $EXINIT is used as an Ex command line.
    -  The user exrc file(s).  Same as for the user vimrc file, but with
       "vimrc" replaced by "exrc".  But only one of ".exrc" and "_exrc" is
       used, depending on the system.  And without the (*)!

No pude entender la documentación de vim completamente. Parece que $VIMINITpuede estropear el inicio de vim.

Claro $VIMINIT:

$ VIMINIT=
$ echo $VIMINIT

El problema aún existe.

Feng Yu
fuente
2
"Se utiliza el primero que existe, los demás se ignoran". $VIMINITtiene precedente sobre cualquier .vimrcarchivo. Y satisface la regla de orden de llegada. Entonces sí .vimrcse ignora.
Sukima

Respuestas:

10

Ampliando la respuesta de @ mMontu; Vim busca la inicialización en el orden de esa lista hasta que encuentra una. Dado que la $VIMINITvariable tiene prioridad sobre el .vimrcarchivo, satisface la búsqueda y cualquier otra opción después de eso se ignora .

La razón por la que aún no funcionó después de:

$ VIMINIT=
$ echo $VIMINIT

Es (1) que está configurando una variable local, no una variable de entorno. Eso necesita ser exportado:

$ export VIMINIT=

(2) esto todavía no funcionará porque VIMINITtodavía está definido:

$ printenv | grep VIMINIT
VIMINIT=

Lo que debe suceder es la eliminación del medio ambiente todos juntos:

$ unset VIMINIT
$ printenv | grep VIMINIT || echo "Gone"
Gone

(Estos comandos son específicos de Bash. Cámbielos para adaptarlos a su shell preferido si es necesario).

Sukima
fuente
Pero esto solo funciona para una sesión, ¿qué hay de desarmarlo definitivamente? o tal vez buscando dónde está establecida la variable, para que pueda ir y eliminarla?
Feng Yu
8

Probablemente entendió mal la documentación:

 c. Four places are searched for initializations.  The first that exists
    is used, the others are ignored.

Por lo tanto, si está utilizando el VIMINIT, el vimrc no se cargará.

-  The environment variable VIMINIT (see also |compatible-default|) (*)
   The value of $VIMINIT is used as an Ex command line.

Está configurando $ VIMINIT a un comando Ex set number, que está bien según los documentos. Pero si prefiere un vimrc, debe incluirlo set numberen ese archivo en lugar de usar $ VIMINIT. Usted mencionó que lo configuró como vacío y que su vimrc todavía no estaba cargado, pero en realidad debería desarmar la variable.

mMontu
fuente