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
@asmeurer Я этого не наблюдаю. Должно быть что-то странное в вашем файле инициализации или ошибка в вашей версии Emacs.
Жиль "ТАК - перестань быть злым"
Да, я понял это после того, как опубликовал это. Я открыл новый вопрос на emacs.stackexchange.com/questions/12439/… .
asmeurer
Я думаю, что это должно быть (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