46 votes

Comment changer le focus après un split du buffer dans emacs ?

J'aimerais qu'après avoir divisé la fenêtre ( C-x 3 o C-x 2 ) pour pouvoir atteindre automatiquement le curseur dans le nouveau tampon ouvert (l'autre que le courant). Comment puis-je obtenir ce comportement ?

1 votes

Morgan, ma réponse ci-dessous peut malheureusement entraîner des effets secondaires désagréables, c'est pourquoi je voudrais la retirer. Malheureusement, je ne peux pas le faire tant que c'est la réponse acceptée. Pourriez-vous la désactiver afin que je puisse la supprimer ? Merci.

0 votes

C-x 4f n'est pas exactement ce que vous demandez mais c'est une astuce très pratique.

68voto

Giann Points 1619

Vous pouvez passer d'un tampon à l'autre avec C-x o . Pour ce qui est de faire cela automatiquement, je ne pense pas qu'il y ait une commande existante pour cela.

0 votes

Merci pour cela. Dans ma configuration actuelle, j'utilise les touches S-<flèches> pour me déplacer entre les tampons visibles, c'est le côté automatique qui m'intéresse.

0 votes

Merci ! C'est exactement ce que je veux !

40voto

Bozhidar Batsov Points 23298

Vous pouvez le faire comme ça :

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

Dans Emacs 24.3.1, cela fonctionne si vous modifiez l'argument 1 para 0 .

1 votes

Petite coquille ici. Il s'agit de split-window-horizontally au lieu de split-window-horizonatally . J'ai essayé d'éditer mais je n'ai pas les droits.

3 votes

Cela ne devrait-il pas être split-window-right y split-window-below ?

14voto

Thomas Points 8142

!!!N'UTILISEZ PAS CETTE RÉPONSE ! !! -- comme indiqué dans les commentaires, conseiller split-window peut entraîner des effets secondaires indésirables.

Je recommande Bozhidar Batsov à la place.


Mettez ce qui suit dans votre fichier .emacs :

(defadvice split-window (after move-point-to-new-window activate)
  "Moves the point to the newly created window after splitting."
  (other-window 1))

0 votes

A titre d'observation, cela perturberait la BCE. Du moins dans ma configuration.

0 votes

Si vous avez 2 buffers séparés verticalement, et que vous faites "org-schedule" dans l'un d'entre eux (org) - vous aurez un bug avec le buffer Calendar.

0 votes

@Sergey Quel genre de bug ? Obtenez-vous un comportement différent si vous faites le changement de tampon manuellement après le split, au lieu d'utiliser le code ci-dessus ?

3voto

edam Points 160

De même que la division manuelle du cadre avec C-x 2 o C-x 3 Les tampons sont aussi parfois automatiquement "remontés". Ils ne sont pas non plus sélectionnés/actifs par défaut.

Ce problème peut être résolu en modifiant la fonction utilisée pour diviser une fenêtre. Elle est réglée sur split-window-sensibly par défaut, mais vous pouvez le définir comme votre propre fonction qui appelle split-window-sensibly puis sélectionne le tampon.

Malheureusement, cela a l'effet secondaire de sélectionner l'option *Completions* tampon lorsque vous frappez TAB dans le minibuffer. Cela vaut donc la peine de vérifier si le minibuffer est actif et pas la commutation dans ce cas. Je parie qu'il existe également d'autres scénarios indésirables de ce type. J'essaierai de mettre à jour cet article au fur et à mesure que je les trouverai.

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

(Fonctionne avec Emacs 24.5.1.)

1voto

Nothus Points 336

Mon idée de quand vous voudriez suivre la fenêtre après un split-window était quand il avait le même tampon comme dans le code suivant :

(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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X