Orgモードのソースブロックで整形済みのシンボルを取得することは可能ですか?


回答:


4

シンボルを組織ファイル全体できれいにしたい場合prettify-symbols-alistは、バッファで定義して有効にしprettify-symbols-modeます。

しかし、より良い解決策は、これらのシンボルがsrcブロック内でのみ(および言語モードに従って)確実に整形されるようにすることです。ソースブロックを編集しているときですorg-edit-src-code(srcブロックは対応するメジャーモードのバッファーにコピーされるため)。

srcブロックのフォント化がどのように機能org-src-font-lock-fontify-blockするかを調べます(ファイル内の関数org-src.el

  1. 文字列としてブロックを抽出する
  2. 専用バッファに挿入する
  3. 言語メジャーモードを設定する
  4. font-lock-fontify-bufferを呼び出す
  5. 'faceプロパティをバッファーから組織バッファーにコピーする
  6. 組織バッファー内のテキストにfont-lock-fontifiedのマークを付ける

そして、(enter prettify-symbols-modeファイル内の関数prog-mode.el)シンボルのプレティフィケーションが'compositionプロパティに依存しorg-src-font-lock-fontify-blockていることがわかると、'compositionプロパティをコピーするように変更するだけでよいと推測できます。

変更された関数は次のとおりです(「追加」の部分を参照)。

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

これは、での定義の後に読み込まれるようにする必要がありorg-src.elます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.