Come rendere le impostazioni VIM dipendenti dal computer in .vimrc?


44

Condivido il mio file di configurazione VIM tra più computer. Tuttavia, desidero che alcune impostazioni siano specifiche per determinati computer.

Ad esempio, le dimensioni dei caratteri sul laptop ad alta risoluzione dovrebbero essere diverse dal desktop a bassa risoluzione. E, cosa ancora più importante, voglio che gVIM su Windows si comporti in modo più windowsy e MacVim su OSX si comporti in modo più maccy e gVIM su Linux si comporti come sempre. (Potrebbe essere uno strano sentimento, ma sono molto abituato a cambiare modalità mentale quando cambio SO)

Esiste un modo per effettuare alcune impostazioni in base alla .vimrcmacchina o al sistema operativo?

Risposte:


44

Rilevamento del sistema operativo in .vimrc:

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

4
Utile anche: has('gui_running')se è necessario distinguere tra la modalità tty e la modalità GUI.
Chris Johnsen,

10
La funzione has () verifica la presenza delle funzionalità di Vim. Non esiste una funzione "linux". L'argomento corretto è 'unix'. Inoltre, l'argomento corretto per OS-X è 'macunix'. C'è anche una funzione 'mac', ma non so se has('mac')sia vero per tutti i Mac o solo per Mac pre-OS-X. Vedi :help feature-listl'elenco completo.
garyjohn,

1
Sì, has('unix'). Errore mio.
Casual Coder

Una risposta molto tardi, ma sì, ha ('mac') i trigger in OSX per me.
Diablo-D3,

1
Ho testato vim 1) fornito con OS X e 2) che ho installato tramite Gentoo Prefix (qualcosa di simile a Homebrew) e 3) che proviene da MacVim. Solo quello proveniente da MacVim restituirà correttamente true per has("mac"). La mia ipotesi è che abbiano usato alcune patch che effettivamente fanno funzionare il test di funzionalità. Se fai affidamento sul has("mac")test, esegui alcuni test per assicurarti che sia supportato su Vim.
yegle,

26

Per verificare una macchina particolare, è possibile verificare l'output del hostnamecomando. Per esempio,

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

Puoi anche testare il valore delle variabili d'ambiente disponibili:

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

La $DISPLAYvariabile può anche essere utile.


13
hostname () lo farà, ad esempio: if hostname () == 'tigger' ..., senza dover effettuare la chiamata di sistema.
tvon,

Il risultato è system('hostname')stato machine.mycompany.com\n, quindi ho dovuto modificare il comando sostitutivo in substitute(system('hostname'), '\.\_.*$', '', '').
JPaget,

9

Ho questo frammento nel mio vimrc:

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

Questo si esegue semplicemente source $HOME/.$HOSTNAME.vimrcse esiste. Ho usato hostname()e concatenato, potresti anche usare il più succinto expand('$HOME/.$HOSTNAME.vimrc')se sai che $HOSTNAMEè sempre impostato.


7

La precedente risposta sul rilevamento del sistema operativo non rileva OS X in MacVim per me (e nemmeno l'utilizzo has("macunix")come suggerisce la documentazione dovrebbe).

Ecco cosa uso per distinguere tra 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

Nota che ha has("win32")funzionato per me, anche in Vim a 64 bit su Windows a 64 bit.

Puoi anche usare test simili unameall'interno del if has("unix")blocco per distinguere altri sapori di Unix. Esegui unameo uname -adalla riga di comando per vedere cosa devi confrontare s:uname with. Vedi anche :h matchstr()se devi confrontare solo una parte dell'output di uname.


2

Con molte macchine, elencare tutti i nomi host .vimrcpuò diventare noioso, potrebbe essere più facile distinguere tra diversi gusti 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

Sfortunatamente, questo si rompe su macchine Windows.
oligofren,

1

Potresti semplicemente mettere le cose specifiche del sistema operativo in un .gvimrc personalizzato per ogni macchina e usare un .vimrc comune su tutte. Entrambi i file vengono letti all'avvio di GVim, solo .vimrc viene letto all'avvio di Vim non gui.


1

Per quanto riguarda la separazione tra Linux e Windows, puoi semplicemente inserire impostazioni diverse .vimrce _vimrc, di conseguenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.