Emacs, chuyển sang cửa sổ trước đó


93

Trong Emacs, C-x ođưa tôi đến cửa sổ tiếp theo.

Macro bàn phím nào đưa tôi đến cửa sổ trước đó trong Emacs?

Câu trả lời:


88

Đó sẽ là C-- C-x o

Nói cách khác, C-x ovới đối số là -1. Bạn có thể chỉ định số lượng cửa sổ để di chuyển bằng cách chèn một đối số số vào giữa C-uvà lệnh, như trong C-u 2 C-x o. ( C--là một phím tắt cho C-u - 1)


Và bạn có thể sử dụng C-x zđể lặp lại lệnh cuối cùng để chuyển đổi nhanh các cửa sổ.
Ivan Huang,

105

Bạn cũng có thể muốn thử sử dụng windmove cho phép bạn điều hướng đến cửa sổ bạn chọn dựa trên hình học. Tôi có phần sau trong tệp .emacs của mình để thay đổi cửa sổ bằng phím mũi tên 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
Lưu ý rằng việc gọi (windmove-default-keybindings)liên kết các hàm này với SHIFT + lên / xuống / trái / phải, điều này tôi nghĩ thuận tiện hơn các C-xràng buộc của bạn (xung đột với các ràng buộc mặc định cũng hữu ích cho previous-buffernext-buffer. Lkahtz: (kbd)hàm cho phép bạn chỉ định các khóa trong ký hiệu chuỗi theo cú pháp dễ đọc hơn, cũng được Emacs sử dụng khi bạn sử dụng C-h khoặc C-h cđể mô tả một ràng buộc.
phils

4
Tôi không chấp nhận sử dụng các phím mũi tên. Nhưng dù sao thì tôi cũng đã ủng hộ vì sự hữu ích. : tự mãn:
Bjorn

2
@phils SHIFT + <keys> can thiệp bằng lựa chọn dịch chuyển được bật theo mặc định từ Emacs 23 (chế độ lựa chọn dịch chuyển).
Legends2k

2
Legends2k: Đúng; mặc dù bạn cũng có thể chuyển một đối số để windmove-default-keybindingschỉ định một công cụ sửa đổi khác để sử dụng cùng với các phím mũi tên; để chức năng đó vẫn có thể hữu ích cho những người sử dụng chế độ chọn-thay-đổi.
phils

1
@phils Đồng ý, meta có vẻ là một lựa chọn thay thế tốt; như đã thấy trong Emacs Wiki .
Legends2k

30

Cá nhân tôi thích sử dụng window-number.el

Để chọn một cửa sổ khác, hãy sử dụng Ctrl- x, Ctrl- j n

Trong đó n là số của cửa sổ, mô hình của mỗi cửa sổ hiển thị số của nó, như được hiển thị trong ảnh chụp màn hình.

Chỉ cần tải xuống window-number.el , đặt nó vào đường dẫn tải emacs của bạn và sử dụng phần sau trong.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)

Có một chế độ tương tự khác được gọi là switch-window.elcung cấp cho bạn những con số lớn trong cửa sổ ... (nhấn vào số sẽ chuyển cửa sổ và hoàn nguyên màn hình.)


(nguồn: tapoueh.org )


