From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Vim für Fortgeschrittene
Status: RO
Content-Length: 2194
Lines: 48

= 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.

Abstract:    "Barrieren einreissen".
             Eine grosse Barriere ist es ja immer wieder,
             dass man bei Programmen nach jeden Neustart
             wieder von vorne beginnen muss.  Man sucht
             nach denselben Worten/Mustern, man gibt
             dieselbe Textbausteine wieder erneut sein.
             Wenn wir Vim aber nur anweisen, die bereits
             eingegeben Daten vor dem Beenden zu speichern,
             dann können wir das alles wiederverwenden.
             Und die Barriere des "alle nochmal machen"
             verschwindet dann so langsam - und spart Zeit!

Beschreibung:  Wir weisen Vim an von nun ab die Daten zu speichern.
             Wir machen uns Abkürzungen per "Tags", um immer wieder
             verwendete Dateien über ein Bookmark/Tag anzuspringen.
             Wir teilen den Bildschirm erst in Tabs und darin in Fenster ein,
             werden Texte in Clipboards/Registern speichern.  Das ganze
             wird dann als "Session" gespeichert - und wieder aufgenommen.
             Dazu noch ein bischen die Daten durch externe Programme "filtern" und
             Textbausteine/Textobjekte schneller kopieren, löschen und verschieben.

             Das dürfte für alle, die Vim auch zu Editieren
             von Emails verwenden, sehr von Hilfe sein.

Hinweis:     Bitte testet die Kommandos in diesem Text
             und sendet mir eine Rückmeldung - danke! :-)

             HINT: please try those commands herein and
             please do send me some feedback - thanks! :-)

Sie befinden sich hier:
http://www.guckes.net/talks/vim/vim_advanced.txt
http://www.guckes.net/talks/vim/vim_advanced.html

Latest change: Fri Mar 17 17:23: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
Status: RO
Content-Length: 639
Lines: 29

= Fahrplan =
== Outline ==

* Start
* VimInfo
* Tags
* Fenster
* Reiter (Tabs)
* Textobjekte
* Register

== Hinweise ==

Kommende Events:

2017-02-10      Fr        18h Vortrag Richard Stallman an der  TUB Architektur
2017-03-10/12   Fr/Sa/So  Chemnitzer Linux-Tage: Turmbrauhaus, KSP, Workshops
2017-04-14/17   Fr-Mo     EasterHegg in Mühlheim a.Rhein (nahe Frankfurt)
2017-05-25/28   Fr-So     LUG Camp  in Bredstedt
2017-08-04/08   Fr-Di     SHA2017 Camp in Zeewolde (NL)

Weitere Events -> http://cal.guckes.net

== Publikum ==

ein paar Fragen:
* 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
Status: RO
Content-Length: 655
Lines: 14

= 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
Status: RO
Content-Length: 506
Lines: 24

= 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: Zusammenfassung
Status: RO
Content-Length: 87
Lines: 8

= Zusammenfassung =

  :set vi+=n
  :tabnew
  :e /etc/passwd
  :split
  :new
  .. TODO

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Setup File vimrc
Status: RO
Content-Length: 327
Lines: 16

= Setup File vimrc =

Einlesen eines minimalen Setups:

    :r http://www.guckes.net/Setup/vimrc.minimal

Abspeichern als "vimrc" im "Heimatverzeichnis" ($HOME):

    :w ~/.vimrc

Ausführen des Inhalts:

    :so %

Wohlgemerkt: Wir müssen Vim eigentlich nicht verlassen.
Es darf weiterlaufen bis der Rechner rebootet wird. ;-)

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: VimInfo
Status: RO
Content-Length: 2229
Lines: 71

= 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-s

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 Liste der Änderungen (changelist) und Sprünge (jumplist)
kann kann man mit ":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
  :help changelist
  :help jumplist

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Tags
Status: RO
Content-Length: 2287
Lines: 82

= 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
Status: RO
Content-Length: 1044
Lines: 31

= 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

[2017-02-05]
Der Unterschied zwischen ":close" und ":quit" ist:
Ein ":close" kann das letzte Fenster *nicht* schliessen.
Eventuell will man sich daher ":close" angewöhnen,
damit man Vim damit nicht aus Versehen schliesst. ;)

== 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
Status: RO
Content-Length: 903
Lines: 38

= 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 <PgUp> :tabp<cr>
  :map <PgDn> :tabn<cr>

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
Status: RO
Content-Length: 1636
Lines: 50

