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:

  1. TagList

    Plugin, który wyświetla strukturę kodu źródłowego.

    Zrzut ekranu z pluginem TagList w akcji

    Instalacja:

    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
    
  2. 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).

    Screenshot przedstawiający działanie pluginu TaskList

    Do pobrania: http://www.vim.org/scripts/script.php?script_id=2607

    Instalacja:

    • skopiować tasklist.vim do katalogu plugin (u mnie ~/.vim/plugin/)
  3. 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):

  4. 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,
    • 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.

  5. 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łu
    • for: pętla for
    • while: pętla while
    • def: definicja funkcji
    • cl: definicja klasy
    • defs: definicja metody
    • try: różne rodzaje bloku try-except (do wyboru)
    • ifmain: oj, złoty snippet używany do krótkich testów :)
  6. 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.

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

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

    Źródła:

    Instalacja:

    • easy_install pylint
    • skrypt pylint.vim skopiować do ~/.vim/compiler/
    • dodać do .vimrc:

      autocmd FileType python compiler pylint

Rady

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

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

Krótko o mnie

Jestem programistą i architektem systemów IT. Specjalizuję się w aplikacjach intra- oraz internetowyh. Zajmuję się wsparciem istniejących systemów oraz projektowaniem i produkcją.

Zainteresowanych moimi usługami zapraszam do wysłania zapytania.

Javascript logo PostgreSQL logo Cassandra logo Redis logo ElasticSearch logo Ansible logo HTML5 logo CSS3 logo NGINX logo Docker logo

Komentarze

2011-01-05 15:15:57 Sharpek:

Hej, mógłbyś wrzucić tutaj swój vimrc ?