emacs: come tornare all'ultima posizione dopo lo scorrimento / pagina su / giù?


14

Dopo l'emissione scroll-upo scroll-downin emacs, c'è un modo rapido per riportare il punto nella sua posizione precedente (supponendo che non mi ricordassi di aggiungerlo all'anello dei segni)?

In alternativa, esiste un modo (senza interferire con l'anello di marcatura) per modificare il comportamento di scorrimento in modo che lo scorrimento verso l'alto e quindi verso il basso (o viceversa) ritorni il punto nella posizione originale? (ad es. fare scorrere spostando il punto esattamente x linee dove x è l'altezza dello schermo)

Sono in procinto di abituarmi a emacs e questa è una delle situazioni più comuni che provocano la maledizione: scorro in giro per visualizzare un'altra parte del mio codice senza ricordare di aggiungere la mia linea al mark ring e quindi è doloroso provare per spostare la riga di codice su cui stavo lavorando. Come tale, mentre sto chiedendo una soluzione tecnica, sarei anche interessato a sentire come gli utenti esperti evitano questo problema. Ti sei semplicemente abituato a ricordare di impostare un segno, dividere la finestra per guardarti intorno o usare qualche altro motivo?

Grazie

Risposte:


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

Con questa impostazione , se si esegue la pagina su e giù, il cursore torna alla sua linea originale. Mantiene anche la sua colonna originale in Emacs versione 23 o successiva.

È possibile o meno preferire

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

che conserva sempre la posizione dello schermo del cursore durante lo scorrimento, piuttosto che preservare la posizione del cursore nel buffer se la posizione originale è ancora visibile.


2
Grazie anche a me! Per, (umm many!) Anni, ho digitato "<>" prima di andare in giro, basta avere un obiettivo di ricerca su cui tornare.
JRobert,

Per me questo causa scroll-up-line(che è quello che uso con la mia rotella di scorrimento) per indurre il cursore a spostarsi in avanti di un carattere quando colpisce la parte superiore o inferiore dello schermo.
asmeurer,

@asmeurer Non lo osservo. Ci deve essere qualcosa di strano nel tuo file init o un bug nella tua versione di Emacs.
Gilles 'SO- smetti di essere malvagio'

Sì, l'ho capito dopo aver pubblicato questo. Ho aperto una nuova domanda su emacs.stackexchange.com/questions/12439/… .
asmeurer,

Penso che dovrebbe essere (setq scroll-preserve-screen-position 'always). In caso contrario, C-v M-vnon mette il punto dove avete iniziato (la seconda posizione del punto è visibile sulla prima schermata in modo da punto non si muove indietro.).
Wilfred Hughes

6

Quello che ho trovato per funzionare bene è usare goto-last-change.el, che ti riporta alla posizione in cui hai effettuato l'ultima modifica. Mi piace la rilegatura:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)

2
Equivalentemente, senza la necessità di un pacchetto aggiuntivo: C-_ C-f C-_(annulla, sposta, annulla).
Gilles 'SO- smetti di essere malvagio' il

1
@Gilles True, ma il tuo stack di annullamento è appena cresciuto di altri due elementi. :)
Trey Jackson,

1

In risposta alla tua domanda su come evito il problema che descrivi (guardando altrove nel codice e poi tornando al punto in cui stavo lavorando) ...

In genere, dividerò lo schermo quando dovrò guardare brevemente altrove. Quindi posso tornare alla schermata originale con C-x o, non diviso con C-x 1e sono tornato alla normalità.

Uso anche i-search in avanti e indietro per individuare un particolare punto di interesse nel codice. Trovo che sia un modo abbastanza efficiente per navigare nel codice quando so cosa sto cercando.


0

Se sto solo scorrendo alcune righe da dove mi trovo attualmente, posso usarlo per scorrere la finestra senza spostare il 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)

Se mi sposto in una sezione completamente diversa di un file (o in un file completamente diverso), a volte uso breadcrumbanche se ci sono molti altri pacchetti che fanno cose simili.

Se ho bisogno di vedere visivamente due aree di codice allo stesso tempo, dividerò il frame orizzontalmente in due finestre e dopo avrò scartato la seconda finestra.

Principalmente, però, uso solo due frame, uno è il mio attuale frame di lavoro e l'altro è il mio frame di riferimento, usato per saltare gli stessi file o altri file.


Se tutto ciò che vuoi fare è vedere sopra o sotto il punto corrente senza spostarti lì, puoi andare in bicicletta C-l.
asmeurer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.