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

时间:2009-11-21 07:30:08

标签: emacs

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

例如: 我使用 C-x C-f file1.c打开1个文件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位于右侧窗口中?

8 个答案:

答案 0 :(得分:77)

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

答案 1 :(得分:28)

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

答案 2 :(得分:14)

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

  

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

答案 3 :(得分:12)

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

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

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

答案 4 :(得分:11)

我不知道有任何内置功能。<​​/ p>

但是,为了做到这一点,鞭挞一些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

答案 5 :(得分:1)

如果你有前奏,你可以使用ace {window S-w。从那里,您可以执行docs中列出的许多内容。

  

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

     

x - 删除窗口

     

m - 交换(移动)窗口

     

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

     

v - 垂直拆分窗口

     

b - 水平分割窗口

     

n - 选择上一个窗口

     

...

所以它会是S-w m

答案 6 :(得分: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"))

答案 7 :(得分:-1)

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