Seite wählen

NETWAYS Blog

Nur Vim ist nicht genug!

Alle, die mal ein Problem mit Linux hatten, werden das vermutlich kennen: Du suchst online nach deinem Problem, stößt auf einige Befehle, bearbeitest eine Konfigurationsdatei und dann passiert es – Du bist in Vim gefangen!

Der Erstkontakt mit Vim kann durchaus von Frust geprägt sein, aber das muss nicht auf Dauer so sein. Stattdessen könntest Du Dich mit Vim anfreunden und seine Vorzüge genießen. Wenn Du nach fünf Jahren mit Vim ca. drei Prozent der Möglichkeiten kennengelernt hast – oder das zumindest glaubst – kannst Du aber auch noch tiefer abtauchen.

Hier kommen sog. „Vim-likes“ in’s Spiel.
Ein paar Kandidaten, die ich interessant finde, möchte ich Dir nicht vorenthalten.

 

Zathura

Bei Zathura handelt es sich um einen PDF Reader (ohne Bearbeitungsfunktion), der sich vim-ähnlich steuern lässt. Die bekannten Bewegungstasten h, j, k, und l bewegen die Ansicht nach links, unten, oben bzw. rechts. Auch gg und G erfüllen ihre bekannte Funktion. Wenn Du Dich auf das Lesen konzentrieren willst und Du die Maus aus Deinem Leben verbannen möchtest, dann ist Zathura ein guter erster Schritt!
Hier sind noch ein paar Tastenbefehle, um Dich auf Deinen Weg zu schicken:

o       → Dokument öffnen
J       → Nächste Seite
K       → Vorige Seite
H       → Anfang der aktuellen Seite
L       → Ende der aktuellen Seite
a       → Ansicht an Fensterhöhe anpassen
s       → Ansicht an Fensterbreite anpassen
/       → Textsuche
+, -, = → Zoom vergrößern, verkleinern, zurücksetzen

Vifm

Mit Vim ist es möglich, viele ähnliche Änderungen gleichzeitig vorzunehmen, wie etwa das Anfügen eines Ausrufezeichens, um jeder Zeile eines Dokuments mehr Ausdruck zu verleihen. Wenn Du Vims Fähigkeit zur Massenbearbeitung tatsächlich einmal gebraucht hast, möchtest Du sie sicher nicht mehr missen. Wäre es da nicht wundervoll, wenn Du das auch auf andere Bereiche ausweiten könntest?

Vifm ist ein Terminal-Dateimanager, der das Gefühl von Vim perfekt einfängt und eine Zwischenstufe zwischen Kommandozeilenbefehlen und einem grafischen Dateimanager darstellt.

Hier lassen sich Dateien verschieben, kopieren und löschen. Du kannst sie allerdings auch umbenennen. Spätestens jetzt wird die Markierfunktion sehr nützlich. Mit ihr können mehrere Dateien auf dieselbe Art bearbeitet werden. Ob es sich dabei um das Kopieren, Verschieben, das Setzen von Berechtigungen oder um das Umbenennen handelt, spielt dabei keine Rolle.

Ein klassisches Beispiel für das Umbenennen wären Screenshots, die üblicherweise unter anderem die Aufnahmeuhrzeit im Dateinamen hinterlegen. So könntest Du bei allen Bildern eines Ordners gleiche Teile der Namen entfernen, Dateiendungen ergänzen oder ungeliebte Leerzeichen ersetzen.

Mit v kannst Du mehrere aufeinanderfolgende Dateien wählen und Deine Auswahl mit Enter bestätigen. Alternativ kannst Du mit t auch die aktuell angesteuerte Datei markieren.

Hast Du die relevanten Dateien markiert, kannst Du mit Shift+i die Dateinamen über einen Texteditor bearbeiten. Der Standard hierfür ist Vim. Damit schließt sich der Kreis zur Massenbearbeitung durch Vim.

