Wie meine Entwicklungsumgebung eingerichtet ist

Beim synyx Camp vor zwei Wochen haben wir uns unter anderem über das Setup unserer Entwicklungsumgebungen unterhalten. Im Folgenden möchte ich kurz berichten, wie ich meine eingerichtet habe und welche Programme ich in meiner alltäglichen Arbeit nicht mehr missen möchte.

Kurz angerissen werden:

Terminal

Ich arbeite mit einem MacBook und habe von Anfang an iTerm2 genutzt. Weshalb weiß ich leider nicht mehr. Vielleicht gab es damals für das von Haus aus installierte Terminal keine Möglichkeit ein Dark Theme zu verwenden. Vielleicht gab es damals auch nicht die Möglichkeit ein Terminalfenster in der Horizontalen zu splitten. Beides ist mittlerweile möglich. Andere von mir genutzte iTerm2 Features kommen mir gerade nicht in den Sinn…

Viel interessanter finde ich jedenfalls die Frage, welche Shell installiert ist und wie sie personalisiert ist. Ich verwende zsh und natürlich(?) auch oh-my-zsh, um meine Shell im Look & Feel anzupassen und mit Plugins erweitern zu können.

Code Beispiel

Folgende oh-my-zsh Plugins habe ich installiert:

  • z
    • führt eine Liste von Pfaden, in welche man auf der Shell mit cd navigiert und matcht die eingegebenen Zeichen auf den meist besuchten Pfad
    • z. B. führt bei mir der Befehl z dot zu /Users/seber/projects/git/dotfiles
  • zsh-better-npm-completion
    • drücke Tab, um projektspezifische npm Task Vorschläge zu bekommen
    • z. B. bekomme ich im Screenshot die Tasks lint, lint:watch, start und start:watch vorgeschlagen
  • zsh-autosuggestions
    • fange an zu tippen und der Befehl wird ausgegraut vervollständigt
      drücke Pfeiltaste rechts und Enter, um ihn auszuführen
  • zsh-syntax-highlighting
    • hebt das auszuführende Programm farblich hervor
      (nützlich um zu sehen, ob ich mich vertippt habe)

Als Prompt habe ich lange Zeit die pure prompt verwendet. Sie ist super schlank und zeigt nützliche Infos zum aktuellen git Repository an. Vor wenigen Wochen bin ich jedoch zur spaceship-prompt gewechselt. Einerseits um einfach mal wieder was neues auszuprobieren, andererseits weil sie mir von Haus aus die Version der Programmiersprache des aktuellen Projektes anzeigt. Im Screenshot oben sieht man nach dem Wechsel in das workshop-maze-vr Verzeichnis den Hinweis, dass das Projekt ein nodeJS Projekt ist und die bash session aktuell v10.9.0 verwendet. Neben nodeJS werden einige andere Programmiersprachen unterstützt, Java leider nicht.

Die Anordnung der spaceship prompt Dinge und ob sie überhaupt angezeigt werden sollen, kann konfiguriert werden:

SPACESHIP_PROMPT_ORDER=(
  time          # Time stamps section
  user          # Username section
  dir           # Current directory section
  git           # Git section (git_branch + git_status)
  node          # Node.js section
  docker        # Docker section
  exec_time     # Execution time
  line_sep      # Line break
  jobs          # Background jobs indicator
  exit_code     # Exit code section
  char          # Prompt character
)

und auch das Symbol mit welchem eine Zeile beginnen soll. Ich wollte weiterhin das Zeichen der pure prompt verwenden und habe daher den default überschrieben:

SPACESHIP_CHAR_SYMBOL='❯ '

Git

Git verwende ich überwiegend über die Konsole. Mit grafischen Programmen bin ich nie richtig warm geworden. Angefangen mit gitk und git gui auf einem Linux Rechner bin ich über git-cola, SourceTree, GitKraken, Fork und noch ein paar andere gestolpert. Aber das Geklicke und der Kontextwechsel zwischen IDE und $Werkzeug haben mich immer gestört. Auch visuell fand ich bis auf GitKraken und neuerdings Fork nichts ansprechend (ja, ist mir wichtig, hat man anfangs schon beim Dark Theme fürs Terminal bemerkt 🙄). Hauptsächlich hat mich aber das Nichtvorhandensein bzw. die umständliche Handhabung des rebasen gestört. Das geht für mich am schnellsten auf der Konsole mit eigenen git aliasen.

