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

在emacs中选择以前选择的窗口,emacs,elisp,Emacs,Elisp,我需要一个emacs内置函数或elisp函数,可以将我带到以前选择的窗口。我原以为select window get lru window可以做到这一点,但如果我多次运行它,似乎只是在窗口之间循环,而不是在窗口之间来回交换,这就是我所期望的 还有其他想法吗?似乎没有办法在emacs中获取最近选择的窗口,而不是获取lru窗口返回的最近使用最少的窗口。emacs内部跟踪windows上的使用时间,get lru window使用该时间查找最早的窗口。但不幸的是,这并没有在elisp中公开 窗口列表是

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


还有其他想法吗?

似乎没有办法在emacs中获取最近选择的窗口,而不是获取lru窗口返回的最近使用最少的窗口。emacs内部跟踪windows上的使用时间,get lru window使用该时间查找最早的窗口。但不幸的是,这并没有在elisp中公开

窗口列表是按顺序排列的,对您的情况没有帮助

然而,缓冲区列表的顺序是从最近使用的缓冲区到最近使用的缓冲区,或者不是严格地说,有一个bury buffer函数将缓冲区移到最后

这意味着,如果您可以将问题转化为类似于如何在最近选定的缓冲区所在的不同窗口中切换到缓冲区的内容,那么这应该是可能的

一种方法是这样做:

(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)))
这里使用其他缓冲区来获取除当前缓冲区之外的最近使用的缓冲区。只要不在窗口中切换缓冲区,这应该可以正常工作,因为这样其他缓冲区将不再返回其他窗口中的缓冲区,而是返回当前窗口中从中切换的缓冲区

因此,与其使用其他缓冲区,不如让我们自己浏览缓冲区列表,以找到最佳候选:

(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"))))

希望这有帮助。

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

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

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

选择窗口的文档说明“可选的第二个arg NORECORD non nil表示不要将此缓冲区放在最近选择的缓冲区列表的前面。”。。。但这听起来与你描述的相反……我认为你可以滥用缓冲区列表。类似于select window buffer window other buffer current buffer tPerfect,@AndersWaldenborg-这是一个hacktacular,但就我的目的而言,它工作得很好。谢谢现在,如果只有一个网站,请将此评论升级为答案功能:好吧,继续,将其作为答案发布,我会接受它。我真的很惊讶没有比这更直接的了,但我还是要了!