Emacs перемещается по разделенным окнам в определенном направлении?

В терминале Emacs (без мыши) я использую разделенные окна для одновременного работы с несколькими буферами. Я нахожу переход между разделенными окнами гораздо более болезненными, чем то, как я это делаю в Vim. Читая документацию, похоже, что я делаю это правильно (C-x o), но это просто крутится вокруг окон по часовой стрелке. Если я перейду в соседнее окно, чтобы сделать быстрое редактирование, мне нужно несколько раз нажать C-x o, прежде чем я вернусь туда, где я был. Иногда я случайно нажимаю его слишком много раз в спешке и должен снова проехать обратно через окна.

Далеко от установки еще-другого-внешнего-пакета, есть ли какой-либо способ, который я могу просто перемещать непосредственно в окно (например, числом) или, по крайней мере, обойти окна в противоположном направлении?

В Vim C-w C-w походит на C-x o в Emacs, но также C-w ARROW перемещается в определенном направлении... что-то вроде этого? :)

Ответ 1

Добавьте это в файл инициализации:

(windmove-default-keybindings)

Затем вы можете использовать SHIFT+arrow для перехода к следующему соседнему окну в указанном направлении.

Вы можете указать другой модификатор, если хотите, передав аргумент (по умолчанию - 'shift).

Или просто привяжите все, что вам нравится к этим функциям:

  • windmove-up
  • windmove-down
  • windmove-left
  • windmove-right

Вы также можете добавить FrameMove в микс, чтобы сделать эту работу прозрачно на нескольких кадрах.

Для нумерованной навигации окна есть switch-window.el.

Ответ 2

Вы можете указать префиксный аргумент C-x o, как C-u -1 C-x o. Таким образом, вы можете перейти на любое количество окон вперед или назад. Лично я думаю, что проще создать специальный ключ для перемещения в одно окно. У меня это в моих.emacs:

(defun other-window-backward ()
  "Goto previous window"
  (interactive)
  (other-window -1))
(global-set-key (kbd "\C-x p") 'other-window-backward)

Ответ 3

Я использую следующее для перехода к следующему (так же, как C-x o), предыдущему, первому и последнему окну:

(defun my-previous-window ()
  "Previous window"
  (interactive)
  (other-window -1))
(global-set-key "\C-xp" 'my-previous-window)

(global-set-key "\C-xn" 'other-window)

(defun my-select-first-window ()
  (interactive)
  (select-window (frame-first-window)))

(defun my-select-last-window ()
  (interactive)
  (select-window (previous-window (frame-first-window))))

(global-set-key "\C-x<" 'my-select-first-window)
(global-set-key "\C-x>" 'my-select-last-window)

Ответ 4

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

;; C-x <direction> to switch windows
(use-package window-jump
             :bind (("C-x <up>" . window-jump-up)
                    ("C-x <down>" . window-jump-down)
                    ("C-x <left>" . window-jump-left)
                    ("C-x <right>" . window-jump-right)))

Для получения справки по использованию пакета см. Https://github.com/jwiegley/use-package/blob/master/README.md.

Ответ 6

Добавьте это в файл инициализации (например, ~/.emacs):

(windmove-default-keybindings)

Затем сделайте SHIFT+arrow, чтобы перейти в окно в этом направлении.

Ответ 7

Я написал модуль elisp, чтобы вернуться на windmove, чтобы сделать его более полезным: http://samograd.ca/stumpwm.el. Вы можете привязать stumpwm-move-window- [left/right/up/down] к тем клавишам, которые вы хотите, и окна будут двигаться в правильном направлении, даже в другой другой кадр (проверено на 2 кадра). Также есть окно stumpwm-interactive-resize для удобного интерактивного изменения размера окна с использованием Cn/Cp/Cf/Cb с возвратом до конца.