Bagaimana cara saya secara terprogram menentukan OS Emacs mana yang berjalan di ELisp?
Saya ingin menjalankan kode yang berbeda .emacs
tergantung pada OS-nya.
Jawaban:
The system-type
variabel:
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.
Untuk orang-orang yang baru mengenal elisp, contoh penggunaan:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
diperlukan untuk blok), jadi rekomendasi untuk semua orang yang tidak terbiasa dengan kebiasaan - lihat jawaban ini .
progn
tidak diperlukan jika Anda tidak memiliki kasus lain. Yang saya maksud dengan itu adalah Anda bisa menggunakan when
saja if
, yang setara dengan(if ... (progn ...) '())
cond
seperti ini:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
, tidak cond
. case
berfungsi karena system-type
merupakan simbol seperti 'gnu/linux
atau darwin
, bukan string
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!"))
Sekarang ada juga Linux Subsystem untuk Windows (bash di bawah Windows 10) di mana system-type
adalah 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")
)
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".
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-type
variabel tersebut.