2
Tốt, nhưng tôi khuyên bạn không nên ràng buộc một cái gì đó C-x C-j, vì đó là ràng buộc mặc định cho dired-jumpnếu bạn (require 'dired-x). (Xem M-x customize-group RET dired-keys RETnếu bạn muốn ghi đè lên đó.)
Phils

1
Sau khi đăng bài này, tôi quyết định từ bỏ switch-window.el, C-x othay vào đó nó sẽ sử dụng và khi chỉ có hai cửa sổ hoạt động, nó chỉ chọn cửa sổ khác. Tôi nghĩ khôn ngoan nhất là rebind C-x ođể thực hiện window-numberthủ thuật, bạn hoàn toàn đúng về điều đó dired-jump. Cá nhân tôi ít chuyển đổi cửa sổ hơn và sử dụng C-x bbản thân mình, nhưng có cải tiến C-x olà khá hài lòng.
ocodo

wow chủ đề Emacs tuyệt vời trong ảnh chụp màn hình đầu tiên. Làm thế nào tôi có thể nhận được nó?
semente

@semente trên trang liên quan đến Emacs của tôi jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Tôi nghĩ đây có lẽ là một trong hai chủ đề. - btw. Để có dòng chế độ thú vị, hãy thử gist.github.com/jasonm23/8554119
ocodo vào

13

Nếu bạn làm việc với nhiều cửa sổ emacs (> 3) và bạn sẽ muốn lưu một số tổ hợp phím, hãy thêm nó vào tệp init của bạn và bạn sẽ tốt hơn:

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

Bây giờ chỉ cần nhanh chóng lướt qua các cửa sổ với Mo


1
Đây chính xác là giải pháp tôi cần. Tất cả những gì tôi muốn là lệnh chuyển đổi cửa sổ chỉ là một lần nhấn phím lặp lại. Cảm ơn! Tôi đã phải thay đổi cửa sổ khác hoặc khung thành cửa sổ khác để làm cho nó hoạt động, FYI. Tôi đang sử dụng Emacs 24.2.1.
Geoff

Tôi nghĩ đây là những ràng buộc rất tốt (đặc biệt khi bạn có hơn 2 cửa sổ), cảm ơn. Như đã nói mũ cũng phải thay đổi other-windowđể làm cho nó hoạt động.
dolzenko

11

Có một số câu trả lời rất hay và đầy đủ ở đây, nhưng để trả lời câu hỏi theo cách tối giản:

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

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

2
Tôi không biết từ khi nào, nhưng emacs hiện nay đã previous-windowđược xây dựng trong.
Arne

@Arne Nó không phải là một chức năng có thể gọi được M-xvì vậy nên phục vụ một mục đích khác.
Ivan Huang

4

Dựa trên ý tưởng từ @Nate nhưng được sửa đổi một chút để hỗ trợ quay ngược giữa các cửa sổ

;; 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

Chỉ để thêm vào câu trả lời của @Nate, @aspirin và @ Troydm, tôi thấy đây là một bổ sung rất hữu ích nếu bạn quyết định liên kết các lệnh windmove với bất kỳ tổ hợp phím nào bạn chọn:

(setq windmove-wrap-around t)

Với cấu hình mặc định, bạn sẽ gặp lỗi khi cố gắng di chuyển đến một cửa sổ không tồn tại, điều này sẽ trở nên khó chịu sau một thời gian. Tuy nhiên, khi thiết lập windmove-wrap-around thì việc cố gắng di chuyển ra khỏi phần dưới cùng của khung, thay vào đó sẽ chọn cửa sổ trên cùng trong khung. Đây có thể là một hành vi trực quan hơn cho bạn.


4

M-nM-pcó ý nghĩa nhất đối với tôi, vì chúng tương tự với C-n( dòng tiếp theo ) và C-p( dòng trước ):

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

(lấy cảm hứng từ để nàyđó )


Tôi đã ủng hộ và sử dụng cấu hình này. Vấn đề là nó M-nM-pđã được sử dụng trong các thiết bị đầu cuối (gdb, python, ielm, v.v.), vì vậy bạn sẽ phải chuyển trở lại phương thức khác để nhảy ra khỏi bộ đệm đầu cuối.
mihai

Chúng được sử dụng để làm gì trong những môi trường đó?
tshepang

Đó là thứ tốt nhất mà tôi thấy vào lúc này, nó không đi ngược lại những thứ khác và hoạt động như một sự quyến rũ! Cảm ơn!
aurelien

2

Để tham khảo câu trả lời của Nate, tôi đã thay thế arrow keysđể sử dụng truyền thống pđể đi up, nđi down, fđi rightbđi left. Tôi cũng đã thay thế phím Ctrlbằng Superphím như C-p, C-n, C-f and C-bcác phím di chuyển mặc định. Sự kết hợp này với Mcho phép bạn chuyển các ký tự và dòng thay vì chỉ lướt qua từng ký tự sau mỗi lần nhấn phím. Vì vậy, Superchìa khóa cảm thấy là sự lựa chọn tốt nhất để giữ cho nó trở thành một chiếc chìa khóa dễ ràng buộc. Ngoài ra, bây giờ bạn không cần phải rời tay khỏi hàng nhà nữa!

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

Hy vọng nó giúp!


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

altjaltksẽ chuyển động qua bộ đệm hiển thị của bạn. Chính xác là tiến và lùi.


Mk là một phím tắt hữu ích. bất kỳ lựa chọn thay thế nào khác?
A_P

1

Đã có một gói cho phép bạn chuyển đổi cửa sổ bằng cách sử dụng M-. kiểm tra trang web này . Thêm cái này vào tệp init của bạn:

(require 'windmove)
(windmove-default-keybindings 'meta) ;; or use 'super to use windows key instead alt

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"
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.