org-block-background-Schriftart hat keine Wirkung

9

Ich benutze variable-pitch-modemit orgPuffern. Normalerweise setze ich org-blockauf fixed-pitchund den Code zwischen #+BEGIN_SRCund werde #+END_SRCordnungsgemäß als Schriftarten mit fester Breite gerendert, auch mit korrekter Syntaxhervorhebung. Ab letzter Woche wurde das Gesicht aus irgendeinem Grund, obwohl die Codeblockschrift immer noch die richtige Syntaxhervorhebung aufwies, das gleiche wie variable-pitch-facebei normalen Texten im Organisationsmodus. Ich aktualisiere meine Pakete regelmäßig und glaube, dass ein Update org-modedas Problem verursacht hat, bin mir aber nicht sicher, was passiert ist.


Aktualisieren:

Es stellt sich heraus, dass dies tatsächlich mit org-block-backgroundface zusammenhängt, das in org version 8.3.1 in commit entfernt wurde f8b42e8, also mit dem fehler . Ich bin mir nicht sicher, ob es noch eine Lösung gibt. /programming/26290924/fontify-r-code-blocks-in-org-mode-8 https://lists.gnu.org/archive/html/emacs-orgmode/2015-08/msg00510 .html

Ich sperre gerade meine Org-Modus-Version auf die ältere.


Update 2:

Die neueste Version im Org-Modus, Version 9.0.0, lässt offenbar src-blocksdas org-blockGesicht erben , während das org-block-backgroundGesicht veraltet ist. Wenn Sie jetzt nur das org-blockGesicht einstellen , sollten Sie in der Lage sein, Schriftarten mit fester Breite für alle Codes zu haben.

xji
quelle
@rasmus Danke für den Patch. Dies scheint jedoch in einem #BEGIN_EXAMPLEBlock zu funktionieren , funktioniert aber nicht in #BEGIN_SRC language_name? Sobald die Sprache eine eigene Syntaxhervorhebung haben sollte, kehrt die Schriftart in meinem Fall zur variablen Tonhöhe zurück.
xji
Sie müssen die Master-Version verwenden - was schließlich Org-9 sein wird.
Rasmus
@rasmus Nur um zu bestätigen, in dieser Version ist das Gesicht zwischen #BEGIN_SRC lang_nameund #END_SRCsollte etwas anderes sein als default, oder? Wenn ich derzeit describe-faceinnerhalb des Blocks laufe , erhalte ich defaultdie gleiche Schriftart wie der normale Text von orgmode. Während zwischen #BEGIN_EXAMPLEund #END_EXAMPLEes org-blockund für ~text~es ist org-code, für =text=es org-verbatim, und somit werden diese Texte korrekt als feste Tonhöhe angezeigt.
xji
@rasmus Da es nach wie vor ist defaultGesicht beween #BEGIN_SRC lang_nameund #END_SRCes scheint unmöglich , es zu Festspielfeld zu setzen , während der normalen Inhalte mit variabler Tonhöhe zu halten. Ich bin mir nicht sicher, ob ich den Hauptzweig richtig installiert habe.
xji

Antworten:

7

Es stellt sich heraus, dass dies tatsächlich mit dem org-block-background face zusammenhängt, der in org version 8.3.1 in commit entfernt wurde f8b42e8, daher der Fehler. Das Grundprinzip scheint zu sein

  1. es verursacht einen Fehler beim psExportieren
  2. es ist ineffizient

Vielleicht gibt es in Zukunft eine Alternative, aber noch nicht.

/programming/26290924/fontify-r-code-blocks-in-org-mode-8

https://lists.gnu.org/archive/html/emacs-orgmode/2015-08/msg00510.html

Derzeit scheint die einzige Möglichkeit, das alte Verhalten wiederherzustellen, darin zu bestehen, die in Commit eingeführten Änderungen manuell rückgängig zu machen f8b42e8. Sie können das Commit hier sehen:

http://orgmode.org/cgit.cgi/org-mode.git/commit/?id=f8b42e8

