请问如何记录光标位置

IDE里一般都有一个记录光标位置的功能, 在看代码的时候很有用, 请问emacs里如何实现?

没怎么用过 IDE,请问你记录光标位置是要实时显示出来还是其他?不清楚很难提供帮助。

EmacsWiki: Save Place 这个吗?

类似于M-. M-,. 光标的undo-tree

你好,这是必应。我在网上搜索了你的问题,发现了一些可能的答案。在 Emacs 里如何记录光标位置,有几种方法可以实现。一种是使用标记(mark)功能 404 - 知乎 C-SPC (Control + 空格键)来设置或取消一个标记。当你设置了一个标记后,光标移动到别的位置,你可以用 C-x C-x 来交换光标和标记的位置,也就是跳回到你之前设置的位置。如果你想选中从标记到光标之间的文本,你可以用 C-x C-x 再按一次 C-SPC ,这样就会激活区域(region)模式,区域内的文本会高亮显示。

另一种是使用书签(bookmark)功能 404 - 知乎 C-x r m 来设置一个书签,并给它一个名字。当你设置了一个书签后,光标移动到别的位置,你可以用 C-x r b 来跳转到一个已有的书签,输入它的名字即可。你也可以用 C-x r l 来查看所有的书签列表,并选择一个进行跳转。书签的好处是它会保存在文件中,即使你关闭了 Emacs ,下次打开时仍然有效。

还有一种是使用寄存器(register)功能 https://blog.csdn.net/grey_csdn/article/details/79053001。寄存器是一种可以存储不同类型数据的容器,其中一种数据就是光标位置。你可以用 C-x r SPC 来把当前光标位置存储到一个寄存器中,并给它一个字母或数字作为标识。当你存储了一个光标位置后,光标移动到别的位置,你可以用 C-x r j 来跳转到一个已有的寄存器中存储的位置,输入它的标识即可。寄存器的好处是它可以存储多种类型的数据,比如文本、数字、矩形等。

我希望这能帮到你。blush

如何记录,方法不重要,策略才是关键。

  1. 记录函数/窗口跳转?
  2. 记录大幅度的位置变更?
  3. 记录细微的位置变更?
  4. 记录连续密集的位置变更?

记录多了反受其累,记录少了可能不够用。

1 个赞

赞同楼下的说法,策略很重要;我目前没有使用相关的插件,所以也不清楚有没有这样的插件;不过,Emacs 记录的一般的是 marker ,你可以写个函数跳转 marker ,如果效果不是你需要的;那可能需要自己写一个完整功能的插件了。

可能贴主要的就是你说的这个,Neovim 有默认的实现,可以参考 Vim 写一个插件。

Emacs 自带:C-u SPC 可以跳回之前 mark 的地方。
优点:临时回去上次的位置比较方便
缺点:位置不太可控。

我习惯用的插件 GitHub - wolray/symbol-overlay: Highlight symbols with keymap-enabled overlays
优点:与其标记光标位置不如标记上次你关注的“词” ,方便直观
缺点:一下会标记上所有同名的词,回去的时候可能不知道是哪个

确实, 我还没考虑过这个问题, 鼠标操作和键盘操作策略肯定不能一样.

您是否需要 manateelazycat 大佬的小插件? :smile:

(defun remember-init ()
  "记住当前位置."
  (interactive)
  (point-to-register 8)
  (message "Have remember one position"))

(defun remember-jump ()
  "跳转到最后一次的位置."
  (interactive)
  (let ((tmp (point-marker)))
    (jump-to-register 8)
    (set-register 8 tmp))
  (message "Have back to remember position"))
2 个赞

我这么多年,我最喜欢这个插件,因为特别方便

2 个赞

我说另一个思路, 也是我一直用的方法, 不用 mark 或者任何宏包.

当你希望保留当前位置时, 直接 make-frame, 这样旧的 frame 就保留了你之前所在的位置. 当你在新的 frame 里完成要做的事情时, 直接关掉 frame 就回到了旧的 frame 的原始位置, 因为新开的 frame 是直接叠在旧的 frame 上的.

你在新 frame 里需要记住当前位置时, 可以继续 make-frame, 所有新开的 frame 都会按旧到新叠加, 每个 frame 都记住了你 make-frame 的时候想要记住的位置.

4 个赞

学到了 :+1: