vim9script # Asynchronous pylint utility call # Maintainer: Sergey Matveev # License: GNU General Public License version 3 of the License or later # # This plugin allows you to asynchronously call pylint. # # * Press to start pylint on current file # * Press to open quickfix window with messages from pylint # * All lines with corresponding pylint existing warning will be highlighted # * If no warning and errors occurred, "pylint is clean" message will be shown # * If existing quickfix window is found, then it won't be overwritten. # Start pylint manually () to force its filling export def Status(): string if exists("b:pylint_job") && job_status(b:pylint_job) == "run" | return "LN" | endif return "" enddef def Qffill(ch: channel) var msgs = [] while ch_status(ch) == "buffered" msgs = add(msgs, ch_read(ch)) endwhile cgetexpr msgs enddef export def Finish(ch: channel) var errorformat_bak = &errorformat set errorformat=%f:%l:\ [%t]%m,%f:%l:%m Qffill(ch) &errorformat = errorformat_bak sign unplace * var id = 2 for item in getqflist() if item.lnum == 0 | continue | endif execute(":sign place " .. id .. " name=LN line=" .. item.lnum .. " buffer=" .. item.bufnr) id = id + 2 endfor redraw! if id == 2 echohl MoreMsg | echomsg "pylint is clean" | echohl None cclose endif enddef export def Start() if exists("b:pylint_job") && job_status(b:pylint_job) == "run" return endif var cmdline = [ "flake8", "--ignore=E501", "--format=%(path)s:%(row)d: [%(code)s] %(text)s", "--max-line-length=90", expand("%p") ] b:pylint_job = job_start(cmdline, {"in_mode": "nl", "err_io": "null", "close_cb": "python#lint#Finish"}) enddef