emacs:滚动/向上/向下滚动后如何返回到最后一个位置?


14

发行后scroll-upscroll-down在emacs中,有没有一种快速的方法可以将点恢复到先前的位置(假设我不记得将其添加到标记环中)?

或者,是否有任何方法(不干扰标记环)更改滚动行为,以便先滚动然后滚动(反之亦然),将点恢复到其原始位置?(例如,使滚动点精确地移动到x线,其中x是屏幕高度)

我正在习惯于emacs,这是最常见的发人深省的情况之一:我四处滚动以查看代码的另一部分,而不必记得将行添加到标记环中,然后尝试就很痛苦重新定位我正在处理的代码行。因此,在我寻求技术解决方案的同时,我也很想听听经验丰富的用户如何避免此问题。您是否只是习惯于记住要设置标记,拆分窗口以四处查看或使用其他样式?

谢谢

Answers:


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

使用此设置,如果您上下翻页,光标将返回其原始行。它还将其原始列保留在Emacs 23版或更高版本中。

您可能会或可能不会

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

滚动时始终保留光标的屏幕位置,而不是在仍然可见的情况下将光标位置保留在缓冲区中。


2
也谢谢我!已有(很多年了)年,在滚动浏览之前,我输入了“ <>”,只是有一个搜索目标返回。
JRobert

对我来说,这会导致scroll-up-line(这与我的滚轮一起使用)导致光标到达屏幕顶部或底部时向前移动一个字符。
asmeurer

@asmeurer我没有观察到。您的init文件中肯定有些奇怪,或者您的Emacs版本中存在错误。
吉尔(Gilles)'所以

是的,我在发布此信息后就知道了。我在emacs.stackexchange.com/questions/12439/…提出了一个新问题。
asmeurer,2015年

我认为应该是这样(setq scroll-preserve-screen-position 'always)。否则,C-v M-v请勿将指针放回起点。(第二个位置在第一个屏幕上可见,因此该指针不会后退。)
Wilfred Hughes


1

在回答有关如何避免描述的问题的问题时(在代码的其他地方查找,然后返回到我正在工作的地方)...

通常,当我需要在其他地方短暂浏览时,会拆分屏幕。然后,我可以使用C-x o,不拆分时返回到原始屏幕,C-x 1然后恢复正常。

我还使用正向和反向i搜索在代码中找到特定的兴趣点。当我知道要查找的内容时,我发现这是一种导航代码的有效方法。


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 2014年

0

软件包还原点完全按照您的描述进行操作,即开即用。

它检查是否执行了一组(可配置的)命令(默认情况下,标记命令,滚动和上翻/下翻页),然后通过单击keyboard-quit(通常绑定到C-g或)使您返回到上一个点(光标)ESC

免责声明:我是该软件包的作者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.