Por supuesto, una my-defunmacro es la salida fácil. Pero una solución más simple sería
(advice-add 'eval-when-compile :filter-return
(lambda (exp)
(if (and (eq 'quote (car-safe exp))
(stringp (cadr exp)))
(cadr exp)
exp)))
Lo que debería hacer que su truco funcione, al menos en todos los casos en que la función se expande macro antes de que se defina realmente, que debe incluir los casos de uso principales (por ejemplo, si se carga desde un archivo, si se compila en bytes o si se define vía M-C-x).
Aún así, esto no solucionará todo el código existente, por lo que tal vez una mejor respuesta sea algo como:
;; -*- 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)))
que solo debe desplazar las cadenas de documentos en 2 espacios, pero solo en el lado de la pantalla, sin afectar el contenido real del búfer.
defun. El inconveniente de ese enfoque, y es muy importante, es que confundirá cualquier software (que no sea el compilador / intérprete elisp) que está analizando su código en busca dedefuns.