Wie bestimme ich das Betriebssystem in elisp?

91

Wie bestimme ich programmgesteuert, unter welchem ​​Betriebssystem Emacs in ELisp ausgeführt wird?

Ich möchte .emacsje nach Betriebssystem unterschiedlichen Code ausführen .

ljs
quelle
1
Aus dem GNU Emacs Lisp Referenzhandbuch gnu.org/software/emacs/manual/html_node/elisp/…
WisdomFusion

Antworten:

98

Die 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
quelle
83

Für Leute, die neu in Elisp sind, eine Beispielverwendung:

(if (eq system-type 'darwin)
  ; something for OS X if true
  ; optional something if not
)
Endrju
quelle
OK, ich habe mich mehrmals mit seltsamen Verzweigungsblöcken in Elisp verbrannt (if- und else-Teil durch eine neue Zeile getrennt, prognnotwendig für Blöcke), also eine Empfehlung an alle, die mit den Macken nicht vertraut sind - lesen Sie diese Antwort .
Metakermit
1
@ kermit666 wird eigentlich prognnicht benötigt, wenn Sie keinen anderen Fall haben. Was ich damit meine ist, dass Sie nur whenanstelle von verwenden können if, was gleichbedeutend ist mit(if ... (progn ...) '())
Electric Coffee
1
Upvoted, weil ich versucht habe, "=" zu verwenden und es nicht funktioniert hat.
Philip Daniels
3
@metakermit können Sie condwie folgt verwenden :(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso
Ich meinte casenicht cond. casefunktioniert da system-typeist ein Symbol wie 'gnu/linuxoder darwin, kein String
ealfonso
22

Ich habe ein einfaches Makro erstellt, um Code je nach Systemtyp einfach auszuführen:

(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
quelle
11

In einem .emacs gibt es nicht nur die system-type, sondern auch die window-systemVariable. Dies ist nützlich, wenn Sie zwischen einer Option nur x oder einer Terminal- oder Macos-Einstellung wählen möchten.

Eric
quelle
5

Jetzt gibt es auch Linux Subsystem für Windows (Bash unter Windows 10), wo system-typeist gnu/linux. Um diesen Systemtyp zu erkennen, verwenden Sie:

(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
quelle
2

Dies ist meistens bereits beantwortet, aber für Interessierte habe ich dies gerade auf FreeBSD getestet und dort war der gemeldete Wert "berkeley-unix".

Jostein Kjønigsen
quelle
0

Es gibt auch (zumindest in den Versionen 24-26) system-configuration, wenn Sie Unterschiede im Build-System berücksichtigen möchten. In der Dokumentation dieser Variablen werden jedoch nicht die möglichen Werte beschrieben, die sie enthalten kann, wie dies in der Dokumentation der system-typeVariablen der Fall ist.

Jürgen A. Erhard
quelle