É possível obter símbolos pré-modificados nos blocos de origem do modo Org?

7

Eu tenho alguns símbolos prettify-symbols-alistque melhoram a aparência do código elisp no meu arquivo de configuração. Estou migrando meu arquivo de configuração do Elisp para o modo Org. E gostaria de manter os símbolos pretendidos. Isso é possível no modo Org 8.3?

Matthew Piziak
fonte

Respostas:

4

Se você deseja que os símbolos sejam pré-modificados em todo o arquivo organizacional, basta definir prettify-symbols-alistno buffer e ativar prettify-symbols-mode.

Mas uma solução melhor garantiria que esses símbolos sejam prettificados apenas nos blocos src (e de acordo com o modo de idioma). Observe que eles estão ao editar o bloco de origem org-edit-src-code(já que o bloco src é copiado em um buffer no modo principal correspondente).

Examinando como a fonte do bloco src funciona (função org-src-font-lock-fontify-blockno arquivo org-src.el:

  1. extrair bloco como uma string
  2. insira-o em um buffer dedicado
  3. definir modo principal de idioma
  4. chame font-lock-fontify-buffer
  5. copiar 'propriedades de face do buffer para o buffer organizacional
  6. marcar o texto no buffer organizacional como font-lock-fontified

E vendo (função enter prettify-symbols-modeno arquivo prog-mode.el) que a pré-identificação de símbolos depende de 'compositionpropriedades, pode-se deduzir que precisamos mudar org-src-font-lock-fontify-blockpara fazer com que as 'compositionpropriedades também sejam copiadas .

Aqui está a função modificada (consulte a seção 'Adição'):

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

Você deve garantir que isso seja carregado após a definição org-src.el.

Jean Pierre
fonte