Bagaimana menentukan sistem operasi di elisp?

92

Bagaimana cara saya secara terprogram menentukan OS Emacs mana yang berjalan di ELisp?

Saya ingin menjalankan kode yang berbeda .emacstergantung pada OS-nya.

ljs
sumber
1
Dari panduan referensi GNU Emacs Lisp gnu.org/software/emacs/manual/html_node/elisp/…
WisdomFusion

Jawaban:

99

The system-typevariabel:

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.dll
sumber
83

Untuk orang-orang yang baru mengenal elisp, contoh penggunaan:

(if (eq system-type 'darwin)
  ; something for OS X if true
  ; optional something if not
)
Endrju
sumber
Oke, saya membakar diri saya sendiri beberapa kali dengan blok cabang aneh di Elisp (jika- dan bagian lain dipisahkan oleh baris baru, progndiperlukan untuk blok), jadi rekomendasi untuk semua orang yang tidak terbiasa dengan kebiasaan - lihat jawaban ini .
metakermit
1
@ kermit666 sebenarnya progntidak diperlukan jika Anda tidak memiliki kasus lain. Yang saya maksud dengan itu adalah Anda bisa menggunakan whensaja if, yang setara dengan(if ... (progn ...) '())
Electric Coffee
1
Suara positif karena saya mencoba menggunakan "=" dan tidak berhasil.
Philip Daniels
3
@metakermit Anda dapat menggunakan condseperti ini:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso
Maksudku case, tidak cond. caseberfungsi karena system-typemerupakan simbol seperti 'gnu/linuxatau darwin, bukan string
ealfonso
22

Saya membuat makro sederhana untuk menjalankan kode dengan mudah tergantung pada jenis sistem:

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

Dalam .emacs, tidak hanya ada system-type, tetapi juga window-systemvariabelnya. Ini berguna ketika Anda ingin memilih di antara beberapa opsi hanya x, atau terminal, atau pengaturan macOS.

Eric
sumber
5

Sekarang ada juga Linux Subsystem untuk Windows (bash di bawah Windows 10) di mana system-typeadalah gnu/linux. Untuk mendeteksi penggunaan jenis sistem ini:

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

Ini sebagian besar sudah dijawab, tetapi bagi mereka yang tertarik, saya baru saja menguji ini di FreeBSD dan di sana nilai yang dilaporkan adalah "berkeley-unix".

Jostein Kjønigsen
sumber
0

Ada juga (setidaknya dalam versi 24-26) system-configuration, jika Anda ingin menyesuaikan perbedaan dalam sistem build. Namun, dokumentasi variabel ini tidak menjelaskan kemungkinan valas yang mungkin dikandungnya seperti dokumentasi system-typevariabel tersebut.

Jürgen A. Erhard
sumber