[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/idris-mode 600c8f584b 1/8: Make `idris-info-mode` derived
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/idris-mode 600c8f584b 1/8: Make `idris-info-mode` derived from `help-mode` and |
Date: |
Fri, 10 Feb 2023 16:59:20 -0500 (EST) |
branch: elpa/idris-mode
commit 600c8f584b21d650926c83c741e3e1c42adfe3dd
Author: Marek L <nospam.keram@gmail.com>
Commit: Marek L <nospam.keram@gmail.com>
Make `idris-info-mode` derived from `help-mode` and
reuse existing functionality from help-mode
for navigating through history and buffer handling.
Why:
To reduce maintanance cost of maintaining own implementation
and to improve user experience by relying on
existing Emacs conventions.
---
idris-info.el | 109 ++++++++++----------------------------------
test/idris-commands-test.el | 7 +--
test/idris-info-test.el | 76 ++++++++++++++++++++++++++++++
test/idris-tests.el | 1 +
4 files changed, 102 insertions(+), 91 deletions(-)
diff --git a/idris-info.el b/idris-info.el
index 228f596223..24ad055007 100644
--- a/idris-info.el
+++ b/idris-info.el
@@ -28,42 +28,7 @@
(require 'prop-menu)
(require 'idris-core)
(require 'idris-common-utils)
-
-
-(defvar idris-info-history (list () nil ())
- "A zipper into the history for idris-info-mode.
-It is a three-element list whose first element is the history,
-whose second element is the current item if applicable or NIL
-otherwise, and whose third element is the future.")
-
-(defun idris-info-history-clear ()
- "Reset the history for Idris info buffers."
- (setq idris-info-history (list () nil ())))
-
-(defun idris-info-history-insert (contents)
- "Insert CONTENTS into the Idris info history as the current node.
-Following the behavior of Emacs help buffers, the future is deleted."
- (pcase-let ((`(,past ,present ,_future) idris-info-history))
- (setq idris-info-history
- (if present
- (list (cons present past) contents ())
- (list past contents ())))))
-
-(defun idris-info-history-back ()
- "Move back in the Idris info history."
- (setq idris-info-history
- (pcase idris-info-history
- (`((,prev . ,past) ,present ,future)
- (list past prev (cons present future)))
- (`(() ,present ,future) (list () present future)))))
-
-(defun idris-info-history-forward ()
- "Move forward in the Idris info history."
- (setq idris-info-history
- (pcase idris-info-history
- (`(,past ,present (,next . ,future))
- (list (cons present past) next future))
- (`(,past ,present ()) (list past present ())))))
+(require 'help-mode)
(defvar idris-info-buffer-name (idris-buffer-name :info)
"The name of the buffer containing Idris help information")
@@ -71,7 +36,6 @@ Following the behavior of Emacs help buffers, the future is
deleted."
(defvar idris-info-mode-map
(let ((map (make-keymap)))
(suppress-keymap map) ; remove the self-inserting char commands
- (define-key map (kbd "q") 'idris-info-quit)
;;; Allow buttons to be clicked with the left mouse button in info buffers
(define-key map [follow-link] 'mouse-face)
(cl-loop for keyer
@@ -82,75 +46,48 @@ Following the behavior of Emacs help buffers, the future is
deleted."
map))
(easy-menu-define idris-info-mode-menu idris-info-mode-map
- "Menu for the Idris info buffer"
+ "Menu for the Idris info buffer."
`("Idris Info"
["Show term interaction widgets" idris-add-term-widgets t]
["Close Idris info buffer" idris-info-quit t]))
-(define-derived-mode idris-info-mode fundamental-mode "Idris Info"
- "Major mode used for transient Idris information buffers
- \\{idris-info-mode-map}
+(define-derived-mode idris-info-mode help-mode "Idris Info"
+ "Major mode used for transient Idris information.
+\\{idris-info-mode-map}
Invokes `idris-info-mode-hook'."
+ (setq-local prop-menu-item-functions '(idris-context-menu-items))
(set (make-local-variable 'prop-menu-item-functions)
'(idris-context-menu-items)))
-; if we use view-mode here, our key binding q would be shadowed.
(defun idris-info-buffer ()
- "Return the Idris info buffer, creating one if there is not one.
-Ensure that the buffer is in `idris-info-mode'."
+ "Return Idris info buffer."
(let ((buffer (get-buffer-create idris-info-buffer-name)))
(with-current-buffer buffer
(when (not (eq major-mode 'idris-info-mode))
(idris-info-mode)))
buffer))
-(defun idris-info-quit ()
- (interactive)
- (idris-kill-buffer idris-info-buffer-name))
-
-(defun idris-info-buffer-visible-p ()
- (if (get-buffer-window idris-info-buffer-name 'visible) t nil))
-
-(defun idris-info-show ()
- "Show the Idris info buffer."
- (interactive)
- (with-current-buffer (idris-info-buffer)
- (setq buffer-read-only t)
- (pcase-let ((inhibit-read-only t)
- (`(,past ,present ,future) idris-info-history))
- (erase-buffer)
- (when present
- (insert present)
- (insert "\n\n"))
- (when past
- (insert-button "[back]" 'action #'(lambda (_) (interactive)
(idris-info-history-back) (idris-info-show))))
- (when (and past future) (insert "\t"))
- (when future
- (insert-button "[forward]" 'action #'(lambda (_) (interactive)
(idris-info-history-forward) (idris-info-show))))
- (when (or past future) (newline))
- (goto-char (point-min))))
- (unless (idris-info-buffer-visible-p)
- (pop-to-buffer (idris-info-buffer))
- (message "Press q to close the Idris info buffer.")))
+(defalias 'idris-info-quit #'quit-window)
(defmacro with-idris-info-buffer (&rest cmds)
"Execute `CMDS' in a fresh Idris info buffer, then display it to the user."
(declare (indent defun))
- (let ((str-info (gensym "STR-INFO")))
- `(let ((,str-info (with-temp-buffer
- ,@cmds
- (buffer-string))))
- (idris-info-history-insert ,str-info)
- (idris-info-show))))
-
+ `(idris-show-info (with-temp-buffer ,@cmds (buffer-string))))
(defun idris-show-info (info-string &optional spans)
- "Show INFO-STRING in the Idris info buffer, obliterating its previous
contents."
- (with-idris-info-buffer
- (idris-propertize-spans (idris-repl-semantic-text-props spans)
- (insert info-string)))
- info-string)
-
-
+ "Show INFO-STRING with SPANS in the Idris info buffer."
+ (with-current-buffer (idris-info-buffer)
+ ;; (help-xref-following t) ensure that current buffer -> idris-info-buffer
+ ;; is recognised by `help-setup-xref' and `with-help-window'
+ ;; as `help-buffer'
+ (let ((help-xref-following t))
+ (help-setup-xref (list #'idris-show-info info-string spans)
+ (called-interactively-p 'interactive))
+ (with-help-window (current-buffer)
+ (idris-propertize-spans (idris-repl-semantic-text-props spans)
+ (insert info-string)))
+ ;; reset major-mode for idris-info-buffer
+ ;; back from help-mode to idris-info-mode
+ (idris-info-buffer))))
(provide 'idris-info)
;;; idris-info.el ends here
diff --git a/test/idris-commands-test.el b/test/idris-commands-test.el
index 98a430f0f6..ec5b6fda4d 100644
--- a/test/idris-commands-test.el
+++ b/test/idris-commands-test.el
@@ -264,7 +264,6 @@ myReverse xs = revAcc [] xs where
(7 4 ((:tt-term "AAAAAAAAAAAHAAAAAAA"))))))
(advice-add 'idris-load-file-sync :override #'idris-load-file-sync-stub)
(advice-add 'idris-eval :override #'idris-eval-stub)
-
(unwind-protect
(with-current-buffer buffer
(switch-to-buffer buffer)
@@ -273,10 +272,8 @@ myReverse xs = revAcc [] xs where
(funcall-interactively 'idris-type-at-point nil)
(should (eq file-loaded-p t))
(should (equal eval-args '((:type-of "Test"))))
- (should (string= (buffer-name) idris-info-buffer-name))
- (should (string-match-p "Test : Type"
(buffer-substring-no-properties (point-min) (point-max))))
- (idris-info-quit)
- (should (eq (current-buffer) buffer)))
+ (with-current-buffer idris-info-buffer-name
+ (should (string-match-p "Test : Type" (buffer-string)))))
(advice-remove 'idris-load-file-sync #'idris-load-file-sync-stub)
(advice-remove 'idris-eval #'idris-eval-stub)
diff --git a/test/idris-info-test.el b/test/idris-info-test.el
new file mode 100644
index 0000000000..ad1c313c7d
--- /dev/null
+++ b/test/idris-info-test.el
@@ -0,0 +1,76 @@
+;;; idris-info-test.el --- Tests related to Idris info buffer -*-
lexical-binding: t -*-
+;; Copyright (C) 2022 Marek L.
+
+;; Author: Marek L <nospam.keram@gmail.com>
+;; Keywords: languages, Idris, help-mode, Ert
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'ert)
+(require 'idris-info)
+
+(ert-deftest idris-show-info ()
+ "Test displaying information in `idris-info-buffer'."
+ (let ((info-str "Bool : Type")
+ (info-spans '((0 4 ((:name "Prelude.Bool.Bool")
+ (:implicit :False)
+ (:key "AQA")
+ (:decor :type)
+ (:doc-overview "Boolean Data Type")
+ (:type "Type")
+ (:namespace "Prelude.Bool")))
+ (7 4 ((:decor :type)
+ (:type "Type")
+ (:doc-overview "The type of types")
+ (:name "Type")))
+ (7 4 ((:tt-term "AAA"))))))
+
+ (idris-show-info info-str info-spans)
+
+ (should (window-valid-p (get-buffer-window (get-buffer
idris-info-buffer-name))))
+
+ (with-current-buffer (get-buffer idris-info-buffer-name)
+ (should (string-match-p info-str (buffer-string))))
+ ;; TODO: Assert styling, context menu etc.
+
+ ;; Cleanup
+ (kill-buffer idris-info-buffer-name)))
+
+(ert-deftest idris-info-buffer-history ()
+ "Test displaying information in `idris-info-buffer'."
+ (let ((info-str "First information")
+ (info-str2 "Second information"))
+
+ (idris-show-info info-str)
+
+ (with-current-buffer (get-buffer idris-info-buffer-name)
+ (should (string-match-p info-str (buffer-string)))
+ (should (not (string-match-p "back" (buffer-string))))
+
+ (idris-show-info info-str2)
+ (should (string-match-p info-str2 (buffer-string)))
+ (should (string-match-p "back" (buffer-string)))
+ (help-go-back)
+
+ (should (string-match-p info-str (buffer-string)))
+ (should (string-match-p "forward" (buffer-string))))
+
+ ;; Cleanup
+ (kill-buffer idris-info-buffer-name)))
+
+(provide 'idris-info-test)
+
+;;; idris-info-test.el ends here
diff --git a/test/idris-tests.el b/test/idris-tests.el
index e14944e046..8a5f8d791d 100644
--- a/test/idris-tests.el
+++ b/test/idris-tests.el
@@ -183,6 +183,7 @@
(load "idris-navigate-test")
(load "idris-repl-test")
(load "idris-xref-test")
+(load "idris-info-test")
(provide 'idris-tests)
;;; idris-tests.el ends here
- [nongnu] elpa/idris-mode updated (3f529d72cd -> c96f45d1b8), ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode 97cd55d3b5 3/8: Update changelog with unreleased user facing changes in master branch, ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode 600c8f584b 1/8: Make `idris-info-mode` derived from `help-mode` and,
ELPA Syncer <=
- [nongnu] elpa/idris-mode ad85563a4e 2/8: Update contributors list, ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode e26adc572d 6/8: Update readme with examples for `xref`, `flycheck` and `hs-minor-mode`, ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode 0de45203f0 4/8: Update readme with example installation using `use-package` and, ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode bb4f536159 5/8: Move `Tests` section from "readme" to "contributing" guide file., ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode 788f53520d 7/8: Merge pull request #614 from keram/main-idris-info-to-help-mode, ELPA Syncer, 2023/02/10
- [nongnu] elpa/idris-mode c96f45d1b8 8/8: Merge pull request #616 from keram/changelog-update, ELPA Syncer, 2023/02/10