Ist es möglich, eine literarische Konfigurationsdatei im Org-Modus mit einer unterstützenden Emacs Lisp-Datei zu instrumentieren?

7

Es ist üblich, Emacs-Konfigurationsdateien im Org-Modus im Programmierstil zu schreiben.

Leider verbessert dies zwar die Lesbarkeit, bringt jedoch erhebliche Programmiernachteile mit sich. Da es keine Sicherungsdatei gibt .el, kennt Emacs nur den Code im aktuellen Quellblock. Dies bedeutet, dass mit Ausnahme des aktuell bearbeiteten Blocks Navigation, Symboldefinition und Flycheck nicht verfügbar sind.

#+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

Gibt es eine Möglichkeit, Emacs anzuweisen, sich zu verwickeln und die generierte .elDatei zu verwenden, um diese Funktionen im Org-Modus bereitzustellen? Eine solche Funktion würde die Wartbarkeit des gebildeten Emacs Lisp-Codes verbessern.

Beachten Sie, dass es zwar eine fantastische Funktion wäre, Flycheck gleichzeitig für Org und Emacs Lisp in einem Puffer arbeiten zu sehen, ich aber nur frage, wie org-editPuffer instrumentiert werden sollen (die Umgebung, die Sie beim Aufrufen erhalten org-edit-special(normalerweise C-c ')). Dies sollte einfacher sein, da es nur einen aktiven Modus für den Puffer gibt.

Ich habe ein Feature - Request auf dem Flycheck Repository geöffnet hier , und es gibt einige relevante Forschung in einer neuen Ausgabe hier . Ich bin jedoch noch nicht in der Lage, eine Lösung zu konstruieren.

Matthew Piziak
quelle
Sie können alle elisp src-Blöcke auswerten, wenn Sie diese Datei öffnen. Fügen Sie einen Hook an find-file-hookusw. hinzu, um festzustellen, ob die emacs config org-Datei geöffnet wird.
Stardiviner
@stardiviner Würdest du bereit sein, deinen Kommentar in eine Antwort zu erweitern? Ich habe nicht genug Kontext, um Ihre vorgeschlagene Lösung zu verstehen.
Matthew Piziak

Antworten:

2

Informationen zur Navigation und Symboldefinition finden Sie unter https://github.com/jkitchin/scimax/blob/master/scimax-literate-programming.el

Sie können eine TAGS-Datei mit Mx scimax-lp-generate-tags generieren.

Danach kann ich mit M- zu Funktionsdefinitionen navigieren. und M-,. Sie müssen die TAGS-Datei mit dieser Funktion aktualisieren, wenn sich die Dinge bewegen und hinzugefügt werden. Möglicherweise kann dies jedoch in einem Save-Buffer-Hook oder so erfolgen. Beachten Sie auch, dass dies Tags relativ zur Organisationsdatei gibt, nicht dort , wo sich die Definitionen in den Quelldateien befinden.

Mx scimax-lp-Signatur-Dokument erhält einige Informationen über das Symbol an der Stelle, wenn es in der Organisationsdatei definiert ist.

Ich habe einen konzeptionellen Weg gefunden, um den Flycheck in src-Blöcken in org-Dateien zum Laufen zu bringen. Die Idee ist, eine Proxy-Datei mit dem verworrenen Code an genau denselben Zeichenpositionen zu haben (dh Sie ändern alle anderen Zeichen in Leerzeichen). Lassen Sie dann flycheck an dieser Datei arbeiten. Übertragen Sie dann die Flycheck-Overlays von der Proxy-Datei in die Originaldatei. Sie richten eine Hook-Funktion ein, um die Proxy-Datei beim Speichern zu aktualisieren und anschließend die Overlays zu aktualisieren. Überraschenderweise funktioniert das ziemlich gut.

Sie können den Code unter https://github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org sehen .

So sieht normalerweise ein schlechtes Stück Code aus Vor dem Scimax-Ob-Flycheck

Nach dem Einschalten des Scimax-Ob-Flycheck-Modus sieht es so aus:

Nach dem Einschalten des Scimax-Ob-Flycheck-Modus

John Kitchin
quelle
Beachten Sie, dass für etwas wie Flycheck es meiner Meinung nach völlig akzeptabel wäre, wenn es nur aktiv wäre, wenn org-edites aufgerufen wird. In diesem Fall wäre nur ein Modus für den Puffer aktiv. Ich habe meine Frage bearbeitet, um dort eine Nuance hinzuzufügen.
Matthew Piziak
Ich habe eine Lösung dafür unter github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org erstellt . Mit Flycheck für eine Proxy-Datei wird mehr oder weniger das getan, was ich oben beschrieben habe. Es gibt wahrscheinlich noch einige Probleme, aber es funktioniert bisher für mich!
John Kitchin
Das ist brilliant! Ich habe jedoch Probleme, es zu reproduzieren. Ich habe eine gestartet emacs -q, Abhängigkeiten installiert und dann ausgeführt, (org-babel-load-file "scimax-ob-flycheck.org")gefolgt von (scimax-ob-flycheck-mode +1). Ich sehe keine Flycheck-Fehler, wenn ich als Test fehlerhaften Code erstelle.
Matthew Piziak
Sie müssen die Datei speichern, die die Proxy-Dateien erstellen soll, und dann einen Flycheck ausführen, nachdem die Datei überprüft wurde. Dann sollten die Overlays übertragen werden. Während die Organisationsdatei geöffnet ist, sollte im selben Verzeichnis eine Datei mit einem md5-Hash und der Erweiterung .el erstellt werden. Wenn Sie sich das ansehen, sollten Sie die Flycheck-Überlagerungen dort sehen. Wenn nicht, ist etwas anderes los. Ich habe das nicht mit einem Vanille-Emacs / Setup versucht, vielleicht kannst du deine Init dafür posten und ich könnte es ausprobieren.
John Kitchin
Ok ja. Ich kann flycheckÜberlagerungen in der md5-hash.elDatei sehen. Ich kann jedoch keine Überlappungen in scimax-ob-flycheck.org(mit scimax-ob-flycheck-modeon) oder bei der Verwendung sehen org-edit-special.
Matthew Piziak
-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)

Der obere Code fügt eine Funktion hinzu, um alle Quellblöcke im Puffer auszuwerten, die Ihrer Datei "init.org" entsprechen. Der Dateiname kann nach Bedarf geändert werden.

Stardiviner
quelle
Ich fürchte, dies macht nichts anderes, als die Blöcke auszuwerten und RESULTSBlöcke hinzuzufügen . Flycheck bleibt unbrauchbar.
Matthew Piziak
flycheck scheint für mich im org-edit-Modus für emacs-lisp gut zu funktionieren. Was macht es nicht für dich?
John Kitchin
@MatthewPiziak Wenn alle Ihre Quellblöcke Emacs-Lisp-Blöcke sind und ausgewertet werden, sollte Ihr gesamter Elisp-Code für Emacs verfügbar sein. Flycheck wird sich dessen bewusst sein. Außerdem funktioniert der Flycheck auch auf meinem org-edit-src-Block einwandfrei.
Stardiviner
@JohnKitchin @stardiviner I get emacs-lisp predicate:nil flycheck-verify-setupaufgrund der Tatsache , dass buffer-file-nameist nilin dem Org SrcPuffer.
Matthew Piziak
Kann buffer-file-nameauf eine temporäre gefälschte Datei gesetzt werden. Aber wenn Sie Flycheck deaktivieren möchten, denke ich, dass Deaktivieren eine gute Lösung ist.
Stardiviner