vi-style line editing in der Shell

Auch unter OS X kann im Terminal mittels Emacs-Komandos die Commandline verändert werden. So springt z. B. Ctrl-a an den Anfang der Zeile und Ctrl-e an das Ende. Als vi-Nutzer ist man 0 (zum Anfang) und $ (zum Ende) gewohnt.

Ein Blick auf die Hilfe von Set zeigt folgendes:

$ help set
set: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
        -a  Mark variables which are modified or created for export.
        -b  Notify of job termination immediately.
        -e  Exit immediately if a command exits with a non-zero status.
        -f  Disable file name generation (globbing).
        -h  Remember the location of commands as they are looked up.
        -k  All assignment arguments are placed in the environment for a
            command, not just those that precede the command name.
        -m  Job control is enabled.
        -n  Read commands but do not execute them.
        -o option-name
            Set the variable corresponding to option-name:
                allexport    same as -a
                braceexpand  same as -B
                emacs        use an emacs-style line editing interface
                errexit      same as -e
                errtrace     same as -E
                functrace    same as -T
                hashall      same as -h
                histexpand   same as -H
                history      enable command history
                ignoreeof    the shell will not exit upon reading EOF
                interactive-comments
                             allow comments to appear in interactive commands
                keyword      same as -k
                monitor      same as -m
                noclobber    same as -C
                noexec       same as -n
                noglob       same as -f
                nolog        currently accepted but ignored
                notify       same as -b
                nounset      same as -u
                onecmd       same as -t
                physical     same as -P
                pipefail     the return value of a pipeline is the status of
                             the last command to exit with a non-zero status,
                             or zero if no command exited with a non-zero status
                posix        change the behavior of bash where the default
                             operation differs from the 1003.2 standard to
                             match the standard
                privileged   same as -p
                verbose      same as -v
                vi           use a vi-style line editing interface
                xtrace       same as -x
        -p  Turned on whenever the real and effective user ids do not match.
            Disables processing of the $ENV file and importing of shell
            functions.  Turning this option off causes the effective uid and
            gid to be set to the real uid and gid.
        -t  Exit after reading and executing one command.
        -u  Treat unset variables as an error when substituting.
        -v  Print shell input lines as they are read.
        -x  Print commands and their arguments as they are executed.
        -B  the shell will perform brace expansion
        -C  If set, disallow existing regular files to be overwritten
            by redirection of output.
        -E  If set, the ERR trap is inherited by shell functions.
        -H  Enable ! style history substitution.  This flag is on
            by default when the shell is interactive.
        -P  If set, do not follow symbolic links when executing commands
            such as cd which change the current directory.
        -T  If set, the DEBUG trap is inherited by shell functions.
        -   Assign any remaining arguments to the positional parameters.
            The -x and -v options are turned off.

    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.

Man muss – sofern man Bash als Shell benutzt – also nur eine Zeile zur eigenen .profile-Datei hinzufügen:

set -o vi

und schon kann man die gewohnten vi-Keybindings nutzen, wie der nachfolgende Screencast zeigt.

Screencast vi-style line editing in der Shell

Vimlinks

Neuer Workflow mit Vim und tmux statt MacVim

Nachdem ich nun schon seit langer Zeit MacVim und das Terminal nutze bin ich jetzt auf Vim und tmux gewechselt.

Tmux ist ein Terminal Multiplexer, welcher ganz grob gesagt u. A. eine Möglichkeit bietet, mehrere Terminal-Sessions in einem Fenster laufen zu lassen. So wirkt und fühlt sich das ganze mehr wie aus einem Guß an und ich muss nicht mehr zwischen verschiedenen Applikationen wechseln.

MacVim Terminal Workflow
MacVim Terminal Workflow
Vim Tmux Workflow
Vim tmux Workflow

Hallo Welt!

Ich bin ja nicht so der Freund vom vielen schreiben aber ich dachte ich versuch es einfach mal. Wer hier regelmäßige Einträge erwartet, ist hier falsch. Möglicherweise wird das ganze hier auch einfach nur eine Ansammlung von Links zu Interessanten Fundstücken im Netz, mal sehen was draus wird…

