ฉันจะสลับระหว่างหน้าต่างอย่างรวดเร็วได้อย่างไร
ฉันมักจะเปิดหน้าต่างหลายบานและจำเป็นต้องสลับระหว่างกัน ตอนนี้ฉันใช้C-x o
เพื่อไปยังที่ที่ฉันต้องการ มีเวิร์กโฟลว์ที่มีประสิทธิภาพมากกว่านี้หรือไม่
ฉันจะสลับระหว่างหน้าต่างอย่างรวดเร็วได้อย่างไร
ฉันมักจะเปิดหน้าต่างหลายบานและจำเป็นต้องสลับระหว่างกัน ตอนนี้ฉันใช้C-x o
เพื่อไปยังที่ที่ฉันต้องการ มีเวิร์กโฟลว์ที่มีประสิทธิภาพมากกว่านี้หรือไม่
คำตอบ:
เห็นได้ชัดว่าฉันชอบหน้าต่างเอซสำหรับสิ่งนี้ คุณสามารถสลับระหว่างหน้าต่างและเฟรมที่มองเห็นได้ อยู่ใน MELPA คุณสามารถติดตั้งได้อย่างรวดเร็ว สิ่งเดียวที่เหลืออยู่ที่ต้องทำคือผูกมัน:
(global-set-key (kbd "C-x o") 'ace-window)
หรืออาจจะใช้คอร์ดคีย์ที่สั้นกว่าเนื่องจากการสลับหน้าต่างเป็นงานทั่วไป:
(global-set-key (kbd "M-p") 'ace-window)
ace-window
other-window
มันทดแทนหล่นในสำหรับ ไม่เหมือนกับหลังคุณไม่ต้องโทรace-window
สองครั้งขึ้นไปเพื่อเลือกหน้าต่าง: คุณเลือกหน้าต่างที่คุณต้องการในการโทรครั้งเดียว (อาจข้ามหลายเฟรม)
นอกจากนี้การเปลี่ยนหน้าต่างace-window
สามารถทำขึ้น (ลบหรือหน้าต่างแลกเปลี่ยน ฯลฯ ) ดูREADME
ace-window
แล้วเห็นswitch-window
ซึ่งดูเหมือนว่าจะทำสิ่งเดียวกันประมาณยกเว้นว่าตัวอักษรมีความเด่นชัดมากขึ้น ดูเหมือนจะตลกเรามีทั้งแพ็คเกจ
switch-window
จนกระทั่งฉันส่งace-window
ให้ MELPA
ace-window
มันมีการปรับแต่งมากกว่าแพ็คเกจอื่น ๆ ที่ฉันเดา สิ่งหนึ่งที่อาจเป็นประโยชน์ในอนาคตก็คือกุญแจที่ผูกไว้กับฟังก์ชั่นที่คล้ายกับการกระทำของ swap อย่างชาญฉลาด แต่กินหน้าต่างนั้นทำให้มีหน้าต่างที่ใหญ่กว่าและมีขนาดเล็กกว่าหน้าต่างที่เลือก หน้าต่าง) อัตราส่วนควรจะถูกกำหนดในกรณีนี้เป็นครึ่งหนึ่งหนึ่งในสี่หรือหนึ่งในสามอาจ
windmove
วิธีหนึ่งคือการใช้ ด้วยปุ่มลัดเริ่มต้นของมันจะช่วยให้สลับไปที่หน้าต่างถัดจากที่ใช้งานในปัจจุบัน
มันสร้างขึ้นใน Emacs ดังนั้นไม่จำเป็นต้องติดตั้งอะไรเลย เพียงเปิดใช้งานด้วยการตั้งค่าขั้นต่ำต่อไปนี้ในไฟล์ init ของคุณ:
(windmove-default-keybindings)
จากนั้นคุณสามารถสลับไปยังหน้าต่างที่อยู่ใกล้เคียงโดยใช้คีย์ต่อไปนี้ S-<left>
(ที่ลูกศรใช้สังหรณ์ใจกำหนดทิศทางที่คุณย้าย): S-<right>
, S-<up>
, S-<down>
,
หากคุณต้องการใช้ปรับแต่งอื่นแทนของคุณสามารถให้มันเป็นอาร์กิวเมนต์ไปยังshift windmove-default-keybindings
ตัวอย่างเช่น:
(windmove-default-keybindings 'meta)
หรือ
(windmove-default-keybindings 'control)
ข้อมูลเพิ่มเติมได้ที่Emacs วิกิพีเดีย
(windmove-default-keybindings 'meta)
ตามที่แนะนำบน EmacsWiki
Shift-arrow
)แต่เมื่อคุณมีจอภาพขนาดใหญ่ที่มีรอยแยกจำนวนมาก มันน่าสนใจมากขึ้นที่จะระบุหน้าต่าง / แยกอย่างใด ชอบace-window
แต่มีน้อยกว่าการกดปุ่มและอัลกอริทึมที่เห็นได้ชัดที่จะคิดทันทีที่ออกหมายเลขที่คุณต้องการ
คุณสามารถผูกother-window
กับลำดับของคีย์ที่ง่ายกว่า
ตัวอย่างเช่นฉันได้C-.
ผูกไว้other-window
และC-,
ผูกไว้เพื่อไปที่หน้าต่างก่อนหน้า
(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)
(defun prev-window ()
(interactive)
(other-window -1))
สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับการย้ายหลายหน้าต่าง เมื่อคุณกด Control ค้างไว้คุณเพียงกดปุ่มเดียวเพื่อย้ายไปยังหน้าต่างถัดไป ง่ายกว่ากดปุ่มสามครั้งต่อการเคลื่อนไหว
C-x o
สำหรับother-window
เป็นหนึ่งในคู่แข่งที่แข็งแกร่งสำหรับชื่อเรื่อง "ทางลัด emacs เริ่มต้นที่เลวร้ายที่สุด" วิธีแก้ปัญหาของฉัน (คล้ายกับ zck) คือการother window
เรียงลำดับคีย์ใหม่ (ทาง) ได้ง่ายขึ้นฉันได้ผูกไว้กับC-;
(และCaps-Lock
สลับกับCtrl
ดังนั้นสิ่งที่ต้องทำคือการแตะนิ้วก้อยอย่างรวดเร็ว) Btw ฉันทั้งหมดขึ้นอยู่กับคุณสมบัติบางอย่างของhelm
และicicles
(เช่นฉันไม่ได้ "ต่อต้านแพคเกจ" หรืออะไร); ฉันแค่คิดว่าวิธีแก้ปัญหาอย่างง่ายดีที่สุดที่นี่
M-o
other-window
บางโหมดมีอยู่แล้วM-o
มีผลผูกพันสะดุดตาdiff-mode
, และggtag-mode
ibuffer-mode
คุณต้องผูกมันเองในแต่ละโหมดแผนที่ unbind-key
จัดหาโดยbind-key.el
มีประโยชน์มาก
M-o
เช่นกันและM-O
ผูกพันกับace-window
เมื่อฉันต้องการพลังเพิ่มเติม
window-numbering.el!
ฉันกำหนดปุ่มลัด ", 1", ", 2", ", 3" เพื่อสลับหน้าต่างเฉพาะ (โปรดทราบว่าฉันใช้โหมดชั่วร้าย)
นอกจากนี้ฉันแสดงหมายเลขหน้าต่างที่บรรทัดโหมดในสีสีชมพูขีดเส้นใต้
มันเป็นคำใบ้ที่คุณไม่สามารถเพิกเฉยได้
นั่นเป็นวิธีที่เร็วที่สุดในการสลับหน้าต่าง
ตรวจสอบhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.elและhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .elสำหรับการตั้งค่าของฉัน
Sylvain Benner นำมาใช้ความคิดของฉันใน spacemacs แต่keybindings จะแตกต่างกัน ดังนั้นหากคุณใช้ Spacemacs คุณจะได้ทางออกที่รวดเร็วที่สุดจากกล่อง
window-number
พร้อมM-<num>
เพื่อสลับหน้าต่าง b / w อย่างรวดเร็ว แนวคิดที่คล้ายกันกับอันนี้
โดยไม่ต้องใช้โปรแกรมเสริมเพิ่มเติมใด ๆ คุณสามารถใช้งานC-x o
กับส่วนเสริมที่เป็นตัวเลือกเพื่อข้ามผ่านหน้าต่างจำนวนมากนั้น เช่น: C-u 1 C-x o
จะไปที่หน้าต่างถัดไปตามลำดับ (เช่นสิ่งที่คุณจะได้รับด้วยธรรมดาC-x o
), C-u 2 C-x o
ไปที่หน้าต่างสองบาน, C-u 3 C-x o
หน้าต่างสามบานและอื่น ๆ
ข้อความที่ตัดตอนมาจากother-window
docstring (ฟังก์ชั่นที่เรียกโดยC-x o
:
COUNT ระบุจำนวนหน้าต่างที่จะข้ามโดยเริ่มจากหน้าต่างที่เลือกก่อนทำการเลือก ถ้า COUNT เป็นค่าบวกให้ข้าม COUNT windows ไปข้างหน้า หาก COUNT เป็นค่าลบให้ข้าม -COUNT windows ย้อนหลัง COUNT ศูนย์หมายความว่าอย่าข้ามหน้าต่างใด ๆ ดังนั้นเลือกหน้าต่างที่เลือก ในการโทรแบบโต้ตอบ COUNT เป็นอาร์กิวเมนต์หมายเลขนำหน้า กลับศูนย์
บางคนอาจจำบทสรุปโดยย่อ (ผลิตโดย บริษัท ชื่อ Underware)
มันมีวิธีที่ประณีตในการสลับระหว่างหน้าต่างที่มองเห็นได้ M-arrow จะย้ายเคอร์เซอร์ไปที่หน้าต่างโดยตรงตามทิศทางของปุ่มลูกศร
ดังนั้นฉันแมปwinmove-left
, winmove-right
, winmove-up
และwinmove-down
ฟังก์ชั่นM-left
, M-right
, M-up
และM-down
ปุ่มดังต่อไปนี้ในแฟ้ม .emacs ของฉัน -
(global-set-key [M-left] 'windmove-left) ; move to left window
(global-set-key [M-right] 'windmove-right) ; move to right window
(global-set-key [M-up] 'windmove-up) ; move to upper window
(global-set-key [M-down] 'windmove-down) ; move to lower window
ตอนนี้ฉันสามารถเคลื่อนย้ายได้อย่างง่ายดายระหว่าง windows โดยไม่คำนึงถึงความยุ่งเหยิงที่ฉันมีการกำหนดค่า ... และมันจะค่อนข้างยุ่งเหยิงกับขนาดของจอแสดงผลในปัจจุบัน ...
(windmove-default-keybindings 'meta)
!
ถ้าคุณใช้Iciclesแล้วC-x o
ช่วยให้คุณเลือกหน้าต่างโดยชื่อ (หรือโดยการขี่จักรยาน)
ไม่มีหาเรื่องคำนำหน้าC-x o
เป็นเช่นเดียวกับปกติเว้นแต่เฟรมมีเพียงหนึ่งหน้าต่างซึ่งในกรณีนี้ก็คือother-window
other-frame
ด้วยคำนำหน้า arg C-x o
เป็นคำสั่งหลายคำสั่งที่ให้คุณนำทางระหว่างหน้าต่างหรือเฟรมตามชื่อ (หรือโดยการหมุนเวียน) การนำหมู่ windows จะใช้หลายคำสั่ง icicle-select-window
; icicle-select-frame
การนำในหมู่การใช้เฟรม
การนำทางใดที่ใช้ขึ้นอยู่กับส่วนนำหน้า arg:
ARG นำหน้าZero (เช่นC-0
): หากเฟรมที่เลือกมีหลายวินโดว์นี่คือ
icicle-select-window
โดยมี windows ในเฟรมเดียวกันกับตัวเลือก มิฉะนั้น (กรอบหน้าต่างเดียว) icicle-select-frame
นี้เป็น
C-u
: ถ้าเฟรมที่เลือกมีหลาย ๆ หน้าต่างนี่คือ
icicle-select-window
ด้วยหน้าต่างจากเฟรมที่มองเห็นได้ทั้งหมดในฐานะผู้สมัคร icicle-select-frame
มิฉะนั้นนี้เป็น
C-u C-u
: icicle-select-window
มีหน้าต่างจากเฟรมทั้งหมดเป็นตัวเลือก (รวมถึงเฟรมที่เป็นไอคอนหรือซ่อน)
เช่นเดียวกับในIciclesคุณสามารถรวม (a) เสร็จสิ้นแล้วพิมพ์ข้อความเพื่อ จำกัด ชุดของผู้สมัครที่ตรงกัน (ชื่อหน้าต่างหรือกรอบในกรณีนี้) ด้วย (b) การขี่จักรยาน (ในบรรดาผู้สมัครที่ตรงกัน)
พิจารณาการใช้คีย์คอร์ดเพื่อกระโดดข้ามหน้าต่างอย่างรวดเร็ว ฉันพบว่าเร็วกว่าการเข้าถึงคีย์ตัวปรับแต่ง (และทำให้มือของฉันเครียดน้อยลงเช่นกัน)
ตัวเลือกของฉันของแพคเกจที่จะใช้เป็นซึ่งจะช่วยให้คุณสามารถนำทางหลายหน้าต่างง่ายกว่าเพียงace-window
other-window
(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)
เห็นได้ชัดว่าการใช้สิ่งนี้ที่คุณต้องการkey-chord
และace-window
ทั้งสองมีอยู่ใน Melpa
ace-window
กำลังทำงานตามคำตอบของ @ abo-abo มันทำให้ฉันรู้สึกว่าในบริบทนี้การเชื่อมโยงคีย์เฉพาะเพื่อใช้จะเหมาะสมกว่าการแสดงความคิดเห็นมากกว่าคำตอบ แค่สองเซ็นต์ของฉัน
key-chord
ไลบรารี่แบบใดก็ตามอนุญาตให้เชื่อมโยงคีย์ต่างๆเข้าด้วยกันอย่างมาก ตัวอย่างการเชื่อมโยง xo
นั้นเร็วกว่าC-x o
(ความลึกของหนึ่งต่อสอง) คำตอบนี้อาจจะ reworded จะเน้นว่าคำตอบคือฉากกับคำตอบอื่น ๆ เกี่ยวกับการเลือกฟังก์ชั่น (และace-window
เป็นเพียงหนึ่งในหลายทางเลือกที่อาจจะผูกพันในแฟชั่นอธิบาย) เก็บคำตอบนี้ไว้ชัดเจน!
บางคำตอบที่ดีที่นี่ฉันยังเป็นแฟนของ WinMove แต่ฉันผูกไว้กับ C- เพราะโหมดองค์กรใช้ M- สำหรับจัดการหัวเรื่อง
(define-key global-map (kbd "C-<up>") 'windmove-up)
(define-key global-map (kbd "C-<down>") 'windmove-down)
(define-key global-map (kbd "C-<left>") 'windmove-left)
(define-key global-map (kbd "C-<right>") 'windmove-right)
ไหนจะได้รับสิ่งที่ดีจริงๆคือถ้าคุณรวมกับไฮดรา ต่อไปนี้เป็นตัวอย่างในวิกิของพวกเขาฉันสร้างมอนสเตอร์ของตัวเอง:
(defhydra hydra-windows ()
"C-arrow = switch, S-arrow = size, M-arrow = move"
("C-<left>" windmove-left nil)
("C-<right>" windmove-right nil)
("C-<up>" windmove-up nil)
("C-<down>" windmove-down nil)
("S-<left>" hydra-move-splitter-left nil)
("S-<right>" hydra-move-splitter-right nil)
("S-<up>" hydra-move-splitter-up nil)
("S-<down>" hydra-move-splitter-down nil)
("M-<left>" buf-move-left nil)
("M-<right>" buf-move-right nil)
("M-<up>" buf-move-up nil)
("M-<down>" buf-move-down nil)
("p" previous-buffer "prev-buf")
("n" next-buffer "next-buf")
("1" delete-other-windows "1")
("d" delete-window "del")
("k" kill-buffer "kill")
("s" save-buffer "save")
("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
("r" winner-redo "redo")
("b" helm-mini "helm-mini" :exit t)
("f" helm-find-files "helm-find" :exit t)
("|" (lambda () (interactive) (split-window-right) (windmove-right)))
("_" (lambda () (interactive) (split-window-below) (windmove-down)))
("q" nil "cancel")
)
(global-set-key (kbd "M-#") 'hydra-windows/body)
สิ่งนี้ช่วยให้ฉันเปลี่ยนหน้าต่างปรับขนาดย้ายบัฟเฟอร์จากหน้าต่างหนึ่งไปอีกหน้าต่างวงจรบัฟเฟอร์ฆ่าบัฟเฟอร์และแม้กระทั่งยกเลิกการกำหนดค่าหน้าต่างผ่านโหมดผู้ชนะและมันยังรวมระบบหางเสือ ในการออกจากไฮดราเพียงกดลูกศรหรือปุ่มอื่นที่ไม่อยู่ในไฮดรา คุณสามารถค้นหาฟังก์ชั่น "hydra-move" บนตัวอย่างไฮดราสิ่งที่ดีเกี่ยวกับไฮดราคือฉันไม่จำเป็นต้องจำ keybindings เหล่านั้นทั้งหมดและ "โหมด" ดังนั้นเมื่อคุณอยู่ในไฮดราทุกอย่างก็เป็นปุ่มเดียว กด.
(windmove-default-keybindings 'control)
ที่คุณพูดถึงที่จุดเริ่มต้นคือ
หากคุณใช้evil-mode
คุณสามารถใช้คำนำหน้าตัวเลขด้วยC-w C-w
( evil-window-next
) เพื่อเลือกหน้าต่างที่คุณต้องการ ดังนั้น: 1 C-w C-w
เลือกหน้าต่างแรกตามลำดับวงรอบ3 C-w C-w
เลือกหน้าต่างที่สามตามลำดับรอบและตามลำดับ
Ace Jumpช่วยให้คุณนำทางตัวชี้ของคุณไปยังทุกคำบนหน้าจอโดยไม่คำนึงถึงหน้าต่างหรือกรอบใดที่อยู่ภายในดังนั้นจึงไม่แตกต่างจากการใช้ Ace Window หรือ Switch Window
ข้อดีอาจเป็นได้ในขณะที่กระโดดหน้าต่างคุณสามารถวางตัวชี้ของคุณด้วยความแม่นยำ
ฉันยังพบว่ามันยุ่งยากหรือเบี่ยงเบนความสนใจเล็กน้อยและพบว่าฉันใช้windmove
มากขึ้นเพราะมันง่ายมาก แต่ก็ยังใช้ Ace Jump เมื่อฉันอ่านในหน้าต่างหรือเฟรมอื่นและต้องการย้ายไปที่จุดนั้น
ตามปกติมีวิธีแตกต่างกันหลายร้อยวิธีในการทำสิ่งนี้ให้สำเร็จ วิธีที่ต้องการของฉันคือการใช้NumberedWindows ฉันตั้งค่าปุ่มลัดต่อไปนี้โดยใช้ Super และปุ่ม 1-9
(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))
ฉันไปเป็นรายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับเรื่องนี้แน่นอนพร้อมกับโพสต์ล่าสุดของฉันซึ่งคุณสามารถอ่านในตอนบ่าย Coder
คุณยังสามารถตัดสินใจที่จะใช้สวิทช์หน้าต่างแทนการมองเห็นC-x o
switch-window
มากกว่าคนอื่น ๆ ?