在vim/emacs中自动包含Python import语句?

5
在eclipse中,有一个方便的快捷键CTRL+SHIFT+o,它可以根据使用的类或模块自动包含所需的导入(include)语句。你是否在vim或emacs中找到了类似的插件呢?

1
https://dev59.com/jm865IYBdhLWcg3wat6l - atomocopter
2
也许你应该将问题限制在emacs或vi中的一个,而不是两个,因为答案会非常不同。 - Jérôme Radix
1
据我所知,对于Emacs来说没有这样的东西。不过,如果您经常使用相同的依赖项,您可以使用Emacs模板(http://emacs-template.sourceforge.net/)生成一个包含重要依赖项的“空白”Python文件。 - phimuemue
1
这似乎是我自己的关于vim的问题的半重复:/ about vim - Daenyth
Daenyth,差不多是一样的。很抱歉,在搜索时我找不到它。 - Senthil Kumaran
显示剩余2条评论
2个回答

5

@unutbu 是 Ubuntu 的一个变位词。 :) - qed
Jedi提供类似于Ropemacs的功能吗? - qed
@qed:抱歉,我不知道。 - unutbu
你认为同时安装emacs-jedi和ropemacs是个好主意吗? - qed
@qed:说实话,我不使用jedi或ropemacs。我收集可运行的代码片段,然后复制/粘贴/编辑。我也在emacs中使用IPython,它给我提供了某种程度的自动完成,但我更多地用它来进行内省/探索,而不是在编程时进行自动完成。 - unutbu
显示剩余3条评论

2
所以,我对这个简单的函数感到满意,它已经为我节省了重复的操作。当我调用my-python-import-add时:
  • 会询问我要导入哪些模块(我可以给出一个逗号分隔的列表,如os,sys,from foo import bar,re
  • 它会插入import xxx语句或者你输入的from …
  • 导入语句会被排序。
  • 光标不会移动(当然)。
例如:M-x my-python-import-add RET os, sys, from foo import bar, requests会给我返回:
import os
import sys

import requests

from foo import bar

PS:发现一个注意点:你需要已经有一个import语句。


我们依赖于isort Python包:

pip install isort

同时,还有py-isort(在Melpa中),因此请阅读它们的帮助以了解如何自定义排序功能。我个人希望每行只有一个导入,所以设置了:

(setq py-isort-options '("--force_single_line_imports"))

这个功能:

编辑:我将其放在了gitlab仓库中。

更新:现在默认情况下提示单词点。

(require 's)  ;; melpa
(require 'dash)  ;; melpa

(require 'py-isort)  ;; melpa

(defun my-insert-import (to_insert)
  (newline)
  (if (s-starts-with? "from" (s-trim to_insert)) (insert (s-trim to_insert))
    (insert "import " to_insert))
  )

(setq py-isort-options '("--force_single_line_imports"))


(defun python-import-add (to_import)
  "Adds an import statement for every given module. Can give a comma-separated list of modules, like:
M-x my-python-import-add RET os, sys, from foo import bar, re RET"
  (interactive "swhat to import ? ")
  (beginning-of-buffer)
  (save-excursion
    (search-forward-regexp "\\(^from \\)?.*import [a-z]+")  ;; if not found ?
    (end-of-line)
    ;; split the arguments by spaces:
    (setq to_insert (s-split "," to_import))
    ;; insert each elt of the list:
    (-map 'my-insert-import to_insert)
    ;; sort the imports: (set your py-isort options. See isort -h)
    (py-isort)
    )
  )

我现在可能要做的是获取当前光标所在位置的内容(例如sys.argv),并将其建议为默认值。=>完成

我相信我们可以在Emacs中实现一个有用且完整的自动导入功能。


谢谢,这个很好用,比使用绳索快得多。 - Johan Dahlin
很酷! :) 顺带一提,我创建了a git repo,这样你就可以跟踪更改或提出改进建议了。 - Ehvince
这对我们实现的模块有效吗?@Ehvince - alper
1
@alper 如果你问它是否适用于我们自己的本地模块,是的,因为这个工具很简单,它只是自动化了你手动编写的内容。它不是自动导入,只是一个帮助你编写它们的辅助工具。 - Ehvince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接