2009-11-30 32 views
71

¿Cómo puedo determinar mediante programación qué SO Emacs se ejecuta en ELisp?Cómo determinar el sistema operativo en elisp?

Me gustaría ejecutar código diferente en .emacs dependiendo del sistema operativo.

+1

De manual de referencia de GNU Emacs Lisp http://www.gnu.org/software/emacs/manual/html_node/elisp/System-Environment.html – WisdomFusion

Respuesta

80

La variable 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. 
9

En un .emacs, no sólo existe la system-type, sino también la variable window-system. Esto es útil cuando quiere elegir entre alguna opción x solo, o un terminal, o la configuración macos.

64

Para la gente nueva a elisp, un ejemplos de uso:

(if (eq system-type 'darwin) 
    ; something for OS X if true 
    ; optional something if not 
) 
+0

OK, quemados yo mismo varias veces con bloques de rama extraños en Elisp (si-y-otra parte separados por una línea nueva, 'progn' es necesario para bloques), por lo que una recomendación para todos los que no estén familiarizados con las peculiaridades - verifique [esta respuesta] (http: // stackoverflow.com/a/912397/544059) fuera. – metakermit

+1

@ kermit666 en realidad 'progn' no es necesario si no tiene otro caso. Lo que quiero decir con eso es que puedes usar 'when' en lugar de' if', que es equivalente a '(if ... (progn ...) '())' –

+1

Upvoted porque estaba tratando de usar " = "y no estaba funcionando. –

2

Esto sobre todo es ya respondió, pero para aquellos que estén interesados, sólo probado esto en FreeBSD y no el valor reportado fue "Berkeley UNIX".

17

creé una macro simple de ejecutar fácilmente el código dependiendo del 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!")) 
0

También hay (24/25 en al menos) system-configuration, si desea ajustar las diferencias de sistema de construcción.

1

Ahora también existe el Subsistema Linux para Windows (bash en Windows 10) donde system-type es gnu/linux. Para detectar este tipo de sistema de uso:

(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") 
) 
Cuestiones relacionadas