Как быстро переключаться между окнами?
У меня часто открыто несколько окон, и мне нужно переключаться между ними. Прямо сейчас я использую, C-x o
чтобы добраться до того, кого я хочу. Есть ли более эффективный рабочий процесс для этого?
Как быстро переключаться между окнами?
У меня часто открыто несколько окон, и мне нужно переключаться между ними. Прямо сейчас я использую, C-x o
чтобы добраться до того, кого я хочу. Есть ли более эффективный рабочий процесс для этого?
Ответы:
Я, очевидно, предпочитаю туз-окно для этого. Вы можете переключаться между видимыми окнами и фреймами. Это в 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 .
ace-window
а затем увидел, switch-window
что, кажется, делает примерно то же самое, за исключением того, что буквы более выражены. кажется смешным, у нас есть оба пакета.
switch-window
пока не подчинился ace-window
MELPA.
ace-window
, он имеет больше настроек, чем другие пакеты, я думаю. Тем не менее, в будущем может оказаться полезной ключевая привязка к функции, которая аналогична действию «умная замена», но поглощает это окно, в результате чего в точке появляется большее окно и выбранное окно меньшего размера (съеденное). до окна). Соотношение должно быть определено в этом случае как половина, четверть или треть.
Одним из способов является использование 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 .
(windmove-default-keybindings 'meta)
как это предлагается в EmacsWiki.
Shift-arrow
) , но когда у вас большой монитор с большим количеством делений, такое движение быстро становится громоздким. Было бы интереснее как-то перечислить windows / split. Как ace-window
, но с меньшим количеством нажатий клавиш и очевидным алгоритмом, чтобы сразу выяснить, какое число вы хотите.
Вы можете связать 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))
Это особенно полезно для перемещения нескольких окон; удерживая нажатой клавишу «Управление», достаточно нажать одну кнопку, чтобы перейти к следующему окну. Это намного проще, чем три нажатия клавиш за ход.
C-x o
for other-window
- один из немногих претендентов на звание «наихудший по умолчанию ярлык emacs». Мое решение (похожее на zck) состояло в том, чтобы повторно привязать other window
к (более простой) последовательности клавиш - с ней я связан C-;
(и моя Caps-Lock
поменялась местами, Ctrl
поэтому все, что нужно, это быстрое нажатие мизинцев). Кстати, я полностью зависим от определенных функций helm
и icicles
(то есть я не "антипакет" или что-то еще); Я просто думаю, что простое решение работает лучше всего здесь.
M-o
для other-window
. Некоторые режимы уже имеют M-o
обязательный характер , в частности diff-mode
, ggtag-mode
и ibuffer-mode
. Вы должны вручную отсоединить его в каждой карте режима. unbind-key
предоставлено bind-key.el
очень полезно.
M-o
также использую и M-O
обязуюсь, ace-window
когда мне понадобится дополнительная сила.
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, вы получите самое быстрое решение из коробки.
window-number
с M-<num>
для быстрого переключения ч / б окон. Концепция похожа на эту
Без использования каких-либо дополнительных надстроек вы можете продолжать использовать 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 является аргументом числового префикса. Вернуть ноль.
Некоторые люди могут помнить редактор 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
Теперь я могу с легкостью перемещаться между окнами, независимо от того, насколько я перегружен конфигурацией ... И в настоящее время она может быть довольно загромождена размером дисплеев ...
(windmove-default-keybindings 'meta)
!
Если вы используете 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) циклическим (среди подходящих кандидатов).
Рассмотрите возможность использования клавишного аккорда для быстрого перехода между окнами. Я нахожу это намного быстрее, чем тянуться к клавише-модификатору (и также меньше напрягаю руки).
Я выбрал пакет ace-window
, который позволяет вам перемещаться по нескольким окнам проще, чем просто other-window
.
(require 'key-chord)
(key-chord-define-global "xo" 'ace-window)
(key-chord-mode +1)
Очевидно, что использовать это вам нужно, key-chord
и ace-window
оба доступны в Melpa.
ace-window
выполняет работу, как в ответе @ abo-abo. Меня поражает, что в этом контексте конкретное связывание клавиш будет иметь больше смысла как комментарий, а не как ответ. Просто мои два цента.
key-chord
связывать очень доступные комбинации клавиш. Пример привязки xo
быстрее, чем C-x o
(глубина от одного до двух). Этот ответ можно перефразировать, чтобы подчеркнуть, что ответ ортогонален другим ответам о выборе функций (и ace-window
является лишь одним из многих вариантов, которые могут быть связаны описанным способом). Держите этот ответ как отдельный!
Некоторые хорошие ответы здесь, я также фанат 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, все становится одним ключом. Нажмите.
(windmove-default-keybindings 'control)
.
Если вы используете evil-mode
, вы можете просто использовать числовой префикс с C-w C-w
( evil-window-next
), чтобы выбрать нужное окно. Итак: 1 C-w C-w
выбирает первое окно в циклическом порядке, 3 C-w C-w
выбирает третье окно в циклическом порядке и так далее.
Ace Jump позволяет вам перемещать указатель ко всем словам на экране, независимо от того, в каком окне или фрейме они находятся, поэтому он не так уж отличается от использования Ace Window или Switch Window.
Преимущество может заключаться в том, что при переходе через окна вы также можете разместить указатель с некоторой точностью.
Я все еще нахожу это немного громоздким или отвлекающим и обнаруживаю, что использую windmove
больше, потому что это очень просто, но все же использую Ace Jump, когда я читаю в другом окне или фрейме и хочу переместиться туда.
Как обычно, есть сотня разных способов сделать это. Мой предпочтительный способ - использовать NumberedWindows . Затем я установил следующее связывание клавиш, используя Super и клавиши 1-9.
(global-set-key (kbd "s-1") (lambda() (interactive) (window-number-select 1)))
Я немного подробнее расскажу об этой теме в моем недавнем посте, который вы можете прочитать в программе « Дневной кодер» .
Вы также можете использовать переключатель в качестве визуальной заменыC-x o
switch-window
поверх всех остальных?