Vifm bietet außerdem ein Vorschaufenster, das die Inhalte von Ordnern und Dateien darstellt. Einfache Textdateien kannst Du so bereits lesen. Ähnlich wie der Befehl „tree“ zeigt diese Vorschau auch die Unterstruktur eines Ordners an. Welche Programme für diese Vorschau genutzt werden, kannst Du auch selbst in der Vifm-Konfigurationsdatei anpassen.

Wie auch Vim verfügt Vifm über zu viele Funktionen, um sie hier alle zu nennen. Im besten Fall probierst Du es einfach selbst aus. Das Vifm-cheat-sheet sollte dir für den Anfang genug Beistand leisten.

 

Vimb

Die Königsdiszipilin: Der Browser!
Ja, selbst das Werkzeug, das uns täglich begleitet und das wir wohl am meisten verwenden, ist nicht vor Vims Einfluss geschützt. Vimb ist genau das, was Du gerade erwartest. Dir ist es zu langweilig, Links mit der Maus anzuklicken? Dein Mausrad ist etwas dreckig und dreht sich daher beim Scrollen nicht richtig? Du denkst ohnehin nur noch in Vim-Bewegungen? Vimb ist Dein Browser!

Die Navigation läuft auch in Vimb über h, j, k und l. Strg+f und Strg+b scrollen je eine Seite runter bzw. hoch. Der Seitenanfang ist über gg, das Seitenende über G zu erreichen. Den Standardmodus kannst Du jederzeit über ESC auswählen. Mit Strg+o springst Du in der Historie eine Seite zurück, mit Strg+i eine vorwärts. gi platziert den Eingabezeiger in dem ersten möglichen Textfeld auf dem Bildschirm und aktiviert den Eingabemodus.

Damit kannst Du bereits einen Suchbegriff in eine Suchmaschine eingeben.
Doch bei einer solchen Suchmaschine musst Du erst einmal landen. o lässt Dich eine URL eingeben, die Du aufrufen möchtest. O wiederum ermöglicht das gleiche, fügt aber gleichzeitig die aktuelle URL ein, um diese zu bearbeiten.

Doch wie geht das Klicken denn nun ohne Maus? f ist dein Freund. Diese Taste zeigt Dir klickbare Elemente auf der Seite an und nummeriert sie. Anschließend kannst Du noch Text eingeben, um die Suche einzuschränken, die angezeigte Nummer eingeben und so z.B. von diesem Blog aus zu unseren Events gelangen. Alternativ zu den Nummern funktioniert auch Tab gefolgt von der Eingabetaste.

Möchtest Du ein etwas konventionelleres Erlebnis, kannst Du auch Strg+z drücken. Dann wird nur noch ESC von Vimb verarbeitet (stoppt diesen Modus). Die restlichen Tasten tun dann das, wofür die entsprechende Seite sie vorgesehen hat.

Vimb ist anfänglich sicherlich ungewohnt, aber es versucht schließlich auch, etwas anderes zu sein. Dieses Ziel ist definitiv erreicht. Übrigens kann die Maus auch in Vimb genutzt werden. Du musst Dich also nicht gänzlich auf Deine Tastatur verlassen 😉.

Zusammenfassend kann ich sagen, dass es wohl nicht ohne Grund so viele „Vim-likes“ gibt. Der Ansatz von Vi(m) hat sich bewehrt und deshalb ist es keine Überraschung, dass dieser Ansatz immer wieder in andere Anwendungen einfließt. Nicht jede dieser Anwendungen macht alle glücklich. Aber eine nette Spielerei sind sie allemal. Wenn Du also auch nur zehn Minuten mit einem „Vim-like“ verbringst, hat sich dieser Blogeintrag aus meiner Sicht bereits gelohnt. Viel Spaß beim Entdecken!

Matthias Döhler
Matthias Döhler
Junior Consultant

