;;
;; Put the following line in your `.emacs' file:
;;
-;; (windmove-default-keybindings) ; default keybindings
+;; (windmove-default-keybindings) ; shifted arrow keys
+;;
+;; or
+;;
+;; (windmove-default-keybindings 'hyper) ; etc.
+;;
+;; to use another modifier key.
;;
;;
;; If you wish to enable wrap-around, also add a line like:
;; causes the occasional creation of a "lost column" between windows,
;; so that two adjacent windows do not actually touch, you may want to
;; increase the value of `windmove-window-distance-delta' to 2 or 3:
-;;
+;;
;; (setq windmove-window-distance-delta 2)
;;
bottom-right corner of the frame.
For example, if a frame has 76 rows and 181 columns, the return value
from `windmove-frame-edges' will be the list (0 0 180 75)."
- (let ((frame (if window
- (window-frame window)
- (selected-frame))))
- (let ((x-min 0)
- (y-min 0)
- (x-max (1- (frame-width frame))) ; 1- for last row & col here
- (y-max (1- (frame-height frame))))
- (list x-min y-min x-max y-max))))
+ (let* ((frame (if window
+ (window-frame window)
+ (selected-frame)))
+ (top-left (window-inside-edges (frame-first-window frame)))
+ (x-min (nth 0 top-left))
+ (y-min (nth 1 top-left))
+ (x-max (+ x-min (frame-width frame) -1)) ; 1- for last row & col
+ (y-max (+ x-max (frame-height frame) -1)))
+ (list x-min y-min x-max y-max)))
;; it turns out that constraining is always a good thing, even when
;; wrapping is going to happen. this is because:
top-left or bottom-right corner of the selected window, or WINDOW if
supplied, if ARG is greater or smaller than zero, respectively."
(let ((effective-arg (if (null arg) 0 (prefix-numeric-value arg)))
- (edges (window-edges window)))
+ (edges (window-inside-edges window)))
(let ((top-left (cons (nth 0 edges)
(nth 1 edges)))
- ;; if 1-'s are not there, windows actually extend too far.
- ;; actually, -2 is necessary for bottom: (nth 3 edges) is
- ;; the height of the window; -1 because we want 0-based max,
- ;; -1 to get rid of mode line
+ ;; Subtracting 1 converts the edge to the last column or line
+ ;; within the window.
(bottom-right (cons (- (nth 2 edges) 1)
- (- (nth 3 edges) 2))))
+ (- (nth 3 edges) 1))))
(cond
((> effective-arg 0)
top-left)
If no window is at direction DIR, an error is signaled."
(let ((other-window (windmove-find-other-window dir arg window)))
(cond ((null other-window)
- (error "No window at %s" dir))
+ (error "No window %s from selected window" dir))
((and (window-minibuffer-p other-window)
(not (minibuffer-window-active-p other-window)))
- (error "Can't move to inactive minibuffer"))
+ (error "Minibuffer is inactive"))
(t
(select-window other-window)))))
;; probably want to use different bindings in that case.
;;;###autoload
-(defun windmove-default-keybindings ()
- "Set up default keybindings for `windmove'."
+(defun windmove-default-keybindings (&optional modifier)
+ "Set up keybindings for `windmove'.
+Keybindings are of the form MODIFIER-{left,right,up,down}.
+Default MODIFIER is 'shift."
(interactive)
- (global-set-key [(shift left)] 'windmove-left)
- (global-set-key [(shift up)] 'windmove-up)
- (global-set-key [(shift right)] 'windmove-right)
- (global-set-key [(shift down)] 'windmove-down))
+ (unless modifier (setq modifier 'shift))
+ (global-set-key (vector (list modifier 'left)) 'windmove-left)
+ (global-set-key (vector (list modifier 'right)) 'windmove-right)
+ (global-set-key (vector (list modifier 'up)) 'windmove-up)
+ (global-set-key (vector (list modifier 'down)) 'windmove-down))
(provide 'windmove)