在emacs中选择以前选择的窗口

时间:2011-10-29 06:41:02

标签: emacs elisp

我需要一个emacs内置函数或elisp函数,可以将我带到之前选择的窗口。我认为(select-window (get-lru-window))会这样做,但如果我多次运行它,似乎只是在窗口之间循环而不是在它们之间来回交换,这就是我所期望的。

还有其他想法吗?

2 个答案:

答案 0 :(得分:7)

似乎没有办法在emacs中获取最近选择的窗口(与get-lru-window返回的最近最少使用的窗口相反)。内部emacs跟踪windows上的use_time,get-lru-window使用它来查找“最旧的”窗口。但不幸的是,这并没有暴露在elisp中。

窗口列表在cyclic window ordering中排序,这对您的情况没有帮助。

然而,缓冲区列表是从最近到最近使用的缓冲区排序的(或者不是非常严格的,有一个(埋葬缓冲区)函数可以最后移动缓冲区。)

这意味着,如果您可以将问题转换为“如何在最近选择的缓冲区的不同窗口中切换到缓冲区”,那么应该可以。

一种方法是做这样的事情:

(defun switch-to-previous-buffer-in-a-different-window ()
  (interactive)
  (let* ((otherbuf (other-buffer (current-buffer) t))
     (otherwin (get-buffer-window otherbuf)))
(if otherwin
    (select-window otherwin)
  (message "Last buffer (%s) is not currently visible" (buffer-name otherbuf)))))

或更短,更有特色:

(defun switch-to-previous-buffer-possibly-creating-new-window ()
  (interactive)
  (pop-to-buffer (other-buffer (current-buffer) t)))

此处other-buffer用于获取最近使用的缓冲区(当前缓冲区除外)。只要你不在窗口中切换缓冲区,这应该可以正常工作,因为其他缓冲区将不再返回另一个窗口中的缓冲区,而是在当前窗口中切换的缓冲区。

因此,不要使用其他缓冲区,而是让自己遍历缓冲区列表以找到最佳候选者:

(defun switch-to-the-window-that-displays-the-most-recently-selected-buffer ()
  (interactive)
  (let* ((buflist (buffer-list (selected-frame)))      ; get buffer list in this frames ordered
     (buflist (delq (current-buffer) buflist))     ; if there are multiple windows showing same buffer.
     (winlist (mapcar 'get-buffer-window buflist)) ; buf->win
     (winlist (delq nil winlist))                  ; remove non displayed windows
     (winlist (delq (selected-window) winlist)))   ; remove current-window
(if winlist
    (select-window (car winlist))
  (message "Couldn't find a suitable window to switch to"))))

希望这有帮助。

答案 1 :(得分:1)

如果以编程方式完成最后一个窗口切换,则可以选择之前选择的窗口。

(defun your-function ()
  (interactive)
  (let ((sw (selected-window)))
    (do-something-useful-and-switch-window)
    (select-window sw)))

如果手动完成最后一个窗口切换,则应该可以重载窗口切换命令以更新窗口选择顺序的全局列表,然后用于切换回来。