Como determinar o sistema operacional no elisp?

91

Como posso determinar programaticamente em qual OS Emacs está sendo executado no ELisp?

Eu gostaria de executar um código diferente .emacsdependendo do sistema operacional.

ljs
fonte
1
Do manual de referência do GNU Emacs Lisp gnu.org/software/emacs/manual/html_node/elisp/…
WisdomFusion

Respostas:

98

A system-typevariável:

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
fonte
83

Para as pessoas mais novas no elisp, um exemplo de uso:

(if (eq system-type 'darwin)
  ; something for OS X if true
  ; optional something if not
)
Endrju
fonte
OK, eu me queimei várias vezes com blocos de ramificação estranhos no Elisp (if-and else-part separados por uma nova linha, prognnecessário para os blocos), então uma recomendação para todos não familiarizados com as peculiaridades - verifique esta resposta .
metakermit
1
@ kermit666 na verdade prognnão é necessário se você não tiver outro caso. O que quero dizer com isso é que você pode simplesmente usar em whenvez de if, o que é equivalente a(if ... (progn ...) '())
Café elétrico
1
Votei positivamente porque estava tentando usar "=" e não estava funcionando.
Philip Daniels
3
@metakermit você pode usar condassim:(case system-type ((gnu/linux) "notify-send") ((darwin) "growlnotify -a Emacs.app -m"))
ealfonso
Eu quis dizer case, não cond. casefunciona porque system-typeé um símbolo como 'gnu/linuxou darwin, não uma string
ealfonso
22

Criei uma macro simples para executar código facilmente, dependendo do tipo de sistema:

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

Em um .emacs, não existe apenas o system-type, mas também a window-systemvariável. Isso é útil quando você deseja escolher entre alguma opção somente x, ou um terminal ou configuração de macos.

Eric
fonte
5

Agora também existe o subsistema Linux para Windows (bash no Windows 10) onde system-typeestá gnu/linux. Para detectar este tipo de sistema, use:

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

Isso já foi respondido em grande parte, mas para os interessados, eu apenas testei no FreeBSD e lá o valor relatado foi "berkeley-unix".

Jostein Kjønigsen
fonte
0

Há também (nas versões 24-26 pelo menos) system-configuration, se você quiser ajustar as diferenças no sistema de compilação. No entanto, a documentação desta variável não descreve os valores possíveis que ela pode conter como a documentação da system-typevariável.

Jürgen A. Erhard
fonte