Emacs เปลี่ยนไปใช้หน้าต่างก่อนหน้า


94

ใน Emacs C-x oพาฉันไปที่หน้าต่างถัดไป

มาโครแป้นพิมพ์ใดที่พาฉันไปยังหน้าต่างก่อนหน้าใน Emacs

คำตอบ:


88

นั่นจะเป็น C-- C-x o

กล่าวอีกนัยหนึ่งC-x oโดยมีอาร์กิวเมนต์ -1 คุณสามารถระบุจำนวนหน้าต่างที่จะย้ายโดยการแทรกอาร์กิวเมนต์ตัวเลขระหว่างC-uและคำสั่งเช่นเดียวกับในC-u 2 C-x o. ( C--เป็นทางลัดสำหรับC-u - 1)


และคุณสามารถใช้C-x zเพื่อทำซ้ำคำสั่งสุดท้ายเพื่อสลับหน้าต่างอย่างรวดเร็ว
Ivan Huang

105

คุณอาจต้องการลองใช้ windmove ซึ่งช่วยให้คุณไปยังหน้าต่างที่คุณเลือกตามรูปทรงเรขาคณิต ฉันมีสิ่งต่อไปนี้ในไฟล์. macs ของฉันเพื่อเปลี่ยนหน้าต่างโดยใช้ปุ่มลูกศร Cx

