Como exibir sobreposições como este screencast?

10

Como fazer uma sobreposição no Emacs da seguinte forma (talvez não seja sobreposição, eu não sei, é da empresa-coq inline-docs):

sobreposição como este screencast

stardiviner
fonte

Respostas:

8

Na verdade, ele realiza esse comportamento usando sobreposições. Especificamente, ele usa a 'after-stringpropriedade para mostrar a documentação (consulte: Propriedades da sobreposição ).

Se você examinar a função company-coq--show-definition-overlay-at-point(ex: via M-x find-function), poderá ver exatamente como ela é criada:

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

Uma referência à sobreposição é mantida company-coq-definition-overlaypara facilitar a remoção posterior da sobreposição:

(delete-overlay company-coq-definition-overlay)
(setq company-coq-definition-overlay nil)
ebpa
fonte
With (overlay-put OVERLAY 'after-string STR)não tem fontify como no screencast.
stardiviner
@stardiviner você está se perguntando sobre caracteres / cores / estilos específicos? Você pode usar o edebug para examinar a string ins-strem company-coq--show-definition-overlay-at-point. As faces e o estilo específicos existirão como propriedades de texto nessa sequência. Propriedades do texto: Propriedades especiais é uma referência útil para decodificar essas propriedades.
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)

Eu criei um repositório para isso, https://github.com/stardiviner/inline-docs.el E um módulo que é usado inline-docs.elpara eldoc. https://github.com/stardiviner/eldoc-overlay-mode .

stardiviner
fonte
Seria bom ter isso como um módulo de uso geral, de modo que pudesse ser usado não apenas para eldoc, mas também para outras "modeline quickinfo".
Theldoria
Entendo, vou criar um modo geral para isso e depois criar um modo separado para o eldoc.
stardiviner