提问人:ant2009 提问时间:11/21/2009 最后编辑:bstpierreant2009 更新时间:2/23/2022 访问量:37295
如何在 2 个 Windows emacs 中交换缓冲区
How to swap the buffers in 2 windows emacs
问:
我正在使用 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
答:
我会设法在所需位置打开文件 #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
评论
为此,我使用buffer-move。现在,如果您正在处理左侧的缓冲区,调用“buf-move-right”将将其与右侧的缓冲区交换。我想这就是你想要的。
评论
(defun win-swap () "Swap windows using buffer-move.el" (interactive) (if (null (windmove-find-other-window 'right)) (buf-move-left) (buf-move-right)))
win-swap
C-S-up
buf-move-up
转置帧库提供了一组非常全面的函数,用于翻转或旋转帧中的窗口排列。
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 | | | |
+-------------------------+ +-----------------+-------+
评论
flop-frame
仅当窗口之间的分割是垂直的时才有效,对于水平分割,您需要.但是,工作是无关紧要的;一个命令可在两个窗口之间交换缓冲区,无论拆分方向如何:)flip-frame
rotate-frame
如果您使用的是 Prelude,则只能使用 ()。来自 Prelude 文档:C-c s
prelude-swap-windows
C-c s
运行命令(见 ), 这是 crux.el 中的别名。crux-swap-windows
prelude-mode-map
crux-transpose-windows
评论
curl | sh
curl | sh
以下代码片段可以执行切换缓冲区。
(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"))
如果你有前奏,你可以将 ace 窗口与 .从那里,您可以执行其文档中列出的许多操作。S-w
您也可以从调用 ace-window 开始,然后决定切换 删除或交换等操作。默认情况下,绑定为:
x - 删除窗口
M - 交换(移动)窗口
C - 垂直或水平公平地分割窗口
v - 垂直拆分窗口
B - 水平拆分窗口
n - 选择上一个窗口
...
所以会是这样S-w m
评论
ace-swap-window
SPC w M
在 Emacs 26.1 NEWS 文件中,有如下条目:
+++
*** New command 'window-swap-states' swaps the states of two live
windows.
它似乎提供与 crux-transpose-windows
类似的功能,但也可以进行一些高度/宽度移位?
评论
如果您使用我强烈推荐的 Ace 窗口,您可以用 .ace-swap-window
作为当前的 emacs 29 版本。
我们有,它就像交换窗户的魔术。windmove
windmove-swap-states-right
windmove-swap-states-up
windmove-swap-states-left
windmove-swap-states-down
评论