函数跳转之后的位置如何改变

兄弟们,emacs在各种函数跳转的时候,很多时候跳的地方是在屏幕的最下方,有什么标志可以控制这个跳转的位置的呀?再更智能些的,如果是首次跳转,如果它在最下方就让它到中间的位置,如果不是首次跳,或者说它在屏幕中位置已经被我改变过,就保留原来的位置。想请教各位有什么方法可以控制

内置的 pulse

举个例:

(defun my-recenter-and-pulse-line (&rest _)
      "Recenter and pulse the current line."
      (recenter)
      (pulse-momentary-highlight-one-line (point)))

这样可以定位到中间:

(add-hook 'xref-after-jump-hook #'recenter)

多谢各位回复,我会一一尝试一下,然后看看效果。

我试了这个方案,但发现只有一部份能跳,我用counsel-etags相关的命令就没有效果。如果需要拦截所有的跳转我应该在哪hook,还有就是希望它只在第一次访问的时候跳,如果之后再打开同一个buffer,就应该回到之前的位置。我感觉我的这个场景还是有点复杂的,没有各位想的那么简单 :grinning:

试了一下你说的场景,如果是跳转到某个函数,这个函数会处于屏幕中间,这时候向下移动几行,然后切到其它buffer再切回来,位置还是移动到的那行

如果是这样,我发现是可以复现你说的操作的,但我并没有什么特殊的配置,xref-after-jump-hook 是默认的 (recenter xref-pulse-momentarily)

之前我的scroll-conservatively是0,不用操心recenter的问题,缺点是滚动到最下面之后光标会跳到屏幕中间。后来改成了999就不会跳了(即smooth scrolling),但各种命令都要自己加recenter。

给所有需要的命令加上advice,advice内容为,如果跳到的位置已经在可视区域,就不recenter,否则recenter

;; when `scroll-conservatively' is 0, recenter happens automatically, not when 999
(add-hook 'counsel-grep-post-action-hook 'recenter)

;; learned from `swiper--maybe-recenter', yay!
(defun jester/maybe-recenter (orig-fun &rest args)
  "If point moved out of the original (before ORIG-FUN runs) window, recenter."
  (let ((prev-window-start (window-start))
        (prev-window-end (window-end)))
    (apply orig-fun args)
    (when (or
           (< (point) prev-window-start)
           (> (point) prev-window-end))
      (recenter))))

(dolist (command '(xref-pop-marker-stack
                   evil-goto-mark evil-goto-last-change evil-goto-last-change-reverse evil-goto-line
                   evil-search-next evil-search-previous
                   ;; backward-up-list up-list ; used by some idle timer, causing my point bouncing everywhere!
                   evilmi-jump-items
                   symbol-overlay-jump-next symbol-overlay-jump-prev
                   flycheck-next-error flycheck-previous-error
                   magit-diff-visit-file
                   jester/recent-symbol))
  (advice-add command :around 'jester/maybe-recenter))

标题不太清楚,建议改成“跳转之后如何智能recenter”

不复杂,参考这个看看是否满足需求。

我用的是 ideasman42/emacs-scroll-on-jump: Smooth scrolling on cursor motion. - emacs-scroll-on-jump - Codeberg.org 参考配置

(use-package scroll-on-jump
  :config
  (setq scroll-on-jump-duration 0.0)
  (setq scroll-on-jump-smooth nil)
  (scroll-on-jump-advice-add push-button)
  (scroll-on-jump-advice-add embark-next-symbol)
  (scroll-on-jump-advice-add embark-previous-symbol)
  )

非常感谢各位解答,目前暂时采用的是0128的方案。感觉不错,先使用一段时间看看。

1 个赞