Підтримка Quickfix для зворотних зворотів Python


18

Скажіть, у мене є сценарій python з помилкою виконання:

$ cat example.py  
#! /usr/bin/env python3

a = 1/0

що дає:

$ python3 example.py 
Traceback (most recent call last):
  File "example.py", line 3, in <module>
    a = 1/0
ZeroDivisionError: division by zero

Я хочу, щоб Vim перейшов до проблемної лінії цього файлу (рядок 3 у цьому випадку). Я знаю, що Vim може це зробити, тому що він працює чудово для вловлювання помилок під час компіляції в C за gccдопомогою :makeта quickfixвікна.

вихід швидкого виправлення з gcc

Звичайно, я можу заповнити вікно швидкого виправлення Vim :set makeprg=python3\ %і потім :make, але воно не переходить до номера рядка, на який вказує зворотний зворот. Коли я дивлюся в :copenнього, просто виділяється перший рядок сліду, і я не можу перейти до відповідного номера рядка.

вихід швидкого виправлення з python3

(Я використовую Vim 7.4 на Debian jessieу випадку, якщо це має значення.)

Мої запитання:

  • Чи можу я налаштувати Vim так, щоб він знав, як отримати відповідний номер рядка з прослідковування Python?

  • Чи можу я змінити інтерпретатор Python, щоб виплюнути формат помилок, який Vim вже знає, як проаналізувати та отримати відповідний номер рядка?


Ви можете підкласирувати реєстратор у вашому скрипті для отримання точок відстеження по одному на рядок (див. Тут, щоб розпочати роботу), а потім відрегулювати errorformatвідповідність і написати плагін компілятора для Vim (див. :help :compilerТа :help write-compiler-plugin). Напевно, не варто докладати зусиль, якщо ти не знаєш точно, що ти робиш, і не вистачаєш ентузіазму, щоб викопати все з документів.
Сато Кацура

Я задав таке запитання про StackOverflow, ви можете знайти відповіді на ці питання корисні stackoverflow.com/questions/11333112 / ...
jalanb

Відповіді:


7

Vim постачається з набором сценаріїв "компілятора", один з яких називається "pyunit" . Якщо ви запустите, :compiler pyunitа потім :make(із запропонованим значенням для 'makeprg'), швидке виправлення заповнюється так, як ви очікуєте. Однак він працює добре лише за наявності одного рівня до сліду стека.

Поліпшення цього сценарію компілятора було б корисною вправою.

Розбірки стопки плагін може представляти інтерес, так як вона забезпечує загальний механізм для аналізу і перегляду розташування повідомили в трасуванні стека і має підтримку Python вбудований в.


4

Вбудований плагін компілятора pyunit

Як уже запропонував jamessan , одним із варіантів є використання вбудованого модуля компілятора pyunit:

:compiler pyunit
:set makeprg=python3\ %
:make

Це має і зворотний бік, що він згортає слід стека на одне повідомлення про помилку. Наприклад, наступний скрипт python:

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

lumberjack()

... видає це повідомлення про помилку:

|| Traceback (most recent call last):
lumberjack.py|7|  IndexError: tuple index out of range

Написання власного плагіна компілятора

Як альтернатива, ви можете надати власний плагін компілятора у ~/.vim/compiler/python.vim:

if exists("current_compiler")
  finish
endif
let current_compiler = "python"

let s:cpo_save = &cpo
set cpo&vim

CompilerSet errorformat=
      \%*\\sFile\ \"%f\"\\,\ line\ %l\\,\ %m,
      \%*\\sFile\ \"%f\"\\,\ line\ %l,
CompilerSet makeprg=python3\ %

let &cpo = s:cpo_save
unlet s:cpo_save

Виберіть плагін вручну :compiler pythonабо завантажте його автоматично, додавши його до ~/.vim/after/ftplugin/python.vim:

if !exists("current_compiler")
  compiler python
endif

За допомогою сценарію python зверху Vim заповнює вікно швидкого виправлення:

|| Traceback (most recent call last):
lumberjack.py|7| in <module>
||     lumberjack()
lumberjack.py|2| in lumberjack
||     bright_side_of_death()
lumberjack.py|5| in bright_side_of_death
||     return tuple()[0]
|| IndexError: tuple index out of range

Див. Для :help write-compiler-pluginотримання додаткової інформації.


3

quickfix.py аналізує прослідкування на зручну для vim формат помилок. Ось приклад запуску його у файлі одним рядком 1 / 0.

❯❯❯ quickfix.py tests/errors/div_by_zero.py
"tests/errors/div_by_zero.py":1: ZeroDivisionError: division by zero

За замовчуванням він показує файли користувачів, але він також може показувати системні файли (запускаючи їх у файлі, що містить import os; os.environ['123']):

❯❯❯ quickfix.py -a /tmp/test.py                                                                                                        
"/usr/lib/lib/python3.7/os.py":678: KeyError: '123'
"/tmp/test.py":1: in function <module>

Конфігурація:

Коли quickfix.pyце доступно в поточному шляху, додайте наступні рядки в vimrc, щоб використовувати його.

if has("autocmd")
  autocmd FileType python setlocal makeprg=quickfix.py\ %
  autocmd FileType python setlocal errorformat=%E\"%f\":%l:%m,
endif

-1

Не автоматичний метод, але пітфон Traceback вказує номер рядка --- 3 у вашому прикладі --- і тому викликає vim:

$ vim +3 example.py

відкриє example.pyкурсор у третьому рядку.


2
Мені це відомо, але мова йде про підтримку Quickfix. Після запуску :makeфайлу, який я вже відкрив, скоріше скористатися :3для переходу на третій рядок, ніж для закриття та повторного відкриття. Крім того, це робити вручну - це біль для більш складних слідів стека, саме тому я хочу підтримку Quickfix.
Натаніель М. Бівер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.