如何在 2 个 Windows emacs 中交换缓冲区

How to swap the buffers in 2 windows emacs

提问人:ant2009 提问时间:11/21/2009 最后编辑:bstpierreant2009 更新时间:2/23/2022 访问量:37295

问:

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

例如: 我使用打开1文件C-x C-f file1.c RET

我把框架分成两个窗口:C-x 3

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

所以我有 2 个文件:

窗口 1(左)file1.c

窗口 2(右)file2.c

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

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

emacs的

评论

0赞 nephewtom 2/12/2015
这也有效(在 emacs24 中测试): 转置两个缓冲区 这似乎类似于 Bahbar 答案

答:

-1赞 Michael H. 11/21/2009 #1

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

11赞 Bahbar 11/21/2009 #2

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

然而,为这样做而鞭挞一些 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

评论

0赞 11/21/2009
我复制并粘贴了这段代码,它似乎什么也没做。
0赞 11/21/2009
哦,对不起,它确实做了一些事情,它交换了 Emacs 窗口的顶部和底部。我期待它交换框架。
0赞 Bahbar 11/21/2009
还行。你把我弄糊涂了。你提到了 C-x 3。这是为了创建 2 个 emacs 窗口,而不是 2 个 emacs 框架。您使用的是框架还是窗户?你怎么称呼窗口,你怎么称呼框架?
0赞 Bahbar 11/21/2009
另外,您没有谈论顶部和底部。您是否同时显示 2 个以上的缓冲区?
0赞 11/21/2009
我不是提出这个问题的人,我只是一个闯入者。在我看到这个问题之前,我从未使用过 C-x 3,但正如您所说,它拆分了 Emacs 窗口,而不是创建一个新框架。
99赞 Raja Selvaraj 11/22/2009 #3

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

评论

0赞 Martin Clarke 6/10/2010
这个解决方案是完美的,评论非常清楚 - 只要确保你阅读它们:)
3赞 mefiX 11/29/2010
如果您只想交换窗口(独立于所选窗口),则可以使用以下命令(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
0赞 Ev Dolzhenko 4/2/2012
buffer-move 在只有两个窗口的布局中对我不起作用,但它工作得很好,谢谢!win-swap
2赞 Micah Elliott 7/12/2016
在该缓冲区移动源中,您将看到有关 to 等所有重要映射的注释。C-S-upbuf-move-up
36赞 phils 5/11/2012 #4

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

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            |      |                 |       |
       +-------------------------+      +-----------------+-------+

评论

2赞 legends2k 11/28/2016
flop-frame仅当窗口之间的分割是垂直的时才有效,对于水平分割,您需要.但是,工作是无关紧要的;一个命令可在两个窗口之间交换缓冲区,无论拆分方向如何:)flip-framerotate-frame
16赞 zippy 10/4/2013 #5

如果您使用的是 Prelude,则只能使用 ()。来自 Prelude 文档:C-c sprelude-swap-windows

C-c s运行命令(见 ), 这是 crux.el 中的别名。crux-swap-windowsprelude-mode-mapcrux-transpose-windows

评论

0赞 anarcat 12/10/2017
Prelude 看起来很拗口(而且它没有在任何地方打包 - = wtf?),但 crux 确实看起来不错,并且首先做了一堆我自己滚动的东西。curl | sh
0赞 anarcat 9/7/2019
我知道什么是,我要说的是:这是邪恶的。curl | sh
1赞 Aborn Jiang 11/28/2015 #6

以下代码片段可以执行切换缓冲区。

(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"))
2赞 phillc 10/19/2017 #7

如果你有前奏,你可以将 ace 窗口与 .从那里,您可以执行其文档中列出的许多操作。S-w

您也可以从调用 ace-window 开始,然后决定切换 删除或交换等操作。默认情况下,绑定为:

x - 删除窗口

M - 交换(移动)窗口

C - 垂直或水平公平地分割窗口

v - 垂直拆分窗口

B - 水平拆分窗口

n - 选择上一个窗口

...

所以会是这样S-w m

评论

0赞 Claudio 4/13/2019
对于 Spacemacs 用户,绑定到 .默认情况下,此功能可用。ace-swap-windowSPC w M
70赞 dgtized 11/20/2017 #8

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

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

它似乎提供与 crux-transpose-windows 类似的功能,但也可以进行一些高度/宽度移位?

评论

3赞 Pedro Delfino 5/18/2021
简单有效
0赞 Nick 11/5/2021
简单、有效且内置,无需第三方。当我打开 4 个文件时,这正是我想要的,它用右边的文件交换了左边的文件,而剩下的两个文件单独存在。Emacs 27.2 中。
0赞 Jay Lee 10/22/2022
这么简单,但为什么这么慢?执行大约需要 2 秒
2赞 flexw 12/15/2021 #9

如果您使用我强烈推荐的 Ace 窗口,您可以用 .ace-swap-window

9赞 Rajanboy 2/23/2022 #10

作为当前的 emacs 29 版本。 我们有,它就像交换窗户的魔术。windmove

windmove-swap-states-right windmove-swap-states-up windmove-swap-states-left windmove-swap-states-down