Tentu saja my-defun
makro adalah jalan keluar yang mudah. Tetapi solusi yang lebih sederhana adalah
(advice-add 'eval-when-compile :filter-return
(lambda (exp)
(if (and (eq 'quote (car-safe exp))
(stringp (cadr exp)))
(cadr exp)
exp)))
Yang seharusnya membuat trik Anda bekerja, setidaknya dalam semua kasus di mana fungsi ini diperluas makro sebelum benar-benar didefinisikan, yang harus mencakup kasus penggunaan utama (misalnya jika itu diambil dari file, jika byte-dikompilasi, atau jika itu didefinisikan via M-C-x
).
Namun, ini tidak akan memperbaiki semua kode yang ada, jadi mungkin jawaban yang lebih baik adalah seperti:
;; -*- lexical-binding:t -*-
(defun my-shift-docstrings (orig ppss)
(let ((face (funcall orig ppss)))
(when (eq face 'font-lock-doc-face)
(save-excursion
(let ((start (point)))
(parse-partial-sexp (point) (point-max) nil nil ppss 'syntax-table)
(while (search-backward "\n" start t)
(put-text-property (point) (1+ (point)) 'display
(propertize "\n " 'cursor 0))))))
face))
(add-hook 'emacs-lisp-mode-hook
(lambda ()
(font-lock-mode 1)
(push 'display font-lock-extra-managed-props)
(add-function :around (local 'font-lock-syntactic-face-function)
#'my-shift-docstrings)))
yang seharusnya hanya menggeser dokumen dengan 2 spasi, tetapi hanya pada sisi tampilan, tanpa mempengaruhi konten buffer sebenarnya.
defun
. Kelemahan dari pendekatan itu - dan ini yang besar - adalah yang akan membingungkan perangkat lunak apa pun (selain dari compiler / interpreter elisp) yang mem-parsing kode Anda mencaridefun
s.