Come determinare il sistema operativo in elisp?


Risposte:


98

La system-typevariabile:

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

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
)

OK, mi sono bruciato più volte con strani blocchi di diramazione in Elisp (se e altro sono separati da una nuova riga, prognnecessaria per i blocchi), quindi una raccomandazione a tutti coloro che non hanno familiarità con le stranezze: controlla questa risposta .
metakermit

1
@ kermit666 in realtà prognnon è necessario se non hai un altro caso. Quello che voglio dire è che puoi semplicemente usare al whenposto di if, che equivale a(if ... (progn ...) '())
Electric Coffee

1
Votato perché stavo cercando di usare "=" e non funzionava.
Philip Daniels

3
@metakermit puoi usare in questo condmodo:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso

Volevo dire case, no cond. casefunziona poiché system-typeè un simbolo come 'gnu/linuxo darwin, non una stringa
ealfonso

22

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

11

In un .emacs, non c'è solo la system-type, ma anche la window-systemvariabile. Ciò è utile quando si desidera scegliere tra un'opzione solo x, un terminale o un'impostazione macos.


5

Ora c'è anche il sottosistema Linux per Windows (bash sotto Windows 10) dove si system-typetrova 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")
  )

2

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".


0

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-typevariabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.