diff --git a/lisp/org-faces.el b/lisp/org-faces.el
index e693dab..83453e8 100644
--- a/lisp/org-faces.el
+++ b/lisp/org-faces.el
@@ -537,9 +537,6 @@ follows a #+DATE:, #+AUTHOR: or #+EMAIL: keyword."
   :group 'org-faces
   :version "22.1")

-(defface org-block-background '((t ()))
-  "Face used for the source block background.")
-
 (org-copy-face 'org-meta-line 'org-block-begin-line
   "Face used for the line delimiting the begin of source blocks.")

diff --git a/lisp/org.el b/lisp/org.el
index a153151..7e30061 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -5930,15 +5930,7 @@ by a #."
          (cond
           ((and lang (not (string= lang "")) org-src-fontify-natively)
        (org-src-font-lock-fontify-block lang block-start block-end)
-       ;; remove old background overlays
-       (mapc (lambda (ov)
-           (if (eq (overlay-get ov 'face) 'org-block-background)
-               (delete-overlay ov)))
-             (overlays-at (/ (+ beg1 block-end) 2)))
-       ;; add a background overlay
-       (setq ovl (make-overlay beg1 block-end))
-                (overlay-put ovl 'face 'org-block-background)
-                (overlay-put ovl 'evaporate t)) ; make it go away when empty
+       (add-text-properties beg1 block-end '(src-block t)))
           (quoting
        (add-text-properties beg1 (min (point-max) (1+ end1))
                     '(face org-block))) ; end of source block
@@ -21828,9 +21820,7 @@ and end of string."
 When INSIDE is non-nil, don't consider we are within a src block
 when point is at #+BEGIN_SRC or #+END_SRC."
   (let ((case-fold-search t) ov)
-    (or (and (setq ov (overlays-at (point)))
-        (memq 'org-block-background
-          (overlay-properties (car ov))))
+    (or (and (eq (get-char-property (point) 'src-block) t))
    (and (not inside)
         (save-match-data
           (save-excursion
xji
quelle
Danke, dass du das ausgegraben hast - das ist eine Schande, da ich selbst keines der Probleme gesehen habe.
Stuart Hickinbottom
@stuarthickinbottom Ja, ich denke, dass die Änderung erst erfolgte, nachdem mein Organisationsmodus auf 8.3.1 aktualisiert wurde
xji
2

Ich bin mir nicht sicher, wann es sich geändert hat, aber ich sehe es auch.

Wenn C-u C-x =ich innerhalb eines solchen Blocks verwende, kann ich sehen, dass es org-block-backgroundjetzt tatsächlich das Gesicht hat und nicht mehr org-block. Das Anpassen dieses Gesichts zum Erben von fixed-pitchArbeiten für mich.

Getestet wie folgt:

(set-face-attribute 'org-block-background nil :inherit 'fixed-pitch)

Wenn Sie eine vorhandene Vererbung auf dieser Seite beibehalten möchten, können Sie Folgendes tun (vom Original hier angepasst: /programming/3758139/variable-pitch-for-org-mode-fixed-pitch-for -Tabellen / 16819449 # 16819449 ):

(defun my-adjoin-to-list-or-symbol (element list-or-symbol)
    (let ((list (if (not (listp list-or-symbol))
                    (list list-or-symbol)
                  list-or-symbol)))
      (require 'cl-lib)
      (cl-adjoin element list)))

(set-face-attribute 'org-block-background nil :inherit
            (my-adjoin-to-list-or-symbol
             'fixed-pitch
             (face-attribute 'org-block-background :inherit)))
Stuart Hickinbottom
quelle
Ich habe diese Methode verwendet, bevor dieses Problem auftrat. Es stellte sich heraus, dass das org-block-backgroundGesicht in org Version 8.3.1 entfernt wurde, daher wahrscheinlich der Fehler. stackoverflow.com/questions/26290924/… lists.gnu.org/archive/html/emacs-orgmode/2015-08/msg00523.html
xji
+1 für Cu Cx = Ich wusste nie, dass es das gibt und habe schon eine Weile nach so etwas gesucht.
Julien Chastang