Über ein paar Umwege ist Matthias nun endlich da gelandet, wo er sich wohl fühlt: in der IT! Bei NETWAYS hat er im September 2021 seine Ausbildung zum Fachinformatiker für Systemintegration im Bereich Professional Services begonnen. Wenn er sich zu Hause nicht auch noch mit Themen rund um Linux auseinandersetzt, sieht er sich leidenschaftlich gerne Horrorfilme und solche an, die man als "Trash" bezeichnen könnte. Je seltsamer, desto besser! Den üblichen Beschäftigungen wie Freunde treffen, Bars aufsuchen oder die Sonne im Freien genießen, geht er eben so nach wie pseudophilosophischen Fragen. Daneben spielt er außerdem wahnsinnig gerne Videospiele vergangener Generationen....

Daily business: der Editor vim

Es ist unerfreulich lange her, dass ich das erste Mal mit vim in Berührung kam — anno 1997, um genau zu sein, während meiner ersten verzweifelten Gehversuche in Sachen S.u.S.E. Linux. Oder war das noch vi? So irgendwie habe ich das Tool über die Jahre dann hinter mir her geschleift wie eine altmodische Handtasche, mich aber viel zu spät erst ernsthafter damit befasst — ein blöder Fehler, vor dem ich einige von euch ja vielleicht bewahren kann. Denn was viele (und gerade auch Neueinsteiger) gar nicht zu ahnen scheinen: vim ist üblicherweise auf Systemen vorhanden, kann viel, ist ziemlich cool und in der Handhabung auch gar nicht so widerlich, wenn man sich erst leidlich eingearbeitet hat.

Die Konfiguration des Editors erfolgt in einer Textdatei namens .vimrc, welche im $HOME-Verzeichnis des jeweiligen Nutzers liegen muss. Beginnen wir diese Datei mit nocompatible: denn ein compatible vim ist lediglich noch ein vi, sprich alle nützlichen Erweiterungen und Errungenschaften der letzten 20 Jahre würden abgeschaltet — und wer will das schon?

set nocompatible " Using vim settings and not vi

Widmen wir uns also einigen kleinen Kniffen, die mir für die tägliche Arbeit inzwischen unverzichtbar geworden sind: naturgemäß (und da ich gerade einen Haufen müffelnden Puppet-Codes in Richtung Ansible transportieren darf) editiere ich aktuell häufig an YAML-Dateien herum, und da ist das Thema „Einrückungen“ beispielsweise sehr relevant: YAML kennt, plump gesagt, keine Tabs, und so bewährt es sich sehr in der persönlichen .vimrc bereits festzuhalten, dass ein Tab beispielsweise durch zwei Leerzeichen ersetzt wird und Einrückungen ebenfalls zwei Leerzeichen betragen sollen. Protipp: Lasst außerdem über existierende Dateien ein :retab laufen, so dass alle eventuell vorhandenen Tabs gemäß eurer Konfiguration in Leerzeichen umgesetzt werden — die Einstellungen greifen nicht automatisch bei bereits bestehendem Text. Und: möchtet ihr YAML anders einrücken als beispielsweise C oder PHP, so beschäftigt euch mit den Möglichkeiten, die autocmd bietet!

set autoindent " Guess what?
filetype plugin indent on " Enable indenting for files
set backspace=indent,eol,start " Allow backspacing over indention/ line breaks/ insertion start
set softtabstop=2 " Indent 2 spaces when hitting TAB
set shiftwidth=2 " Indend 2 spaces when autoindent
set tabstop=2 " Show existing tab with 2 spaces width
set expandtab " Convert tabs into spaces

Gerade bei YAML hilft es mir häufig sehr wenn ich sehe, an welcher Stelle im Dokument ich mich gerade befinde; deshalb lasse ich mir die Zeilen durchnummerieren und mittels Unterstreichung die aktuelle Position anzeigen. Syntax Highlighting ist natürlich großartig, das will ich unbedingt, und durch eine einfache Anweisung sorgt zukünftig für die visuelle Hervorhebung zusammengehörender Klammern. Protipp: während number die Zeilen aufsteigend durchnummeriert, stellt relativenumber die Zeilennummern relativ zur aktuellen Position dar.

