ตรวจจับระบบปฏิบัติการใน Vimscript


37

ฉันสามารถดึงระบบปฏิบัติการปัจจุบัน (Windows, Linux, OS X, .. ) โดยใช้pure Vimscript (ไม่มี Python หรือ Perl) ได้หรือไม่?

ฉันต้องการเปิดใช้งานการตั้งค่าที่แตกต่างกันใน (ซิงโครไนซ์) .vimrcสำหรับระบบปฏิบัติการประเภทต่างๆที่ฉันใช้อยู่


คุณสามารถให้ตัวอย่างที่เฉพาะเจาะจงของพฤติกรรมที่ขึ้นกับระบบปฏิบัติการที่คุณต้องการนำไปใช้หรือไม่?
200_success

@ 200_success ฉันมีสคริปต์และการโยงคีย์สำหรับMS TFSและ msbuild ที่ไร้ประโยชน์ในสภาพแวดล้อมที่ไม่ใช่ Windows ในขณะที่ฉันไม่ต้องการการสนับสนุนtmuxใน gVim บน Windows นอกจากนี้ยังมีแบบอักษรที่แตกต่างกันติดตั้งในระบบที่แตกต่างกันและเส้นทางอาจแตกต่างกันเช่นกัน
muffel

คำตอบ:


42

วิธีที่ดีที่สุดคือใช้has()กับฟังก์ชั่นนี้คุณสามารถตรวจสอบคุณสมบัติของ Vim; คุณสมบัติเฉพาะของระบบปฏิบัติการจาก :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ไม่มีอยู่ในระบบ Windows ส่วนใหญ่

โดยทั่วไปที่ดีที่สุดที่จะใช้ตรวจสอบคุณสมบัติมากกว่าการตรวจสอบระบบปฏิบัติการ ตัวอย่างเช่นโดยใช้หนึ่งในคุณสมบัติในhas()หรือตรวจสอบว่ามีบางเส้นทาง โพสต์ 200_success 'ให้ภาพรวมที่ดีดังนั้นฉันจะไม่ทำซ้ำเนื้อหาเดียวกันที่นี่


5
สำคัญมากที่ต้องทราบคำตอบของ romainlหากคุณต้องการให้มันทำงานบน OS X ได้
Rich

+1 สำหรับตัวชี้ถึง:h feature-list
JESii

23

has()เสียงเหมือนความคิดที่ดีจนกว่าคุณจะลองบน Mac OS X: ในการเริ่มต้น/usr/bin/vim, has('unix')เป็นความจริงแต่ทั้งสองhas('macunix')และhas('mac')มีความผิดพลาดในขณะที่ในปกติดาวน์โหลด MacVim ทั้งสามเป็นจริงไม่ว่าคุณจะใช้ GUI หรือตุ๋ย

ทางออกที่ดีที่สุดคือการผสมผสานระหว่างhas('winXX')Windows และunameระบบ Unix โปรดทราบว่าผลลัพธ์ของการ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')มันผิด เกือบจะฟังดูเหมือนเป็นข้อผิดพลาดแล้วเหรอ?
Martin Tournoij

1
ฉันไม่ได้ตรวจสอบบางส่วนและhas('macunix')ดูเหมือนว่าจะขึ้นอยู่กับMACOS_X_UNIXซึ่งเป็นชุดถ้าunameเป็นDarwinในconfigureสคริปต์ ...
มาร์ติน Tournoij

ผิดปกติพอhas ("win32")ดูเหมือนว่าจะทำงานให้ฉันได้แม้ใน 64-bit Vim
Rich

@ อุดมไปด้วยและนั่นเป็นเอกสารเช่นนี้ นี่เป็นสิ่งที่ต้องทำจริงๆคุณสนใจหรือไม่ว่าแอปของคุณเป็น 32 หรือ 64 บิต? ฉันไม่. เหตุผลที่เรียกว่า 'win32' เป็นเพราะนั่นคือชื่อที่ Microsoft เลือกสำหรับ Windows NT API การตั้งชื่อสิ่งที่ไม่ได้เป็นจุดที่แข็งแกร่งของไมโครซอฟท์
Martin Tournoij

1
has('unix')ก็เป็นจริงใน Windows Git Bash ดังนั้นจึงไม่มีประโยชน์มากสำหรับการแยกยูนิกซ์ที่แท้จริงออกจากอีมูเลเตอร์
wisbucky

8

ตัวแปรสภาพแวดล้อมจะมีประโยชน์

ในการตรวจสอบtmuxคุณสามารถตรวจสอบหรือif !empty($TMUX)if $TERM == 'screen'

นอกจากนี้คุณยังสามารถอนุมานระบบปฏิบัติการจากตัวแปรสภาพแวดล้อมเช่น$MACHTYPE( ซึ่งถูกกำหนดโดยทุบตี ) $PATHหรือ

ในการตรวจสอบว่ามีการติดตั้งคุณสมบัติเช่น TFS หรือไม่คุณสามารถใช้executable()ฟังก์ชั่น


"$ MACHTYPE (ซึ่งถูกกำหนดโดยทุบตี)" $MACHTYPEที่จริงถ้าตัวแปรถูกกำหนดโดยทุบตีนั่นหมายความว่ามันไม่ได้เป็นตัวแปรสภาพแวดล้อมและคุณจะไม่สามารถเข้าถึงได้ในกลุ่มเพียงกับ คุณจะต้องทำอะไรสักอย่างlet machtype=system('echo -n $MACHTYPE')ก่อน
wisbucky

4

ดังที่คนอื่น ๆ ระบุไว้แล้วการตรวจจับที่เชื่อถือได้อาจเป็นเรื่องยุ่งยาก ดีกว่าอย่ารวมวงล้อใหม่ดังนั้นฉันอยากจะพูดถึงห้องสมุดเสียงเรียกเข้าที่ให้xolox#misc#os#is_mac()และxolox#misc#os#is_win()ฟังก์ชั่น


1

ฉันพยายามhas('unix')แล้ว แต่ฉันไม่พบว่ามีประโยชน์เนื่องจาก Linux, Mac และ Windows Git Bash ของฉันคืนมาtrueทั้งหมด

ฉันพบว่าunameมีความเหมาะสมเนื่องจากแยกความแตกต่างระหว่าง Linux, Mac, Windows โดยไม่มีความละเอียดมากเกินไป

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.