You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emacs+AUCTeX+RefTeX+Company标签搜索缓慢的优化求助

问题描述

使用Emacs搭配AUCTeX、RefTeX和Company编写大型LaTeX文档时,RefTeX的文献引用功能正常且检索速度快,但标签搜索功能存在卡顿问题——每次在\ref{}命令内移动光标,都会触发RefTeX扫描项目中所有文件,耗时数秒,且扫描期间无法进行任何键盘输入,必须等待扫描完成。

用户相关配置如下:

;;------------------------------------------------------------------------------
;; Company -> Autocomplete
;;------------------------------------------------------------------------------

(use-package company
  :config
  (setq company-idle-delay 0
        company-minimum-prefix-length 4
        company-selection-wrap-around t)
  :bind
  (("C-<tab>" . company-complete))
  )

(global-company-mode t)

(use-package company-math :ensure t)
(use-package company-reftex :ensure t)
(use-package company-bibtex :ensure t)

(add-hook 'LaTeX-mode-hook
        (lambda()
        (make-local-variable 'company-backends)
        (setq company-backends '((company-files company-yasnippet)
                               (company-reftex-citations
                                company-reftex-labels
                                company-bibtex
                                company-auctex-macros
                                company-auctex-symbols
                                company-auctex-environments
                                company-keywords
                                company-latex-commands
                                company-auctex-environments
                                company-math-symbols-latex
                                company-ipa-symbols-unicode)
                                company-dabbrev))))

;;------------------------------------------------------------------------------
;; LaTeX
;;------------------------------------------------------------------------------

(setq-default TeX-output-dir "build")
(setq-default TeX-master nil)

;; RefTex
(add-hook 'LaTeX-mode-hook 'turn-on-reftex) ; Enable RefTex in AUCTex Latex mode
(add-hook 'latex-mode-hook 'turn-on-reftex) ; Enable RefTex in Emacs Latex mode

;; Enable LaTeX Preview Pane
;(add-hook 'LaTeX-mode-hook 'latex-preview-pane-mode)
;(add-hook 'latex-mode-hook 'latex-preview-pane-mode)

(setq-default reftex-plug-into-AUCTeX t)
(setq-default reftex-default-bibliography '("./bibliography/Masterthesis.bib"))
(setq-default reftex-bibliography-commands '("bibliography" "nobibliography" "addbibresource"))
(setq reftex-use-external-file-finders t)
(setq reftex-external-file-finders
      '(("tex". "kpsewhich -format=.tex %f")
                (("bib". "kpsewhich -format=.bib %f"))))
解决方案

一、优化RefTeX标签扫描速度

1. 明确指定主文件,限制扫描范围

当前TeX-master设为nil,RefTeX会自动遍历所有文件查找主文档,大型项目中容易导致无意义的扫描。手动指定主文件可大幅减少扫描量:

;; 替换为你的LaTeX主文件名(如main.tex)
(setq-default TeX-master "main.tex")
;; 限制RefTeX仅扫描主文件及其包含的子文件
(setq reftex-visit-submode 'reftex-visit-specials)

2. 启用标签缓存,避免重复扫描

开启RefTeX的缓存机制,让标签结果仅在文件变更时更新,而非每次光标移动都重新扫描:

(setq reftex-use-cache t)
;; 设置缓存仅在文件保存时更新
(setq reftex-cache-update-delay 1)

3. 替换外部文件查找器,减少开销

当前使用kpsewhich外部命令查找文件,调用开销较高。换成Emacs内置的查找工具:

(setq reftex-external-file-finders
      '(("tex" . reftex-find-file)
        ("bib" . reftex-find-file)))

二、禁用/调整自动扫描触发时机

1. 调整Company自动补全延迟

当前company-idle-delay设为0,光标一移动就触发补全扫描。设置合理延迟,仅当光标停留时才触发:

(use-package company
  :config
  (setq company-idle-delay 0.5 ; 调整为0.5秒,可按需修改
        company-minimum-prefix-length 4
        company-selection-wrap-around t)
  :bind
  (("C-<tab>" . company-complete))
  )

2. 移除自动补全的标签后端,改用手动触发

把company-reftex-labels从自动补全列表中移除,仅通过快捷键手动调用标签补全:

(add-hook 'LaTeX-mode-hook
          (lambda()
            (make-local-variable 'company-backends)
            (setq company-backends '((company-files company-yasnippet)
                                     (company-reftex-citations
                                      company-bibtex
                                      company-auctex-macros
                                      company-auctex-symbols
                                      company-auctex-environments
                                      company-keywords
                                      company-latex-commands
                                      company-math-symbols-latex
                                      company-ipa-symbols-unicode)
                                     company-dabbrev))))
;; 绑定手动触发标签补全的快捷键(可自定义)
(define-key LaTeX-mode-map (kbd "C-c r l") 'company-reftex-labels)

3. 直接关闭RefTeX自动扫描功能

如果不需要自动标签扫描,可直接禁用相关自动功能:

(setq reftex-auto-reftex nil)

内容的提问来源于stack exchange,提问作者ls.ptr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:36:54