Làm thế nào để hiển thị lớp phủ như screencast này?


Câu trả lời:


8

Thật vậy, nó thực hiện hành vi đó bằng cách sử dụng lớp phủ. Cụ thể- nó sử dụng thuộc 'after-stringtính để hiển thị tài liệu (xem: Thuộc tính lớp phủ ).

Nếu bạn kiểm tra chức năng company-coq--show-definition-overlay-at-point(ví dụ: thông qua M-x find-function), bạn có thể thấy chính xác cách nó được tạo:

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

Tham chiếu đến lớp phủ được lưu giữ company-coq-definition-overlayđể giúp dễ dàng xóa lớp phủ sau:

(delete-overlay company-coq-definition-overlay)
(setq company-coq-definition-overlay nil)

Với (overlay-put OVERLAY 'after-string STR)không có fontify như trong screencast.
stardiviner

@stardiviner bạn đang băn khoăn về các nhân vật / màu sắc / phong cách cụ thể? Bạn có thể sử dụng edebug để kiểm tra chuỗi ins-strtrong company-coq--show-definition-overlay-at-point. Các mặt cụ thể và kiểu dáng sẽ tồn tại dưới dạng các thuộc tính văn bản trong chuỗi đó. Thuộc tính văn bản: Thuộc tính đặc biệt là một tài liệu tham khảo hữu ích để giải mã các thuộc tính đó.
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)

Tôi đã tạo một repo cho việc này, https://github.com/stardiviner/inline-docs.el Và một mô-đun sử dụng inline-docs.elcho eldoc. https://github.com/stardiviner/eldoc-overlay-mode .


Sẽ là tốt nếu có một mô-đun mục đích chung, như vậy nó có thể được sử dụng không chỉ cho eldoc mà còn cả "modeline quickinfo" khác.
theldoria

Tôi thấy, tôi sẽ tạo một chế độ chung cho việc này, sau đó tạo một chế độ riêng cho eldoc.
stardiviner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.