发现一个有趣的包:dogears 自动记录光标位置

Dogears.el 是一个 Emacs 库,旨在自动记住用户在缓冲区中访问过的位置,方便用户返回类似于浏览器历史记录的功能。它提供了导航后退、前进或列出记住位置的命令,并支持各种 Emacs 完成框架。Dogears 使用 Emacs 内置的书签库,但维护一个单独的列表,且不会在会话间保留。

简单来说就是自动记录光标的历史位置。


大多数现代编辑器都将光标和页面滚动解耦了,因此在使用其他编辑器阅读代码时,我可以用鼠标拖滚动条跳到某个位置读代码(而不影响光标位置),然后随意按一个按键移动光标就能跳回光标所在处:

录屏2024-08-06 22.40.59

这个功能在阅读长代码的时候很好用。

而 Emacs 在设计上有一个缺陷:翻页是靠光标上下移动完成的,用户想要翻页就必须移动光标。因此我在 Emacs 里就无法完成上述的操作,必须要靠 bookmarks 之类的东西手动记录位置,有额外的操作负担。

Dogears.el 差不多就解决了这个问题,并且更加强大,它:

  1. 能设置 idle 自动记录光标位置
  2. 能利用 advice 和 hooks 自动触发记录光标位置
  3. 会把所有历史记录组织成一个 list,而不只是一次的记录,并且能索引或者用快捷键直接前后跳转
  4. logo 是狗狗很可爱

顺便在 VSCode 里面也有这个功能:

在 Emacs 里面利用这个包可以将历史记录组织成一个 list,用起来更方便了:


分享一下我用的配置

(use-package dogears
  :straight t
  :hook (after-init . dogears-mode)
  :bind (:map global-map
              ("M-g d" . dogears-go)
              ("M-g M-b" . dogears-back)
              ("M-g M-f" . dogears-forward)
              ("M-g M-d" . dogears-list)
              ("M-g M-D" . dogears-sidebar))
  :config
  (setq dogears-idle 1
        dogears-limit 200
        dogears-position-delta 20)
  (setq dogears-functions '(find-file recenter-top-bottom
                                      other-window switch-to-buffer
                                      aw-select toggle-window-split
                                      windmove-do-window-select
                                      pager-page-down pager-page-up
                                      tab-bar-select-tab
                                      pop-to-mark-command
                                      pop-global-mark
                                      goto-last-change
                                      xref-go-back
                                      xref-find-definitions
                                      xref-find-references)))
17 个赞

看起来很不错!

可否分享一下,其相对比 evil-jumps 以及 better-jumper,在使用上有什么杀手级特性吗?

看起来不错,能说一下使用场景吗?

感觉很有用,但是不知道哪种场景下用会比较舒服?

set-mark-command 有什么区别吗?

vim内置有类似的功能,跳转回之前位置,如果不用evil,在Emacs上一直没找到替代的方案,感觉这个插件可以实现,感谢你的分享。另外,你的字体和主题搭配起来感觉很舒服,请问你愿意分享一下吗?

@Deeson @douo 按照一定时间间隔自动记录 jump 的位置,不用手动设置,而且和 mark list 是独立的

字体:Sarasa Gothic 主题:nord

1 个赞

其实算是一个小众的需求,它有点像一个 timeline,能记录光标所有到过的位置。

我有时候写到一半会半路切走读库源码/其他模块的代码(或者有可能是同一个文件的其他位置),这个时候如果没有下意识保存当前的位置,那就需要一番查找。这个包会后台悄咪咪记录所有位置,我想切换去的时候只要无脑 M-g M-b 和 M-g M-f 就行了。

@Roife mark ring 也是自动的,一直用默认的 C-u C-SPC 跳回上一个编辑点。不过逻辑是 buffer-level 的。不能垮 buffer 跳。

C-x C-SPC 是跨buffer的,这两个日常足够使用了

1 个赞

用consult的话还有 consult-mark consult-global-mark 可以有预览

2 个赞

赞一个,感谢分享!已经用上。希望有更多的类似帖子。

在WebStorm里也有类似的快捷功能:“recent location”

功能是快速列出最近查看过的代码位置,并且支持跨文件跳转

唤起方法是command + shift + E

1 个赞

这个需求目前看还是很常见的,source insight 以及 VSCode (Alt + 方向键) 都有实现;阅读大型项目时,查看了某个函数调用流程, 然后一级一级返回到上一层位置,继续向下查看;

这个也可以通过 xref 来实现其实