= 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 "<ip"

=== Hilfe ===
  :help text-objects

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Register
Status: RO
Content-Length: 2146
Lines: 62

= Register =

Ein Register verhält sich wie ein Clipboard:
Man kann Daten darin speichern.
Jeder Kopier- oder Löschbefehl
schreibt in das "default register".
Dessen Inhalt wird mit einem "paste"
('p' oder 'P) wieder eingefügt.

Allerdings gibt es nicht nur das default register,
sondern auch ein Register mit dem Namen 'a'.
Dieses verwendet man, indem man es vor dem Kopieren/Löschen benennt,
und zwar mit '"a' - also erst die Anführungszeichen und dann das 'a':

    "ayy

Lies: "verwende Register 'a' - kopiere aktuelle Zeile"
oder: "in das   Register 'a'   kopiere die aktuelle Zeile".

Der Inhalt des Register bleibt auch erhalten,
wenn man das default register verwendet.

Das Einfügen des Registers 'a' geht ebenso:

    "ap

"Vom Register 'a' - paste."

Man muß ein bischen umdenken, weil man erst das zu nutzende
Register benennen muß, bevor man kopiert bzw löscht.

Es gibt auch ein Register 'b'.. und 'c'.. usw - bis 'z'.
Damit gibt es insgesamt sechsundzwanzig (26) Clipboards.
[Und das nun schon seit 40 Jahren.  Warum nur verkauft man
 uns immer noch Editoren, die nur *ein* Clipboard haben?]

[2017-02-05]
Man kann Text auch erst auswählen über die Befehle des Visual Mode
und dann den selektierten Text in ein Register kopieren, zB:
Mit "vip" den aktuellen Absatz "visuell markieren",
und dann mit '"ay" in den Register 'a' kopieren.
Zu lesen als "verwende Register 'a', kopiere".

== Aufgaben ==

    * Schreibe eine Zeile mit "mit freundlichen Grüßen"
      und kopiere diese in das Register 'g'.
    * Schreibe eine Zeile mit deiner Telephonnummer
      und kopiere diese in das Register 't'.
    * Erzeuge einen kleinen Text mit diesen vier Zeilen:
      (1) deinem Namen und Emailadresse
      (2) deiner Homepage und Telephonnummer
      (3) deinem Cryptoschlüssel (gpg:1234ABCD)
      (4) dessen Fingerprint (1234 5678 ABCD ..)
      Kopiere diese Zeilen in das Register 's' ("signature").
    * Schau dir diese Register mit ":reg gts" an.
    * Schreibe eine E-Mail und füge die Textbausteine
      im Insert Mode über "CTRL-R x" ein - wobei
      'x' der Buchstabe/Name des Registers ist.

=== Hilfe ===
  :help registers

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Zusammenfassung
Status: RO
Content-Length: 283
Lines: 7

= Zusammenfassung =

Dein Vim sollte nun vor jedem Beenden seine Daten
in die 'viminfo' Datei speichern und von dort bei
jedem Neustart die gespeicherten Daten wieder laden,
um sie dir zum Editieren zur Verfügung stellen.
Möge dies dein Editieren einfacher und schneller machen. :-)

From 2017-03-11-chemnitz@guckes.net Sat Mar 11 14:00:00 2017
From: Vim Advanced
Subject: Hausaufgabe
Status: RO
Content-Length: 299
Lines: 12

= Hausaufgabe =

Feedback geben/schicken. :-)

* Wie ist es gelaufen?
* Was hat gefallen - und was nicht?
* Was hat noch gefehlt?
* Was machen wir das nächste Mal?
* Wo sehen wir uns wieder? -> 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
Status: RO
Content-Length: 164
Lines: 7

= 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
Status: RO
Content-Length: 827
Lines: 29

= 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
Status: RO
Content-Length: 451
Lines: 24

= 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
Status: RO
Content-Length: 77
Lines: 5

= 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
Status: RO
Content-Length: 740
Lines: 15

= 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 Sat 14:00-17:00 Raum W3
event:      "Vim Advanced" - Chemnitzer LinuxTage (CLT) "Barrieren einreissen"
url:        https://chemnitzer.linux-tage.de/2017/de/programm/beitrag/342
contact:    Sven Guckes chemnitz2017@guckes.net
announce:   https://twitter.com/guckes/status/826483482285182977
textpad:    https://titanpad.com/1tehwzCABD

vim: set et fenc=latin1 ft=sven tw=999 nowrap: THPXRF EOF