emacs: comment revenir à la dernière position après le défilement / la page haut / bas?

14

Après l'émission scroll-upou scroll-downdans emacs, existe-t-il un moyen rapide de ramener le point à sa position précédente (en supposant que je ne me souvienne pas de l'ajouter à l'anneau de marque)?

Sinon, existe-t-il un moyen (sans interférer avec l'anneau de repère) de modifier le comportement de défilement de sorte que le défilement vers le haut puis le défilement vers le bas (ou vice versa) ramène le point à sa position d'origine? (par exemple, faire défiler le point exactement x lignes où x est la hauteur de l'écran)

Je suis en train de m'habituer à emacs et c'est l'une des situations les plus courantes provoquant des malédictions: je fais défiler pour voir une autre partie de mon code sans me souvenir d'ajouter ma ligne à l'anneau de marque et puis c'est pénible d'essayer pour déplacer la ligne de code sur laquelle je travaillais. En tant que tel, alors que je demande une solution technique, je serais également intéressé d'entendre comment les utilisateurs chevronnés évitent ce problème. Vous êtes-vous habitué à vous souvenir de définir une marque, de diviser la fenêtre pour regarder autour ou d'utiliser un autre motif?

Merci

Ian Mackinnon
la source

Réponses:

13
(setq scroll-preserve-screen-position t)

Avec ce paramètre , si vous paginez de haut en bas, le curseur revient à sa ligne d'origine. Il conserve également sa colonne d'origine dans la version 23 ou plus récente d'Emacs.

Vous pouvez ou non préférer

(setq scroll-preserve-screen-position 'always)

qui préserve toujours la position de l'écran du curseur lors du défilement, plutôt que de conserver la position du curseur dans le tampon si la position d'origine est toujours visible.

Gilles 'SO- arrête d'être méchant'
la source
2
Merci de moi aussi! Depuis, (euh beaucoup!) Ans, j'ai tapé "<>" avant de faire défiler, j'ai juste une cible de recherche à laquelle revenir.
JRobert
Pour moi, cela provoque scroll-up-line(ce que j'utilise avec ma molette de défilement) de faire avancer le curseur d'un caractère lorsqu'il atteint le haut ou le bas de l'écran.
asmeurer
@asmeurer Je n'observe pas cela. Il doit y avoir quelque chose de bizarre dans votre fichier init ou un bug dans votre version d'Emacs.
Gilles 'SO- arrête d'être méchant'
Ouais, je l'ai compris après avoir posté ça. J'ai ouvert une nouvelle question sur emacs.stackexchange.com/questions/12439/… .
asmeurer
Je pense que cela devrait l'être (setq scroll-preserve-screen-position 'always). Sinon, C-v M-vne remet pas le point où vous avez commencé. (La deuxième position du point est visible sur le premier écran afin que le point ne recule pas)
Wilfred Hughes
6

Ce que j'ai trouvé fonctionne bien goto-last-change.el, c'est ce qui vous ramène à l'emplacement où vous avez effectué la dernière modification. J'aime la reliure:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)
Trey Jackson
la source
2
De manière équivalente, sans avoir besoin d'un package supplémentaire: C-_ C-f C-_(annuler, déplacer, annuler).
Gilles 'SO- arrête d'être méchant'
1
@Gilles True, mais votre pile d'annulation vient de croître de deux autres éléments. :)
Trey Jackson
1

En réponse à votre question sur la façon dont j'évite le problème que vous décrivez (en regardant ailleurs dans le code et en revenant ensuite au point où je travaillais) ...

En règle générale, je divise l'écran lorsque je dois regarder brièvement ailleurs. Ensuite, je peux revenir à l'écran d'origine avec C-x o, non divisé avec C-x 1et je suis revenu à la normale.

J'utilise également l'i-search avant et arrière pour localiser un point d'intérêt particulier dans le code. Je trouve que c'est un moyen assez efficace de naviguer dans le code lorsque je sais ce que je recherche.

Mox
la source
0

Si je ne fais défiler que quelques lignes de l'endroit où je suis actuellement, je peux l'utiliser pour faire défiler la fenêtre sans déplacer le point:

(defun scroll-in-place (scroll-up)
  "Scroll window up (or down) without moving point (if possible).

SCROLL-Up is non-nil to scroll up one line, nil to scroll down."
  (interactive)
  (let ((pos (point))
        (col (current-column))
        (up-or-down (if scroll-up 1 -1)))
    (scroll-up up-or-down)
    (if (pos-visible-in-window-p pos)
        (goto-char pos)
      (if (or (eq last-command 'next-line)
              (eq last-command 'previous-line))
          (move-to-column temporary-goal-column)
        (move-to-column col)
        (setq temporary-goal-column col))
      (setq this-command 'next-line))))

;;;; ------------------------------------------------------------------------
(defun scroll-up-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place t))

;;;; ------------------------------------------------------------------------
(defun scroll-down-in-place ()
  "Scroll window up without moving point (if possible)."
  (interactive)
  (scroll-in-place nil))

(global-set-key (read-kbd-macro "M-<down>") 'scroll-up-in-place)
(global-set-key (read-kbd-macro "M-<up>") 'scroll-down-in-place)

Si je passe à une section complètement différente d'un fichier (ou à un fichier complètement différent), j'utilise parfois breadcrumbbien qu'il existe de nombreux autres packages qui font des choses similaires.

Si j'ai besoin de voir visuellement deux zones de code en même temps, je diviserai le cadre horizontalement en deux fenêtres, puis je rejetterai la deuxième fenêtre lorsque j'aurai terminé.

Surtout, cependant, j'utilise simplement deux cadres, l'un étant mon cadre de travail actuel et l'autre étant mon cadre de référence, utilisé pour sauter autour du même fichier ou d'autres fichiers.

Joe Casadonte
la source
Si tout ce que vous voulez faire est de voir au-dessus ou en dessous du point actuel sans vous y déplacer, vous pouvez faire un cycle C-l.
asmeurer