Python geri izleme için hızlı düzeltme desteği


18

Diyelim ki bir çalışma zamanı hatası olan bir python betiği var:

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

a = 1/0

hangi verir:

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

Vim'in o dosyanın sorunlu satırına atlamasını istiyorum (bu durumda satır 3). Ben onunla C derleme zamanında hataları yakalamak için sadece para cezası çalıştığı için Vim bunu yapabilirsiniz biliyorum gcckullanarak :makeve quickfixpencere.

gcc'den quickfix çıktısı

Elbette, Vim'in quickfix penceresini :set makeprg=python3\ %ve ile doldurabilirim :make, ancak geri izlemenin işaret ettiği satır numarasına atlamaz. Baktığımda izin :copenilk satırını vurguluyor ve ilgili satır numarasına atlayamıyorum.

python3'den hızlı düzeltme çıktısı

( jessieÖnemli olması durumunda Debian üzerinde Vim 7.4 kullanıyorum .)

Sorularım:

  • Vim'i bir Python geri izlemesinden ilgili satır numarasını nasıl alacağını bilecek şekilde yapılandırabilir miyim?

  • Pimhon yorumlayıcısını, Vim'in ilgili satır numarasını nasıl ayrıştırılacağını ve alacağını zaten bildiği bir hata formatı verecek şekilde değiştirebilir miyim?


Her satırda bir geri izleme noktası üretmek için ( buraya başlamak için buraya bakın ), daha sonra errorformatbuna göre ayarlayın ve Vim için bir derleyici eklentisi yazarak (bkz. :help :compilerVe :help write-compiler-plugin) komut dosyasındaki kaydediciyi alt sınıflandırabilirsiniz . Ne yaptığınızı tam olarak bilmiyorsanız ve dokümanlardaki her şeyi kazmak için yeterince hevesli değilseniz, muhtemelen çabaya değmez .
Sato Katsura

Benzer bir soru sordum StackOverflow, bu cevapları yararlı bulabilirsiniz stackoverflow.com/questions/11333112/…
jalanb

Yanıtlar:


7

Vim, biri "pyunit" olarak adlandırılan bir dizi "derleyici" komut dosyası ile birlikte gelir . Çalıştırır :compiler pyunitve sonra :make(için önerilen değerle 'makeprg'), hızlı düzeltme beklediğiniz gibi doldurulur. Ancak, yalnızca yığın izlemede bir düzey varsa iyi çalışır.

Derleyici komut dosyasının iyileştirilmesi yararlı bir alıştırma olacaktır.

Yığını kaldır ayrıştırmak genel mekanizma ve konumları bir yığın izleme bildirilmiştir ve yerleşik Python desteği görünüm olarak eklenti, ilgi çekici olabilir.


4

Dahili derleyici eklentisi pyunit

Jamessan tarafından zaten önerildiği gibi , bir seçenek yerleşik derleyici eklentisini kullanmaktır pyunit:

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

Bunun dezavantajı, yığın izlemesini tek bir hata iletisine daraltmasıdır. Örneğin, aşağıdaki python betiği:

def lumberjack():
    bright_side_of_death()

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

lumberjack()

... şu hata mesajını üretir:

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

Kendi derleyici eklentinizi yazma

Alternatif olarak, kendi derleyici eklentinizi şu dillerde sağlayabilirsiniz ~/.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

Eklentiyi ile manuel olarak seçin :compiler pythonveya aşağıdakilere ekleyerek otomatik olarak yükleyin ~/.vim/after/ftplugin/python.vim:

if !exists("current_compiler")
  compiler python
endif

Yukarıdaki python betiği ile Vim, hızlı düzeltme penceresini aşağıdakilerle doldurur:

|| 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

Daha :help write-compiler-pluginfazla bilgi için bakınız .


3

quickfix.py , izlemeyi vim dostu bir hata biçimine ayrıştırır. Burada tek satırlı bir dosyada çalıştırma örneği 1 / 0.

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

Varsayılan olarak, kullanıcı dosyalarını gösterir, ancak sistem dosyalarını da gösterebilir (içeren bir dosyada çalıştırılır 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>

Yapılandırma:

quickfix.pyGeçerli yolda kullanılabilir olduğunda , kullanmak için vimrc'ye aşağıdaki satırları ekleyin.

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

-1

Otomatik bir yöntem değil, python Traceback örneğinizde --- 3 numaralı satır numarasını belirtir ve böylece vim'i çağırır:

$ vim +3 example.py

example.pyimleç üçüncü satırda olacak şekilde açılır .


2
Bunun farkındayım, ama bu Quickfix desteği ile ilgili. :makeZaten açtığım bir dosya üzerinde çalıştıktan sonra :3, üçüncü satıra atlamak, kapatmak ve yeniden açmaktan daha hızlıdır . Ayrıca, bunu manuel olarak yapmak daha karmaşık yığın izleri için bir acıdır, bu yüzden Quickfix desteği istiyorum.
Nathaniel M. Beaver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.