2つのウィンドウのEmacsでバッファを交換する方法


98

emacsを使用していますが、2つのファイルが2つのウィンドウに分かれていることがあります。

たとえば、次のようにして1つのファイルを開きます。 C-x C-f file1.c RET

フレームを2つのウィンドウに分割します。 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でテスト済み):2つのバッファーの転置Bahbarの回答に似ているようです
甥の

回答:


88

これにはバッファ移動を使用します。左側のバッファで作業している場合、「buf-move-right」を呼び出すと、右側のバッファと入れ替わります。これはあなたが望むものだと思います。


この解決策は完璧で、コメントは非常に明確です。必ず読んでください:)
Martin Clarke

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

buffer-moveは2つのウィンドウのレイアウトでは機能しません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関係なく動作します。分割方向に関係なく、2つのウィンドウ間でバッファを交換する1つのコマンド:)
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-states2つのウィンドウ間でバッファを交換しました。
Samrat Debroy

15

Preludeを使用している場合は、C-c sprelude-swap-windows)だけを使用できます。Preludeドキュメントから:

C-c sコマンドcrux-swap-windows(にありますprelude-mode-mapcrux-transpose-windows実行します。これはcrux.elのエイリアスです。


preludeは一口のように見えます(どこにもパッケージ化されていません- curl | sh= wtf?)。
anarcat 2017

私は何をcurl | sh言っているのか知っています。
anarcat

11

これを行う組み込み関数については知りません。

ただし、そのために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


このコードをコピーして貼り付けましたが、何も実行されないようです。

ああ、ごめんなさい、それは何かをします、それはEmacsウィンドウの上部と下部を入れ替えます。フレームが入れ替わると思っていました。

OK。あなたは私を混乱させています。あなたはCx 3について言及しました。これは2つのemacsフレームではなく2つのemacsウィンドウを作成することです。フレームまたはウィンドウを使用していますか?あなたは何を窓と呼び、何をフレームと呼びますか?
バーバー2009年

また、あなたは上部と下部のパーツについて話しませんでした。一度に2つ以上のバッファが表示されていますか?
バーバー、2009年

私は質問をした人ではなく、単なる侵入者です。私はこの質問を見るまで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でカーソルを移動してから、2番目のファイルに移動します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.