Python-Programmieren mit Vim

Vim? Was das?

Vim ist der bekannteste Klon des eines der ältesten Editoren für Unices, vi. Von elvis, nvi, WinVi und seinem Urvater vi unterscheidet er sich dadurch, dass er viele Verbesserungen aufweist. Durch seinen Umfang und seine etwas "andere" Art ist er für den Anfänger oft sehr verwirrend, da seine Bedienung sich stark von "normalen" Editoren wie etwa SciTE unterscheidet. Diese Seite will jedoch nicht die Bedienung von Vim lehren, denn dazu gibt es genügend andere Informationen im Internet, wie auch den bei Vim mitgelieferten vimtutor. Vielmehr möchte diese Kurzanleitung aufzeigen, wie man Vim dazu einsetzen kann, effizienter in Python zu programmieren.

Angemerkt sei auch, dass Vim neben Emacs der weltweit von Programmierern am meisten genutzte Texteditor ist. Obwohl zwischen Vim- und Emacs-Anhängern oft ein Glaubenskampf um den besten Editor herrscht, sei an dieser Stelle bemerkt, dass dieses Wiki auch einen Python-Programmieren mit Emacs-Artikel beherbergt, in dem auf die Nutzung von Emacs mit Python eingegangen wird. Daher lohnt es sich, auch dort mal reinzusehen und Emacs zu probieren, falls man mit Vim nicht zurechtkommt.

Warum Vim?

Vorteile:

Nachteile:

Vim lernen

Wer mit Vim noch nie gearbeitet hat, sollte sich erst einmal Vim installieren. Die Vim-Installation verläuft in den meisten Fällen völlig unproblematisch. Unter Windows kann man das Setup nutzen; unter Linux kann man Vim mit dem Paketmanagement installieren. Nahezu jede Linux-Distribution bringt Vim schon mit, gleiches gilt für die BSD-Distributionen. Danach ist es empfehlenswert, mit dem interaktiven Vim-Tutorial anzufangen, welches man mit dem Aufruf vimtutor de in deutscher Sprache aufrufen kann. Nachdem man dieses Tutorial durch hat, hat man schon eine Vorstellung, wie die Arbeit mit Vim aussehen wird. Natürlich bietet das kleine Tutorial bei weitem keinen kompletten Überblick über alle Funktionen. Daher sei an dieser Stelle noch auf weitere Dokumentation und die Literatur verwiesen.

Vim konfigurieren

Da Vim ein sehr mächtiger Editor ist, kann man auch bei Vim an der einen oder anderen Schraube drehen. Im Falle Vims sind das hunderte von Schrauben, aber diese sind meist auf sinnvolle Standardwerte gesetzt, daher reicht es sich auf die wichtigsten zu beschränken. Die zentrale Einstellungsdatei ist die Datei .vimrc, die sich im $HOME-Ordner des Benutzers befindet. Dort kann man alle möglichen Einstellungen reinschreiben, die dann beim nächsten Vim-Start wieder automatisch geladen werden. So eine Datei von Grund auf zu schreiben ist aufgrund der Fülle an Möglichkeiten nicht immer einfach, deswegen folgt hier eine einfache, kommentierte .vimrc:

" Automatische Einrückung (Globale Konfiguration)
set smartindent
set smarttab

" UTF-8 als Default-Encoding
set enc=utf-8

" Ein Tab entspricht vier Leerzeichen (wie in PEP 8 definiert)
" Dies aber nur für python, damit es nicht mit anderen (ruby, c, Makefiles) kollidiert
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4 softtabstop=4

Über ein paar Zeilen kann man sicher streiten (z.B. das UTF-8 Default-Encoding und smartindent statt cindent), aber sie dienen auch nur als Richtungsweiser. Hier ein paar komplexere .vimrcs von Wiki/Forenbenutzern:

Tipp von Leonidas: Wenn Backspace streikt, einfach set backspace=indent,eol,start in die .vimrc eintragen. Sollte in aller Regel nicht nötig sein, aber so manche Linux-Distribution (insbesondere SUSE 10) bringt veränderte Defaults mit.

Vim-Tricks

Python-Programme direkt starten

Die meisten Programmierer nutzen zum Schreiben ihrer Programme ein Fenster mit Vim und ein anderes mit einer Shell, in dem sie ihr Programm dann ausführen und testen. Dies funktioniert recht gut, allerdings kann das etwas unbequem für Leute sein, die gewohnt sind direkt im Editor die [F5]-Taste zum Starten des Programms zu verwenden. Natürlich ist das auch im Vim kein Problem.

