In Emacs;
Gibt es eine Möglichkeit, beides window-display-table
gleichzeitig buffer-display-table
zu erreichen?
Der Grund ist, ich benutzeHübsche-Strg-L(ausEmacs Goodies ElSkriptpaket) undLeerzeichen(von whitespace.el
, ich glaube, es ist in der Basisdistribution von Emacs, aber ich bin nicht sicher).
- Hübsche-Strg-Lvisualisiert Form-Feeds (
^L
) auf eine angepasste Art und Weise, indem der Eintrag fürC-l
im Fenster-lokalenwindow-display-table
. - Leerzeichenvisualisiert Leerzeichen, Tabulatoren und Zeilenumbrüche durch Setzen von Einträgen im pufferlokalen
buffer-display-table
. (und auch durch die Nutzungfont-lock
der Funktionalität).
Diese Verwendungen kollidieren (oder vielmehr die Verwendung von window-display-table
und buffer-display-table
kollidiert), da, wenn dies window-display-table
nicht der Fall ist, nil
alle buffer-display-table
für jeden in diesem Fenster angezeigten Puffer vollständig überschrieben werden.
Zitat aus demEmacs LispHandbuch:
38.21.2 Aktive Anzeigetabelle
Jedes Fenster kann eine Anzeigetabelle angeben, ebenso wie jeder Puffer. Wenn ein Puffer B im Fenster W angezeigt wird, verwendet die Anzeige die Anzeigetabelle für Fenster W, falls vorhanden.ansonsten, die Anzeigetabelle für Puffer B, falls vorhanden; andernfalls die Standardanzeigetabelle, falls vorhanden. Die ausgewählte Anzeigetabelle wird als „aktive“ Anzeigetabelle bezeichnet.
[...]
(Hervorhebung von mir)
Gibt es also eine einfache Möglichkeit, dies zu konsolidieren? Oder besteht die einzige Möglichkeit darin, einen von beiden so umzucodieren, dass er denselben Mechanismus wie der andere verwendet?
Ich habe überlegt, eine kleine (also noch kleinere) grobe Variante der Formular-Feed-Visualisierung zu schreiben, die mit der Leerraum-Visualisierung kompatibel ist und einfach einen Pufferlade-Hook (oder etwas anderes) verwendet, um einen fest codierten Eintrag für ^L
in das einzufügen buffer-display-table
. Aber ich wüsste gern, ob es eine einfachere Alternative gibt.
BEARBEITEN:Um das Problem zu verdeutlichen, hier ein Auszug aus einer kommentierten „Interactive Lisp“-Sitzung (also aus dem *scratch*
-buffer). Darin sind die Befehle und ihre Ausgabe zu sehen, kommentiert mit den Auswirkungen:
;; Emacs is started with `-q', to not load my init-file(s).
;; First, write some sample text with tabs and line-feeds:
"A tab: and some text
A line-feed:and some text"
;; Make sure that it is a tab on the first line (input by `C-q TAB')
;; and a line-feed on the second line (input by `C-q C-l').
;; These probably won't copy properly into Stack Exchange.
;; This shows the spaces as center-dots, tabs as `>>'-glyphs and
;; new-lines as $'s (or perhaps other glyphs, depending on system
;; setup...). All of them fontified to be dimmed out on yellow/beige/white
;; background.
(whitespace-mode t)
t
;; This turns on pretty-control-l mode. The `^L' above will be
;; prettified... Since this sets the window display table, the glyphs
;; for the spaces/tabs/new-lines will disappear, but the background of
;; spaces/tabs will still be yellow/beige (since that's done with
;; fontification, not display tables).
(pretty-control-l-mode t)
t
;; This turns pretty-control-l mode OFF again. The form-feed will
;; revert to displaying as `^L'. However, the glyphs for the
;; spaces/tabs/new-lines will not re-appear, since this only removes
;; the `C-l'-entry in the window-display-list, not the entire list.
(pretty-control-l-mode 0)
nil
;; Nil the window-display-table, to verify that is the culprit. This
;; will re-enable the glyphs defined by whitespace-mode (since they
;; are still in the buffer display-table).
(set-window-display-table nil nil)
nil
;; To round of; this is my Emacs-version:
(emacs-version)
"GNU Emacs 23.4.1 (i686-pc-linux-gnu, GTK+ Version 2.24.12)
of 2012-09-22 on akateko, modified by Debian"
;;End.
Antwort1
pretty-control-l-mode
Entschuldigen Sie die Probleme. Ich sehe das von Ihnen gemeldete Problem nicht, wenn ich Ihrem Rezept folge. Vielleicht ist die Beschreibung nicht vollständig? Ich kann sowohl als auch einschalten whitespace-mode
, und das Verhalten, das ich bei beiden sehe, scheint normal. Vielleicht gibt es eine benutzerdefinierte Einstellung, die Sie für whitespace-style
oder so verwenden?
Wie dem auch sei, vielleicht würde es helfen, wenn Sie eine solche Änderung vornehmen pretty-control-l-mode
. Wenn ja, lassen Sie es mich wissen und ich werde sie anwenden aufpp-c-l.el
. (Zum Testen setzen Sie die neue Option auf nil
.)
(defcustom pp^L-use-window-display-table-flag t
"Non-nil: use `window-display-table'; nil: use `buffer-display-table`."
:type 'boolean :group 'Pretty-Control-L)
(define-minor-mode pretty-control-l-mode
"Toggle pretty display of Control-l (`^L') characters.
With ARG, turn pretty display of `^L' on if and only if ARG is positive."
:init-value nil :global t :group 'Pretty-Control-L
(if pretty-control-l-mode
(add-hook 'window-configuration-change-hook 'refresh-pretty-control-l)
(remove-hook 'window-configuration-change-hook 'refresh-pretty-control-l))
(walk-windows
(lambda (window)
(let ((display-table (if pp^L-use-window-display-table-flag ; <=========
(or (window-display-table window)
(make-display-table))
(if buffer-display-table
(copy-sequence buffer-display-table)
(make-display-table)))))
(aset display-table ?\014 (and pretty-control-l-mode
(pp^L-^L-display-table-entry window)))
(if pp^L-use-window-display-table-flag ; <=========
(set-window-display-table window display-table)
(setq buffer-display-table display-table))))
'no-minibuf
'visible))
AKTUALISIERT, um Kommentarthread hinzuzufügen, falls Kommentare irgendwann gelöscht werden:
Übrigens frage ich mich, ob die Hierarchie der Anzeigetabellen, die im Dokument beschrieben wird, nicht vielleicht mithilfe einer Art Vererbung angewendet werden sollte. Es scheint ein bisschen primitiv, wenn eine Ebene (z. B. Fenster) eine niedrigere Ebene (z. B. Puffer) vollständig überdeckt. Sie könnten eine Frage dazu an Mx report-emacs-bug senden. – Drew 24. September 2014 um 16:36
Ping? Könnten Sie mir bitte mitteilen, ob die obige Änderung hilft? Danke. – Drew 14. Okt. 2014 um 18:12
Ich habe gerade diese Antwort gelesen (ich war eine Weile nicht in diesem Teil des Internets ...). Ich werde das überprüfen, wenn ich dazu komme, vielleicht in ein paar Tagen oder so. Ich werde mich später mit einer „Antwort genehmigt“ (wenn es funktioniert) oder Kommentaren (sonst), je nach Bedarf, melden. – Johan E 25. Okt. 2014, 22:32
Ich habe die Frage bearbeitet, um ein ausführlicheres Rezept zum Darstellen des Problems hinzuzufügen. Mich würde interessieren, ob Sie dieselben Ergebnisse erzielen. --- Gibt es außerdem eine Möglichkeit, eine systeminstallierte .el-Datei durch eine vom Benutzer bereitgestellte zu ersetzen (ich bin eigentlich nur ein „Benutzer“, kein Lisp-Programmierer ...)? Ich habe keine Lust, mit den von Deb-Paketen installierten Dateien herumzuspielen. (Deshalb habe ich das Problemrezept ausprobiert, bevor ich Ihre Antwort getestet habe ...) – Johan E 27. Okt. 2014, 01:02
Fünf Sekunden nachdem ich den letzten Kommentar geschrieben hatte, wurde mir klar, dass ich den Code einfach inkratzenund führen Sie es zum Testen mit CJ aus. (Sie müssen keine Dateien bearbeiten.) Das Ergebnis: Es funktioniert wunderbar! Vielen Dank! (=> Antwort akzeptiert) Ich würde jedoch trotzdem gerne wissen, ob Sie mit meinem Problemrezept dieselben Ergebnisse erzielen wie ich (bevor Sie den Code patchen). – Johan E 27. Okt. 2014, 01:09
Ich habe gerade Ihr neues Rezept befolgt und alles gesehen, was Sie beschrieben haben (so deutlich). Und dann habe ich den neuen Kommentar gelesen, den Sie gerade hinzugefügt haben. Ich bin froh zu wissen, dass alles gut funktioniert. Danke für Ihr Feedback. – Drew, 27. Okt. 2014, 01:12 Uhr