Como fazer as configurações do VIM dependentes do computador em .vimrc?

44

Compartilho meu arquivo de configuração do VIM entre vários computadores. No entanto, quero que algumas configurações sejam específicas para determinados computadores.

Por exemplo, os tamanhos das fontes no laptop de alta resolução devem ser diferentes da área de trabalho de baixa resolução. E, mais importante, quero que o gVIM no Windows se comporte mais com janelas e o MacVim no OSX se comporte com mais maccy e o gVIM no Linux se comporte como sempre. (Isso pode ser um sentimento estranho, mas estou muito acostumado a mudar de modo mental ao mudar de SO)

Existe uma maneira de fazer algumas configurações na .vimrcmáquina ou no SO?

bastibe
fonte

Respostas:

44

Detecção de SO em .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
Casual Coder
fonte
4
Também é útil: has('gui_running')se você precisar diferenciar entre o modo tty e o modo GUI.
Chris Johnsen
10
A função has () testa a presença dos recursos do Vim. Não há recurso 'linux'. O argumento apropriado é 'unix'. Além disso, o argumento adequado para o OS-X é 'macunix'. Há também um recurso 'mac', mas não sei se isso has('mac')é verdade para todos os Macs ou apenas para Macs pré-OS-X. Veja :help feature-lista lista completa.
garyjohn
1
Sim, has('unix'). Meu erro.
Casual Coder
Uma resposta muito tardia, mas sim, tem ('mac') disparadores no OSX para mim.
Diablo-D3
1
Testei o vim 1) que vem com o OS X e 2) que instalei via Gentoo Prefix (algo semelhante ao Homebrew) e 3) que vem do MacVim. Somente aquele que vem do MacVim retornará corretamente true para has("mac"). Meu palpite é que eles usaram algum patch que realmente faz o teste de recurso funcionar. Se você confiar no has("mac")teste, faça um teste para garantir que ele seja suportado no seu vim.
yegle
26

Para testar uma máquina específica, você pode testar a saída do hostnamecomando. Por exemplo,

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

Você também pode testar o valor das variáveis ​​de ambiente disponíveis:

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

A $DISPLAYvariável também pode ser útil.

garyjohn
fonte
13
hostname () fará isso, por exemplo: se hostname () == 'tigger' ..., sem precisar fazer a chamada do sistema.
Tvon 15/04
O resultado system('hostname')foi machine.mycompany.com\n, então eu tive que mudar o comando substituto para substitute(system('hostname'), '\.\_.*$', '', '').
JPaget
9

Eu tenho esse trecho no meu vimrc:

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

Isso simplesmente é executado source $HOME/.$HOSTNAME.vimrcse existir. Eu usei hostname()e concatenação, você também pode usar o mais sucinto expand('$HOME/.$HOSTNAME.vimrc')se souber que $HOSTNAMEestá sempre definido.

impensado
fonte
7

A resposta anterior sobre a detecção do sistema operacional não detecta o OS X no MacVim para mim (e nem usa has("macunix")como a documentação sugere).

Aqui está o que eu uso para distinguir entre Windows e 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

Observe que has("win32")funcionou para mim, mesmo no Vim de 64 bits no Windows de 64 bits.

Você também pode usar testes semelhantes unamedentro do if has("unix")bloco para distinguir outros sabores do Unix. Basta executar unameou uname -ana linha de comando para ver o que você precisa comparar s:uname with. Veja também :h matchstr()se você precisa comparar apenas uma parte da produção da uname.

Rico
fonte
2

Em muitas máquinas, listar todos os nomes de host em .vimrcpode se tornar entediante, pode ser mais fácil distinguir entre diferentes tipos 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
filante
fonte
Infelizmente, isso quebra nas máquinas Windows.
Oligofren
1

Você pode simplesmente colocar as coisas específicas do sistema operacional em um .gvimrc personalizado para cada máquina e usar um .vimrc comum em todas elas. Ambos os arquivos são lidos quando o GVim é iniciado, apenas .vimrc é lido quando o Vim não gui é iniciado.

Neil
fonte
1

Em relação à separação entre Linux e Windows - você pode simplesmente colocar configurações diferentes .vimrce _vimrc, em conformidade.

bjauy
fonte