set number " Enable line numbers
syntax on " Set syntax highlighting
set showmatch " Show matching brackets
set cursorline " Highlight line under cursor
set cursorcolumn " Highlight column

Was bei der täglichen Arbeit hilft: eine Statuszeile, die mit genau jenen Informationen aufwartet, die persönlich hilfreich sind. In meinem Fall sind das Angaben wie Dateiname, beispielsweise, Dateityp oder an welcher Stelle — prozentual gesehen — ich mich innerhalb meiner Datei gerade befinde. Für euch sind hier vielleicht ganz andere Informationen wichtig, weshalb ich euch die Lektüre der entsprechenden Dokumentation ans Herz legen möchte.

set laststatus=2 " Show status line
set statusline=%t " tail of filename
set statusline+=\ %{&ff} " File format
set statusline+=\ %y " Filetype
set statusline+=\ %c, " Cursor column
set statusline+=%l/%L " Cursor line/ total lines
set statusline+=\ %P " Percent through file

Was ich wirklich zu lieben lernte: undo und redo. Die Basics kennen noch die meisten: u macht die letzte Änderung rückgängig, uuu die letzten drei und 5u die letzten fünf. Wirklich interessant wird das allerdings, wenn man es mit Zeiträumen verbindet: so macht earlier 2m (alternativ: ea 2m) die Änderungen der letzten zwei Minuten rückgängig, wohingegen later 5m (alternativ: lat 5m) alle Änderungen der letzten fünf Minuten wiederherstellt. Die Sache hat nur einen Haken: wie fast überall sind diese Statements nur innerhalb der laufenden Sitzung möglich; wird der Editor beendet und die gleiche Datei später erneut editiert, ist keine History der bisherigen Änderungen verfügbar.
Wenig überraschend lässt sich auch das anpassen: über set undofile weisen wir vim an, die Änderungen jeder Datei zu persistieren; vim tut das dann jeweils in Form eines hidden file an gleicher Stelle, was auf Dauer etwas unübersichtlich werden könnte. Erstellen wir mittels mkdir ~/.vim/undo ein eigenes Verzeichnis für Dateien dieser Art, können wir vim aber auch instruieren all diese Änderunsdateien dort vorzuhalten. Das erlaubt dann auch umfangreiche Zeitsprünge: ea 3d wird die Änderungen der letzten drei Tage rückgängig machen.

set undofile " Undo history even between sessions
set undodir=~/.vim/undo " All undo files in one directory

Zuguterletzt verpassen wir unserem vim ein hübsches colorscheme — eine Auswahl solch vordefinierter Farbschemata findet sich, in Abhängigkeit verwendeter Version und Distribution, üblicherweise in /usr/share/vim/vim$VERSION/colors/ in Form von .txt-Dateien. Ich entscheide mich für desert, ihr könnt euch aussuchen was euch am besten gefällt und versiertere Nutzer erstellen sich ihre colorschemes später dann ohnehin selber… Und wenn wir ohnehin gerade mit Farbgebungen spielen lassen wir uns die Zeilennummer spaßeshalber rot hinterlegen, während die Hervorhebung der Spalte in einem aufdringlichen hellen Magenta erfolgen soll. Einschub: eine Liste verfügbarer Farben lässt sich aus vim heraus unkompliziert mit dem Kommando :h cterm-color abrufen.

colorscheme desert " Setting nice colors
highlight CursorLineNR ctermbg=red
highlight CursorColumn ctermbg=LightMagenta

