albatros | texte

Emacs 29.2

GNU Emacs 29.2 ist heute veröffentlicht worden. ./configuremakemake install lief unter macOS Ventura problemlos durch.

    GNU Emacs 29.2 (build 1, aarch64-apple-darwin22.6.0, NS appkit-2299.70
    Version 13.6.3 (Build 22G436)) of 2024-01-18

Der Programmstart ist ein bisschen umständlich, weil man erst den Paketinhalt des Programms anzeigen lassen und dann /Applications/Emacs.app/Contents/MacOS/emacs anklicken muss. Bisher alles wie gehabt.

Emacs 29.1.90 IV

Im zurückliegenden Jahr hatte ich definitiv viel Spaß mit Emacs. Ich hätte nie damit gerechnet, dass ich mich noch einmal so intensiv mit meinem wichtigsten Arbeitspferd (neben TeX and Friends und LibreOffice) beschäftigen würde. Mit der Konfiguration von Emacs 29 bin ich nun soweit vorangekommen, dass es eigentlich nur noch um Feinheiten geht.

Vermisst hatte ich im Vanilla Emacs ein Feature, das eigentlich alle Emacsen out of the box boten, mit denen ich seit 2000 gearbeitet hatte, nämlich das automatische Kopieren von markiertem Text in die Zwischenablage. Markierte man Text mit der Maus, landete er direkt, also ohne weiteres „Kopieren“ oder „Ausschneiden“, im Clipboard und konnte direkt wieder an einer anderen Stelle eingefügt werden.

Eine Diskussion im Emacs StackExchange seit dem Oktober 2015 half mir weiter. Mehrere Wege führen demnach zum Ziel. Ich habe mich für die Variable mouse-drag-copy-region entschieden.

If non-nil, copy to kill ring upon mouse adjustments of the region.

Und aus dem Kill Ring gelangt die Region dann eben auch in die Zwischenablage. Das wars.

(setq mouse-drag-copy-region t)

Hat nur eine Änderung beim Editieren zur Folge, an die ich mich jetzt noch gewöhnen müsste: Wenn man einen Hyperlink in Org-Mode einfügen möchte, markiert man den Anker mit der Maus, gefolgt von C-c C-l. Und nun steht im Kill Ring freilich der Anker aus dem Ausgangstext. Wenn man zuvor schon das Linkziel (meist aus der Adresszeile des Webbrowsers) kopiert hatte, geht es verloren. Es ist also besser, den Link erst an dieser Stelle zu kopieren.

Emacs 29.1.90 III

Meine M-x emacs-init-time liegt mittlerweile nochmal ein bisschen niedriger, bei 2 Sekunden.

In den letzten Tagen vor allem an den completion-at-point-functions geschraubt. Bei einem der letzten Updates setzte irgendetwas bei Company aus. Ich kann es leider nicht nachvollziehen.

Eine lebhafte Diskussion auf emacs-devel vergangene Woche lenkte jedenfalls meine Aufmerksamkeit auf die Alternative Corfu mit Cape. Es wurde vorgeschlagen, Company in Emacs zu integrieren, und Corfu wurde als bessere Lösung hingestellt. Das kann ich nach einem ersten Test durchaus bestätigen. Darüber hinaus habe ich ich mir aber auch die Completion bei AUCTeX endlich mal näher angesehen.

Derzeit läuft bei mir diese Lösung sehr schön:

