Edit: Enquanto eu ainda estou aprendendo as cordas de Babel, eu li sobre os system-type
, emacs-version
e window-system
variá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!
Respostas:
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
:tangle
argumento da seguinte maneira: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 retornarnil
, 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
.emacs
qual 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
.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:
... na parte superior do seu
.org
arquivo, 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
.org
arquivos 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.)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.)
fonte
C-h <thing>
cabos quando vê algo interessante ou lendo o código de outras pessoas. Boa sorte..!