vim9script # Python imports insert completion # Maintainer: Sergey Matveev # License: GNU General Public License version 3 of the License or later # # This plugin is intended for quick import-line insertion. # For example you have got "from foo.bar import Baz" import somewhere in # your Git-versioned code. In another file you can write "Baz" and then # press in insert mode. Completion menu will show you suggestions # of all import lines from your code containing Baz import. # # If you have Pylint or Pyflakes output in quickfix window, containing # unfedined variables errors, then you can you :call python#importcompl#all() # function. It will go through the quickfix list and find all possible # imports, sort them and insert under current cursor position. # # It uses external "git grep" call and assumes that "canonical" Python # import format is used (single import per line). # You can use http://www.git.stargrave.org/?p=pyimportcan.git;a=blob;f=pyimportcan.pl # utility to convert existing imports to that format. const gitGrepCmd = "git grep -H --line-number --ignore-case --no-color " export def Do(): string normal diw var output = system(gitGrepCmd .. '"^from .* import .*' .. @" .. '" -- "*.py" "**/*.py"') var suggestions: list var m: list for line in split(output, "\n") if stridx(line, "unused-import") != -1 | continue | endif m = matchlist(line, '^.*:\d\+:\(.*\)$') if len(m) == 0 | continue | endif insert(suggestions, m[1]) endfor sort(suggestions, (s1: string, s2: string): number => { if len(s1) == len(s2) | return 0 | endif if len(s1) > len(s2) | return 1 | endif return -1 }) uniq(suggestions) reverse(suggestions) complete(col("."), suggestions) return "" enddef export def All() var output = system(gitGrepCmd .. '"^from .* import" -- "*.py" "**/*.py"') var imports = {} var ms: list for line in split(output, "\n") if stridx(line, "unused-import") != -1 | continue | endif for regexp in [ '^.*:\d\+:\(from .* import \(\w\+\).*\)$', '^.*:\d\+:\(from .* import \w\+ as \(\w\+\).*\)$', ] ms = matchlist(line, regexp) if len(ms) == 0 | break | endif imports[ms[2]] = ms[1] endfor endfor var lines = getloclist(winnr()) if len(lines) == 0 | lines = getqflist() | endif var result: list var m: string for line in lines if line.text !~ "^undefined name" | continue | endif m = line.text[strridx(line.text[: -2], "'") + 1 : -2] if len(m) == 0 || !has_key(imports, m) | continue | endif insert(result, imports[m]) endfor sort(result, "i") uniq(result) append(".", result) enddef