Skip to content

Peek [简体中文版]

Jerry edited this page Jul 23, 2023 · 3 revisions

如何使用 lsp-bridge-peek?

lsp-bridge-peek

基本用法

lsp-bridge-peek 的基本用法是在不离开当前缓冲区的情况下阅读符号的定义和引用。这在阅读和编写代码时经常非常有帮助。

在一个 symbol 上输入 M-x lsp-bridge-peek,可以查看其定义和引用。一个预览窗口将在当前行的下方下打开,并跟随光标移动。您可以使用以下按键在预览窗口中浏览:

  • M-nM-p:下一行/上一行。
  • M-NM-P:下一个/上一个定义或引用。
  • M-l j:跳转到定义或引用。
  • M-l b:返回到 lsp-bridge-peek-jump 之前的位置。
  • C-g:关闭预览窗口。 这些按键是在 lsp-bridge-peek-keymap 中定义的,你可以自行设置。

更高级的用法:lsp-bridge-peek-symbol-tree

在阅读定义或引用时,我们经常发现它调用了另一个函数,并且我们也对该函数的定义和引用感兴趣。使用传统的代码阅读工具,我们很快就会在许多 buffer 中迷失方向。

在 lsp-bridge-peek 中这不是一个问题。在预览会话中,只需输入 M-x lsp-bridge-peek-through(你可以把它绑定到任何你喜欢的键),此时预览窗口中的每个 symbol 的开头将附加一个 ACE 字符串,然后您就知道该怎么做了 :) 只需键入它以查看该符号的定义和引用,内容仍然显示在刚刚那个预览窗口中。

多次执行此操作,你 peek 的历史记录将显示在预览窗口的底部,如下所示:

func1 -> func2 -> [func3]

您可以键入 <left><right> 在历史记录中移动。现在回到 func2,历史记录就变成了:

func1 -> [func2] -> func3

此时,您可以再次浏览 `func2 的定义和引用。

如果现在我们 peek through func4,历史记录将变为:

func1 -> func2 < [func4]

< 表示您在此处创建了一个分支。当前分支是 func4,而另一个分支是 func3。你可以通过键入 <up>/<down> 在分支之间切换。恭喜!您刚刚学会了一种浏览树状代码阅读历史的最有效方法。

实现 lsp-bridge-avy-peek

代码如下:

(require 'avy)

(defun lsp-bridge-avy-peek ()
  "Peek any symbol in the file by avy jump."
  (interactive)
  (setq lsp-bridge-peek-ace-list (make-list 5 nil))
  (setf (nth 1 lsp-bridge-peek-ace-list) (point))
  (setf (nth 2 lsp-bridge-peek-ace-list) (buffer-name))
  (save-excursion
    (call-interactively 'avy-goto-word-0)
    (lsp-bridge-peek)
    (setf (nth 3 lsp-bridge-peek-ace-list) (buffer-name))
    (setf (nth 4 lsp-bridge-peek-ace-list) (point))))

事实上,你可以把 (call-interactively 'avy-goto-word-0) 中的 avy-goto-word-0 换成任何你喜欢的跳转函数,如avy-goto-charavy-goto-char-2,当然,如果你喜欢ace,把函数换成ace的跳转类型也可以😉,只不过要记得更改 require

lsp-bridge-peeklsp-bridge-find-references 的区别?

你可曾经历过在读代码时独自对着一长串的buffer-list独自凌乱?你可曾在众多buffer中跳转试图找回自己刚刚看的那个?你可曾面对着许多要删除的buffer心力交瘁?

不用担心,lsp-bridge-peek 就不会有这个问题。一切浏览都只在专门的 peek window 中发生,当你查看完毕,只需一个 C-g,顿时鸟鸣啾啾、流水潺潺、云淡风轻,你的工作环境仍然是那幅可爱的模样(笑

而且,lsp-bridge-peek 会记录下来你查看的历史记录,你可以在这之中自由地跳转,而不用耗费脑筋去记住刚刚看到了哪个 symbol,减少了用户花在管理buffer和工作环境上的时间,有效减轻了大脑负担。

综上,我认为 lsp-bridge-peek 是一个致力于让用户读代码更加轻松方便的工具。

当然,我并不是在比较 lsp-bridge-peeklsp-bridge-find-references 的优劣。lsp-bridge-find-references 是一个极其强大的代码重构工具,在调整代码时能发挥的作用是 lsp-bridge-peek 望尘莫及的。lsp-bridge-peeklsp-bridge-find-references 是近乎完全不同的工具,它们能够在最适合自己的情况下发挥出奇效。所以,具体使用哪一个工具应当看您当时的需求,不要让工具束缚住了自己,just 从心而为😉