emacs: Jak wrócić do ostatniej pozycji po przewinięciu / stronie w górę / w dół?

14

Czy po wydaniu scroll-uplub scroll-downw emacsie istnieje szybki sposób, aby przywrócić punkt do poprzedniej pozycji (zakładając, że nie pamiętam, aby dodać go do znacznika)?

Alternatywnie, czy jest jakiś sposób (bez ingerencji w pierścień znaku), aby zmienić zachowanie przewijania, tak że przewijanie w górę, a następnie przewijanie w dół (lub odwrotnie) przywraca punkt do pierwotnej pozycji? (np. spraw, aby przewijanie przesunęło punkt dokładnie o x linii, gdzie x jest wysokością ekranu)

Jestem w trakcie przyzwyczajania się do emacsa i jest to jedna z najczęstszych sytuacji prowokujących przekleństwo: przewijam się, aby zobaczyć inną część mojego kodu, nie pamiętając o dodaniu mojej linii do pierścienia znaczników, a potem bolesne jest próbowanie aby przenieść linię kodu, nad którą pracowałem. W związku z tym, gdy proszę o rozwiązanie techniczne, chciałbym również dowiedzieć się, jak doświadczeni użytkownicy unikają tego problemu. Czy po prostu przyzwyczajasz się do zapamiętywania, dzielenia okna, rozglądania się lub korzystania z innego wzoru?

Dzięki

Ian Mackinnon
źródło

Odpowiedzi:

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

Przy tym ustawieniu przewijanie strony w górę i w dół powoduje powrót kursora do pierwotnej linii. Zachowuje również swoją oryginalną kolumnę w wersji Emacs 23 lub nowszej.

Możesz lub nie

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

który zawsze zachowuje pozycję ekranu kursora podczas przewijania, zamiast zachowywać pozycję kursora w buforze, jeśli pierwotna pozycja jest nadal widoczna.

Gilles „SO- przestań być zły”
źródło
2
Dziękuję też ode mnie! Przez (umm wiele lat) wpisałem „<>” przed przewijaniem, po prostu mam cel wyszukiwania, do którego można wrócić.
JRobert
Dla mnie powoduje to scroll-up-line(czego używam z moim kółkiem przewijania) powodowanie, że kursor przesuwa się o jeden znak do przodu, gdy uderza on w górę lub w dół ekranu.
asmeurer
@asmeurer Nie obserwuję tego. W twoim pliku init musi być coś dziwnego lub błąd w twojej wersji Emacsa.
Gilles „SO- przestań być zły”
Tak, wymyśliłem to po opublikowaniu tego. Otworzyłam nowe pytanie w emacs.stackexchange.com/questions/12439/... .
asmeurer
Myślę, że tak powinno być (setq scroll-preserve-screen-position 'always). W przeciwnym razie C-v M-vnie przywróci punktu początkowego (druga pozycja punktu jest widoczna na pierwszym ekranie, więc punkt nie przesuwa się).
Wilfred Hughes
6

To, co według mnie działa dobrze, to używanie goto-last-change.el, które powoduje powrót do miejsca, w którym ostatnio dokonałeś edycji. Podoba mi się wiązanie:

(require 'goto-last-change) ;; download this package and install in load-path
(global-set-key (kbd "C-x C-\\") 'goto-last-change)
Trey Jackson
źródło
2
Odpowiednio, bez potrzeby dodatkowego pakietu: C-_ C-f C-_(cofnij, przenieś, cofnij).
Gilles „SO- przestań być zły”
1
@Gilles Prawda, ale wtedy twój stos cofania powiększył się o dwa kolejne elementy. :)
Trey Jackson,
1

W odpowiedzi na twoje pytanie dotyczące tego, jak unikam opisywanego problemu (szukanie gdzie indziej w kodzie, a następnie powrót do punktu, w którym pracowałem) ...

Zazwyczaj dzielę ekran, gdy muszę krótko szukać gdzie indziej. Następnie mogę wrócić do oryginalnego ekranu za pomocą C-x o, nieoświetlony C-x 1i wracam do normy.

Używam także i-search do przodu i do tyłu, aby zlokalizować określony punkt w kodzie. Uważam, że jest to dość wydajny sposób poruszania się po kodzie, gdy wiem, czego szukam.

Mox
źródło
0

Jeśli przewijam tylko kilka linii z miejsca, w którym aktualnie się znajduję, mogę użyć tego do przewijania okna bez przesuwania punktu:

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

Jeśli przechodzę do zupełnie innej sekcji pliku (lub do zupełnie innego pliku), czasami używam, breadcrumbchociaż istnieje wiele innych pakietów, które robią podobne rzeczy.

Jeśli muszę jednocześnie zobaczyć dwa obszary kodu, podzielę ramkę poziomo na dwa okna, a następnie skończę z drugim oknem.

Najczęściej jednak używam tylko dwóch ramek, z których jedna jest moją bieżącą ramką roboczą, a druga ramką referencyjną, używaną do przeskakiwania wokół tego samego lub innych plików.

Joe Casadonte
źródło
Jeśli wszystko, co chcesz zrobić, to widzieć powyżej lub poniżej bieżącego punktu bez przemieszczania się tam, możesz jeździć na rowerze C-l.
asmeurer
0

Pakiet przywracania punktów wykonuje dokładnie to, co opisano, po wyjęciu z pudełka.

Sprawdza, czy zestaw (konfigurowalnych) poleceń został wykonany (domyślnie zaznacza polecenia, przewija i przewija w górę / w dół), a następnie pozwala powrócić do poprzedniej pozycji punktu (kursora), naciskając keyboard-quit, zwykle związany z C-glub ESC.

Uwaga: Jestem autorem tego pakietu.

Arthur Colombini Gusmão
źródło