Ist es möglich, hübsche Symbole in Org-Modus-Quellblöcken zu erhalten?

7

Ich habe einige Symbole prettify-symbols-alist, die das Erscheinungsbild von Elisp-Code in meiner Konfigurationsdatei verbessern. Ich migriere meine Konfigurationsdatei von Elisp in den Org-Modus und möchte die hübschen Symbole behalten. Ist dies im Org-Modus 8.3 möglich?

Matthew Piziak
quelle

Antworten:

4

Wenn Sie möchten, dass die Symbole in der gesamten Organisationsdatei verschönert werden, definieren Sie sie einfach prettify-symbols-alistim Puffer und aktivieren Sie sie prettify-symbols-mode.

Eine bessere Lösung würde jedoch sicherstellen, dass diese Symbole nur in den src-Blöcken (und entsprechend dem Sprachmodus) hübsch sind . Beachten Sie, dass dies beim Bearbeiten des org-edit-src-codeQuellblocks der Fall ist (da der src-Block im entsprechenden Hauptmodus in einen Puffer kopiert wird).

Schauen Sie sich an, wie die Schriftart von src-Blöcken funktioniert (Funktion org-src-font-lock-fontify-blockin Datei org-src.el:

  1. Block als Zeichenfolge extrahieren
  2. Fügen Sie es in einen dedizierten Puffer ein
  3. Sprachhauptmodus einstellen
  4. Rufen Sie font-lock-fontify-buffer auf
  5. Kopieren Sie die Gesichtseigenschaften vom Puffer in den Organisationspuffer
  6. Markieren Sie den Text im Organisationspuffer als font-lock-fontified

Und wenn man sieht (Funktion enter prettify-symbols-modein Datei prog-mode.el), dass die Prettifizierung von Symbolen von 'compositionEigenschaften abhängt , kann man ableiten, dass wir nur Änderungen org-src-font-lock-fontify-blockvornehmen müssen, damit auch 'compositionEigenschaften kopiert werden.

Hier ist die geänderte Funktion (siehe markierten Teil 'Addition'):

(defun org-src-font-lock-fontify-block (lang start end)
  "Fontify code block.
This function is called by emacs automatic fontification, as long
as `org-src-fontify-natively' is non-nil."
  (let ((lang-mode (org-src--get-lang-mode lang)))
    (when (fboundp lang-mode)
      (let ((string (buffer-substring-no-properties start end))
        (modified (buffer-modified-p))
        (org-buffer (current-buffer)) pos next)
    (remove-text-properties start end '(face nil))
    (with-current-buffer
        (get-buffer-create
         (concat " org-src-fontification:" (symbol-name lang-mode)))
      (delete-region (point-min) (point-max))
      (insert string " ") ;; so there's a final property change
      (unless (eq major-mode lang-mode) (funcall lang-mode))
      ;; Avoid `font-lock-ensure', which does not display fonts in
      ;; source block.
      (font-lock-fontify-buffer)
      (setq pos (point-min))
      (while (setq next (next-single-property-change pos 'face))
        (put-text-property
         (+ start (1- pos)) (1- (+ start next)) 'face
         (get-text-property pos 'face) org-buffer)
        (setq pos next))
      ;; Addition: also copy 'composition info for prettified symbols
      (setq pos (point-min))
      (while (setq next (next-single-property-change pos 'composition))
        (put-text-property
         (+ start (1- pos)) (1- (+ start next)) 'composition
         (get-text-property pos 'composition) org-buffer)
        (setq pos next))
      ;; End addition
      )
    (add-text-properties
     start end
     '(font-lock-fontified t fontified t font-lock-multiline t))
    (set-buffer-modified-p modified)))))

Sie müssen sicherstellen, dass dies nach der Definition in geladen wird org-src.el.

Jean Pierre
quelle