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?
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:
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)
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 .
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.
switch-windowcho đến khi tôi nộp ace-windowcho MELPA.
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ể.
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 .
(windmove-default-keybindings 'meta)như được đề xuất trên EmacsWiki.
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.
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-windowvà C-,đ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.
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 helmvà icicles(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.
M-ocho other-window. Một số chế độ đã có M-oràng buộc, đáng chú ý diff-mode, ggtag-modevà ibuffer-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.
M-ovà đã M-Oràng buộc ace-windowkhi tôi cần thêm năng lượng.
đá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.el và https://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.
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
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.
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-upvà winmove-downchức năng M-left, M-right, M-upvà M-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 ...
(windmove-default-keybindings 'meta)!
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).
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-chordvà ace-window, cả hai đều có sẵn trong melpa.
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.
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!
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.
(windmove-default-keybindings 'control).
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.
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í ở đó.
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 .
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
switch-windowhơn tất cả những người khác?