如何防止emacs在滚动页面时改变光标位置

问题描述 投票:0回答:2

emacs 中有这种烦人的行为,我不知道如何摆脱它。

假设当前光标位置位于第 10 行第 15 列。

现在我需要快速查找同一缓冲区下方的某些内容,我向下滚动到该位置,当我向下(或向上)滚动时,光标不断移动,并且它失去了原来的位置。

很多人建议在滚动之前设置一个标记,但这不是一个好的解决方案,因为你必须在滚动之前始终牢记这一事实(这是不可能的)

我知道应该有一个简单的解决方案,但我还没有找到。 我会很感激你的建议

scroll emacs text-cursor preserve
2个回答
1
投票

据我所知,Emacs 不允许你以让你的点消失的方式滚动。我只是快速浏览了一下

xdisp.c
,看起来这是 C 代码中的基本假设。这与一些最新的编辑器(Sublime Text、VSCode 等)不同。

不过,你说的“很多人”其实也有一定道理。如果您通过搜索 (

C-s the-thing-im-looking-for
) 来浏览文件,那么 Emacs 会自动为您设置一个标记。

我想你可以尝试添加一个钩子,在你滚动时在该点设置一个标记?这并不是一件小事,因为您必须处理诸如在滚动向下拖动光标时不通过文件设置大量标记之类的事情。但我的建议可能是改变您的工作流程以匹配 Emacs 想要做事的方式。在这种情况下,这可能是比听起来您习惯的现代编辑器更好的方法。


0
投票

一个可能有用也可能没用的选项是

scroll-preserve-screen-position
。描述有点难以理解,但最终结果是,如果您主要使用
C-v/M-v
进行滚动,则该点将视觉上 停留在屏幕上的同一位置(因此,如果您执行 例如
C-v C-v M-v M-v
,则点将回到原来的位置。

但是,请注意,许多命令在跳转之前都会按下标记:

isearch
end-of-buffer
imenu
xref-find-definition
...在所有这些情况下,您都可以按
C-u C-SPC
(与您用来设置标记但使用前缀参数调用)来弹出标记(具体来说,跳转到最后一个标记)。如果需要多次跳回,可以将变量
set-mark-command-repeat-pop
设置为
t
,这样只需执行一次
C-u
,然后重复按
C-SPC
,即可从标记中弹出越来越多的标记响了。

一般来说,有比随意滚动更好的方法来导航缓冲区;您确实需要从“您当前”点开始滚动的情况非常罕见(或者应该/可能......),以至于您事先知道您将花费很长时间“环顾四周”缓冲。然后设置一个标记,在其他地方做你的事情,然后

C-u <mash C-SPC as often as needed>
直到你回到你的初始点。

© www.soinside.com 2019 - 2024. All rights reserved.