[О блоге] [наверх] [пред] [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,
независимо от таймеров. Плюс не париться об управлении временными
файлами.

    [оставить комментарий]