Spring ohne Bin-Präfix nutzen

Spring lässt sich sehr einfach installieren: Gem eintragen und die Binstubs erzeugen:

bundle exec spring binstub --all

Um nun rake routes oder rails generate statt bin/rake routes oder bin/rails generate nutzen zu können, einfach die folgenden Funktionen in beispielsweise die bash_aliases eintragen:

rake() { if [ -f bin/rake ]; then bin/rake "$@"; else bundle exec rake "$@"; fi }
rails() { if [ -f bin/rails ]; then bin/rails "$@"; else bundle exec rails "$@"; fi }
rspec() { if [ -f bin/rspec ]; then bin/rspec "$@"; else bundle exec rspec "$@"; fi }

Mein Dankeschön für den Ansatz geht an Arne.

weiterlesen

Fuzzy-Search-Filter für die Bash

Ich hatte kürzlich von meiner nicht hunderprozentig zufriedenstellenden Suche nach einer Fuzzy-Search für die Bash geschrieben. Das Problem ist nicht das Herausfiltern an sich, sondern die Gewichtung der Ergebnisse. Als Maß für die Güte eignet sich die Levenshtein-Distanz. Diese zählt die Notwendigen Ersetzungen, Einfügungen und Löschungen, die nötig sind, um String a in String b zu überführen. Je geringer diese sogenannte Distanz, desto ähnlicher sind sich die Strings und desto passender sind sie als Suchergebnis (zumindest in der Theorie).

Meine Suche nach einer einfachen Implementierung, die ich von der Bash aufrufen kann, ist leider erfolglos geblieben. Interessanterweise ist die Implementierung der Levenshtein-Distanz für eine Fuzzy-Search sehr einfach, so dass es sich auch in sperrigem Bash gut umsetzen lässt. weiterlesen

Die Suche nach der Fuzzy-Search

Unscharfes Suchen ist äußerst hilfreich. Wer länger mit Sublime oder vergleichbaren Editoren gearbeitet hat weiß es zu schätzen, dass er statt eines Datei-Dialogs Strg+p, „filibpost“ und Enter drückt, um etwa files/sql/libs/postgresql-lib.rb zu öffnen. Ich arbeite gerade an einem ähnlichen Hilfskommando, welches das Öffnen in Vim etwa mittels ff filibpost vim ermöglicht. Alles nicht so schwierig – bis auf die sogenannte „Fuzzy Search“. weiterlesen

Dateien nach LOC auflisten

Das einfachste, aber manchmal durchaus ausreichende Maß für Komplexität sind die guten alten Lines of Code. Hier ein kleiner Schnipsel, um in der Bash alle Ruby-Dateien des aktuellen Verzeichnisses und aller Unterverzeichnisse aufzulisten:

find . -name '*.rb' -print0 | xargs -0 wc -l | sort -n

Das funktioniert natürlich mit jeder beliebigen Sprache. Einfach die Dateiendung im Find-Befehl anpassen.

Coffeescript nur nach Änderung kompilieren

Mein Build- und Entwicklungshilfe-Script für Node-Projekte kann bereits das Wesentliche: Coffeescript kompilieren, Tests ausführen, einen Server starten und beenden sowie das Dateisystem überwachen, um die anderen Aufgaben nach jedem Speichern automatisch auszuführen. Die schnell geschriebene Build-Task kompilierte bisher jede Coffeescript-Datei, die sie finden konnte. Um nach dem Speichern möglichst schnell Testergebnisse zu erhalten, sollte nur neu gebaut werden, was sich auch geändert hat. weiterlesen

Bash-Build-Script mit Desktop-Nachrichten und Dateiüberwachung

Ich habe mich die letzte Zeit viel mit Grunt herumgeschlagen. Grunt ist ein umfangreiches und mächtiges Build-Werkzeug für Node, dennoch hatte ich stets das Gefühl, dass die Konfiguration umständlicher als der wirkliche Nutzen ist. Ich habe daher mit einem Build-Script auf Bash-Basis begonnen, welches vom Nutzer spezifizierte Aufgaben nacheinander ausführt. Diese frühe Version unterstützt Coffeescript-Kompilierung, Testausführung und Dateisystemüberwachung, welche die anderen Tasks bei jeder Änderung automatisch ausführt. Nach dem Speichern bekommt man so stets die direkte Rückmeldung, ob die Unittests erfolgreich waren. weiterlesen

Pfad und Name eines Bash-Skripts

Oft muss ein Bash-Script einige Sachen von sich selbst wissen, um zum Beispiel das CWD sicherzustellen oder sinnvolle Ausgaben zu erzeugen. Die folgenden drei Befehle befüllen drei Variablen mit dem absoluten Verzeichnispfad, mit dem Dateinamen und dem vollständigen Pfad zur aktuellen Script-Datei:

#!/bin/bash

# /home/user
scriptdir=$(cd $(dirname $0); pwd -P)

# test.sh
scriptname=$(basename $0)

# /home/user/test.sh
scriptpath=$(cd $(dirname $0); pwd -P)/$(basename $0)