Làm thế nào để xoay vòng giữa hai cửa sổ khi tôi có nhiều hơn hai mở?


8

Kịch bản: Tôi có một vài (hơn 2) cửa sổ mở. Tôi tích cực làm việc với hai người trong số họ. Làm thế nào để tôi nhảy tốt nhất từ ​​cửa sổ này sang cửa sổ khác và quay lại, bằng một lệnh?

Tôi sử dụng cửa sổ ace; thật tuyệt nhưng tôi không muốn nhấn số cửa sổ mỗi lần. Tôi biết về next-window/ prev-window, nhưng đây là hai lệnh khác nhau.

Những gì tôi đang tìm kiếm là một cái gì đó nhớ những cửa sổ trước đó là gì khi tôi chọn một cửa sổ khác và quay lại với nó. Được gọi nhiều lần, nó sẽ chuyển đổi giữa hai cửa sổ cuối cùng, Alt- Tab-style.

Tôi tìm ở đâu?


Tôi sử dụng fncộng với một trong các phím mũi tên để đi theo bất kỳ hướng nào, kể cả vào và ra khỏi bộ thu nhỏ (nếu nó đang hoạt động) - xem thư viện tích hợp windmove.
luật

@lawlist: Mình biết về cối xay gió. Những gì tôi đang tìm kiếm là một cách không nghĩ về hướng cần thiết, đặc biệt là nếu các cửa sổ có một vài cửa sổ khác giữa chúng.
9000

Câu trả lời:


6

Một cách để viết lệnh của riêng bạn là sử dụng hàm dựng sẵn get-mru-window.

Ví dụ:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window nil nil t)))
    (when win (select-window win))))

Cái này tìm cửa sổ được sử dụng gần đây nhất trong khung hiện tại không phải là cửa sổ hiện được chọn.

Đây là một biến thể hoạt động trên các khung có thể nhìn thấy:

(defun my-flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible nil t)))
    (when win
      (select-frame-set-input-focus (window-frame win))
      (select-window win))))

Như đã đề cập trong các nhận xét, đây là một biến thể hoạt động khi chỉ có một cửa sổ (chuyển sang bộ đệm gần đây nhất):

(defun flip-window ()
  (interactive)
  (let ((win  (get-mru-window 'visible t t)))
    (if win
        (progn
          (select-frame-set-input-focus (window-frame win))
          (select-window win))
      (mode-line-other-buffer))))

1
Đóng đinh nó! Cái này tốt hơn cái tôi ghép lại. Đẹp tìm trên get-mru-window.
Dân

1
Tôi đã kết thúc việc thêm nó vào cấu hình của mình với một biến thể bổ sung: khi chỉ có một khung / cửa sổ (get-mru-window trả về nil), sau đó gọi mode-line-other-buffer. Bằng cách đó, tôi có một phím lật qua lại giữa hai bộ đệm trong bất kỳ cấu hình cửa sổ nào.
glucas

Tuyệt quá. Tôi thích sự thay đổi cuối cùng đó @glucas. Cảm ơn bạn. Đây là cách tôi viết nó và nó hoạt động. Đó có phải là cách tốt nhất để làm điều đó? (defun my-switch-to-before-window () (tương tác) (let ((win (get-mru-window nil nil t))) (if win (select-window win) (mode-line-other-buffer ))))
prosoitos

6

Nếu bạn đã sử dụng ace-window, thì bạn có thể sử dụng lệnh aw-flip-windowđể lật qua lại giữa hai cửa sổ. Theo mặc định, điều này được ràng buộc ntrong cửa sổ ace aw-dispatch-alist.

Điều đó có nghĩa là bạn có thể gọi ace-window và nhấn nthay vì số cửa sổ để lật lại cửa sổ trước. Bạn cũng có thể liên kết aw-flip-windowvới một số khóa khác.

Lưu ý rằng điều này sẽ chỉ lật trở lại một cửa sổ đã được chọn trước đó bởi cửa sổ ace. Nếu bạn thường chuyển đổi các cửa sổ với các lệnh khác, bạn có thể muốn một giải pháp tổng quát hơn.


4

Đây là một lệnh đơn giản, được thử nghiệm nhẹ, sẽ chuyển bạn đến cửa sổ được truy cập gần đây nhất:

(defvar recent-window nil
  "The most recently visited window.")

(defun switch-to-recent-window ()
  "Switch to the most recently visited window, as stored in
`recent-window'."
  (interactive)
  (let ((current (car (window-list))))
    (if recent-window
        (select-window recent-window)
      (message (concat "No recent window selected, "
                       "so I'm setting this window "
                       "as the most recent.")))
    (setq recent-window current)))

Cảm ơn bạn! Nó hoạt động. Bạn có phiền nếu tôi thực hiện một gói từ nó, với sự ghi nhận?
9000

Không có gì. Chắc chắn, hãy thoải mái sử dụng nó trong một gói, nhưng lưu ý rằng mã trong (chưa) rất thông minh. Nếu bạn chuyển sang cửa sổ khác với các lệnh như next-windowhoặc other-window, sự thay đổi sẽ không được nhặt trong recent-windowbiến. Không có móc nối rõ ràng để sử dụng, vì vậy việc sửa phần này có thể liên quan đến việc xác định lời khuyên cho toàn bộ các chức năng khác.
Dân

1
Tôi nghĩ bạn có thể sử dụng buffer-list-update-hook, được gọi khi cửa sổ hoạt động thay đổi (sau select-window). Móc đó được gọi trong các trường hợp khác nhưng có thể được sử dụng để theo dõi cửa sổ cuối cùng.
glucas
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.