【问题标题】:How to swap the buffers in 2 windows emacs如何在 2 个 windows emacs 中交换缓冲区
【发布时间】:2010-12-18 23:47:31
【问题描述】:

我正在使用 emacs,我发现有时我将 2 个文件分成 2 个窗口。

例如: 我使用 C-x C-f file1.c RET

打开 1 个文件

然后我将框架分成两个窗口:C-x 3

然后我打开另一个文件 C-x C-f file2.c RET

所以我有 2 个文件:

窗口 1(左)file1.c

窗口 2(右)file2.c

我想知道是否有任何组合键可以交换文件?通常,当我有 2 个窗口时,我喜欢在左侧窗口上工作。我知道我可以轻松地执行 C-x o 将光标移动到右侧窗口。

但是,我只是想知道是否可以交换文件,以便 file2.c 在左侧窗口中,file1.c 在右侧窗口中?

【问题讨论】:

标签: emacs


【解决方案1】:

我为此使用buffer-move。现在,如果您正在处理左侧的缓冲区,则调用“buf-move-right”会将其与右侧的缓冲区交换。我想这就是你想要的。

【讨论】:

  • 这个解决方案非常完美,而且 cmets 非常清晰 - 请确保您阅读它们 :)
  • 如果你只是想交换窗口(与选中的无关),可以使用下面的(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
  • buffer-move 不适用于我只有两个窗口的布局,但 win-swap 它工作得很好,谢谢!
  • 在缓冲区移动源中,您将看到有关 C-S-upbuf-move-up 等的所有重要映射的评论。
【解决方案2】:

在 Emacs 26.1 NEWS 文件中有以下条目:

+++
*** New command 'window-swap-states' swaps the states of two live
windows.

哪个似乎提供与crux-transpose-windows 类似的功能,但也可以进行一些高度/宽度转换?

【讨论】:

  • 简单有效
  • 简单、有效且内置,无需第三方。当我打开 4 个文件时,这正是我想要的,它把左边的文件换成了右边的文件,而剩下的两个文件则单独存在。 Emacs 27.2.
【解决方案3】:

transpose-frame 库提供了一组非常全面的函数,用于翻转或旋转框架中的窗口排列。

M-x flop-frame RET 满足这个特定问题的需要。

以下图表来自库中的评论(及其 EmacsWiki 页面):

‘transpose-frame’ … Swap x-direction and y-direction

       +------------+------------+      +----------------+--------+
       |            |     B      |      |        A       |        |
       |     A      +------------+      |                |        |
       |            |     C      |  =>  +--------+-------+   D    |
       +------------+------------+      |   B    |   C   |        |
       |            D            |      |        |       |        |
       +-------------------------+      +--------+-------+--------+

‘flip-frame’ … Flip vertically

       +------------+------------+      +------------+------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |            |     C      |
       +------------+------------+      |     A      +------------+
       |            D            |      |            |     B      |
       +-------------------------+      +------------+------------+

‘flop-frame’ … Flop horizontally

       +------------+------------+      +------------+------------+
       |            |     B      |      |     B      |            |
       |     A      +------------+      +------------+     A      |
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+------------+
       |            D            |      |            D            |
       +-------------------------+      +-------------------------+

‘rotate-frame’ … Rotate 180 degrees

       +------------+------------+      +-------------------------+
       |            |     B      |      |            D            |
       |     A      +------------+      +------------+------------+
       |            |     C      |  =>  |     C      |            |
       +------------+------------+      +------------+     A      |
       |            D            |      |     B      |            |
       +-------------------------+      +------------+------------+

‘rotate-frame-clockwise’ … Rotate 90 degrees clockwise

       +------------+------------+      +-------+-----------------+
       |            |     B      |      |       |        A        |
       |     A      +------------+      |       |                 |
       |            |     C      |  =>  |   D   +--------+--------+
       +------------+------------+      |       |   B    |   C    |
       |            D            |      |       |        |        |
       +-------------------------+      +-------+--------+--------+

‘rotate-frame-anti-clockwise’ … Rotate 90 degrees anti-clockwise

       +------------+------------+      +--------+--------+-------+
       |            |     B      |      |   B    |   C    |       |
       |     A      +------------+      |        |        |       |
       |            |     C      |  =>  +--------+--------+   D   |
       +------------+------------+      |        A        |       |
       |            D            |      |                 |       |
       +-------------------------+      +-----------------+-------+

【讨论】:

  • flop-frame 仅在窗口之间的拆分为垂直时有效,对于水平拆分,您需要flip-frame。但是,rotate-frame 无论如何都可以工作;一个命令在两个窗口之间交换缓冲区,无论分割方向如何:)
