Vorweg: Dies ist keine Einführung in Emacs allgemein, dafür gibt's z.B. das mitgelieferte Tutorial und das sehr empfehlenswerte Emacs-Wiki. Hier sind lediglich ein paar Tipps, wie Emacs das Python-Programmieren einfacher machen kann.
Der Fairness wegen: Zu Vim gibts hier auch einen Artikel.
Auf dieser Seite:
Contents
Warum Emacs?
Vorteile:
- Emacs kann fast alles. Emacs unterstützt viele Programmier- und Markupsprachen (Python, C/C++, Lisp, HTML, LaTeX, ...), man kann mit ihm Mails lesen, ihn als Dateimanager benutzen, Emacs hat Schnittstellen für Tools wie cvs, diff und grep und vieles mehr.
- Emacs lässt sich auch ohne graphische Oberfläche benutzen, also auch über SSH.
- Emacs ist komplett ohne Maus, oder natürlich auch mit Maus bedienbar.
- Emacs lässt sich relativ einfach erweitern und sehr flexibel an die eigenen Bedürfnisse anpassen.
Mittels Pymacs kann man auch Python zur Anpassung von Emacs verwenden.
- Es gibt eine umfassende Online-Hilfe zu jeder Funktion.
- Emacs gibt es für sehr viele Plattformen.
Nachteile:
- Die Benutzung von Emacs ist zunächst etwas gewöhnungsbedürftig, der Schwerpunkt liegt auf Tastaturbenutzung. Man benötigt etwas Einarbeitungszeit.
- Die Konfigurationsdatei von Emacs ist ebenfalls gewöhnungsbedürftig, da sie in der Programmiersprache Emacs Lisp geschrieben wird.
Python-Mode aktivieren
Normalerweise sollte der Python-Mode schon installiert sein. Er wird dann automatisch für alle .py-Dateien aktiviert, oder man kann ihn manuell mit M-x python-mode aktivieren.
Ist der Python-Mode noch nicht vorhanden, muss man sich die Datei python-mode.el organisieren und irgendwo hinlegen, wo Emacs sie findet. Zum Beispiel in den Ordner /home/foo/elisp, dann muss man in seine .emacs-Datei folgende Zeile hinzufügen:
(add-to-list 'load-path "/home/foo/elisp")
Damit Emacs die python-mode.el auch lädt, kommt noch dies in die .emacs:
(require 'python-mode)
Unter Debian/Ubuntu kann man auf einfach aptitude install python-mode ausführen.
Nun sollte der Python-Mode wie oben genannt funktionieren.
Wenn man bestimmte Einstellungen nur für das Bearbeiten einer Datei haben möchte, dann kann man file variables benutzen. Das ist sehr nützlich, wenn man eine Datei ohne Endung .py hat, die man aber trotzdem im python-mode bearbeiten möchte. Anstatt jedes Mal den Python-Mode per Hand zu starten, kann man ans Ende der Datei folgendes schreiben:
#Local Variables: #mode: python #End:
Emacs sind die Python-Kommentarzeichen dabei egal.
Grundsätzliches im Python-Mode
Es taucht in der Menüzeile ein Python-Menü auf. Dort kann man die wichtigsten Funktionen und ihre Tastaturkürzel sehen. Außerdem gibt es das IM-Python-Menü, dort kann man direkt zu Funktionen und Klassen in seinem Python-Dokument springen. Am meisten benötige ich die "Shift Region Left/Right", die den markierten Bereich eine Einrückungstiefe nach links oder nach rechts bewegt, und die "Comment Out Region"/"Uncomment Region", mit der man einen markierten Bereich auskommentieren und wieder ent-kommentieren kann.
Einrücken
Einrücken tut man mit TAB. Keine Angst, Emacs macht daraus Leerzeichen. Gibt es mehrere verschiedene Einrückmöglichkeiten für eine Zeile (wenn man sich in einem eingerückten Block befindet), rückt jedes weitere TAB eine Tiefe weiter aus und schließt damit einen anderen Block. Wenn das jetzt kompliziert klingt, einfach mal ausprobieren! Das tolle ist, dass es egal ist, wo in der Zeile sich der Cursor befindet -- man kann einfach TAB drücken, und die Zeile wird eingerückt. Auch Fortsetzungszeilen werden passend (z.B. an der öffnenden Klammer) orientiert.
Im Menü fehlt leider ein Eintrag für die nützliche Funktion py-indent-region (C-c TAB), die einen markieren Bereich automatisch einrückt. (Natürlich kann man den Menü-Eintrag selbst hinzufügen...
)
Die Einrückungstiefe besteht standardmäßig aus vier Leerzeichen. Öffnet man eine Datei, die eine andere Einrückungstiefe benutzt, passt Emacs die Einrückungstiefe automatisch an, sodass TAB und die oben genannten Funktionen wieder korrekt arbeiten. Die Einrücktiefe kann man mit der Variable py-indent-offset an seinen Geschmack anpassen:
(setq py-indent-offset 8)
in der .emacs setzt die Einrückungstiefe standardmäßig auf 8 Leerzeichen. Oder man schreibt folgendes ans Ende seiner Datei, um die Einrückungstiefe für diese Datei festzulegen:
#Local Variables: #mode: python #py-indent-offset: 8 #End:
Zu bedenken ist aber, dass der Styleguide, PEP 8 ausdrücklich vier Leerzeichen empfiehlt.
Sehr nützlich sind auch die Funktionen M-x tabify und M-x untabify, mit denen man in dem markierten Bereich alle Leerzeichengruppen durch Tabs ersetzen kann und umgekehrt. Und ist man sich immer noch nicht sicher, ob man es in einer Datei mit Tabs oder Leerzeichen zu tun hat, so kann man sich show-whitespace-mode.el herunterladen und Tabs und Leerstellen farbig markieren lassen.
Syntax Highlighting
Ist das Syntax-Highlighting nicht automatisch aktiviert, hilft folgende Zeile in der .emacs-Datei:
(setq global-font-lock-mode t)
Eine nützliche Erweiterung zum standardmäßigen Syntax-Highlighting bietet folgender Code, der TODO-Tags rot einfärbt.
(font-lock-add-keywords 'python-mode
'(("\\<\\(FIXME\\|HACK\\|XXX\\|TODO\\)" 1 font-lock-warning-face prepend)))
Codevervollständigung
Um ein Wort zu vervollständigen, drückt man M-/. Es wird die erstbeste Vervollständigung eingefügt. Mit wiederholtem Drücken von M-/ wechselt man durch alle möglichen Vervollständigungen.
Scripts ausführen
Zuerst muss der Python-Interpreter gestartet werden (C-c ! oder der entsprechende Menü-Eintrag). Dann kann man sein Script zum Beispiel mit C-c C-c (Execute Buffer) ausführen.
Es gab im Python-Forum mehrmals die Anfrage wegen Problemen bei raw_input(). Bei mir funktionieren auch Scripts mit raw_input() wunderbar im Emacs.
Falten von Quellcode mit Semantic
Dazu muss semantic installiert werden, welches ein Teil von CEDET ist. Semantic stellt den semantic-tag-folding-mode bereit. Folgendes Snippet lädt den semantic-tag-folding-mode und weist zwei Tastenkürzel zum Verstecken bzw. Anzeigen des aktuellen Blocks zu.
(require 'semantic-tag-folding) (defun python-folding-hook () (global-semantic-tag-folding-mode 1) (local-set-key (kbd "C-c <left>") 'semantic-tag-folding-fold-block) (local-set-key (kbd "C-c <right>") 'semantic-tag-folding-show-block) ) (add-hook 'python-mode-hook 'python-folding-hook)
Debuggen mit dem Python-Debugger
Der Befehl M-x pdb startet die Anbindung an Pythons Debugger. Zunächst wird man nach dem Aufruf des Debuggers gefragt, also zum Beispiel:
python -m pdb myfile.py
Es öffnet sich ein zusätzlichen Buffer, in dem man den Debugger wie gewohnt bedienen kann. Außerdem erhält man zusätzliche Menüs zur Steuerung, und die Stelle im Quelltext, die der Debugger gerade ausführt, wird markiert (und eventuell der Quelltext geladen).
Praktischerweise merkt sich Emacs den pdb-Aufruf, ausserdem kann man ihn mit der Variable gud-pdb-command-name einstellen.
Abbreviations (Abkürzungen) und Skeletons
Abbreviations, abbrev-mode
Man kann in Emacs Abkürzungen (Abbreviations) definieren, die durch anderen Text ersetzt werden. Dazu muss man Emacs zunächst sagen, in welcher Datei er die Abbreviations findet. Man kann in der .emacs z.B. eingeben:
(setq abbrev-file-name "~/elisp/abbrevs.el")
Die abbrevs-Datei sieht dann z.B. folgendermaßen aus:
(define-abbrev-table 'python-mode-abbrev-table
'(("shebang" "#!/usr/bin/env python" nil 1)
("utf8" "# -*- coding: utf-8 -*-" nil 1)
))Hier werden zwei Abbreviations für den Python-Mode definiert, shebang und utf8. Mit M-x add-mode-abbrev und M-x add-global-abbrev kann man auch interaktiv Abbreviations definieren, die dann mit M-x write-abbrev-file dauerhaft gespeichert werden können.
Es gibt mehrere Möglichkeiten, diese Abbreviations zu ersetzen: Wenn man shebang im Text geschrieben hat und der Cursor direkt dahinter steht, kann man M-x expand-abbrev aufrufen oder das Tastaturkürzel C-x ' verwenden. Mit M-x expand-region-abbrevs kann man alle Abbreviations in einer markierten Region ersetzen. Eine weitere Möglichkeit bietet der abbrev-mode, der mit M-x abbrev-mode aktiviert wird. Hier werden Abürzungen automatisch ersetzt, sobald man das folgende Leerzeichen tippt. Um das Vervollständigen zu unterbinden, kann man vor dem Leerzeichen C-q drücken.
Skeletons
Mit Skeletons kann man Abkürzungen um eine Template-Funtion erweitern. Ein abbrev-file mit einem definierten Skeleton sieht zum Beispiel so aus:
(define-skeleton python-openfile-skeleton
"Inserts file open"
"File name: "
"try:" \n
"f = open('" str "')" \n
_ \n
"except OSError:" (indent-for-tab-command) \n
"print 'Sorry.'")
(define-abbrev-table 'python-mode-abbrev-table
'(("openfile" "" python-openfile-skeleton 0)
("shebang" "#!/usr/bin/env python" nil 1)
("utf8" "# -*- coding: utf-8 -*-" nil 1)
))Hier wird eine zusätzliche Abkürzunge openfile definiert. Beim Ersetzen dieser Abkürzung fragt Emacs in einem Promt nach dem Dateinamen, der im Template an der Stelle str eingesetzt wird, an der Stelle _ wird der Cursor platziert. Die \n sorgen für einen Zeilenumbruch mit Einrückung entsprechend dem aktivierten Mode. In den Templates können noch beliebige Funktionen ausgeführt werden. Das oben definierte Skeleton passt sich der Einrückung an, selbst wenn man es in einem eingerückten Block ausführt.
Natürlich kann man Skeletons auch direkt ausführen, ohne den abbrev-mode zu benutzen. Oder man kann sie an Tastaturkürzel binden...
Etags
Etags erlaubt einem, zum Beispiel innerhalb mehrerer Python-Dateien zu suchen oder zu bestimmten Tags (i.d. R. Funktions- und Klassendefinitionen) zu springen. Um diese Features zu benutzen, muss man sich zuerst mit dem bei Emacs mitgelieferten Programm eine Tags-Table erstellen:
etags *.py foo/*.py
Dieser Befehl zum Beispiel erstellt Tags von allen Python-Dateien im aktuellen Verzeichnis und in ./foo und speichert sie in der Datei ./TAGS. Diese Tags-Table kann man in Emacs mit M-x visit-tags-table laden.
Nun kann man zum Beispiel mit dem Cursor auf einen Funktionsaufruf gehen, M-. drücken, mit Enter den Tag bestätigen (oder einen anderen Tag eingeben), und Emacs springt zu der Datei an die Stelle, in der die Funktion definiert wurde. Man kommt wieder zurück zur Ausgangsposition mit M-*.
Weitere nützliche Funktionen: tags-apropos listet einem alle Tags auf, die eine gegebene Regexp matchen. In der Liste kann man dann mit der mittleren Maustaste auf einen Tag klicken und landet bei der ensprechenden Definition. tags-search und tags-query-replace suchen und ersetzen jeweils in allen Dateien, die in die Tags-Table eingebunden wurden. Im Menü Edit -> Go To hat man Zugriff auf die wichtigsten Funktionen.
Weitere Tipps
Nervige ~ -Dateien?
Emacs speichert Backup-Dateien, die mit ~ enden, neben den originalen Dateien. Das stört, wenn man z.B. seine Software weitergeben oder veröffentlichen möchte. Man kann Emacs mit folgender Zeile dazu bringen, alle ~ -Dateien in dem Ordner .emacs_backup zu speichern:
(setq backup-directory-alist '(("." . "/home/foo/.emacs_backup")))
Man kann sogar eine ganze Liste von unterschiedlichen Regexps und dazugehörigen Ordnern angeben, sodass zum Beispiel Backups von .py-Dateien einem anderen Ordner gespeichert werden als der Backup .c-Dateien oder was auch immer...
Higlighting der Klammersetzung
Emacs kann einem anzeigen, ob zu der Klammer unter dem Cursor eine passende Klammer vorhanden ist oder nicht. Ist dieser Mode nicht automatisch aktiviert, kann man ihn mit folgender Zeile in der .emacs-Datei einstellen:
(show-paren-mode t)
Zu einer bestimmten Zeile springen
Mit dem Befehl M-x goto-line kann man direkt in eine Zeile springen. Beim Programmieren braucht man das recht oft, sodass eine Tastenkombination nicht schlecht wäre. Mit folgender Zeile legt man sich goto-line in allen Modes auf M-n:
(define-key esc-map "n" 'goto-line)
Auch in der default-Keymap gibt es eine Bindung für goto-line: M-g g.
Einfacheres Speichern
Die Tastenkombination zum Speichern lautet in Emacs standardmäßig C-x C-s. Wer es lieber kürzer hat, kann Speichern auch mit Suchen vertauschen:
(global-set-key (kbd "C-s") 'save-buffer) (global-set-key (kbd "C-x C-s") 'isearch-forward)
Dadurch ist Speichern jetzt als C-s verfügbar. Die Suche startet man dagegen per C-x C-s. (Unpraktisch wird das, wenn man öfter anderer Leute Emacs benutzen muss...)
Mausbedienung im Textmodus
Emacs Windows per Befehl zu vergrößern und verkleinern ist zwar möglich, aber schneller geht es mit der Maus - entweder im grafischen Emacs oder auch in der Konsole: M-x xterm-mouse-mode und schon kann man die Emacs-Fenster auch mit der Maus bedienen, was nicht nur wie der Name vermuten lässt in xterm funktioniert sondern auch in moderneren Konsolen wie dem Gnome-Terminal. Leider deaktiviert es auch das Kontextmenü des Terminals so das Pasten nicht mehr möglich ist, da muss man entsprechend M-x xterm-mouse-mode vorher zum Ausschalten aufrufen.
Nützliche Zusatzmodule
Speedbar
Mit M-x speedbar erhält man eine Übersicht über alle Dateien im aktuellen Verzeichnis und kann bequem drin navigieren. Geht aber nur unter X11, da ein neues X11-Fenster geöffnet wird.
Pylint
Der Syntaxchecker pylint lässt sich auch aus dem Emacs heraus bedienen. Dazu muss man sich die Datei pylint.el besorgen. Speichert man sie in z.B. /home/foo/elisp/pylint.el, dann wird sie durch folgende Zeilen in der .emacs-Datei automatisch geladen:
(add-to-list 'load-path "/home/foo/elisp") (require 'pylint)
Auch hier reicht unter Debian/Ubuntu ein aptitude install pylint.
Man erhält im Python-Menü dann Einträge zum Starten von pylint und zum Navigieren durch die gefundenen Fehler. Pylint öffnet ein zweites Emacs-Fenster, um sein Resultat anzuzeigen. Auf die Fehlermeldungen mit Zeilenangabe kann man mit der mittleren Maustaste klicken, um zu der entsprechenden Zeile im Quellcode zu springen.
ECB
Ein sehr praktisches Hilfsmittel ist ECB, das ähnlich wie die Speedbar Dateilisten anzeigt, aber darüber hinaus noch einen Klassenbrowser und eine History verfügbar macht.
Bicycle Repair Man, a Refactoring Tool for Python
Bicycle Repair Man (unter Debian/Ubuntu: aptitude install bicyclerepair)
Um Bicycle Repair Man zum Laufen zu bringen, ist ebenfalls Pymacs notwendig (unter Debian/Ubuntu: aptitude install pymacs). Nun muss man Bicycle Repair Man noch aktivieren, sofern dies nicht bereits automatisch geschehen ist. Dazu ist folgendes nötig:
(pymacs-load "bikeemacs" "brm-") (brm-init)
MoinMoin-Mode
Wenn man seine ersten Python-Ergebnisse hier im Wiki präsentieren will, dann stößt man früher oder später auf ein Problem: Die Texteingabe-Felder der meisten Browser sind erschreckend unkomfortabel im Vergleich zu Emacs. Es wäre doch ideal, auch MoinMoin-Einträge mit dem Emacs zu schreiben.
Dabei hilft der MoinMoin-Mode. Er bietet Features wie Syntax-Highlighting, Folding oder automatisches Einfügen von Listen-Elementen. Die Installation ist einfach. Zuerst muss man die Dateien moinmoin-mode.el und screen-lines.el herunterladen und sie dort ablegen, wo Emacs sie findet. Dann muss Emacs nur noch dazu gebracht werden, die beiden Module zu laden. Dazu fügt man der ~/.emacs folgende Zeilen hinzu:
(require 'moinmoin-mode)
(autoload 'screen-lines-mode "screen-lines"
"Toggle Screen Lines minor mode for the current buffer." t)
(autoload 'turn-on-screen-lines-mode "screen-lines"
"Turn on Screen Lines minor mode for the current buffer." t)
(autoload 'turn-off-screen-lines-mode "screen-lines"
"Turn off Screen Lines minor mode for the current buffer." t)Jetzt steht der MoinMoin-Mode zur Verfügung. Bei Dateien mit der Endung .wiki wird er automatisch aktiviert, ansonsten kann man ihn per M-x RET moinmoin-mode manuell laden. Um einen Eindruck über die Features zu gewinnen, kann man einmal das kurze Tutorial durcharbeiten.
Wichtig: Es kann passieren, dass nach dem Editieren einer Wiki-Datei das Syntax-Highlighting nicht mehr funktioniert. In diesem Fall sollte man einmal die korrigierte Version versuchen.
Jetzt stellt sich nur noch die Frage, wie man den Browser dazu bringt, den Text in den Emacs zu laden. Copy n' Paste ist zwar eine Lösung, aber bei weitem nicht optimal. Und es geht besser! Freunde des Firefox sollten einen Blick auf die Erweiterung It's All Text werfen, die den Texteingabefeldern im Firefox einen kleinen Butten hinzufügt, um Text in externen Editoren zu laden.
Dieser Abschnitt wurde natürlich mit dem MoinMoin-Mode und It's All Text geschrieben. Ihr seht also: Es funktioniert wunderbar!
paste.py
Oft möchte man mal eben ein kleines Snippet in einem pastebin veröffentlichen. Normalerweise verwendet man dazu die Weboberfläche des pastebins, in der der Code umständlich per copy n' paste eingefügt werden muss. Das Pocoo-Pastebin von ArminRonacher allerdings bietet eine XML-RPC-Schnittstelle, um das Pastebin aus Programmen heraus zu kontrollieren.
Genau dies macht das Pymacs-Skript paste.py. Es kann nicht nur Pastes aus emacs heraus erstellen, sondern auch bestimmte Pastes aus dem Pastebin herunterladen. Nach der Installation von Pymacs reichen die folgenden Zeilen in der ~/.emacs, um paste.py zu aktivieren:
(pymacs-load "paste") ; um das Menü zu aktivieren (paste-menu)
Das Skript kann so konfiguriert werden, dass es nach dem Erzeugen eines Pastes dieses im Browser anzeigt, oder die URL im Kill-Ring ablegt.
Screenshot
So kann Emacs zur Python-Entwicklung aussehen:
Im Einsatz sind
- GNU Emacs mit GTK-Oberfläche
- python-mode
- ECB
- tabbar.el
Die dazu passende Konfigurationsdatei ist hier verfügbar.