Realized that recent changes deserve a new version number.
[selector.git] / bash-selector.sh
index 05bd892..d338487 100755 (executable)
 #  You should have received a copy of the GNU General Public License
 #  along with selector.  If not, see <http://www.gnu.org/licenses/>.
 
-#  This script installs two key-bindings:
+#  This bash script adds two key bindings:
 #
-#  Alt-r for selector-based command history
+#  Alt-r to access a selector-based command history
 #
-#  Alt-c for selector-based directoy history
+#  Alt-c to access a selector-based directory history
 #
 #  Note that you have to call it with "source bash-selector.sh"
-#  otherwise the key-bindings will not be effective in your current
+#  otherwise the key bindings will not be effective in your current
 #  bash
 
 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
@@ -47,55 +47,66 @@ function selector-history () {
 # Selector-based directory history
 ######################################################################
 
-# The file where we will keep track of the directories
+# The file where we will keep track of the directories and how many
+# lines to keep in there
 
 export SELECTOR_CD_HISTORY
 
-[[ "${SELECTOR_CD_HISTORY}" ]] || SELECTOR_CD_HISTORY=${HOME}/.selector-cd-history
+[[ "${SELECTOR_CD_HISTORY}" ]] || SELECTOR_CD_HISTORY="${HOME}/.selector-cd-history"
 
-# The function to use in place of the standard "cd"
+export SELECTOR_CD_HISTORY_SIZE
 
 [[ "${SELECTOR_CD_HISTORY_SIZE}" ]] || SELECTOR_CD_HISTORY_SIZE=1000
 
+# The function to use in place of the standard "cd"
+
 function selector-cd () {
+    local UMASK=$(umask)
+    umask 077
+
     if [[ -z "$1" ]]; then
         cd
     else
         cd "$@"
     fi
 
-    if [[ -f ${SELECTOR_CD_HISTORY} ]]; then
+    if [[ -f "${SELECTOR_CD_HISTORY}" ]]; then
         TMP=$(mktemp /tmp/selector-cd.XXXXXX)
-        tail -$((SELECTOR_CD_HISTORY_SIZE-1)) < ${SELECTOR_CD_HISTORY} > ${TMP}
-        cat ${TMP} > ${SELECTOR_CD_HISTORY}
-        rm -f ${TMP}
+        tail -$((SELECTOR_CD_HISTORY_SIZE-1)) < "${SELECTOR_CD_HISTORY}" >| "${TMP}" && \
+            cat "${TMP}" >| "${SELECTOR_CD_HISTORY}"
+        \rm -f "${TMP}"
     fi
 
-    echo $PWD | sed -e "s!^${HOME}!~!" >> ${SELECTOR_CD_HISTORY}
+    echo "${PWD}" | sed -e "s!^${HOME}!~!" >> "${SELECTOR_CD_HISTORY}"
+    umask ${UMASK}
 }
 
 function selector-cd-search () {
-    if [[ -f ${SELECTOR_CD_HISTORY} ]]; then
+    local UMASK=$(umask)
+    umask 077
+
+    if [[ -f "${SELECTOR_CD_HISTORY}" ]]; then
         PATH_TEMP=$(mktemp /tmp/selector-cd-path.XXXXXX)
-        selector -j -y -u -t "cd" -l ${SELECTOR_CD_HISTORY_SIZE} -d -i -c 7,2,0,3 -o ${PATH_TEMP} -q ${SELECTOR_CD_HISTORY}
-        NEW_PATH="$(cat ${PATH_TEMP} | sed -e 's!~!'${HOME}'!')"
+        selector -j -y -u -t "cd" -l "${SELECTOR_CD_HISTORY_SIZE}" -d -i -c 7,2,0,3 -o "${PATH_TEMP}" -q "${SELECTOR_CD_HISTORY}"
+        NEW_PATH="$(cat "${PATH_TEMP}" | sed -e 's!~!'${HOME}'!')"
         if [[ -d "${NEW_PATH}" ]]; then
-            selector-cd "$(cat ${PATH_TEMP} | sed -e 's!^~!'${HOME}'!')"
+            selector-cd "$(cat "${PATH_TEMP}" | sed -e 's!^~!'${HOME}'!')"
         fi
-        \rm ${PATH_TEMP}
+        \rm "${PATH_TEMP}"
     else
-        echo "No cd history file ${SELECTOR_CD_HISTORY}." >&2
+        echo "No cd history file '${SELECTOR_CD_HISTORY}'." >&2
     fi
+    umask ${UMASK}
 }
 
 alias cd=selector-cd
 
 ######################################################################
-# The key-bindings themselves
+# The key bindings themselves
 ######################################################################
 
-    # M-t appends the selected history line and the end of the current
-    # one bind '"\C-[t":"\C-a\C-kselector-history\C-m\C-a\C-y\C-e"'
+# M-t appends the selected history line and the end of the current
+# one bind '"\C-[t":"\C-a\C-kselector-history\C-m\C-a\C-y\C-e"'
 
 if [[ "$1" ]]; then
 
@@ -105,12 +116,12 @@ if [[ "$1" ]]; then
 
             --hist)
                 # M-r puts the selected history line in place of the current one
-                bind '"\C-[r":"\C-a\C-kselector-history\C-m"'
+                bind '"\C-[r":"\C-a\C-k selector-history\C-m"'
                 ;;
 
             --cd)
                 # M-c provides a dynamic list of directories to cd into
-                bind '"\C-[c":"\C-a\C-kselector-cd-search\C-m"'
+                bind '"\C-[c":"\C-a\C-k selector-cd-search\C-m"'
                 ;;
 
             *)
@@ -124,9 +135,9 @@ if [[ "$1" ]]; then
 
 else
 
-    echo "source bash-selector.sh <--hist|--cd> [...]"
+    echo "source bash-selector.sh [--hist] [--cd]"
     echo
-    echo "Defines bash functions, and installs key-bindings and aliases to use selector"
+    echo "Defines bash functions, and installs key bindings and aliases to use selector"
     echo "for history search with M-r and/or intelligent cd history with M-c."
 
 fi