(global-set-key (kbd "C-x <up>") 'windmove-up)
(global-set-key (kbd "C-x <down>") 'windmove-down)
(global-set-key (kbd "C-x <right>") 'windmove-right)
(global-set-key (kbd "C-x <left>") 'windmove-left)

11
โปรดทราบว่าการโทร(windmove-default-keybindings)จะผูกฟังก์ชันเหล่านี้กับ SHIFT + ขึ้น / ลง / ซ้าย / ขวาซึ่งฉันคิดว่าสะดวกกว่าC-xการเชื่อมโยงของคุณ(ซึ่งขัดแย้งกับการโยงเริ่มต้นที่มีประโยชน์สำหรับprevious-bufferและnext-bufferlkahtz: (kbd)ฟังก์ชันนี้ให้คุณระบุคีย์ในรูปแบบสตริง ในรูปแบบอื่น ๆ อีกมากมายสามารถอ่านได้ซึ่งยังถูกใช้โดย Emacs เมื่อคุณใช้C-h kหรือC-h cเพื่ออธิบายผลผูกพัน.
Phils

4
ฉันไม่เห็นด้วยกับการใช้ปุ่มลูกศร แต่ฉันก็โหวตเพื่อประโยชน์อยู่ดี : smug:
Bjorn

2
@phils SHIFT + <keys> แทรกแซงการเลือกกะที่เปิดใช้งานโดยค่าเริ่มต้นจาก Emacs 23 (shift-selection-mode)
legends2k

2
legends2k: จริง; แม้ว่าคุณจะสามารถส่งอาร์กิวเมนต์เพื่อwindmove-default-keybindingsระบุตัวปรับแต่งอื่นเพื่อใช้ร่วมกับปุ่มลูกศร เพื่อให้ฟังก์ชันนั้นยังคงมีประโยชน์สำหรับผู้ที่ใช้ shift-selection-mode
Phils

1
@phils เห็นด้วยเมตาน่าจะเป็นทางเลือกที่ดี เท่าที่เห็นใน Emacs วิกิพีเดีย
legends2k

30

โดยส่วนตัวแล้วฉันชอบที่จะใช้ window-number.el

ในการเลือกหน้าต่างอื่นให้ใช้Ctrl- x, Ctrl- j n

โดยที่nคือหมายเลขของหน้าต่างโมเดลของแต่ละหน้าต่างจะแสดงหมายเลขดังที่แสดงในภาพหน้าจอ

เพียงดาวน์โหลดwindow-number.elวางไว้ใน emacs load-path และใช้สิ่งต่อไปนี้ในไฟล์.emacs

 (autoload 'window-number-mode "window-number"
   "A global minor mode that enables selection of windows according to
 numbers with the C-x C-j prefix.  Another mode,
 `window-number-meta-mode' enables the use of the M- prefix."
   t)

มีโหมดที่คล้ายกันอีกโหมดหนึ่งที่เรียกว่าswitch-window.elซึ่งให้ตัวเลขจำนวนมากในหน้าต่าง ... (การกดหมายเลขจะเป็นการสลับหน้าต่างและย้อนกลับการแสดงผล)


(ที่มา: tapoueh.org )


2
ดี แต่ผมขอแนะนำไม่ผูกพันบางสิ่งบางอย่างที่จะC-x C-jเป็นที่เริ่มต้นผูกพันถ้าคุณdired-jump (require 'dired-x)(ดูM-x customize-group RET dired-keys RETถ้าคุณต้องการที่จะแทนที่ที่.)
Phils

1
หลังจากโพสต์สิ่งนี้ฉันตัดสินใจที่จะเลิกswitch-window.elใช้มันใช้C-x oแทนและเมื่อมีเพียงสองหน้าต่างที่ใช้งานอยู่มันก็เลือกหน้าต่างอื่น ฉันคิดว่ามันเป็นไปได้ทุกอย่าง rebind C-x oที่จะทำเคล็ดลับคุณค่อนข้างถูกต้องเกี่ยวกับwindow-number dired-jumpโดยส่วนตัวแล้วฉันทำการสลับหน้าต่างน้อยลงและใช้งานด้วยC-x bตัวเอง แต่การได้รับการปรับปรุงC-x oนั้นค่อนข้างน่าพอใจ
ocodo

ว้าวธีม Emacs ที่น่าตื่นตาตื่นใจในภาพหน้าจอแรก ฉันจะไปได้อย่างไร
semente

@semente ในหน้าเกี่ยวกับ Emacs ของฉันjasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24- ธีมฉันคิดว่านี่อาจเป็นหนึ่งในสองธีม - btw. สำหรับสายโหมดเจ๋ง ๆ ลองgist.github.com/jasonm23/8554119
ocodo

13

หากคุณทำงานกับหน้าต่าง emacs หลาย ๆ หน้าต่าง (> 3) เป็นจำนวนมากและคุณต้องการบันทึกการกดแป้นพิมพ์บางอย่างเพิ่มสิ่งนี้ลงในไฟล์ init ของคุณและคุณจะดีกว่า

(defun frame-bck()
  (interactive)
  (other-window-or-frame -1)
)
(define-key (current-global-map) (kbd "M-o") 'other-window-or-frame)
(define-key (current-global-map) (kbd "M-O") 'frame-bck)

ตอนนี้เพียงแค่หมุนอย่างรวดเร็วผ่านหน้าต่างด้วย Mo


1
นี่คือทางออกที่ฉันต้องการ ทั้งหมดที่ฉันต้องการคือให้คำสั่งการสลับหน้าต่างเป็นการกดแป้นพิมพ์ซ้ำเพียงครั้งเดียว ขอบคุณ! ฉันต้องเปลี่ยนหน้าต่างอื่นหรือเฟรมเป็นหน้าต่างอื่นเพื่อให้ใช้งานได้ FYI ฉันใช้ Emacs 24.2.1
Geoff

ฉันคิดว่าสิ่งเหล่านี้เป็นการผูกที่ดีมาก (โดยเฉพาะเมื่อคุณมีหน้าต่าง 2+) ขอบคุณ อย่างที่บอกว่ายังเปลี่ยนหมวกother-windowเพื่อให้ใช้งานได้
dolzenko

11

มีคำตอบที่ดีและสมบูรณ์อยู่ที่นี่ แต่เพื่อตอบคำถามแบบมินิมอล:

 (defun prev-window ()
   (interactive)
   (other-window -1))

 (define-key global-map (kbd "C-x p") 'prev-window)

2
ฉันไม่รู้ว่าตั้งแต่เมื่อไหร่ แต่ตอนนี้ emacs ได้previous-windowสร้างขึ้นแล้ว
Arne

@Arne ไม่ใช่ฟังก์ชันที่เรียกใช้ได้M-xดังนั้นควรตอบสนองวัตถุประสงค์ที่แตกต่างออกไป
Ivan Huang

4

อิงไอเดียจาก @Nate แต่ปรับเปลี่ยนเล็กน้อยเพื่อรองรับการหมุนย้อนกลับระหว่างหน้าต่าง

;; Windows Cycling
(defun windmove-up-cycle()
  (interactive)
  (condition-case nil (windmove-up)
    (error (condition-case nil (windmove-down)
         (error (condition-case nil (windmove-right) (error (condition-case nil (windmove-left) (error (windmove-up))))))))))

(defun windmove-down-cycle()
  (interactive)
  (condition-case nil (windmove-down)
    (error (condition-case nil (windmove-up)
         (error (condition-case nil (windmove-left) (error (condition-case nil (windmove-right) (error (windmove-down))))))))))

(defun windmove-right-cycle()
  (interactive)
  (condition-case nil (windmove-right)
    (error (condition-case nil (windmove-left)
         (error (condition-case nil (windmove-up) (error (condition-case nil (windmove-down) (error (windmove-right))))))))))

(defun windmove-left-cycle()
  (interactive)
  (condition-case nil (windmove-left)
    (error (condition-case nil (windmove-right)
         (error (condition-case nil (windmove-down) (error (condition-case nil (windmove-up) (error (windmove-left))))))))))

(global-set-key (kbd "C-x <up>") 'windmove-up-cycle)
(global-set-key (kbd "C-x <down>") 'windmove-down-cycle)
(global-set-key (kbd "C-x <right>") 'windmove-right-cycle)
(global-set-key (kbd "C-x <left>") 'windmove-left-cycle)

4

เพียงเพื่อเพิ่มคำตอบของ @Nate, @aspirin และ @ Troydm ฉันพบว่านี่เป็นประโยชน์เพิ่มเติมหากคุณตัดสินใจที่จะผูกคำสั่ง windmove กับคีย์ผสมที่คุณเลือก:

(setq windmove-wrap-around t)

ด้วยการกำหนดค่าเริ่มต้นคุณจะได้รับข้อผิดพลาดเมื่อคุณพยายามย้ายไปยังหน้าต่างที่ไม่มีอยู่ซึ่งจะกลายเป็นเรื่องที่น่ารำคาญหลังจากนั้นสักครู่ อย่างไรก็ตามเมื่อตั้งค่า windmove-wrap-around แล้วพยายามที่จะเลื่อนออกจากด้านล่างของเฟรมตัวอย่างเช่นจะเลือกหน้าต่างบนสุดในเฟรมแทน นี่อาจเป็นพฤติกรรมที่เข้าใจง่ายกว่าสำหรับคุณ


4

M-nและM-pเหมาะสมกับฉันมากที่สุดเนื่องจากมีความคล้ายคลึงกับC-n( บรรทัดถัดไป ) และC-p( บรรทัดก่อนหน้า ):

(define-key global-map (kbd "M-p") 'previous-multiframe-window)
(define-key global-map (kbd "M-n") 'other-window)

(แรงบันดาลใจจากสิ่งนี้และสิ่งนั้น )


ฉันได้โหวตและใช้การกำหนดค่านี้แล้ว ปัญหาคือM-nและM-pถูกใช้แล้วในเทอร์มินัล (gdb, python, ielm ฯลฯ ) ดังนั้นคุณจะต้องเปลี่ยนกลับไปใช้วิธีอื่นเพื่อกระโดดออกจากเทอร์มินัลบัฟเฟอร์
mihai

พวกเขาใช้สำหรับอะไรในสภาพแวดล้อมเหล่านั้น?
tshepang

นั่นคือสิ่งที่ดีที่สุดที่ฉันเห็นในขณะนี้ไม่ได้เทียบกับสิ่งอื่นและทำงานได้อย่างมีเสน่ห์! ขอบคุณ!
aurelien

2

ในการอ้างอิงถึงคำตอบของเนทผมเข้ามาแทนที่arrow keysการใช้แบบดั้งเดิมpสำหรับการไปup, nสำหรับการไปdown, fสำหรับการไปrightและสำหรับการไปb leftฉันยังแทนที่Ctrlด้วยSuperคีย์เช่นเดียวกับคีย์C-p, C-n, C-f and C-bการเคลื่อนไหวเริ่มต้น การผสมผสานนี้Mช่วยให้คุณสามารถข้ามอักขระและบรรทัดแทนที่จะผ่านทีละตัวหลังจากการกดแป้นพิมพ์แต่ละครั้ง ดังนั้นSuperคีย์จึงเป็นทางเลือกที่ดีที่สุดในการทำให้การผูกคีย์ทำได้ง่าย ตอนนี้คุณไม่ต้องละมือจากแถวบ้านอีกต่อไป!

(global-set-key (kbd "s-p") `windmove-up)
(global-set-key (kbd "s-n") `windmove-down)
(global-set-key (kbd "s-f") `windmove-right)
(global-set-key (kbd "s-b") `windmove-left)

หวังว่าจะช่วยได้!


2
(global-unset-key (kbd "M-j"))
(global-unset-key (kbd "M-k"))
(global-set-key (kbd "M-j") (lambda () (interactive) (other-window 1)))
(global-set-key (kbd "M-k") (lambda () (interactive) (other-window -1)))

altjและaltkจะวนไปตามบัฟเฟอร์ที่มองเห็นได้ของคุณ ไปข้างหน้าและข้างหลังให้ถูกต้อง


Mk เป็นทางลัดที่มีประโยชน์ ทางเลือกอื่น ๆ ?
A_P


0
(global-set-key (kbd "C-x a") 'ace-swap-window)  
(global-set-key (kbd "C-x q") 'ace-select-window)

download ace-window from the melpa repo if you don't know how to do that
put this in your .emacs file if you don't have one create it 

(package-initialize)                                                                                                                                                                     

(require 'package)                                                                                                                                                                       
(add-to-list 'package-archives '("melpa" , "http://melpa.org/packages/"))                                                                                                                

(package-initialize) 

then "m-x list-packages"

0

วิธีที่เร็วที่สุดที่ฉันได้พบสำหรับการสลับไปที่หน้าต่างก่อนหน้านี้คือการบดกุญแจคู่กันเป็น"กุญแจสำคัญคอร์ด" ต่อไปนี้ให้คุณใช้นิ้วก้อย + นิ้วนางข้างซ้ายพร้อมกันเพื่อไปที่หน้าต่างก่อนหน้า:

(key-chord-define-global "qw" 'prev-window)
(key-chord-define-global "'y" 'other-window) ; bonus for my colemak, adjust otherwise
(key-chord-define-global ";'" 'other-window) ; probably normal

(เป็นไปได้เพราะคีย์คอร์ดของ Emacs มีลำดับอิสระซึ่งหมายความว่าqwเหมือนกับwq)

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