兄弟们,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,就应该回到之前的位置。我感觉我的这个场景还是有点复杂的,没有各位想的那么简单
试了一下你说的场景,如果是跳转到某个函数,这个函数会处于屏幕中间,这时候向下移动几行,然后切到其它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”
不复杂,参考这个看看是否满足需求。
(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 个赞