/* vim: set fileencoding=utf8: */ UNIX-Stammtisch in Sachsen ========================== 28.2.2017 Gliederung: 1. Nimm Vim 2. Vim zur Unterstützung Wörterbuchpflege Deutsch-Englisch – Beolingus 3. vim-artige Bedienung des Browsers (am Beispiel des Mozilla Firefox') 4. VIM for Python and Django Development +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1. Nimm Vim =========== Historie ed (for immortals) - Ken Thompson, 1969 em (for mortals) - George Coulouris, 1976 ex - Bill Joy & Chuck Haley, 1976 vi - Bill Joy, 1976 Portierungen und Clones Stevie - Tim Thompson, 28.6.1987 Vim - Bram Moolenaar, 2.11.1991 neovim - 2014, Maintainer: Justin M. Keyes Elvis - Steve Kirkendall, Anfang Januar 1990 nvi - Keith Bostic, 1994 (4.4 BSD-Lite) http://vi.stackexchange.com/questions/341/what-is-the-relation-between-vi-nvi-and-vim The roots of the family trees of vi clones seem to be: 1977: "Traditional vi", Bill Joy's original source, ported and free to use since 2002. 1985: microEmacs, from which the vi-alike "vile" was developed 1987: stevie, from which vim and xvi were developed 1990: elvis, from which nvi was developed 2000: busybox's "tiny vi" ====================================================================== Skripting mit ed, ex echo -e '1 2 3\n4 5 6 22\naaa bbb ccc ddd eee fff gg' > myfile echo -e '1,$s/^/#/\nwq' | ed myfile # analog mit sed -i sed -i 's/^/#/' myfile echo '%s/^/#/ | wq' | ex myfile ex <<<'%s/^/#/ | wq' myfile vim -es <<<'%s/^/#/ | wq' myfile Ex-Kommandos sind im Vi verfügbar vi myfile :%s/^/#/ Vim bietet hier mehr Features echo -e 'eins Zwei DrEi\nVIER fueF sechs' > myfile2 vim myfile2 :set magic " \U und \L ==> Folgezeichen nach uppercase / lowercase konvertieren :g/Z/s/\a\+/\L&\e|&|\U&|/g " \{-} für * mit shortest match (non-greedy) :g/Z/s/\<.\{-}\>/\L&\e|&|\U&|/g ====================================================================== Vim (vi IMitation --> Vi IMproved) aktive Entwicklung seit über 25 Jahren Version 3.0 (1994): Unterstützung mehrerer Puffer und horizontal geteilter Fenster (:split, :ball ...) Version 4.0 (1996): GUI (gvim) Version 5.0 (1998): Syntax-Highlighting, Win32-GUI, Vimscript und Perl-/Python-Support Version 6.0 (2001): Code-Faltung, Diff-Modus (vimdiff), Plugins, UTF8-Support, Mehrsprachigkeit, vertikal geteilte Fenster (:vsplit) Version 7.0 (2006): integrierte Rechtschreibprüfung, Reiter (Tabs), Undo-Verzweigungen (mehrstufiges Undo/Redo schon lange vorhanden), Omni completion (automatische Code-Vervollständigung) Version 7.3 (2010): Persistent Undo, Blowfish-/Lua-/Python3-Support, Verbergen von Text (Conceal text) Version 7.4 (2013): verbessertes Python-Interface, neue "NFA engine" für reguläre Ausdrücke (neben der alten "backtracking engine", die alles unterstützt, aber oft viel langsamer arbeitet) Version 8.0 (2016): Asynchrone I/O, Channels, JSON, Jobs, Timers, Partials, Lambdas and Closures, Packages ====================================================================== vim als ex rufen ex vim -e vim im easy mode rufen vim -y gvim -y evim Ctrl-O ==> ein Kommando im Normalmodus ausführen Ctrl-L ==> Normalmodus aktivieren Vim-Start "beobachten" vim --startuptime proto myfile vim -Vproto myfile ====================================================================== Online-Hilfe :help :help showcmd ==> Hilfe für Option showcmd (Anzeige der partiellen Vi-Kommandos) ====================================================================== Arbeit mit mehreren Fenstern vim *.py :ba ==> :ball, ein horizontal geteiltes Fenster pro Puffer :vert ba ==> analog mit vertikal geteilten Fenstern Ctrl-W w ==> Wechsel zum nächsten Fenster (darunter oder rechts) Ctrl-W = ==> alle Fenster erhalten die gleiche Größe Ctrl-W x ==> aktuelles und nächstes Fenster vertauschen Ctrl-W 5+ ==> aktuelles Fenster um 5 Zeilen vergrößern (oder: 5 Ctrl-W +) Ctrl-W 6- ==> aktuelles Fenster um 6 Zeilen verkleinern (oder: 6 Ctrl-W -) :on ==> Make the current window the only one on the screen; alle Fenster außer dem aktuellen werden geschlossen vim * :split ==> aktuelles Fenster horizontal teilen :n ==> im aktuellen Fenster das nächste File anzeigen, das erste File bleibt im anderen Fenster sichtbar; mit mehrfachem :n kann man schrittweise alle Dateien der Liste editieren ====================================================================== visuelle Markierungs-Modi v ==> zeichenweise V ==> zeilenweise Ctrl-V ==> blockweise (rechteckig) gv ==> markiert den vorherigen Block erneut Blöcke lassen sich mit diversen Kommandos bearbeiten u ==> uppercase in lowercase wandeln U ==> lowercase in uppercase wandeln ~ ==> uppercase/lowercase tauschen d ==> löschen c ==> ändern (ersetzen durch eingegebene Zeichen) > ==> nach rechts verschieben (Option shiftwidth legt die Zeichenzahl fest) < ==> analog nach links verschieben ... Block einrücken V und > oder mit Ctrl-v die Anfangszeichen rechteckig markieren und mit I Space Esc vor dem Block ein Space (oder auch andere Zeichen) einfügen ====================================================================== addieren/subtrahieren mit Ctrl-A/X G o 1 Esc ==> Zeile mit einer 1 am Pufferende anfügen qa ==> Recording in Register a yyp ==> Zeile duplizieren Ctrl-A ==> in der neuen Zeile 1 addieren (erzeugt eine 2) q ==> recording beenden 8@a ==> aufgezeichnete Tastenfolge 8 Mal abspielen (erzeugt zeilenweise die Zahlen 3 bis 10) ab Vim 8 einfacher mit g Ctrl-A G o 1 Esc ==> Zeile mit einer 1 am Pufferende anfügen yy9p ==> diese Zeile 9 Mal darunter anfügen (ergibt 10 Zeilen mit einer 1) VG ==> die angefügten Zeilen zeilenweise markieren gCtrl-A ==> die Zahlen schrittweise erhöhen (ergibt die Zeilen 1 bis 10) via Bash geht es auch !!echo {1..10} ==> aktuelle Zeile durch die Folge 1 bis 10 auf einer Zeile ersetzen :s/ /\r/g ==> die Leerzeichen durch Zeilenschaltungen ersetzen Vim 8 bietet Ctrl-A/X für markierte Zahl Beispiel: Textfolge -123 ==> Ctrl-A erzeugt -122 (Vorzeichen - wird mit betrachtet) ==> falls 123 markiert ist, erzeugt Ctrl-A -124 (Vorzeichen irrelevant) ==> falls 12 markiert ist, erzeugt Ctrl-A -133 (- und 4 sind irrelevant) ====================================================================== Diverses Dateien öffnen, deren Name im Text steht gf ==> goto file Beispiel: gehe mit Cursor irgendwo auf /etc/hosts im Text gf öffnet die Datei /etc/hosts im aktuellen Fenster Ermittlung des vollen Pfadnamens der aktuellen Datei 1 Ctrl-G bei Zahlen größer 1 wird auch die Puffernummer ausgegeben Feststellen der Zeichenposition des Cursors im Puffer g Ctrl-G Cursor an bestimmte Zeichen-/Byteposition stellen go ==> an Position 1 25 go ==> an Position 25 Cursorpositionierung in langen Zeilen, die sich über mehrere Bildschirmzeilen erstrecken (bei aktiver Option :set wrap) Präfix g vor entsprechenden Bewegungskommandos, z.B. g Cursor nach oben/unten ==> Cursor eine Bildschirmzeile nach oben/unten gj ==> Cursor eine Bildschirmzeile nach unten gk ==> Cursor eine Bildschirmzeile nach oben g0 ==> an den Anfang der aktuellen Bildschirmzeile g$ ==> ans Ende der aktuellen Bildschirmzeile Suchen der Wörter unter dem Cursor * ==> vorwärts # ==> rückwärts Vervollständigung der Wörter unter dem Cursor (Completion) Ctrl-P ==> Wortsuche rückwärts (previous) Ctrl-N ==> Wortsuche vorwärts (next) "Pipen" von Ausgaben in den vim statt less ps auxww | vim - Kommandohistory (command-line window) q: ==> für Ex-Kommandos q? ==> für Suchkommandos rückwärts (?) q/ ==> für Suchkommandos vorwärts (/) jeweils das Kommando wählen, ggf. mit Vim-Kommandos bearbeiten und das Fenster verlassen: ENTER ==> Kommando ausführen Ctrl-C ==> Kommando in den Kommandozeilenmodus übernehmen :q ==> Kommandozeile verwerfen, Rückkehr in den Normalmodus ====================================================================== Auswahl von Textregionen Löschungen Operator d und Textobjekte dap ==> ap steht für "a paragraph" (Absatz) dip ==> ip steht für "inner paragraph" (Absatz ohne begrenzenden Whitespace) (zeichen-/zeilen-/blockweise) visuell markieren und d VGd ==> löscht alle Zeilen ab der aktuellen Operator d und Bewegungskommando d} ==> löscht vom Cursor bis zum Absatzende (dip oder dap löschen dagegen auch den Teil des Absatzes vor dem Cursor) dG ==> löscht alle Zeilen ab der aktuellen Fomatieren gqap ==> den aktuellen Absatz gq} ==> vom Cursor bis zum Absatzende Zeichen- und Zeilentausch xp ==> vertauscht das Zeichen unter dem Cursor mit seinem Nachfolger Xp ==> vertauscht das Zeichen unter dem Cursor mit seinem Vorgänger ddp ==> vertauscht die aktuelle Zeile mit ihrer Nachfolgerin Zeile duplizieren yyp letztes Vi-Change-Kommando an beliebiger Stelle wiederholen . ==> das kann mehrfach passieren, also Cursor jeweils an die gewünschte Stelle positionieren und . eingeben Einlesen externer Texte :r myfile ==> unterhalb der aktuellen Zeile :0r myfile ==> vor Zeile 1 :r !cal ==> Ausgabe des Kommandos cal unter der aktuellen Zeile einlesen auch Netzzugriffe sind möglich :r https://www-user.tu-chemnitz.de/~hot/custom.conf externe Filter :%!tac ==> alle Zeilen mit tac filtern, also deren Reihenfolge umkehren Einrücken >> ==> aktuelle Zeile um shiftwidth Zeichen einrücken 3>> ==> 3 Zeilen 1 Mal einrücken visuell markieren mit V/v/Ctrl-V 3>> ==> den markierten Bereich 3 Mal einrücken Löschen / Ersetzen C ==> Zeilenrest durch Eingabe ersetzen D ==> Zeilenrest löschen (entspricht d$) dw ==> Wort löschen dW ==> WORT löschen (bis Whitespace) dfa ==> vorwärts löschen bis einschließlich des nächsten Zeichens a dta ==> vorwärts löschen bis vor das nächste Zeichen a (a bleibt erhalten) dFa ==> rückwärts löschen bis einschließlich des vorangehenden Zeichens a dTa ==> rückwärts löschen bis hinter das vorangehende Zeichen a (a bleibt erhalten) d0 ==> rückwärts löschen bis zum Zeilenanfang d^ ==> löschen bis zum ersten Nicht-Whitespace-Zeichen der Zeile db ==> rückwärts löschen bis zum Wortanfang dB ==> rückwärts löschen bis zum WORT-Anfang (bis Whitespace) analog mit c statt d für Ersetzungen statt Löschungen ====================================================================== Binär- und Hex-Editierung mit Vi-artigen Editoren elvis myfile :dis hex ==> Elvis hat einen speziellen Hex-Modus bvi myfile ==> spezieller Vi-artiger Hex-Editor http://bvi.sourceforge.net/ xxd myfile | vim - ==> Nutzung des externen Filters xxd :%!xxd -r ggf. genügt der Binärmodus des Vim vim -b myfile ==> Binärmodus global aktivieren (kann auch pro Puffer erfolgen, siehe unten) ga ==> beschreibt das Zeichen unter dem Cursor Hex-/Oktal-Eingabe von Zeichen Ctrl-V x41 ==> 0x41 (A) Ctrl-V 000 ==> dezimal 0 Ctrl-V 065 ==> dezimal 65 (A) Ctrl-V o101 ==> oktal 101 (A) first char mode max nr of chars max value ~ (none) decimal 3 255 o or O octal 3 377 (255) x or X hexadecimal 2 ff (255) u hexadecimal 4 ffff (65535) U hexadecimal 8 7fffffff (2147483647) ====================================================================== multilevel undo/redo u ==> undo Ctrl-R ==> redo :redo CTRL-G u ==> break undo sequence, start new change eine längere Eingabe kann portionsweise rückgängig gemacht werden Ctrl-U ==> delete all entered characters before the cursor in the current line undo holt sie nicht zurück! :dis . ==> Register . zeigt die Eingabe, also auch den Teil vor Ctrl-U ".p ==> fügt den Inhalt von Register . ein (aber mit Ctrl-U, daher ggf. nutzlos) g- ==> zu einem älteren Zustand im Undo-Baum gehen siehe EXAMPLE unterhalb :help g+ g+ ==> zu einem neueren Zustand im Undo-Baum gehen ====================================================================== Zeilen verbinden J ==> verbinde die aktuelle Zeile mit der Folgezeile; deren evtl. Einrückung wird entfernt, die Zeilen werden mit 1 Space oder 2 Spaces verbunden (abhängig von der Option joinspaces) 1J ==> J, 1J und 2J wirken identisch 2J 3J ==> verbindet die aktuelle Zeile mit 2 Folgezeilen (3 in Summe) Option joinspaces falls aktiv, fügt J nach . ? ! 2 Spaces ein, sonst generell nur 1 Space Ex-Kommandos: :j ==> wie J :j! ==> wie J, aber zwischen den Zeilen werden keine Spaces entfernt oder eingefügt ====================================================================== extended matching mit % u.a. bei HTML, XML, LaTeX, Lua und Shell nutzbar % ==> die matching group vorwärts durchlaufen g% ==> die matching group rückwärts durchlaufen springt zum nächsten Partner von Klammern, Schlüsselwörtern und Kommentarbegrenzern (/* */) siehe .../macros/matchit.vim der Vim-Installation in ~/.vimrc einbinden "source $VIMRUNTIME/macros/matchit.vim if version < 800 runtime macros/matchit.vim else packadd! matchit endif ====================================================================== File ohne Syntax Highlighting laden (kann den Ladevorgang stark beschleunigen) :sy off :e file Kodierung und Fileformat festlegen :e ++enc=latin1 ++ff=unix dosfile ==> Encoding Latin1, File-Format Unix; evtl. UTF8-Zeichen byteweise anzeigen, ^M von DOS darstellen :w ++enc=utf-8 newfile ==> Puffer als UTF8-File speichern zusätzlich den Binärmodus aktivieren :e ++enc=latin1 ++ff=unix ++bin dosfile +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2. Vim zur Unterstützung Wörterbuchpflege Deutsch-Englisch – Beolingus ====================================================================== Textdatei > 300.000 Zeilen, 18 MB in einfacher Text-Syntax: Deutsch :: english Anforderungen: - Suche - Einarbeitung Einsendungen - neue Übersetzungen, Fehlerbehebung - Sortierung - Ergänzung Wortarten, Geschlecht Substantive – Plural - Fehlerkorrektur -> Spezielles .vimrc - aufruf: vim -u .vimrc.beolingus de-en.txt Einstellungen in .vimrc.beolingus ––––––––––––––––––––––––––––––––– " Settings: " Highlight-search = farbige Markierung der Suche, Suche beim Tippen set hlsearch incsearch " Persistent undo auch über vim-Sitzungen hinaus set undodir=~/.vim/undo-dir " Abkürzungen im Input mode für häufige umständliche Eingaben ia #a [Am.] -- tippe aa -> expandiert in [Am.] ia IES ich/er/sie -- IES -> ich/er/sie " Mappings: Belegung von Funktionstasten " F2 im command mode: Beginne Suche am Zeilenanfang map /^ " Bessere Suche map :call SucheBeginn() " Funktionen function SucheBeginn() let suchwort = input("/") let suchwort = '\V' . substitute(suchwort, ' ', ' ', 'g') if search(suchwort, 'W') == 0 ... endif endfunction " Komplexere Funktionen in Perl - ja, alles im vimrc :-) perl << EOP sub Plural { # Argument = Zeileninhalt in $_ my($de, $en) = split(/ :: /, $_); ... $_ = "$de :: $en"; } EOP function! Plural () " . = aktuelle Zeile . perldo Plural endfunction Hilfe ––––– :help :help set :help quotes :help 42 :help uganda Kommando: vimtutor http://www.vim.org http://vim.wikia.com http://learnvimscriptthehardway.stevelosh.com/ http://www.openvim.com/ - Tutorial https://vim-adventures.com/ A tetris game in pure vim: http://www.vim.org/scripts/script.php?script_id=172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3. vim-artige Bedienung des Browsers (am Beispiel des Mozilla Firefox') ======================================================================= http://vimperator.org/ - Optik des Firefox so anpassbar, dass man keine Adress- und Menüzeile mehr sieht, sondern nur noch die vim-Kommandozeile unter dem Inhaltsbereich eingeblendet hat - Tastenkombination Strg+I startet konfigurierten externen Editor - Adressen öffnen mit O (:open) bzw. T (:tabopen); Tabs schließen mit D, wiederherstellen mit U - aktuelle URL anpassen mit Umschalt+O; angepasste URL in neuem Tab öffnen mit Umschalt+T - Tastaturnavigation mit F und eingeblendeten Ziffern auf Links der Seite - Y kopiert aktuelle URL in Puffer; Adresse im Puffer kann mit P in aktuellen Tab und mit Umschalt+P in neuem Tab geöffnet werden - wie vom vim bekannt: ausführliche Hilfe unter :help verfügbar - aktuelle Konfiguration mit :set anzeigbar - weitere interessante Features: - Makros - Befehle mit wählbaren Namen - Kommandohistorie Problem: Firefox Electolysis (e10s) bringt multi-process tabs - Sehr viele Add-Ons müssen dafür angepasst werden - Aktuell (Firefox 51) wird e10s noch deaktiviert, um noch nicht kompatible Add-Ons laufen zu lassen https://github.com/akhodakivskiy/VimFx - -Light-Variante-, die nur vim-artige Tastaturbedienung bringt, aber sonst den Firefox unangetastet lässt - Zusatz Add-On für externen Editor notwendig (bspw. https://github.com/asamuzaK/withExEditor) - Hilfe als Overlay via ? immer verfügbar - Tasten O und T führen sofort aus, d.h. setzen den Cursor in die Adresszeile vim-artige Bedienung gibt's auch für andere Browser (z.B. Google Chrome) und auch für andere grafische Programme (z.B. für Mozilla Thunderbird). Man muss jeweils selbst erforschen, ob man es mag, da es nie genauso umgesetzt sein kann wie im Editor vim. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4. VIM for Python and Django Development ======================================== https://github.com/yodiaditya/vim-pydjango Dazu am Ende der ~/.vimrc noch ein autocommand, das für neue Dateien automatisch Datei-Header setzt: " Automatisches Setzen von Datei-Headern für .sh und .py function s:newfile () let s:file = expand(":t") let l:ft = &ft if l:ft ==# 'sh' call append(0, "#!/usr/bin/env bash") elseif l:ft ==# 'python' "call append (0, "#!/usr/bin/env python") call append(0, "# -*- coding: utf-8 -*-") call append(1, "from __future__ import unicode_literals") endif unlet l:ft unlet s:file endfunction autocmd BufNewFile * call s:newfile ()