Определение окна, на которое указывает «другое окно»

10

В emacs чаще, чем мне нравится, я получаю 4 или более окон.

Я буду использовать этот пример:

+--------|-----------+
|        |           |
|   1    |   2       |
|        |           |
+--------+-----------+
|    3   |     4     |
|        +-----------+
|        |     5     |
+--------+-----------+

Многие функции могут выполнять действия в other-window(обычно это же окно, на которое указывает C-x o). Особенно полезны такие scroll-other-window. Однако, когда открыто 4 или более окон, other windowвряд ли будет то, что я хочу.

Есть ли простой способ управлять набором other-windowбез изменения макета окна / буфера? Конечно, это выполнимо с помощью кучи C-x 4 bи , C-bно я не хочу , чтобы изменить расположение. Например:

  • Если редактировать в окне 4 на картинке выше, есть ли простой способ настроить C-M-vпрокрутку окна 1 ?
  • Или просто предположим, что фокус на окне 3 , как установить, other-windowчтобы указать на окно 2 ?
Lompik
источник

Ответы:

7

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

Изменение окна, на которое other-windowуказывает это один из способов достижения этого, но я хотел бы предложить альтернативный рабочий процесс:

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

Демонстрация туза-окна

Если вы привязываетесь ace-windowк нему C-x o, вам не нужно запоминать дополнительную привязку клавиш, и вам будет казаться, что вы используете версию с наддувом other-window.

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

ace-windowдоступен в MELPA . После установки через M-x package-install RET ace-window RET, вы можете поместить следующее в ваш init-файл, чтобы настроить его, как описано выше:

(global-set-key (kbd "C-x o") 'ace-window)
(setq aw-keys '(?a ?b ?c ?d ?e ?f ?g ?h ?i))
itsjeyd
источник
Спасибо за демонстрацию, я видел этот пакет на других сайтах, и мне было интересно, как он работает. На самом деле я могу легко переключать окно, так как я вынужден M-1 M-2 ..выбрать окно № 1, 2, используя window-numberпакет
Lompik
1

Из быстрого обзора источника other-windowэто выглядит так, как будто оно на самом деле зависит от возвращаемого окна next-window, которое определено в c. К сожалению scroll-other-window, также определен в c, и, вероятно, вызывает оттуда следующее окно. Я не думаю, что это легко переопределить.

Тем не менее, switch-to-buffer-other-windowкажется, использовать pop-to-buffer, так что вам может повезти там.

dgtized
источник
1

Нет простого способа манипулировать списком окон, поэтому возвращаемый результат other-windowболее или менее фиксирован. Это само по себе неплохо, так как обеспечивает согласованность при навигации по окнам. Что касается двух сценариев, которые вы описали, с некоторыми elisp или макросами вы можете удовлетворить свой рабочий процесс.

если редактировать в окне 4 на картинке выше, есть ли простой способ настроить CMv для прокрутки окна 1?

Вы можете использовать простой фрагмент, подобный приведенному ниже, чтобы использовать other-windowсоответствующее количество раз, прокрутить вниз и вернуться к исходному окну.

 (defun my-scroll-down-other-window (&optional arg)
 "Like `scroll-other-window' but takes a prefix argument 
 that indicates which window to scroll."
  (interactive "p")
  (save-selected-window
    (other-window arg)
    (scroll-down)))

Вы можете передать префиксный аргумент, чтобы указать, какое окно прокручивать. Как вы можете сделать вывод, он использует встроенный механизм, other-windowчтобы пропустить argколичество окон перед прокруткой. save-selected-windowГарантирует фокус возвращается к исходному окну. Документация other-windowможет предоставить дополнительную информацию об изменении этого фрагмента в соответствии с вашим поведением.

Или просто предположим, что фокус на окне 3, как установить, other-windowчтобы указать на окно 2?

Снова используйте prefix-argкак C-3 C-x oпри звонке other-window. Фактическое количество для предоставления зависит от порядка их разделения и не изменится, если вы не создадите новые окна. Кроме того, вы можете использовать удобные пакеты, такие как window-numberили ace-windowиз MELPA, для быстрого переключения выбранных окон.

Vamsi
источник
Да, нет простого способа манипулировать списком окон. Мне трудно использовать префиксы. Чувствуется, что он добавляет еще один недоступный ключ и замедляет работу
Lompik
Вот для чего нужны клавиатурные макросы / сочетания клавиш. Если это обычная часть вашего рабочего процесса, вы можете легко определить привязку клавиш на основе карты префиксов, например, <f7> nдля прокрутки n-го окна. Создайте временные привязки клавиш с помощью макросов клавиатуры.
Вамси