emacs代码导航

下面的 emacs的代码导航,各位可以参考。我日常开发的项目基本上够用了。其中有些快捷键是默认的,有些是自定义的,如果不习惯,可以根据自己需要重新定义。

我把我的emacs的安装目录上传到了:giteegithub。可以直接作为.emacs.d。emacs 28 29 都可以。

网上代码搜索

这里可以直接搜索代码,但我没怎么用过。 grep.appsourcegraph

项目的文件查找

  • 可以用emacs之外的命令行工具

    fd、find、locate、which

  • emacs中可以用helm-projectile

最常用的就是helm-projectile-find-file C-c p f 查找文件。 比如模糊定位文件"plugin/reassemble/app_smtp.c":

C-c p f 之后直接输入smtp.c,这时候再按一个空格就定位到了。

要递进定位。那么按:

plug 空格 reas 空格 smtp

这样在一堆文件中,你不需要在列表中逐个查找,可以通过模糊搜索快速定位文件,打开文件。其余的命令还有:

helm-projectile-find-file-dwim

helm-projectile-find-dir

helm-projectile-recentf

这些命令都可以通过C-c p 弹出菜单找到,菜单中也有各自的快捷键。

代码导航

global

global可以生成gtags,让emacs根据索引文件查找代码。配合helm-gtags使用更方便。需要首先在代码目录下执行gtags生成索引文件。然后才能查找。比如:

  • 跳转到定义:

helm-gtags-dwim M-.

  • 查找函数或变量的被引用位置:

helm-gtags-find-rtag M-r

  • 跳转之后返回:

helm-gtags-pop-stack M-,

  • 项目范围内查找

helm-gtags-select C-c h

lsp

global对c语言支持足够了,而且安装简单依赖少。但现在lsp更好一些。而且支持更多语言。有些新的语言global的索引方式跳转起来已经不那么好使了。

  • 跳转到光标所在处定义

xref-find-definitions M-.

  • 查找光标所在处的引用

lsp-find-references M-r

  • 跳转之后返回

xref-go-back M-,

  • buffer内查找函数和变量

helm-imenu C-c i

lsp-ui-imenu M-j 没有模糊查询

lsp-treemacs-symbols C-c C-c S 没模糊查询

  • 整个项目内查找函数和变量

helm-lsp-workspace-symbol C-c x i

  • 整个项目内查找引用

lsp-find-references M-r

lsp-treemacs-references

lsp-ui-peek-find-references C-c C-p r

  • 函数调用级别

lsp-treemacs-call-hierarchy C-c C-c h

  • buffer内跳转返回

在用imenu 跳转到一个位置后,C-u C-SPC 会返回跳转之前的位置。仅限于本buffer中用imenu的方式 临时标记一个位置C-SPC,移动到其他位置之后也可以用C-u C-SPC跳回来。如果标记多个,可以倒叙返回。也仅限于本buffer

查找关键字

  • buffer中查找关键字

isearch C-s

此外M-s 菜单中还有isearch系列搜索

  • 更快速地在当前buffer查找关键字:

helm-occur C-c o 或 C-x c M-s o 实时交互

occur M-s o 列出关键字的完整列表,同时可以预览。但在执行命令时,不会自动填充关键字

  • 高亮buffer中的关键字

isearch C-s

isearch-forward-symbol-at-point M-s . 光标所在当前的thing(不管是否在开头)比C-s稍快,而且是基于语法的变量

isearch-forward-thing-at-point M-s M-. 光标所在当前的thing(不管是否在开头)比C-s稍快 比上面多一个M快捷键

symbol-overlay M-i 高亮函数范围内的符号。锁定。可以取消。可以高亮多个。

  • 文件中查找关键字

rg 也就是ripgrep。功能丰富速度快

4 个赞

如果有好用的 IDE 功能(lsp),那么我会优先考虑用 eglot 来查找;如果没有(比如在 C++ 中),那么我会直接用 rgfd,前者用于项目级别的全文搜索,后者用于查找文件。

正好我用的是 vertico + consult + embark 全家桶,这两个都是适配了 consult,命令分别是 consult-ripgrepconsult-fd,所以我把快捷键设置成了 C-c d rC-c d fd 在我的键位命名空间里表示查找,rf 分别代表 rgfd)。

另外 embark 也可以和他们结合使用:比如我想全局搜索光标下面的单词,我会先用 C-; 选中光标下的单词,然后用 C r 把它送到 consult-ripgrep,整套流程非常方便

lsp 查变量,函数,定义,引用。

rg 查关键字。

你说的vertico + consult + embark 没用过。他们比rg有哪些好处?

我是把xref各种后端合并了,只按一次m-.就行了,按个按global lsp之类搜索,比如global没搜索到就继续lsp,最后搜索不到就转到rg

这个挺好。你是怎么配置的?能否贴一下?

我现在的配置没这么自动,如果有的环境没有lsp,就得用global。我放一个.dir_local到项目目录,这里面启用global。。。比较麻烦。

c语言和其他语言也是一样么?比如,global没有rust吧?

可以参考这个帖子的做法xref-backend-functions为啥不像说明中的那样把function list都执行呢? - #10,来自 zbelial global我用的ggtag最新里的xref适配函数 至于其他语言global有个pygement(拼写有误)可以调用ctag生成

非常感谢、、、、、、、、、、、、、、、、