如何在2个窗口emacs交换缓冲区
我使用emacs我发现有时我有2个文件分成2个窗口。
例如:我用Cx Cf file1.c RET打开1个文件
我把这个框架分成两个窗口: Cx 3
然后我打开另一个文件Cx Cf file2.c RET
所以我有2个文件:
窗口1(左) file1.c
窗口2(右) file2.c
我想知道是否有任何按键组合交换文件? 当我有两个窗口时,通常我喜欢在左边的窗口上工作。 我知道我可以轻松地将Cx o移动到右边的窗口。
不过,我只是想知道如果我可以交换文件,以便file2.c
在左边的窗口和file1.c
在右边的窗口?
我使用缓冲移动为此。 现在,如果您正在处理左侧的缓冲区,调用“buf-move-right”会将其与右侧的缓冲区交换。 我想这是你想要的。
转置帧库提供了一套非常全面的function,用于翻转或旋转帧中的窗口排列。
Mx的 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 | | | | +-------------------------+ +-----------------+-------+
我不知道有任何内置的function这样做。
然而,要做一些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
如果你使用Prelude,你可以使用Cc s
( prelude-swap-windows
)。 从Prelude文档:
Cc s
运行命令crux-swap-windows
(在prelude-mode-map
),这是crux.el中crux-transpose-windows
的别名 。
我会设法打开文件#2在所需的位置,即在您点击cx 3之后,用cx o移动光标,然后导航到第二个文件。
这也适用(在emacs24testing): 移调两个缓冲区
这似乎与巴巴尔的回答相似
下面的代码片断可以做切换缓冲区。
(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"))
如果你有前奏,你可以用Sw
ace窗口。 从那里你可以做许多事情在他们的文档中列出。
您也可以先调用ace-window,然后决定切换操作以删除或交换等。默认情况下,绑定是:
x – 删除窗口
m – 交换(移动)窗口
c – 公平地分割窗口,垂直或水平
v – 垂直分割窗口
b – 水平分割窗口
n – select上一个窗口
…
所以这将是Sw m