Emacs 有多个方便查看函数列表的功能。以下是几种主要的方法:
1. Imenu (最常用)
快捷键 : M-x imenu
或 C-x C-i
功能: 显示当前文件的函数/变量/类等定义列表
配置建议 (添加到 .emacs
):
elisp
;; 启用 imenu 在编程模式下自动显示
(add-hook 'prog-mode-hook
(lambda () (setq imenu-generic-expression
'((nil "^\\s-*\\(def\\|class\\|function\\)\\s-+\\([a-zA-Z0-9_]+\\)" 2)))))
2. Which-Function-Mode
启用方式 : M-x which-function-mode
功能: 在模式行显示当前光标所在的函数名
配置:
elisp
;; 自动启用 which-function-mode
(add-hook 'prog-mode-hook 'which-function-mode)
3. Etags 和 Ctags
生成标签:
bash
# 在项目目录下
ctags -R .
使用:
M-.
: 跳转到定义M-*
: 返回跳转前的位置M-x tags-search
: 搜索标签
4. LSP 模式 (现代推荐)
需要安装:
elisp
(use-package lsp-mode
:init (setq lsp-keymap-prefix "C-c l")
:hook ((python-mode . lsp)
(c++-mode . lsp)
(java-mode . lsp))
:commands lsp)
(use-package lsp-ui
:after lsp-mode
:commands lsp-ui-mode)
功能:
C-c l w s
: 显示工作区符号列表C-c l w d
: 显示文档符号列表C-c l w i
: 显示实现列表
5. Helm 或 Ivy 的 imenu 集成
使用 Helm:
elisp
(use-package helm
:config
(global-set-key (kbd "M-i") 'helm-imenu))
使用 Ivy:
elisp
(use-package ivy
:config
(global-set-key (kbd "M-i") 'counsel-imenu))
6. 侧边栏导航
使用 Neotree 或 Treemacs:
elisp
;; Neotree
(use-package neotree
:config
(global-set-key [f8] 'neotree-toggle))
;; Treemacs
(use-package treemacs
:config
(global-set-key (kbd "M-0") 'treemacs-select-window))
7. 快速配置建议
对于 Python 开发,推荐这样配置:
elisp
;; 基本配置
(add-hook 'python-mode-hook
(lambda ()
(which-function-mode)
(setq imenu-generic-expression
'((nil "^\\s-*\\(def\\|class\\)\\s-+\\([a-zA-Z0-9_]+\\)" 2)))))
;; 绑定快捷键
(global-set-key (kbd "C-c i") 'imenu)
使用技巧
- 快速导航 : 使用
C-x C-i
打开函数列表,输入函数名快速跳转 - 上下文感知 : 启用
which-function-mode
后在状态栏看到当前函数名 - 项目范围: 使用 LSP 或 tags 可以在整个项目中导航函数
推荐从 imenu
开始使用,这是最轻量级且内置的功能。如果需要更强大的功能,可以考虑配置 LSP 模式。