ฉันสามารถดึงระบบปฏิบัติการปัจจุบัน (Windows, Linux, OS X, .. ) โดยใช้pure Vimscript (ไม่มี Python หรือ Perl) ได้หรือไม่?
ฉันต้องการเปิดใช้งานการตั้งค่าที่แตกต่างกันใน (ซิงโครไนซ์) .vimrcสำหรับระบบปฏิบัติการประเภทต่างๆที่ฉันใช้อยู่
ฉันสามารถดึงระบบปฏิบัติการปัจจุบัน (Windows, Linux, OS X, .. ) โดยใช้pure Vimscript (ไม่มี Python หรือ Perl) ได้หรือไม่?
ฉันต้องการเปิดใช้งานการตั้งค่าที่แตกต่างกันใน (ซิงโครไนซ์) .vimrcสำหรับระบบปฏิบัติการประเภทต่างๆที่ฉันใช้อยู่
คำตอบ:
วิธีที่ดีที่สุดคือใช้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 'ให้ภาพรวมที่ดีดังนั้นฉันจะไม่ทำซ้ำเนื้อหาเดียวกันที่นี่
:h feature-list
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
has('unix')
ถูกต้อง มันแปลกที่has('macunix')
มันผิด เกือบจะฟังดูเหมือนเป็นข้อผิดพลาดแล้วเหรอ?
has('macunix')
ดูเหมือนว่าจะขึ้นอยู่กับMACOS_X_UNIX
ซึ่งเป็นชุดถ้าuname
เป็นDarwin
ในconfigure
สคริปต์ ...
has ("win32")
ดูเหมือนว่าจะทำงานให้ฉันได้แม้ใน 64-bit Vim
has('unix')
ก็เป็นจริงใน Windows Git Bash ดังนั้นจึงไม่มีประโยชน์มากสำหรับการแยกยูนิกซ์ที่แท้จริงออกจากอีมูเลเตอร์
ตัวแปรสภาพแวดล้อมจะมีประโยชน์
ในการตรวจสอบtmux
คุณสามารถตรวจสอบหรือif !empty($TMUX)
if $TERM == 'screen'
นอกจากนี้คุณยังสามารถอนุมานระบบปฏิบัติการจากตัวแปรสภาพแวดล้อมเช่น$MACHTYPE
( ซึ่งถูกกำหนดโดยทุบตี ) $PATH
หรือ
ในการตรวจสอบว่ามีการติดตั้งคุณสมบัติเช่น TFS หรือไม่คุณสามารถใช้executable()
ฟังก์ชั่น
$MACHTYPE
ที่จริงถ้าตัวแปรถูกกำหนดโดยทุบตีนั่นหมายความว่ามันไม่ได้เป็นตัวแปรสภาพแวดล้อมและคุณจะไม่สามารถเข้าถึงได้ในกลุ่มเพียงกับ คุณจะต้องทำอะไรสักอย่างlet machtype=system('echo -n $MACHTYPE')
ก่อน
ดังที่คนอื่น ๆ ระบุไว้แล้วการตรวจจับที่เชื่อถือได้อาจเป็นเรื่องยุ่งยาก ดีกว่าอย่ารวมวงล้อใหม่ดังนั้นฉันอยากจะพูดถึงห้องสมุดเสียงเรียกเข้าที่ให้xolox#misc#os#is_mac()
และxolox#misc#os#is_win()
ฟังก์ชั่น
ฉันพยายาม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