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 .emacs
fonction du système d'exploitation.
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 .emacs
fonction du système d'exploitation.
Réponses:
La system-type
variable:
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.
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
)
progn
nécessaire pour les blocs), donc une recommandation à tous ceux qui ne sont pas familiers avec les bizarreries - vérifiez cette réponse .
progn
n'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 when
place de if
, ce qui équivaut à(if ... (progn ...) '())
cond
comme ceci:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
dire non cond
. case
fonctionne depuis system-type
est un symbole comme 'gnu/linux
ou darwin
, pas une chaîne
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!"))
Maintenant, il existe également un sous-système Linux pour Windows (bash sous Windows 10) où se system-type
trouve 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")
)
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".
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-type
variable.