É possível instrumentar um arquivo de configuração alfabético no modo Org com um arquivo Emacs Lisp de backup?

7

É uma prática comum escrever arquivos de configuração do Emacs usando o estilo de programação alfabética no modo Org.

Infelizmente, enquanto melhora a legibilidade, isso traz importantes desvantagens de programação. Em particular, como não há .elarquivo de backup , o Emacs só reconhece o código no bloco de origem atual. Isso significa que, exceto para o bloco editado atualmente, a navegação, a definição de símbolo e o flycheck estão indisponíveis.

#+BEGIN_SRC emacs-lisp
  (defun literate-but-invisible ()
    (interactive)
    (message "I close my eyes..."))
#+END_SRC

#+BEGIN_SRC emacs-lisp
  (defun humans-can-read-but-emacs-cannot ()
    (interactive)
    (literate-but-invisible) ; No navigation! Flycheck reports undefined symbol!
    (message "...so that the room will be empty"))
#+END_SRC

Existe alguma maneira de dizer ao Emacs para emaranhar e usar o .elarquivo gerado para fornecer esses recursos no modo Org? Esse recurso melhoraria a capacidade de manutenção do código alfabético do Emacs Lisp.

Observe que, embora seja um recurso fantástico ver o Flycheck trabalhando para o Org e o Emacs Lisp simultaneamente em um buffer, estou apenas perguntando sobre como instrumentar os org-editbuffers (o ambiente que você obtém quando invoca org-edit-special(normalmente C-c ')). Isso deve ser mais fácil, pois existe apenas um modo ativo para o buffer.

Abri uma solicitação de recurso no repositório Flycheck aqui e há algumas pesquisas relevantes em outra edição aqui . No entanto, ainda não sou capaz de construir uma solução.

Matthew Piziak
fonte
Você pode avaliar todos os blocos elisp src quando abrir esse arquivo. adicione um gancho no find-file-hooketc para detectar se está abrindo o arquivo org de configuração do emacs.
Stardiviner
@stardiviner Você gostaria de expandir seu comentário em uma resposta? No momento, não tenho contexto suficiente para entender sua solução proposta.
Matthew Piziak

Respostas:

2

Para navegação e definição de símbolo, consulte https://github.com/jkitchin/scimax/blob/master/scimax-literate-programming.el

Você pode gerar um arquivo TAGS com Mx scimax-lp-generate-tags.

Depois disso, posso navegar para definir as definições com M-. e M-. Você precisa atualizar o arquivo TAGS com essa função à medida que as coisas se movimentam e são adicionadas, mas talvez isso possa ser feito em um gancho de buffer de salvamento ou algo assim. Observe também que isso fornece tags relativas ao arquivo organizacional, e não onde as definições estão nos arquivos de origem.

O mx scimax-lp-signature-doc obterá algumas informações sobre o símbolo no momento, se ele estiver definido no arquivo organizacional.

Eu desenvolvi uma maneira conceitual de fazer o flycheck funcionar em src-blocks em org-files. A idéia é ter um arquivo proxy com o código emaranhado, exatamente nas mesmas posições de caracteres (ou seja, você altera todos os outros caracteres para espaços). Em seguida, deixe o flycheck trabalhar nesse arquivo. Em seguida, transfira as sobreposições do flycheck do arquivo proxy para o arquivo original. Você configura uma função de gancho para atualizar o arquivo proxy ao salvar e, em seguida, atualiza as sobreposições. Surpreendentemente, isso funciona muito bem.

Você pode ver o código em https://github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org .

É assim que geralmente parece um código ruim Antes do scimax-ob-flycheck

Depois de ativar o modo scimax-ob-flycheck, ele se parece com:

Depois de ativar o modo scimax-ob-flycheck

John Kitchin
fonte
Observe que, para algo como Flycheck, acho que seria completamente aceitável se estivesse ativo apenas quando org-editfor invocado. Nesse caso, haveria apenas um modo ativo para o buffer. Eu editei minha pergunta para adicionar algumas nuances lá.
Matthew Piziak
Eu criei uma solução para isso em github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org . Ele faz mais ou menos o que descrevi acima usando o flycheck em um arquivo proxy. Provavelmente ainda existem alguns problemas, mas até agora funciona para mim!
19419 John Kitchin
Isto é brilhante! No entanto, tenho problemas para reproduzi-lo. I lançaram um emacs -q, dependências instalados, e em seguida, correu (org-babel-load-file "scimax-ob-flycheck.org")seguido por (scimax-ob-flycheck-mode +1). Não vejo nenhum erro do Flycheck quando crio código quebrado como teste.
Matthew Piziak
Você precisa salvar o arquivo, que deve criar os arquivos proxy, e executar o flycheck neles após a verificação do arquivo, para que as sobreposições sejam transferidas. Enquanto o arquivo organizacional estiver aberto, deve haver um arquivo criado no mesmo diretório com uma extensão md5 hash e .el. Se você procurar nele, deverá ver as sobreposições do flycheck lá. Caso contrário, algo mais está acontecendo. Eu não tentei isso com um emacs / setup de baunilha, talvez você possa postar seu init para isso e eu possa experimentá-lo.
John Kitchin
Ok sim. Eu posso ver flychecksobreposições no md5-hash.elarquivo. No entanto, não consigo ver nenhuma sobreposição em scimax-ob-flycheck.org(com scimax-ob-flycheck-modeon), nem ao usar org-edit-special.
Matthew Piziak 15/10
-2
 (defun org-literate-programming-eval-src-blocks ()
   "Auto evaluate Org buffer all source blocks to get a complete
 project environment when Literate Programming."
   (if (string= (buffer-name) "init.org")
       (org-babel-execute-buffer)))

 (add-hook 'find-file-hook #'org-literate-programming-eval-src-blocks :before)

O código superior adiciona uma função para avaliar todos os blocos de origem no buffer que correspondem ao seu arquivo "init.org". O nome do arquivo pode ser modificado conforme necessário.

stardiviner
fonte
Receio que isso não faça nada, exceto avaliar os blocos e adicionar RESULTSblocos. O Flycheck permanece inutilizável.
Matthew Piziak
o flycheck parece funcionar bem para mim no modo de edição organizacional para o emacs-lisp. O que isso não faz por você?
John Kitchin
@MatthewPiziak Se todos os seus blocos de origem são blocos emacs-lisp e avaliados, então todo o seu código elisp deve estar disponível para o Emacs, o flycheck estará ciente disso. E também, o flycheck também funciona bem no meu bloco org-edit-src-block.
Stardiviner
@JohnKitchin @stardiviner Eu recebo emacs-lisp predicate:nil flycheck-verify-setupdevido ao fato de que buffer-file-nameestá nilnos Org Srcbuffers.
Matthew Piziak 14/10
Pode ser definido buffer-file-namecomo um arquivo falso temporário. Mas se quiser desativar o flycheck, acho que desativar é uma boa solução.
Stardiviner