13

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

В качестве альтернативы есть ли способ (не мешая кольцу меток) изменить поведение прокрутки, чтобы прокрутка вверх, а затем прокрутка вниз (или наоборот) вернула точку в исходное положение? (например, заставить прокрутку перемещать точку ровно на x строк, где x - высота экрана)

Я нахожусь в процессе приучения к emacs, и это одна из самых распространенных провоцирующих проклятие ситуаций: я прокручиваю, чтобы просмотреть другую часть своего кода, не забывая добавить свою строку в кольцо меток, и тогда мне больно пытаться переместить строку кода, над которой я работал. Поэтому, пока я прошу о техническом решении, мне также было бы интересно услышать, как опытные пользователи избегают этой проблемы. Вы просто привыкли помнить, чтобы установить метку, разбить окно, чтобы осмотреться или использовать какой-то другой шаблон?

Спасибо

4 ответа4

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

С этим параметром, если вы перемещаетесь вверх и вниз, курсор возвращается к своей исходной строке. Он также сохраняет свой исходный столбец в Emacs версии 23 или новее.

Вы можете или не можете предпочесть

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

который всегда сохраняет позицию экрана курсора при прокрутке, а не сохраняет позицию курсора в буфере, если исходная позиция все еще видна.

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)
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 хотя есть много других пакетов, которые делают подобные вещи.

Если мне нужно визуально увидеть две области кода одновременно, я разделю фрейм по горизонтали на два окна, а затем откажусь от второго окна, когда я закончу.

В основном, тем не менее, я просто использую два фрейма, один из которых является моим текущим рабочим фреймом, а другой - моим опорным фреймом, используемым для перемещения по тем же или другим файлам.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .