Làm cách nào để xác định theo chương trình Emacs đang chạy hệ điều hành nào trong ELisp?
Tôi muốn chạy mã khác nhau .emacstùy thuộc vào hệ điều hành.
Câu trả lời:
Các system-typebiến:
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.
Đối với những người mới làm quen với elisp, một cách sử dụng mẫu:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progncần thiết cho các khối), vì vậy, một khuyến nghị cho tất cả mọi người không quen thuộc với các khối - hãy xem câu trả lời này .
prognkhông cần thiết nếu bạn không có trường hợp khác. Những gì tôi có ý nghĩa bởi đó là bạn chỉ có thể sử dụng whenthay vì if, đó là tương đương với(if ... (progn ...) '())
condnhư vậy:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case, không phải cond. caselàm việc kể từ khi system-typelà một biểu tượng như 'gnu/linuxhoặc darwin, không phải là một chuỗi
Tôi đã tạo một macro đơn giản để dễ dàng chạy mã tùy thuộc vào loại hệ thống:
(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!"))
Bây giờ có còn là Linux Subsystem cho Windows (bash trong môi trường Windows 10), nơi system-typelà gnu/linux. Để phát hiện loại hệ thống này, hãy sử dụng:
(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")
)
Điều này hầu hết đã được trả lời, nhưng đối với những người quan tâm, tôi vừa thử nghiệm điều này trên FreeBSD và ở đó giá trị được báo cáo là "berkeley-unix".
Ngoài ra còn có (ít nhất là trong các phiên bản 24-26) system-configuration, nếu bạn muốn điều chỉnh sự khác biệt trong hệ thống xây dựng. Tuy nhiên, tài liệu về biến này không mô tả các giá trị có thể có mà nó có thể chứa giống như tài liệu về system-typebiến.