From: Juri Linkov <juri@linkov.net>
To: martin rudalics <rudalics@gmx.at>
Cc: 32790@debbugs.gnu.org
Subject: bug#32790: 27.0.50; point jumps unexpectedly after delete-window
Date: Thu, 08 Nov 2018 23:53:23 +0200 [thread overview]
Message-ID: <87bm6zme24.fsf@mail.linkov.net> (raw)
In-Reply-To: <5BE2AF28.2020505@gmx.at> (martin rudalics's message of "Wed, 07 Nov 2018 10:23:52 +0100")
In bug#33258 I tried to use inhibit-select-window in
display-buffer-overriding-action, but it's better just to use
a prefix arg to determine whether the window should remain selected,
e.g. ‘C-u S-M-up’ means no-select, or ‘M-- S-M-left’ means no-select
and use the bottom egde, etc.
The only problem is that I can't decide what window to use for
window-in-direction and split-window in display-buffer-overriding-action:
an original window that was selected at the moment of ‘S-M-up’ invocation,
or a selected window that is current at the moment when
display-buffer-overriding-action is applied? Please see
the questions in the comments of this patch:
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 598e495c7a..ea4506049b 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -1,4 +1,4 @@
-;;; windmove.el --- directional window-selection routines
+;;; windmove.el --- directional window-selection routines -*- lexical-binding:t -*-
;;
;; Copyright (C) 1998-2018 Free Software Foundation, Inc.
;;
@@ -571,6 +571,104 @@ windmove-default-keybindings
(global-set-key (vector (append modifiers '(up))) 'windmove-up)
(global-set-key (vector (append modifiers '(down))) 'windmove-down))
+;;; Directional window display
+
+(defun windmove-display-in-direction (dir &optional arg)
+ "Display the next buffer in the window at direction DIR.
+Create a new window if there is no window in that direction.
+If prefix ARG is `C-u' or `M--', restore the previously selected window.
+With no prefix ARG, or with prefix ARG equal to zero, a displayed window is
+relative to the position of point in the selected window; otherwise it is
+relative to the first edge (for positive ARG or `C-u') or the last edge
+(for negative ARG or `M--') of the selected window."
+ (interactive)
+ (let* ((command this-command)
+ (action display-buffer-overriding-action)
+ (minibuffer-depth (minibuffer-depth))
+ (selected-window (selected-window))
+ (restore-window (or (consp arg) (eq arg '-)))
+ (clearfun (make-symbol "clear-display-buffer-overriding-action"))
+ (exitfun
+ (lambda ()
+ (setq display-buffer-overriding-action action)
+ (when (and restore-window (window-live-p selected-window))
+ (select-window selected-window))
+ (remove-hook 'post-command-hook clearfun))))
+ (fset clearfun
+ (lambda ()
+ (unless (or
+ ;; Remove the hook immediately
+ ;; after exiting the minibuffer.
+ (> (minibuffer-depth) minibuffer-depth)
+ ;; But don't remove immediately after
+ ;; adding the hook by the same command below.
+ (eq this-command command))
+ (funcall exitfun))))
+ (add-hook 'post-command-hook clearfun)
+ (push (lambda (buffer alist)
+ (unless (> (minibuffer-depth) minibuffer-depth)
+ (let ((window (if (eq dir 'same-window)
+ (selected-window) ;; or maybe `selected-window'?
+ (window-in-direction
+ dir selected-window nil ;; or `nil' instead of `selected-window'?
+ (and arg (prefix-numeric-value arg))
+ windmove-wrap-around)))
+ (type 'reuse))
+ (unless window
+ ;; maybe use `selected-window' in WINDOW arg of split-window?
+ (setq window (split-window nil nil dir) type 'window))
+ (window--display-buffer buffer window type alist))))
+ display-buffer-overriding-action)
+ (message "[display-%s]" dir)))
+
+;;;###autoload
+(defun windmove-display-left (&optional arg)
+ "Display the next buffer in window to the left of the current one.
+With a prefix argument, restore the previously selected window."
+ (interactive "P")
+ (windmove-display-in-direction 'left arg))
+
+;;;###autoload
+(defun windmove-display-up (&optional arg)
+ "Display the next buffer in window above the current one.
+With a prefix argument, restore the previously selected window."
+ (interactive "P")
+ (windmove-display-in-direction 'up arg))
+
+;;;###autoload
+(defun windmove-display-right (&optional arg)
+ "Display the next buffer in window to the right of the current one.
+With a prefix argument, restore the previously selected window."
+ (interactive "P")
+ (windmove-display-in-direction 'right arg))
+
+;;;###autoload
+(defun windmove-display-down (&optional arg)
+ "Display the next buffer in window below the current one.
+With a prefix argument, restore the previously selected window."
+ (interactive "P")
+ (windmove-display-in-direction 'down arg))
+
+;;;###autoload
+(defun windmove-display-same-window (&optional arg)
+ "Display the next buffer in the same window."
+ (interactive "P")
+ (windmove-display-in-direction 'same-window arg))
+
+;;;###autoload
+(defun windmove-display-default-keybindings (&optional modifiers)
+ "Set up keybindings for directional display.
+Keybindings are of the form MODIFIERS-{left,right,up,down},
+where MODIFIERS is either a list of modifiers or a single modifier.
+Default value of MODIFIERS is `shift-meta'."
+ (interactive)
+ (unless modifiers (setq modifiers '(shift meta)))
+ (unless (listp modifiers) (setq modifiers (list modifiers)))
+ (global-set-key (vector (append modifiers '(left))) 'windmove-display-left)
+ (global-set-key (vector (append modifiers '(right))) 'windmove-display-right)
+ (global-set-key (vector (append modifiers '(up))) 'windmove-display-up)
+ (global-set-key (vector (append modifiers '(down))) 'windmove-display-down)
+ (global-set-key (vector (append modifiers '(?0))) 'windmove-display-same-window))
(provide 'windmove)
next prev parent reply other threads:[~2018-11-08 21:53 UTC|newest]
Thread overview: 127+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-20 23:33 bug#32790: 27.0.50; point jumps unexpectedly after delete-window Juri Linkov
2018-09-21 6:34 ` martin rudalics
2018-09-22 22:23 ` Juri Linkov
2018-09-23 5:44 ` Eli Zaretskii
2018-09-23 8:27 ` martin rudalics
2018-09-23 20:57 ` Juri Linkov
2018-09-24 8:33 ` martin rudalics
2018-09-24 18:49 ` Juri Linkov
2018-09-25 7:28 ` martin rudalics
2018-09-25 19:28 ` Juri Linkov
2018-09-26 8:51 ` martin rudalics
2018-09-26 23:05 ` Juri Linkov
2018-09-27 18:44 ` martin rudalics
2018-10-15 21:12 ` Juri Linkov
2018-10-16 8:46 ` martin rudalics
2018-10-16 22:20 ` Juri Linkov
2018-10-17 7:30 ` martin rudalics
2018-10-17 21:30 ` Juri Linkov
2018-10-18 8:05 ` martin rudalics
2018-10-18 22:49 ` Juri Linkov
2018-10-19 7:39 ` martin rudalics
2018-10-20 21:27 ` Juri Linkov
2018-10-21 8:22 ` martin rudalics
2018-10-21 18:17 ` Juri Linkov
2018-10-22 9:07 ` martin rudalics
2018-10-23 20:55 ` Juri Linkov
2018-10-24 9:45 ` martin rudalics
2018-10-25 20:48 ` Juri Linkov
2018-10-26 7:41 ` martin rudalics
2018-10-27 19:51 ` Juri Linkov
2018-10-28 8:59 ` martin rudalics
2018-10-28 19:36 ` Juri Linkov
2018-10-29 8:44 ` martin rudalics
2018-10-29 13:45 ` martin rudalics
2018-10-29 22:38 ` Juri Linkov
2018-10-30 9:00 ` martin rudalics
2018-10-30 21:42 ` Juri Linkov
2018-10-31 8:11 ` martin rudalics
2018-10-31 21:20 ` Juri Linkov
2018-11-01 9:03 ` martin rudalics
2018-11-01 22:42 ` Juri Linkov
2018-11-02 8:44 ` martin rudalics
2018-11-02 14:36 ` Drew Adams
2018-11-04 22:01 ` Juri Linkov
2018-11-05 9:35 ` martin rudalics
2018-11-04 22:21 ` Juri Linkov
2018-11-05 9:36 ` martin rudalics
2018-11-05 22:14 ` Juri Linkov
2018-11-06 8:48 ` martin rudalics
2018-11-06 22:22 ` Juri Linkov
2018-11-07 9:23 ` martin rudalics
2018-11-07 21:44 ` Juri Linkov
2018-11-08 8:52 ` martin rudalics
2018-11-08 21:38 ` Juri Linkov
2018-11-09 9:08 ` martin rudalics
2018-11-10 21:25 ` Juri Linkov
2018-12-26 2:04 ` Dmitry Gutov
2018-11-08 21:53 ` Juri Linkov [this message]
2018-11-09 9:13 ` martin rudalics
2018-11-10 21:37 ` Juri Linkov
2018-11-11 8:51 ` martin rudalics
2018-11-12 23:24 ` Juri Linkov
2018-11-13 9:08 ` martin rudalics
2018-11-13 23:20 ` Juri Linkov
2018-11-14 8:33 ` martin rudalics
2018-11-15 0:15 ` Juri Linkov
2018-11-15 9:13 ` martin rudalics
2018-11-15 22:59 ` Juri Linkov
2018-11-16 8:53 ` martin rudalics
2018-11-17 22:18 ` Juri Linkov
2018-11-18 9:24 ` martin rudalics
2018-11-18 22:52 ` Juri Linkov
2018-11-19 9:42 ` martin rudalics
2018-11-19 22:39 ` Juri Linkov
2018-11-20 9:28 ` martin rudalics
2018-11-21 0:12 ` Juri Linkov
2018-11-21 8:19 ` martin rudalics
2018-11-21 23:38 ` Juri Linkov
2018-11-22 7:40 ` martin rudalics
2018-11-22 22:45 ` Juri Linkov
2018-11-23 7:39 ` martin rudalics
2018-11-24 23:40 ` Juri Linkov
2018-11-25 8:23 ` martin rudalics
2018-11-25 21:01 ` Juri Linkov
2018-11-26 9:33 ` martin rudalics
2018-11-26 23:47 ` Juri Linkov
2018-11-27 6:00 ` Eli Zaretskii
2018-11-27 23:18 ` Juri Linkov
2018-11-28 8:33 ` martin rudalics
2018-11-28 23:25 ` Juri Linkov
2018-11-29 8:30 ` martin rudalics
2018-11-29 22:50 ` Juri Linkov
2018-11-30 8:22 ` martin rudalics
2018-12-01 22:43 ` Juri Linkov
2018-12-02 8:34 ` martin rudalics
2018-12-03 0:45 ` Juri Linkov
2018-12-03 7:45 ` martin rudalics
2018-12-20 23:28 ` Juri Linkov
2018-12-21 9:14 ` martin rudalics
2018-12-22 23:34 ` Juri Linkov
2018-12-23 9:40 ` martin rudalics
2018-11-27 8:08 ` martin rudalics
2018-11-04 22:07 ` Juri Linkov
2018-11-05 9:35 ` martin rudalics
2018-11-05 22:12 ` Juri Linkov
2018-11-06 8:47 ` martin rudalics
2018-11-21 23:35 ` Juri Linkov
2018-11-22 7:40 ` martin rudalics
2018-11-22 22:39 ` Juri Linkov
2018-11-23 7:40 ` martin rudalics
2018-11-24 23:20 ` Juri Linkov
2018-11-25 8:24 ` martin rudalics
2018-11-26 23:53 ` Juri Linkov
2018-11-27 8:08 ` martin rudalics
2018-11-27 23:28 ` Juri Linkov
2018-11-28 8:33 ` martin rudalics
2018-09-21 6:55 ` Eli Zaretskii
2018-09-22 22:34 ` Juri Linkov
2018-09-23 8:28 ` martin rudalics
2018-09-23 10:56 ` Eli Zaretskii
2018-09-23 20:49 ` Juri Linkov
2018-09-24 8:23 ` martin rudalics
2018-09-24 8:30 ` Eli Zaretskii
2018-09-24 12:25 ` martin rudalics
2018-09-24 18:53 ` Juri Linkov
2018-09-25 7:28 ` martin rudalics
2019-11-24 23:19 ` Juri Linkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87bm6zme24.fsf@mail.linkov.net \
--to=juri@linkov.net \
--cc=32790@debbugs.gnu.org \
--cc=rudalics@gmx.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).