¿Cómo determinar el sistema operativo en elisp?

Respuestas:

98

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.
Scottfrazer
fuente
83

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
)
Endrju
fuente
De acuerdo, me quemé varias veces con bloques de ramas extraños en Elisp (si- y otra parte separada por una nueva línea, prognnecesaria para los bloques), por lo que una recomendación para todos los que no estén familiarizados con las peculiaridades: revise esta respuesta .
metakermit
1
@ kermit666 en realidad 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 ...) '())
Café eléctrico
1
Voto a favor porque estaba tratando de usar "=" y no estaba funcionando.
Philip Daniels
3
@metakermit puedes usar condasí:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso
Quise decir case, no cond. casefunciona ya que system-typees un símbolo como 'gnu/linuxo darwin, no una cadena
ealfonso
22

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!"))
Gerstmann
fuente
11

En un .emacs, no solo existe el system-type, sino también la window-systemvariable. Esto es útil cuando desea elegir entre alguna opción de solo x, o una configuración de terminal o macos.

Eric
fuente
5

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")
  )
Konrad Eisele
fuente
2

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".

Jostein Kjønigsen
fuente
0

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.

Jürgen A. Erhard
fuente