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:
-
Plugin, który wyświetla strukturę kodu źródłowego.
Instalacja:
- pobrać archiwum z http://vim.sourceforge.net/scripts/script.php?script_id=273
- plik
plugin/taglist.vim
skopiować do kataloguplugin
, u mnie~/.vim/plugin/
- plik
doc/taglist.txt
skopiować do katalogudoc, u mnie
~/.vim/doc/`
Otwarcie okna z listą:
:Tlist
Podstawowe skróty:
`p`: skok do definicji klasy/funkcji `o`: otwarcie definicji w nowym oknie (split) `F1`: pomoc (lista skrótów) `/`: standardowe wyszukiwanie
-
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
Instalacja:
- skopiować
tasklist.vim
do kataloguplugin
(u mnie ~/.vim/plugin/)
- skopiować
-
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.
Do Vim-a istnieje adekwatny plugin (wymaga skompilowanego Vim-a z obsługą Pythona):
-
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,
- itp..
Więcej informacji: http://www.divmod.org/trac/wiki/DivmodPyflakes
Skrypt Vim: http://www.vim.org/scripts/script.php?script_id=2441
pyflakes.vim działa tylko z forkiem dostarczanym w paczce. Niestety rozpada się z wersją oficjalną. Jest to dość duży problem.
-
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.
snipMate.vim Introductory Screencast from Michael Sanders on Vimeo.
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)ifmain
: oj, złoty snippet używany do krótkich testów :)
-
VimPDB - debugger Pythona w Vim
Używa się analogicznie jak
ipdb
czypdb
. 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.
-
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.
Źródła:
Instalacja:
easy_install pylint
- skrypt
pylint.vim
skopiować do~/.vim/compiler/
-
dodać do
.vimrc
:autocmd FileType python compiler pylint
Rady
-
Katalog
~/.vim
dobrze jest wersjonować:cd ~/.vim git init git add . git commit -am 'moj dobry config'
Jeśli plugin okaże się nieciekawy lub błędny wystarczy wycofać się do poprzednich rewizji lub po prostu użyć
git clean -f
. -
Przeładowanie Vim-a pluginami może go dość spowolnić.
Czy czegoś więcej potrzeba? Chyba tylko lepszej integracji z projektami opartymi na buildout. Będzie to temat na kolejnego posta.