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 .emacs
tùy thuộc vào hệ điều hành.
Câu trả lời:
Các system-type
biế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
)
progn
cầ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 .
progn
khô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 when
thay vì if
, đó là tương đương với(if ... (progn ...) '())
cond
như vậy:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
, không phải cond
. case
làm việc kể từ khi system-type
là một biểu tượng như 'gnu/linux
hoặ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-type
là 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-type
biến.