vimacs
Ich bin einer dieser alteingesessenen Emacsbenutzer. Ich benutze den Emacs schon seit fast 20 Jahren. Meine Config ist riesig und bei den meisten Sachen weiss ich gar nicht mehr, was das soll. Er ist mir jedenfalls sozusagen in Fleisch und Blut übergegangen.
Hin und wieder jedoch (z.b. in der Arbeit oder auf dem Server) muss ich auf den vi ausweichen. Ja, es gäbe auch eine Consolenvariante vom Emacs, aber die mag ich nicht. Da funktioniert 80% meiner Config nicht und das nervt. Heute nun habe ich festgestellt, dass ich eigentlich recht oft mit vi zugange bin. Jedesmal nervt er mich. Seit Jahren! Und im Grunde ist das meine eigene Schuld. Was bin ich auch so dumm, und quäle mich mit dem Onboard BSD-vi herum!
Da gibt es ja auch noch den Vim. Ich habe sogar eine minimalistische .vimrc seit grauen Urzeiten. Also heute habe ich mich jedenfalls mal aufgerafft, mir eine .vimrc zu erschaffen, mit der sich der Vim wenigstens ungefähr so verhält wie mein Emacs. Die Betonung liegt hierbei auf mein. Denn da ich den Emacs heftig customized habe, wird sich das von einem Stock-Emacs sicher etwas unterscheiden. Entsprechend natürlich auch die .vimrc.
Soweit ich das bis jetzt überblicke, habe ich es tatsächlich geschafft, die mir wichtigsten Features halbwegs abzubilden. Hier mal eine Liste:
- automatische Einrückung (Indentation). Wenn schon eingerückt ist, soll er in der nächsten Zeile da bleiben. Das hab ich soweit hinbekommen. Kommt natürlich nicht ansatzweise an den Emacs heran. Dort ist es z.b. so, dass ich irgendwo in einer Codezeile <TAB> drücken kann und er rückt das dann richtig ein, je nach Context im Code (d.h. Emacs "kann" Perl oder was auch immer). Im Vim geht das nicht. Man muss daher immer gleich richtig einrücken. Wenn man die Indents nachträglich ändern will, muss man das händisch machen. Es gibt da wohl auch Plugins dafür, die hab ich aber noch nicht kapiert. Kommt evtl noch.
- Leerzeichen statt echter Tabs. Geht 1a.
- Fenster aufteilen (Split Buffers). Geht auch 1a, sogar mit den gleichen Tastenkombinationen wie bei mir im Emacs, z.b. CTRL-3 horizontal splitten oder CTRL-1 Splits aufheben. Auch mit ALT-O zwischen den Buffern wechseln klappt prima.
- Schnell zwischen Buffern wechseln (ohne Splits). Im Emacs mit CTRL-X b [name|<TAB>...] bzw CTRL-X b um zum letzten Buffer zu kommen. Hab ich nicht hingekriegt. Statt dessen hab ich ein Plugin installiert, mit dem ich zumindest eine Bufferliste bekomme. Um dahin zu kommen, muss ich CTRL-X drücken. Damit kann ich leben (gerade so).
- Paragraph-weise Scrollen. Im Emacs mache ich das mit CTRL-<UP|DOWN> und dann springt der Cursor immer von einem Absatz zum nächsten (erkennt er anhand leerer Zeilen). Im Vim ist das entsprechende Commando '{' bzw '}'. Hab ich mir auf meine Tastenkombinationen gelegt und klappt ganz hervorragend. Sogar im Inputmode (Vim hat ja mehrere Modi), in dem Fall geht er nach dem Springen wieder zurück in den Inputmode. Haha!
- Wort-weise Scrollen. Ähnlich wie oben, nur mit CTRL-<LEFT|RIGHT> um ein Wort nach links oder rechts springen. Geht im Vim mit 'b' und 'w', die ich mir auf meine Kürzel gelegt hab.
- Automatisches Klammernsetzen. Ich habe ein relativ intelligentes Auto-Klammer-Plugin installiert namens Smartinput. Wirklich zufrieden bin ich damit nicht. Es bleibt immer noch viel zu viel Tipperei übrig. Zumal ich im Emacs bei bestimmten Keywords wie if, while oder foreach automatisch gleich alle notwendigen Klammern gesetzt kriege, samt richtiger Einrückung. Ich hab mir ein paar Abbreviations gebastelt, die das ungefähr nachbilden. Mehr schlecht als recht und auch nur für Perl.
- Syntaxhighlighting. Kann Vim ganz prime, obgleich ich als Emacsuser 16 Mio Farben gewöhnt bin. Im Vim krieg ich nur 16 Farben her, das ist etwas mager. Es soll wohl auch mit 256 Farben gehen, ich weiss nur noch nicht, wie. Ich benutze ein leicht angepasstes Farbschema namens Astronaut.
- *scratch*. Das ist ein im Emacs immer vorhandener Buffer, der nicht gespeichert werden muss (d.h. er fragt beim Beenden nicht wegen Speichern usw). Da kann man Notizen reinschreiben oder mal eben irgend einen Emacsmode ausprobieren. Im Vim hab ich das nachgebildet mit dem Scratch Plugin. Ich hab es allerdings nicht hinbekommen, dass der *scratch* Buffer immer da ist. Also hab ich schon, nur wenn ich dann eine Datei geöffnet habe, war der *scratch* Buffer immer der Aktuelle. Sehr nervig. Ich hab das jetzt so gemacht, dass *scratch* nur erstellt wird, wenn ich Vim ohne Datei starte. Ansonsten kann ich den auch unterwegs aufmachen mit dem :Scratch Befehl.
- Und last but not least: <CTRL-TAB>. Nutze ich im Emacs recht intensiv, damit hab ich Completion auf Wörter innerhalb eines Buffers. Also z.b. Schreibe ich "conn<CTRL-TAB>" und er macht - sofern es keine mehreren Matches gibt - "connect_server()" draus oder so. Das geht im Vim von Haus aus mit <CTRL-N> und <CTRL-P>. Hab ich unverändert so gelassen. Es erscheint bei mehreren Matches dann ein kleines Popup wo man einen auswählen kann. Im Emacs hingegen scrollt man durch die Matches, indem man erneut <CTRL-TAB> drückt. Das ist evtl. gewöhnungsbedürftig, aber was solls.
Summa Summarum kann ich jetzt also auch auf dem Server oder in der Arbeit einigermaßen komfortabel arbeiten, zwar mit Abstrichen, aber angesichts dessen, dass ich mich schon seit Jahren damit quäle, ist das jetzt ein krasser Fortschritt.
Hier ist meine Vim Config, falls jemand mal gucken möchte.
Ich habe ausserdem während meiner Forschungs- und Anpassungsarbeiten einige gute Seiten gefunden:
- usevim. Das ist ein Blog mit haufenweise Ideen, Pluginvorstellungen uvm. Sehr zu empfehlen.
- Vim Tips Wiki. Ein Wiki mit hunderten Anleitungen, Rezepten und Beispielen. Etwas schwierig dort was zu finden, ich bin aber beim Googeln mehrere Dutzend male dort gelandet :)
- Sehr interessant fand ich On sharpening the saw. Ist jetzt keine Anleitung, aber trotzdem. Vor allem die Ergänzung am Ende von einem Emacsuser: TextMate als Kreis, Vim als Dreieck und Emacs als Fraktal. Eigentlich müsste man den Emacs sogar als mehrfach-dimensionales Fraktal zeichnen, um einen ordentlichen Vergleich zu haben.
Und finally, so sieht das jetzt bei mir aus:
Update 2012-11-08:
So, einige unbefriedigende oder fehlende Funktionen hab ich doch noch beheben können:- Die Sache mit dem TAB innerhalb einer Zeile funktioniert jetzt. Wenn ich im Insertmode einfach TAB drücke, rückt er die Zeile passend ein, ganz wie im Emacs. Der entsprechende Vim Befehl ist '=^' im Normalmodus.
- Neu eingebaut habe ich noch CTRL-K: damit wird die aktuelle Zeile entfernt. Im Unterschied zu Emacs ist es dabei sogar egal, wo in der Zeile der Cursor ist. (Besser als Emacs? Gibts ja nicht!)
- Mit dem Vim Befehl "gg=G" kann man den kompletten Buffer neu einrücken (Indent). Dafür hab ich mir ein eigenes Command ":IndentBuffer" erstellt. Und ich habe herausgefunden, dass ich das mit einem Textabschnitt auch machen kann: im Visualmode ('V') Zeilen markieren und dann direkt '=' drücken.
- Ausserdem führt jetzt ein CTRL-L im Insertmode dazu, dass der Buffer so gescrollt wird, dass die aktuelle Zeile in der Mitte ist. Nutze ich im Emacs ständig. Hachmach
- Und das Farbschema hab ich nochmal nachgebessert, war zu viel Giftgrün drinnen.