(use-package corfu
  :init
  (global-corfu-mode)
  :config 
  (setq corfu-auto t)
  (setq corfu-auto-prefix 4)
  (setq completion-styles '(basic))
  )
(use-package cape
  :init
  (add-to-list 'completion-at-point-functions #'cape-dabbrev)
  (add-to-list 'completion-at-point-functions #'cape-tex)
  (add-to-list 'completion-at-point-functions #'cape-elisp-block)
  (add-to-list 'completion-at-point-functions #'TeX--completion-at-point)
  )

(use-package tex
  :ensure auctex
  :defer nil
  :config
  (setq TeX-parse-self t) ;; parse on load
  (setq TeX-auto-save t)  ;; parse on save
  (setq-default TeX-master t)
  (setq TeX-auto-untabify t)
  (setq-default TeX-engine 'luatex)
  (setq TeX-electric-escape t)
  (setq TeX-insert-braces t)
  (setq LaTeX-electric-left-right-brace t)
  )
(use-package reftex
  :config
  (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
  (add-hook 'latex-mode-hook 'turn-on-reftex)
  )

Bin mir noch nicht sicher, ob ich auf cape-tex ganz verzichten kann, wenn ich TeX--completion-at-point reinnehme. Geklärt ist nur, dass diese Funktion bei Cape konfiguriert werden muss, und zwar als letzte in der Liste. Sie wird erst zusammen mit AUCTeX geladen und steht erst bereit, nachdem mindestens ein (La)TeX-Buffer geöffnet wurde. Ansonsten gibt es eine Fehlermeldung, und Corfu/Cape funktionieren gar nicht mehr.

Für die Completion im Mini-Buffer nutze ich weiterhin Ivy mit Swiper und Counsel. Im Buffer zum Schreiben jetzt: Corfu mit Cape.

Schön auch zu sehen, dass die Entwicklung solcher Ergänzungen mittlerweile bei Emacs ein Tempo angenommen hat, das so groß ist, dass selbst das EmacsWiki und teilweise auch der StackExchange nicht mehr mitkommen.

Emacs 29.1.90 II

Der Emacs 29.1.90 läuft sehr stabil. Stabiler als Version 29.1, der bei mir bisher zweimal einfror. Wir dürfen uns also auf Version 29.2 freuen. Meine .emacs habe ich währenddessen in Org-Babel überführt. Die exzessiven Kommentare waren so umfangreich, dass das händische Umarbeiten von Emacs Lisp zu Org-Mode drei Tage dauerte. Nun wird die .emacs aus der Org-Datei exportiert, und mein Emacs lädt laut M-x emacs-init-time in 2,5 Sekunden statt in 7,5.

Emacs 29.1.90

Die erste Pretest-Version von GNU Emacs 29.2 ist heute veröffentlicht worden. ./configuremakemake install lief unter macOS Ventura problemlos durch.

GNU Emacs 29.1.90 (build 1, aarch64-apple-darwin22.6.0, NS 
appkit-2299.70 Version 13.6 (Build 22G120)) of 2023-10-19

Der Programmstart ist ein bisschen umständlich, weil man erst den Paketinhalt des Programms anzeigen lassen und dann /Applications/Emacs.app/Contents/MacOS/emacs anklicken muss. Aber dann läuft das Programm doch ziemlich stabil. Ich bin sehr gespannt, was ich damit noch erleben werde. Man kann ja immer noch zum letzten stabilen Release zurückkehren.

Der Wanderer XCIII

Das integrierte Wörterbuch und Lexikon in Emacs dictionary.el kann über M-x dictionary aufgerufen werden. Es ist nicht weiter dokumentiert, insbesondere gibt es keinen Eintrag im Emacs Manual oder in Info. Dabei ist es ziemlich praktisch und lohnt oft einen Aufruf, und sei es nur zur Prokrastination.

Wenn die Wörterbuch-Daten nicht lokal installiert sind, greift das Wörterbuch auf Server-Lösungen zurück. Vor der Kontaktaufnahme mit dem Server – standardmäßig: dict.org – erfolgt eine Nachfrage zur Freigabe.

Je nachdem, wie man die Suche konfiguriert, erhält man ganz unterschiedlich nützliche Ergebnisse. Es lohnt sich deshalb, ein bisschen mit den Optionen zu spielen, um herauszufinden, welche Einstellungen am besten passen. Am brauchbarsten hat es sich für mich erwiesen, all dictionaries zu durchsuchen, und zwar nach exacten Treffern. Beides sind Strings, die nicht korrekt über Customize gesetzt werden konnten. Daher: direkt in die .emacs eintragen.

Per dictionary-use-single-buffer begnügt sich das dictionary mit einem Buffer; standardmäßig öffnet es für jede Anfrage einen eigenen, das ufert leicht aus, deshalb lohnt sich diese Änderung.

Nach einer Anregung von Mickey Peterson habe ich M-# mit der Funktion dictionary-lookup-definition belegt. Damit wird das Wort, auf dem der Cursor gerade steht, direkt an das dictionary übergeben und darin nachgeschlagen. Das Ergebnis wird in einem neuen Buffer ausgegeben, den man durch q wieder schließen kann.

Mickey Peterson schlägt auch vor, das dictionary rechts einzublenden, statt einen eigenen Buffer an der Stelle des aktiven Buffers zu öffnen.

(setq switch-to-buffer-obey-display-actions t)
(add-to-list 'display-buffer-alist
             '("^\\*Dictionary\\*" display-buffer-in-side-window
               (side . right) ; wahlweise: left
               (window-width . 50)))

Das geht mir aber etwas zu weit; ich finde, das Wörterbuch darf durchaus auch etwas mehr Raum beanspruchen, und es ist auch nur auf breiten Bildschirmen wirklich brauchbar, also nicht auf einem normalen MacBook.

Ich belasse es deshalb bei dieser Konfiguration:

(use-package dictionary
  :config
  (setq dictionary-default-dictionary "all")
  (setq dictionary-default-strategy "exact")
  (setq dictionary-use-single-buffer t))
(global-set-key (kbd "M-#") 'dictionary-lookup-definition)

Mit dem Paket osx-dictionary kann man übrigens auch auf die dictionary.app von macOS zugreifen. Das Wort at point wird bei mir per M-' nachgeschlagen. Damit wird eine Funktion von dabbrev überschrieben, das ich nicht brauche. Das Gegenstück zu M-x dictionary-search für beliebige Abfragen ist M-x osx-dictionary-search-input.

(global-set-key (kbd "M-'") 'osx-dictionary-search-word-at-point)

Der Wanderer XCI

Auf der Mailingliste aquamacs-devel bei Google Groups griff gestern ein Benutzer die Ankündigung von Maintainer Win Treese von vor einem Jahr wieder auf, er arbeite an Aquamacs 4.

Win antwortete letzte Nacht, es sei ihm gelungen, einen Aquamacs auf der Basis von GNU Emacs 28.3 unter Apple Silicon zu kompilieren, es gebe aber noch viele Probleme, die er erst ausräumen wolle, bevor er eine Testversion pushen werde. Die Arbeiten seien sehr aufwändig gewesen. Der Code müsse dann im weiteren Verlauf auf die Grundlage von Emacs 29.1 gebracht werden. Während schon an Emacs 30 gearbeitet wird.

Aquamacs ist die einzige Emacs-Distribution, die mit einem vorinstallierten und vorkonfigurierten AUCTeX ausgeliefert wird und die auch auf die systemweite Rechtschreibkorrektur von macOS zurückgreifen kann. Das funktionierte zuletzt auch noch unter Rosetta. Man darf also gespannt sein und Win Treese die Daumen drücken.

Emacs 29.1 XII

Zu den wertvollsten Verbesserungen für Emacs, auf die ich in den letzten Wochen gestoßen war, gehört die Möglichkeit, einen harten Zeilenumbruch leicht wieder rückgängig machen zu können. Das kann Emacs nämlich nicht von Haus aus, Emacs kann nur neu umbrechen und umbrechen und umbrechen. Um einen Umbruch zurückzunehmen, hatte ich früher die wikipedia-unfill-*-Befehle aus dem Wikipedia Mode von Chong Yidong und Uwe Brauer benutzt. Das setzt aber voraus, dass man den Wikipedia Mode zuvor geladen hat. Einfacher zu handhaben ist dagegen der Vorschlag von Stefan Monnier, der im EmacsWiki überliefert ist:

(defun unfill-paragraph (&optional region)
  "Takes a multi-line paragraph and makes it into a single line of text."
  (interactive (progn (barf-if-buffer-read-only) '(t)))
  (let ((fill-column (point-max))
        ;; This would override `fill-column' if it's an integer.
        (emacs-lisp-docstring-fill-column t))
    (fill-paragraph nil region)))
(define-key global-map "\M-1" 'unfill-paragraph)

Man muss den Absatz nicht markieren, die Funktion greift dort, wo der Cursor gerade steht. Als eine schöne motorische Eselsbrücke hat sich bewährt, die neue Funktion global an M-1 zu binden, was direkt neben dem händischen Umbruch per M-q liegt.

Der Wanderer LXXXVIV

Die Umstellung meiner LaTeX-Einführung von HTML auf Org-Mode ist abgeschlossen. Das Projekt steht jetzt als l2intro auf GitHub und kann direkt für meine Website exportiert und installiert werden, ohne weitere Nachbearbeitung.

Bin noch unsicher, ob ich es damit bewenden lasse oder ob ich auch die restliche Website in Org überführe und dann in Zukunft komplett als Publishing-Projekt exportiere.

Emacs 29.1 XI

Es gibt mehrere Completion Frameworks für den GNU Emacs. Sie sollen die Auswahl von Dateien, Buffern, von Variablen und Funktionen erleichtern. Und weil sie immer wieder empfohlen, teilweise geradezu gehypt werden, habe ich die wichtigsten ausprobiert.

  • Ido ist Teil von Emacs. Man muss es also nicht mehr hinzu installieren, sondern nur noch aktivieren. Es verändert den Mini-Buffer, indem eine Auswahl in horizontaler Anordnung gezeigt wird, und man kann diese dann weiter einschränken, indem man weiter tippt, je nach Konfiguration genau oder fuzzy, oder indem man mit dem Cursor nach rechts oder links und RET auswählt. Viel mehr macht Ido nicht. Man kann damit leben.
  • Helm von Thierry Volpiatto wird vielerorts wärmstens empfohlen. Helm hieß früher Anything und wurde dann umbenannt. Es schaltet sich in sämtliche M-x-Dialoge ein und sorgt für eine Autovervollständigung in eigenen Buffern. Helm blendet alle verfügbaren Datei- und Befehlsnamen ein, die irgendwie zum Suchstring passen. Die Auswahl erfolgt über eine Auswahlliste in einem eigenen Buffer, nicht über den Mini-Buffer, in den man den Suchstring eintippt – das ist zu Anfang etwas verwirrend. Ein Nachteil liegt in der Unruhe, die in die Bedienung kommt. Ich meine, vor allem durch Helm wird die Bedienung sogar eher erschwert als erleichtert.
  • Die dritte Lösung, die ich getestet hatte, ist Ivy von Oleh Krehel, das zusammen mit den weiteren Paketen Counsel und Swiper eingesetzt wird. Ivy wurde offenbar von Helm inspiriert, denn der Mini-Buffer wird auch hier zu einer Liste, die man direkt durchsuchen kann; dabei wird sie live gelichtet, und am Ende bleiben nur noch die Datei- und Buffer-Namen übrig, die irgendwie zur Eingabe passen. Beim Durchsuchen eines Buffers mit Swiper werden stattdessen die passenden Zeilen angezeigt, die zu einem Suchmuster passen. Das ist tatsächlich eine Verbesserung der inkrementellen Suche, die ich zu schätzen gelernt habe.
  • Das vierte Completion Framework ist Vertico von Daniel Mendler in Verbindung mit den Paketen Marginalia, Consult, Embark und Orderless. Vertico baut soweit wie möglich auf den bestehenden Funktionen in Emacs auf, bietet sie aber anders dar und erlaubt eine sehr dynamische und interaktive Auswahl. Praktisch ist, dass Marginalia die Kurzbeschreibungen von Paketen, Variablen und Funktionen einblendet, das erleichtert den Überblick erheblich. Insgesamt erinnert es mich aber zu sehr an Helm, das ich nicht mag.

Und so blieb ich am Ende erst einmal bei Ivy, das sich einerseits noch nach Emacs anfühlt, das andererseits aber auch per Swiper eine sehr schöne und nützliche Verbesserung der Isearch mitbringt. Die drei anderen Lösungen habe ich aber noch nicht deinstalliert, sondern erstmal beibehalten, um immer mal wieder testen zu können. Es mag sein, dass sich meine Bedarfe im Laufe der Zeit verändern. Außerdem ist es leichtes Gepäck, denn die nicht genutzten Pakete werden nicht geladen, wenn man sie im Init-File auskommentiert hat.

Der Verzicht auf Completion Frameworks hat aber auch vieles für sich, denn die Bedienung, bei der man Vervollständigungen per TAB und die History der Auswahl per Cursor hoch/runter bedient, ist man schon so lange vom Terminal gewöhnt, dass sie sehr eingängig ist und einfach. Außerdem wird der Zugriff auf das Dateisystem durch die Completion umständlicher. Mein Dateisystem ist Teil meines Wissensmanagements und erschließt das Material, mit dem ich arbeite, auch inhaltlich. Alle Frameworks verändern die Bearbeitung des Speicherpfads im Mini-Buffer, so dass es etwas schwieriger wird, im Pfad zu navigieren, um eine Datei in einem anderen Verzeichnis neu zu speichern. Vieles muss sich also bei der Bedienung neu einspielen, wenn man als erfahrener Emacs-Benutzer solche Lösungen zum ersten Mal einsetzt.

Weniger ist mehr.

Sie sind nicht angemeldet