Как быстро переключаться между окнами?


91

Как быстро переключаться между окнами?

У меня часто открыто несколько окон, и мне нужно переключаться между ними. Прямо сейчас я использую, C-x oчтобы добраться до того, кого я хочу. Есть ли более эффективный рабочий процесс для этого?


Ответы:


62

Я, очевидно, предпочитаю туз-окно для этого. Вы можете переключаться между видимыми окнами и фреймами. Это в MELPA, вы можете установить его быстро. Осталось только связать это:

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

Или, возможно, используйте более короткий ключевой аккорд, так как переключение окон является обычной задачей:

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

Резюме ace-window

Это замена для замены other-window. В отличие от последнего, вам никогда не придется звонить ace-windowдва или более раз, чтобы выбрать окно: вы выбираете нужное окно за один вызов (возможно, в нескольких кадрах).

Помимо переключения окон, ace-windowможно сделать больше (удалять или менять окна и т. Д.), См. README .


2
Это интересно. Я использовал, ace-windowа затем увидел, switch-windowчто, кажется, делает примерно то же самое, за исключением того, что буквы более выражены. кажется смешным, у нас есть оба пакета.
молочница

Вы правы. Между ними есть только небольшие различия. Это проблема, с которой нам приходится сталкиваться, когда у нас есть хранилище с 2000 пакетами. Я не знал об этом, switch-windowпока не подчинился ace-windowMELPA.
abo-abo

1
спасибо ace-window, он имеет больше настроек, чем другие пакеты, я думаю. Тем не менее, в будущем может оказаться полезной ключевая привязка к функции, которая аналогична действию «умная замена», но поглощает это окно, в результате чего в точке появляется большее окно и выбранное окно меньшего размера (съеденное). до окна). Соотношение должно быть определено в этом случае как половина, четверть или треть.
докторская степень

4
Пожалуйста, рассмотрите возможность добавления описания. Вы просто говорите, что вам это нравится, и вы ссылаетесь на это. Это делает это по существу ответом только для ссылки.
Дрю

4
В чем преимущество асе-окна? Почему я должен использовать его над 14 другими решениями, предложенными на этой странице?
Жиль

103

Одним из способов является использование windmove. Благодаря назначенным по умолчанию сочетаниям клавиш он позволяет переключаться в окно рядом с текущим активным окном.

Он встроен в Emacs, поэтому устанавливать его не нужно; просто активируйте его с минимальной настройкой в ​​вашем файле инициализации:

(windmove-default-keybindings)

Вы можете переключиться на соседние окна с помощью следующих клавиш (где стрелка используется интуитивно определяет направление , в котором вы двигаетесь): S-<left>, S-<right>, S-<up>, S-<down>.


Если вы предпочитаете использовать другой модификатор вместо shift, вы можете указать его в качестве аргумента windmove-default-keybindings. Например:

