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 .el
Datei 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-edit
Puffer 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.
quelle
find-file-hook
usw. hinzu, um festzustellen, ob die emacs config org-Datei geöffnet wird.Antworten:
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
Nach dem Einschalten des Scimax-Ob-Flycheck-Modus sieht es so aus:
quelle
org-edit
es 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.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.flycheck
Überlagerungen in dermd5-hash.el
Datei sehen. Ich kann jedoch keine Überlappungen inscimax-ob-flycheck.org
(mitscimax-ob-flycheck-mode
on) oder bei der Verwendung sehenorg-edit-special
.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.
quelle
RESULTS
Blöcke hinzuzufügen . Flycheck bleibt unbrauchbar.emacs-lisp predicate:nil
flycheck-verify-setup
aufgrund der Tatsache , dassbuffer-file-name
istnil
in demOrg Src
Puffer.buffer-file-name
auf eine temporäre gefälschte Datei gesetzt werden. Aber wenn Sie Flycheck deaktivieren möchten, denke ich, dass Deaktivieren eine gute Lösung ist.