Як швидко перемикатися між вікнами?


90

Як швидко перемикатися між вікнами?

У мене часто відкрито кілька вікон і мені потрібно перемикатися між ними. Прямо зараз я користуюся 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-windowна MELPA.
Або-або

1
спасибі за ace-window, я маю більше налаштування, ніж інші пакунки, я думаю. Однак, можливо, в майбутньому це може допомогти - це ключове прив'язування до функції, яка буде аналогічно дії розумної заміни, але з'їдає це вікно, в результаті чого вікно буде більш великим і вибране вікно меншого розміру (з'їдене вгору вікно). У цьому випадку співвідношення слід визначати як половина, одна четверта або третина.
докторантура

4
Будь ласка, подумайте про додавання опису. Ви просто говорите, що вам це подобається, і ви посилаєтесь на це. Це означає, що це по суті є лише посиланням.
Дрю

4
Яка користь туз-вікна? Чому я повинен використовувати його над 14 іншими рішеннями, запропонованими на цій сторінці?
Жиль

103

Один із способів - це використання windmove. Завдяки своїм клавіатурним вкладкам за замовчуванням він дозволяє переходити до вікна поруч із активно діючим.

Він вбудований в Emacs, тому не потрібно нічого встановлювати; просто активуйте його за допомогою наступних мінімальних налаштувань у вашому файлі init:

(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
Це має бути прийнята відповідь!
грабіжник

OMG, чому в підручнику не згадується зсув + клавіші зі стрілками, щоб переміщатися навколо вікна! Це набагато краще, ніж ctrl + o
Дідьє А.

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

Це створює багато конфліктів з іншими прив'язками клавіш (або з менеджерами вікон). Я вважаю за краще туз-вікно.
azzamsa

Я використовую щось подібне (я рухаюсь навколо Shift-arrow) , але коли у вас великий монітор з великою кількістю розщеплень, такий рух швидко стає непростим. Було б цікавіше якось перерахувати вікна / розбивки. Мовляв 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))

Це особливо корисно для переміщення декількох вікон; як тільки ви утримуєте клавішу Control, вам потрібно лише натиснути одну кнопку, щоб перейти до наступного вікна. Це набагато простіше, ніж три натискання клавіш на ходу.


2
+1 C-x oдля other-window- один з небагатьох солідних претендентів на титул "найгіршого ярлика швидкого доступу до emacs". Моє рішення (подібне до zck) полягала в тому, щоб перезавантажити на (простішу) простішу other windowпослідовність клавіш - я його зв'язав C-;(і мій Caps-Lockобміняється Ctrlтаким чином, що все, що потрібно, - це швидке натискання на pinkey). До речі, я повністю залежний від певних особливостей helmі icicles(тобто я не "антипакет" чи що-небудь); Я просто думаю, що просте рішення тут найкраще працює.
iceman

2
+1 Це має бути прийнятою відповіддю І найпростішою відповіддю (на жаль, на StEx такого ще немає). Працює з коробки, масштабується ідеально, просто запам'ятовується. Останнє я виявило особливо важливим у джунглях Emacs. Переживши там 20+ років, іноді я відчуваю, що щорічно ховаюсь у пустелі vi ...
Андреас Шпіндлер

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

1
Це теж я роблю. Я використовую M-oдля other-window. Деякі режими вже мають M-oобов'язковий характер , в зокрема diff-mode, ggtag-modeі ibuffer-mode. Ви повинні від’єднати її вручну в кожній карті режимів. unbind-keyнадається bind-key.elдуже корисно.
Yasushi Shoji

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

13

window-numbering.el!

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

крім того, я відображаю номер вікна в рядку режиму в кольорі PINK, підкресленому.

Це візуальний натяк, який ніколи не можна ігнорувати,

Це найшвидший спосіб переключення вікна.

