branch: elpa/casual
commit 5f929b3c1b0c3bd888e750790a8f24de86058e0a
Merge: c0b2f51f27 098433b48d
Author: Charles Choi <[email protected]>
Commit: GitHub <[email protected]>
Merge pull request #374 from
kickingvegas/372-add-ret-to-dismiss-casual-editkit-windows-tmenu
Redesign EditKit Window Management Menu
---
docs/editkit.org | 16 ++-
.../images/casual-editkit-rectangle-screenshot.png | Bin 67405 -> 61656 bytes
.../casual-editkit-window-delete-screenshot.png | Bin 40653 -> 39746 bytes
docs/images/casual-editkit-window-screenshot.png | Bin 75543 -> 69194 bytes
.../casual-editkit-window-unicode-screenshot.png | Bin 58958 -> 54638 bytes
lisp/casual-editkit-constants.el | 21 +++-
lisp/casual-editkit-utils.el | 108 ++++++++++++---------
tests/test-casual-editkit-constants.el | 33 ++++++-
tests/test-casual-editkit-utils.el | 60 ++++++++++++
9 files changed, 187 insertions(+), 51 deletions(-)
diff --git a/docs/editkit.org b/docs/editkit.org
index c5335465a5..fd52d55983 100644
--- a/docs/editkit.org
+++ b/docs/editkit.org
@@ -23,8 +23,14 @@ A reference menu (~casual-editkit-main-tmenu~) illustrating
nearly all the diffe
(keymap-global-set "C-o" #'casual-editkit-main-tmenu)
#+end_src
-For motivated users desiring a bespoke solution, it is recommended that they
use Casual EditKit as a library of menus to build their own workflows.
+Also suggested is to globally bind the window and rectangle menus as shown
below.
+#+begin_src elisp :lexical no
+ (keymap-global-set "C-c w" #'casual-editkit-windows-tmenu)
+ (keymap-global-set "C-c r" #'casual-editkit-rectangle-tmenu)
+#+end_src
+
+For motivated users desiring a bespoke solution, it is recommended that they
use Casual EditKit as a library of menus to build their own workflows.
** EditKit Usage
#+CINDEX: EditKit Usage
@@ -71,6 +77,7 @@ Depending on the buffer mode, text can be operated on with
different granularity
#+TEXINFO: @subheading Mark›
#+CINDEX: Mark commands
#+VINDEX: casual-editkit-mark-tmenu
+
Text can be marked with different granularity with this menu. Note that
marking functions (Defun) is only supported for modes derived from ~prog-mode~.
[[file:images/casual-editkit-mark-screenshot.png]]
@@ -141,6 +148,8 @@ This menu offers all the rectangle commands. It is packaged
as a sub-menu of ~ca
[[file:images/casual-editkit-rectangle-screenshot.png]]
+Users wishing more direct access to this menu can bind
~casual-editkit-rectangle-tmenu~ as shown in the [[#editkit-install][install
section]].
+
*** Window management
#+CINDEX: Window management
@@ -149,6 +158,8 @@ This menu provides support for different Emacs window
management commands. Note
[[file:images/casual-editkit-window-screenshot.png]]
+Note that the section “Transpose” is only available if the package
[[https://melpa.org/#/transpose-frame][transpose-frame]] is installed.
+
If the variable ~casual-lib-use-unicode~ is set to ~t~, then Unicode symbols
are used in the labels.
[[file:images/casual-editkit-window-unicode-screenshot.png]]
@@ -156,7 +167,8 @@ If the variable ~casual-lib-use-unicode~ is set to ~t~,
then Unicode symbols are
#+TEXINFO: @subheading Window Deletion
#+CINDEX: Window deletion
#+VINDEX: casual-editkit-window-delete-tmenu
-This menu provides support for deleting windows.
+
+This menu provides support for deleting windows. Note the commands apply to
other windows, not the current one in focus.
[[file:images/casual-editkit-window-delete-screenshot.png]]
diff --git a/docs/images/casual-editkit-rectangle-screenshot.png
b/docs/images/casual-editkit-rectangle-screenshot.png
index 7c0ea7d9de..43b2110210 100644
Binary files a/docs/images/casual-editkit-rectangle-screenshot.png and
b/docs/images/casual-editkit-rectangle-screenshot.png differ
diff --git a/docs/images/casual-editkit-window-delete-screenshot.png
b/docs/images/casual-editkit-window-delete-screenshot.png
index df3fed3cbc..ec548ef0b7 100644
Binary files a/docs/images/casual-editkit-window-delete-screenshot.png and
b/docs/images/casual-editkit-window-delete-screenshot.png differ
diff --git a/docs/images/casual-editkit-window-screenshot.png
b/docs/images/casual-editkit-window-screenshot.png
index a1ff6c47e8..c121441223 100644
Binary files a/docs/images/casual-editkit-window-screenshot.png and
b/docs/images/casual-editkit-window-screenshot.png differ
diff --git a/docs/images/casual-editkit-window-unicode-screenshot.png
b/docs/images/casual-editkit-window-unicode-screenshot.png
index 78cdb68f35..4558d1c85b 100644
Binary files a/docs/images/casual-editkit-window-unicode-screenshot.png and
b/docs/images/casual-editkit-window-unicode-screenshot.png differ
diff --git a/lisp/casual-editkit-constants.el b/lisp/casual-editkit-constants.el
index eb5a663d4b..84d3272094 100644
--- a/lisp/casual-editkit-constants.el
+++ b/lisp/casual-editkit-constants.el
@@ -33,14 +33,20 @@
(:point-down . '("↓" "Down"))
(:point-left . '("←" "Left"))
(:point-right . '("→" "Right"))
+
+ (:window-above . '("↑" "Above"))
+ (:window-below . '("↓" "Below"))
+ (:window-left . '("←" "To Left"))
+ (:window-right . '("→" "To Right"))
+
(:other-window . '("»" "Other"))
(:delete-other-windows . '("❏" "Delete other"))
- (:split-window-below . '("⇩" "Window below"))
- (:split-window-horizontally . '("⇨" "Window right"))
+ (:split-window-below . '("━" "Below"))
+ (:split-window-horizontally . '("┃" "Right"))
(:enlarge . '("+" "Enlarge"))
(:shrink . '("−" "Shrink"))
- (:horizontal . '("⦵" "Horizontal"))
- (:vertical . '("⏀" "Vertical"))
+ (:horizontal . '("↔︎" "Horizontal"))
+ (:vertical . '("↕︎" "Vertical"))
(:first . '("⤒" "first"))
(:last . '("⤓" "last"))
(:swap . '("⇄" "Swap"))
@@ -64,6 +70,13 @@ plain ASCII-range string."
("U" "Undo" undo :transient t)
(casual-lib-quit-all)])
+(transient-define-group casual-editkit-navigation-group-with-return
+ [:class transient-row
+ (casual-lib-quit-one)
+ ("U" "Undo" undo :transient t)
+ ("RET" "Dismiss" transient-quit-all)
+ (casual-lib-quit-all)])
+
;; Transient cursor navigation group for Casual EditKit menus.
(transient-define-group casual-editkit-cursor-navigation-group
["Cursor"
diff --git a/lisp/casual-editkit-utils.el b/lisp/casual-editkit-utils.el
index adab6e0e1b..62dbc9123f 100644
--- a/lisp/casual-editkit-utils.el
+++ b/lisp/casual-editkit-utils.el
@@ -479,87 +479,108 @@ can be accessed here."
"Menu for ‘Window’ commands.
Commands pertaining to window management operations can be accessed here."
- ["Window"
- ["Navigate"
- :pad-keys t
+
+ ["Casual Window"
+ :description (lambda () (format "Casual Window: %s" (buffer-name)))
+ :pad-keys t
+ ["Focus"
("o" "»" other-window
:description (lambda () (casual-editkit-unicode-get :other-window))
- :transient t)
+ :transient t)]
+ [""
("p" "↑" windmove-up
:description (lambda () (casual-editkit-unicode-get :point-up))
- :transient t)
+ :transient nil)
("n" "↓" windmove-down
:description (lambda () (casual-editkit-unicode-get :point-down))
- :transient t)
+ :transient nil)]
+ [""
("b" "←" windmove-left
:description (lambda () (casual-editkit-unicode-get :point-left))
- :transient t)
+ :transient nil)
("f" "→" windmove-right
:description (lambda () (casual-editkit-unicode-get :point-right))
- :transient t)]
+ :transient nil)]
["Swap"
- :pad-keys t
("s" "⇄"
window-swap-states
- :description (lambda () (casual-editkit-unicode-get :swap)))
+ :transient t
+ :description (lambda () (casual-editkit-unicode-get :swap)))]
+ [""
("M-p" "↑" windmove-swap-states-up
- :description (lambda () (casual-editkit-unicode-get :point-up)))
+ :description (lambda () (casual-editkit-unicode-get :point-up))
+ :transient nil)
("M-n" "↓" windmove-swap-states-down
- :description (lambda () (casual-editkit-unicode-get :point-down)))
+ :description (lambda () (casual-editkit-unicode-get :point-down))
+ :transient nil)]
+ [""
("M-b" "←" windmove-swap-states-left
- :description (lambda () (casual-editkit-unicode-get :point-left)))
+ :description (lambda () (casual-editkit-unicode-get :point-left))
+ :transient nil)
("M-f" "→" windmove-swap-states-right
- :description (lambda () (casual-editkit-unicode-get :point-right)))]
+ :description (lambda () (casual-editkit-unicode-get :point-right))
+ :transient nil)]
- ["New"
- ("1" "❏" delete-other-windows
- :description (lambda () (casual-editkit-unicode-get
:delete-other-windows)))
+ ["Split"
("2" "⇩" split-window-below
- :description (lambda () (casual-editkit-unicode-get :split-window-below)))
+ :description (lambda ()
+ (casual-editkit-unicode-get :split-window-below)))
+
("3" "⇨" split-window-horizontally
- :description (lambda () (casual-editkit-unicode-get
:split-window-horizontally)))]
+ :description (lambda ()
+ (casual-editkit-unicode-get :split-window-horizontally)))]]
- ["Misc"
- ("t" "Transpose" casual-editkit-transpose-frame
- :if casual-editkit-package-transpose-frame-installed-p)
- ;; ("T" "Toggle Tab Bar" mac-toggle-tab-bar
- ;; :if casual-editkit-window-system-mac-p)
- ;;("J" "Jump to Window…" ace-select-window)
- ("d" "Delete›" casual-editkit-windows-delete-tmenu)]]
-
- ["Resize"
- ["↕︎"
+ [["Delete"
+ :pad-keys t
+ ("1" "Other" delete-other-windows)
+ ("DEL" "Delete›" casual-editkit-windows-delete-tmenu)]
+
+ ["Resize ↕︎"
:description (lambda () (casual-editkit-unicode-get :vertical))
("+" "Enlarge" enlarge-window
:description (lambda () (casual-editkit-unicode-get :enlarge))
:transient t)
("-" "Shrink" shrink-window
:description (lambda () (casual-editkit-unicode-get :shrink))
- :transient t)]
- ["↔︎"
+ :transient t)
+ ]
+
+ ["Resize ↔︎"
:description (lambda () (casual-editkit-unicode-get :horizontal))
- (">" "Enlarge" enlarge-window-horizontally
+ ("[" "Enlarge" enlarge-window-horizontally
:description (lambda () (casual-editkit-unicode-get :enlarge))
:transient t)
- ("<" "Shrink" shrink-window-horizontally
+ ("]" "Shrink" shrink-window-horizontally
:description (lambda () (casual-editkit-unicode-get :shrink))
- :transient t)]]
+ :transient t)]
- casual-editkit-navigation-group)
+ ["Transpose"
+ :if casual-editkit-package-transpose-frame-installed-p
+ ("t" "Transpose" casual-editkit-transpose-frame)]]
+
+ casual-editkit-navigation-group-with-return)
;;;###autoload (autoload 'casual-editkit-windows-delete-tmenu
"casual-editkit-utils" nil t)
(transient-define-prefix casual-editkit-windows-delete-tmenu ()
- "Menu for ‘Window Delete’ commands.
+ "Menu for ‘Window Delete’ commands.
Commands pertaining to window deletion operations can be
accessed here."
["Delete Window"
- ("p" "Above" windmove-delete-up)
- ("n" "Below" windmove-delete-down)
- ("b" "On Left" windmove-delete-left)
- ("f" "On Right" windmove-delete-right)]
- [(casual-lib-quit-all)])
+ :pad-keys t
+ [("b" "To Left" windmove-delete-left
+ :description (lambda () (casual-editkit-unicode-get :window-left)))]
+
+ [("p" "Above" windmove-delete-up
+ :description (lambda () (casual-editkit-unicode-get :window-above)))
+ ("n" "Below" windmove-delete-down
+ :description (lambda () (casual-editkit-unicode-get :window-below)))]
+
+ [("f" "To Right" windmove-delete-right
+ :description (lambda () (casual-editkit-unicode-get :window-right)))]]
+
+ casual-editkit-navigation-group-with-return)
;;;###autoload (autoload 'casual-editkit-bookmarks-tmenu
"casual-editkit-utils" nil t)
(transient-define-prefix casual-editkit-bookmarks-tmenu ()
@@ -722,10 +743,9 @@ Commands pertaining to rectangle operations can be
accessed here."
("D" "Delete Leading Spaces" delete-whitespace-rectangle
:if-not casual-editkit-buffer-read-only-p
:inapt-if-not use-region-p
- :transient t)
- ("RET" "Done" transient-quit-all)]]
+ :transient t)]]
casual-editkit-cursor-navigation-group
- casual-editkit-navigation-group)
+ casual-editkit-navigation-group-with-return)
;;;###autoload (autoload 'casual-editkit-transform-text-tmenu
"casual-editkit-utils" nil t)
(transient-define-prefix casual-editkit-transform-text-tmenu ()
diff --git a/tests/test-casual-editkit-constants.el
b/tests/test-casual-editkit-constants.el
index ba4f6f0f36..aacfea5978 100644
--- a/tests/test-casual-editkit-constants.el
+++ b/tests/test-casual-editkit-constants.el
@@ -38,6 +38,22 @@
(let ((casual-lib-use-unicode nil))
(casualt-editkit-unicode-assert :previous "previous")
(casualt-editkit-unicode-assert :next "next")
+ (casualt-editkit-unicode-assert :point-up "Up")
+ (casualt-editkit-unicode-assert :point-down "Down")
+ (casualt-editkit-unicode-assert :point-left "Left")
+ (casualt-editkit-unicode-assert :point-right "Right")
+ (casualt-editkit-unicode-assert :window-above "Above")
+ (casualt-editkit-unicode-assert :window-below "Below")
+ (casualt-editkit-unicode-assert :window-left "To Left")
+ (casualt-editkit-unicode-assert :window-right "To Right")
+ (casualt-editkit-unicode-assert :other-window "Other")
+ (casualt-editkit-unicode-assert :delete-other-windows "Delete other")
+ (casualt-editkit-unicode-assert :split-window-below "Below")
+ (casualt-editkit-unicode-assert :split-window-horizontally "Right")
+ (casualt-editkit-unicode-assert :enlarge "Enlarge")
+ (casualt-editkit-unicode-assert :shrink "Shrink")
+ (casualt-editkit-unicode-assert :horizontal "Horizontal")
+ (casualt-editkit-unicode-assert :vertical "Vertical")
(casualt-editkit-unicode-assert :first "first")
(casualt-editkit-unicode-assert :last "last")
(casualt-editkit-unicode-assert :swap "Swap")
@@ -46,11 +62,26 @@
(let ((casual-lib-use-unicode t))
(casualt-editkit-unicode-assert :previous "↑")
(casualt-editkit-unicode-assert :next "↓")
+ (casualt-editkit-unicode-assert :point-up "↑")
+ (casualt-editkit-unicode-assert :point-down "↓")
+ (casualt-editkit-unicode-assert :point-left "←")
+ (casualt-editkit-unicode-assert :point-right "→")
+ (casualt-editkit-unicode-assert :window-above "↑")
+ (casualt-editkit-unicode-assert :window-below "↓")
+ (casualt-editkit-unicode-assert :window-left "←")
+ (casualt-editkit-unicode-assert :window-right "→")
+ (casualt-editkit-unicode-assert :other-window "»")
+ (casualt-editkit-unicode-assert :delete-other-windows "❏")
+ (casualt-editkit-unicode-assert :split-window-below "━")
+ (casualt-editkit-unicode-assert :split-window-horizontally "┃")
+ (casualt-editkit-unicode-assert :enlarge "+")
+ (casualt-editkit-unicode-assert :shrink "−")
+ (casualt-editkit-unicode-assert :horizontal "↔︎")
+ (casualt-editkit-unicode-assert :vertical "↕︎")
(casualt-editkit-unicode-assert :first "⤒")
(casualt-editkit-unicode-assert :last "⤓")
(casualt-editkit-unicode-assert :swap "⇄")
(casualt-editkit-unicode-assert :jump "🚀")))
-
(provide 'test-casual-editkit-constants)
;;; test-casual-editkit-constants.el ends here
diff --git a/tests/test-casual-editkit-utils.el
b/tests/test-casual-editkit-utils.el
index c2e9605f66..7472b463b1 100644
--- a/tests/test-casual-editkit-utils.el
+++ b/tests/test-casual-editkit-utils.el
@@ -375,6 +375,66 @@
'(lambda () (random 5000)))))
(casualt-editkit-breakdown tmpfile)))
+
+(ert-deftest test-casual-editkit-windows-tmenu ()
+ (let ()
+ (split-window-horizontally)
+ (split-window-vertically)
+ (cl-letf ((casualt-mock #'other-window)
+ (casualt-mock #'casual-editkit-windows-delete-tmenu)
+ (casualt-mock #'windmove-down)
+ (casualt-mock #'windmove-up)
+ (casualt-mock #'windmove-right)
+ (casualt-mock #'windmove-left)
+ (casualt-mock #'window-swap-states)
+ (casualt-mock #'window-swap-states-left)
+ (casualt-mock #'window-swap-states-right)
+ (casualt-mock #'window-swap-states-up)
+ (casualt-mock #'window-swap-states-down)
+
+ (casualt-mock #'split-window-below)
+ (casualt-mock #'split-window-horizontally)
+ (casualt-mock #'casual-editkit-windows-delete-tmenu)
+ (casualt-mock #'enlarge-window)
+ (casualt-mock #'shrink-window)
+ (casualt-mock #'enlarge-window-horizontally)
+ (casualt-mock #'shrink-window-horizontally)
+ (casualt-mock #'delete-other-windows))
+
+ (let ((test-vectors
+ '((:binding "o" :command other-window)
+ (:binding "n" :command windmove-down)
+ (:binding "p" :command windmove-up)
+ (:binding "f" :command windmove-right)
+ (:binding "b" :command windmove-left)
+ (:binding "s" :command window-swap-states)
+ (:binding "o" :command other-window)
+ ;;(:binding "M-b" :command window-swap-states-left)
+ ;;(:binding "M-f" :command window-swap-states-right)
+ ;;(:binding "M-p" :command window-swap-states-up)
+ ;;(:binding "M-n" :command window-swap-states-down)
+
+ (:binding "2" :command split-window-below)
+ (:binding "3" :command split-window-horizontally)
+ (:binding "DEL" :command casual-editkit-windows-delete-tmenu)
+
+ (:binding "+" :command enlarge-window)
+ (:binding "-" :command shrink-window)
+
+ (:binding "[" :command enlarge-window-horizontally)
+ (:binding "]" :command shrink-window-horizontally)
+
+ (:binding "1" :command delete-other-windows)
+ (:binding "RET" :command transient-quit-all))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-editkit-windows-tmenu
+ '(lambda () (random 5000)))))
+
+ (delete-other-windows)
+ ;;(casualt-editkit-breakdown)
+ ))
+
;; (ert-deftest test-casual-editkit-windows-tmenu ()
;; (let ((tmpfile "casual-editkit-windows-tmenu.txt"))
;; (casualt-editkit-setup tmpfile)