Hinzufügen eines Felds um Text, ohne die Textbreite zu ändern

9

Die Dokumentation von Face - Attribute legt nahe , dass das Hinzufügen eines line-widthder -nauf dem Feld Attribut

Zeichnen Sie eine Linie mit der Breite n, deren oberer und unterer Teil den Raum des zugrunde liegenden Textes einnehmen, um eine Erhöhung der Zeichenhöhe zu vermeiden.

Daher habe ich meiner persönlichen Themendatei für Suchkandidaten ( lazy-highlight) die folgende Zeile hinzugefügt :

`(lazy-highlight ((,class (:box (:line-width -1 :color ,search) :background ,bg1 :foreground ,fg1))))

Dies funktioniert in Anbetracht der Höhe einwandfrei. Die Textbreite ändert sich jedoch wie im folgenden GIF dargestellt:

Geben Sie hier die Bildbeschreibung ein

Gibt es eine Möglichkeit, den linken und rechten Teil des Felds so zu gestalten, dass auch der zugrunde liegende Text belegt wird, sodass sich die Textbreite nicht ändert?

Pouya
quelle
Bleiben die Spalten ausgerichtet, wenn Sie alles markieren?
Melioratus
@ Melioratus, ja die hinzugefügte Breite ist gleichmäßig und konstant.
Pouya

Antworten:

3

Mein Anwendungsfall für diese SE besteht darin, ein Kästchen um das regionGesicht zu haben, sodass der hervorgehobene Bereich in transient-mark-modesichtbar ist, auch wenn sich der Bereich mit einigen anderen Überlagerungen überlappt:

(set-face-attribute 'region nil
                    :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil))

Zum Beispiel mit iedit-mode:

Boxed-Region-Overlay überlappt sich mit iedit-Overlay

Jedes Mal, wenn der Text mit "Boxed Region" hervorgehoben wird, flackert die beschriebene Textbreite.

Der schmutzige Hack, den ich finden könnte, um dieses Flackern zu beseitigen, besteht darin, dem defaultGesicht eine Box mit Hintergrundfarbe hinzuzufügen . Leider würde ein solcher Hack an anderen Stellen eine Reihe von Problemen verursachen, z. B. eine zusätzliche Lücke zwischen den Zeilen oder ein falsches Rendern von Schaltflächen-Widgets (z. B. in Anpassungspuffern).

Die endgültige Lösung finden Sie im folgenden Fehlerbericht (siehe angehängten Patch am Ende des Threads):

Text flackert beweglicher Cursor mit aktiviertem Feld um Text

Diese Lösung wirkt sich auf Emacs-Interna aus und erfordert nach dem Anwenden des Patches eine benutzerdefinierte Emacs-Erstellung.

Ich werde bald die spätere Lösung ausprobieren. Das Problem ist jedoch, dass mein init.elComputer dann nicht mehr mit Standard-Emacs-Builds kompatibel ist und eine zusätzliche Logik verwenden muss, um festzustellen, ob der obige Patch angewendet wird.

Hoffentlich wird dieser Patch nach einigen Tests in die Emacs-Quelle aufgenommen ...

Follow-up 2019-01-21 :

Es scheint, dass der oben genannte Patch nicht mit dem neuesten Emacs-Quellcode kompatibel ist. Ich musste einige Änderungen vornehmen, damit es mit dem aktuellen Emacs Git-Master-Zweig funktioniert. Anstatt einen weiteren Patch zu erstellen, habe ich eine Gabelung bei Github erstellt und einen Zweig von oben mit dem Face-Box-Patch erstellt:

Face-Box-Patch

Das Erstellen von Emacs aus diesem Zweig entspricht dem Erstellen von Emacs-Beständen.

Der folgende init.elCode sollte sowohl mit gepatchten als auch mit Vanilla Emacs-Versionen kompatibel sein:

(unwind-protect
    (condition-case ex
        (set-face-attribute
         'region nil
         :box '(:line-width (-1 . -1)
                            :color "gtk_selection_bg_color"
                            :style nil))
      ('error
       (set-face-attribute
        'region nil
        :box '(:line-width -1
                           :color "gtk_selection_bg_color"
                           :style nil)))))

Es wird nur unter Linux mit GTK + getestet

Victor Rybynok
quelle
Schöner Fund! Es sieht so aus, als ob der Patch vor einem Jahr war, also hoffe ich nicht, dass er akzeptiert wird.
Amitp
Ich habe den Patch angewendet und verwende jetzt gerne die negative Boxbreite :-) Danke!
Amitp
@amitp Vielen Dank für die Bestätigung, dass Alexandres Patch für Sie funktioniert hat! Welche Emacs-Version, welches Betriebssystem und welche GUI verwenden Sie?
Victor Rybynok
Ich verwende die GUI-Version des "Mac Port" . Emacs 26.1.91. Nach dem Anwenden des Patches musste ich eine Mac-spezifische Datei (macterm.c) ändern, um die gleichen Änderungen wie im Rest des Codes vorzunehmen. Ich denke, der Patch macht weit mehr als ich wirklich will. Ich denke (habe aber noch nicht getestet), dass ich in der Lage sein sollte, eabs (s->face->box_line_width)zu max (s->face->box_line_width, 0)und keine anderen Änderungen zu ändern .
Amitp
Nachdem ich es einen Tag lang benutzt habe, sehe ich kleine Pannen. Ich weiß nicht, ob dies an dem Patch oder an meinen Änderungen an macterm.c liegt. Auf jeden Fall bin ich zurückgekehrt.
Amitp