¿Cómo puedo determinar mediante programación en qué sistema operativo se ejecuta Emacs en ELisp?
Me gustaría ejecutar un código diferente .emacssegún el sistema operativo.
Respuestas:
La system-typevariable:
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
)
prognnecesaria para los bloques), por lo que una recomendación para todos los que no estén familiarizados con las peculiaridades: revise esta respuesta .
prognno es necesario si no tiene otro caso. Lo que quiero decir con eso es que puede usar en whenlugar de if, que es equivalente a(if ... (progn ...) '())
condasí:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case, no cond. casefunciona ya que system-typees un símbolo como 'gnu/linuxo 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-typeestá 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-typevariable.