Como posso determinar programaticamente em qual OS Emacs está sendo executado no ELisp?
Eu gostaria de executar um código diferente .emacs
dependendo do sistema operacional.
Respostas:
A system-type
variável:
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.
Para as pessoas mais novas no elisp, um exemplo de uso:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
necessário para os blocos), então uma recomendação para todos não familiarizados com as peculiaridades - verifique esta resposta .
progn
não é necessário se você não tiver outro caso. O que quero dizer com isso é que você pode simplesmente usar em when
vez de if
, o que é equivalente a(if ... (progn ...) '())
cond
assim:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
, não cond
. case
funciona porque system-type
é um símbolo como 'gnu/linux
ou darwin
, não uma string
Criei uma macro simples para executar código facilmente, dependendo do tipo de sistema:
(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!"))
Agora também existe o subsistema Linux para Windows (bash no Windows 10) onde system-type
está gnu/linux
. Para detectar este tipo de sistema, use:
(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")
)
Isso já foi respondido em grande parte, mas para os interessados, eu apenas testei no FreeBSD e lá o valor relatado foi "berkeley-unix".
Há também (nas versões 24-26 pelo menos) system-configuration
, se você quiser ajustar as diferenças no sistema de compilação. No entanto, a documentação desta variável não descreve os valores possíveis que ela pode conter como a documentação da system-type
variável.