【问题标题】:How can I use meta-dot (M-.) in python with emacs?如何在带有 emacs 的 python 中使用元点 (M-.)?
【发布时间】:2011-03-30 21:15:12
【问题描述】:

蟒蛇有没有类似粘液的东西?

例如,如果我将光标放在 foo() 上并执行 M-。 (跳转到定义)我想看看函数foo的源码定义

无论 foo 是否在其中,这都应该有效

1) 本地项目目录

2) 在一些 ~/.virtualenvs/bar/lib/site-packages 中

3) 在其他 python 路径中

4) 虚拟环境正在使用中(即,它应该在我当前的虚拟环境中查看)

pymacs/ropemacs 组合能做到这些吗?

【问题讨论】:

  • 我更喜欢 slime 的等价物,也就是说,它可以在代码/语义级别上对 python 进行深入了解,而不仅仅是在文本级别。 Ropemacs 或 pymacs 可能是我想要的,虽然我不知道它是否对 M- 有帮助。以任何方式。

标签: python emacs ropemacs pymacs rope


【解决方案1】:

为避免使用 -e,您可以使用 etags 并通过 find 递归地添加 py 文件:

find . -type f -name '*.py' | xargs etags

【讨论】:

  • 是的,但是相关的 .py 文件不在我的代码的子目录中,它们在 ~/.virtualenv 中,而我在 ~/src/project/foo 中工作
  • 通过 find 你可以使用任何你想要的目录:find ~/.virtualenv -type f -name '*.py' | xargs etags
  • 我想这需要一个 virtualenv 钩子,以便可以为用户所在的任何工作目录 + virtualenv 组合自动生成标签。
  • @nunb 对不起,我不明白你说什么。我给你写的是生成TAGS文件的shell命令。
  • 那么 emacs 手册推荐 find . -name "*.[py]" -print | etags - 消除了 xargs 的必要性。 gnu.org/software/emacs/manual/html_node/emacs/…
【解决方案2】:

这里提到的大多数答案都已过时。一个简单的解决方案是将 elpy 用于不带 etags 的M-.(这需要额外的工作)。

安装elpy as mentioned here

M-x package-install elpy

然后安装python包

$ sudo pip install rope jedi

重启emacs,打开任意python文件运行M-.

Elpy 有完整的文档,你可以阅读about M-. here

【讨论】:

    【解决方案3】:

    M-。通常运行“find-tag”函数。 您应该为您的 python 源文件创建一个 TAGS 文件。然后你“visit-tags-table”,然后再做一个 M-。 这样,Emacs 将跳转到标签的所有定义。键入 C-u M-。跳转标签的下一个定义。请参阅 find-tag 文档以获取帮助。请查阅 Emacs 帮助以了解如何从 python 源文件创建 TAGS 文件。

    例如,您可以使用 Exuberant Ctags 创建 TAGS 文件。

    转到你的 python 文件的根目录并执行以下操作:

    ctags -e -R .
    

    TAGS 文件通常在项目的根目录下创建。

    【讨论】:

    • 我建议您也查看emacswiki.org/emacs/EtagsSelect,如果您将M-. 绑定到etags-select-find-tag,它会提供更好的界面
    • 在根目录中使用 etags,并且多个项目不会在同一包的不同安装之间混淆(多个站点包?)。或者至少,每次它都会弹出一个缓冲区,询问我哪个源定义我想去?
    • 您为每个项目在各自的根目录(不是系统的根目录 /)创建一个 TAGS 文件。然后在您感兴趣的每个 TAGS 文件上使用“visit-tags-table”。所有 TAGS 文件引用都附加到“tags-table-list”变量中。然后,使用 M-。 , emacs 在 'tags-table-list' 中引用的所有 TAGS 文件中搜索关键字。
    • ctags 不支持选项-e(至少在 Mac OS X 和 Ubuntu 上)。那么,你能解决它吗?
    【解决方案4】:

    以下将索引您当前的项目

    find . -type f -name '*.py' | xargs etags

    但是如果你想索引你导入的库。您首先激活您的 virtualenv。然后使用which python 检测你的库在哪里,然后通过管道将它们传送到 etags。

    workon my-project # if using virtualenvwrappwer
    source bin/activate # if using virtualenv
    
    find ${$(which python)/\/bin\/python/} -type f -name '*.py' | xargs etags
    

    【讨论】:

      【解决方案5】:

      Accepted answer 漏掉了一个重点,如果你像find . -type f -name '*.py' | xargs etags 一样执行etags,那么每次都会为每个文件生成 TAGS 文件。

      正确的做法是使用--appendlike 将数据附加到现有的 TAGS 文件中

      rm -f TAGS
      find . -type f -name '*.py' -print0 | xargs -0 etags --append
      

      此外,如果您想包含来自虚拟环境站点包目录的标识符(例如:~/.virtualenvs/bar/lib/site-packages):

      SITEPACKAGES=$(cdvirtualenv;pwd)/lib/python3.6/site-packages/
      find $SITEPACKAGES -type f -name '*.py' -print0 | xargs -0 etags -a
      

      *将 python3.6 调整为您当前的 Python 版本

      【讨论】:

      • "那么每次都会为每个文件生成 TAGS 文件": 为什么? xargs 将所有文件名作为参数附加。 etags 只被调用一次(除非命令行长度超过限制)。
      【解决方案6】:

      试试 emacs 的 anaconda-modecompany-anaconda 包。更新配置:

      (eval-after-load "company"
       '(add-to-list 'company-backends 'company-anaconda))
      (add-hook 'python-mode-hook 'anaconda-mode)
      (add-hook 'python-mode-hook 'company-mode)
      

      使用pythonic-activate 切换到 virtualenv,如果你有的话。

      现在您已获得M-.,您可以按M-* 返回!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2010-12-24
        • 2015-01-14
        • 2022-01-19
        • 2010-10-18
        • 2011-05-20
        • 1970-01-01
        相关资源
        最近更新 更多