O Org Babel pode emaranhar condicionalmente os blocos de código com base no tipo de sistema?

10

Edit: Enquanto eu ainda estou aprendendo as cordas de Babel, eu li sobre os system-type, emacs-versione window-systemvariáveis, que soa como eles contêm todas as informações que eu preciso para obter o comportamento que eu descrevi aqui. Na verdade, eu poderia apenas envolver o código específico do SO em condicionais quando necessário em blocos de código. Eu estou querendo saber se esta é a melhor maneira de fazer isso, no entanto.


Estou usando o Babel para escrever arquivos de configuração alfabéticos para o Emacs. Gostaria que meus arquivos de configuração funcionassem em todas as plataformas que uso com freqüência (basicamente várias distribuições Linux e Macs), e parte disso envolve configurações que dependem do sistema (por exemplo, a fonte padrão usada no meu Mac é diferente do que eu uso no Linux Mint).

Embora tenha certeza de ter visto maneiras de reconhecer se estou em um Mac usando elisp (e, portanto, poderia agrupar qualquer configuração específica do sistema em algum tipo de condicional com base nisso), estou me perguntando se Org / Babel tem alguma maneira de detectar o tipo de sistema em que estou, o que me permitiria escrever diferentes blocos de código para diferentes sistemas. Melhor ainda, isso também pode ser feito para diferentes versões do Emacs? Estou visualizando um código que se pareceria com o seguinte (com nomes de plataforma e cabeçalho sendo exemplos inventados)

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some configuration for Linux Mint and GNU Emacs 24+]
#+END_SOURCE

#+Platform: LinuxMint
#+Emacs: GNU Emacs
#+EmacsVersion: 22.1
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Linux Mint and GNU Emacs 22.1]
#+END_SOURCE

#+Platform: Mac
#+Emacs: Aquamacs
#+EmacsVersion: 24+
#+BEGIN_SOURCE EMACS-LISP
    [Some other configuration for Mac and Emacs 24+]
#+END_SOURCE

O peixe grande para fritar é a plataforma, já que a versão do emacs e do emacsen que eu uso provavelmente pode ser inferida disso na maioria das situações. Devo mencionar que a plataforma pode ser mais grossa do que sugeri acima. (Eu realmente só preciso saber se estou em uma distribuição Linux, Windows ou Mac.) Além disso, se esses não são recursos internos, como eu iria criar cabeçalhos de bloco de código como esses?

Edit: Suponho que também pode ser mais provável que algo parecido com o seguinte.

#+BEGIN_SOURCE EMACS-LISP :os Linux :emacs GNU :emacs-version 24+
    [Some configuration for Linux and GNU Emacs 24+]
#+END_SOURCE

Imagino que isso possa ser encontrado em algum lugar da documentação, se existir, mas não consegui encontrar uma lista abrangente de cabeçalhos para blocos de código. Obrigado por qualquer ajuda que você pode fornecer!

Dan
fonte
Veja relacionados: emacs.stackexchange.com/questions/58149/…
mankoff

Respostas:

12

Não tenho certeza de como você poderia extraí-los para cabeçalhos personalizados, mas você pode colocar o ELISP bruto nos argumentos do cabeçalho. Portanto, para emaranhar condicionalmente, você pode simplesmente marcar seu :tangleargumento da seguinte maneira:

#+BEGIN_SRC emacs-lisp :tangle (when (eq system-type 'gnu/linux) "yes")
 (princ "I DO THINGS! (But only on Linux.)")
#+END_SRC

Quando o arquivo é embaraçado e a expressão ELISP " (eq system-type 'gnu/linux)" for verdadeira, ele retornará " "yes"", que se entrelaçará no nome do arquivo padrão para esse bloco de idiomas. Você pode colocar um nome de arquivo também, se preferir. Se a condição retornar nil, o bloco não ficará emaranhado.

Alguns outros tipos de sistema com os quais você pode brincar são " windows-nt" para alguns sistemas operacionais Windows e " darwin" para Mac OSX. Outras informações do sistema (incluindo " emacs-version" como você mencionou) podem ser buscadas usando as variáveis ​​descritas nesta página .

Se esses argumentos do cabeçalho se tornarem pesados, é possível que você tenha uma seção na .emacsqual defina algumas funções que retornam apenas um nome de arquivo para tipos de sistema específicos. Dessa forma, você simplesmente precisa de uma única chamada de função no seu :tangle.


Enquanto eu ainda estou aprendendo as cordas de Babel, li sobre as variáveis ​​de tipo de sistema, emacs-version e window-system, que parecem conter todas as informações necessárias para obter o comportamento descrito aqui . Na verdade, eu poderia apenas envolver o código específico do SO em condicionais quando necessário em blocos de código. Eu estou querendo saber se esta é a melhor maneira de fazer isso, no entanto.

Quando se trata de seu próprio arquivo de configuração, o que for mais confortável para você é a melhor opção ... Mas existem outras maneiras de abordar seu problema, por exemplo, outra possibilidade é ter algo como:

(cond
 ((eq system-type 'gnu-linux)
  (load "linux.el"))
 ((eq system-type 'darwin)
  (load "mac.el"))
 ((eq system-type 'windows-nt)
  (load "windows.el")))

... na parte superior do seu .orgarquivo, e cada bloco específico da plataforma possui um argumento emaranhado que aponta para o respectivo arquivo ... Como " :tangle windows.el" para um pedaço de código específico do Windows.

Outra estratégia possível é criar vários .orgarquivos para sistemas diferentes e (org-babel-load-file ...)aquele para o seu sistema usando as variáveis ​​acima em um (cond ...)bloco como o acima. Dessa forma, você pode evitar completamente qualquer lógica de emaranhamento.

Ainda outra possibilidade seria escrever apenas código independente de plataforma na sua configuração do Emacs - e manter ajustes específicos do sistema na sua .emacs. (É assim que eu faço.)


Imagino que isso possa ser encontrado em algum lugar da documentação, se existir, mas não consegui encontrar uma lista abrangente de cabeçalhos para blocos de código. Obrigado por qualquer ajuda que você pode fornecer!

Existem argumentos de cabeçalho nos arquivos de informações do Emacs. Você pode chegar lá com " e depois ". Também está online aqui .C-h i"mOrg Mode""mSpecific header arguments"

Também há argumentos de cabeçalho específicos do idioma e outras informações aqui. . (Que também está nos arquivos de informações.)

Archenoth
fonte
1
Obrigado por este fantástico escrever. Ainda sou muito novo no uso do emacs (apenas o uso como meu editor principal há mais ou menos um ano e realmente ativamente desde janeiro). Esse era exatamente o tipo de exploração de diferentes opções que eu estava procurando. Eu não tinha ideia de que os cabeçalhos aceitariam elisp assim. Agora só preciso determinar como criar os personalizados ... pelo menos a longo prazo. Obrigado novamente!
Dan
Sem problemas. ^^ Como o Emacs é bastante documentado em quase todos os aspectos, você pode realmente aprender muito apenas explorando a documentação aleatoriamente com os C-h <thing>cabos quando vê algo interessante ou lendo o código de outras pessoas. Boa sorte..!
Archenoth 27/07/2015