【问题标题】:Can I customize ff-find-other-file to switch between tests and implementations?我可以自定义 ff-find-other-file 以在测试和实现之间切换吗?
【发布时间】:2025-11-29 19:45:01
【问题描述】:

每当我必须编辑 C++ 代码时,我都会使用ff-find-other-file 在头文件和实现文件之间来回切换。我可以将它用于 Python 文件在实现和测试之间来回切换吗?例如,如果我在foo.py,我希望能够切换到foo_test.py

【问题讨论】:

    标签: python emacs


    【解决方案1】:

    您实际上想设置ff-other-file-alist(也可能设置ff-search-directories)。这些变量是自动缓冲区本地的,因此您可以安全地在模式挂钩中设置它们。

    cc-other-file-alist 是 C/C++ 文件的预配置映射,它只是 ff-other-file-alist 的默认值。

    要处理从测试到实现的反向映射,您需要添加第二个条目,因此 alist 如下所示:

    '(("_test\\.py$" (".py"))
      ("\\.py$" ("_test.py")))
    

    在这种情况下需要先进行反向映射,因为规则是按顺序处理的,.py 匹配两个文件名。如果它们是相反的方式,您仍然会从foo_test.py 转到foo_test_test.py,依此类推...

    有关更多信息和示例,请参阅此相关问题:

    If I open doc.foo file, I want emacs to look for and open doc.bar file in the same folder

    对于您的情况,您可以使用:

    (add-hook 'python-mode-hook 'my-python-mode-hook)
    
    (defun my-python-mode-hook ()
      "My python customisations."
      (setq ff-search-directories '(".")
            ff-other-file-alist '(("_test\\.py$" (".py"))
                                  ("\\.py$" ("_test.py")))))
    

    【讨论】:

      【解决方案2】:

      你需要创建一个.emacs规则设置cc-other-file-alist,例如:

      (setq cc-other-file-alist
        `(("\\.py$" ("_test.py"))))
      

      【讨论】:

      • 这适用于将 foo.py 转换为 foo_test.py,但它会将 foo_test.py 转换为 foo_test_test.py。不幸的是,我似乎无法找到很多关于这些东西的文档。
      • 查看 find-file.el 中的 cmets
      最近更新 更多