Um Python-Programme durch Tastendruck starten zu lassen, einfach dies in die .vimrc eintragen:

" Start python on F5
autocmd FileType python map <F5> :w<CR>:!python "%"<CR>

Die map-Zeile veranlasst Vim, die aktuelle Datei zu speichern und daraufhin den Python-Interpreter aufzurufen. Das Programm startet dann ganz normal und nach dem Beenden gibt Vim dem User noch eine Chance, die Ausgaben des Skripts in aller Ruhe anzusehen.

Tipp Anstelle der autocmd-Aufrufe kann man sich auch einfach die Befehle in eine ftplugin-Datei schreiben. Dazu muss man nur eine Datei ~/.vim/ftplugin/python.vim anlegen und die Befehle auflisten, die ausgeführt werden sollen. Wenn der Ordner nicht existiert, muss er natürlich vorher angelegt werden.

Codeblöcke

Obwohl Python im Allgemeinen eine Sprache ist, die mit sehr wenig Boilerplate-Code auskommt, gibt es durchaus einige Codestücke, die öfter in eigenem Code vorkommen. So ist es oft nützlich, eine Shebang-Zeile einzufügen, was unter Unices Vorteile bietet und unter anderen Systemen auf keinen Fall stört. Ebenso ist es oft sinnvoll, eine Zeile in den Quellcode zu schreiben, die das Encoding angibt. Da sich diese Zeilen aber so gut wie nie ändern, ist es durchaus praktisch, sie in Vim abzuspeichern und dann bei Bedarf in den Quelltext einzufügen. Genau für solche Zwecke eignen sich abbreviations, also auf Deutsch Abkürzungen.

Neuer und auch leistungsfähiger ist SnippetsEmu, da funktionieren auch Snippets mit Platzhaltern. SnippetsEmu wird weiter unten in diesem Artikel vorgestellt.

Reguläre Ausdrücke

Vim unterstützt natürlich reguläre Ausdrücke, jedoch weicht seine Syntax der regulären Ausdrücke etwas von der des Python-Moduls re und anderen Unix-Programmen wie awk ab. So müssen alle Zeichen, die eine Spezialbedeutung in regulären Ausdrücken haben, maskiert werden. Um beispielsweise eine Gruppe zu definieren, nutzt man in Python (...), wohingegen man unter Vim erst die Sonderzeichen maskieren muss: \(...\). Da dies bei längeren Ausdrücken aufwending und ungewohnt ist, gibt es die Möglichkeit vor den Ausdruck ein \v zu setzen, welches Vim veranlasst, den regulären Ausdruck als "very magic" zu interpretieren. Dadurch wird es unnötig, jedes Sonderzeichen einzeln zu maskieren.

/codes\(\n\|\s\)*where  : normaler Regulärer Ausdruck
/\vcodes(\n|\s)*where   : sehr magischer Regulärer Ausdruck

Trotz dieser Erleichterung ist es immer noch geplant in einer zukünftigen Version von Vim POSIX-kompatible reguläre Ausdrücke zu implementieren.

Zeichensätze, Zeilenenden

Manchmal ist es nötig, eine Datei aus einem Zeichensatz in einen anderen zu konvertieren, beispielsweise im Quellcode Umlaute sind, die nicht korrekt dargestellt werden. Dafür bietet Vim mehrere Erleichterungen. Zum einen öffnet Vim eine Datei und rät automatisch deren Zeichensatz, um die Datei so gut wie möglich anzuzeigen. Der von Vim erratenene Zeichensatz lässt sich während des Editierens mit :set enc? bestimmen, mit :set enc=utf-8 wird er auf UTF-8 gestellt.

Ein für den Dateiaustausch zwischen Windows und Unix-Systemen leidiges Thema sind die Zeilenenden. Eine Textdatei (also auch ein Quelltext) unter Windows nutzt als Zeilenumbruch "Carriage Return" und "Line Feed" wohingegen Unices typischerweise nur "Line Feed" setzen. Daher kann es vorkommen, dass, wenn die Dateien den "falschen" Zeilenumbruch haben, unter Windows alle in einer Zeile dargestellt werden oder unter Unices die Zeilen seltsame Zeichen am Schluss beinhalten. Der Befehl :set ff? gibt Aufschluss über das Zeilenenden-Format der aktuellen Datei und ermöglicht mit :set ff=dos bzw. :set ff=unix das umstellen. Für den Python-Interpreter selbst ist das Format bedeutungslos. In Python enden alle Zeilen generell mit \n und der Interpreter geht mit beiden Formaten genauso gut um.

