¿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?

bastibe
fuente

Respuestas:

44

Detección de sistema operativo en .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
Codificador casual
fuente
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.

garyjohn
fuente
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.

sin pensar
fuente
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.

Rico
fuente
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
philant
fuente
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.

Neil
fuente
1

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

bjauy
fuente