(windmove-default-keybindings 'meta)

или же

(windmove-default-keybindings 'control)

Больше информации на Emacs Wiki .


16
Это должен быть принятый ответ!
гребец

О боже, почему в руководстве не упоминаются клавиши Shift + стрелка для перемещения по окну! Это намного лучше, чем Ctrl + O
Дидье А.

Я бы сказал, что некоторые другие ответы здесь содержат избыточную конфигурацию ветра. Возможно, стоит обновить ответ, чтобы упомянуть, что функция принимает ключ-модификатор в качестве аргумента, например, (windmove-default-keybindings 'meta)как это предлагается в EmacsWiki.
metaturso

Это создает много конфликтов с другими привязками клавиш (или с оконными менеджерами). Я предпочитаю туз-окно.
Аззамса

Я использую что-то похожее (я двигаюсь вокруг Shift-arrow) , но когда у вас большой монитор с большим количеством делений, такое движение быстро становится громоздким. Было бы интереснее как-то перечислить windows / split. Как ace-window, но с меньшим количеством нажатий клавиш и очевидным алгоритмом, чтобы сразу выяснить, какое число вы хотите.
Привет, Ангел,

21

Вы можете связать other-windowс более легкой для ввода последовательности клавиш.

Например, я C-.привязался other-windowи C-,должен перейти к предыдущему окну.

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

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

Это особенно полезно для перемещения нескольких окон; удерживая нажатой клавишу «Управление», достаточно нажать одну кнопку, чтобы перейти к следующему окну. Это намного проще, чем три нажатия клавиш за ход.


2
+1 C-x ofor other-window- один из немногих претендентов на звание «наихудший по умолчанию ярлык emacs». Мое решение (похожее на zck) состояло в том, чтобы повторно привязать other windowк (более простой) последовательности клавиш - с ней я связан C-;(и моя Caps-Lockпоменялась местами, Ctrlпоэтому все, что нужно, это быстрое нажатие мизинцев). Кстати, я полностью зависим от определенных функций helmи icicles(то есть я не "антипакет" или что-то еще); Я просто думаю, что простое решение работает лучше всего здесь.
Iceman

2
+1 Это должен быть принятый ответ И самый простой ответ (увы, такого еще нет на StEx). Работает из коробки, отлично масштабируется, легко запоминается. Последнее мне показалось особенно важным в джунглях Emacs. Прожив там 20 с лишним лет, иногда я тоскливо прячусь в пустыне ви ...
Андреас Шпиндлер

Простой, легкий в использовании, простой в реализации. Это требует больше голосов.
stewSquared

1
Это также то, что я делаю. Я использую M-oдля other-window. Некоторые режимы уже имеют M-oобязательный характер , в частности diff-mode, ggtag-modeи ibuffer-mode. Вы должны вручную отсоединить его в каждой карте режима. unbind-keyпредоставлено bind-key.elочень полезно.
Ясуси Сёдзи

Я M-oтакже использую и M-Oобязуюсь, ace-windowкогда мне понадобится дополнительная сила.
glucas

13

window-numbering.el!

Я назначаю горячую клавишу ", 1", ", 2", ", 3" для переключения конкретного окна (обратите внимание, я использую злой режим)

кроме того, я отображаю номер окна в строке режима в розовом цвете, подчеркнут.

Это визуальный намек, который нельзя игнорировать,

Это самый быстрый способ переключить окно.

проверьте https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-evil.el и https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-modeline .el для моей настройки.

Сильвен Беннер перенял мою идею в spacemacs, но сочетания клавиш разные . Поэтому, если вы используете spacemacs, вы получите самое быстрое решение из коробки.


2
Ага. Эта концепция великолепна. Я использую пакет window-numberс M-<num>для быстрого переключения ч / б окон. Концепция похожа на эту
unperson325680

1
Обратите внимание, что window-numbering.el устарела в пользу winum , который находится здесь . FWIW нумерация окон для меня даже не работала.
Привет, Ангел,

Я мог бы перейти на Winum в ближайшее время. Но нумерация окон по-прежнему работает на emacs24 / 25/26.
Чен бин

10

Без использования каких-либо дополнительных надстроек вы можете продолжать использовать C-x oс дополнительным префиксом, чтобы пропустить такое количество окон. Например: C-u 1 C-x oперейдет к следующему окну в порядке (то есть, что вы получите с обычным C-x o), C-u 2 C-x oпереместится через два окна, перевернется через C-u 3 C-x oтри окна и так далее.

Выдержка из other-windowстроки документации (функция вызывается C-x o:

COUNT указывает количество пропускаемых окон, начиная с выбранного окна, прежде чем сделать выбор. Если COUNT положительный, пропустите окна COUNT вперед. Если COUNT отрицательный, пропустите окна -COUNT назад. COUNT ноль означает, что не пропустить ни одного окна, поэтому выберите выбранное окно. В интерактивном вызове COUNT является аргументом числового префикса. Вернуть ноль.


Когда у вас есть несколько окон, в каком порядке они следуют?
stsquad


2
хм "Порядок определяется в первую очередь по глубине дерева окон фрейма, извлечение живых окон, которые являются листовыми узлами дерева" - не самое полезное описание для человеческого мозга, пытающегося угадать, какое окно следующее или сколько пропустить. Наверное, поэтому я использую туз-окно.
stsquad

2
@stsquad: о, я согласен с тобой - это заставляет мою голову вращаться тоже. Я поставил этот ответ здесь для полноты картины.
Дан

8

Некоторые люди могут помнить редактор Brief (как ни странно, выпущенный компанией Underware).

У этого был аккуратный способ переключаться между видимыми окнами. M-стрелка будет перемещать курсор в окно непосредственно в направлении с направлением стрелки.

Таким образом, я отобразил winmove-left, winmove-right, winmove-upи winmove-downфункцию M-left, M-right, M-upи M-downследующие клавиши в моем файле .emacs -

(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

Теперь я могу с легкостью перемещаться между окнами, независимо от того, насколько я перегружен конфигурацией ... И в настоящее время она может быть довольно загромождена размером дисплеев ...


Разве это не более или менее ответ @ Франческо?
Дан

Я согласен. Я не заметил, прежде чем я разместил свой.
user2542

2
Более короткий способ получить эти сочетания клавиш (windmove-default-keybindings 'meta)!
Омар

8

Если вы используете Icicles, то C-x oможете выбирать окна по имени (или ездить на велосипеде).

  • Без префикса arg, C-x oявляется таким же, как обычно, other-windowесли только у фрейма нет только одного окна, в этом случае это так other-frame.

  • С префиксом arg, C-x oэто мульти-команда, которая позволяет вам перемещаться между окнами или фреймами по имени (или циклически). Навигация между окнами использует много команд icicle-select-window; навигация между кадрами использует icicle-select-frame.

Какая навигация используется, зависит от префикса arg:

  • Аргумент нулевого префикса (например C-0): если выбранный кадр имеет несколько окон, то это означает icicle-select-window, что окна находятся в том же кадре, что и кандидаты. В противном случае (однооконный фрейм) это так icicle-select-frame.

  • C-u: Если выбранный кадр имеет несколько окон, то это означает icicle-select-window, что окна всех видимых кадров являются кандидатами. В противном случае это так icicle-select-frame.

  • C-u C-u: icicle-select-window, с окнами из всех кадров в качестве кандидатов (в том числе иконизированных или скрытых кадров).

Как всегда в Icicles , вы можете объединить (a) завершение , набрав текст, чтобы сузить набор подходящих кандидатов (в данном случае имен окон или фреймов), с (b) циклическим (среди подходящих кандидатов).


4

Рассмотрите возможность использования клавишного аккорда для быстрого перехода между окнами. Я нахожу это намного быстрее, чем тянуться к клавише-модификатору (и также меньше напрягаю руки).

Я выбрал пакет ace-window, который позволяет вам перемещаться по нескольким окнам проще, чем просто other-window.

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

Очевидно, что использовать это вам нужно, key-chordи ace-windowоба доступны в Melpa.


2
Разве это не более или менее ответ @ abo-abo?
Дан

1
@ Дан его не использует клавишный аккорд, обратите внимание на отсутствие метаданных или суперключей в аккорде. Независимо от того, используете ли вы ace-window / что-то еще, это не имеет значения, смысл заключался в том, чтобы дать ответ, который не использует клавиши-модификаторы для столь часто используемой операции.
Завиор

1
Я видел это, но я поднял вопрос, потому что ace-windowвыполняет работу, как в ответе @ abo-abo. Меня поражает, что в этом контексте конкретное связывание клавиш будет иметь больше смысла как комментарий, а не как ответ. Просто мои два цента.
Дан

@ Дан, в целом вопрос был о быстром переключении окон, и я не думаю, что это решение было предложено. Уточнил ответ немного по этому поводу.
Завиор

@Zavior поднимает важный вопрос. Речь идет о быстром переключении окон, для которых очень важна форма привязки. Независимо от того, какую библиотеку вы предпочитаете, можно key-chordсвязывать очень доступные комбинации клавиш. Пример привязки xoбыстрее, чем C-x o(глубина от одного до двух). Этот ответ можно перефразировать, чтобы подчеркнуть, что ответ ортогонален другим ответам о выборе функций (и ace-windowявляется лишь одним из многих вариантов, которые могут быть связаны описанным способом). Держите этот ответ как отдельный!
2016 г.

3

Некоторые хорошие ответы здесь, я также фанат WinMove, но я связываю его с C-, потому что режим org использует M- для манипулирования заголовками

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

Что действительно хорошо получается, так это объединить его с Hydra . Следуя примерам в их вики, я создал своего собственного монстра:

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

Это позволяет мне изменять окна, изменять их размер, перемещать буферы из окна в окно, циклически менять буферы, уничтожать буферы и даже отменять конфигурации окон в режиме победителя, а также интегрирует helm. Чтобы выйти из гидры, просто нажмите стрелку или другую клавишу, не входящую в гидру. Вы можете найти функции «hydra-move» на примерах Hydra. Отличительной особенностью Hydra является то, что мне не нужно запоминать все эти сочетания клавиш и их «модерирование», поэтому, как только вы попадаете в Hydra, все становится одним ключом. Нажмите.


1
Более короткий способ получить сочетание клавиш вы упоминаете в начале это (windmove-default-keybindings 'control).
Омар

1

Если вы используете evil-mode, вы можете просто использовать числовой префикс с C-w C-w( evil-window-next), чтобы выбрать нужное окно. Итак: 1 C-w C-wвыбирает первое окно в циклическом порядке, 3 C-w C-wвыбирает третье окно в циклическом порядке и так далее.


Кажется, что это должно быть просто объединено с вашим другим ответом : это то же самое, только с привязками, специфичными для зла.
npostavs

1

Ace Jump позволяет вам перемещать указатель ко всем словам на экране, независимо от того, в каком окне или фрейме они находятся, поэтому он не так уж отличается от использования Ace Window или Switch Window.

Преимущество может заключаться в том, что при переходе через окна вы также можете разместить указатель с некоторой точностью.

Я все еще нахожу это немного громоздким или отвлекающим и обнаруживаю, что использую windmoveбольше, потому что это очень просто, но все же использую Ace Jump, когда я читаю в другом окне или фрейме и хочу переместиться туда.


1

Как обычно, есть сотня разных способов сделать это. Мой предпочтительный способ - использовать NumberedWindows . Затем я установил следующее связывание клавиш, используя Super и клавиши 1-9.

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

Я немного подробнее расскажу об этой теме в моем недавнем посте, который вы можете прочитать в программе « Дневной кодер» .


Чем это отличается от ответа Чен Бин ?
Жиль

Есть пример его настройки.
Трэвис

-1

Вы также можете использовать переключатель в качестве визуальной заменыC-x o


1
В чем выгода переключения окна? Почему я должен использовать его над 14 другими решениями, предложенными на этой странице?
Жиль

Как говорит, что вы должны? Emacs - это все об альтернативах, настройке и свободе выбора.
csantosb

2
Это ни здесь, ни там. Почему кто-то выбрал именно эту альтернативу? Почему один решил использовать switch-windowповерх всех остальных?
Жиль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.