Ansonsten sei Python-Programmierern noch das emacsmode-Plugin ans Herz gelegt. Dieses fügt Unterstützung für die verbreiteten Emacs-Cookies hinzu (Beispiel: # -*- coding: utf-8 -*-).

Zu einer bestimmten Zeile springen

Beim Programmieren ist es oft nötig, dass man in eine bestimme Zeile springt, sei es um dort einen Fehler zu korrigieren oder die Dokumentation zu korrigieren. Dafür bietet Vim den sehr einfach zu merkenden Befehl G, wie "go to", der jedoch groß geschrieben wird. Mit G wird der Cursor direkt in die letzte Zeile der Datei gesetzt. Um eine andere Zeile anzusteuern, reicht ein simples 1G, welches in die erste Zeile springt, oder 23G und 42G, welche analog dazu funktionieren. Alternativ kann man statt G auch gg verwenden.

Mausbedienung im Textmodus

Split Windows per Befehl zu vergrößern und verkleinern ist zwar möglich, aber schneller geht es mit der Maus - entweder in GVim oder auch in vim in der Konsole: :set mouse=a und schon kann man die vim-Fenster auch mit der Maus bedienen. Leider deaktiviert es auch das Kontextmenü des Terminals, so das man nur noch per Mittelklick pasten kann. Um es wieder per Kontextmenu zu machen, muss man entsprechend :set mouse= vorher aufrufen. Eine elegante Möglichkeit ist es, die Maus im Insert-Modus an das Terminal zu überlassen, so dass man im Insert-Modus das Kontextmenü hat und in den anderen Modi die Maus dennoch verwenden kann. Dazu setzt man :set mouse=nvc (normal, visual, command).

Vim-Plugins

Weitere essentielle oder sinnvolle Plugins für Python Programmierer:

Bicycle Repair Man

Bicycle Repair Man, ein Werkzeug zum Refactoring. Unter Debian/Ubuntu einfach mit aptitude install bicyclerepair zu installieren.

SuperTab

SuperTab ermöglicht es, die Codevervollständigung per Tab vorzunehmen. Man kann auswählen welche der vielen Arten Code zu vervollständigen man benutzen will. Ab Vim 7 wird auch ein Dropdown-Menü angezeigt, in denen die verschiedenen Alternativen zur Auswahl stehen.

snippetsEmu

Vielen, die den Mac OS X-Editor TextMate kennen, werden seine Features für Code-Schnipsel fehlen. Vim bot zwar mittels der Abbreviations die Möglichkeit Code-Schnipsel einzufügen, snippetsEmu führt dies aber noch viel weiter. Damit ist es möglich Schnipsel mit Platzhaltern zu verwenden und somit möglichst große Stücke Quellcode aus den Schnipseln zu generieren. Im Moment ist die Anzahl der bereits verfügbaren Schnipsel eher klein, aber man kann ohne weiteres eigene Schnipsel selbst definieren.

project

Wenn man mehrere Dateien bearbeiten will, was besonders oft vorkommt, wenn man an Projekten arbeitet, ist es mühsam, immer mit :e dateiname.py die Datei wechseln zu müssen. Man kann sich mit dem Plugin project behelfen, welches eine Ordnerstruktur nach Quellcodes durchsucht und diese in einer Seitenleiste (Vim Window) anzeigt. In dieser Leiste kann man sich die Dateien ansehen, Ordner ein- und ausklappen und Dateien mit Enter öffnen.

taglist

Die Navigation in langen Quelltexten kann bisweilen sehr anstrengend sein. In der Unix-Welt sind daher ctags verbreitet, mit denen man bestimmte Punkte wie Funktionen, Klassen, etc. in Dateien finden kann. Das Vim-Plugin taglist bietet eine Seitenleiste, in der es die von Exuberant Ctags gefundenen ctags anzeigt. Man kann damit leicht bestimmte Funktionen und Klassen in einer Python-Datei anspringen.

Unterstützung für Python Template-Engines

Python kennt jede Menge Template-Engines. Für die wichtigsten gibt es Vim-Plugins:

Von Haus aus bringt Vim Support für Cheetah mit. Auch wird eine alte Version des Django-Plugins bereitgestellt, doch lohnt es sich, die neue Version zu laden.

XML-basierende Template-Engines haben in der Regel keine extra Highlighting-Dateien, da reichen die mitgelieferten absolut aus.

Screenshots

http://lucumr.pocoo.org/static/pictures/vim_wildmenu_zoomed.png

http://xivilization.net/flyserver/imgs/minibufexplorer.png

Tags: Editoren | Tipps

Python-Programmieren mit Vim (last edited 2009-07-13 14:55:35 by UlfRompe)