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
 

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...

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
Lead Senior Systems Engineer

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist unter anderem für die Automatisierung des RZ-Betriebs und der Evaluierung und Einführung neuer Technologien zuständig.

Weekly Snap: OSDC & PuppetCamp Reflections, PSTree & Ceph

weekly snap15 – 19 April was all about OSDC and PuppetCamp, peppered with tools for developers, admins and cheap flights.
Eva reported on the pre-conference workshop, first and second day of the OSDC. Michael chimed in with his discovery at the OSDC that truth is in the logs amongst his other reflections on presentations of the day. Also inspired at the OSDC, Achim took a look at scalable storage with Ceph.
On the next day Dirk got into Puppet Camp, reporting on the first introductory workshop as well as the morning and afternoon presentations.
Meanwhile, Jannis shared a couple small helpers for developers and admins, from PSTree and a chrome network tool to handy Vim commands.
Finally Ronny wondered if handwriting would one day become a disappearing skill, as Birger discovered a new way to book flights – by paying the experts.

Text completion für vim mit supertab

Mit der weltweit größten Messe für Informationstechnik letzter Woche wurde sicherlich viel über tolle neue Technik und Software gebloggt. Einen Stand der sich mit meinem Lieblingseditor vim beschäftigt habe ich auf der CeBIT leider nicht gesehen, aber ich hatte auch nicht wirklich Zeit um zu suchen 😉
Aus diesem Grund gibt es von mir wieder einmal einen Post über ein vim-Plugin das ich sehr gern mag. Mit suptertab [1] kann ich auch im vim die geliebte Completion diverser Shells verwenden, allerdings nur für Wörter die bereits in einem der Buffer enthalten sind. Einfach den Anfangsbuchstaben eines Wortes eingeben, z.B. das s von supertab und auf die Tab-Taste drücken. Zugegeben, suptertab ist bei mir meistens nur im Einsatz wenn ich längere Texte schreibe, aber dort möchte ich es nicht missen. Außerdem ist es innerhalb von 20 Sekunden installiert.

$ cd ~/.vim/plugin
$ wget https://raw.github.com/ervandew/supertab/master/plugin/supertab.vim
Achim Ledermüller
Achim Ledermüller
Lead Senior Systems Engineer

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist unter anderem für die Automatisierung des RZ-Betriebs und der Evaluierung und Einführung neuer Technologien zuständig.

Weekly Snap: CeBIT Stand & PuppetCamp, Icinga / Nagios & Puppet Courses

weekly snap18 – 22 February was all about events, workshops and training courses in Puppet, Icinga / Nagios and development.
Eva began by counting 58 days down to the OSDC with Christian Winkler’s presentation on “Ultra performant websites with varnish MP4”.
She also announced NETWAYS’ CeBIT stand whereabouts this year and reminded interested speakers to submit their talks to the Puppet Camp 2013 Call for Papers before 15 March.
Puppet Labs then trained our Puppet trainers Sebastian and Thomas in preparation for the upcoming Puppet courses they’ll be running.
Continuing with courses, Eva dished the details on Dirk and Christian’s three Nagios / Icinga workshops with iX.
Lastly, Markus shared his .vimrc and favourite VIM addons as our dev team re-emerged from their two-day blue-sky think camp with new processes and photos to show.

VIM ist einfach cool

Als Linux-Consultant arbeitet man viel auf der Shell, daher sollte der Editor der Wahl möglichst auch überall wo man SSH hat einsetzbar sein.
Meine Wahl ist seit einigen Jahren daher VIM, dabei gewöhnt man sich über die Jahre ein seine eigenen Einstellungen und möchte diese auch gar nicht mehr missen.
Ich persönlich werde jedenfalls halb wahnsinnig wenn ich mit so einem blanken VIM ohne meine eigene Konfiguration arbeiten muss 😉
Heute nutze ich die Gelegenheit um meine mühsam gepflegte .vimrc zu teilen, natürlich mit Kommentaren.

syntax on                 " Aktiviert das Syntax Hervorhebung immer
set background=dark       " Hilfreich bei Terminals mit dunklem Hintergrund
                          " dann sieht man auch die Kommentare endlich wieder
set title                 " Titel Text für moderne Terminals (Datei und Pfad)
set modeline modelines=5  " Schaltet die Modeline Erkennung an
set ts=4                  " Setzt den Tabstopp und die Shiftwidth (Sprungweite
set sw=4                  " beim Einrücken) auf 4 Leerzeichen
set expandtab             " Nie Tabstopps benutzen, sondern Leerzeichen
set autoindent            " Automatisches Einrücken bei New-Line
set smarttab              " Intelligenteres Löschen von Leerzeichen-Tabs
set mouse=a               " Schaltet die Maus Bedienung ein
                          " Ein geniales Feature - nach etwas Eingewöhnung...
                          " Tipp: mit Shift-Klick kann man ganz normal im
                          " Terminal markieren
                          " Achja: Mausrad funktioniert wunderbar!
