Скажем, у меня есть сценарий 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
окна.
Конечно, я могу заполнить окно быстрого исправления Vim, :set makeprg=python3\ %
а затем :make
, но оно не переходит к номеру строки, на которую указывает трассировка. Когда я смотрю на :copen
него, он просто выделяет первую строку трассы, и я не могу перейти к соответствующему номеру строки.
(Я использую Vim 7.4 в Debian jessie
на тот случай, если это имеет значение.)
Мои вопросы:
Могу ли я настроить Vim так, чтобы он знал, как получить соответствующий номер строки из трассировки Python?
Могу ли я изменить интерпретатор Python, чтобы он выдавал формат ошибки, который Vim уже знает, как анализировать и получать соответствующий номер строки?
источник
errorformat
соответствующим образом и написать плагин компилятора для Vim (см.:help :compiler
И:help write-compiler-plugin
). Вероятно, не стоит затраченных усилий, если вы точно не знаете , что делаете, и у вас недостаточно энтузиазма, чтобы выкопать все из документов.Ответы:
Vim поставляется с набором «компиляторных» скриптов, один из которых называется «pyunit» . Если вы запустите,
:compiler pyunit
а затем:make
(с вашим предложенным значением для'makeprg'
), быстрое исправление будет заполнено, как вы ожидаете. Тем не менее, это работает хорошо только если есть один уровень трассировки стека.Улучшение этого скрипта компилятора было бы полезным упражнением.
Разборки стопки плагин может представлять интерес, так как она обеспечивает общий механизм для анализа и просмотра местоположения сообщили в трассировке стека и имеет поддержку Python встроенный в.
источник
Встроенный плагин компилятора
pyunit
Как уже предложено jamessan , одним из вариантов является использование встроенного модуля компилятора
pyunit
:Недостатком является то, что сворачивает трассировку стека в одно сообщение об ошибке. Например, следующий скрипт на python:
... выдает это сообщение об ошибке:
Написание собственного плагина компилятора
В качестве альтернативы вы можете предоставить свой собственный плагин компилятора в
~/.vim/compiler/python.vim
:Выберите плагин вручную
:compiler python
или загрузите его автоматически, добавив его в~/.vim/after/ftplugin/python.vim
:С помощью приведенного выше скрипта Python Vim заполняет окно быстрого исправления:
Смотрите
:help write-compiler-plugin
для получения дополнительной информации.источник
quickfix.py анализирует трассировку в удобном для vim формате ошибок. Вот пример запуска его для файла с одной строкой
1 / 0
.По умолчанию он показывает пользовательские файлы, но он также может отображать системные файлы (при запуске его в файле, содержащем
import os; os.environ['123']
):Конфигурация:
Когда
quickfix.py
доступно в текущем пути, добавьте следующие строки в vimrc, чтобы использовать его.источник
Не автоматический метод, а трассировка python указывает номер строки --- 3 в вашем примере --- и вызывает vim:
$ vim +3 example.py
откроет
example.py
курсор с помощью третьей строки.источник
:make
файла, который у меня уже открыт, быстрее:3
перейти на третью строку, чем закрыть и снова открыть. Кроме того, выполнение этого вручную является проблемой для более сложных трассировок стека, поэтому я хочу поддержку Quickfix.