Comment déterminer par programme sous quel système d'exploitation Emacs s'exécute dans ELisp?
Je voudrais exécuter un code différent dans .emacs
selon l'OS.
Le 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 à elisp, un exemple d'utilisation:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
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!"))
Dans un .emacs, il n'y a pas seulement le system-type
, mais aussi le window-system
variable. Ceci est utile lorsque vous souhaitez choisir entre une option x uniquement, ou un paramètre de terminal ou de macros.
Maintenant, il existe également un sous-système Linux pour Windows (bash sous Windows 10) où system-type
est 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 (en 24/25 au moins) system-configuration
, si vous souhaitez ajuster les différences dans le système de génération.