¿Cómo hacer que la configuración de VIM dependa de la computadora en .vimrc?


44

Comparto mi archivo de configuración VIM entre varias computadoras. Sin embargo, quiero que algunas configuraciones sean específicas para ciertas computadoras.

Por ejemplo, los tamaños de fuente en la computadora portátil de alta resolución deben ser diferentes al escritorio de baja resolución. Y lo que es más importante, quiero que gVIM en Windows se comporte más windowsy y MacVim en OSX se comporte más maccy y gVIM en Linux se comporte como siempre. (Eso podría ser un sentimiento extraño, pero estoy muy acostumbrado a cambiar los modos mentales al cambiar de SO)

¿Hay alguna manera de hacer algunas configuraciones en la .vimrcmáquina o en el sistema operativo?

Respuestas:


44

Detección de sistema operativo en .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif

44
También es útil: has('gui_running')si necesita diferenciar entre el modo tty y el modo GUI.
Chris Johnsen

10
La función has () prueba la presencia de características de Vim. No existe la función 'linux'. El argumento apropiado es 'unix'. Además, el argumento apropiado para OS-X es 'macunix'. También hay una función 'mac', pero no sé si has('mac')es cierto para todos los Mac o solo para Macs anteriores a OS-X. Ver :help feature-listpara la lista completa.
garyjohn

1
Sí, has('unix'). Mi error.
Codificador informal del

Una respuesta muy tardía, pero sí, tiene activadores ('mac') en OSX para mí.
Diablo-D3

1
He probado vim 1) que viene con OS X, y 2) que instalé a través de Gentoo Prefix (algo similar a Homebrew), y 3) que viene de MacVim. Solo el que proviene de MacVim devolverá correctamente true para has("mac"). Supongo que usaron algún parche que realmente hace que la prueba de funciones funcione. Si confía en la has("mac")prueba, realice alguna prueba para asegurarse de que sea compatible con su vim.
yegle

26

Para probar una máquina en particular, puede probar la salida del hostnamecomando. Por ejemplo,

let hostname = substitute(system('hostname'), '\n', '', '')
if hostname == "tigger"
   ...
elseif hostname == "pooh"
   ...
endif

También puede probar el valor de las variables de entorno disponibles:

if $HOSTNAME == "tigger"
   ...
elseif $HOSTNAME == "pooh"
   ...
endif

La $DISPLAYvariable también puede ser útil.


13
hostname () hará esto, por ejemplo: if hostname () == 'tigger' ..., sin tener que hacer la llamada al sistema.
tvon

El resultado system('hostname')fue machine.mycompany.com\n, así que tuve que cambiar el comando sustituto a substitute(system('hostname'), '\.\_.*$', '', '').
JPaget

9

Tengo este fragmento en mi vimrc:

let s:host_vimrc = $HOME . '/.' . hostname() . '.vimrc'                                                                                                                               
if filereadable(s:host_vimrc)                                                                                                                                                        
  execute 'source ' . s:host_vimrc                                                                                                                                                   
endif

Esto simplemente se ejecuta source $HOME/.$HOSTNAME.vimrcsi existe. He usado hostname()y concatenación, también podría usar el más conciso expand('$HOME/.$HOSTNAME.vimrc')si sabe que $HOSTNAMEsiempre está configurado.


7

La respuesta anterior sobre la detección del sistema operativo no detecta OS X en MacVim para mí (y tampoco lo hace el uso has("macunix")como sugiere la documentación).

Esto es lo que uso para distinguir entre Windows y OS X:

if has("win32")
  "Windows options here
else
  if has("unix")
    let s:uname = system("uname")
    if s:uname == "Darwin\n"
      "Mac options here
    endif
  endif
endif

Tenga en cuenta que has("win32")funcionó para mí, incluso en Vim de 64 bits en Windows de 64 bits.

También puede usar pruebas similares unamedentro del if has("unix")bloque para distinguir otros sabores de Unix. Simplemente ejecute unameo uname -adesde la línea de comandos para ver lo que necesita comparar s:uname with. Vea también :h matchstr()si necesita comparar solo una parte de la salida de uname.


2

Con muchas máquinas, enumerar todos los nombres de host en .vimrcpuede ser tedioso, podría ser más fácil distinguir entre diferentes sabores de Unix:

" set font when running on Solaris
if (match(system('uname -s'), 'SunOS') >= 0)  
   set guifont=*   " fixes "E665: Cannot start GUI, no valid font found"
endif

Desafortunadamente, esto se rompe en las máquinas con Windows.
oligofren

1

Podrías poner las cosas específicas del sistema operativo en un .gvimrc personalizado para cada máquina, y usar un .vimrc común en todas ellas. Ambos archivos se leen cuando se inicia GVim, solo se lee .vimrc cuando se inicia el Vim no gui.


1

Con respecto a la separación entre Linux y Windows, simplemente puede establecer diferentes configuraciones .vimrcy _vimrc, en consecuencia.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.