【问题标题】:Emacs: Is it possible to set one particular window to always be used as the "other window"?Emacs:是否可以将一个特定窗口设置为始终用作“其他窗口”?
【发布时间】:2014-03-04 23:35:46
【问题描述】:

有许多有用的 emacs 命令可以在“其他窗口”中执行操作(例如 C-x C-b 可以查看缓冲区列表,C-h a 可以查看可用命令,或许多其他命令)。

我的问题:在一帧中使用多个精心排列的窗口似乎不太适合,每个窗口都显示特定的内容。

每当我使用这些“其他窗口”命令之一时,它都会替换某些其他窗口的内容,这些窗口 (1) 可能太窄而无法清楚地显示正在显示的信息,并且 (2) 可能需要手动操作”清理”之后,通过将其设置回正确的缓冲区。 (而且你最好不要在这样做的时候检查缓冲区列表,否则你会弄乱另一个窗口!)

(Emacs 甚至不总是使用同一个“其他窗口”,即使命令是从同一个窗口发出的。例如,C-x C-b 输出可能会进入一个“其他”窗口,而C-h a 显示它的导致不同的“其他”窗口。同样,C-M-v 有时会滚动与刚刚出现输出的窗口不同的“其他”窗口。)

我想要解决或解决此问题的方法,例如:

  1. 我真的很希望能够指定一个特定的窗口以始终用作该框架中任何窗口的“其他窗口”。

  2. 如果做不到这一点,也许有一种方法可以重新排列窗口顺序和/或使用不可见的窗口(如果存在的话)通过进行大量的幕后窗口改组来获得解决方案 1 的效果,可能需要在写入“其他窗口”的命令之前或之后输入额外的命令。

  3. 如果这些失败,我想要一个命令来撤消任何窗口中最近的缓冲区更改,因此使用的任何窗口都可以恢复到使用前显示的内容。

(目前我使用 workgroups.el 并且我使用单独的工作组来检查文档,但这显然不是最理想的。“更新”工作组并没有实现解决方案 3,因为它似乎只会将缓冲区更改回来,如果它是一个常规文件。)

编辑:我看到这个问题与this similar question 非常相似,但是那个问题没有得到它想要的答案。由于可能不存在理想的解决方案,因此我也对变通方法非常感兴趣。

【问题讨论】:

    标签: emacs


    【解决方案1】:

    如果没有这些,我想要一个撤消任何窗口中最近的缓冲区更改的命令,所以无论使用什么窗口都可以返回到 它在使用前显示的内容。

    一个可能的解决方案是使用winner-mode。通过添加来激活它

    (winner-mode 1)
    

    它提供了两个命令winner-undowinner-redo,分别用于撤销和重做窗口配置。

    另外,既然你提到了workgroups.el,不妨试试workgroups2,它是workgroups.el 的一个分支。它提供了类似的命令(wg-undo-wconfig-changewg-redo-wconfig-change)来恢复窗口配置

    【讨论】:

    • 感谢指向 workgroups2 的指针!最初的项目github.com/tlh/workgroups.el 多年未更新,但现在似乎(至少)有两个分支试图继续它(也许彼此不知道?),一个在github.com/workgroups/workgroups.el(我是使用)和一个github.com/pashinin/workgroups2。 pashinin 叉子似乎有很多工作要做 - 我会试一试。
    【解决方案2】:

    所有人都会不同意我的回答。但有人可能认为这是有成效的。

    每帧一个窗口做所有事情。

    ;;Disable split-window
    (defun split-window-below ()
      (interactive)
      ;;do nothing
    )
    
    (defun split-window-right ()
      (interactive)
      ;;do nothing
    )
    

    那么你就不能再分屏了。如果需要显示另一个缓冲区,请使用另一个帧(C-x52)。

    【讨论】:

    • 我想这在技术上确实解决了标题中的问题,尽管它没有解决我所描述的情况。
    【解决方案3】:

    上周我找到了#1 的解决方案。这个想法是专用于所有窗口,但您的关注。通过这种方式,您可以锁定一个窗口。听起来有点相反。

    (defvar window-locked-p nil)
    (defun lockon-window ()
      "Set a target window to be used when calls `other-window'.
    To set the target window, first put point to the window, then
    call this.  Technically this sets all window dedicated but the
    target window.  Call again to free windows."
      (interactive)
      (walk-windows
       (lambda (win)
         (set-window-dedicated-p win (not window-locked-p))))
      (if window-locked-p
          (message "All windows are free")
        (set-window-dedicated-p (selected-window) nil)
        (message "Window is locked on"))
      (setq window-locked-p (not window-locked-p)))
    

    当我听 Stevie Ray Vaughan & Double Trouble 的 Slide Thing 时,我想到了 #3 的解决方案。弹出的缓冲区位于其他缓冲区之上一层。

    (winner-mode 1)
    (defun slide-window ()
      "This slides a buffer, in an unexpected window, to next-window.
    Call this with point on the window.  This only works soon after a
    buffer was popped by `other-window' to an unexpected window.
    Technically this recalls previous buffer-set by (winner-undo)
    then shows the buffer to next-window.  This is complementary to
    `lockon-window'."
      (interactive)
      (let ((buf (buffer-name)))
        (winner-undo)
        (set-window-buffer (next-window) buf)
        (message "Window is slided")
        (other-window 1)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多