branch: elpa/casual
commit b34477a453f98225caf6e7e9599dbeee9805df00
Author: Charles Choi <[email protected]>
Commit: Charles Choi <[email protected]>
Add Casual support for Man pages
- Adds support for Man-mode.
- Obsolete casual-info-browse-forward-paragraph.
- Obsolete casual-info-browse-backward-paragraph.
---
README.org | 8 +-
docs/agenda.org | 6 +-
docs/bookmarks.org | 8 +-
docs/calc.org | 6 +-
docs/calendar.org | 4 +
docs/casual.info | 153 +++++++++++++++++++++++++++-------
docs/casual.org | 65 ++++++++++++++-
docs/dired.org | 7 +-
docs/editkit.org | 9 +-
docs/ibuffer.org | 11 +--
docs/image.org | 8 +-
docs/images/casual-man-screenshot.png | Bin 0 -> 299315 bytes
docs/images/casual-man-settings.png | Bin 0 -> 112965 bytes
docs/info.org | 6 +-
docs/isearch.org | 6 +-
docs/make-mode.org | 3 +
docs/man.org | 94 +++++++++++++++++++++
docs/re-builder.org | 4 +
docs/timezone.org | 3 +
lisp/Makefile | 5 ++
lisp/Makefile-man.make | 30 +++++++
lisp/casual-info-utils.el | 8 ++
lisp/casual-info.el | 4 +-
lisp/casual-lib.el | 16 +++-
lisp/casual-man-settings.el | 99 ++++++++++++++++++++++
lisp/casual-man-utils.el | 62 ++++++++++++++
lisp/casual-man.el | 132 +++++++++++++++++++++++++++++
lisp/casual.el | 4 +
tests/Makefile | 9 +-
tests/casual-man-test-utils.el | 40 +++++++++
tests/test-casual-info.el | 4 +-
tests/test-casual-man-settings.el | 56 +++++++++++++
tests/test-casual-man-utils.el | 56 +++++++++++++
tests/test-casual-man.el | 91 ++++++++++++++++++++
34 files changed, 958 insertions(+), 59 deletions(-)
diff --git a/README.org b/README.org
index 841dd37649..6a1f8b1ea9 100644
--- a/README.org
+++ b/README.org
@@ -42,6 +42,7 @@ Editorially, all design decisions for Casual are ultimately
the opinion of Charl
- [[#info-elisp-library-casual-info][Info (Elisp library: ~casual-info~)]]
- [[#i-search-elisp-library-casual-isearch][I-Search (Elisp library:
~casual-isearch~)]]
- [[#make-elisp-library-casual-make][Make (Elisp library: ~casual-make~)]]
+ - [[#man-elisp-library-casual-man][Man (Elisp library: ~casual-man~)]]
- [[#re-builder-elisp-library-casual-re-builder][Re-Builder (Elisp library:
~casual-re-builder~)]]
- [[#timezone-elisp-library-casual-timezone][Timezone (Elisp library:
~casual-timezone~)]]
- [[#requirements][Requirements]]
@@ -80,7 +81,6 @@ An interface for
[[https://www.gnu.org/software/emacs/manual/html_node/emacs/Cal
[[file:docs/images/casual-calendar-screenshot.png]]
-
** [[file:docs/dired.org][Dired]] (Elisp library: ~casual-dired~)
An interface for the venerable file manager Dired.
@@ -118,6 +118,11 @@ An interface for ~make-mode~, a mode tailored for editing
a Makefile.
[[file:docs/make-mode.org][file:docs/images/casual-make-screenshot.png]]
+** [[file:docs/man.org][Man]] (Elisp library: ~casual-man~)
+An interface for ~Man-mode~, a Man page reader.
+
+[[file:docs/man.org][file:docs/images/casual-man-screenshot.png]]
+
** [[file:docs/re-builder.org][Re-Builder]] (Elisp library:
~casual-re-builder~)
An interface for the Emacs regular expression tool.
@@ -155,6 +160,7 @@ Configuration of a particular Casual user interface is
performed per mode. Go to
- [[file:docs/info.org::*Install][Info]]
- [[file:docs/isearch.org::*Install][I-Search]]
- [[file:docs/make-mode.org::*Install][Make]]
+- [[file:docs/man.org::*Install][Man]]
- [[file:docs/re-builder.org::*Install][Re-Builder]]
** Upgrading to Casual 2.x
diff --git a/docs/agenda.org b/docs/agenda.org
index 20bf51f418..45a06fe6b7 100644
--- a/docs/agenda.org
+++ b/docs/agenda.org
@@ -71,6 +71,7 @@ If you enjoy using Casual Agenda, consider making a modest
financial contributio
[[https://www.buymeacoffee.com/kickingvegas][file:images/default-yellow.png]]
* See Also
+- [[file:agenda.org][Agenda]]
- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
@@ -80,4 +81,7 @@ If you enjoy using Casual Agenda, consider making a modest
financial contributio
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/bookmarks.org b/docs/bookmarks.org
index 9ca553b920..386c81b979 100644
--- a/docs/bookmarks.org
+++ b/docs/bookmarks.org
@@ -69,6 +69,7 @@ If you enjoy using Casual Bookmarks, consider making a modest
financial contribu
* See Also
- [[file:agenda.org][Agenda]]
+- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
- [[file:dired.org][Dired]]
@@ -77,6 +78,7 @@ If you enjoy using Casual Bookmarks, consider making a modest
financial contribu
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
-
-
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/calc.org b/docs/calc.org
index bdd7f701db..f237e34b19 100644
--- a/docs/calc.org
+++ b/docs/calc.org
@@ -56,6 +56,7 @@ If you enjoy using Casual Calc, consider making a modest
financial contribution
* See Also
- [[file:agenda.org][Agenda]]
- [[file:bookmarks.org][Bookmarks]]
+- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
- [[file:dired.org][Dired]]
- [[file:editkit.org][EditKit (numerous editing commands)]]
@@ -63,4 +64,7 @@ If you enjoy using Casual Calc, consider making a modest
financial contribution
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/calendar.org b/docs/calendar.org
index 83b1d83b6f..031075bdbd 100644
--- a/docs/calendar.org
+++ b/docs/calendar.org
@@ -86,10 +86,14 @@ If you enjoy using Casual Calendar, consider making a
modest financial contribut
- [[file:agenda.org][Agenda]]
- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
+- [[file:calendar.org][Calendar]]
- [[file:dired.org][Dired]]
- [[file:editkit.org][EditKit (numerous editing commands)]]
- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/casual.info b/docs/casual.info
index d3ef8b6e48..76c198fd5d 100644
--- a/docs/casual.info
+++ b/docs/casual.info
@@ -11,7 +11,7 @@ File: casual.info, Node: Top, Next: Motivations, Up: (dir)
Casual User Guide
*****************
-Version: 2.5.1
+Version: 2.6.0
Casual is a project to re-imagine the primary user interface for Emacs
using keyboard-driven menus.
@@ -66,6 +66,7 @@ Casual Modes
* Info::
* I-Search::
* Make::
+* Man::
* RE-Builder::
* Timezone::
@@ -212,6 +213,7 @@ The following modes are supported by Casual:
* Info::
* I-Search::
* Make::
+* Man::
* RE-Builder::
* Timezone::
@@ -931,7 +933,7 @@ References
• *note I-Search: (emacs)Incremental Search.
-File: casual.info, Node: Make, Next: RE-Builder, Prev: I-Search, Up:
Casual Modes
+File: casual.info, Node: Make, Next: Man, Prev: I-Search, Up: Casual Modes
4.11 Make
=========
@@ -1010,9 +1012,96 @@ References
• *note Automatic Variables: (make)Automatic Variables.
-File: casual.info, Node: RE-Builder, Next: Timezone, Prev: Make, Up:
Casual Modes
+File: casual.info, Node: Man, Next: RE-Builder, Prev: Make, Up: Casual
Modes
-4.12 RE-Builder
+4.12 Man
+========
+
+Casual Man is a user interface for ‘Man-mode’, a Man page reader.
+
+Configuration
+=============
+
+In your initialization file, bind the Transient ‘casual-man-tmenu’ to
+your key binding of preference.
+
+ (require 'casual-man) ; optional
+ (keymap-set Man-mode-map "C-o" #'casual-man-tmenu)
+
+‘casual-man-tmenu’ deviates from the default bindings of ‘Man-mode-map’
+as shown in the table below.
+
+Default Binding Casual Binding Command
Notes
+-------------------------------------------------------------------------------------------------------------------------------------
+n [ Man-previous-section
Make consistent with Casual Dired and IBuffer behavior.
+p ] Man-next-section
Make consistent with Casual Dired and IBuffer behavior.
+k K Man Kill
Reserve k for navigation.
+ k previous-line
+ j next-line
+ n casual-lib-browser-forward-paragraph Use
to navigate paragraph forward.
+ p casual-lib-browser-backward-paragraph Use
to navigate paragraph backward.
+
+The following keybindings are recommended to support consistent behavior
+between ‘Man-mode’ and ‘casual-man-tmenu’.
+
+ (keymap-set Man-mode-map "n" #'casual-lib-browse-forward-paragraph)
+ (keymap-set Man-mode-map "p" #'casual-lib-browse-backward-paragraph)
+ (keymap-set Man-mode-map "[" #'Man-previous-section)
+ (keymap-set Man-mode-map "]" #'Man-next-section)
+ (keymap-set Man-mode-map "j" #'next-line)
+ (keymap-set Man-mode-map "k" #'previous-line)
+ (keymap-set Man-mode-map "o" #'casual-man-occur-options)
+
+Usage
+=====
+
+Basic Usage
+-----------
+
+The Man page reader can be invoked via ‘M-x man’, where the user is
+prompted for a search key. This search key is typically the name of a
+command that has an associated Man page. In the Man page window,
+pressing ‘C-o’ (or your binding of preference) will raise the menu
+‘casual-man-tmenu’.
+
+The following sections are offered in the menu:
+
+Navigation
+ Navigation commands with the document.
+Paragraph
+ Navigation commands by paragraph.
+Section
+ Navigation commands by section.
+Link
+ Jump to other Man pages referenced in the current Man page.
+Page
+ If the Man page reader is configured to display all manual pages
+ for a given search key, navigation commands for multiple pages is
+ provided.
+
+Options Navigation
+------------------
+
+‘casual-man-tmenu’ provides the menu item ‘o’ which runs the command
+‘casual-man-occur-options’. This will invoke ‘occur’ with a regexp that
+searches for command line options (for example, "-foo", "-a") that can
+be navigated via the ‘occur’ interface.
+
+Settings
+--------
+
+By default, the Man page reader will _not_ display all manual pages for
+given search key. This can be changed in the Settings menu
+‘casual-man-settings-tmenu’ that can be invoked by pressing ‘,’ in
+‘casual-man-tmenu’.
+
+Press ‘s’ and configure ‘Man-switches’ to have the value "-a" to get all
+manual pages.
+
+
+File: casual.info, Node: RE-Builder, Next: Timezone, Prev: Man, Up: Casual
Modes
+
+4.13 RE-Builder
===============
Casual RE-Builder is a user interface for RE-Builder. Its top level
@@ -1104,7 +1193,7 @@ References
File: casual.info, Node: Timezone, Prev: RE-Builder, Up: Casual Modes
-4.13 Timezone
+4.14 Timezone
=============
Casual Timezone is a library of commands to work with different time
@@ -1382,6 +1471,9 @@ File: casual.info, Node: Index, Next: Variable Index,
Prev: Acknowledgments,
* Make: Make. (line 6)
* Make Configuration: Make. (line 12)
* Make Usage: Make. (line 21)
+* Man: Man. (line 6)
+* Man Configuration: Man. (line 11)
+* Man Usage: Man. (line 43)
* Motivations: Motivations. (line 5)
* RE-Builder: RE-Builder. (line 6)
* RE-Builder Configuration: RE-Builder. (line 12)
@@ -1413,31 +1505,32 @@ File: casual.info, Node: Variable Index, Prev: Index,
Up: Top
Tag Table:
Node: Top228
-Node: Motivations1936
-Node: Requirements3429
-Node: Transient Conventions3693
-Node: Casual Modes5421
-Node: Agenda6426
-Node: Bookmarks7983
-Node: Calc10258
-Node: Calendar13399
-Node: Dired14747
-Node: EditKit17972
-Node: IBuffer19696
-Node: Image21761
-Node: Info23002
-Node: I-Search24468
-Node: Make25629
-Node: RE-Builder28013
-Node: Timezone31437
-Node: UX Conventions34829
-Node: Customization37530
-Node: Feedback & Discussion37904
-Node: Sponsorship38322
-Node: About38616
-Node: Acknowledgments38893
-Node: Index39275
-Node: Variable Index43615
+Node: Motivations1944
+Node: Requirements3437
+Node: Transient Conventions3701
+Node: Casual Modes5429
+Node: Agenda6442
+Node: Bookmarks7999
+Node: Calc10274
+Node: Calendar13415
+Node: Dired14763
+Node: EditKit17988
+Node: IBuffer19712
+Node: Image21777
+Node: Info23018
+Node: I-Search24484
+Node: Make25645
+Node: Man28022
+Node: RE-Builder31409
+Node: Timezone34832
+Node: UX Conventions38224
+Node: Customization40925
+Node: Feedback & Discussion41299
+Node: Sponsorship41717
+Node: About42011
+Node: Acknowledgments42288
+Node: Index42670
+Node: Variable Index47229
End Tag Table
diff --git a/docs/casual.org b/docs/casual.org
index 2a174cf1f6..9396494614 100644
--- a/docs/casual.org
+++ b/docs/casual.org
@@ -6,7 +6,7 @@
#+OPTIONS: ':t toc:t author:t email:t compact-itemx:t
#+LANGUAGE: en
-#+MACRO: version 2.5.1
+#+MACRO: version 2.6.0
#+TEXINFO_FILENAME: casual.info
#+TEXINFO_HEADER: @syncodeindex pg cp
@@ -751,6 +751,69 @@ Unless you edit makefiles frequently, it is very unlikely
to be able to recall w
#+TEXINFO: @unnumberedsec References
- [[info:make#Automatic Variables][Automatic Variables]]
+** Man
+#+CINDEX: Man
+
+Casual Man is a user interface for ~Man-mode~, a Man page reader.
+
+#+TEXINFO: @unnumberedsec Configuration
+#+CINDEX: Man Configuration
+
+In your initialization file, bind the Transient ~casual-man-tmenu~ to your key
binding of preference.
+
+#+begin_src elisp :lexical no
+ (require 'casual-man) ; optional
+ (keymap-set Man-mode-map "C-o" #'casual-man-tmenu)
+#+end_src
+
+~casual-man-tmenu~ deviates from the default bindings of ~Man-mode-map~ as
shown in the table below.
+
+| Default Binding | Casual Binding | Command |
Notes |
+|-----------------+----------------+---------------------------------------+---------------------------------------------------------|
+| n | [ | Man-previous-section |
Make consistent with Casual Dired and IBuffer behavior. |
+| p | ] | Man-next-section |
Make consistent with Casual Dired and IBuffer behavior. |
+| k | K | Man Kill |
Reserve k for navigation. |
+| | k | previous-line |
|
+| | j | next-line |
|
+| | n | casual-lib-browser-forward-paragraph |
Use to navigate paragraph forward. |
+| | p | casual-lib-browser-backward-paragraph |
Use to navigate paragraph backward. |
+
+The following keybindings are recommended to support consistent behavior
between ~Man-mode~ and ~casual-man-tmenu~.
+
+#+begin_src elisp :lexical no
+ (keymap-set Man-mode-map "n" #'casual-lib-browse-forward-paragraph)
+ (keymap-set Man-mode-map "p" #'casual-lib-browse-backward-paragraph)
+ (keymap-set Man-mode-map "[" #'Man-previous-section)
+ (keymap-set Man-mode-map "]" #'Man-next-section)
+ (keymap-set Man-mode-map "j" #'next-line)
+ (keymap-set Man-mode-map "k" #'previous-line)
+ (keymap-set Man-mode-map "o" #'casual-man-occur-options)
+#+end_src
+
+#+TEXINFO: @unnumberedsec Usage
+#+CINDEX: Man Usage
+
+#+TEXINFO: @unnumberedsubsec Basic Usage
+
+The Man page reader can be invoked via ~M-x man~, where the user is prompted
for a search key. This search key is typically the name of a command that has
an associated Man page. In the Man page window, pressing ~C-o~ (or your binding
of preference) will raise the menu ~casual-man-tmenu~.
+
+The following sections are offered in the menu:
+
+- Navigation :: Navigation commands with the document.
+- Paragraph :: Navigation commands by paragraph.
+- Section :: Navigation commands by section.
+- Link :: Jump to other Man pages referenced in the current Man page.
+- Page :: If the Man page reader is configured to display all manual pages for
a given search key, navigation commands for multiple pages is provided.
+
+#+TEXINFO: @unnumberedsubsec Options Navigation
+
+~casual-man-tmenu~ provides the menu item ‘o’ which runs the command
~casual-man-occur-options~. This will invoke ~occur~ with a regexp that
searches for command line options (for example, "--foo", "-a") that can be
navigated via the ~occur~ interface.
+
+#+TEXINFO: @unnumberedsubsec Settings
+
+By default, the Man page reader will /not/ display all manual pages for given
search key. This can be changed in the Settings menu
~casual-man-settings-tmenu~ that can be invoked by pressing ‘,’ in
~casual-man-tmenu~.
+
+Press ‘s’ and configure ~Man-switches~ to have the value "-a" to get all
manual pages.
** RE-Builder
#+CINDEX: RE-Builder
diff --git a/docs/dired.org b/docs/dired.org
index 5c6116b668..43984452ca 100644
--- a/docs/dired.org
+++ b/docs/dired.org
@@ -147,15 +147,18 @@ If you enjoy using Casual Dired, consider making a modest
financial contribution
[[https://www.buymeacoffee.com/kickingvegas][file:images/default-yellow.png]]
-
* See Also
- [[file:agenda.org][Agenda]]
- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
+- [[file:dired.org][Dired]]
- [[file:editkit.org][EditKit (numerous editing commands)]]
- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/editkit.org b/docs/editkit.org
index 7c24d640e7..c91041a716 100644
--- a/docs/editkit.org
+++ b/docs/editkit.org
@@ -206,14 +206,17 @@ If you enjoy using Casual EditKit, consider making a
modest financial contributi
[[https://www.buymeacoffee.com/kickingvegas][file:images/default-yellow.png]]
* See Also
-- [[file:agenda.org][Org Agenda]]
+- [[file:agenda.org][Agenda]]
- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
- [[file:dired.org][Dired]]
+- [[file:editkit.org][EditKit (numerous editing commands)]]
- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
-
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/ibuffer.org b/docs/ibuffer.org
index 0420f57e64..e4325a574d 100644
--- a/docs/ibuffer.org
+++ b/docs/ibuffer.org
@@ -164,12 +164,13 @@ If you enjoy using Casual IBuffer, consider making a
modest financial contributi
- [[file:bookmarks.org][Bookmarks]]
- [[file:calc.org][Calc]]
- [[file:calendar.org][Calendar]]
+- [[file:dired.org][Dired]]
- [[file:editkit.org][EditKit (numerous editing commands)]]
+- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
-
-* Acknowledgments
-A heartfelt thanks to all the contributors to IBuffer and
[[https://github.com/magit/transient][Transient]]. Casual IBuffer would not be
possible without your efforts.
-
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/image.org b/docs/image.org
index dde966e8de..967d415965 100644
--- a/docs/image.org
+++ b/docs/image.org
@@ -81,8 +81,10 @@ If you enjoy using Casual Image, consider making a modest
financial contribution
- [[file:dired.org][Dired]]
- [[file:editkit.org][EditKit (numerous editing commands)]]
- [[file:ibuffer.org][IBuffer]]
+- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
-
-
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/images/casual-man-screenshot.png
b/docs/images/casual-man-screenshot.png
new file mode 100644
index 0000000000..735e77b71d
Binary files /dev/null and b/docs/images/casual-man-screenshot.png differ
diff --git a/docs/images/casual-man-settings.png
b/docs/images/casual-man-settings.png
new file mode 100644
index 0000000000..82f48d4246
Binary files /dev/null and b/docs/images/casual-man-settings.png differ
diff --git a/docs/info.org b/docs/info.org
index 9fb5848745..6420074842 100644
--- a/docs/info.org
+++ b/docs/info.org
@@ -60,5 +60,9 @@ If you enjoy using Casual Info, consider making a modest
financial contribution
- [[file:editkit.org][EditKit (numerous editing commands)]]
- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
+- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
-- [[file:re-builder.org][Re-Builder]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/isearch.org b/docs/isearch.org
index 7eca14192f..2616fb8d5e 100644
--- a/docs/isearch.org
+++ b/docs/isearch.org
@@ -70,4 +70,8 @@ If you enjoy using Casual I-Search, consider making a modest
financial contribut
- [[file:ibuffer.org][IBuffer]]
- [[file:image.org][Image]]
- [[file:info.org][Info]]
-- [[file:re-builder.org][Re-Builder]]
+- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/make-mode.org b/docs/make-mode.org
index 8c9227968a..ec4609e9e9 100644
--- a/docs/make-mode.org
+++ b/docs/make-mode.org
@@ -73,4 +73,7 @@ If you enjoy using Casual Make, consider making a modest
financial contribution
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/man.org b/docs/man.org
new file mode 100644
index 0000000000..7ce7b37c37
--- /dev/null
+++ b/docs/man.org
@@ -0,0 +1,94 @@
+[[../README.org][❮ Back to Casual]]
+
+* Casual Man
+
+Casual Man is a user interface for ~Man-mode~, a Man page reader.
+
+[[file:images/casual-man-screenshot.png]]
+
+* Install
+
+In your initialization file, bind the Transient ~casual-man-tmenu~ to your key
binding of preference.
+
+#+begin_src elisp :lexical no
+ (require 'casual-man) ; optional
+ (keymap-set Man-mode-map "C-o" #'casual-man-tmenu)
+#+end_src
+
+~casual-man-tmenu~ deviates from the default bindings of ~Man-mode-map~ as
shown in the table below.
+
+| Default Binding | Casual Binding | Command |
Notes |
+|-----------------+----------------+---------------------------------------+---------------------------------------------------------|
+| n | [ | Man-previous-section |
Make consistent with Casual Dired and IBuffer behavior. |
+| p | ] | Man-next-section |
Make consistent with Casual Dired and IBuffer behavior. |
+| k | K | Man-kill |
Reserve k for navigation. |
+| | k | previous-line |
|
+| | j | next-line |
|
+| | n | casual-lib-browser-forward-paragraph |
Use to navigate paragraph forward. |
+| | p | casual-lib-browser-backward-paragraph |
Use to navigate paragraph backward. |
+
+The following keybindings are recommended to support consistent behavior
between ~Man-mode~ and ~casual-man-tmenu~.
+
+#+begin_src elisp :lexical no
+ (keymap-set Man-mode-map "n" #'casual-lib-browse-forward-paragraph)
+ (keymap-set Man-mode-map "p" #'casual-lib-browse-backward-paragraph)
+ (keymap-set Man-mode-map "[" #'Man-previous-section)
+ (keymap-set Man-mode-map "]" #'Man-next-section)
+ (keymap-set Man-mode-map "j" #'next-line)
+ (keymap-set Man-mode-map "k" #'previous-line)
+ (keymap-set Man-mode-map "K" #'Man-kill)
+ (keymap-set Man-mode-map "o" #'casual-man-occur-options)
+#+end_src
+
+* Usage
+
+** Basic Usage
+
+The Man page reader can be invoked via ~M-x man~, where the user is prompted
for a search key. This search key is typically the name of a command that has
an associated Man page. In the Man page window, pressing ~C-o~ (or your binding
of preference) will raise the menu ~casual-man-tmenu~.
+
+The following sections are offered in the menu:
+
+- Navigation :: Navigation commands with the document.
+- Paragraph :: Navigation commands by paragraph.
+- Section :: Navigation commands by section.
+- Link :: Jump to other Man pages referenced in the current Man page.
+- Page :: If the Man page reader is configured to display all manual pages for
a given search key, navigation commands for multiple pages is provided.
+
+*** Options Navigation
+
+~casual-man-tmenu~ provides the menu item ‘o’ which runs the command
~casual-man-occur-options~. This will invoke ~occur~ with a regexp that
searches for command line options (for example, "--foo", "-a") that can be
navigated via the ~occur~ interface.
+
+*** Settings
+
+By default, the Man page reader will /not/ display all manual pages for given
search key. This can be changed in the Settings menu
~casual-man-settings-tmenu~ that can be invoked by pressing ‘,’ in
~casual-man-tmenu~.
+
+Press ‘s’ and configure ~Man-switches~ to have the value "-a" to get all
manual pages.
+
+
+[[file:images/casual-man-settings.png]]
+
+
+*** Unicode Symbol Support
+By enabling “Use Unicode Symbols” from the Settings menu, Casual Man will use
Unicode symbols as appropriate in its menus.
+
+* Sponsorship
+If you enjoy using Casual Man, consider making a modest financial contribution
to help support its development and maintenance.
+
+[[https://www.buymeacoffee.com/kickingvegas][file:images/default-yellow.png]]
+
+* See Also
+- [[file:agenda.org][Agenda]]
+- [[file:bookmarks.org][Bookmarks]]
+- [[file:calc.org][Calc]]
+- [[file:calendar.org][Calendar]]
+- [[file:dired.org][Dired]]
+- [[file:editkit.org][EditKit (numerous editing commands)]]
+- [[file:ibuffer.org][IBuffer]]
+- [[file:image.org][Image]]
+- [[file:info.org][Info]]
+- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
+
diff --git a/docs/re-builder.org b/docs/re-builder.org
index 441b618a3b..60f406ad87 100644
--- a/docs/re-builder.org
+++ b/docs/re-builder.org
@@ -69,3 +69,7 @@ If you enjoy using Casual RE-Builder, consider making a
modest financial contrib
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
+- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/docs/timezone.org b/docs/timezone.org
index 10bf07d1db..d46194b05a 100644
--- a/docs/timezone.org
+++ b/docs/timezone.org
@@ -48,4 +48,7 @@ If you enjoy using Casual Timezone, consider making a modest
financial contribut
- [[file:image.org][Image]]
- [[file:info.org][Info]]
- [[file:isearch.org][I-Search]]
+- [[file:make-mode.org][Make]]
+- [[file:man.org][Man]]
- [[file:re-builder.org][RE-Builder]]
+- [[file:timezone.org][Timezone]]
diff --git a/lisp/Makefile b/lisp/Makefile
index 3eb825b835..06924dc3aa 100644
--- a/lisp/Makefile
+++ b/lisp/Makefile
@@ -29,6 +29,7 @@ ibuffer-tests \
info-tests \
isearch-tests \
make-mode-tests \
+man-tests \
re-builder-tests \
timezone-tests
@@ -80,6 +81,10 @@ isearch-tests:
make-mode-tests:
$(MAKE) -C $(SRC_DIR) -f Makefile-make-mode.make tests
+.PHONY: man-tests
+man-tests:
+ $(MAKE) -C $(SRC_DIR) -f Makefile-man.make tests
+
.PHONY: re-builder-tests
re-builder-tests:
$(MAKE) -C $(SRC_DIR) -f Makefile-re-builder.make tests
diff --git a/lisp/Makefile-man.make b/lisp/Makefile-man.make
new file mode 100644
index 0000000000..76dd12ead4
--- /dev/null
+++ b/lisp/Makefile-man.make
@@ -0,0 +1,30 @@
+##
+# Copyright (C) 2025 Charles Y. Choi
+#
+# 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 <https://www.gnu.org/licenses/>.
+
+include Makefile--defines.make
+
+PACKAGE_NAME=casual-man
+ELISP_INCLUDES=casual-man-utils.el \
+casual-man-settings.el
+ELISP_PACKAGES=
+ELISP_TEST_INCLUDES=casual-man-test-utils.el
+PACKAGE_PATHS= \
+-L $(EMACS_ELPA_DIR)/compat-current \
+-L $(EMACS_ELPA_DIR)/seq-current \
+-L $(EMACS_ELPA_DIR)/transient-current \
+-L $(CASUAL_LIB_LISP_DIR)
+
+include Makefile--rules.make
diff --git a/lisp/casual-info-utils.el b/lisp/casual-info-utils.el
index f43c58e17f..30c87177ce 100644
--- a/lisp/casual-info-utils.el
+++ b/lisp/casual-info-utils.el
@@ -62,6 +62,10 @@ plain ASCII-range string."
(backward-paragraph 2)
(forward-line))
+(make-obsolete #'casual-info-browse-backward-paragraph
+ #'casual-lib-browse-backward-paragraph
+ "2.6.0")
+
(defun casual-info-browse-forward-paragraph ()
"Move point forward paragraph such that the first line is highlighted.
\nThis function is intended to be used with `hl-line-mode'."
@@ -69,5 +73,9 @@ plain ASCII-range string."
(forward-paragraph)
(forward-line))
+(make-obsolete #'casual-info-browse-forward-paragraph
+ #'casual-lib-browse-forward-paragraph
+ "2.6.0")
+
(provide 'casual-info-utils)
;;; casual-info-utils.el ends here
diff --git a/lisp/casual-info.el b/lisp/casual-info.el
index 4a81ed2c1e..130a76cbc9 100644
--- a/lisp/casual-info.el
+++ b/lisp/casual-info.el
@@ -107,10 +107,10 @@
["Paragraph"
:description (lambda () (casual-info-unicode-get :paragraph))
- ("p" "Previous" casual-info-browse-backward-paragraph
+ ("p" "Previous" casual-lib-browse-backward-paragraph
:description (lambda () (casual-info-unicode-get :up-arrow))
:transient t)
- ("n" "Next" casual-info-browse-forward-paragraph
+ ("n" "Next" casual-lib-browse-forward-paragraph
:description (lambda () (casual-info-unicode-get :down-arrow))
:transient t)]
diff --git a/lisp/casual-lib.el b/lisp/casual-lib.el
index 071f0c1622..7efb4d8017 100644
--- a/lisp/casual-lib.el
+++ b/lisp/casual-lib.el
@@ -69,7 +69,7 @@ when appropriate."
- KEY symbol used to lookup Unicode symbol in DB.
- DB alist containing Unicode symbol map.
-If the value of customizable variable `casual-lib-use-unicode'
+ the value of customizable variable `casual-lib-use-unicode'
is non-nil, then the Unicode symbol is returned, otherwise a
plain ASCII-range string."
(let* ((db db)
@@ -130,6 +130,20 @@ V is either nil or non-nil."
"‹Back"
"Dismiss"))
+(defun casual-lib-browse-backward-paragraph ()
+ "Move point backward paragraph such that the first line is highlighted.
+\nThis function is intended to be used with `hl-line-mode'."
+ (interactive)
+ (backward-paragraph 2)
+ (forward-line))
+
+(defun casual-lib-browse-forward-paragraph ()
+ "Move point forward paragraph such that the first line is highlighted.
+\nThis function is intended to be used with `hl-line-mode'."
+ (interactive)
+ (forward-paragraph)
+ (forward-line))
+
;; Transients
(transient-define-suffix casual-lib-quit-all ()
"Casual suffix to call `transient-quit-all'."
diff --git a/lisp/casual-man-settings.el b/lisp/casual-man-settings.el
new file mode 100644
index 0000000000..74049e8b0d
--- /dev/null
+++ b/lisp/casual-man-settings.el
@@ -0,0 +1,99 @@
+;;; casual-man-settings.el --- Casual Man Settings -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'casual-lib)
+
+(transient-define-prefix casual-man-settings-tmenu ()
+ "Casual Man settings menu."
+ ["Casual Man: Settings"
+ [("s" "Switches" casual-man--customize-man-switches)
+ ("S" "Call Synchronously"
casual-man--customize-man-prefer-synchronous-call)
+ ("r" "Support Remote" casual-man--customize-man-support-remote-systems)]
+
+ [("G" "Man Group" casual-man--customize-group)
+ (casual-lib-customize-unicode)
+ (casual-lib-customize-hide-navigation)]]
+
+ [:class transient-row
+ (casual-lib-quit-one)
+ ("a" "About" casual-man-about :transient nil)
+ (casual-lib-quit-all)])
+
+(defun casual-man--customize-group ()
+ "Customize Manfile group."
+ (interactive)
+ (customize-group "man"))
+
+(defun casual-man--customize-man-switches ()
+ "Switch values passed to the man command, as a single string.
+
+Customize `Man-switches'."
+ (interactive)
+ (customize-variable 'Man-switches))
+
+(defun casual-man--customize-man-prefer-synchronous-call ()
+ "Whether to call the Un*x \"man\" program synchronously.
+
+Customize `Man-prefer-synchronous-call'."
+ (interactive)
+ (customize-variable 'Man-prefer-synchronous-call))
+
+(defun casual-man--customize-man-support-remote-systems ()
+ "Whether to call the Un*x \"man\" program on remote systems.
+
+Customize `Man-support-remote-systems'."
+ (interactive)
+ (customize-variable 'Man-support-remote-systems))
+
+
+(defun casual-man-about-man ()
+ "Casual Man is a Transient menu for man pages.
+
+Learn more about using Casual Man at our discussion group on GitHub.
+Any questions or comments about it should be made there.
+URL `https://github.com/kickingvegas/casual/discussions'
+
+If you find a bug or have an enhancement request, please file an issue.
+Our best effort will be made to answer it.
+URL `https://github.com/kickingvegas/casual/issues'
+
+If you enjoy using Casual Man, consider making a modest financial
+contribution to help support its development and maintenance.
+URL `https://www.buymeacoffee.com/kickingvegas'
+
+Casual Man was conceived and crafted by Charles Choi in San Francisco,
+California.
+
+Thank you for using Casual Man.
+
+Always choose love."
+ (ignore))
+
+(defun casual-man-about ()
+ "About information for Casual Man."
+ (interactive)
+ (describe-function #'casual-man-about-man))
+
+(provide 'casual-man-settings)
+;;; casual-man-settings.el ends here
diff --git a/lisp/casual-man-utils.el b/lisp/casual-man-utils.el
new file mode 100644
index 0000000000..02b34eb4d7
--- /dev/null
+++ b/lisp/casual-man-utils.el
@@ -0,0 +1,62 @@
+;;; casual-man-utils.el --- Casual Man Utils -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'man)
+(require 'casual-lib)
+
+(defconst casual-man-unicode-db
+ '((:previous . '("↑" "Previous"))
+ (:next . '("↓" "Next"))
+ (:goto . '("→" "Goto…"))
+ (:follow . '("🔗…" "Follow…"))
+ (:beginning-of-buffer . '("⇱" "Beginning"))
+ (:end-of-buffer . '("⇲" "End"))
+ (:paragraph . '("¶" "Paragraph"))
+ (:update . '("⟳" "Update"))
+ (:kill . '("×" "Close"))
+ (:see-also . '("👀" "See Also")))
+
+ "Unicode symbol DB to use for Man Transient menus.")
+
+(defun casual-man-unicode-get (key)
+ "Lookup Unicode symbol for KEY in DB.
+
+- KEY symbol used to lookup Unicode symbol in DB.
+
+If the value of customizable variable `casual-lib-use-unicode'
+is non-nil, then the Unicode symbol is returned, otherwise a
+plain ASCII-range string."
+ (casual-lib-unicode-db-get key casual-man-unicode-db))
+
+(defun casual-man-occur-options ()
+ "Show options for current man page with occur."
+ (interactive)
+ (occur "^[[:blank:]]*[-+]+[[:alnum:]-=_]*"))
+
+(defun casual-man-info ()
+ "Open Info for Emacs Man Page."
+ (interactive) (info "(emacs) Man Page"))
+
+(provide 'casual-man-utils)
+;;; casual-man-utils.el ends here
diff --git a/lisp/casual-man.el b/lisp/casual-man.el
new file mode 100644
index 0000000000..c0bc651d94
--- /dev/null
+++ b/lisp/casual-man.el
@@ -0,0 +1,132 @@
+;;; casual-man.el --- Transient UI for Man -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library provides a Transient-based user interface for `Man-mode'.
+
+;; INSTALLATION
+
+;; In your initialization file, bind the Transient `casual-man-tmenu' to your
+;; key binding of preference.
+
+;; (require 'casual-man) ; optional if using autoloaded menu
+;; (keymap-set Man-mode-map "C-o" #'casual-man-tmenu)
+
+;; `casual-man-tmenu' uses bindings that are consistent with Casual Dired and
+;; IBuffer by using "[" and "]" for section navigation.
+
+;; The following keybindings are recommended to support consistent behavior
+;; between `Man-mode' and `casual-man-tmenu'.
+
+;; (keymap-set Man-mode-map "n" #'casual-lib-browse-forward-paragraph)
+;; (keymap-set Man-mode-map "p" #'casual-lib-browse-backward-paragraph)
+;; (keymap-set Man-mode-map "[" #'Man-previous-section)
+;; (keymap-set Man-mode-map "]" #'Man-next-section)
+;; (keymap-set Man-mode-map "j" #'next-line)
+;; (keymap-set Man-mode-map "k" #'previous-line)
+;; (keymap-set Man-mode-map "K" #'Man-kill)
+;; (keymap-set Man-mode-map "o" #'casual-man-occur-options)
+
+;;; Code:
+(require 'bookmark)
+(require 'casual-man-settings)
+(require 'casual-man-utils)
+
+;;;###autoload (autoload 'casual-man-tmenu "casual-man" nil t)
+(transient-define-prefix casual-man-tmenu ()
+ "Casual Man page main menu."
+ ["Casual Man"
+ :description (lambda () (format "Casual Man: %s" Man-page-mode-string))
+ ["Navigation"
+ :pad-keys t
+ ("." "Beginning" beginning-of-buffer
+ :description (lambda () (casual-man-unicode-get :beginning-of-buffer))
+ :transient t)
+ (">" "End" end-of-buffer
+ :description (lambda () (casual-man-unicode-get :end-of-buffer))
+ :transient t)
+ ("C-p" "Previous" previous-line
+ :description (lambda () (casual-man-unicode-get :previous))
+ :transient t)
+ ("C-n" "Next" next-line
+ :description (lambda () (casual-man-unicode-get :next))
+ :transient t)
+ ("o" "Options" casual-man-occur-options)]
+
+ ["Paragraph"
+ :description (lambda () (casual-man-unicode-get :paragraph))
+ ("p" "Backward" casual-lib-browse-backward-paragraph
+ :description (lambda () (casual-man-unicode-get :previous))
+ :transient t)
+ ("n" "Forward" casual-lib-browse-forward-paragraph
+ :description (lambda () (casual-man-unicode-get :next))
+ :transient t)]
+
+ ["Section"
+ ("[" "Previous" Man-previous-section
+ :description (lambda () (casual-man-unicode-get :previous))
+ :transient t)
+ ("]" "Next" Man-next-section
+ :description (lambda () (casual-man-unicode-get :next))
+ :transient t)
+ ("g" "Goto…" Man-goto-section
+ :description (lambda () (casual-man-unicode-get :goto))
+ :transient t)
+ ("s" "See Also" Man-goto-see-also-section
+ :description (lambda () (casual-man-unicode-get :see-also))
+ :transient t)]
+
+ ["Link"
+ ("r" "Follow" Man-follow-manual-reference
+ :description (lambda () (casual-man-unicode-get :follow)))]
+
+ ["Page"
+ :pad-keys t
+ :if (lambda () (> (length Man-page-list) 1))
+ ("M-p" "Previous" Man-previous-manpage
+ :description (lambda () (casual-man-unicode-get :previous))
+ :transient t)
+ ("M-n" "Next" Man-next-manpage
+ :description (lambda () (casual-man-unicode-get :next))
+ :transient t)
+ ("j" "Goto…" Man-goto-page
+ :description (lambda () (casual-man-unicode-get :goto))
+ :transient t)]]
+
+ ["Bookmarks"
+ :class transient-row
+ ("B" "Add…" bookmark-set-no-overwrite)
+ ("J" "Jump…" bookmark-jump)]
+
+ [:class transient-row
+ (casual-lib-quit-one)
+ ("m" "Man…" man)
+ ("u" "Update" Man-update-manpage
+ :description (lambda () (casual-man-unicode-get :update)))
+ ("," "Settings" casual-man-settings-tmenu)
+ ("I" "ⓘ" casual-man-info)
+ ("K" "Close" Man-kill
+ :description (lambda () (casual-man-unicode-get :kill)))
+ ("q" "Quit" quit-window)
+ (casual-lib-quit-all)])
+
+(provide 'casual-man)
+;;; casual-man.el ends here
diff --git a/lisp/casual.el b/lisp/casual.el
index 70f8eb96d2..b377f40779 100644
--- a/lisp/casual.el
+++ b/lisp/casual.el
@@ -78,6 +78,10 @@
;; An interface to `make-mode'.
;; URL: `https://github.com/kickingvegas/casual/blob/main/docs/make-mode.org'
+;; - Man (Elisp library: `casual-man')
+;; An interface to `Man-mode'.
+;; URL: `https://github.com/kickingvegas/casual/blob/main/docs/man.org'
+
;; - Re-Builder (Elisp library: `casual-re-builder')
;; An interface for the Emacs regular expression tool.
;; URL:
`https://github.com/kickingvegas/casual/blob/main/docs/re-builder.org'
diff --git a/tests/Makefile b/tests/Makefile
index 5217e1d636..9002dd1be1 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -28,7 +28,8 @@ ibuffer-tests \
info-tests \
isearch-tests \
make-mode-tests \
-re-builder-tests \
+man-tests \
+re-builder-tests \
timezone-tests
SRC_DIR=../lisp
@@ -44,7 +45,8 @@ ibuffer-tests \
info-tests \
isearch-tests \
make-mode-tests \
-re-builder-tests \
+man-tests \
+re-builder-tests \
timezone-tests
lib-tests:
@@ -80,6 +82,9 @@ isearch-tests:
make-mode-tests:
$(MAKE) -C $(SRC_DIR) $@
+man-tests:
+ $(MAKE) -C $(SRC_DIR) $@
+
re-builder-tests:
$(MAKE) -C $(SRC_DIR) $@
diff --git a/tests/casual-man-test-utils.el b/tests/casual-man-test-utils.el
new file mode 100644
index 0000000000..5f5ce5192a
--- /dev/null
+++ b/tests/casual-man-test-utils.el
@@ -0,0 +1,40 @@
+;;; casual-man-test-utils.el --- Casual Test Utils -*- lexical-binding:
t; -*-
+
+;; Copyright (C) 2024-2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-lib)
+(require 'kmacro)
+
+(defun casualt-man-setup ()
+ "Casual man setup."
+ (setopt Man-prefer-synchronous-call t)
+ (man "tar"))
+
+(defun casualt-man-breakdown ()
+ "Casual man breakdown."
+ )
+
+(provide 'casual-man-test-utils)
+;;; casual-man-test-utils.el ends here
diff --git a/tests/test-casual-info.el b/tests/test-casual-info.el
index 9a557d0082..3ba8f9538c 100644
--- a/tests/test-casual-info.el
+++ b/tests/test-casual-info.el
@@ -99,8 +99,8 @@
;; Navigation
(:binding "k" :command Info-prev-reference)
(:binding "j" :command Info-next-reference)
- (:binding "p" :command casual-info-browse-backward-paragraph)
- (:binding "n" :command casual-info-browse-forward-paragraph)
+ (:binding "p" :command casual-lib-browse-backward-paragraph)
+ (:binding "n" :command casual-lib-browse-forward-paragraph)
(:binding "[" :command Info-backward-node)
(:binding "]" :command Info-forward-node)
(:binding "h" :command Info-prev)
diff --git a/tests/test-casual-man-settings.el
b/tests/test-casual-man-settings.el
new file mode 100644
index 0000000000..8e05183121
--- /dev/null
+++ b/tests/test-casual-man-settings.el
@@ -0,0 +1,56 @@
+;;; test-casual-man-settings.el --- Casual Make Settings Tests -*-
lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-man-test-utils)
+(require 'casual-man-settings)
+
+(ert-deftest test-casual-man-settings-tmenu ()
+ (let ()
+ (cl-letf ((casualt-mock #'casual-man--customize-group)
+ (casualt-mock #'casual-man-about)
+ (casualt-mock #'casual-man--customize-man-switches)
+ (casualt-mock
#'casual-man--customize-man-prefer-synchronous-call)
+ (casualt-mock
#'casual-man--customize-man-support-remote-systems))
+
+ (let ((test-vectors
+ '((:binding "s" :command casual-man--customize-man-switches)
+ (:binding "S" :command
casual-man--customize-man-prefer-synchronous-call)
+ (:binding "r" :command
casual-man--customize-man-support-remote-systems)
+ (:binding "G" :command casual-man--customize-group)
+ (:binding "u" :command
casual-lib-customize-casual-lib-use-unicode)
+ (:binding "n" :command
casual-lib-customize-casual-lib-hide-navigation)
+ (:binding "a" :command casual-man-about))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-man-settings-tmenu
+ '(lambda () (random 5000)))))))
+
+(ert-deftest test-casual-man-about ()
+ (should (stringp (casual-man-about))))
+
+(provide 'test-casual-man-settings)
+;;; test-casual-man-setttings.el ends here
diff --git a/tests/test-casual-man-utils.el b/tests/test-casual-man-utils.el
new file mode 100644
index 0000000000..d959c6d4b7
--- /dev/null
+++ b/tests/test-casual-man-utils.el
@@ -0,0 +1,56 @@
+;;; test-casual-man-utils.el --- Casual Make Utils Tests -*- lexical-binding:
t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'ert)
+(require 'casual-man-test-utils)
+(require 'casual-man-utils)
+
+(ert-deftest test-casual-man-unicode-get ()
+ (let ((casual-lib-use-unicode nil))
+ (should (string-equal (casual-man-unicode-get :previous) "Previous"))
+ (should (string-equal (casual-man-unicode-get :next) "Next"))
+ (should (string-equal (casual-man-unicode-get :goto) "Goto…"))
+ (should (string-equal (casual-man-unicode-get :follow) "Follow…"))
+ (should (string-equal (casual-man-unicode-get :beginning-of-buffer)
"Beginning"))
+ (should (string-equal (casual-man-unicode-get :paragraph) "Paragraph"))
+ (should (string-equal (casual-man-unicode-get :update) "Update"))
+ (should (string-equal (casual-man-unicode-get :kill) "Close"))
+ (should (string-equal (casual-man-unicode-get :see-also) "See Also")))
+
+ (let ((casual-lib-use-unicode t))
+ (should (string-equal (casual-man-unicode-get :previous) "↑"))
+ (should (string-equal (casual-man-unicode-get :next) "↓"))
+ (should (string-equal (casual-man-unicode-get :goto) "→"))
+ (should (string-equal (casual-man-unicode-get :follow) "🔗…"))
+ (should (string-equal (casual-man-unicode-get :beginning-of-buffer) "⇱"))
+ (should (string-equal (casual-man-unicode-get :end-of-buffer) "⇲"))
+ (should (string-equal (casual-man-unicode-get :paragraph) "¶"))
+ (should (string-equal (casual-man-unicode-get :update) "⟳"))
+ (should (string-equal (casual-man-unicode-get :kill) "×"))
+ (should (string-equal (casual-man-unicode-get :see-also) "👀"))))
+
+
+(provide 'test-casual-man-utils)
+;;; test-casual-man-utils.el ends here
diff --git a/tests/test-casual-man.el b/tests/test-casual-man.el
new file mode 100644
index 0000000000..147c3ad69e
--- /dev/null
+++ b/tests/test-casual-man.el
@@ -0,0 +1,91 @@
+;;; test-casual-man.el --- Casual Make Tests -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Charles Y. Choi
+
+;; Author: Charles Choi <[email protected]>
+;; Keywords: tools
+
+;; 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'ert)
+(require 'casual-man-test-utils)
+(require 'casual-lib-test-utils)
+(require 'casual-man)
+
+(ert-deftest test-casual-man-tmenu ()
+ (let ()
+ (casualt-man-setup)
+
+ (cl-letf ((casualt-mock #'beginning-of-buffer)
+ (casualt-mock #'end-of-buffer)
+ (casualt-mock #'previous-line)
+ (casualt-mock #'next-line)
+ (casualt-mock #'casual-lib-browse-backward-paragraph)
+ (casualt-mock #'casual-lib-browse-forward-paragraph)
+ (casualt-mock #'casual-man-occur-options)
+ (casualt-mock #'Man-previous-section)
+ (casualt-mock #'Man-next-section)
+ (casualt-mock #'Man-goto-section)
+ (casualt-mock #'Man-goto-see-also-section)
+ (casualt-mock #'Man-follow-manual-reference)
+ (casualt-mock #'Man-previous-manpage)
+ (casualt-mock #'Man-next-manpage)
+ (casualt-mock #'Man-goto-page)
+ (casualt-mock #'bookmark-set-no-overwrite)
+ (casualt-mock #'bookmark-jump)
+ (casualt-mock #'casual-man-info)
+ (casualt-mock #'man)
+ (casualt-mock #'Man-update-manpage)
+ (casualt-mock #'Man-kill)
+ (casualt-mock #'quit-window))
+
+ (let ((test-vectors
+ '((:binding "." :command beginning-of-buffer)
+ (:binding ">" :command end-of-buffer)
+ (:binding "C-n" :command next-line)
+ (:binding "C-p" :command previous-line)
+ (:binding "n" :command casual-lib-browse-forward-paragraph)
+ (:binding "p" :command casual-lib-browse-backward-paragraph)
+ (:binding "o" :command casual-man-occur-options)
+ (:binding "]" :command Man-next-section)
+ (:binding "[" :command Man-previous-section)
+ (:binding "g" :command Man-goto-section)
+ (:binding "s" :command Man-goto-see-also-section)
+ ;; (:binding "r
" :command Man-follow-manual-reference)
+ ;; (:binding "M-n" :command Man-next-manpage)
+ ;; (:binding "M-p" :command Man-previous-manpage)
+ ;; (:binding "j" :command Man-goto-page)
+ (:binding "B" :command bookmark-set-no-overwrite)
+ ;; (:binding "J" :command bookmark-jump)
+ ;; (:binding "m" :command man)
+ (:binding "I" :command casual-man-info)
+ (:binding "u" :command Man-update-manpage)
+ (:binding "," :command casual-man-settings-tmenu)
+ (:binding "K" :command Man-kill)
+ (:binding "q" :command quit-window)
+ )))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-man-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-man-breakdown)))
+
+(provide 'test-casual-man)
+;;; test-casual-man.el ends here