É 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á .el
arquivo 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 .el
arquivo 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-edit
buffers (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.
fonte
find-file-hook
etc para detectar se está abrindo o arquivo org de configuração do emacs.Respostas:
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
Depois de ativar o modo scimax-ob-flycheck, ele se parece com:
fonte
org-edit
for invocado. Nesse caso, haveria apenas um modo ativo para o buffer. Eu editei minha pergunta para adicionar algumas nuances lá.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.flycheck
sobreposições nomd5-hash.el
arquivo. No entanto, não consigo ver nenhuma sobreposição emscimax-ob-flycheck.org
(comscimax-ob-flycheck-mode
on), nem ao usarorg-edit-special
.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.
fonte
RESULTS
blocos. O Flycheck permanece inutilizável.emacs-lisp predicate:nil
flycheck-verify-setup
devido ao fato de quebuffer-file-name
estánil
nosOrg Src
buffers.buffer-file-name
como um arquivo falso temporário. Mas se quiser desativar o flycheck, acho que desativar é uma boa solução.