Как я могу переключить фокус после разделения буфера в Emacs? - PullRequest
35 голосов
/ 24 июня 2011

Хотелось бы, чтобы после разделения окна (C-x 3 или C-x 2) была возможность автоматического перехода к курсору в новом открытом буфере (отличном от текущего).Как я могу добиться этого поведения?

Ответы [ 5 ]

55 голосов
/ 24 июня 2011

Вы можете переключаться между буферами с помощью C-x o. Что касается того, чтобы делать это автоматически, я не думаю, что для этого существует существующая команда.

26 голосов
/ 24 июня 2011

Вы можете сделать это следующим образом:

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

13 голосов
/ 24 июня 2011

!!! НЕ ИСПОЛЬЗУЙТЕ ЭТО ОТВЕТ !!! - как указано в комментариях, рекомендация 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))
1 голос
/ 10 октября 2015

Помимо разделения кадра вручную с помощью Cx 2 или Cx 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.)

0 голосов
/ 08 декабря 2016

Я думал о том, когда вы захотите следовать за окном после 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)

Simple

...