¿Es posible obtener símbolos prettificados en bloques fuente en modo Org?

7

Tengo algunos símbolos prettify-symbols-alistque mejoran la apariencia del código elisp en mi archivo de configuración. Estoy migrando mi archivo de configuración de Elisp a Org-mode y me gustaría mantener los símbolos prettificados. ¿Es esto posible lograr en el modo Org 8.3?

Matthew Piziak
fuente

Respuestas:

4

Si desea que los símbolos se prettifiquen en todo el archivo de organización, solo defínalo prettify-symbols-alisten el búfer y habilítelo prettify-symbols-mode.

Pero una mejor solución aseguraría que estos símbolos se prettifiquen solo en los bloques src (y de acuerdo con el modo de lenguaje). Tenga en cuenta que están al editar el bloque de origen org-edit-src-code(ya que el bloque src se copia en un búfer en el modo principal correspondiente).

Mirando cómo funciona la fuente de bloques src (función org-src-font-lock-fontify-blocken el archivo org-src.el:

  1. extraer bloque como una cadena
  2. insertarlo en un búfer dedicado
  3. establecer el modo principal de idioma
  4. llamar a font-lock-fontify-buffer
  5. Copie las propiedades de la cara del búfer al búfer de organización
  6. marcar texto en el búfer de la organización como font-lock-fontified

Y viendo (función enter prettify-symbols-modeen el archivo prog-mode.el) que la prettificación de símbolos depende de las 'compositionpropiedades, se puede deducir que solo necesitamos cambiar org-src-font-lock-fontify-blockpara que también copie las 'compositionpropiedades.

Aquí está la función modificada (vea la parte marcada 'Adición'):

(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)))))

Debe asegurarse de que se cargue después de la definición en org-src.el.

Jean Pierre
fuente