-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