Як програмно визначити, яка ОС Emacs працює в ELisp?
Я хотів би запустити інший код .emacsзалежно від ОС.
Відповіді:
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.
Для людей, новіших до elisp, зразок використання:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
prognнеобхідна для блоків), тож рекомендація всім, хто не знайомий із примхами - перевірте цю відповідь .
prognне потрібен, якщо у вас немає іншого випадку. Я маю на увазі, що ви можете просто використовувати whenзамість if, що еквівалентно(if ... (progn ...) '())
condтак:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case, ні cond. caseпрацює, оскільки system-typeє символом на зразок 'gnu/linuxабо darwin, а не рядком
Я створив простий макрос для легкого запуску коду залежно від типу системи:
(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!"))
Зараз існує також підсистема 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")
)
На це в основному вже відповіли, але для зацікавлених я просто перевірив це на FreeBSD, і там повідомлялося про значення "berkeley-unix".
Є також (принаймні у версіях 24-26) system-configuration, якщо ви хочете налаштувати на відмінності в системі побудови. Однак документація цієї змінної не описує можливі значення, які вона може містити, як це робить документація system-typeзмінної.