Как определить операционную систему в elisp?

Ответы:

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 (if- и else-части, разделенные новой строкой, prognнеобходимой для блоков), поэтому рекомендация всем, кто не знаком с причудами - проверьте этот ответ .
метакермит 08
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

Также есть (по крайней мере system-configuration, в версиях 24-26) , если вы хотите отрегулировать различия в системе сборки. Однако в документации по этой переменной не описаны возможные значения, которые она может содержать, как в документации по system-typeпеременной.

Юрген А. Эрхард
источник