import composure functions
authorErich Smith <heartquest@gmail.com>
Fri, 27 Apr 2012 19:07:04 +0000 (15:07 -0400)
committerErich Smith <heartquest@gmail.com>
Sat, 28 Apr 2012 04:02:31 +0000 (00:02 -0400)
bash_it.sh [changed mode: 0644->0755]
lib/composure.sh [new file with mode: 0755]

old mode 100644 (file)
new mode 100755 (executable)
index 8564c88..cd97ab3
@@ -21,6 +21,9 @@ then
     unset $BASH_THEME;
 fi
 
+# Load composure first, so we support function metadata
+source "${BASH_IT}/lib/composure.sh"
+
 # Load colors first so they can be use in base theme
 source "${BASH_IT}/themes/colors.theme.bash"
 source "${BASH_IT}/themes/base.theme.bash"
diff --git a/lib/composure.sh b/lib/composure.sh
new file mode 100755 (executable)
index 0000000..b4b740b
--- /dev/null
@@ -0,0 +1,213 @@
+#!/bin/bash
+# Composure - don't fear the UNIX chainsaw...
+# by erichs, 2012
+
+# these are a set of light-hearted shell functions that aim to make
+# programming the shell easier and more intuitive
+
+# latest source available at http://git.io/composure
+
+source_composure ()
+{
+    if [ -z "$EDITOR" ]
+    then
+      export EDITOR=vi
+    fi
+
+    if $(tty -s)    # is this a TTY?
+    then
+      bind '"\C-j": edit-and-execute-command'
+    fi
+
+    cite ()
+    {
+        about () { :; }
+        about creates a new meta keyword for use in your functions
+        local keyword=$1
+        for keyword in $*; do
+            eval "function $keyword { :; }"
+        done
+    }
+
+    cite about param example
+
+    draft ()
+    {
+      about wraps last command into a new function
+      param 1: name to give function
+      example $ ls
+      example $ draft list
+      example $ list
+      local name=$1
+      eval 'function ' $name ' { ' $(fc -ln -1) '; }'
+    }
+
+    write ()
+    {
+      about prints function declaration to stdout
+      param name of function or functions, separated by spaces
+      example $ write myfunction
+      example $ write func1 func2 func3 > ~/funcs.sh
+      local func
+      for func in $*
+      do
+          # trim trailing semicolons generated by declare -f
+          declare -f $func | sed  "s/^\(.*\);$/\1/"
+          echo
+      done
+    }
+
+    revise ()
+    {
+        about loads function into editor for revision
+        param name of function or functions, separated by spaces
+        example $ revise myfunction
+        example $ revise func1 func2 func3
+        local temp=$(mktemp /tmp/revise.XXXX)
+        write $* > $temp
+        $EDITOR $temp
+        eval "$(cat $temp)"
+        rm $temp
+    }
+
+    metafor ()
+    {
+        about prints function metadata associated with keyword
+        param 1: function name
+        param 2: meta keyword
+        example $ metafor reference example
+        local func=$1 keyword=$2
+        write $func | sed -n "s/^ *$keyword \([^([].*\)$/\1/p"
+    }
+
+    reference ()
+    {
+        about displays help summary for all functions, or help for specific function
+        param 1: optional, function name
+        example $ reference
+        example $ reference metafor
+
+        printline ()
+        {
+            local metadata=$1 lhs=${2:- }
+
+            if [[ -z "$metadata" ]]
+            then
+                return
+            fi
+
+            OLD=$IFS; IFS=$'\n'
+            local line
+            for line in $metadata
+            do
+                printf "%-20s%s\n" $lhs $line
+            done
+            IFS=$OLD
+        }
+
+        help ()
+        {
+            local func=$1
+
+            local about="$(metafor $func about)"
+            printline "$about" $func
+
+            local params="$(metafor $func param)"
+            if [[ -n "$params" ]]
+            then
+                echo "parameters:"
+                printline "$params"
+            fi
+
+            local examples="$(metafor $func example)"
+            if [[ -n "$examples" ]]
+            then
+                echo "examples:"
+                printline "$examples"
+            fi
+
+            unset printline
+        }
+
+        if [[ -n "$1" ]]
+        then
+            help $1
+        else
+            for func in $(compgen -A function); do
+                local about="$(metafor $func about)"
+                printline "$about" $func
+            done
+        fi
+
+        unset help printline
+    }
+
+}
+
+install_composure ()
+{
+    echo 'stay calm. installing composure elements...'
+
+    # find our absolute PATH
+    SOURCE="${BASH_SOURCE[0]}"
+    while [ -h "$SOURCE" ]
+    do
+        SOURCE="$(readlink "$SOURCE")"
+    done
+    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+
+    # vim: automatically chmod +x scripts with #! lines
+    done_previously () { [ ! -z "$(grep BufWritePost | grep bin | grep chmod)" ]; }
+
+    if [ -f ~/.vimrc ] && ! $(<~/.vimrc done_previously)
+    then
+      echo 'vimrc: adding automatic chmod+x for files with shebang (#!) lines...'
+      echo 'au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent execute "!chmod a+x <afile>" | endif | endif' >> ~/.vimrc
+    fi
+
+    # source this file in your startup: .bashrc, or .bash_profile
+    local done=0
+    done_previously () { [ ! -z "$(grep source | grep $DIR | grep composure)" ]; }
+
+    [ -f ~/.bashrc ] && $(<~/.bashrc done_previously) && done=1
+    ! (($done)) && [ -f ~/.bash_profile ] && $(<~/.bash_profile done_previously) && done=1
+
+    if ! (($done))
+    then
+      echo 'sourcing composure from .bashrc...'
+      echo "source $DIR/$(basename $0)" >> ~/.bashrc
+    fi
+
+    echo 'composure installed.'
+}
+
+if [[ "$BASH_SOURCE" == "$0" ]]
+then
+  install_composure
+else
+  source_composure
+  unset install_composure source_composure
+fi
+
+: <<EOF
+License: The MIT License
+
+Copyright © 2012 Erich Smith
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify,
+merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be included in all copies
+or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+EOF