Es gäbe noch So! Viel! Mehr! Belassen wir es für heute mal dabei. Eine einsatzbereite exemplarische vimrc-demo findet ihr auf GitHub; sie ist nicht als „finale Fassung“ zu verstehen sondern vielmehr als Ausgangspunkt für die Erarbeitung einer persönlichen und über die Zeit immer perfekteren Version. Und vielleicht wollt ihr über die Kommentare verraten, ob Artikel dieser Art hilfreich für euch sind — und welche Einstellung, welches Plugin, welcher Kniff für euch unverzichtbar ist?

Ein paar vim tricks

Ich benutze in meiner täglichen Arbeit vim als Editor. Im Laufe der Zeit habe ich dabei ein paar Dinge gelernt, die mir das Leben einfacher machen. Ein paar dieser „Tricks“ möchte ich euch heute einmal zeigen.

Autovervollständigung

Mit vim kann man seine Texte und Scripte autovervollständigen lassen. Das funktoniert mit normalen Wörtern, die schon einmal im Text vorgekommen sind STRG + n, mit ganzen Zeilen STRG + x + l oder mit Dateien und Ordnern im Filesystem.

Einfügen auf mehreren Zeilen


Es ist zwar nicht intuitiv, aber man kann relativ einfach viel Text auf einmal einfügen. Man kann entweder vor der Curserposition, z.B. am Anfang der Zeile, oder am Ende der Zeile Zusätzliche Zeichen hinzufügen.
In jedem Fall muss man erstmal mit STRG + v die Zeilen markieren, die bearbeitet werden sollen.
Das # am Anfang der Zeilen fügt man jetzt mit SHIFT + i (instert mode), gefolgt von #, gefolgt von ESC ein.
Der . am Ende der Zeilen funktioniert ähnlich. Aber statt SHIFT + i kommt $A zum Einsatz. Wieder gefolgt von dem Zeichen . und einem ESC.

History im vim

Lange zeit dachte ich, wenn ich zweimal dd benutze ist dar erste Inhalt weg. Genauso wie bei Word’s „auschneiden/einfügen“. Das ist allerdings nicht wahr. mit :reg kommt man in die History vom vim. Möchte man z.B. den dritten eintrag einfügen, geht das mit „3p.

json, jq und vim

In vergangen Blogposts wurde ja schon über die Macht von API, json und jq geschrieben. Das lässt sich wunderbar auch im vim kombinieren. Wenn ich mir Beispielsweise die Services einer icinga2 API ausgeben lasse, schaut das erstmal im vim recht unleserlich aus.

curl -k -u root:icinga 'https://127.0.0.1:5665/v1/objects/services' |vim -


Erst durch ein :%!jq ‚.results[].attrs | select(.active==true) | {__name, display_name, enable_perfdata}‘ wird daraus etwas schönes.
Jetzt wird nur noch Name, display_name und enable_perfdata angezeigt. Und das nur von Services, die „active“ sind.

Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.

Manage vim with Puppet and use Icinga 2 syntax highlighting

vim is my preferred editor after all. Even I hack Icinga 2 code with vim way faster than any other interface. vim requires some configuration love of course.
Many distributions do not install vim or set it as default editor. In the Git training sessions on Debian/Ubuntu we’ll have a lab for making vim the default for example. Inside the CentOS base box used for the Icinga 2 Vagrant boxes I’ll also ensure via puppet manifest to install the vim package.
Now for the configuration bits – one keeps a local $HOME/.vimrc with own customizations. That works fine for your own workstation but what if you want to automate such setups and distribute a custom vimrc config on all your servers? You could keep just a file and sync that using Puppet manifests of course. But what about the mentioned default editor settings? And you do not want to break anything with a syntax error?
I’ve found this puppet-vim module pretty nifty and helpful. The most recent commit inside the Vagrant boxes uses it already.

class { 'vim':
  opt_bg_shading => 'light',
}

