Wie bestimme ich das Betriebssystem in elisp?


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.

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
)

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

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.


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

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.