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

问题描述 投票:0回答:3

我需要一个 emacs 内置函数或 elisp 函数,可以将我带到之前选择的窗口。我以为

(select-window (get-lru-window))
可以做到这一点,但如果我运行几次,似乎只是在窗口之间循环,而不是在它们之间来回交换,这正是我所期望的。

还有其他想法吗?

emacs elisp
3个回答
8
投票

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

窗口列表按循环窗口排序排序,这对您的情况没有帮助。

缓冲区列表按照最近使用最多到最少的顺序排列(或者不是严格意义上的,有一个(埋入缓冲区)函数可以最后移动缓冲区)。

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

一种方法是这样做:

(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
投票
如果最后一次窗口切换是通过编程完成的,则可以选择先前选择的窗口。

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

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


1
投票

get-mru-window

,第三个参数非零返回先前选择的窗口(请参阅
手册)。

(defun my-select-last-window () "Switch to the previously selected window." (interactive) (select-window (or (get-mru-window t t t) (user-error "No other window to select"))))
    
© www.soinside.com 2019 - 2024. All rights reserved.