emacs:如何在模块和test_module.py之间切换
#python #emacs

在文件之间切换

emacs具有使用ff-find-other-file函数在相关文件之间切换的一个不错的功能。默认情况下,这不绑定到任何键。我通常将其绑定到F5,以在同一窗口中找到相关文件,然后M-o在我的~/.emacs中的新窗口中打开它:

(global-set-key '[f5] 'ff-find-other-file)
(global-set-key '[(meta o)] '(lambda() (interactive) (ff-find-other-file t)))

在模块和module_test.py之间切换

对于Python文件,相关文件可以是一个模块及其测试文件。为此,您需要一旦进入python-mode,就需要将ff-other-file-alist变量纠缠。您可以在~/.emacs中这样做:

(add-hook 'python-mode-hook
          (function
           (lambda()
             (setq ff-other-file-alist
                   '(("_test\\.py$" (".py"))
                     ("\\.py$" ("_test.py")) ) ) ) ) )

ff-other-file-alist变量中,该顺序很重要,因为ff-find-other-file在第一次匹配中停止。

在模块和test_module.py之间切换

module.pytest_module.py之间切换更为复杂。默认情况下,ff-find-other-file可与后缀一起使用。有一个未记录的功能(我必须查看源代码才能找到它):您可以传递函数的名称而不是替换后缀。

这是如何做的:

(defun py-module (fname)
  (list (concat
         (match-string 1 (file-name-nondirectory fname))
         ".py")) )

(defun py-test (fname)
  (list (concat "test_"
                (match-string 1 (file-name-nondirectory fname))
                ".py")) )

(add-hook 'python-mode-hook
          (function
           (lambda()
             (setq ff-other-file-alist
                   '(("test_\\(.*\\)\\.py$" py-module)
                     ("\\(.*\\)\\.py$" py-test))
                   ) ) ))

在不同目录中查找

如果您的测试和模块不在同一目录中,则可以使用ff-search-directories变量添加一些相对路径。例如:

(add-hook 'python-mode-hook
          (function
           (lambda()
             (setq ff-search-directories '("." "../tests" "../src")) ) ) )