emacs: ¿Cómo volver a la última posición después de desplazarse / subir / bajar página?

14

Después de emitir scroll-upo scroll-downen emacs, ¿hay una forma rápida de devolver el punto a su posición anterior (suponiendo que no recordara agregarlo al anillo de marca)?

Alternativamente, ¿hay alguna manera (sin interferir con el anillo de la marca) para alterar el comportamiento de desplazamiento para que el desplazamiento hacia arriba y hacia abajo (o viceversa) devuelva el punto a su posición original? (por ejemplo, haga que el desplazamiento mueva el punto exactamente x líneas donde x es la altura de la pantalla)

Estoy en el proceso de acostumbrarme a emacs y esta es una de las situaciones más comunes que provocan maldiciones: me desplazo para ver otra parte de mi código sin recordar agregar mi línea al anillo de marcas y luego es doloroso intentarlo para reubicar la línea de código en la que estaba trabajando. Como tal, mientras solicito una solución técnica, también me interesaría saber cómo los usuarios experimentados evitan este problema. ¿Te acostumbras a recordar establecer una marca, dividir la ventana para mirar alrededor o usar algún otro patrón?

Gracias

Ian Mackinnon
fuente

Respuestas:

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

Con esta configuración , si sube y baja la página, el cursor vuelve a su línea original. También conserva su columna original en Emacs versión 23 o posterior.

Puedes o no preferir

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

que siempre conserva la posición de la pantalla del cursor al desplazarse, en lugar de preservar la posición del cursor en el búfer si la posición original aún es visible.

Gilles 'SO- deja de ser malvado'
fuente
2
Gracias de mi parte también! Durante (¡umm muchos!) Años, he escrito "<>" antes de desplazarme, solo tengo un objetivo de búsqueda al que volver.
JRobert
Para mí, esto hace scroll-up-line(que es lo que uso con mi rueda de desplazamiento) que el cursor avance un carácter cuando toca la parte superior o inferior de la pantalla.
asmeurer
@asmeurer No observo esto. Debe haber algo extraño en su archivo init o un error en su versión de Emacs.
Gilles 'SO- deja de ser malvado'
Sí, lo descubrí después de publicar esto. Abrí una nueva pregunta en emacs.stackexchange.com/questions/12439/… .
asmeurer
Creo que esto debería ser (setq scroll-preserve-screen-position 'always). De lo contrario, C-v M-vno pone el punto donde comenzó. (La posición del segundo punto es visible en la primera pantalla para que el punto no retroceda).
Wilfred Hughes
6

Lo que he encontrado que funciona bien es el uso goto-last-change.el, que lo lleva de vuelta a la ubicación donde realizó la última edición. Me gusta la encuadernación:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)
Trey Jackson
fuente
2
De manera equivalente, sin la necesidad de un paquete adicional: C-_ C-f C-_(deshacer, mover, deshacer).
Gilles 'SO- deja de ser malvado'
1
@Gilles True, pero luego tu pila de deshacer creció en dos elementos más. :)
Trey Jackson
1

En respuesta a su pregunta sobre cómo evito el problema que describe (buscando en otra parte del código y luego volviendo al punto en el que estaba trabajando) ...

Por lo general, dividiré la pantalla cuando necesite buscar brevemente en otro lado. Luego puedo volver a la pantalla original con C-x o, sin dividir C-x 1y vuelvo a la normalidad.

También utilizo i-search hacia adelante y hacia atrás para localizar un punto de interés particular en el código. Creo que es una forma bastante eficiente de navegar por el código cuando sé lo que estoy buscando.

Mox
fuente
0

Si solo estoy desplazando unas pocas líneas desde donde estoy actualmente, puedo usar esto para desplazar la ventana sin mover el punto:

(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 me estoy mudando a una sección completamente diferente de un archivo (o a un archivo completamente diferente), a veces lo uso, breadcrumbaunque hay muchos otros paquetes que hacen cosas similares.

Si necesito ver visualmente dos áreas de código al mismo tiempo, dividiré el marco horizontalmente en dos ventanas y luego descartaré la segunda ventana cuando termine.

Sin embargo, en su mayoría, solo uso dos cuadros, uno es mi cuadro de trabajo actual y el otro es mi cuadro de referencia, usado para saltar alrededor del mismo u otros archivos.

Joe Casadonte
fuente
Si todo lo que quiere hacer es ver arriba o abajo del punto actual sin moverse allí, puede desplazarse C-l.
asmeurer