Vimscript में OS का पता लगाएं


38

क्या मैं शुद्ध विम्सस्क्रिप्ट (कोई पायथन या पर्ल) का उपयोग करके वर्तमान ऑपरेटिंग सिस्टम (विंडोज, लिनक्स, ओएस एक्स, ..) को प्राप्त कर सकता हूं ?

मैं विभिन्न प्रकार के ऑपरेशन सिस्टम के लिए अपने (सिंक्रोनाइज़्ड) .vimrc में अलग-अलग सेटिंग्स इनेबल करना चाहता हूं।


क्या आप ओएस-निर्भर व्यवहार के कुछ विशिष्ट उदाहरण प्रदान कर सकते हैं जिन्हें आप लागू करना चाहते हैं?
200_सेक्यूट

@ 200_ असफल मुझे एमएस टीएफएस और एमएसबिल्ट के लिए कुछ स्क्रिप्ट और महत्वपूर्ण बाइंडिंग हैं जो गैर-विंडोज वातावरण में बहुत बेकार हैं, जबकि मुझे विंडोज पर जीवीएम में tmux समर्थन की आवश्यकता नहीं है । इसके अलावा, अलग-अलग सिस्टम पर अलग-अलग फोंट स्थापित किए गए हैं, और पथ अलग-अलग भी हो सकते हैं।
मफेल

जवाबों:


42

उपयोग करने का सबसे अच्छा तरीका है has(), इस फ़ंक्शन के साथ आप विम की सुविधाओं की जांच कर सकते हैं; से ओएस विशिष्ट विशेषताएं :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)

और कुछ पुराने (अर्ध-पदावनत) सिस्टम:

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.

उदाहरण:

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

अधिक लचीलेपन के साथ एक वैकल्पिक तरीका बाहरी कॉल करना है uname, इससे आपको संस्करण संख्या प्राप्त करने की अनुमति मिलती है और जैसे:

let uname = system('uname -a')

ध्यान दें कि unameअधिकांश विंडोज सिस्टम पर मौजूद नहीं है।

ओएस डिटेक्शन के बजाय फीचर डिटेक्शन का उपयोग करना सबसे अच्छा है । उदाहरण के लिए, यदि कोई रास्ता मौजूद है, तो सुविधाओं में से किसी एक का उपयोग करके या जाँच करके। 200_success 'की पोस्ट एक अच्छा अवलोकन देती है, इसलिए मैं यहाँ पर वही सामग्री नहीं दोहराऊँगा।has()


5
रोमैन के जवाब को नोट करना बहुत महत्वपूर्ण है यदि आप चाहते हैं कि यह ओएस एक्स पर काम करे, हालांकि।
रिच

सूचक के लिए +1:h feature-list
JESii

24

has()एक अच्छा विचार की तरह लगता है जब तक आप मैक ओएस एक्स पर यह कोशिश: डिफ़ॉल्ट रूप में /usr/bin/vim, has('unix')है सच , लेकिन दोनों has('macunix')और has('mac')कर रहे हैं झूठी जबकि, नियमित रूप से MacVim डाउनलोड में, सभी तीन हैं सच है कि क्या आप जीयूआई या TUI का उपयोग करें।

तो सबसे अच्छा समाधान has('winXX')विंडोज के लिए और unameयूनिक्स जैसी प्रणालियों का मिश्रण है। ध्यान दें कि unameएक नई रेखा के साथ समाप्त होता है ताकि उपयोग से पहले इसे साफ किया जाना चाहिए।

यहां वह कोड है जो मैं थोड़ी देर के लिए उपयोग कर रहा हूं, इसके लिए अपडेट किया गया 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

उसके बाद, आप g:osअपने में कहीं भी चर का उपयोग कर सकते हैं 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

खैर, OSX एक UNIX प्रणाली है, मेरा मानना ​​है कि यह "प्रमाणित UNIX" भी है। तो has('unix')सटीक है। has('macunix')हालांकि यह गलत है कि यह गलत है। यह लगभग एक बग की तरह लगता है?
मार्टिन टूरनोइज

1
मैंने कुछ जाँच की, और has('macunix')यह निर्भर करता है MACOS_X_UNIX, जो स्क्रिप्ट में unameहै अगर सेट Darwinकिया गया है configure...
मार्टिन Tournoij

अजीब तरह से, has ("win32")64-बिट विम में भी मेरे लिए काम करने लगता है।
रिच

@Rich हाँ, और इस तरह के रूप में प्रलेखित है। यह वास्तव में करने के लिए समझदार बात है, क्या आपको परवाह है कि क्या आपका ऐप 32 या 64 बिट्स है? मैं नही। इसे 'win32' कहा जाता है, इसका कारण यह है कि Microsoft अपने Windows NT API के लिए नाम का चयन करता है। नामकरण चीजें Microsoft का मजबूत बिंदु नहीं है
मार्टिन टूरनोइज

1
has('unix')विंडोज गिट बैश पर भी सही है, इसलिए यह वास्तविक यूनिक्स को अनुकरण से अलग करने के लिए बहुत उपयोगी नहीं है।
वारबैंक

8

पर्यावरण चर उपयोगी होगा।

पता लगाने के लिए tmux, आप जाँच कर सकते हैं if !empty($TMUX)या if $TERM == 'screen'

आप ऑपरेटिंग सिस्टम को पर्यावरण वैरिएबल से भी घटा सकते हैं जैसे $MACHTYPE( जो बैश द्वारा सेट किया गया है ) या $PATH

यह पता लगाने के लिए कि क्या TFS जैसी कोई सुविधा स्थापित है, आप executable()फ़ंक्शन का उपयोग कर सकते हैं ।


"$ MACHTYPE (जो बैश द्वारा सेट किया गया है)" । दरअसल, यदि बैश द्वारा एक वैरिएबल सेट किया गया है, तो इसका मतलब है कि यह एक पर्यावरण वैरिएबल नहीं है, और आप इसे केवल साथ में ही एक्सेस नहीं कर पाएंगे $MACHTYPE। आपको let machtype=system('echo -n $MACHTYPE')पहले जैसा कुछ करना होगा ।
बुद्धिमानबीम

4

जैसा कि दूसरों ने पहले ही संकेत दिया है, एक विश्वसनीय पहचान मुश्किल हो सकती है। बेहतर पहिया को सुदृढ़ नहीं करते हैं, इसलिए मैं विम-मिस लाइब्रेरी का उल्लेख करना चाहता हूं , जो प्रदान करता है xolox#misc#os#is_mac()और xolox#misc#os#is_win()कार्य करता है।


1

मैंने कोशिश की has('unix'), लेकिन मैं अपने सभी लिनक्स, मैक और विंडोज गेट बैश के बाद से इसे मददगार नहीं पाया true

मुझे unameयह उपयुक्त लगा क्योंकि यह बहुत अधिक ग्रैन्युलैरिटी के बिना लिनक्स, मैक, विंडोज के बीच अंतर करता है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.