Cara menukar buffer di 2 windows emacs


98

Saya menggunakan emacs Saya menemukan bahwa kadang-kadang saya memiliki 2 file yang dipisahkan menjadi 2 jendela.

Misalnya: Saya membuka 1 file menggunakan C-x C-f file1.c RET

dan saya membagi bingkai menjadi dua jendela: C-x 3

Saya kemudian membuka file lain C-x C-f file2.c RET

Jadi saya punya 2 file:

jendela 1 (kiri) file1.c

jendela 2 (kanan) file2.c

Saya bertanya-tanya apakah ada kombinasi tombol untuk menukar file? Biasanya saya suka bekerja di jendela kiri ketika saya memiliki 2 jendela. Saya tahu saya dapat dengan mudah melakukannya C-x ountuk memindahkan kursor ke jendela kanan.

Namun, saya hanya ingin tahu apakah saya dapat menukar file sehingga file2.cada di jendela kiri dan file1.cdi jendela kanan?


Ini juga bekerja (diuji di emacs24): Transposing Dua Buffer Tampaknya mirip dengan Bahbar jawaban
nephewtom

Jawaban:


88

Saya menggunakan buffer-move untuk ini. Sekarang jika Anda bekerja pada buffer di sisi kiri, memanggil 'buf-move-right' akan menukarnya dengan buffer di sebelah kanan. Saya kira ini yang Anda inginkan.


Solusi ini sempurna, dan komentarnya sangat jelas - pastikan Anda membacanya :)
Martin Clarke

3
Jika Anda hanya ingin menukar jendela (independen pada yang dipilih), Anda dapat menggunakan yang berikut(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 tidak berfungsi untuk saya dengan tata letak hanya dua jendela tetapi dengan win-swapitu berfungsi dengan baik, terima kasih!
dolzenko

1
Di dalam sumber buffer-move Anda akan melihat komentar tentang pemetaan yang sangat penting untuk C-S-upke buf-move-updll.
Micah Elliott

34

The transpose-frame perpustakaan menyediakan satu set cukup komprehensif fungsi untuk membalik atau memutar pengaturan window di frame.

M-x flop-frame RET melakukan apa yang dibutuhkan pertanyaan khusus ini.

Diagram berikut berasal dari komentar di perpustakaan (dan halaman EmacsWiki-nya):

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-framehanya berfungsi jika pemisahan antara jendela vertikal, untuk pemisahan horizontal yang Anda butuhkan flip-frame. Namun, rotate-framebekerja dengan tidak hormat; satu perintah untuk menukar buffer antara dua jendela, tidak peduli apa orientasi perpecahannya :)
legends2k

33

Di file Emacs 26.1 NEWS ada entri berikut:

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

Manakah yang tampaknya menawarkan fungsionalitas serupa crux-transpose-windowstetapi juga dapat melakukan transisi tinggi / lebar?


Ya, ini berhasil. Saya memiliki Emacs> 26.1. M-x window-swap-statesmenukar buffer di antara dua jendela.
Samrat Debroy

15

Jika Anda menggunakan Prelude, Anda bisa menggunakan C-c s( prelude-swap-windows). Dari dokumentasi Prelude:

C-c smenjalankan perintah crux-swap-windows(ditemukan dalam prelude-mode-map), yang merupakan alias untuk crux-transpose-windowsdi crux.el .


pendahuluan terlihat seperti suap (dan tidak dikemas di mana saja - curl | sh= wtf?), tetapi inti jelas terlihat bagus dan melakukan banyak hal yang saya gulung sendiri di tempat pertama.
anarcat

saya tahu apa curl | shitu, yang saya katakan adalah: itu jahat.
anarcat

11

Saya tidak mengetahui ada fungsi bawaan yang melakukan ini.

Namun, tampaknya tidak terlalu sulit untuk menyiapkan beberapa elisp untuk melakukannya. Iblis ada dalam detailnya.

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

Khususnya, ini mungkin tidak melakukan apa yang Anda inginkan sehubungan dengan tujuan akhir tanda sisipan. Namun, Anda harus terlebih dahulu mengatakan apa yang Anda inginkan: p


Saya menyalin dan menempel kode ini, dan sepertinya tidak melakukan apa-apa.

Oh, maaf, itu melakukan sesuatu, itu menukar bagian atas dan bawah jendela Emacs. Saya mengharapkannya untuk menukar bingkai.

baik. Anda membingungkan saya. Anda menyebutkan Cx 3. Ini untuk membuat 2 jendela emacs, bukan 2 bingkai emacs. Apakah Anda menggunakan bingkai atau jendela? Apa yang Anda sebut jendela dan apa yang Anda sebut bingkai?
Bahbar

juga, Anda tidak berbicara tentang bagian atas dan bawah. Apakah Anda memiliki lebih dari 2 buffer yang ditampilkan sekaligus?
Bahbar

Saya bukan orang yang mengajukan pertanyaan, saya hanya seorang penyelundup. Saya belum pernah menggunakan Cx 3 sebelum saya melihat pertanyaan ini, tetapi seperti yang Anda katakan, itu membagi jendela Emacs, daripada membuat bingkai baru.

1

Jika Anda memiliki pendahuluan, Anda dapat menggunakan ace-window dengan S-w. Dari sana Anda dapat melakukan banyak hal yang tercantum di dokumen mereka .

Anda juga dapat memulai dengan memanggil ace-window dan kemudian memutuskan untuk mengganti tindakan untuk menghapus atau menukar, dll. Secara default, bindingnya adalah:

x - hapus jendela

m - menukar (pindah) jendela

c - pisahkan jendela secara adil, baik secara vertikal maupun horizontal

v - jendela terpisah secara vertikal

b - pisahkan jendela secara horizontal

n - pilih jendela sebelumnya

...

Jadi itu akan terjadi S-w m


Untuk pengguna Spacemacs, ace-swap-windowterikat dengan SPC w M. Fungsi ini tersedia secara default.
Claudio

0

Potongan kode berikut dapat melakukan switch buffer.

(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

Saya akan berusaha untuk membuka file # 2 di lokasi yang diinginkan, yaitu setelah Anda menekan cx 3, gerakkan kursor dengan cx o sebelum menavigasi ke file kedua.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.