ELisp'de hangi OS Emacs'ın çalıştığını programlı olarak nasıl belirleyebilirim?
.emacs
İşletim sistemine bağlı olarak farklı kod çalıştırmak istiyorum .
Yanıtlar:
system-type
değişken:
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.
Daha yeni olan kişiler için örnek bir kullanım:
(if (eq system-type 'darwin)
; something for OS X if true
; optional something if not
)
progn
bloklar için gerekli), bu yüzden tuhaflıklara aşina olmayan herkese bir öneri - bu yanıtı kontrol edin .
progn
başka bir vakanız yoksa aslında gerekli değildir. Bununla demek istediğim, when
bunun yerine kullanabilirsiniz if
, ki bu da eşdeğerdir(if ... (progn ...) '())
cond
:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
case
istemedim cond
. case
çünkü dizge system-type
gibi bir sembol 'gnu/linux
ya da darwin
değil
Sistem türüne bağlı olarak kodu kolayca çalıştırmak için basit bir makro oluşturdum:
(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!"))
Şimdi Windows için Linux Alt Sistemi (Windows 10 altında bash) system-type
var gnu/linux
. Bu sistem türünü tespit etmek için şunu kullanın:
(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")
)
Bu çoğunlukla yanıtlanmıştır, ancak ilgilenenler için bunu FreeBSD'de test ettim ve orada rapor edilen değer "berkeley-unix" idi.
Ayrıca system-configuration
, derleme sistemindeki farklılıkları ayarlamak istiyorsanız (en az 24-26 sürümlerinde) vardır . Ancak, bu değişkenin dokümantasyonu, system-type
değişkenin dokümantasyonunda olduğu gibi içerebileceği olası değerleri açıklamaz .