【解决方案4】:

如果您使用Prelude,您可以使用C-c s (prelude-swap-windows)。来自 Prelude 文档:

C-c s 运行命令crux-swap-windows(在prelude-mode-map 中找到), 这是crux-transpose-windowscrux.el 中的别名。

【讨论】:

  • prelude 看起来很拗口(而且它没有在任何地方打包 - curl | sh = wtf?),但症结确实看起来不错,而且我一开始就自己做了一堆东西。
  • 我知道curl | sh 是什么,我想说的是:它是邪恶的。
【解决方案5】:

我不知道有任何内置函数这样做。

但是,为此编写一些 elisp 似乎并不难。魔鬼在细节中。

(defun swap-buffers-in-windows ()
  "Put the buffer from the selected window in next window, and vice versa"
  (interactive)
  (let* ((this (selected-window))
     (other (next-window))
     (this-buffer (window-buffer this))
     (other-buffer (window-buffer other)))
    (set-window-buffer other this-buffer)
    (set-window-buffer this other-buffer)
    )
  )

值得注意的是,就插入符号的结束位置而言,这可能不是您想要的。 但是,您首先必须说出您想要什么:p

【讨论】:

  • 我复制并粘贴了这段代码,但它似乎没有任何作用。
  • 哦,对不起,它确实做了一些事情,它交换了 Emacs 窗口的顶部和底部。我期待它交换框架。
  • 好的。你让我很困惑。您提到了 C-x 3。这是创建 2 个 emacs 窗口,而不是 2 个 emacs 框架。你用的是框架还是窗户?什么叫窗户,什么叫框架?
  • 另外,您没有谈论顶部和底部。您是否同时显示 2 个以上的缓冲区?
  • 我不是问这个问题的人,我只是一个闯入者。在看到这个问题之前我从未使用过 C-x 3,但正如你所说,它会拆分 Emacs 窗口,而不是创建一个新框架。
【解决方案6】:

下面的代码sn -p可以做切换缓冲区。

(defun ab/switch-buffer-each-other (arg)
  "switch current buffer with other window buffer 
   right-2-left and up-2-down"
  (interactive "p")
  (cond
   ((windmove-find-other-window 'right) (buf-move-right))
   ((windmove-find-other-window 'left) (buf-move-left))
   ((windmove-find-other-window 'up) (buf-move-up))
   ((windmove-find-other-window 'down) (buf-move-down)))
(message "switch buffer done"))

【讨论】:

    【解决方案7】:

    如果你有前奏,你可以使用 ace-window 和S-w。从那里你可以做他们docs中列出的许多事情。

    您也可以先调用 ace-window 再决定切换 删除或交换等操作。默认情况下,绑定是:

    x - 删除窗口

    m - 交换(移动)窗口

    c - 垂直或水平分割窗口

    v - 垂直分割窗口

    b - 水平分割窗口

    n - 选择上一个窗口

    ...

    所以应该是S-w m

    【讨论】:

    • 对于 Spacemacs 用户,ace-swap-window 绑定到 SPC w M。此功能默认可用。
    【解决方案8】:

    如果您使用我强烈推荐的Ace window,您可以使用ace-swap-window 交换缓冲区。

    【讨论】:

      【解决方案9】:

      我会设法在所需位置打开文件 #2,即在你点击 c-x 3 之后,在导航到第二个文件之前用 c-x o 移动光标。

      【讨论】:

        猜你喜欢
        • 2012-05-24
        • 2011-10-12
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        相关资源
        最近更新 更多