Como determinar o sistema operacional no elisp?


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.

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
)

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

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.


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

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.