emacs: Як повернутися до останньої позиції після прокрутки / сторінки вгору / вниз?


14

Після видачі scroll-upабо scroll-downв emacs, чи є швидкий спосіб повернути точку у попереднє положення (якщо припустити, що я не пам’ятав додати її до кільця позначки)?

Альтернативно, чи є спосіб (не заважаючи кільцю відмітки) змінити поведінку прокрутки, щоб прокрутка вгору та прокрутка вниз (або навпаки) повернула крапку у вихідне положення? (наприклад, змушуйте прокручувати переміщення точки точно на x лінії, де x - висота екрана)

Я зараз звикаю до emacs, і це одна з найпоширеніших ситуацій, що провокують прокляття: я прокручую, щоб переглянути іншу частину свого коду, не пам'ятаючи, щоб додати мою лінію до кільця позначки, і тоді болісно намагатися щоб перенести рядок коду, над яким я працював. Тому я прошу технічне рішення, але мені також цікаво почути, як досвідчені користувачі уникають цієї проблеми. Ви просто звикаєте до запам'ятовування, щоб встановити позначку, розділити вікно, щоб озирнутися або використовувати якийсь інший візерунок?

Спасибі

Відповіді:


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

За допомогою цього параметра , якщо ви переходите на сторінку вгору та вниз, курсор повертається до початкового рядка. Він також зберігає свою оригінальну колонку в Emacs версії 23 або новішої.

Ви можете чи не бажаєте

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

який завжди зберігає положення екрана курсора під час прокрутки, а не зберігає положення курсору в буфері, якщо вихідне положення все ще видно.


2
Дякую і мені! Протягом (гмм багато!) Років я набрав "<>", перш ніж прокручувати, просто маю пошукову ціль, до якої потрібно повернутися.
JRobert

Для мене це спричиняє scroll-up-line(що я використовую зі своїм колесом прокрутки), щоб змусити курсор рухатися вперед на один символ, коли він потрапляє вгору або внизу екрана.
асмеурер

@asmeurer Я цього не спостерігаю. У вашому файлі init повинно бути щось дивне або помилка у вашій версії Emacs.
Жиль "ТАК - перестань бути злим"

Так, я зрозумів це після того, як опублікував це. Я відкрив нове запитання на emacs.stackexchange.com/questions/12439/… .
асмеурер

Я думаю, що це має бути (setq scroll-preserve-screen-position 'always). В іншому випадку C-v M-vне ставиться крапка назад, де ви почали. (Друга позиція точки видно на першому екрані, тому точка не рухається назад.)
Вільфред Х'юз

6

Те, про що я добре працюю, використовує те goto-last-change.el, що повертається до місця, де ви востаннє редагували. Мені подобається палітурка:

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

2
Рівно, без необхідності додаткового пакету: C-_ C-f C-_(скасувати, перемістити, скасувати).
Жил "ТАК - перестань бути злим"

1
@Gilles Щоправда, але тоді ваш стек скасування просто виріс ще на два елементи. :)
Трей Джексон

1

У відповідь на ваше запитання про те, як я уникаю описаної вами проблеми (шукаю в іншому місці коду, а потім повертаюся до того, де я працював) ...

Зазвичай я розділяю екран, коли мені потрібно коротко подивитися в іншому місці. Тоді я можу повернутися до початкового екрана за допомогою C-x o, не розклеєного C-x 1і повернувшись до нормального.

Я також використовую прямий і зворотний i-search, щоб знайти певну точку інтересу в коді. Я вважаю, що це досить ефективний спосіб навігації коду, коли я знаю, що шукаю.


0

Якщо я прокручую лише кілька рядків від місця, де зараз перебуваю, я можу використовувати це для прокрутки вікна без руху точки:

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

Якщо я переходжу до зовсім іншого розділу файлу (або зовсім до іншого файлу), я іноді використовую, breadcrumbхоча є багато інших пакетів, які роблять подібні речі.

Якщо мені потрібно візуально побачити дві області коду одночасно, я розділяю кадр горизонтально на два вікна, а потім відкину друге вікно, коли закінчу.

В основному, я просто використовую два кадри, один - це мій поточний робочий кадр, а другий - мій опорний кадр, який використовується для стрибків навколо тих самих чи інших файлів.


Якщо все, що ви хочете зробити, це побачити вище або нижче поточної точки, не рухаючись туди, ви можете проїхати на велосипеді C-l.
asmeurer

0

Точка відновлення пакета робить саме те, що ви описали, поза коробкою.

Він перевіряє, чи виконувались набір команд (що можна настроювати) (за замовчуванням - команди для позначки, прокручування та перегляд сторінки / вгору), а потім дозволяє повернутися до попереднього положення (курсору) шляхом натискання keyboard-quit, як правило, пов'язаного з C-gабо ESC.

Відмова: Я є автором цього пакету.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.