0

I'm using the windmove package to move my cursor between windows. In addition, I want to define a function to move twice, e.g. down first and right second. The following function only do the "down" move but not the "right" move. Any suggestions?

(defun windmove-diagonal ()
    (interactive)
    (windmove-down)
    (windmove-right)
)
  • If you (or another forum participant) would like to write a custom function to move diagonally, then consider having a look at the non-interactive function `window-in-direction` -- I've never tried, but it looks like (from the doc-string at least) that you can write a function that locates a window diagonally -- either by reference to a corner of a window, or by reference to which window is used as a reference point. `M-x describe-function RET window-in-direction RET`. – lawlist May 27 '16 at 01:04

2 Answers2

1

After reading the code in the windmove.el, I found following solution. Thanks for your suggestion, @lawlist

(defun windmove-diagonal (&optional arg)
  (interactive "P")
  (windmove-jump 'left 'down arg))


(defun windmove-jump (dir dir2 &optional arg window)
  (let* ((other-window (windmove-find-other-window dir arg window))
        (other-window2 (windmove-find-other-window dir2 arg other-window)))

    (cond ((null other-window2)
       (error "No window %s from selected window" dir))
      ((and (window-minibuffer-p other-window)
            (not (minibuffer-window-active-p other-window)))
       (error "Minibuffer is inactive"))
      (t
       (select-window other-window2)))))
0

Your code works for me.

I suspect what's happening is that the position of the cursor after moving "down" is not such that you can reach the next desired window by moving "right".

You should be able to compare by performing the commands manually (without moving point in any of the affected buffers).

phils
  • 48,657
  • 3
  • 76
  • 115