Làm thế nào để xác định hệ điều hành trong elisp?


Câu trả lời:


98

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.

83

Đố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
)

OK, tôi đã tự đốt cháy mình nhiều lần với các khối nhánh kỳ lạ trong Elisp (nếu- và phần khác được phân tách bằng một dòng mới, 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 .
metakermit

1
@ kermit666 thực sự 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 ...) '())
Điện Cà phê

1
Đã ủng hộ vì tôi đang cố sử dụng "=" và nó không hoạt động.
Philip Daniels

3
@metakermit bạn có thể sử dụng condnhư vậy:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso

Ý tôi là 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
ealfonso

22

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

11

Trong .emacs, không chỉ có system-typemà còn có window-systembiến. Điều này hữu ích khi bạn muốn chọn giữa một số tùy chọn chỉ x, hoặc thiết bị đầu cuối hoặc cài đặt macos.


5

Bây giờ có còn là Linux Subsystem cho Windows (bash trong môi trường Windows 10), nơi system-typegnu/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")
  )

2

Đ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".


0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.