Vim jako IDE dla programisty Python
Tak kiedyś było
Używałem wielu edytorów programisty. Zaczynałem od dostarczanych wraz z językiem programowania (Amos, BlitzBasic), używałem intensywnie CED-a, później Notatnika, przez jakieś Notatniki+. Był też krótki romans z Pajączkiem ze względu na wsparcie HTML, później używałem Quanty i edytora z Midnight Commandera. Kilka lat temu zachwyciło mnie IDE Microsoft Visual Studio (programowałem nieco w .NET/C#, świetna technologia). Szukałem później pocieszenia instalując Eclipse.
Pewnego spokojnego dnia, gdzieś między zaznaczeniem obszaru tekstu myszą i wciśnięciem Ctrl+C i Ctrl+V zwróciłem uwagę, jak Onjin pisze kod. W zasadzie to nie wyglądało jakby pisał, tylko bezpośrednio przelewał myśli w źródła, wskazując jedynie miejsca docelowe opuszkami z prędkością chyba 200 uderzeń na sekundę.
Dziś jest Vim
Poczułem moc Vim-a. Dziś to moje podstawowe narzędzie pracy. Zasadniczo Vim z kolorowaniem składni Pythona i ewentualnie ctags wystarcza. Jednak postanowiłem trochę rozbudować moje IDE:
TagList
Plugin, który wyświetla strukturę kodu źródłowego.
TaskList
Plugin wyświetla listę zadań do wykonania w otwartym pliku. Działa podobnie jak zakładki TO-DO z innych IDE. Odnajduje komentarze z adnotacjami: TODO, FIXME, XXX. Listę tokenów może przekonfigurować (dokładny opis konfiguracji znajduje się w skrypcie).
Do pobrania: http://www.vim.org/scripts/script.php?script_id=2607
Rope - wsparcie refaktoryzacji
Ciekawie zapowiadający się pakiet napisany w Pythonie wspomagający zadania refaktoryzacji kodu. Jestem na etapie zaznajamiania się z możliwościami pakietu, aczkolwiek muszę przyznać, że zmiana nazw klas czy modułów sprawdza się rewelacyjnie.
Pyflakes
Sprawdzanie poprawności kodu “w locie”. Skrypt jest bardzo wydajny, bo uruchamia się podczas wyjścia z trybu insert.
Pyflakes skutecznie powiadamia o błędach takich, jak:
- redeklaracja zmiennych, które nie były używane,
- brak importów,
- nieużywane importy i zmienne,
- użycie zmiennej przed jej definicją,
- podwójne zdefiniowanie funkcji,
- błędy składni.
SnipMate - snippety rodem z TextMate
Zaawansowany pakiet skryptów ułatwiających pisanie kodu za pomocą tzw. snippetów. Snippety uaktywnia się wpisując odpowiednią frazę i klepiąc tabulator.
Przydatne snippety dla Pythona:
docs
: docstring dla modułufor
: pętla forwhile
: pętla whiledef
: definicja funkcjicl
: definicja klasydefs
: definicja metodytry
: różne rodzaje bloku try-except (do wyboru)
VimPDB - debugger Pythona w Vim
Używa się analogicznie jak ipdb czy pdb. W kodzie źródłowym umieszczamy wywołanie:
import vimpdb
vimpdb.set_trace()
Przed uruchomieniem skryptu do debugu należy odpalić sesję vim`a:
vim --severname VIMPDB
Interfejs VimPDB nie jest tak wygodny jak winpdb. Ja i tak najczęściej debuguje używając pdb/ipdb.
Omnicompletion
Znakomicie sprawdza się w przypadku pakietów zainstalowanych w systemie. Omnicompletion to inna nazwa wygodnego mechanizmu podpowiadania “intellisense”.
Skrót Ctrl+X Ctrl+O podpowiada metody, moduły do importu, nazwy klas. Ustawiając set completeopt=preview mamy na bieżąco wgląd w docstring dopełnianego elementu.
Dla Pythona wystarczy ściągnąć skrypt Pythoncomplete i skopiować go do ~/.vim/autoload
.
W .vimrc
ustawiamy:
autocmd FileType python set omnifunc=pythoncomplete#Complete
set completeopt=preview,longest,menu
set completefunc=pythoncomplete#Complete
(Nie)stety Używam buildout i omnicompletion nie działa w pełni z powodu nie ustawionego prawidłowo PYTHONPATH. Na ten czas nie mam rozwiązania tego problemu. Stąd nie używam omnicomplete za często i nie jest mi do życia potrzebne.
Pylint
Linter dla Pythona. Z jego zalet chyba wystarczy podać najważniejsze:
- Pylint sprawdza zgodność z PEP,
- ocenia kod i porównuje wynik z poprzednim.
Jest trochę upierdliwy, więc nie uruchamiam go automatycznie (można go skonfigurować, aby nie uruchamiał się po każdym zapisie). Najczęściej uruchamiam go przed deploymentem wersji lub przed wysłaniem zmian do publicznego repozytorium.
Podsumowanie
Czy czegoś więcej potrzeba? Chyba tylko lepszej integracji z projektami opartymi na buildout. Będzie to temat na kolejnego posta.