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

如何在2个windows emacs中交换缓冲区,emacs,Emacs,我正在使用emacs,我发现有时我有两个文件被分成两个窗口 例如: 我使用C-x C-f file1.C RET打开了1个文件 我把这个框架分成两个窗口:C-X3 然后我打开另一个文件C-xc-f file2.C RET 所以我有两个文件: 窗口1(左)file1.c 窗口2(右)file2.c 我想知道是否有任何组合键来交换文件?通常当我有两个窗口时,我喜欢在左边的窗口工作。我知道我可以很容易地做C-x操作,将光标移动到右侧窗口 但是,我只是想知道是否可以交换文件,以便file2.c位于左侧窗

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

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

我把这个框架分成两个窗口:C-X3

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

所以我有两个文件:

窗口1(左)
file1.c

窗口2(右)
file2.c

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


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

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

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

然而,要想激发一些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我使用它。现在,如果您正在处理左侧的缓冲区,则调用“buf move right”将与右侧的缓冲区进行交换。我想这就是您想要的。

该库提供了一组相当全面的函数,用于翻转或旋转框架中的窗口排列

M-x
flop frame
RET实现了这个特定问题所需要的功能

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

如果您正在使用,则只需使用
C-cs
prelude-swap-windows
)。从序曲文档中:

C-cs
运行命令
crux swap windows
(可在
prelude mode map
中找到), 它是中的
crux transpose窗口的别名


下面的代码段可以执行切换缓冲区

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

如果您有prelude,则可以将ace窗口与
S-w
一起使用。从那里你可以做许多列在他们的清单上的事情

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

x-删除窗口

m-交换(移动)窗口

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

垂直分割窗口

b-水平拆分窗口

n-选择上一个窗口


因此,在Emacs 26.1新闻文件中有以下条目:

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

它似乎提供了与类似的功能,但也可以进行一些高度/宽度转换?

我复制并粘贴了这段代码,但它似乎没有做任何事情。哦,对不起,它做了一些事情,它交换了Emacs窗口的顶部和底部。我希望它能交换相框。好的。你把我弄糊涂了。你提到了C-X3。这是为了创建2个emacs窗口,而不是2个emacs框架。您使用的是框架还是窗口?你们叫什么窗口,叫什么框架?还有,你们并没有提到顶部和底部。你有两个以上的缓冲区同时显示吗?我不是问这个问题的人,我只是一个闯入者。在我看到这个问题之前,我从未使用过C-x 3,但正如您所说,它会分割Emacs窗口,而不是创建一个新的框架。这个解决方案非常完美,并且注释非常清楚-请确保您阅读它们:)如果您只想交换窗口(独立于所选窗口),您可以使用以下
(defun win swap()“使用buffer move.el交换窗口”(交互式)(if(null(windmove find other window'right))(buf move left)(buf move right)))
buffer move在两个窗口的布局中不起作用,但在
win swap
中效果很好,谢谢!在buffer move源代码中,你会看到关于
C-S-up
buf move-up
等的所有重要映射的注释。
flop frame
仅当窗口之间的拆分已完成时才起作用rtical,对于水平拆分,您需要
翻转帧
。但是,
旋转帧
的工作方式与预期不同;一个命令可以在两个窗口之间交换缓冲区,无论拆分方向如何:)prelude看起来像一口(并且它没有打包在任何地方-
curl | sh
=wtf?),但crux看起来确实不错,而且一开始我自己做了很多事情。我知道什么是
curl | sh
,我想说的是:它是邪恶的。这也有效(在emacs24中测试):这似乎类似于Bahbar应答对于Spacemacs用户,
ace交换窗口
绑定到
SPC w M
。此功能默认可用。简单有效
+++
*** New command 'window-swap-states' swaps the states of two live
windows.