Я хотел бы, чтобы после разделения окна (C-x 3
или C-x 2
), чтобы иметь возможность автоматически перейти к курсору в новом открытом буфере (отличном от текущего). Как я могу достичь такого поведения?
Как переключить фокус после разделения буфера в emacs?
Ответ 1
!!! НЕ ИСПОЛЬЗУЙТЕ ЭТО ОТВЕТ!!! - как указано в комментариях, советы split-window
могут привести к нежелательным побочным эффектам.
Я рекомендую ответ Божидара Бацова.
Поместите в файл .emacs следующее:
(defadvice split-window (after move-point-to-new-window activate)
"Moves the point to the newly created window after splitting."
(other-window 1))
Ответ 2
Вы можете переключаться между буферами с помощью C-x o
. Что касается этого автоматически, я не думаю, что для этого существует существующая команда.
Ответ 3
Вы можете сделать это следующим образом:
(global-set-key "\C-x2" (lambda () (interactive)(split-window-vertically) (other-window 1)))
(global-set-key "\C-x3" (lambda () (interactive)(split-window-horizontally) (other-window 1)))
В Emacs 24.3.1 он работает, если вы изменяете аргумент 1
для 0
.
Ответ 4
Как и разбиение кадра вручную с помощью C-x 2 или C-x 3, буферы также автоматически "выскакивают" несколько раз. Они также не выбраны/активны по умолчанию.
Это можно исправить, изменив функцию, используемую для разделения окна. Он по умолчанию установлен на split-window-sensibly
, но вы можете установить его на свою собственную функцию, которая вызывает split-window-sensibly
, а затем выбирает буфер.
К сожалению, это имеет побочный эффект при выборе буфера *Completions*
при нажатии TAB в минибуфере. Таким образом, стоит проверить, активен ли минибуфер и не переключается в этом случае. Я бы поспорил, есть и другие подобные нежелательные сценарии. Я попытаюсь обновить этот пост, когда и когда найду их.
;; after splitting a frame automatically, switch to the new window (unless we
;; were in the minibuffer)
(setq split-window-preferred-function 'my/split-window-func)
(defun my/split-window-func (&optional window)
(let ((new-window (split-window-sensibly window)))
(if (not (active-minibuffer-window))
(select-window new-window))))
(Работает с Emacs 24.5.1.)
Ответ 5
Моя мысль о том, когда вы захотите последовать за окном после split-window
, когда он имеет тот же буфер, что и в следующем коде:
(defun split-window--select-window (orig-func &rest args)
"Switch to the other window after a `split-window'"
(let ((cur-window (selected-window))
(new-window (apply orig-func args)))
(when (equal (window-buffer cur-window) (window-buffer new-window))
(select-window new-window))
new-window))
(advice-add 'split-window :around #'split-window--select-window)
Простой