X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=vim%2F.vim%2Fpack%2Fstargrave%2Fstart%2Fpy-importcompl%2Fautoload%2Fpython%2Fimportcompl.vim;fp=vim%2F.vim%2Fpack%2Fstargrave%2Fstart%2Fpy-importcompl%2Fautoload%2Fpython%2Fimportcompl.vim;h=aa9a1685df669c28aac1952af2ebbc3ecf9b64a3;hb=c571224ad14b80a040c164399e7dede5dd31ebd0;hp=0000000000000000000000000000000000000000;hpb=8f8b8da2508211746a9a7988925c1cfe3bb44725;p=dotfiles.git diff --git a/vim/.vim/pack/stargrave/start/py-importcompl/autoload/python/importcompl.vim b/vim/.vim/pack/stargrave/start/py-importcompl/autoload/python/importcompl.vim new file mode 100644 index 0000000..aa9a168 --- /dev/null +++ b/vim/.vim/pack/stargrave/start/py-importcompl/autoload/python/importcompl.vim @@ -0,0 +1,69 @@ +" 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. + +let s:git_grep_cmd = "git grep -H --line-number --ignore-case --no-color " + +function! python#importcompl#sortByLen(s1, s2) + if len(a:s1) == len(a:s2) | return a:s1 > a:s2 | endif + return 1 ? len(a:s1) > len(a:s2) : -1 +endfunction + +function! python#importcompl#do() abort + normal diw + let output = system(s:git_grep_cmd . '"^from .* import .*' . @" . '" -- "*.py" "**/*.py"') + let suggestions = [] + for line in split(output, "\n") + if stridx(line, "unused-import") != -1 | continue | endif + let m = matchlist(line, '^.*:\d\+:\(.*\)$') + if len(m) == 0 | continue | endif + call insert(suggestions, m[1]) + endfor + call sort(suggestions, "python#importcompl#sortByLen") + call uniq(suggestions) + call reverse(suggestions) + call complete(col('.'), suggestions) + return '' +endfunction + +function! python#importcompl#all() abort + let output = system(s:git_grep_cmd . '"^from .* import" -- "*.py" "**/*.py"') + let imports = {} + 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\+\).*\)$', + \] + let m = matchlist(line, regexp) + if len(m) == 0 | break | endif + let imports[m[2]] = m[1] + endfor + endfor + let result = [] + for diag in lsp#ui#vim#diagnostics#get_all_buffer_diagnostics() + if diag["message"] !~ "^undefined name" | continue | endif + let m = diag["message"][strridx(diag["message"][:-2], "'")+1:-2] + if len(m) == 0 || !has_key(imports, m) | continue | endif + call insert(result, imports[m]) + endfor + call sort(result, "i") + call uniq(result) + call append(".", result) +endfunction