There are many other options available such as setting it as default editor on Debian. To mention some more:

  • opt_nocompatible
  • opt_bg_shading – I prefer a light background, also easier on a beamer for an Icinga Camp demo
  • opt_lastposition – jump to the last position when opening a file. I definitely want that everywhere.
  • opt_syntax – enable syntax highlighting. On older systems or Debian this is disabled by default.
  • opt_misc – sets some interesting default values for incremental search, etc.:
    [‚hlsearch‘,’showcmd‘,’showmatch‘,’ignorecase‘,’smartcase‘,’incsearch‘,’autowrite‘,’hidden‘]

In case you ask – why do you care so much about vim? I wanted to integrate the new Icinga 2 vim syntax highlighting packages into the Vagrant boxes. Just install „vim-icinga2“ (currently snapshot packages, available with 2.5.0) and you’re ready to go. This is also part of our Icinga 2 training sessions helping you to understand keywords and object definitions far more easy.

  package { 'vim-icinga2':
    ensure => 'latest',
    require => [ Class['icinga_rpm'], Class['vim'] ],
    alias => 'vim-icinga2'
  }

Enjoy vim everywhere 🙂
vagrant_icinga2_vim_syntax_highlighting
 

Verifying YAML

Wer Puppet mit Hiera und einem YAML Backend nutzt weiß das einfache Format sicherlich zu schätzen. Listen, Maps und Einzelwerte lassen sich schnell, einfach und leserlich abbilden:

Liste1: ["a", "b", "c"]
Liste2:
  - d
  - e
MapEins:
  eins: 1
  zwei: 2
  drei:
    drei: 3
key: value

Zur Interpretation der Datenstrukturen verlässt sich YAML auf eine fehlerfreie Einrückung der einzelnen Elemente, z.B. müssen in Liste2 die Element e und d mit gleich vielen Leerzeichen eingerückt werden. Im Prinzip eine sehr einfach Regel, allerdings ist vermutlich auch schon jeder in solch kleine Stolperfallen des YAML-Formats gelaufen. In Verbindung mit Puppet führt dies manchmal zu unklaren bzw. ungenauen Fehlermeldungen. Oftmals werden Fehler durch zu viele oder zu wenige Leerzeichen, Tabs, unsichtbare Sonderzeichen bzw. falsche Zeilenumbrüche verursacht. Aber soweit muss es nicht kommen, da es viele Möglichkeiten gibt die YAML-Syntax zu prüfen. In der Regel bietet jede Skript Sprache einen YAML-Parser, welche mehr oder weniger klare Fehlermeldungen ausgeben. Für ein kleines Beispiel habe ich ein Element falsch eingerückt und in verschiedenen Skript Sprachen geladen:

$ python -c "import yaml; yaml.load( open('my.yaml', 'r'), Loader=yaml.CLoader  )"
yaml.scanner.ScannerError: mapping values are not allowed in this context
  in "my.yaml", line 8, column 8
$ ruby -e "require 'yaml'; YAML.load_file('my.yaml')"
/usr/share/ruby/psych.rb:370:in 'parse': (my.yaml): mapping values are not allowed in this context at line 8 column 8 (Psych::SyntaxError)
$ js-yaml my.yaml
JS-YAML: bad indentation of a mapping entry at line 8, column 8:
       zwei: 2
           ^

Ihr seht selbst, dass js-yaml den Fehler wohl am besten und klarsten darstellt. Natürlich will keiner immer wieder auf der Command-Line überprüfen ob die verwendeten YAML Dateien korrekt formatiert sind. Am besten soll dies der Editor bereits beim speichern der Datei anzeigen. Wer vim mit Syntastic verwendet muss nur dafür sorgen, dass js-yaml vorhanden ist. Dies installiert man am besten über den Node.js Paket Manager npm.

$ apt-get/yum/dnf install npm
$ npm install -g js-yaml

Wie man Syntastic für vim installiert könnt ihr hier nachlesen.

Achim Ledermüller
Achim Ledermüller
Senior Manager Cloud

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist er für den Betrieb und die Weiterentwicklung unserer Cloud-Plattform verantwortlich.