在eclipse中,有一个方便的快捷键CTRL+SHIFT+o,它可以根据使用的类或模块自动包含所需的导入(include)语句。你是否在vim或emacs中找到了类似的插件呢?
Ropemacs有rope-auto-import
功能,这样如果您写入
rmtree
并执行M-x rope-auto-import
,
from shutil import rmtree
在文件顶部插入可能不是一个很明智的想法,因为从模块中导入函数可能需要避免。
请参阅此SO帖子了解设置ropemacs的信息。 随ropemacs一起提供的README(例如/usr/share/doc/python-ropemacs/README.txt.gz)也包含有关设置由ropemacs-auto-import命令使用的缓存的有用信息。
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中实现一个有用且完整的自动导入功能。