Emacs 多个方便查看函数列表的功能

Emacs 有多个方便查看函数列表的功能。以下是几种主要的方法:

1. Imenu (最常用)

快捷键 : M-x imenuC-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)

使用技巧

  1. 快速导航 : 使用 C-x C-i 打开函数列表,输入函数名快速跳转
  2. 上下文感知 : 启用 which-function-mode 后在状态栏看到当前函数名
  3. 项目范围: 使用 LSP 或 tags 可以在整个项目中导航函数

推荐从 imenu 开始使用,这是最轻量级且内置的功能。如果需要更强大的功能,可以考虑配置 LSP 模式。