feat(emacs/lean-flycheck): detect and use flycheck error buffer width

Detect the width of flycheck error list buffer and set pp.width when
calling flycheck. It uses the same heuristic that `split-window-sensibly`
function is using.

A user can also set `lean-flycheck-msg-width` custom variable to enforce
a certain width.

Close #205.
This commit is contained in:
Soonho Kong 2014-09-29 18:19:08 -07:00
parent 486839881c
commit 41acc10d49
4 changed files with 63 additions and 19 deletions

View file

@ -15,7 +15,7 @@
lean-flycheck-checker-options
'("--cache")
'(source-original)
'((eval (lean-option-string)))
'((eval (lean-option-string t)))
'("--")
'(source-inplace))))
(when (string= system-type "windows-nt")
@ -97,4 +97,27 @@
(tempfiles (--map (concat tempfile it) exts)))
(mapc #'flycheck-safe-delete tempfiles))))
(defun lean-flycheck-error-list-buffer-width ()
"Return the width of flycheck-error list buffer"
(interactive)
(let* ((flycheck-error-window (get-buffer-window "*Flycheck errors*" t))
(window (selected-window))
(body-width (window-body-width window)))
(cond
;; If "*Flycheck errors" buffer is available, use its width
(flycheck-error-window
(window-body-width flycheck-error-window))
;; If lean-flycheck-msg-width is set, use it
(lean-flycheck-msg-width
lean-flycheck-msg-width)
;; Can we split vertically?
((window-splittable-p window nil)
body-width)
;; Can we split horizontally?
((window-splittable-p window t)
(/ body-width 2))
;; In worst case, just use the same width of current window
(t body-width))))
(provide 'lean-flycheck)

View file

@ -26,21 +26,30 @@
(-drop 1 str-list)))
(string-join str-list "\n")))
(defun lean-option-string ()
(defun lean-option-string (&optional use-flycheck)
"Return string of Lean options set by lean-set-option command"
(let ((pp-width-entry (assoc-string "pp.width" lean-global-option-alist)))
(unless pp-width-entry
(lean-update-option-alist "pp.width" lean-default-pp-width)))
(when lean-global-option-alist
(--reduce (format "%s %s" acc it)
(--map (format "-D%s=%s" (car it) (cdr it))
lean-global-option-alist))))
(let* ((option-alist lean-global-option-alist)
(pp-width-entry (assoc-string "pp.width" option-alist)))
(cond (use-flycheck
(setq option-alist
(lean-update-option-alist option-alist
"pp.width"
(lean-flycheck-error-list-buffer-width))))
((not pp-width-entry)
(setq option-alist
(lean-update-option-alist option-alist
"pp.width"
lean-default-pp-width))))
(when option-alist
(--reduce (format "%s %s" acc it)
(--map (format "-D%s=%s" (car it) (cdr it))
option-alist)))))
(defun lean-update-option-alist (name value)
(let ((needle (assoc-string name lean-global-option-alist)))
(defun lean-update-option-alist (option-alist name value)
(let ((needle (assoc-string name option-alist)))
(when needle
(setq lean-global-option-alist (delq needle lean-global-option-alist)))
(setq lean-global-option-alist (cl-acons name value lean-global-option-alist))))
(setq option-alist (delq needle option-alist)))
(setq option-alist (cl-acons name value option-alist))))
(defun lean-set-option-cont (option-record-alist)
(let* ((key-list (-map 'car option-record-alist))
@ -52,7 +61,10 @@
(option-value (lean-option-read option)))
(lean-server-send-cmd-async
(lean-cmd-set option-name option-value)
(lambda (dummy) (lean-update-option-alist option-name option-value)))))
(lambda (dummy) (setq lean-global-option-alist
(lean-update-option-alist lean-global-option-alist
option-name
option-value))))))
(defun lean-set-option ()
"Set Lean option."

View file

@ -68,12 +68,18 @@ show both of expressions and types.")
"Maximum number of flycheck messages to displaylean-flychecker checker name
(Restart required to be effective)"
:group 'lean
:type 'int)
:type 'number)
(defcustom lean-default-pp-width 120
"Width of Lean error/warning messages"
:group 'lean
:type 'int)
:type 'number)
(defcustom lean-flycheck-msg-width nil
"Width of Lean error/warning messages"
:group 'lean
:type '(choice (const :tag "Let lean-mode automatically detect this" nil)
(integer :tag "Specify the value and force lean-mode to use")))
(defcustom lean-flycheck-checker-options
`("--flycheck"

View file

@ -10,11 +10,13 @@
(require 'lean-option)
(ert-deftest lean-test-update-string-alist ()
(lean-update-option-alist "pp.implicit" 'true)
(setq lean-global-option-alist
(lean-update-option-alist lean-global-option-alist "pp.implicit" 'true))
(should
(equal (assoc-string "pp.implicit" lean-global-option-alist)
'("pp.implicit" . true)))
(lean-update-option-alist "pp.implicit" 'false)
(setq lean-global-option-alist
(lean-update-option-alist lean-global-option-alist "pp.implicit" 'false))
(should
(equal (assoc-string "pp.implicit" lean-global-option-alist)
'("pp.implicit" . false))))
@ -25,7 +27,8 @@
(format "-D%s=%d"
"pp.width"
lean-default-pp-width)))
(lean-update-option-alist "pp.width" 80)
(setq lean-global-option-alist
(lean-update-option-alist lean-global-option-alist "pp.width" 80))
(should (string= (lean-option-string)
(format "-D%s=%d"
"pp.width"