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


98

我在使用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.c位于左侧窗口和file1.c右侧窗口中?


这也可以工作(在emacs24中测试):转置两个缓冲区似乎类似于Bahbar的答案
nephewtom

Answers:


88

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


这个解决方案是完美的,并且注释非常清楚-只要确保您阅读它们即可:)
Martin Clarke 2010年

3
如果您只想交换窗口(独立于所选窗口),则可以使用以下内容(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
mefiX 2010年

缓冲移动对我来说仅两个窗口的布局不起作用,但是win-swap对它来说效果很好,谢谢!
dolzenko

1
内部缓冲区-移动源,你会看到所有重要的映射评论为C-S-upbuf-move-up
米卡埃利奥特

34

转置帧库提供了相当全面的函数集用于翻转或以帧旋转窗口安排。

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
flop-frame仅当窗口之间的分割为垂直时才有效,对于水平分割则需要flip-frame。但是,它们分别rotate-frame起作用;一个命令在两个窗口之间交换缓冲区,无论分割方向如何:)
legends2k

33

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

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

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


是的,这可行。我的Emacs> 26.1。M-x window-swap-states在两个窗口之间交换了缓冲区。
Samrat Debroy

15

如果您使用的是Prelude,则只需使用C-c sprelude-swap-windows)。从Prelude文档中:

C-c s运行命令crux-swap-windows(在发现prelude-mode-map),这是一个别名crux-transpose-windowscrux.el


前奏看起来像是满口的(并且没有包装在任何地方- curl | sh= wtf?),但是症结确实看起来不错,并且我一开始自己做了很多东西。
anarcat

我知道curl | sh是什么,我的意思是:这很邪恶。
anarcat

11

我不知道有任何内置函数可以执行此操作。

但是,为实现这一目标而筹集资金却似乎并不困难。魔鬼在细节上。

(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窗口的顶部和底部。我期待它交换框架。

好。你让我困惑。您提到了Cx3。这是创建2个emacs窗口,而不是2个emacs框架。您在使用框架还是窗户?您称Windows为什么,又称框架为什么?
巴哈巴

另外,您没有谈论顶部和底部。您一次显示两个以上的缓冲区吗?
巴哈巴

我不是问这个问题的人,我只是闯入者。在看到这个问题之前,我从未使用过Cx 3,但是正如您所说的,它拆分了Emacs窗口,而不是创建一个新框架。

1

如果您有前奏,可以将ace-window与一起使用S-w。从那里,您可以执行他们的文档中列出的许多操作。

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

x-删除窗口

m-交换(移动)窗口

c-垂直或水平公平地划分窗口

v-垂直拆分窗口

b-水平分割窗口

n-选择上一个窗口

...

原来如此 S-w m


对于Spacemacs用户,ace-swap-window绑定到SPC w M。默认情况下,此功能可用。
Claudio

0

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

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

-1

我会尝试在所需位置打开文件#2,即在您按cx 3之后,在导航到第二个文件之前,先用cx o移动光标。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.