วิธีการสลับบัฟเฟอร์ใน emac 2 windows


99

ฉันใช้ 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อยู่ในหน้าต่างด้านขวาได้หรือไม่?


นอกจากนี้ยังทำงาน (ผ่านการทดสอบใน emacs24): transposing สองบัฟเฟอร์ดูเหมือนคล้ายกับBahbarคำตอบ
nephewtom

คำตอบ:


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

การย้ายบัฟเฟอร์ไม่ได้ผลสำหรับฉันด้วยเลย์เอาต์ของหน้าต่างเพียงสองบาน แต่win-swapมันใช้งานได้ดีขอบคุณ
dolzenko

1
ภายในแหล่งบัฟเฟอร์ย้ายที่คุณจะเห็นความคิดเห็นเกี่ยวกับแมปที่สำคัญทั้งหมดสำหรับC-S-upการbuf-move-upฯลฯ
คาห์เอลเลียต

35

ในไฟล์ Emacs 26.1 NEWS มีรายการต่อไปนี้:

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

ซึ่งดูเหมือนจะมีฟังก์ชันการทำงานที่คล้ายกันcrux-transpose-windowsแต่สามารถเปลี่ยนความสูง / ความกว้างได้บ้าง?


34

transpose กรอบห้องสมุดให้ชุดที่ครอบคลุมสวยของฟังก์ชั่นสำหรับการพลิกหมุนหรือการเตรียมหน้าต่างในกรอบ

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-frameflip-frameทำงานเฉพาะเมื่อแยกระหว่างหน้าต่างที่เป็นแนวตั้งแนวนอนสำหรับแยกที่คุณต้องการ อย่างไรก็ตามrotate-frameทำงานโดยไม่คำนึงถึง; คำสั่งเดียวเพื่อสลับบัฟเฟอร์ระหว่างสองหน้าต่างไม่ว่าจะมีการวางแนวแยกอย่างไร :)
legends2k

16

หากคุณใช้Preludeคุณสามารถใช้C-c s( prelude-swap-windows) จากเอกสาร Prelude:

C-c sรันคำสั่งcrux-swap-windows(ที่พบในprelude-mode-map) ซึ่งเป็นนามแฝงสำหรับcrux-transpose-windowsในcrux.el


โหมโรงดูเหมือนคำพูด (และไม่ได้บรรจุที่ใดก็ได้ - curl | sh= wtf?) แต่ปมมั่นใจว่าดูดีและทำหลายอย่างที่ฉันรีดด้วยตัวเองตั้งแต่แรก
anarcat

ฉันรู้ว่าอะไรcurl | shคือสิ่งที่ฉันกำลังพูดคือมันชั่วร้าย
anarcat

11

ฉันไม่ทราบว่ามีฟังก์ชันในตัวใด ๆ ที่ทำสิ่งนี้

อย่างไรก็ตามมันดูเหมือนจะไม่ยากเกินไปที่จะแส้บางอย่างเพื่อทำมัน Devil อยู่ในรายละเอียดแม้ว่า

(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 ฉันคาดหวังว่ามันจะสลับเฟรม

ตกลง. คุณทำให้ฉันสับสน คุณพูดถึง Cx 3 นี่คือการสร้าง 2 emacs windows ไม่ใช่ 2 emacs frames คุณใช้เฟรมหรือหน้าต่าง? คุณเรียก windows ว่าอะไรและเรียกว่าอะไรเฟรม?
Bahbar

นอกจากนี้คุณไม่ได้พูดถึงส่วนบนและส่วนล่าง คุณมีบัฟเฟอร์มากกว่า 2 รายการพร้อมกันหรือไม่?
Bahbar

ฉันไม่ใช่คนที่ถามคำถามฉันเป็นแค่ล่ามเท่านั้น ฉันไม่เคยใช้ 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 ก่อนที่จะไปที่ไฟล์ที่สอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.