จะตรวจสอบระบบปฏิบัติการใน elisp ได้อย่างไร?


92

ฉันจะตรวจสอบโดยทางโปรแกรมได้อย่างไรว่า OS Emacs ใดกำลังทำงานอยู่ใน ELisp

ฉันต้องการเรียกใช้รหัสอื่น.emacsขึ้นอยู่กับระบบปฏิบัติการ


1
จากคู่มืออ้างอิง GNU Emacs Lisp gnu.org/software/emacs/manual/html_node/elisp/…
WisdomFusion

คำตอบ:


99

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.

83

สำหรับผู้ที่เพิ่งรู้จัก elisp ตัวอย่างการใช้งาน:

(if (eq system-type 'darwin)
  ; something for OS X if true
  ; optional something if not
)

ตกลงฉันเผาตัวเองหลายครั้งด้วยบล็อกสาขาแปลก ๆ ใน Elisp (ถ้า - และส่วนอื่นคั่นด้วยบรรทัดใหม่prognจำเป็นสำหรับบล็อก) ดังนั้นคำแนะนำสำหรับทุกคนที่ไม่คุ้นเคยกับนิสัยใจคอลองดูคำตอบนี้
metakermit

1
@ kermit666 prognไม่จำเป็นจริงๆถ้าคุณไม่มีกรณีอื่น สิ่งที่ฉันหมายถึงคือคุณสามารถใช้whenแทนได้ifซึ่งเทียบเท่ากับ(if ... (progn ...) '())
Electric Coffee

1
โหวตเพิ่มขึ้นเนื่องจากฉันพยายามใช้ "=" แต่มันไม่ได้ผล
Philip Daniels

3
@metakermit คุณสามารถใช้condเช่น:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso

ฉันหมายถึงไม่ได้case ใช้งานได้เนื่องจากเป็นสัญลักษณ์เช่นหรือไม่ใช่สตริงcondcasesystem-type'gnu/linuxdarwin
ealfonso

22

ฉันสร้างมาโครอย่างง่ายเพื่อเรียกใช้โค้ดได้อย่างง่ายดายขึ้นอยู่กับประเภทของระบบ:

(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!"))

11

ใน. emacs ไม่เพียงsystem-typeแต่มีwindow-systemตัวแปรเท่านั้น สิ่งนี้มีประโยชน์เมื่อคุณต้องการเลือกระหว่างตัวเลือก x เท่านั้นหรือการตั้งค่าเทอร์มินัลหรือ macOS


5

ตอนนี้ยังมีระบบย่อยลินุกซ์สำหรับ 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")
  )

2

ส่วนใหญ่เป็นคำตอบแล้ว แต่สำหรับผู้ที่สนใจฉันเพิ่งทดสอบสิ่งนี้บน FreeBSD และมีค่าที่รายงานคือ "berkeley-unix"


0

นอกจากนี้ยังมี (ในเวอร์ชัน 24-26 เป็นอย่างน้อย) system-configurationหากคุณต้องการปรับความแตกต่างในระบบบิลด์ อย่างไรก็ตามเอกสารประกอบของตัวแปรนี้ไม่ได้อธิบายถึง vales ที่เป็นไปได้ซึ่งอาจมีเหมือนกับเอกสารของ system-typeตัวแปร

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