Як визначити операційну систему в elisp?


Відповіді:


98

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
Проголосував за те, що я намагався використати "=", але це не спрацювало.
Філіп Деніелс,

3
@metakermit ви можете використовувати condтак:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso

Я мав на увазі case, ні cond. caseпрацює, оскільки system-typeє символом на зразок 'gnu/linuxабо darwin, а не рядком
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

Зараз існує також підсистема Linux для Windows (bash під 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, якщо ви хочете налаштувати на відмінності в системі побудови. Однак документація цієї змінної не описує можливі значення, які вона може містити, як це робить документація system-typeзмінної.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.