Bagaimana membuat pengaturan VIM bergantung pada komputer di .vimrc?

44

Saya membagikan file konfigurasi VIM saya di antara beberapa komputer. Namun, saya ingin beberapa pengaturan spesifik untuk komputer tertentu.

Misalnya, ukuran font pada laptop resolusi tinggi harus berbeda dengan desktop resolusi rendah. Dan yang lebih penting, saya ingin gVIM di Windows untuk berperilaku lebih windowsy dan MacVim di OSX untuk berperilaku lebih maccy dan gVIM di Linux untuk berperilaku seperti biasa. (Itu mungkin sentimen aneh, tapi saya sangat terbiasa untuk beralih mode mental ketika berpindah OS)

Apakah ada cara untuk membuat beberapa pengaturan di .vimrcmesin-atau OS-dependent?

bastibe
sumber

Jawaban:

44

Deteksi OS di .vimrc:

if has('win32')
    ......
elseif has('mac')
    ......
elseif has('unix')
    ......
endif
Coder Kasual
sumber
4
Juga berguna: has('gui_running')jika Anda perlu membedakan antara mode tty dan mode GUI.
Chris Johnsen
10
Fungsi has () menguji keberadaan fitur Vim. Tidak ada fitur 'linux'. Argumen yang tepat adalah 'unix'. Argumen yang tepat untuk OS-X adalah 'macunix'. Ada juga fitur 'mac', tapi saya tidak tahu apakah has('mac')itu benar untuk semua Mac atau hanya Mac OS-X. Lihat :help feature-listdaftar lengkapnya.
garyjohn
1
Ya, has('unix'). Kesalahanku.
Casual Coder
Jawaban yang sangat terlambat, tapi ya, memiliki ('mac') pemicu di OSX untuk saya.
Diablo-D3
1
Saya telah menguji vim 1) yang datang dengan OS X, dan 2) yang saya instal melalui Gentoo Prefix (mirip dengan Homebrew), dan 3) yang berasal dari MacVim. Hanya yang berasal dari MacVim yang akan mengembalikan true dengan benar has("mac"). Dugaan saya adalah bahwa mereka menggunakan beberapa tambalan yang benar-benar membuat fitur tes berfungsi. Jika Anda mengandalkan has("mac")tes, lakukan beberapa tes untuk memastikan itu didukung pada vim Anda.
yegle
26

Untuk menguji mesin tertentu, Anda dapat menguji output dari hostnameperintah. Sebagai contoh,

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

Anda juga dapat menguji nilai variabel lingkungan yang tersedia:

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

The $DISPLAYvariabel juga dapat berguna.

garyjohn
sumber
13
hostname () akan melakukan ini, misalnya: jika hostname () == 'tigger' ..., tanpa harus melakukan panggilan sistem.
tvon
Hasilnya system('hostname')adalah machine.mycompany.com\n, jadi saya harus mengubah perintah pengganti substitute(system('hostname'), '\.\_.*$', '', '').
JPaget
9

Saya memiliki cuplikan ini di vimrc:

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

Ini hanya dijalankan source $HOME/.$HOSTNAME.vimrcjika ada. Saya sudah menggunakan hostname()dan penggabungan, Anda juga bisa menggunakan lebih ringkas expand('$HOME/.$HOSTNAME.vimrc')jika Anda tahu bahwa $HOSTNAMEselalu ditetapkan.

tidak terpikirkan
sumber
7

Jawaban sebelumnya tentang deteksi OS tidak mendeteksi OS X di MacVim untuk saya (dan juga tidak menggunakan has("macunix")seperti yang disarankan oleh dokumentasi).

Inilah yang saya gunakan untuk membedakan antara Windows dan 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

Catatan yang has("win32")bekerja untuk saya, bahkan dalam 64 bit Vim pada Windows 64 bit.

Anda juga bisa menggunakan tes serupa unamedi dalam if has("unix")blok untuk membedakan rasa Unix lainnya. Jalankan saja unameatau uname -adari baris perintah untuk melihat apa yang perlu Anda bandingkan s:uname with. Lihat juga :h matchstr()jika Anda perlu membandingkan hanya sebagian dari output uname.

Kaya
sumber
2

Dengan banyak mesin, daftar semua nama host di .vimrcdapat menjadi membosankan, mungkin lebih mudah untuk membedakan antara rasa unix yang berbeda:

" 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
filant
sumber
Sayangnya, ini rusak pada mesin windows.
oligofren
1

Anda bisa memasukkan hal-hal khusus-OS ke dalam kustom .gvimrc untuk setiap mesin, dan menggunakan .vimrc umum pada semuanya. Kedua file dibaca ketika GVim dimulai, hanya .vimrc dibaca ketika Vim non-gui dimulai.

Neil
sumber
1

Mengenai pemisahan antara Linux dan Windows - Anda dapat dengan mudah memasukkan pengaturan yang berbeda .vimrcdan _vimrc, karenanya.

bjauy
sumber