Und nicht wundern, warum dies nicht der 1. Eintrag ist. Ich habe meine Artikel, welche ich bisher auf meiner Webseite hatte hier her umgezogen.

PS. Falls sich jemand fragt wofür NOP steht… es steht in der Tat für den Assembler-Befehl „No Operation“.

Mittels Closure durch ein Array iterieren in JavaScript

Im nachfolgenden (vereinfachten) JavaScript Closure Beispiel iteriere ich durch ein Array und gebe den Inhalt in einem Div mit der ID ‚out‘ aus.

var myarr = ["a", "b", "c", "d"], getNext, $out = $("#out");

function iterator(arr) {
  var idx = 0;
  return function () {
    return arr[idx++];
  };
}

getNext = iterator(myarr);

$out.append(getNext()+'<br />'); // a
$out.append(getNext()+'<br />'); // b
$out.append(getNext()+'<br />'); // c
$out.append(getNext()+'<br />'); // d

Ein Beispiel hierzu habe ich auf JSFiddle eingebunden.

Einheitliche Submit Buttons via CSS

Dem ein oder andern Webentwickler mag es schon aufgefallen sein:

„Einheitliche Submit Buttons sollten browserübergreifend kein Problem sein, aber weshalb sieht der via CSS angepasste Submit Button im Firefox anders aus, obwohl ein CSS-Reset verwendet wurde?“

Anhand des folgenden Screenshots wird das Problem deutlich:

Firefox without fix

Wie man hier gut erkennen kann muss irgendwo noch ein Abstand definiert sein, welcher die grüne Box im Firefox etwas breiter und höher anzeigt als in den anderen Browsern. Ein explizites margin:0 !important; und padding:0 !important; zeigt keinerlei Wirkung.

Nach einiger Recherche bin ich auf das Standard Formular Stylesheet von Mozilla Firefox und einen interessanten Beitrag bei Stackoverflow gestoßen.

Das Stylesheet kann man sich in Firefox direkt ansehen, indem man resource://gre-resources/forms.css in die Addresszeile eingibt.

Bei Webseiten mit angepassten Formularen empfiehlt es sich daher folgende Zeilen in bzw. nach dem CSS-Reset zu definieren:

button::-moz-focus-inner,
input[type="reset"]::-moz-focus-inner,
input[type="button"]::-moz-focus-inner,
input[type="submit"]::-moz-focus-inner,
input[type="file"] &gt; input[type="button"]::-moz-focus-inner {border:0;padding:0;margin:0;}

Nach der Einbindung sehen unsere Testseiten wie folgt aus:

Firefox with fix

Schnell mal auskommentieren in JavaScript und CSS

Der Trick der JavaScript Kommentare aus dem vorherigen Artikel lässt sich entsprechend so anpassen, dass er auch in CSS-Dateien verwendet werden kann.

In diesem Beispiel soll Funktion test1 auskommentiert werden.

function test() {
  
}
/**/
function test1() {
  
}
/**/
function test2() {
  
}

Durch einfaches entfernen des 2. Sternes in Zeile 4 wird der Code bis einschließlich Zeile 8 auskommentiert.

function test() {
  
}
/*/
function test1() {
  
}
/**/

Schnell mal auskommentieren in JavaScript

Ich habe einen alten Kommentar-Trick aus einer noch älteren Flash-Datei gefunden. Bekanntlich war die interne IDE nicht die Beste und zur damaligen Zeit war noch kein Shortcut zum auskommentieren verfügbar.

Das Prinzip lässt sich jedoch auch schön in JavaScript-Sourcecode verwenden.

In diesem Beispiel soll Funktion test1 auskommentiert werden.

function test() {
  
}
//*/
function test1() {
  
}
//*/
function test2() {
  
}

Durch einfaches entfernen des 1. Slashes in Zeile 4 wird der Code bis einschließlich Zeile 8 auskommentiert.

function test() {
  
}
/*/
function test1() {
  
}
//*/
function test2() {
  
}

Heute könnte es auch mal nützlich sein, wenn man unterwegs via Tablet/Smartphone per FTP eine JavaScript-Datei editiert und doch mal größere Bereiche auskommentieren möchte.