Emacs, переключитися на попереднє вікно


93

В Emacs C-x oпереводить мене до наступного вікна.

Який макрос клавіатури переносить мене до попереднього вікна в Emacs?

Відповіді:


88

Це було б C-- C-x o

Іншими словами, C-x oз аргументом -1. Ви можете вказати кількість вікон для переміщення, вставивши числовий аргумент між C-uкомандою та командою, як у C-u 2 C-x o. ( C--це ярлик для C-u - 1)


І ви можете використовувати C-x zдля повторення останньої команди для швидкого перемикання вікон.
Іван Хуанг

105

Можливо, ви також захочете спробувати використовувати windmove, який дозволяє перейти до вибраного вами вікна на основі геометрії. У моєму файлі .emacs є таке для зміни вікон за допомогою клавіші зі стрілкою 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
Зауважте, що виклик (windmove-default-keybindings)прив'язує ці функції до SHIFT + вгору / вниз / вліво / вправо, що, на мою думку, є зручнішим, ніж ваші C-xприв’язки (що суперечить також корисним прив'язкам за замовчуванням для previous-bufferі next-buffer. Lkahtz: (kbd)функція дозволяє задавати ключі в нотації рядків у більш читабельному синтаксисі, який також використовується Emacs, коли ви використовуєте C-h kабо C-h cдля опису прив'язки
phils

4
Я не схвалюю використання клавіш зі стрілками. Але я все одно підтримав допомогу. : smug:
Bjorn

2
@phils SHIFT + <клавіші> втручається з вибором зсуву, який за замовчуванням увімкнено з Emacs 23 (режим вибору зсуву).
legends2k

2
legends2k: Правда; хоча ви також можете передати аргумент, щоб windmove-default-keybindingsвказати інший модифікатор, який використовуватиметься разом із клавішами зі стрілками; так що ця функція все ще може бути корисною для людей, які використовують режим вибору зсуву.
phils

1
@phils Погоджено, мета здається гарною альтернативою; як видно з Emacs Wiki .
legends2k

30

Особисто я вважаю за краще використовувати window-number.el

Щоб вибрати інше вікно, використовуйте Ctrl- x, Ctrl- j n

Де n - номер вікна, модель кожного з вікон показує його номер, як показано на скріншоті.

Просто завантажте window-number.el , помістіть його у свій шлях завантаження Emacs і використовуйте наступне у своєму.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)

Існує ще один подібний режим, switch-window.elякий називається великим числом у вікнах ... (натискання номера перемикає вікно і повертає дисплей.)


(джерело: tapoueh.org )


2
Приємно, але я б радив щось не прив’язувати C-x C-j, оскільки це прив’язка за замовчуванням для dired-jumpвас (require 'dired-x). (Подивіться, M-x customize-group RET dired-keys RETчи хочете ви це замінити.)
phils

1
Опублікувавши це, я вирішив switch-window.elперейти, і він використовує C-x oнатомість, і коли там активне лише два вікна, він просто вибирає інше вікно. Я вважаю, що найрозумніше переобв’язувати C-x oцю window-numberтрюк, ви цілком праві dired-jump. Особисто я менше перемикаю вікна і використовую C-x bсебе, але покращення C-x oдуже приємно.
окудо

дивовижна тема Emacs на першому скріншоті. як я можу це отримати?
семенція

@semente на моїй пов’язаній із Emacs сторінці jasonm23.github.com/EmacsFodder/Emacs/2012/06/29/…
ocodo

1
@petrux emacsfodder.github.io/blog/two-new-emacs24-themes Я думаю, що це, мабуть, одна з двох тем. - до речі. Для крутого режиму спробуйте gist.github.com/jasonm23/8554119
ocodo

13

Якщо ви багато працюєте з вікнами emacs (> 3), і вам захочеться зберегти кілька натискань клавіш, додайте це до свого файлу init, і вам буде краще:

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

Тепер просто швидко проїжджайте по вікнах за допомогою Mo


1
Це саме рішення, яке мені було потрібно. Все, що я хотів, - щоб команда перемикання вікон була одним повторенням натискання клавіші. Дякую! Мені довелося змінити інше вікно чи кадр на інше вікно, щоб це працювало, FYI. Я на Emacs 24.2.1.
Geoff

Я думаю, що це дуже хороші прив’язки (особливо коли у вас 2+ вікон), дякую. Як вже було сказано, капелюх також слід змінити, щоб other-windowвін працював.
dolzenko

11

Тут є кілька дуже хороших і повних відповідей, але щоб відповісти на питання мінімалістично:

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

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

2
Я не знаю з тих пір, але тепер previous-windowвбудовано emacs .
Арне,

@Arne Це не функція дзвінка, M-xтому вона повинна слугувати іншим цілям.
Іван Хуан,

4

Заснований на ідеї від @Nate, але трохи змінений для підтримки зворотного руху між вікнами

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

Просто щоб додати відповіді @Nate, @aspirin та @ Troydm, я вважаю, що це дуже корисне доповнення, якщо ви вирішите прив'язати команди windmove до будь-якої вибраної комбінації клавіш:

(setq windmove-wrap-around t)

З конфігурацією за замовчуванням ви отримаєте помилку, коли спробуєте перейти до вікна, яке не існує, що через деякий час стає набридливим. Однак, коли встановлено обгортання вітровим рухом, наприклад, спроба відсунутися від нижньої частини кадру замість цього вибере найвище вікно у кадрі. Це може бути для вас більш інтуїтивною поведінкою.


4

M-nі M-pдля мене найбільш зрозумілий, оскільки вони є аналогами C-n( наступний рядок ) та C-p( попередній рядок ):

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

(натхненний цим і тим )


Я підтримав та використав цю конфігурацію. Проблема полягає в тому, що M-nі M-pвже використовується в терміналах (GDB, пітон, ielm і т.д.) , так що вам доведеться перемкнутися на інший метод , щоб вискочити з термінального буфера.
mihai

Для чого вони використовуються в тих середовищах?
thepang

Це найкраще, що я бачив на даний момент, він не суперечить іншим речам і працює як шарм! Дякую!
Aurelien

2

Посилаючись на відповідь Нейта, я замінив arrow keysна використання традиційного pдля поїздки up, nдля поїздки down, fдля поїздки rightта bдля поїздки left. Я також замінив Ctrlз Superключем , як C-p, C-n, C-f and C-bце клавіші переміщення за замовчуванням. Ця комбінація Mдозволяє перестрибувати символи та рядки, а не проходити лише по одному після кожного натискання клавіші. Таким чином, Superключ вважав найкращим вибором, щоб зберегти його просту прив’язку клавіш. Крім того, тепер вам більше не доведеться знімати руку з домашнього ряду!

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

Сподіваюся, це допомагає!


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

altjі altkбуде переходити через ваші види буферів. Точніше вперед і назад.


Mk - це досить корисний ярлик. будь-які інші альтернативи?
A_P

1

Уже існує пакет, який дозволяє перемикати вікна за допомогою M-. перевірте цей веб-сайт . Додайте це до свого файлу init:

(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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.