Wie kann man Overlay wie diesen Screencast anzeigen?

10

So erstellen Sie ein Overlay in Emacs wie folgt (möglicherweise ist es kein Overlay, ich weiß nicht, es stammt aus firmeneigenen Inline-Dokumenten):

Overlay wie dieser Screencast

Stardiviner
quelle

Antworten:

8

In der Tat wird dieses Verhalten mithilfe von Überlagerungen erreicht. Insbesondere wird die 'after-stringEigenschaft verwendet, um die Dokumentation anzuzeigen (siehe: Überlagerungseigenschaften ).

Wenn Sie die Funktion untersuchen company-coq--show-definition-overlay-at-point(z. B. via M-x find-function), können Sie genau sehen, wie sie erstellt wurde:

(setq company-coq-definition-overlay (make-overlay ins-pos ins-pos))
(overlay-put company-coq-definition-overlay 'after-string ins-str)

Ein Verweis auf die Überlagerung wird beibehalten company-coq-definition-overlay, um das spätere Entfernen der Überlagerung zu vereinfachen:

(delete-overlay company-coq-definition-overlay)
(setq company-coq-definition-overlay nil)
ebpa
quelle
Mit (overlay-put OVERLAY 'after-string STR)hat nicht fontify wie im Screencast.
Stardiviner
@stardiviner Fragen Sie sich über bestimmte Charaktere / Farben / Stil? Sie können den Edebug verwenden, um die Zeichenfolge ins-strin zu untersuchen company-coq--show-definition-overlay-at-point. Bestimmte Flächen und Stile sind als Texteigenschaften in dieser Zeichenfolge vorhanden. Texteigenschaften: Spezielle Eigenschaften sind eine hilfreiche Referenz zum Dekodieren dieser Eigenschaften.
Ebpa
1
(defvar inline-docs-overlay nil)

(defgroup inline-docs nil
  "Show inline contextual docs in Emacs."
  :group 'docs)

(defcustom inline-docs-border-symbol ?―
  "Specify symbol for inline-docs border."
  :group 'inline-docs)

(defcustom inline-docs-prefix-symbol ?\s
  "Specify symbol for inline-docs prefix."
  :group 'inline-docs)

(defcustom inline-docs-indicator-symbol "➜"
  "Specify symbol for inline-docs indicator."
  :group 'inline-docs)

(defface inline-docs-face
  '((t (:inherit italic)))
  "Face for `inline-docs-mode'."
  :group 'inline-docs)

(defface inline-docs-border-face
  '((t (:inherit font-lock-doc-face)))
  "Face for inline docs border lines."
  :group 'inline-docs)

(defface inline-docs-prefix-face
  '((t (:inherit default)))
  "Face for inline docs prefix."
  :group 'inline-docs)

(defface inline-docs-indicator-face
  '((t (:inherit font-lock-doc-face)))
  "Face for inline docs indicator."
  :group 'inline-docs)

(defun inline-docs--clear-overlay ()
  "Clear inline-docs overlays."
  (when (overlayp inline-docs-overlay)
    (delete-overlay inline-docs-overlay))
  (remove-hook 'post-command-hook 'inline-docs--clear-overlay))

(defun inline-docs--string-display-next-line (string apply-face)
  "Show STRING contents below point line until next command with APPLY-FACE."
  (let* ((border-line (make-string (window-body-width) inline-docs-border-symbol))
         (prefix (make-string
                  (if (= (current-indentation) 0) ; fix (wrong-type-argument wholenump -1) when current indentation is 0 minus 1 will caused wholenump exception.
                      (current-indentation)
                    (- (current-indentation) 1))
                  inline-docs-prefix-symbol))
         (str (concat (propertize border-line
                                  'face 'inline-docs-border-face)
                      "\n"
                      prefix
                      (propertize (concat inline-docs-indicator-symbol " ")
                                  'face 'inline-docs-indicator-face)
                      (copy-sequence string) ; original eldoc string with format.
                      "\n"
                      (propertize border-line
                                  'face 'inline-docs-border-face)
                      "\n"
                      ))
         start-pos end-pos)
    (unwind-protect
        (save-excursion
          (inline-docs--clear-overlay)
          (forward-line)
          (setq start-pos (point))
          (end-of-line)
          (setq end-pos (point))
          (setq inline-docs-overlay (make-overlay start-pos end-pos (current-buffer)))
          ;; change the face
          (if apply-face
              (overlay-put inline-docs-overlay 'face 'inline-docs-face))
          ;; hide full line
          ;; (overlay-put inline-docs-overlay 'display "")
          ;; (overlay-put inline-docs-overlay 'display :height 20)
          ;; pre-pend indentation spaces
          ;; (overlay-put inline-docs-overlay 'line-prefix prefix)
          ;; auto delete overlay
          (overlay-put inline-docs-overlay 'evaporate t)
          ;; display message
          (overlay-put inline-docs-overlay 'before-string str))
      (add-hook 'post-command-hook 'inline-docs--clear-overlay))))

(defun inline-docs-display-docs-momentary (format-string &rest args)
  "Display inline docs FORMAT-STRING under point with extra ARGS."
  (when format-string
    (inline-docs--string-display-next-line
     (apply 'format format-string args)
     t)))

;;;###autoload
(defalias 'inline-docs 'inline-docs-display-docs-momentary)

Ich habe dafür ein Repo erstellt, https://github.com/stardiviner/inline-docs.el und ein Modul, das inline-docs.elfür eldoc verwendet wird. https://github.com/stardiviner/eldoc-overlay-mode .

Stardiviner
quelle
Es wäre schön, das als Allzweckmodul zu haben, so dass es nicht nur für eldoc, sondern auch für andere "modeline quickinfo" verwendet werden kann.
Theldoria
Ich sehe, ich werde einen allgemeinen Modus dafür erstellen und dann einen separaten Modus für eldoc erstellen.
Stardiviner