ฉันจะตรวจสอบโดยทางโปรแกรมได้อย่างไรว่า OS Emacs ใดกำลังทำงานอยู่ใน ELisp
ฉันต้องการเรียกใช้รหัสอื่น.emacs
ขึ้นอยู่กับระบบปฏิบัติการ
ฉันจะตรวจสอบโดยทางโปรแกรมได้อย่างไรว่า OS Emacs ใดกำลังทำงานอยู่ใน ELisp
ฉันต้องการเรียกใช้รหัสอื่น.emacs
ขึ้นอยู่กับระบบปฏิบัติการ
คำตอบ:
system-type
ตัวแปร:
system-type is a variable defined in `C source code'.
Its value is darwin
Documentation:
Value is symbol indicating type of operating system you are using.
Special values:
`gnu' compiled for a GNU Hurd system.
`gnu/linux' compiled for a GNU/Linux system.
`darwin' compiled for Darwin (GNU-Darwin, Mac OS X, ...).
`ms-dos' compiled as an MS-DOS application.
`windows-nt' compiled as a native W32 application.
`cygwin' compiled using the Cygwin library.
Anything else indicates some sort of Unix system.
สำหรับผู้ที่เพิ่งรู้จัก elisp ตัวอย่างการใช้งาน:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
จำเป็นสำหรับบล็อก) ดังนั้นคำแนะนำสำหรับทุกคนที่ไม่คุ้นเคยกับนิสัยใจคอลองดูคำตอบนี้
progn
ไม่จำเป็นจริงๆถ้าคุณไม่มีกรณีอื่น สิ่งที่ฉันหมายถึงคือคุณสามารถใช้when
แทนได้if
ซึ่งเทียบเท่ากับ(if ... (progn ...) '())
cond
เช่น:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
ใช้งานได้เนื่องจากเป็นสัญลักษณ์เช่นหรือไม่ใช่สตริงcond
case
system-type
'gnu/linux
darwin
ฉันสร้างมาโครอย่างง่ายเพื่อเรียกใช้โค้ดได้อย่างง่ายดายขึ้นอยู่กับประเภทของระบบ:
(defmacro with-system (type &rest body)
"Evaluate BODY if `system-type' equals TYPE."
(declare (indent defun))
`(when (eq system-type ',type)
,@body))
(with-system gnu/linux
(message "Free as in Beer")
(message "Free as in Freedom!"))
ใน. emacs ไม่เพียงsystem-type
แต่มีwindow-system
ตัวแปรเท่านั้น สิ่งนี้มีประโยชน์เมื่อคุณต้องการเลือกระหว่างตัวเลือก x เท่านั้นหรือการตั้งค่าเทอร์มินัลหรือ macOS
ตอนนี้ยังมีระบบย่อยลินุกซ์สำหรับ Windows (ทุบตีภายใต้ Windows 10) ที่เป็นsystem-type
gnu/linux
ในการตรวจจับระบบประเภทนี้ให้ใช้:
(if
(string-match "Microsoft"
(with-temp-buffer (shell-command "uname -r" t)
(goto-char (point-max))
(delete-char -1)
(buffer-string)))
(message "Running under Linux subsystem for Windows")
(message "Not running under Linux subsystem for Windows")
)
ส่วนใหญ่เป็นคำตอบแล้ว แต่สำหรับผู้ที่สนใจฉันเพิ่งทดสอบสิ่งนี้บน FreeBSD และมีค่าที่รายงานคือ "berkeley-unix"
นอกจากนี้ยังมี (ในเวอร์ชัน 24-26 เป็นอย่างน้อย) system-configuration
หากคุณต้องการปรับความแตกต่างในระบบบิลด์ อย่างไรก็ตามเอกสารประกอบของตัวแปรนี้ไม่ได้อธิบายถึง vales ที่เป็นไปได้ซึ่งอาจมีเหมือนกับเอกสารของ system-type
ตัวแปร