+vim9script
+
+# Asynchronous pylint utility call
+# Maintainer: Sergey Matveev <stargrave@stargrave.org>
+# License: GNU General Public License version 3 of the License or later
+#
+# This plugin allows you to asynchronously call pylint.
+#
+# * Press <F6> to start pylint on current file
+# * Press <S-F6> 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 (<F6>) 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