Meine häufigsten Befehle sind:

  • git up
    • hole den aktuellen Stand von remote mit einem rebase
    • lösche alle lokalen Branches die bereits gemerged wurden
  • git cm "jetzt funktionierts wirklich!!!1elf"
    • comitte alle Änderungen mit der folgenden commit message
      (inklusive neu angelegte Dateien)
  • git amend
    • füge alle Änderungen dem letzten HEAD commit hinzu
      (exklusive neu angelegte Dateien)
  • git ll
    • drucke eine Liste aller commit hashes und messages des aktuellen Branches ab HEAD
    • die Länge der Liste kann mit -42 begrenzt werden
  • git fix und git ri
    • erzeuge einen fixup commit und räume die commits mit einem interactive rebase auf
    • workflow ist dann wie folgt:
❯ git ll -5
a52747d (HEAD -> master, origin/master, origin/HEAD) foo
b858f05 bar
4954b3d baz
782d959 bum
2b1c7c6 buff
❯ git add .
❯ git fix 782d959
❯ git ri 782d959^

Eigene git aliase können in der globalen git config unter ~/.gitconfig abgelegt werden.

Da ich meine merge requests im Normalfall erst auf den master rebase bevor ich sie zum mergen freigebe, bin ich super glücklich über das rerere Feature von git. Ist das Feature aktiviert, merkt sich git beim rebasen, wie ein Konflikt gelöst wird. Kommt es erneut zu dem selben Konflikt, weiß git wie es diesen automatisiert zu lösen hat.

[rerere]
  enabled = true
[alias]
  s = status
  st = stash
  co = checkout
  cob = checkout -b
  fix = commit --fixup
  ri = rebase -i --autosquash
  up = !git pull --rebase --prune && git bclean
  cm = !git add -A && git commit -m
  amend = commit -a --amend
  ll = !git --no-pager log --oneline --decorate
  bclean = "!f() { branches=$(git branch --merged ${1-master} | grep -v " ${1-master}$"); [ -z \"$branches\" ] || git branch -d$branches; }; f"

Programme

Weitere Programme, die ich in meiner täglichen Arbeit nicht mehr missen möchte, sind:

  • homebrew (kommandozeile)
    • quasi DER Paketmanager für OSX
    • Programme installieren mit brew install FOO. Schneller gehts nicht!
  • direnv (kommandozeile)
    • lege in einem Verzeichnis eine .envrc Datei ab und definiere dort z. B. die Java oder NodeJS Version, oder auch eine andere git E-Mail-Adresse, falls man hier eine andere als die globale verwenden möchte für commits
  • jq (kommandozeile)
    • JSON Prozessor für die Kommandozeile
  • nodenv (kommandozeile)
    • verwalte unterschiedliche Versionen von NodeJS (Alternative zu z. B. Node Version Manager (nvm))
    • Anfang des Jahres bin ich von nvm auf nodenv umgestiegen, weil letzteres die Shell beim Initialisieren nicht blockiert. nvm braucht seine Zeit zum Laden von NodeJS
  • spectacle
    • verschiebe Fenster und ändere deren Größe mit deiner Tastatur
    • die Tastenkombinationen sind konfigurierbar
    • ich hatte einen UltraWide Monitor und habe so schnell mal drei Fenster in der Breite gedrittelt verteilt
    • Natürlich ist das auch auf einem normalen Laptop Display sinnvoll, Fenster ohne Maus rechts/links oder oben/unten ausrichten zu können
  • clipy
    • wer die copy-paste aus IntelliJ lieb gewonnen hat; clipy macht das systemweit (die Alternative wäre, das Powerpack für Alfred zu kaufen)
    • man achte auf Passwörter! Clipy bietet die Möglichkeit, bestimmte Programme zu ignorieren. Es ist ratsam dort KeepassX oder sonstigen Tresor einzutragen 😉
  • spotify
    • Musik muss natürlich sein 🎧

Vielen Dank fürs Lesen (☞゚ヮ゚)☞ (smilie eingefügt mit clipy snippets)