¿Cómo puedo determinar mediante programación en qué sistema operativo se ejecuta Emacs en ELisp?
Me gustaría ejecutar un código diferente .emacs
según el sistema operativo.
Respuestas:
La system-type
variable:
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 las personas más nuevas en elisp, un uso de muestra:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
necesaria para los bloques), por lo que una recomendación para todos los que no estén familiarizados con las peculiaridades: revise esta respuesta .
progn
no es necesario si no tiene otro caso. Lo que quiero decir con eso es que puede usar en when
lugar de if
, que es equivalente a(if ... (progn ...) '())
cond
así:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
, no cond
. case
funciona ya que system-type
es un símbolo como 'gnu/linux
o darwin
, no una cadena
Creé una macro simple para ejecutar fácilmente el código según el 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!"))
Ahora también existe el Subsistema Linux para Windows (bash en Windows 10) donde system-type
está gnu/linux
. Para detectar este tipo de sistema, utilice:
(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")
)
Esto ya está respondido en su mayoría, pero para aquellos interesados, acabo de probarlo en FreeBSD y allí el valor informado fue "berkeley-unix".
También hay (en las versiones 24-26 al menos) system-configuration
, si desea ajustar las diferencias en el sistema de compilación. Sin embargo, la documentación de esta variable no describe los posibles valores que puede contener como lo hace la documentación de la system-type
variable.