Comment déterminer le système d'exploitation dans elisp?


Réponses:


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.

83

Pour les personnes plus récentes sur elisp, un exemple d'utilisation:

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

OK, je me suis brûlé plusieurs fois avec des blocs de branches étranges dans Elisp (si et autre partie séparés par une nouvelle ligne, prognnécessaire pour les blocs), donc une recommandation à tous ceux qui ne sont pas familiers avec les bizarreries - vérifiez cette réponse .
metakermit

1
@ kermit666 prognn'est en fait pas nécessaire si vous n'avez pas d'autre cas. Ce que je veux dire par là, c'est que vous pouvez simplement utiliser à la whenplace de if, ce qui équivaut à(if ... (progn ...) '())
Café électrique

1
J'ai voté pour parce que j'essayais d'utiliser "=" et cela ne fonctionnait pas
Philip Daniels

3
@metakermit vous pouvez utiliser condcomme ceci:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso

Je voulais casedire non cond. casefonctionne depuis system-typeest un symbole comme 'gnu/linuxou darwin, pas une chaîne
ealfonso

22

J'ai créé une macro simple pour exécuter facilement du code en fonction du type de système:

(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!"))

11

Dans un .emacs, il n'y a pas seulement la system-type, mais aussi la window-systemvariable. Ceci est utile lorsque vous souhaitez choisir entre une option x uniquement, un terminal ou un paramètre macos.


5

Maintenant, il existe également un sous-système Linux pour Windows (bash sous Windows 10) où se system-typetrouve gnu/linux. Pour détecter ce type de système, utilisez:

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

2

C'est la plupart du temps déjà répondu, mais pour ceux qui sont intéressés, je viens de tester ceci sur FreeBSD et là la valeur rapportée était "berkeley-unix".


0

Il y a aussi (au moins dans les versions 24-26) system-configuration, si vous souhaitez ajuster les différences dans le système de construction. Cependant, la documentation de cette variable ne décrit pas les valeurs possibles qu'elle peut contenir comme la documentation de la system-typevariable.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.