New command make-frame-on-current-monitor to use in windmove (bug#39875)

* lisp/frame.el (make-frame-on-current-monitor): New command.

* lisp/windmove.el (windmove-display-in-direction):
Use make-frame-on-current-monitor for 'new-frame'.
(windmove-display-new-frame): New command.
(windmove-display-default-keybindings): Bind
windmove-display-new-frame to 'f' key.

* lisp/window.el (display-buffer-in-direction): Fix quotes in docstring.
This commit is contained in:
Juri Linkov 2020-03-06 02:19:00 +02:00
parent b5474ba160
commit 32261ed15b
3 changed files with 29 additions and 5 deletions

View file

@ -713,6 +713,18 @@ The optional argument PARAMETERS specifies additional frame parameters."
(x-display-list))))
(make-frame (cons (cons 'display display) parameters)))
(defun make-frame-on-current-monitor (&optional parameters)
"Make a frame on the currently selected monitor.
Like `make-frame-on-monitor' and with the same PARAMETERS as in `make-frame'."
(interactive)
(let* ((monitor-workarea
(cdr (assq 'workarea (frame-monitor-attributes))))
(geometry-parameters
(when monitor-workarea
`((top . ,(nth 1 monitor-workarea))
(left . ,(nth 0 monitor-workarea))))))
(make-frame (append geometry-parameters parameters))))
(defun make-frame-on-monitor (monitor &optional display parameters)
"Make a frame on monitor MONITOR.
The optional argument DISPLAY can be a display name, and the optional

View file

@ -474,6 +474,11 @@ When `switch-to-buffer-obey-display-actions' is non-nil,
(tab-bar-new-tab))
(setq type 'tab)
(selected-window))
((eq dir 'new-frame)
(window--maybe-raise-frame
(make-frame-on-current-monitor pop-up-frame-alist))
(setq type 'frame)
(selected-window))
((eq dir 'same-window)
(selected-window))
(t (window-in-direction
@ -541,6 +546,12 @@ See the logic of the prefix ARG in `windmove-display-in-direction'."
(interactive "P")
(windmove-display-in-direction 'same-window arg))
;;;###autoload
(defun windmove-display-new-frame (&optional arg)
"Display the next buffer in a new frame."
(interactive "P")
(windmove-display-in-direction 'new-frame arg))
;;;###autoload
(defun windmove-display-new-tab (&optional arg)
"Display the next buffer in a new tab."
@ -562,6 +573,7 @@ Default value of MODIFIERS is `shift-meta'."
(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)
(global-set-key (vector (append modifiers '(?f))) 'windmove-display-new-frame)
(global-set-key (vector (append modifiers '(?t))) 'windmove-display-new-tab))

View file

@ -7891,15 +7891,15 @@ Info node `(elisp) Buffer Display Action Alists' for details of
such alists.
ALIST has to contain a `direction' entry whose value should be
one of `left', `above' (or `up'), `right' and `below' (or
'down'). Other values are usually interpreted as `below'.
one of `left', `above' (or `up'), `right' and `below' (or `down').
Other values are usually interpreted as `below'.
If ALIST also contains a `window' entry, its value specifies a
reference window. That value can be a special symbol like
'main' (which stands for the selected frame's main window) or
'root' (standings for the selected frame's root window) or an
`main' (which stands for the selected frame's main window) or
`root' (standings for the selected frame's root window) or an
arbitrary valid window. Any other value (or omitting the
'window' entry) means to use the selected window as reference
`window' entry) means to use the selected window as reference
window.
This function tries to reuse or split a window such that the