Add Markdown prettifier functions
* README.org (Default prettifier): New section. * eldoc-box.el (eldoc-box-buffer-hook): Add prettifier functions. (eldoc-box--prettify-markdown-separator) (eldoc-box--replace-en-space) (eldoc-box--condense-large-newline-gaps) (eldoc-box--remove-linked-images) (eldoc-box--fontify-html-header): New functions.
This commit is contained in:
parent
5949978bdc
commit
1b5eab4d67
15
README.org
15
README.org
@ -1,5 +1,6 @@
|
||||
#+TITLE: ElDoc box
|
||||
This package displays ElDoc documentations in a childframe.
|
||||
|
||||
This package displays ElDoc documentations in a childframe. The childfrme is selectable and scrollable with mouse, even thought the cursor is hidden.
|
||||
|
||||
[[https://melpa.org/#/eldoc-box][file:https://melpa.org/packages/eldoc-box-badge.svg]]
|
||||
[[https://stable.melpa.org/#/eldoc-box][file:https://stable.melpa.org/packages/eldoc-box-badge.svg]]
|
||||
@ -46,6 +47,18 @@ It is also available on [[https://melpa.org/#/eldoc-box][MELPA]].
|
||||
|
||||
To keep eldoc from displaying documentation at point without enabling any minor mode above: =(add-to-list 'eglot-ignored-server-capabilites :hoverProvider)=.
|
||||
|
||||
** Default prettifier
|
||||
|
||||
By default, eldoc-box tries to prettify the displayed markdown documentation as shown below. If you wish to disable them, remove the prettifier functions from =eldoc-box-buffer-hook=. Report an issue if there are other things can be prettfied away.
|
||||
|
||||
Before:
|
||||
|
||||
[[./before.png]]
|
||||
|
||||
After:
|
||||
|
||||
[[./after.png]]
|
||||
|
||||
|
||||
* Credit
|
||||
- Thanks to for [[https://github.com/joaotavora][João Távora]] for valuable contribution and explaining eldoc and eglot internals to me.
|
||||
|
BIN
before.png
Normal file
BIN
before.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 162 KiB |
83
eldoc-box.el
83
eldoc-box.el
@ -161,9 +161,14 @@ It will be passes with two arguments: WIDTH and HEIGHT of the childframe.")
|
||||
"T means fringe's background color is set to as same as that of default."
|
||||
:type 'boolean)
|
||||
|
||||
(defvar eldoc-box-buffer-hook nil
|
||||
(defvar eldoc-box-buffer-hook '(eldoc-box--prettify-markdown-separator
|
||||
eldoc-box--replace-en-space
|
||||
eldoc-box--remove-linked-images
|
||||
eldoc-box--fontify-html-header
|
||||
eldoc-box--condense-large-newline-gaps)
|
||||
"Hook run after buffer for doc is setup.
|
||||
Run inside the new buffer.")
|
||||
Run inside the new buffer. By default, it contains some Markdown
|
||||
prettifiers, which see.")
|
||||
|
||||
(defvar eldoc-box-frame-hook nil
|
||||
"Hook run after doc frame is setup but just before it is made visible.
|
||||
@ -608,6 +613,80 @@ You can use \[keyboard-quit] to hide the doc."
|
||||
(or (line-number-display-width t) 0))
|
||||
nil))
|
||||
|
||||
;;;; Markdown compatibility
|
||||
|
||||
(defun eldoc-box--prettify-markdown-separator ()
|
||||
"Prettify the markdown separator in doc returned by Eglot.
|
||||
Refontify the separator so they span exactly the width of the
|
||||
childframe."
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(let (prop)
|
||||
(while (setq prop (text-property-search-forward 'markdown-hr))
|
||||
(add-text-properties (prop-match-beginning prop)
|
||||
(prop-match-end prop)
|
||||
'( display (space :width text)
|
||||
face ( :strike-through t
|
||||
:height 0.4)))))))
|
||||
|
||||
(defun eldoc-box--replace-en-space ()
|
||||
"Replace the en spaces in documentation with regular spaces."
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (search-forward " " nil t)
|
||||
(replace-match " "))))
|
||||
|
||||
(defun eldoc-box--condense-large-newline-gaps ()
|
||||
"Condense exceedingly large gaps made of consecutive newlines.
|
||||
|
||||
These gaps are usually made of hidden \"```\" and/or consecutive
|
||||
newlines. Replace those gaps with a single empty line at 0.5 line
|
||||
height."
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward
|
||||
(rx (>= 2 (or "\n" (seq "```" (+ (syntax word))) "<br>"
|
||||
(seq bol (+ (or " " "\t" " ")) eol))))
|
||||
nil t)
|
||||
(if (or (eq (match-beginning 0) (point-min))
|
||||
(eq (match-end 0) (point-max)))
|
||||
(replace-match "")
|
||||
(replace-match "\n\n")
|
||||
(add-text-properties (1- (point)) (point)
|
||||
'( font-lock-face (:height 0.4)
|
||||
face (:height 0.4)))))))
|
||||
|
||||
(defun eldoc-box--remove-linked-images ()
|
||||
"Some documentation embed image links in the doc...remove them."
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
;; Find every Markdown image link, and remove them.
|
||||
(while (re-search-forward
|
||||
(rx "[" (seq "![" (+? anychar) "](" (+? anychar) ")") "]"
|
||||
"(" (+? anychar) ")")
|
||||
nil t)
|
||||
(replace-match ""))))
|
||||
|
||||
(defun eldoc-box--fontify-html-header ()
|
||||
"Fontify <h1> <h2> tags."
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward
|
||||
(rx bol
|
||||
(group "<h" digit ">")
|
||||
(group (*? anychar))
|
||||
(group "</h" digit ">")
|
||||
eol)
|
||||
nil t)
|
||||
(add-text-properties (match-beginning 2)
|
||||
(match-end 2)
|
||||
'( face (:weight bold)
|
||||
font-lock-face (:weight bold)))
|
||||
(put-text-property (match-beginning 1) (match-end 1)
|
||||
'invisible t)
|
||||
(put-text-property (match-beginning 3) (match-end 3)
|
||||
'invisible t))))
|
||||
|
||||
(provide 'eldoc-box)
|
||||
|
||||
;;; eldoc-box.el ends here
|
||||
|
Loading…
Reference in New Issue
Block a user