Làm thế nào để chuyển đổi giữa các cửa sổ một cách nhanh chóng?


90

Làm thế nào để tôi chuyển đổi giữa các cửa sổ một cách nhanh chóng?

Tôi thường có nhiều cửa sổ mở và cần phải chuyển đổi giữa chúng. Ngay bây giờ, tôi sử dụng C-x ođể đi đến cái tôi muốn. Có một quy trình làm việc hiệu quả hơn có sẵn cho việc này?


Câu trả lời:


62

Tôi rõ ràng thích cửa sổ ace cho việc này. Bạn có thể chuyển đổi giữa các cửa sổ và khung có thể nhìn thấy. Đó là trong MELPA, bạn có thể cài đặt nó một cách nhanh chóng. Điều duy nhất còn lại phải làm là ràng buộc nó:

(global-set-key (kbd "C-x o") 'ace-window)

Hoặc có thể sử dụng hợp âm phím ngắn hơn, vì chuyển đổi cửa sổ là một nhiệm vụ phổ biến:

(global-set-key (kbd "M-p") 'ace-window)

Tóm tắt ace-window

Đó là một sự thay thế thả trong cho other-window. Không giống như lần sau, bạn không bao giờ phải gọi ace-windowhai hoặc nhiều lần để chọn một cửa sổ: bạn chọn một cửa sổ bạn muốn trong một cuộc gọi (có thể trên nhiều khung hình).

Bên cạnh việc chuyển đổi các cửa sổ, ace-windowcó thể làm nhiều hơn (xóa hoặc trao đổi các cửa sổ, v.v.), xem README .


2
Hay đấy. Tôi đã sử dụng ace-windowvà sau đó thấy switch-windowrằng dường như làm điều tương tự, ngoại trừ các chữ cái rõ ràng hơn. Có vẻ buồn cười chúng tôi có cả hai gói.
milkypostman

Bạn đúng. Chỉ có sự khác biệt nhỏ giữa chúng. Đây là một vấn đề mà chúng ta phải đối mặt khi chúng ta có một kho lưu trữ với 2000 gói. Tôi đã không nhận thức được switch-windowcho đến khi tôi nộp ace-windowcho MELPA.
abo-abo

1
cảm ơn vì ace-windownó có nhiều tùy chỉnh hơn các gói khác tôi đoán. Tuy nhiên, một điều có thể giúp ích trong tương lai là một ràng buộc chính cho một chức năng tương tự như hành động hoán đổi thông minh nhưng ăn hết cửa sổ đó dẫn đến việc có một cửa sổ lớn hơn tại điểm và cửa sổ được chọn kích thước nhỏ hơn (đã ăn lên cửa sổ). Tỷ lệ nên được xác định trong trường hợp này là một nửa, một phần tư hoặc một phần ba có thể.
tiến sĩ

4
Vui lòng xem xét thêm một mô tả. Bạn chỉ cần nói rằng bạn thích nó, và bạn liên kết với nó. Điều đó làm cho điều này về cơ bản là một câu trả lời chỉ liên kết.
vẽ

4
Lợi ích của cửa sổ ace là gì? Tại sao tôi nên sử dụng nó trong 14 giải pháp khác được đề xuất trên trang này?
Gilles

103

Một cách là sử dụng windmove. Với các phím bấm mặc định, nó cho phép chuyển sang cửa sổ bên cạnh cửa sổ hiện đang hoạt động.

Nó được xây dựng trong Emacs, vì vậy không cần phải cài đặt bất cứ thứ gì; chỉ cần kích hoạt nó với thiết lập tối thiểu sau trong tệp init của bạn:

(windmove-default-keybindings)

Sau đó bạn có thể chuyển sang cửa sổ láng giềng sử dụng các phím sau (nơi mũi tên sử dụng trực giác xác định hướng mà bạn di chuyển): S-<left>, S-<right>, S-<up>, S-<down>.


Nếu bạn muốn sử dụng một công cụ sửa đổi khác thay vì shift, bạn có thể cung cấp nó làm đối số windmove-default-keybindings. Ví dụ:

(windmove-default-keybindings 'meta)

hoặc là

(windmove-default-keybindings 'control)

Thêm thông tin tại Emacs Wiki .


16
Đây phải là câu trả lời được chấp nhận!
chèo thuyền

OMG, tại sao không có hướng dẫn nào đề cập đến phím shift + phím mũi tên để di chuyển xung quanh cửa sổ! Nó tốt hơn rất nhiều sau đó ctrl + o
Didier A.

Tôi muốn nói một số câu trả lời khác ở đây có cấu hình cối xay gió dư thừa. Có lẽ nên cập nhật câu trả lời để đề cập rằng hàm chấp nhận khóa bổ trợ làm đối số, ví dụ (windmove-default-keybindings 'meta)như được đề xuất trên EmacsWiki.
metaturso

Điều này tạo ra nhiều xung đột với các liên kết phím khác (hoặc với các trình quản lý cửa sổ). Tôi thích cửa sổ ace.
azzamsa

Tôi đang sử dụng một cái gì đó tương tự (tôi đang di chuyển xung quanh Shift-arrow) , nhưng khi bạn có một màn hình lớn với nhiều phần tách ra, một chuyển động như vậy nhanh chóng trở nên khó sử dụng. Sẽ thú vị hơn khi bằng cách nào đó liệt kê các cửa sổ / chia nhỏ. Giống như ace-window, nhưng với ít lần nhấn phím hơn và một thuật toán rõ ràng để tìm ra ngay số bạn muốn.
Hi-Angel

21

Bạn có thể liên kết other-windowvới một chuỗi khóa dễ gõ hơn.

Ví dụ, tôi đã C-.ràng buộc other-windowC-,đi đến cửa sổ trước.

(global-set-key (kbd "C-.") #'other-window)
(global-set-key (kbd "C-,") #'prev-window)

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

Điều này đặc biệt hữu ích cho việc di chuyển nhiều cửa sổ; một khi bạn nhấn Control, bạn chỉ cần nhấn một nút duy nhất để chuyển sang cửa sổ tiếp theo. Điều này dễ dàng hơn nhiều so với ba lần nhấn mỗi lần di chuyển.


2
+1 C-x ocho other-windowlà một trong một vài ứng cử viên vững chắc cho danh hiệu "phím tắt emacs mặc định tồi tệ nhất". Giải pháp của tôi (tương tự như zck) là sắp xếp lại other windowmột chuỗi khóa dễ dàng hơn (cách) - tôi đã bị ràng buộc C-;(và tôi Caps-Lockbị tráo đổi Ctrlvì vậy tất cả chỉ là một cú chạm nhanh vào những con hồng). Btw, tôi hoàn toàn phụ thuộc vào một số tính năng nhất định helmicicles(nghĩa là tôi không "chống gói" hay bất cứ thứ gì); Tôi chỉ nghĩ rằng một giải pháp đơn giản hoạt động tốt nhất ở đây.
iceman

2
+1 Đây phải là câu trả lời được chấp nhận VÀ cũng là câu trả lời đơn giản nhất (than ôi, chưa có điều nào như vậy tồn tại trên StEx). Làm việc ra khỏi hộp, quy mô hoàn hảo, đơn giản để ghi nhớ. Cái sau tôi thấy đặc biệt quan trọng trong rừng Emacs. Sau khi sống sót ở đó hơn 20 năm, đôi khi tôi thấy mình khao khát ẩn mình trên sa mạc vi ...
Andreas Spindler

Đơn giản, dễ sử dụng, dễ thực hiện. Điều này cần nhiều phiếu hơn.
stewSquared

1
Đây cũng là những gì tôi làm. Tôi sử dụng M-ocho other-window. Một số chế độ đã có M-oràng buộc, đáng chú ý diff-mode, ggtag-modeibuffer-mode. Bạn phải tự hủy liên kết nó trong mỗi bản đồ chế độ. unbind-keycung cấp bởi bind-key.elrất hữu ích.
Yasushi Shoji

Tôi cũng sử dụng M-ovà đã M-Oràng buộc ace-windowkhi tôi cần thêm năng lượng.
glucas

13

đánh số cửa sổ.el!

Tôi gán phím nóng ", 1", ", 2", ", 3" để chuyển cửa sổ cụ thể (xin lưu ý tôi sử dụng chế độ ác)

Ngoài ra, tôi hiển thị số cửa sổ ở dòng chế độ màu PINK, được gạch chân.

Đó là một gợi ý trực quan mà bạn không bao giờ có thể bỏ qua,

Đó là cách nhanh nhất để chuyển đổi cửa sổ.

kiểm tra https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.elhttps://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el cho thiết lập của tôi.

Sylvain Benner đã áp dụng ý tưởng của tôi trong spacemacs nhưng keybindings thì khác . Vì vậy, nếu bạn sử dụng spacemacs, bạn sẽ có được giải pháp nhanh nhất.


2
Vâng Khái niệm này là tuyệt vời. Tôi sử dụng gói window-numbervới M-<num>để nhanh chóng chuyển đổi b / w windows. Khái niệm tương tự với cái này
unperson325680

1
Lưu ý rằng window-numbering.el không được dùng để ủng hộ winum , ở đây . FWIW, cửa sổ số cho tôi thậm chí không hoạt động.
Hi-Angel

Tôi có thể chuyển sang winum sớm. Nhưng đánh số cửa sổ vẫn hoạt động tốt trên emacs24 / 25/26.
chen bin

10

Không sử dụng bất kỳ tiện ích bổ sung nào, bạn có thể tiếp tục sử dụng C-x ovới tiền tố tùy chọn để bỏ qua nhiều cửa sổ đó. Ví dụ: C-u 1 C-x osẽ đi đến cửa sổ tiếp theo theo thứ tự (nghĩa là những gì bạn sẽ nhận được với đơn giản C-x o), C-u 2 C-x ođi qua hai cửa sổ, C-u 3 C-x ođi qua ba cửa sổ, v.v.

Một đoạn trích từ chuỗi other-windowdoc (hàm được gọi bởi C-x o:

COUNT chỉ định số lượng cửa sổ cần bỏ qua, bắt đầu với cửa sổ đã chọn, trước khi thực hiện lựa chọn. Nếu COUNT dương, bỏ qua các cửa sổ COUNT về phía trước. Nếu COUNT âm, bỏ qua các cửa sổ -COUNT ngược lại. COUNT zero có nghĩa là không bỏ qua bất kỳ cửa sổ nào, vì vậy hãy chọn cửa sổ đã chọn. Trong một cuộc gọi tương tác, COUNT là đối số tiền tố số. Trả lại con số không.


Khi bạn có nhiều cửa sổ họ theo thứ tự nào?
stsquad

Thứ tự là thứ tự cửa sổ tuần hoàn .
Dân

2
hmm "Thứ tự được xác định theo chiều ngang đầu tiên của cây cửa sổ khung, lấy ra các cửa sổ trực tiếp là các nút lá của cây" không phải là mô tả hữu ích nhất cho bộ não con người đang cố đoán xem cửa sổ nào tiếp theo hoặc Có bao nhiêu để bỏ qua. Tôi đoán đây là lý do tại sao tôi sử dụng cửa sổ ace.
stsquad

2
@stsquad: oh, tôi đồng ý với bạn - nó cũng khiến đầu óc tôi quay cuồng. Tôi đặt câu trả lời này lên đây để hoàn thiện.
Dan

8

Một số người có thể nhớ trình soạn thảo Brief (đủ vui được sản xuất bởi một công ty có tên Underware).

Nó có một cách gọn gàng để chuyển đổi giữa các cửa sổ có thể nhìn thấy. Mũi tên M sẽ di chuyển con trỏ vào cửa sổ trực tiếp theo hướng của phím mũi tên.

Vì vậy, tôi đã lập bản đồ winmove-left, winmove-right, winmove-upwinmove-downchức năng M-left, M-right, M-upM-downcác phím như sau trong tập tin emacs của tôi -

(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

Bây giờ tôi có thể di chuyển dễ dàng giữa các cửa sổ, bất kể tôi có cấu hình lộn xộn như thế nào ... Và nó có thể trở nên khá lộn xộn với kích thước màn hình hiện nay ...


Đây không phải là ít nhiều câu trả lời của @ Francesco sao?
Dan

Tôi đồng ý. Tôi đã không thông báo trước khi tôi đăng bài của tôi.
dùng2542

2
Một cách ngắn hơn nhiều để có được những keybindings là (windmove-default-keybindings 'meta)!
Omar

8

Nếu bạn sử dụng Icicles thì C-x ocho phép bạn chọn các cửa sổ theo tên (hoặc bằng cách đi xe đạp).

  • Không có tiền tố arg, C-x ogiống như thông thường other-window, trừ khi khung chỉ có một cửa sổ, trong trường hợp đó là other-frame.

  • Với tiền tố arg, C-x olà một lệnh đa cho phép bạn điều hướng giữa các cửa sổ hoặc khung theo tên (hoặc bằng cách đi xe đạp). Điều hướng giữa các cửa sổ sử dụng đa lệnh icicle-select-window; điều hướng giữa các khung sử dụng icicle-select-frame.

Điều hướng nào được sử dụng phụ thuộc vào tiền tố arg:

  • Không có tiền tố arg (ví dụ C-0): Nếu khung được chọn có nhiều cửa sổ, thì đây là icicle-select-window, với các cửa sổ trong cùng khung với các ứng cử viên. Mặt khác (khung cửa sổ đơn), đây là icicle-select-frame.

  • C-u: Nếu khung đã chọn có nhiều cửa sổ, thì đây là icicle-select-window, với các cửa sổ từ tất cả các khung hiển thị là ứng cử viên. Nếu không, đây là icicle-select-frame.

  • C-u C-u: icicle-select-window, với các cửa sổ từ tất cả các khung là ứng cử viên (bao gồm các khung được biểu tượng hóa hoặc ẩn).

Như mọi khi trong Icicles , bạn có thể kết hợp (a) hoàn thành , nhập văn bản để thu hẹp tập hợp các ứng cử viên phù hợp (tên cửa sổ hoặc khung, trong trường hợp này), với (b) đạp xe (trong số các ứng cử viên phù hợp).


4

Cân nhắc sử dụng hợp âm phím để nhảy nhanh giữa các cửa sổ. Tôi thấy nó nhanh hơn nhiều so với việc lấy một phím bổ trợ (và cũng ít căng hơn trên tay tôi).

Sự lựa chọn gói của tôi để sử dụng là ace-window, cho phép bạn điều hướng nhiều cửa sổ dễ dàng hơn chỉ other-window.

(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)

Rõ ràng để sử dụng cái này bạn cần key-chordace-window, cả hai đều có sẵn trong melpa.


2
Đây không phải là câu trả lời của @ abo-abo sao?
Dan

1
@Dan anh ấy không sử dụng hợp âm phím, lưu ý việc thiếu meta hoặc siêu phím trong hợp âm. Khi bạn sử dụng cửa sổ ace / một cái gì đó khác thì không liên quan, vấn đề là đưa ra câu trả lời không sử dụng các phím bổ trợ cho hoạt động thường được sử dụng.
Zavior

1
Tôi đã thấy điều đó, nhưng tôi đã nêu câu hỏi vì ace-windowđang thực hiện công việc như trong câu trả lời của @ abo-abo. Tôi nhận ra rằng, trong bối cảnh này, việc bấm phím cụ thể để sử dụng sẽ có ý nghĩa hơn như một nhận xét hơn là một câu trả lời. Chỉ hai xu của tôi.
Dan

@Dan, tổng thể câu hỏi là về việc nhanh chóng chuyển đổi các cửa sổ, và tôi không nghĩ rằng giải pháp này đã được đưa ra. Làm rõ câu trả lời một chút liên quan đến điều đó.
Zavior

@Zavior nêu lên một điểm quan trọng. Câu hỏi là về việc chuyển đổi các cửa sổ một cách nhanh chóng - trong đó hình thức ràng buộc là rất quan trọng. Bất kể thư viện nào bạn thích key-chordcho phép ràng buộc các tổ hợp phím rất dễ tiếp cận. Ví dụ ràng buộc xolà nhanh hơn C-x o(độ sâu của một so với hai). Câu trả lời này có thể được điều chỉnh lại để nhấn mạnh rằng câu trả lời là trực giao với các câu trả lời khác về lựa chọn chức năng (và ace-windowchỉ là một trong nhiều lựa chọn có thể bị ràng buộc theo kiểu được mô tả). Giữ câu trả lời này là khác biệt!
ebpa

3

Một số câu trả lời hay ở đây, tôi cũng là một fan hâm mộ của WinMove, nhưng tôi liên kết nó với C- vì chế độ org sử dụng M- để thao tác các tiêu đề

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

Nơi nó trở nên thực sự tốt là nếu bạn kết hợp nó với Hydra . Theo các ví dụ trên wiki của họ, tôi đã tạo ra quái vật của riêng mình:

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

Điều này cho phép tôi thay đổi cửa sổ, thay đổi kích thước chúng, di chuyển bộ đệm từ cửa sổ này sang cửa sổ khác, bộ đệm chu kỳ, tiêu diệt bộ đệm và thậm chí hoàn tác cấu hình cửa sổ thông qua chế độ người chiến thắng và nó cũng tích hợp helm. Để thoát hydra, chỉ cần nhấn mũi tên hoặc một số phím khác không có trong hydra. Bạn có thể tìm thấy các chức năng "hydra-move" trên các ví dụ hydra Điều tuyệt vời về hydra là tôi không cần phải nhớ tất cả các phím bấm và "sửa đổi" của nó, vì vậy một khi bạn ở trong hydra, mọi thứ đều có sẵn như một phím duy nhất nhấn.


1
Một cách ngắn hơn để có được các keybindings bạn đề cập lúc đầu là (windmove-default-keybindings 'control).
Omar

1

Nếu bạn sử dụng evil-mode, bạn chỉ có thể sử dụng tiền tố số với C-w C-w( evil-window-next) để chọn cửa sổ bạn muốn. Vì vậy: 1 C-w C-wchọn cửa sổ đầu tiên theo thứ tự tuần hoàn, 3 C-w C-wchọn cửa sổ thứ ba theo thứ tự tuần hoàn, v.v.


Điều này có vẻ như chỉ nên được kết hợp với câu trả lời khác của bạn : đó là điều tương tự, chỉ với những ràng buộc dành riêng cho tội ác.
npostavs

1

Ace Jump cho phép bạn điều hướng con trỏ tới tất cả các từ trên màn hình, bất kể cửa sổ hay khung hình nào đang ở trong đó, vì vậy nó không quá khác biệt so với sử dụng Ace Window hoặc Switch Window.

Một lợi thế có thể là trong khi nhảy các cửa sổ, bạn cũng có thể đặt con trỏ của mình với một số độ chính xác.

Tôi vẫn thấy nó hơi cồng kềnh hoặc mất tập trung và thấy tôi đang sử dụng windmovenhiều hơn, bởi vì nó rất đơn giản, nhưng vẫn sử dụng Ace Jump khi tôi đang đọc trong một cửa sổ hoặc khung hình khác và muốn di chuyển đến một vị trí ở đó.


1

Như thường lệ, có hàng trăm cách khác nhau để thực hiện điều này. Cách ưa thích của tôi là sử dụng NumberedWindows . Sau đó, tôi thiết lập các phím bấm sau bằng Super và các phím 1-9.

(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))

Tôi đi vào chi tiết hơn một chút về chủ đề chính xác này với một bài đăng gần đây của tôi mà bạn có thể đọc trên After Chiều Coder .


Điều này khác với câu trả lời của chen bin như thế nào?
Gilles

Có một ví dụ về cấu hình nó.
Travis

-1

Bạn cũng có thể quyết định sử dụng cửa sổ chuyển đổi để thay thế trực quan choC-x o


1
Lợi ích của cửa sổ chuyển đổi là gì? Tại sao tôi nên sử dụng nó trong 14 giải pháp khác được đề xuất trên trang này?
Gilles

Làm thế nào để nói bạn nên? Emacs là tất cả về các lựa chọn thay thế, tùy biến và tự do quyết định.
csantosb

2
Đó không phải ở đây cũng không có. Tại sao ai đó sẽ chọn sự thay thế đặc biệt này? Tại sao một người quyết định sử dụng switch-windowhơn tất cả những người khác?
Gilles
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.