Vimscript'te işletim sistemini algıla


37

Geçerli işletim sistemini (Windows, Linux, OS X, ..) saf Vimscript (Python veya Perl olmadan ) kullanarak alabilir miyim?

Kullandığım farklı işletim sistemleri için (senkronize) .vimrc'deki farklı ayarları etkinleştirmek istiyorum .


Uygulamak istediğiniz işletim sistemine bağlı davranışlardan bazı örnekler verebilir misiniz?
200_success 16.05

@ 200_success Windows olmayan ortamlarda oldukça işe yaramaz olan MS TFS ve msbuild için bazı komut dosyalarım ve anahtar dosyalarım var, ancak Windows'ta gVim'de tmux desteğine ihtiyacım yok . Ayrıca, farklı sistemlerde yüklü farklı yazı tipleri vardır ve yollar da farklı olabilir.
muffel

Yanıtlar:


42

En iyi yol kullanmaktır has(), bu fonksiyonla Vim'in özelliklerini kontrol edebilirsiniz; İşletim sistemine özgü özellikler :help feature-list:

macunix                 Macintosh version of Vim, using Unix files (OS-X).
unix                    Unix version of Vim.
win32                   Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
win32unix               Win32 version of Vim, using Unix files (Cygwin)

Ve bazı eski (yarı kullanımdan kaldırılmış) sistemler:

amiga                   Amiga version of Vim.
os2                     OS/2 version of Vim.
win16                   Win16 version of Vim (MS-Windows 3.1).
win64                   Win64 version of Vim (MS-Windows 64 bit).
win95                   Win32 version for MS-Windows 95/98/ME.

Örnek:

if has('win32')
    echo "Someone please open the Window(s)!"
endif

Daha fazla esnekliğe sahip alternatif bir yol, harici unamenumarayı aramaktır ; bu, sürüm numarasını vb. Almanızı da sağlar:

let uname = system('uname -a')

unameÇoğu Windows sisteminde bulunmadığını unutmayın .

OS algılama yerine özellik algılama kullanmak genellikle en iyisidir . Örneğin, özelliklerden birini kullanarak veya bazı yolların olup olmadığını kontrol ederek. 200_success 'gönderisi , bu konuda iyi bir genel bakış sunuyor, bu yüzden burada aynı içeriği tekrar etmeyeceğim.has()


5
OS X üzerinde çalışmasını istiyorsanız, romainl'in cevabını not etmek çok önemlidir .
Zengin

İşaretçi için +1:h feature-list
JESii

23

has()iyi bir fikir gibi sesler Mac OS X üzerinde denemek sonu: varsayılan /usr/bin/vim, has('unix')olduğu doğrudur ama hem has('macunix')ve has('mac')olan sahte düzenli MacVim indirme, her üç vardır olurken gerçek GUI veya TUI kullanmak ister.

Bu yüzden en iyi çözüm, has('winXX')Windows ve unameunix benzeri sistemlerin bir karışımıdır . Yeni çıktılı unameuçların çıktısının kullanımdan önce temizlenmesi gerektiğine dikkat edin.

Bir süredir kullandığım, güncellediğim kod win64:

if !exists("g:os")
    if has("win64") || has("win32") || has("win16")
        let g:os = "Windows"
    else
        let g:os = substitute(system('uname'), '\n', '', '')
    endif
endif

Ondan sonra, g:osdeğişkeni içinde herhangi bir yerde kullanabilirsiniz vimrc:

if has("gui_running")
    if g:os == "Darwin"
        set guifont=Fira\ Mono:h12
    elseif g:os == "Linux"
        set guifont=Fira\ Mono\ 10
    elseif g:os == "Windows"
        set guifont=Fira_Mono:h12:cANSI
    endif
endif

Peki, OSX bir UNIX sistemidir, hatta "sertifikalı UNIX" olduğuna inanıyorum. Yani has('unix')doğru. Yine has('macunix')de yanlış olması garip . Bu neredeyse bir böcek gibi geliyor?
Martin Tournoij

1
Biraz araştırma yaptım ve has('macunix')bağlı gibi görünüyor MACOS_X_UNIXeğer kümesi olan unamebir Darwinyer configure... senaryo
Martin Tournoij

İşin garibi, has ("win32")64-bit Vim'de bile benim için çalışıyor gibi görünüyor.
Zengin

@Rich Evet ve bu şekilde belgelenmiştir. Bu gerçekten yapılacak aklı başında bir şey, uygulamanızın 32 veya 64 bit olup olmadığını önemsiyor musunuz? Yapmıyorum. Win32 denmesinin nedeni, Microsoft’un Windows NT API’leri için seçtiği isim. Bazı şeyleri adlandırmak Microsoft'un güçlü noktası değil .
Martin Tournoij

1
has('unix')Windows Git Bash'te de geçerlidir, bu nedenle gerçek unix'i öykünmekten ayırmak çok kullanışlı değildir.
wisbucky

8

Çevre değişkenleri faydalı olacaktır.

Tespit tmuxetmek için if !empty($TMUX)veya kontrol edebilirsiniz if $TERM == 'screen'.

İşletim sistemini ayrıca $MACHTYPE( Bash tarafından ayarlanan ) veya gibi ortam değişkenlerinden de çıkarabilirsiniz $PATH.

TFS gibi bir özelliğin kurulu olup olmadığını tespit etmek için executable()işlevi kullanabilirsiniz .


"$ MACHTYPE (Bash tarafından belirlenir)" . Aslında, eğer bir değişken Bash ile ayarlanırsa, bunun bir ortam değişkeni olmadığı ve basitçe ile vim'de erişemeyeceğiniz anlamına gelir $MACHTYPE. let machtype=system('echo -n $MACHTYPE')İlk gibi bir şey yapman gerekecek .
wisbucky

4

Diğerlerinin de belirttiği gibi, güvenilir bir algılama zor olabilir. Tekerleği yeniden icat etmemek daha iyi, bu yüzden sağlayan ve çalışan vim-misc kütüphanesinden bahsetmek istiyorum .xolox#misc#os#is_mac()xolox#misc#os#is_win()


1

Denedim has('unix'), ancak tüm Linux, Mac ve Windows Git Bash'im truebunun için geri döndüğü için faydalı olmadım .

unameÇok fazla ayrıntı alanı olmadan Linux, Mac, Windows arasında ayrım yaptığı için uygun buldum .

let uname = substitute(system('uname'), '\n', '', '')
" Example values: Linux, Darwin, MINGW64_NT-10.0, MINGW32_NT-6.1

if uname == 'Linux' || uname == 'Darwin'
    " do linux/mac command
else " windows
    " do windows command
endif
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.