[О блоге]
[наверх]
[пред]
[2016-08-31 22:33:39+03:00]
[e29e1d1dbc098c7b85bb3d4cb1505517110c20a2]
Темы: [tip][vim]
Асинхронный pylint в Vim
За эти несколько дней вылизал работу асинхронной реализации pylint
проверки в Vim (для 8.0). Мне кажется получилось очень круто. У коллеги
на работе видел как подобное делается в Emacs (не сам код, а как это
выглядело на практике) -- мне кажется добился такого же результата
(только небольшим количеством vimscript).
Всё это находится в http://www.stargrave.org/vimrc.txt (поиск по
PylintStart например).
* есть переменная g:lint_disable которая позволяет отключить работу
pylint автоматическую
* есть PylintStatus который можно засунуть в statusline и он будет
показывать запущен ли процесс проверки кода, Определяет он состояние
по b:lint_job -- замечу, который локален для буфера (то есть можно
иметь параллельно работающие pylint для каждого буфера)
* по нажатию <F6> запускается PylintStart. Он проверит что если
b:lint_job уже запущен, то он ничего не будет делать. Сам по себе он
запустит с кучей аргументов командной строки pylint натравленный на
текущий файл
* При этом во время его работы в statusline будет показано красным ярким
цветом что LN (lint) в процессе работы. Так можно понять что процесс
запущен
* Когда процесс завершится, то он вызовет PylintFinish. Эта функция
засунет весь pylint вывод в quickfix и расставит напротив каждой
строчки quickfix-а метку (sign) LN. По появлению полосы с метками
можно будет понять что имеются ошибки и pylint завершился (хотя в
statusline всё-равно пропадёт красный LN значок)
* Если при этом ошибок не было, то будет выведено зелёное сообщение что
pylint is clean. Плюс не будет видно полосы с метками об ошибках. Если
было открыто quickfix окно, то оно закроется, так как всё-равно при
отсутствии ошибок будет пустым
* Чтобы открыть quickfix окно, можно нажать <S-F6>. Лично я просто
годами запускал синхронно pylint нажимая <F6> и при этом мне всегда
показывалось quickfix окно
* При сохранении файла .py PylintStart запускается автоматически
Нечто подобное (только с гораздо большим количеством кода) умеет делать
flake8 плагин. Но в нём я у других видел большое недостаток когда он
автоматически запускается при сохранении файла -- он перезатирает
quickfix. В итоге использовать quickfix окно с результатом какого-нибудь
grep и при этом править Python файлы и сохранять их -- становится
невозможным. Разве что только открывать (:colder) предыдущие quickfix
результаты.
* Вместо vimgrep или :Ggrep я использую собственные чуть изменённые по
поведению функи :Vim и :Vmg. В них я просто добавил включение
g:lint_disable. Теперь вместо перезатирания quickfix окна при
сохранении .py я ничего не теряю. Обычно если .py редактируется вместе
с открытым quickfix, то наверняка это рефакторинг, для которого не
нужен моментальный pylint
* А вот нажатие <F6> форсированно выключает g:lint_disable. Теперь одним
нажатием можно включить автоматическую проверку pylint при сохранении
файла (ну и просто вызвать проверку)
В Emacs я видел поведение где, при неактивности в окне, он запускает
pylint -- при этом создавая временный файл на который будет натравлен
pylint. Думал об этом, но уверен что это вряд ли много пользы принесёт.
Если файл не сохранён, то (лично у меня) это почти наверняка совсем
синтаксически не валидный. :w я ещё и явно могу вызвать pylint,
независимо от таймеров. Плюс не париться об управлении временными
файлами.
[оставить комментарий]