перевірити 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, ви отримаєте швидке рішення з коробки.


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-windowdocstring (функція викликається C-x o:

COUNT визначає кількість вікон, які потрібно пропустити, починаючи з вибраного вікна, перш ніж зробити вибір. Якщо значення COUNT позитивне, пропустіть вікна COUNT вперед. Якщо значення COUNT від’ємне, пропустіть –COUNT вікна назад. COUNT нуль означає, що не пропускайте жодне вікно, тому виберіть вибране вікно. В інтерактивному дзвінку COUNT - аргумент числового префіксу. Повернути нуль.


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


2
hmm "Впорядкованість визначається першим глибиною обходу віконного дерева кадру, вилученням живих вікон, які є листовими вузлами дерева", не є найбільш корисним описом для людського мозку, який намагається вгадати, яке вікно знаходиться наступне чи скільки пропустити. Я думаю, саме тому я використовую туз-вікно.
stsquad

2
@stsquad: о, я згоден з вами - це також змушує мою голову крутитися. Я ставлю цю відповідь тут заради повноти.
Дан

8

Деякі люди можуть запам’ятати редактор Коротко (досить смішно, створене компанією під назвою 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

Тепер я можу легко переміщатися між вікнами, незалежно від того, наскільки зафіксована у мене конфігурація ... І це може бути дуже захаращено розмірами дисплеїв сьогодні ...


Це не більш-менш @ відповідь Франческо?
Дан

Я згоден. Я не помічав, перш ніж розмістити свою.
користувач2542

2
Набагато коротший спосіб отримати ці вкладки (windmove-default-keybindings 'meta)!
Омар

8

Якщо ви використовуєте Icicles, тоді C-x oви можете вибрати вікна за назвою (або на велосипеді).

  • Без аргументу префікса - C-x oце те саме, що зазвичай, за other-windowвинятком випадків, коли кадр має лише одне вікно, і в цьому випадку він є other-frame.

  • З префіксом arg C-x o- це багатокомандна команда, яка дозволяє переходити між вікнами чи кадрами по імені (або на велосипеді). Для навігації серед вікон використовується багатокомандна команда icicle-select-window; навігація між використанням кадрів icicle-select-frame.

Яка навігація використовується, залежить від префікса arg:

  • Нульовий префікс 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
Це не більш-менш відповідь @ Або-Або?
Дан

1
@Дан його не використовує акордів клавіш, зауважте, відсутність мета-чи супер-клавіш у акорді. Якщо ви використовуєте асо-вікно / щось інше трохи не має значення, справа в тому, щоб дати відповідь, яка не використовує модифікаційні клавіші для настільки часто використовуваних операцій.
Захід

1
Я це бачив, але я поставив питання, тому що ace-windowвиконує роботу так, як у відповіді @ Або-Або. Мене вражає, що в цьому контексті використання конкретного прив'язки клавіш матиме більше сенс як коментар, а не відповідь. Всього два мої центи.
Дан

@Dan, загалом питання стосувалося швидкої перемикання вікон, і я не думаю, що це рішення ще не піднято. Відповідь дещо уточнила стосовно цього.
Захід

@Zavior піднімає важливий момент. Питання полягає в швидкому перемиканні вікон - для яких форма прив’язки дуже важлива. Незалежно від бібліотеки, яку ви віддаєте перевагу, key-chordможна прив’язати дуже доступні комбінації клавіш. Приклад зв'язування xoшвидше, ніж C-x o(глибина один проти двох). Цю відповідь можна переформулювати, щоб підкреслити, що відповідь є ортогональною для інших відповідей щодо вибору функції (і ace-windowє лише одним із багатьох варіантів, які можуть бути пов'язані описаним способом). Зберігайте цю відповідь як виразну!
ebpa

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)

Там, де це справді добре, якщо поєднувати його з гідрою . Наслідуючи приклади на їхній вікі, я створив власного монстра:

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

Це дозволяє мені змінювати вікна, змінювати їх розмір, переміщувати буфери з вікна у вікно, циклічні буфери, вбивати буфери та навіть скасовувати конфігурації вікон через режим переможця, а також інтегрує керма. Щоб вийти з гідри, просто натисніть стрілку або якусь іншу клавішу, яка не є в гідрі. Ви можете знайти функції "hydra-move" на прикладах гідри. Найкраще в справі про гідру - мені не потрібно пам’ятати всі ці клавіші та її "поміркованість", тож коли ви перебуваєте в гідрі, все доступне як один ключ натиснути.


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вибирає третє вікно в циклічному порядку тощо.


Це здається, що його слід просто поєднувати з вашою іншою відповіддю : це те саме, тільки зі специфічними для зла прив’язками.
nпостаs

1

Ace Jump дозволяє орієнтуватися на вказівник на всі слова на екрані, незалежно від того, у якому вікні чи кадрі вони знаходяться, тому він не так відрізняється від використання вікна Ace або Switch Window.

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

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


1

Як завжди, існує сто різних способів досягти цього. Моїм бажаним способом є використання NumberedWindows . Потім я встановлюю наступне сполучення клавіш за допомогою клавіш Super та клавіш 1-9.

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

Я розбираюся трохи детальніше про цю точну тему з останнім моїм повідомленням, яке ви можете прочитати на Coder Afterday .


Чим це відрізняється від відповіді Чен Біна ?
Жиль

Має приклад його налаштування.
Тревіс

-1

Ви також можете вирішити використовувати перемикач-вікно як візуальну замінуC-x o


1
У чому перевага перемикання вікон? Чому я повинен використовувати його над 14 іншими рішеннями, запропонованими на цій сторінці?
Жиль

Як каже, що слід? Emacs - це все про альтернативи, налаштування та свободу рішення.
csantosb

2
Це ні тут, ні там. Чому хтось обрав саме цю альтернативу? Чому один вирішив би використовуватись switch-windowнад усіма іншими?
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.