set hlsearch              " Hebt die aktuellen Suchergebnisse hervor
" Tell vim to remember certain things when we exit
"  10  :  marks will be remembered for up to 10 previously edited files
"  100 :  will save up to 100 lines for each register
"  20  :  up to 20 lines of command-line history will be remembered
"  %    :  saves and restores the buffer list
"  n... :  where to save the viminfo files
set viminfo='10,\"100,:20,%,n~/.viminfo
" Und zu guter letzt: Mit dieser kleinen Hilfsfunktion wird die Position
" an der man zuletzt in einer Datei war mit in die .viminfo gespeichert
function! ResCur()
  if line("'\"") <= line("$")
    normal! g`"
    return 1
  endif
endfunction
augroup resCur
  autocmd!
  autocmd BufWinEnter * call ResCur()
augroup END

Ich benutze auch einige Addons:

Weiterführende Links:

Markus Frosch
Markus Frosch
Principal Consultant

Markus arbeitet bei NETWAYS als Principal Consultant und unterstützt Kunden bei der Implementierung von Nagios, Icinga und anderen Open Source Systems Management Tools. Neben seiner beruflichen Tätigkeit ist Markus aktiver Mitarbeiter im Debian Projekt.

Die Suche nach dem heiligen Gral

Alle Monate aufs Neue mache ich mich auf die Suche nach einer neuen, tolleren IDE, die hoffentlich alle meine Probleme lösen kann. Bisher jedoch leider vergeblich, obwohl – wie ich finde – meine Anforderungen doch eigentlich gar nicht so unrealistisch sind:

  • Syntax-Highlighting und Code-Completion für C/C++
  • Plattformunabhängigkeit: Sollte unter Linux und Windows verwendbar sein
  • Unterstützung für autoconf/automake wäre ganz nett
  • Integration von GDB inkl. Remote Debugging
  • Ich möchte gerne mehr Zeit damit verbringen, Code zu schreiben, als die IDE zu konfigurieren oder gegen deren Macken anzukämpfen

Und so fange ich an, diverse IDEs zu testen – in der Hoffnung, dass die jeweils aktuelle Version inzwischen halbwegs erträglich ist.
Zunächst einmal Eclipse CDT und NetBeans. Plattformunabhängig sind sie ja, das muss man den Java-IDEs lassen. Aber da hört es für mich leider auch schon wieder auf. Mal eben Eclipse starten, um eine Datei zu bearbeiten?: Fehlanzeige – die IDE startet so träge, dass es mich wundert, dass die Entwickler nicht gleich noch einen Lade-Screen für den Splash-Screen implementiert haben.
Auch das Indexing für die Code Completion lässt sich bei beiden IDEs gerne mal etwas mehr Zeit. Im Allgemeinen scheinen sowieso viele Hintergrund-Tasks zu laufen, die meine CPU zum Kochen bringen wollen. – Nein, danke.
Der Vollständigkeit halber will ich Visual Studio erwähnen. Was die Editor-Features und v.a. IntelliSense angeht, ist Visual Studio wirklich absolute Spitze. Leider ist es für mich nur eingeschränkt verwendbar, da ich meine Software primär unter Linux teste. Und jedes Mal meinen Quellcode zwischen einer Windows-VM und meiner Linux-Workstation hin- und herzukopieren ist mir zu aufwändig.
Nach weiteren Versuchen mit Anjuta, KDevelop, Code::Blocks und diversen anderen unbekannteren IDEs bin ich dann wieder bei meinen “klassischen” Tools gelandet: GNOME Terminal bzw. PuTTY unter Windows, vim und gdb (mit cgdb-Frontend). Nunja, zumindest habe ich wohl nun wieder für einige Monate keinen Bedarf mehr, die ideale IDE zu finden.

vim, puppet-lint und syntastic

Der letzte Blogpost von mir zeigte wie schnell und einfach man mit pathogen, tabular und vim-puppet die Konfigurationsdateien einheitlich formatieren kann. Von dem Puppet Style Guide ist das Ganze leider noch weit entfernt. Es wird eigentlich ja nur korrekt eingerückt und Syntaxhighlighting macht alles bunter. Mit Hilfe von syntastic, puppet und puppet-lint kann auch noch die Syntax überprüft werden (gemäß des Puppet Style Guides) und es kommt sofort Feedback wenn z.B. eine Variable in einfachen Hochkommas steht (z.B. bla => ‘$blubb’).
syntastic ist ein Vim-Plugin zum überprüfen der Syntax verschiedenster Programmiersprachen (und Ähnliches). Im Fall von Puppet-Konfigurationsdateien greift es auf puppet-lint und puppet zurück, parsed die Ausgabe und zeigt uns durch kleine Spitze Klammern und Fehlermeldungen an was genau in unserem Code noch schief läuft. Jeder kennt das ganze aus halbwegs modernen IDEs wie Eclipse und Co.
Dank pathogen ist die Installation von syntastic mit Hilfe eines einfach git clone erledigt:

$ cd ~/.vim/bundle
$ git clone git://github.com/scrooloose/syntastic.git

Puppet und puppet-lint kann man über den Paketmanager installieren.

# apt-get install puppet puppet-lint

Wer eine aktuellere Version von puppet-lint bevorzugt kann dies auch über rubygems installieren:

$ gem install puppet-lint

Ob nun wirklich alles installiert ist und ob das ganze auch wirklich gut ist kann man ganz leicht mit einem kleinem Beispiel testen:

$ vim test.pp
   class test {
     file { '/tmp/test':
       ensure => present,
         owner  => 'root',
       group => 'root',
       mode   => "0440"
       source => 'puppet:///test/etc/test',
       force  => true,
     }
   }

Speichert man nun die Datei ab (:w), wird im Hintergrund puppet-lint gestartet und syntastic zeigt uns die Fehler. In der Statuszeile werden immer die Fehler der aktuellen Zeile angezeigt. Links am Rand werden Warnungen gelb und Errors mit rot dargestellt, aber seht selbst.
Die meisten von euch denken sich vermutlich: “Für was soll das ganze gut sein? Fehler? Mach ich doch keine!”
sytastic with vim

Achim Ledermüller
Achim Ledermüller
Lead Senior Systems Engineer

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist unter anderem für die Automatisierung des RZ-Betriebs und der Evaluierung und Einführung neuer Technologien zuständig.

Puppet und vim

Die Formatierung von Quelltext ist für die Lesbarkeit natürlich entscheidend und sobald man im Team arbeitet sollte sich jeder an die gleiche Formatierung halten. Vermutlich gibt es für fast jede Programmier- oder Beschreibungssprache einen Styleguide, aber ganz ehrlich, wenn mein Editor das nicht für mich erledigt, lese ich selten irgendwelche Styleguides um herauszufinden, wie weit ich einrücken soll oder ob ich Tabs anstatt Leerzeichen verwenden soll. Glücklicherweise hat rodjek für meinen Lieblingseditor und Puppet eine einfache Lösung parat, welche sich um die Einrückungen und die Ausrichtung der Pfeiloperatoren kümmert und auch Syntax-Highlighting mitbringt. Damit das eigene .vim-Verzeichnis übersichtlich bleibt und die benötigten vim-Plugins auch wieder leicht entfernt werden können, werfen wir aber erstmal einen kurzen Blick auf pathogen, ein vim-Plugin zum Verwalten von vim-Plugins.
pathogen ist zum Glück schnell installiert (die paar Zeilen Code sind von pathogen geklaut):

mkdir -p ~/.vim/autoload ~/.vim/bundle;
curl -Sso ~/.vim/autoload/pathogen.vim  \
  https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim

Jetzt muss man nur noch folgende Zeilen in die ~/.vimrc eintragen und pathogen ist fertig konfiguriert:

call pathogen#infect()
syntax on
filetype plugin indent on

Nachdem wir jetzt unsere vim-Plugins leicht verwalten können, zurück zum eigentlich Thema. Um das vim-Plugin vim-puppet zu installieren reicht dank pathogen ein einfaches git clone im neu angelegten bundle-Verzeichnis. Damit auch noch die automatische Ausrichtung der ‘=>’-Operatoren funktioniert, muss man noch das vim-Plugin tabular installieren.

cd ~/.vim/bundle
git clone https://github.com/rodjek/vim-puppet.git
git clone https://github.com/godlygeek/tabular.git

Wenn man in vim einen Textbereich markiert und = drückt, richtet sich dieser wie von Zauberhand nach den Puppet Guidelines aus! Ein ggVG= im Commandmode und die ganze Datei ist richtig formatiert.
Mein Dank geht an tpope, rodjek und godlygeek. Dort findet Ihr auch ausführlichere Infos.
Im nächsten Blogpost von mir erfahrt Ihr dann mehr über das vim-Plugin syntastic, welches die Syntax eures Codes schon während des Schreibens überprüft.

Achim Ledermüller
Achim Ledermüller
Lead Senior Systems Engineer

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist unter anderem für die Automatisierung des RZ-Betriebs und der Evaluierung und Einführung neuer Technologien zuständig.