feat: lean4-mode: combine goal and next-error views into info view (C-c C-i)

This commit is contained in:
Sebastian Ullrich 2021-03-09 19:18:03 +01:00
parent d2f9e43ca0
commit 14e11f99e6
3 changed files with 44 additions and 57 deletions

View file

@ -62,41 +62,12 @@
(lsp-interface
(lean:PlainGoal (:rendered) nil))
(defconst lean4-show-goal-buffer-name "*Lean Goal*")
(defconst lean4-info-buffer-name "*Lean Goal*")
(defun lean4-show-goal--handler ()
(let ((deactivate-mark)) ; keep transient mark
(when (lean4-info-buffer-active lean4-show-goal-buffer-name)
(lsp-request-async
"$/lean/plainGoal"
(lsp--text-document-position-params)
(-lambda ((goal &as &lean:PlainGoal? :rendered))
(when goal
(let ((rerendered (lsp--render-string rendered "markdown")))
(lean4-with-info-output-to-buffer
lean4-show-goal-buffer-name
(insert rerendered)
(when lean4-highlight-inaccessible-names
(goto-char 0)
(while (re-search-forward "\\(\\sw+\\)✝\\([¹²³⁴-⁹⁰]*\\)" nil t)
(replace-match
(propertize (s-concat (match-string-no-properties 1) (match-string-no-properties 2))
'font-lock-face 'font-lock-comment-face)
'fixedcase 'literal)))))))
:error-handler #'ignore
:mode 'tick
:cancel-token :plain-goal))))
(defvar lean4-goal "")
(defun lean4-toggle-show-goal ()
"Show goal at the current point."
(interactive)
(lean4-toggle-info-buffer lean4-show-goal-buffer-name)
(lean4-show-goal--handler))
(defconst lean4-next-error-buffer-name "*Lean Next Error*")
(defun lean4-next-error--handler ()
(when (lean4-info-buffer-active lean4-next-error-buffer-name)
(defun lean4-info-buffer-redisplay ()
(when (lean4-info-buffer-active lean4-info-buffer-name)
(let ((deactivate-mark) ; keep transient mark
(errors (or
;; prefer error of current position, if any
@ -107,17 +78,44 @@
;; fall back to next error position
(-if-let* ((pos (flycheck-next-error-pos 1)))
(flycheck-overlay-errors-at pos)))))
(lean4-with-info-output-to-buffer lean4-next-error-buffer-name
(lean4-with-info-output-to-buffer
lean4-info-buffer-name
(insert (or (s-trim lean4-goal) "<no goals>"))
(insert "\n---\n")
(dolist (e errors)
(princ (format "%d:%d: " (flycheck-error-line e) (flycheck-error-column e)))
(princ (flycheck-error-message e))
(princ "\n\n"))
(when flycheck-current-errors
(princ (format "(%d more messages above...)" (length flycheck-current-errors))))))))
(princ (format "(%d more messages above...)" (length flycheck-current-errors))))
(when lean4-highlight-inaccessible-names
(goto-char 0)
(while (re-search-forward "\\(\\sw+\\)✝\\([¹²³⁴-⁹⁰]*\\)" nil t)
(replace-match
(propertize (s-concat (match-string-no-properties 1) (match-string-no-properties 2))
'font-lock-face 'font-lock-comment-face)
'fixedcase 'literal)))))))
(defun lean4-toggle-next-error ()
(defun lean4-info-buffer-refresh ()
(when (lean4-info-buffer-active lean4-info-buffer-name)
(lsp-request-async
"$/lean/plainGoal"
(lsp--text-document-position-params)
(-lambda ((goal &as &lean:PlainGoal? :rendered))
(let ((rerendered (lsp--render-string rendered "markdown")))
(setq lean4-goal rerendered)
(lean4-info-buffer-redisplay)))
:error-handler #'ignore
:mode 'tick
:cancel-token :plain-goal)
;; may lead to flickering
;(lean4-info-buffer-redisplay)
))
(defun lean4-toggle-info ()
"Show infos at the current point."
(interactive)
(lean4-toggle-info-buffer lean4-next-error-buffer-name)
(lean4-next-error--handler))
(lean4-toggle-info-buffer lean4-info-buffer-name)
(lean4-info-buffer-refresh))
(provide 'lean4-info)

View file

@ -97,8 +97,7 @@
(local-set-key lean4-keybinding-find-definition #'lean4-find-definition)
(local-set-key lean4-keybinding-tab-indent #'lean4-tab-indent)
(local-set-key lean4-keybinding-hole #'lean4-hole)
(local-set-key lean4-keybinding-lean4-toggle-show-goal #'lean4-toggle-show-goal)
(local-set-key lean4-keybinding-lean4-toggle-next-error #'lean4-toggle-next-error)
(local-set-key lean4-keybinding-lean4-toggle-info #'lean4-toggle-info)
(local-set-key lean4-keybinding-lean4-message-boxes-toggle #'lean4-message-boxes-toggle)
(local-set-key lean4-keybinding-leanpkg-configure #'lean4-leanpkg-configure)
(local-set-key lean4-keybinding-leanpkg-build #'lean4-leanpkg-build)
@ -126,8 +125,7 @@
;; ["Create a new project" (call-interactively 'lean4-project-create) (not (lean4-project-inside-p))]
"-----------------"
["Show type info" lean4-show-type (and lean4-eldoc-use eldoc-mode)]
["Toggle goal display" lean4-toggle-show-goal t]
["Toggle next error display" lean4-toggle-next-error t]
["Toggle info display" lean4-toggle-info t]
["Toggle message boxes" lean4-message-boxes-toggle t]
["Highlight pending tasks" lean4-server-toggle-show-pending-tasks
:active t :style toggle :selected lean4-server-show-pending-tasks]
@ -154,10 +152,8 @@
;; Handle events that may start automatic syntax checks
(before-save-hook . lean4-whitespace-cleanup)
;; info windows
(post-command-hook . lean4-show-goal--handler)
(post-command-hook . lean4-next-error--handler)
;; (flycheck-after-syntax-check-hook . lean4-show-goal--handler)
(flycheck-after-syntax-check-hook . lean4-next-error--handler)
(post-command-hook . lean4-info-buffer-refresh)
(flycheck-after-syntax-check-hook . lean4-info-buffer-refresh)
)
"Hooks which lean4-mode needs to hook in.
@ -171,11 +167,7 @@ enabled and disabled respectively.")
;;(setq lean4-right-click-item-functions '(lean4-info-right-click-find-definition
;; lean4-hole-right-click))
;; Flycheck
(setq-local flycheck-disabled-checkers '())
;; info buffers
(lean4-ensure-info-buffer lean4-next-error-buffer-name)
;(lean4-ensure-info-buffer lean4-show-goal-buffer-name)
)
(setq-local flycheck-disabled-checkers '()))
;; Automode List
;;;###autoload

View file

@ -57,7 +57,7 @@ written."
:type 'boolean)
(defcustom lean4-highlight-inaccessible-names t
"Set this variable to `t` to highlight inaccessible names in the goal display
"Set this variable to `t` to highlight inaccessible names in the info display
using `font-lock-comment-face' instead of the `` suffix used by Lean."
:group 'lean
:type 'boolean)
@ -89,11 +89,8 @@ using `font-lock-comment-face' instead of the `✝` suffix used by Lean."
(defcustom lean4-keybinding-hole (kbd "C-c SPC")
"Lean Keybinding for hole manipulation"
:group 'lean4-keybinding :type 'key-sequence)
(defcustom lean4-keybinding-lean4-toggle-show-goal (kbd "C-c C-g")
"Lean Keybinding for show-goal-at-pos"
:group 'lean4-keybinding :type 'key-sequence)
(defcustom lean4-keybinding-lean4-toggle-next-error (kbd "C-c C-n")
"Lean Keybinding for lean4-toggle-next-error"
(defcustom lean4-keybinding-lean4-toggle-info (kbd "C-c C-i")
"Lean Keybinding for lean4-toggle-info"
:group 'lean4-keybinding :type 'key-sequence)
(defcustom lean4-keybinding-lean4-message-boxes-toggle (kbd "C-c C-b")
"Lean Keybinding for lean4-message-boxes-toggle"