branch: externals/transient commit 7e45a57ec81185631fe763733f64c99021df2a06 Author: Jonas Bernoulli <jo...@bernoul.li> Commit: Jonas Bernoulli <jo...@bernoul.li>
No longer depend on lv to display the transient buffer --- default.mk | 1 - docs/CHANGELOG | 4 +++ docs/transient.org | 32 ++++++++++++++++++----- docs/transient.texi | 33 ++++++++++++++++++----- lisp/transient.el | 75 +++++++++++++++++++++++++++++++++++++++++++++++------ 5 files changed, 124 insertions(+), 21 deletions(-) diff --git a/default.mk b/default.mk index 82bee06299..2294eb9c34 100644 --- a/default.mk +++ b/default.mk @@ -4,7 +4,6 @@ ELS = $(PKG).el ELCS = $(ELS:.el=.elc) DEPS = dash -DEPS += hydra # for lv.el EMACS ?= emacs EMACS_ARGS ?= diff --git a/docs/CHANGELOG b/docs/CHANGELOG index c593c0fd22..32db5f4376 100644 --- a/docs/CHANGELOG +++ b/docs/CHANGELOG @@ -1,6 +1,10 @@ # -*- mode: org -*- * v0.2.0 UNRELEASED +- The new option ~transient-display-buffer-action~ allows users to + specify how a window is selected to display the transient popup + buffer. The ~lv~ library is no longer used. #17 + - The window that was selected before the transient window was shown is no longer re-selected before calling a suffix that exits the transient. If a suffix changes the selected window unintentionally, diff --git a/docs/transient.org b/docs/transient.org index 85bbfacca4..809c09dfe2 100644 --- a/docs/transient.org +++ b/docs/transient.org @@ -8,7 +8,7 @@ #+TEXINFO_DIR_CATEGORY: Emacs #+TEXINFO_DIR_TITLE: Transient: (transient). #+TEXINFO_DIR_DESC: Transient Commands -#+SUBTITLE: for version 0.1.0 (v0.1.0-23-g6467626+1) +#+SUBTITLE: for version 0.1.0 (v0.1.0-28-g625683c+1) #+TEXINFO_DEFFN: t #+OPTIONS: H:4 num:4 toc:2 @@ -37,7 +37,7 @@ Calling a suffix command usually causes the transient to be exited but suffix commands can also be configured to not exit the transient. #+TEXINFO: @noindent -This manual is for Transient version 0.1.0 (v0.1.0-23-g6467626+1). +This manual is for Transient version 0.1.0 (v0.1.0-28-g625683c+1). #+BEGIN_QUOTE Copyright (C) 2018-2019 Jonas Bernoulli <jo...@bernoul.li> @@ -502,6 +502,28 @@ as many additional suffixes as you hoped.) sequence. If a number, behave as for ~nil~ but also show the commands after that many seconds of inactivity. +- User Option: transient-display-buffer-action + + This option specifies the action used to display the transient popup + buffer. The transient popup buffer is displayed in a window using + ~(display-buffer buf transient-display-buffer-action)~. + + The value of this option has the form ~(FUNCTION . ALIST)~, where + FUNCTION is a function or a list of functions. Each such function + should accept two arguments: a buffer to display and an alist of the + same form as ALIST. See [[info:elisp#Choosing Window]]. + + The default is ~(display-buffer-in-side-window (side . bottom))~. + This displays the window at the bottom of the selected frame. + Another useful value is ~(display-buffer-below-selected)~. This is + what ~magit-popup~ used by default. For more alternatives see + [[info:elisp#Display Action Functions]]. + + It may be possible to display the window in another frame, but + whether that works in practice depends on the window-manager. + If the window manager selects the new window (Emacs frame), + then it doesn't work. + - User Option: transient-highlight-mismatched-keys This option controls whether key bindings of infix commands that do @@ -1746,10 +1768,8 @@ Hydra (see https://github.com/abo-abo/hydra) is another package that provides features similar to those of Transient. Both packages use transient keymaps to make a set of commands -temporarily available and the ~lv~ library to show these commands in a -popup buffer, which looks like it is using the echo area (but without -actually using the echo area). The author of Hydra is also the author -of ~lv~, which is maintained in the same repository. +temporarily available and show the available commands in a popup +buffer. A Hydra "body" is equivalent to a Transient "prefix" and a Hydra "head" is equivalent to a Transient "suffix". Hydra has no equivalent diff --git a/docs/transient.texi b/docs/transient.texi index 0aa2e2ccbb..befba1b9f1 100644 --- a/docs/transient.texi +++ b/docs/transient.texi @@ -31,7 +31,7 @@ General Public License for more details. @finalout @titlepage @title Transient User and Developer Manual -@subtitle for version 0.1.0 (v0.1.0-23-g6467626+1) +@subtitle for version 0.1.0 (v0.1.0-28-g625683c+1) @author Jonas Bernoulli @page @vskip 0pt plus 1filll @@ -65,7 +65,7 @@ Calling a suffix command usually causes the transient to be exited but suffix commands can also be configured to not exit the transient. @noindent -This manual is for Transient version 0.1.0 (v0.1.0-23-g6467626+1). +This manual is for Transient version 0.1.0 (v0.1.0-28-g625683c+1). @quotation Copyright (C) 2018-2019 Jonas Bernoulli <jonas@@bernoul.li> @@ -659,6 +659,29 @@ sequence. If a number, behave as for @code{nil} but also show the commands after that many seconds of inactivity. @end defopt +@defopt transient-display-buffer-action + +This option specifies the action used to display the transient popup +buffer. The transient popup buffer is displayed in a window using +@code{(display-buffer buf transient-display-buffer-action)}. + +The value of this option has the form @code{(FUNCTION . ALIST)}, where +FUNCTION is a function or a list of functions. Each such function +should accept two arguments: a buffer to display and an alist of the +same form as ALIST@. See @ref{Choosing Window,,,elisp,}. + +The default is @code{(display-buffer-in-side-window (side . bottom))}. +This displays the window at the bottom of the selected frame. +Another useful value is @code{(display-buffer-below-selected)}. This is +what @code{magit-popup} used by default. For more alternatives see +@ref{Display Action Functions,,,elisp,}. + +It may be possible to display the window in another frame, but +whether that works in practice depends on the window-manager. +If the window manager selects the new window (Emacs frame), +then it doesn't work. +@end defopt + @defopt transient-highlight-mismatched-keys This option controls whether key bindings of infix commands that do @@ -2110,10 +2133,8 @@ Hydra (see @uref{https://github.com/abo-abo/hydra}) is another package that provides features similar to those of Transient. Both packages use transient keymaps to make a set of commands -temporarily available and the @code{lv} library to show these commands in a -popup buffer, which looks like it is using the echo area (but without -actually using the echo area). The author of Hydra is also the author -of @code{lv}, which is maintained in the same repository. +temporarily available and show the available commands in a popup +buffer. A Hydra "body" is equivalent to a Transient "prefix" and a Hydra "head" is equivalent to a Transient "suffix". Hydra has no equivalent diff --git a/lisp/transient.el b/lisp/transient.el index 1e176402d3..a4db1422c3 100644 --- a/lisp/transient.el +++ b/lisp/transient.el @@ -4,7 +4,7 @@ ;; Author: Jonas Bernoulli <jo...@bernoul.li> ;; Homepage: https://github.com/magit/transient -;; Package-Requires: ((emacs "25.1") (dash "2.15.0") (lv "0.14.0")) +;; Package-Requires: ((emacs "25.1") (dash "2.15.0")) ;; Keywords: bindings ;; This file is not part of GNU Emacs. @@ -51,7 +51,6 @@ (require 'dash) (require 'eieio) (require 'format-spec) -(require 'lv) (eval-when-compile (require 'subr-x)) @@ -83,6 +82,35 @@ or when the user explicitly requests it." (const :tag "on demand" nil) (number :tag "after delay" 1))) +(defcustom transient-display-buffer-action + '(display-buffer-in-side-window (side . bottom)) + "The action used to display the transient popup buffer. + +The transient popup buffer is displayed in a window using + + \(display-buffer buf transient-display-buffer-action) + +The value of this option has the form (FUNCTION . ALIST), +where FUNCTION is a function or a list of functions. Each such +function should accept two arguments: a buffer to display and +an alist of the same form as ALIST. See `display-buffer' for +details. + +The default is (display-buffer-in-side-window (side . bottom)). +This displays the window at the bottom of the selected frame. +Another useful value is (display-buffer-below-selected). This +is what `magit-popup' used by default. For more alternatives +see info node `(elisp)Display Action Functions'. + +It may be possible to display the window in another frame, but +whether that works in practice depends on the window-manager. +If the window manager selects the new window (Emacs frame), +then it doesn't work." + :package-version '(transient . "0.2.0") + :group 'transient + :type '(cons (choice function (repeat :tag "Functions" function)) + alist)) + (defcustom transient-show-common-commands nil "Whether to show common transient suffixes in the popup buffer. @@ -270,6 +298,13 @@ See info node `(transient)Enabling and Disabling Suffixes'." See info node `(transient)Enabling and Disabling Suffixes'." :group 'transient-faces) +(defface transient-separator + '((((class color) (background light)) :background "grey80") + (((class color) (background dark)) :background "grey30")) + "Face used to draw line below transient popup window. +Only the background color is significant." + :group 'transient-faces) + ;;; Persistence (defun transient--read-file-contents (file) @@ -921,6 +956,8 @@ variable instead.") (defvar transient--stack nil) +(defvar transient--window nil) + (defvar transient--debug nil "Whether put debug information into *Messages*.") (defvar transient--history nil) @@ -1456,6 +1493,12 @@ EDIT may be non-nil." (setq transient--layout nil) (setq transient--suffixes nil)) +(defun transient--delete-window () + (when (window-live-p transient--window) + (let ((buf (window-buffer transient--window))) + (delete-window transient--window) + (kill-buffer buf)))) + (defun transient--export () (setq current-transient-prefix transient--prefix) (setq current-transient-command (oref transient--prefix command)) @@ -2181,15 +2224,31 @@ have a history of their own.") (defun transient--show () (transient--timer-cancel) (setq transient--showp t) - (let ((transient--source-buffer (current-buffer))) - (with-temp-buffer + (let ((transient--source-buffer (current-buffer)) + (buf (get-buffer-create " *transient*"))) + (unless (window-live-p transient--window) + (setq transient--window + (display-buffer buf transient-display-buffer-action))) + (with-selected-window transient--window + (erase-buffer) + (set-window-hscroll transient--window 0) + (set-window-dedicated-p transient--window t) + (set-window-parameter transient--window 'no-other-window t) + (setq window-size-fixed t) + (setq mode-line-format nil) + (setq cursor-type nil) + (setq display-line-numbers nil) + (setq show-trailing-whitespace nil) (transient--insert-groups) (when (or transient--helpp transient--editp) (transient--insert-help)) - (delete-trailing-whitespace) - (let ((lv-force-update t) - (lv-use-separator t)) - (lv-message "%s" (buffer-string)))))) + (insert + (propertize "__" 'face 'transient-separator 'display '(space :height (1))) + (propertize "\n" 'face 'transient-separator 'line-height t)) + (let ((window-resize-pixelwise t) + (window-size-fixed nil)) + (fit-window-to-buffer nil nil 1)) + (goto-char (point-min))))) (defun transient--insert-groups () (let ((groups (cl-mapcan (lambda (group)