Cách hoán đổi bộ đệm trong 2 emac windows


98

Tôi đang sử dụng emacs tôi thấy rằng đôi khi tôi có 2 tệp được tách thành 2 cửa sổ.

Ví dụ: Tôi mở 1 tệp bằng C-x C-f file1.c RET

và tôi chia khung thành hai cửa sổ: C-x 3

Sau đó tôi mở một tệp khác C-x C-f file2.c RET

Vì vậy, tôi có 2 tệp:

cửa sổ 1 (trái) file1.c

cửa sổ 2 (phải) file2.c

Tôi đang tự hỏi liệu có bất kỳ tổ hợp phím nào để hoán đổi các tệp không? Bình thường tôi thích làm việc trên cửa sổ bên trái khi tôi có 2 cửa sổ. Tôi biết tôi có thể dễ dàng thực hiện C-x ođể di chuyển con trỏ sang cửa sổ bên phải.

Tuy nhiên, tôi chỉ tự hỏi liệu tôi có thể hoán đổi các tệp để file2.cở cửa sổ bên trái và file1.cở cửa sổ bên phải không?


Điều này cũng làm (thử nghiệm trong emacs24): transposing Hai Buffers Có vẻ như tương tự như Bahbar câu trả lời
nephewtom

Câu trả lời:


88

Tôi sử dụng bộ đệm di chuyển cho việc này. Bây giờ nếu bạn đang làm việc trên bộ đệm ở phía bên trái, gọi 'buf-move-right' sẽ hoán đổi nó với cái ở bên phải. Tôi đoán đây là những gì bạn muốn.


Giải pháp này là hoàn hảo, và những ý kiến rất rõ ràng - chỉ cần đảm bảo bạn đọc chúng :)
Martin Clarke

3
Nếu bạn chỉ muốn cửa sổ swap (độc lập trên một chọn), bạn có thể sử dụng sau(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 không hoạt động với tôi với bố cục chỉ có hai cửa sổ nhưng với win-swapnó hoạt động tốt, cảm ơn!
dolzenko

1
Bên trong đó nguồn đệm-di chuyển bạn sẽ thấy một nhận xét về ánh xạ hết sức quan trọng cho C-S-upđến buf-move-upvv
Micah Elliott

34

Các transpose-frame thư viện cung cấp một tập khá toàn diện các chức năng cho lật hay xoay sắp xếp cửa sổ trong khung.

M-x flop-frame RET làm những gì câu hỏi cụ thể này cần.

Các sơ đồ sau đây là từ bình luận trong thư viện (và trang EmacsWiki của nó):

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-framechỉ hoạt động khi sự phân chia giữa các cửa sổ theo chiều dọc, bạn cần sự phân chia theo chiều ngang flip-frame. Tuy nhiên, rotate-framehoạt động không thể kiểm soát; một lệnh để trao đổi các bộ đệm giữa hai cửa sổ, không có vấn đề gì định hướng chia :)
legends2k

33

Trong tệp TIN TỨC 26.1 Emacs có mục nhập sau:

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

Cái nào dường như cung cấp chức năng tương tự crux-transpose-windowsnhưng cũng có thể thực hiện một số chuyển đổi chiều cao / chiều rộng?


Vâng, điều này hoạt động. Tôi có Emacs> 26.1. M-x window-swap-statesđã hoán đổi bộ đệm giữa hai cửa sổ.
Samrat Debroy

15

Nếu bạn đang sử dụng Prelude, bạn chỉ cần sử dụng C-c s( prelude-swap-windows). Từ tài liệu Prelude:

C-c schạy lệnh crux-swap-windows(được tìm thấy trong prelude-mode-map), đó là một bí danh cho crux-transpose-windowstrong crux.el .


prelude trông giống như một cái miệng (và nó không được đóng gói ở bất cứ đâu - curl | sh= wtf?), nhưng mấu chốt là trông rất đẹp và có rất nhiều thứ mà tôi đã tự cuộn ngay từ đầu.
anarcat

tôi biết điều gì curl | shlà, điều tôi đang nói là: nó xấu xa.
anarcat

11

Tôi không biết bất kỳ chức năng tích hợp nào đang thực hiện việc này.

Tuy nhiên, có vẻ như không quá khó để có được một số elisp để làm điều đó. Ma quỷ là trong các chi tiết mặc dù.

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

Đáng chú ý, điều này có thể không làm những gì bạn mong muốn đối với nơi dấu mũ kết thúc. Tuy nhiên, trước tiên bạn phải nói những gì bạn muốn: p


Tôi đã sao chép và dán mã này, và nó dường như không làm được gì cả.

Ồ, xin lỗi, nó làm gì đó, nó hoán đổi phần trên và dưới của cửa sổ Emacs. Tôi đã mong đợi nó để hoán đổi các khung.

đồng ý. Bạn đang làm tôi bối rối. bạn đã đề cập đến Cx 3. Đây là để tạo 2 cửa sổ emacs, không phải 2 khung emacs. Bạn đang sử dụng khung hoặc cửa sổ? Bạn gọi cửa sổ là gì và bạn gọi khung là gì?
Bahbar

ngoài ra, bạn đã không nói về các phần trên và dưới. Bạn có nhiều hơn 2 vùng đệm hiển thị cùng một lúc không?
Bahbar

Tôi không phải là người đặt ra câu hỏi, tôi chỉ là một kẻ xuyên không. Tôi chưa bao giờ sử dụng Cx 3 trước khi tôi thấy câu hỏi này, nhưng như bạn nói nó chia cửa sổ Emacs, thay vì tạo một khung mới.

1

Nếu bạn có dạo đầu, bạn có thể sử dụng ace-window với S-w. Từ đó bạn có thể làm nhiều thứ được liệt kê trong tài liệu của họ .

Bạn cũng có thể bắt đầu bằng cách gọi ace-window và sau đó quyết định chuyển đổi hành động để xóa hoặc hoán đổi, v.v. Theo mặc định, các ràng buộc là:

x - xóa cửa sổ

m - cửa sổ hoán đổi (di chuyển)

c - chia cửa sổ công bằng, theo chiều dọc hoặc chiều ngang

v - chia cửa sổ theo chiều dọc

b - chia cửa sổ theo chiều ngang

n - chọn cửa sổ trước đó

...

Vì vậy, nó sẽ là S-w m


Đối với người dùng Spacemacs, ace-swap-windowbị ràng buộc SPC w M. Chức năng này có sẵn theo mặc định.
Claudio

0

Đoạn mã sau có thể làm bộ đệm chuyển đổi.

(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

Tôi sẽ cố gắng mở tệp số 2 ở vị trí mong muốn, tức là sau khi bạn nhấn cx 3, hãy di chuyển con trỏ với cx o trước khi điều hướng đến tệp thứ hai.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.