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

91

Comment déterminer par programme le système d'exploitation sous lequel Emacs s'exécute dans ELisp?

Je voudrais exécuter un code différent en .emacsfonction du système d'exploitation.

ljs
la source
1
Extrait du manuel de référence GNU Emacs Lisp gnu.org/software/emacs/manual/html_node/elisp/…
WisdomFusion

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.
Scottfrazer
la source
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
)
Endrju
la source
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!"))
Gerstmann
la source
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.

Eric
la source
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")
  )
Konrad Eisele
la source
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".

Jostein Kjønigsen
la source
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.

Jürgen A. Erhard
la source