From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Vim für Fortgeschrittene = Vim für Fortgeschrittene = == Vim Advanced == Titel: Vim für Fortgeschrittene Untertitel: Reiter+Register, Tags+Textobjekte, Fenster+Viminfo Zielgruppe: Für jene, die den Vimtutor gelesen haben, mit ein paar Kommandos den Curors bewegen können, und ihren Text auch abzuspeichern wissen. Das sollte schon ausreichen, um die Kommandos in diesem Workshop hinzuzufügen. HINT: please try those commands herein and please do send me some feedback - thanks! :-) you are here: http://www.guckes.net/talks/vim/vim_advanced.txt http://www.guckes.net/talks/vim/vim_advanced.html Latest change: Wed Feb 01 18:05:42 CET 2017 Created: Sun Jan 8 23:42:05 CET 2017 From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Fahrplan = Fahrplan = == Outline == * Start * VimInfo * Tags * Fenster * Reiter (Tabs) * Textobjekte * Register Wir machen uns Abkürzungen per "Tags", teilen den Bildschirm in Fenster ein, werden diese in Tabs übernehmen, Texte in Registern speichern, und Vim dann anweisen, seine Daten in einer Sessiondatei zu speichern, damit diese beim nächsten Start wieder zur Verfügung stehen. Das dürfte für alle, die Vim auch zu Editieren von Emails verwenden, sehr von Hilfe sein. == Hinweise == 2017-02-10 18h Vortrag Richard Stallman an der TUB Architektur 2017-03-10/12 Chemnitzer Linux-Tage: Turmbrauhaus, KSP, Workshops 2017-04-14/17 EasterHegg 2017-05-25/28 LUG Camp -> http://cal.guckes.net == Publikum == * Wer verwendet Vim? * Wer will am Workshop teilnehmen? * Wer hat ein Gerät mitgebracht? From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Weiteres = Weiteres = == More == Eine Sessiondatei beinhaltet die folgenden Dinge: - Die History der Kommandozeile. | The command line history. - Die History der Suchanfragen. | The search string history. - Die History der Inputzeile. | The input-line history. - Inhalte der Register. | Contents of non-empty registers. - Marker in den Dateien. | Marks for several files. - Dateimarker. | File marks, pointing to locations in files. - Die Liste der Suchmuster. | Last search/substitute pattern (for 'n' and '&'). - Die Liste der Puffer. | The buffer list. - Globale Variablen. | Global variables. From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Start = Start = == Boot == Vorbereitungen für einen effizienten Start. == zuhause == Hilfreiche Tools installieren: curl, wget screen, tmux mosh+ssh+scp bash, zsh Den "vimtutor" aufrufen, lesen und ausprobieren (ca 20min - 1h). $ vimtutor == workshop == Einen Sitzplatz auswählen, den Computer mit Strom verbinden, Computer booten, Einloggen, ein Terminal öffnen, dann screen oder tmux, und schliesslich Vim starten. Mit dem Netzwerk verbinden. dem Nachbarn "hallo" sagen. :-) here we go... From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: VimInfo = VimInfo = Die "Viminfo" ist eine Datei, in der all die Daten gespeichert werden, die sich im Laufe von Editing Sessions so ansammeln. Per Grundeinstellung wird keine Viminfo-Datei angelegt. Das sollten wir gleich mal ändern.. Erst ":set vi=" eingaben - und dann mal TAB drücken. Das sollte dann den aktuellen Wert der Option anzeigen. :set vi='100,<50,s10,h Der Cursor sollte dann am Ende der Zeile sein. Hier nun ein ",n" hinzufügen: :set vi='100,<50,s10,h,n Damit ist Vim angewiesen all die weiteren Infos zu speichern. Der Name der Datei ist "~/.viminfo". :help viminfo-n Die Zeichen "'" (tick), "<" (kleiner), "s" und "h" bedeuten: ' Markierungen, jumplist, changelist :help viminfo-' < max Zeilen für Register :help viminfo-< h hlsearch Effekt abschalten :help viminfo-h s max size für Register in Kilobyte :help viminfo-n In Worten: "Speichere die Markierungen, die jumplist und die changelist, sowie die Register mit maximal 50 Zeilen bzw 10KB, und schalte den hlsearch Effekt ab." Die Zeilen der Änderungen und Sprünge kann kann man it ":changes" und ":jumps" anzeigen lassen. TODO Markierungen erklären. TODO hlsearch erklären. Meine Einstellung ist diese: :set vi=<200,%,'200,/100,:100,@100,f1,h,n~/.vim/viminfo <200 max 200 Zeilen für Register '200 max 200 Markierungen, jumplist, changelist /100 max 100 Einträge der Suchmuster :100 max 100 Einträge der Kommandozeile @100 max 100 Einträge der Input-Line f1 Dateimarkierungen speichern h hlsearch Effekt abschalten n der Name der viminfo Datei == Aufgaben == * Die Option "vi" anpassen (mit einem "n" in der Liste), ein paar Kommandos und Suchen ausführen, vim beenden, und vim wieder neu starten. * Existiert die Datei ~/.viminfo nun? Mal mit "less" anschauen. * und dann nachsehen, ob die Daten auch wieder geladen wurden und verfügbar sind, zB ':' bzw '/' eingeben und mit PfeilHoch in der History zurückgehen === Hilfe === :help viminfo :help :changes :help :jumps :help hlsearch From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Tags = Tags = "Tags" sind Abkürzungen (Bookmarks) für "Orte" in Dateien, zu denen man mit dem ":tags" Befehl springen kann. Legen wir mal ein tags-datei an. Ich nehme da "~/.vim/mytags": $ mkdir -p ~/.vim; cd ~/.vim; touch mytags Damit liegt die Datei schonmal im Verzeichnis ~/.vim, dass man sehr leicht zusammen kopieren kann, um es dann in den Account auf einem anderen Rechner zu kopieren. Dem Vim macht man diese Datei über die Option "tags" bekannt: :set tags=~/.vim/mytags Nun legen wir ein "Tag" an. Dieser besteht aus drei Teilen: tag: pw file: /etc/passwd command: $ Und die werden in die tagsdatei in einer Zeile eingetragen: pw /etc/passwd $ Wohlgemerkt: Die drei Angaben sind jeweils durch ein TAB voneinander getrennt: tagname TAB dateiname TAB kommando pw TAB /etc/passwd TAB $ Wenn man ":set list" einschaltet, dann sollte man die TABs als "^I" (CTRL-I) sehen: pw^I/etc/passwd^I$ Und mit ":set listchars=>." sieht man die TABs dann mit '>' beginnen - und die Zeichen in der Expansion als Punkte: pw>..../etc/passwd>....$ Nach dem Eintrag können wir nun das Tag verwenden: :tag tagname Beispiel: :tag pw Dieser Befehl öffnet mir die Passwortdatei /etc/passwd - und zwar am Ende der Datei, da das Kommando ":$" dorthin springt. Das Ganze kann man also lesen wie einen "bookmark", dh eine Abkürzung, die auf eine Datei verweist - zusammen mit einem auszuführenden Befehl. Vim erwartet, dass die Einträge sortiert sind, um so schneller ein Tag finden zu können. Aber solange man nicht hunderte davon hat, lohnt es sich nicht, die Datei zu sortieren. Also schaltet man das "tagbsearch" aus: :set notbs Damit ist Vim nun der Ort der eigenen Tagsdatei bekannt, und die Einträge zielen dann auf die Dateien - mitsamt den Kommandos, um den richtigen Ort anzuspringen. == Aufgaben == * Erzeuge ein Tag "h", das auf /etc/hosts zeigt und dort in die Zeile #3 springt. * Erzeuge ein Tag "v", das auf deine Vim Setupdatei (aka "vimrc") zeigt und dort auf die erste Zeile mit "NEU" springt. * Erzeuge ein Tag "b", das auf die Setupdatei deiner Login Shell "bash" (also "~/.bashrc") zeigt und dort in die Zeile #23 springt. === Hilfe === :help tags-and-searches From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Fenster = Fenster = == Windows == Es gibt einige Befehle, die Fenster öffnen, teilen, bzw verschieben. zB ":new", ":split", ":vsplit", sowie ":close" und ":quit". Einfacher geht das mit den Window Commands, die mit CTRL-W beginnen: :new edit a new buffer -> CTRL-W n :sp split buffer -> CTRL-W s :vsp split vertically -> CTRL-W v :only only this window -> CTRL-W o :close close window -> CTRL-W c :quit quit window -> CTRL-W q == Aufgaben == * Öffne ein neues Fenster, teile es mehrfach horizontal und vertikal, und schließe die Fenster wieder. * Bewege den Cursor in andere Fenster mit "CTRL-W hjkl". * Finde heraus was "CTRL-W f" bzw "CTRL-W F" macht. * Finde heraus was "CTRL-W HJKL" macht. TODO: Fenster vergrößern bzw verschieben === Hilfe === :help CTRL-W From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Reiter = Reiter = == Tabs == Mit dem ":tabnew" Kommando öffnet man einen "Tab" aka "Reiter". :tabnew Innerhalb jedes Tabs kann man dieses mit den vorher beschriebenen Fensterkommandos diese "splitten" und arrangieren. Und mit den Kommandos ":tabprev" und ":tabnext" geht man zu dem Tab nach links bzw rechts. Am Anfang bzw am Ende der Tableiste geschieht dann jeweils ein "wrap around" zum Ende bzw Anfang. :tabnext :tabprev Schneller geht es mit den Befehlen "gt" für ":tabnext" und "gT" für ":tabprev". gt -> :tabnext gT -> :tabprev Ich habe mir "Bild^" (PgUp) und "Bildv" (PgDn) zum Wechseln zwischen den Tabs definiert: :map :tabp :map :tabn Und mit den folgenden Farbdefinitionen sehe ich die Titel besser: :hi tablinesel ctermbg=black ctermfg=yellow :hi tabline ctermbg=black ctermfg=green === Hilfe === :help tabpage :help key-notation From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Textobjekte = Textobjekte = == text objects == Vim kennt "Textobjekte", dh Wort, WORT, Satz und Absatz. Diese können einfach kopiert, gelöscht bzw geändert werden. Beim Kopieren sieht man keine Änderung, darum verwende ich in den Beispielen hier nur Löschung (Kommandos initiiert mit 'd') und Änderung (Kommandos initiiert mit 'c'). diw delete inner Word ciW change inner WORD Unterschied "Word" vs "WORD": "Words" bestehen aus den Zeichen, die in der Option "iskeyword" angegeben sind. Default ist "@,48-57,_,192-255" @ die Zeichen des Alphabets, "a-zA-Z" 48-57 die Ziffern 0 bis 9 _ der Unterstrich 192-255 À-ÿ (high-bit Zeichen) Unterschied "change" vs "delete": Bei "change" wird zwar genauso gelöscht, aber danach in den Insert Mode gewechselt. Also kann man gleich die Ersetzung tippen. Unterschied "inner" vs "all": dip delete inner paragraph dap delete all paragraph Bei "all" werden die nachfolgenden Leerzeilen mitgelöscht. Diese möchte man als "Trenner" zu anderen Absätzen mitnehmen, wenn man den Absatz dann woanders wieder einfügt. == Aufgaben == * Öffne /usr/share/common-licenses/GPL-3 (zB so: Platziere den Cursor auf den Dateinamen und tippe "gf"), dann liste alle Zeilen, die das Wort "freedom" enthalten (":g/freedom/nu"), springe zu einer dieser Zeilen (":22" oder "22G"), selektiere den aktuellen Satz ("vis"), kopiere diesen ("y"), öffne einen neuen Puffer ("CTRL-W n") und für den kopierten Satz dort ein ("p"). * Aktuellen Absatz ein- bzw ausrücken mit ">ip" und " http://cal.guckes.net -> Sven Guckes chemnitz2017@guckes.net GPG-Schlüssel: 8000R/EAB97F200185391B From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Kür = Kür = == Filtering == Idee: Zeilenblock wird als Eingabe eines externen Kommandos gegeben - und dessen Ausgabe ersetzt dann die Eingabe. TODO: link From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Sessions File = Sessions File = Eine "Session" ist eine Datei, die alle Einstellungen (Optionen) enthält - und dann noch einiges mehr, wie zB Mappings, die Liste der Puffer, die Fenster mit ihren Positionen, und globale Variablen. Einfach mal den Befehl ":mks" ("make session") aufrufen. Dieser sollte dann die Datei "Session.vim" erzeugen. Vim beenden - und erneut aufrufen. Dann das Session.vim mittels ":source" einlesen lassen zur Wiederherstellung. also so: :mks :qa $ vim :so Session.vim Für verschiedene Projekte kann man somit auch andere Layouts haben. == Aufgaben == * Ein paar Änderungen vornehmen. Fenster erzeugen - vergrößern und verkleinern. Andere Dateien laden. Dann mit ":mks vim-session" ein neue Session abspeichern. === Hilfe === :help session-file :help viminfo-file :help :mks From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: TODO = TODO = * Eine Setupdatei für diesen Workshop erzeugen * nützliche Einstellungen: :set hidden :set showcmd :set list listchars=tab:>_,trail:_ :read ~/.signature * Kommandos zum Schreiben+Beenden :w write into file :w! write! into file :wq write+quit :x write+quit ZZ write+quit :q quit current window :qa quit all windows :qa! quit all - no saving :q! quit - no saving ZQ quit - no saving From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Credits = Credits = * Bjørn Bürger (master of penguins) - Korrekturlesen DANKE! :) From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017 From: Vim Advanced Subject: Events = Events = date: 2017-02-01 18-21h @BeLUG event: "Vim Advanced" - Berliner Linux User Group (BeLUG) place: http://www.in-berlin.de/space Lehrter Str. 53, 10557 Berlin url: http://www.belug.de/aktivitaeten-kalender/vim20170201.html contact: Sven Guckes 2017-02-01-belug@guckes.net announce: https://twitter.com/guckes/status/826483482285182977 date: 2017-03-11 14:00-17:00 Raum W3 event: "Vim Advanced" - Chemnitzer LinuxTage (CLT) url: https://chemnitzer.linux-tage.de/2017/de/programm/beitrag/342 contact: Sven Guckes chemnitz2017@guckes.net announce: https://twitter.com/guckes/status/826483482285182977 vim: set et ft=sven tw=999 nowrap: THPXRF EOF