Come faccio a determinare a livello di codice quale sistema operativo è in esecuzione Emacs in ELisp?
Vorrei eseguire codice diverso a .emacs
seconda del sistema operativo.
Risposte:
La system-type
variabile:
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.
Per i nuovi utenti di elisp, un esempio di utilizzo:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
necessaria per i blocchi), quindi una raccomandazione a tutti coloro che non hanno familiarità con le stranezze: controlla questa risposta .
progn
non è necessario se non hai un altro caso. Quello che voglio dire è che puoi semplicemente usare al when
posto di if
, che equivale a(if ... (progn ...) '())
cond
modo:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
, no cond
. case
funziona poiché system-type
è un simbolo come 'gnu/linux
o darwin
, non una stringa
Ho creato una semplice macro per eseguire facilmente il codice a seconda del tipo di 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!"))
Ora c'è anche il sottosistema Linux per Windows (bash sotto Windows 10) dove si system-type
trova gnu/linux
. Per rilevare questo tipo di sistema utilizzare:
(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")
)
Questo è per lo più già risposto, ma per chi fosse interessato, l'ho appena testato su FreeBSD e lì il valore riportato era "berkeley-unix".
C'è anche (almeno nelle versioni 24-26) system-configuration
, se vuoi aggiustare le differenze nel sistema di compilazione. Tuttavia, la documentazione di questa variabile non descrive i possibili valori che può contenere come fa la documentazione della system-type
variabile.