# test whether we've been here before or not.
skip_all=
-function_sentinel &>/dev/null
+type function_sentinel &>/dev/null
if [ $? -eq 0 ]; then
# there was no error, so we can skip the inits.
if [ ! -z "$SHELL_DEBUG" ]; then
echo "skipping function definitions, because already defined."
fi
skip_all=yes
+else
+ skip_all=
fi
if [ -z "$skip_all" ]; then
echo "$varname=${!varname}"
fi
fi
- done
+ done | sort
IFS="$HOLDIFS"
}
local pid_finder_pattern='s/ *\([0-9][0-9]*\) *.*$/\1/p'
else
- # flags which clean up the output on unixes, which apparently cygwin
- # doesn't count as. their crappy specialized ps doesn't support this.
+ # flags which clean up the process listing output on unixes.
+ # apparently cygwin doesn't count as a type of unix, because their
+ # crummy specialized ps command doesn't support normal ps flags.
local EXTRA_UNIX_FLAGS="-o pid,args"
# pattern to use for peeling off the process numbers.
local pid_finder_pattern='s/^[[:space:]]*\([0-9][0-9]*\).*$/\1/p'
done
}
- function fix_alsa() {
- sudo /etc/init.d/alsasound restart
+# function fix_alsa() {
+# sudo /etc/init.d/alsasound restart
+# }
+
+ function screen() {
+ save_terminal_title
+#hmmm: ugly absolute path here.
+ /usr/bin/screen $*
+ restore_terminal_title
}
# switches from a /X/path form to an X:/ form. this also processes cygwin paths.
# information for su.
# get the x authority info for our current user.
- source $FEISTY_MEOW_SCRIPTS/x_win/get_x_auth.sh
+ source "$FEISTY_MEOW_SCRIPTS/x_win/get_x_auth.sh"
if [ -z "$X_auth_info" ]; then
# if there's no authentication info to pass along, we just do a normal su.
# or at least suse doesn't, which is the other one we've tested on.
/bin/su -l $*
fi
-
- # relabel the console after returning.
- bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh
}
# sudo function wraps the normal sudo by ensuring we replace the terminal
# label if they're doing an su with the sudo.
function sudo() {
- local first_command="$1"
+# local first_command="$1"
+ save_terminal_title
/usr/bin/sudo "$@"
- if [ "$first_command" == "su" ]; then
- # yep, they were doing an su, but they're back now.
- bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh
- fi
+ restore_terminal_title
+# if [ "$first_command" == "su" ]; then
+# # yep, they were doing an su, but they're back now.
+# label_terminal_with_info
+# fi
}
# trashes the .#blah files that cvs and svn leave behind when finding conflicts.
# recreates all the generated files that the feisty meow scripts use.
function regenerate() {
# do the bootstrapping process again.
+ save_terminal_title
echo "regenerating feisty meow script environment."
bash $FEISTY_MEOW_SCRIPTS/core/reconfigure_feisty_meow.sh
echo
- # force a full reload by turning off sentinel variable and alias.
- # the nethack one is used by fred's customizations.
- # interesting note perhaps: found that the NETHACKOPTIONS variable was
- # not being unset correctly when preceded by an alias. split them up
- # like they are now due to that bug.
- unset -v CORE_ALIASES_LOADED FEISTY_MEOW_LOADING_DOCK NECHUNG NETHACKOPTIONS
+ # force a full reload by turning off sentinel variables and methods.
+ unset -v CORE_VARIABLES_LOADED FEISTY_MEOW_LOADING_DOCK USER_CUSTOMIZATIONS_LOADED
+ unalias CORE_ALIASES_LOADED &>/dev/null
unset -f function_sentinel
# reload feisty meow environment in current shell.
- source $FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh
+ source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
# run nechung oracle to give user a new fortune.
nechung
+ restore_terminal_title
+ }
+
+ # copies a set of custom scripts into the proper location for feisty meow
+ # to merge their functions and aliases with the standard set.
+ function recustomize()
+ {
+ local custom_user="$1"; shift
+ if [ -z "$custom_user" ]; then
+ # use our default example user if there was no name provided.
+ custom_user=fred
+ fi
+
+ save_terminal_title
+
+ if [ ! -d "$FEISTY_MEOW_SCRIPTS/customize/$custom_user" ]; then
+ echo "The customization folder provided for $custom_user should be:"
+ echo " '$FEISTY_MEOW_SCRIPTS/customize/$custom_user'"
+ echo "but that folder does not exist. Skipping customization."
+ return 1
+ fi
+ regenerate >/dev/null
+ pushd "$FEISTY_MEOW_LOADING_DOCK/custom" &>/dev/null
+ incongruous_files="$(bash "$FEISTY_MEOW_SCRIPTS/files/list_non_dupes.sh" "$FEISTY_MEOW_SCRIPTS/customize/$custom_user" "$FEISTY_MEOW_LOADING_DOCK/custom")"
+
+ #echo "the incongruous files list is: $incongruous_files"
+ # disallow a single character result, since we get "*" as result when nothing exists yet.
+ if [ ${#incongruous_files} -ge 2 ]; then
+ echo "cleaning unknown older overrides..."
+ perl "$FEISTY_MEOW_SCRIPTS/files/safedel.pl" $incongruous_files
+ echo
+ fi
+ popd &>/dev/null
+ echo "copying custom overrides for $custom_user"
+ mkdir -p "$FEISTY_MEOW_LOADING_DOCK/custom" 2>/dev/null
+ perl "$FEISTY_MEOW_SCRIPTS/text/cpdiff.pl" "$FEISTY_MEOW_SCRIPTS/customize/$custom_user" "$FEISTY_MEOW_LOADING_DOCK/custom"
+ if [ -d "$FEISTY_MEOW_SCRIPTS/customize/$custom_user/scripts" ]; then
+ echo "copying custom scripts for $custom_user"
+ \cp -R "$FEISTY_MEOW_SCRIPTS/customize/$custom_user/scripts" "$FEISTY_MEOW_LOADING_DOCK/custom/"
+ fi
+ echo
+ regenerate
+
+ restore_terminal_title
}
# generates a random password where the first parameter is the number of characters
done
}
+ ############################
+
# takes a file to modify, and then it will replace any occurrences of the
# pattern provided as the second parameter with the text in the third
# parameter.
sed -i -e "s%$pattern%$replacement%g" "$file"
}
+ # similar to replace_pattern_in_file, but also will add the new value
+ # when the old one did not already exist in the file.
+ function replace_if_exists_or_add()
+ {
+ local file="$1"; shift
+ local phrase="$1"; shift
+ local replacement="$1"; shift
+ if [ -z "$file" -o ! -f "$file" -o -z "$phrase" -o -z "$replacement" ]; then
+ echo "replace_if_exists_or_add: needs a filename, a phrase to replace, and the"
+ echo "text to replace that phrase with."
+ return 1
+ fi
+ grep "$phrase" "$file" >/dev/null
+ # replace if the phrase is there, otherwise add it.
+ if [ $? -eq 0 ]; then
+ replace_pattern_in_file "$file" "$phrase" "$replacement"
+ else
+ # this had better be the complete line.
+ echo "$replacement" >>"$file"
+ fi
+ }
+
+ ############################
+
+ # finds a variable (first parameter) in a particular property file
+ # (second parameter). the expected format for the file is:
+ # varX=valueX
+ function seek_variable()
+ {
+ local find_var="$1"; shift
+ local file="$1"; shift
+ if [ -z "$find_var" -o -z "$file" -o ! -f "$file" ]; then
+ echo -e "seek_variable: needs two parameters, firstly a variable name, and\nsecondly a file where the variable's value will be sought." 1>&2
+ return 1
+ fi
+
+ while read line; do
+ if [ ${#line} -eq 0 ]; then continue; fi
+ # split the line into the variable name and value.
+ IFS='=' read -a assignment <<< "$line"
+ local var="${assignment[0]}"
+ local value="${assignment[1]}"
+ if [ "${value:0:1}" == '"' ]; then
+ # assume the entry was in quotes and remove them.
+ value="${value:1:$((${#value} - 2))}"
+ fi
+ if [ "$find_var" == "$var" ]; then
+ echo "$value"
+ fi
+ done < "$file"
+ }
+
+ # finds a variable (first parameter) in a particular XML format file
+ # (second parameter). the expected format for the file is:
+ # ... name="varX" value="valueX" ...
+ function seek_variable_in_xml()
+ {
+ local find_var="$1"; shift
+ local file="$1"; shift
+ if [ -z "$find_var" -o -z "$file" -o ! -f "$file" ]; then
+ echo "seek_variable_in_xml: needs two parameters, firstly a variable name, and"
+ echo "secondly an XML file where the variable's value will be sought."
+ return 1
+ fi
+
+ while read line; do
+ if [ ${#line} -eq 0 ]; then continue; fi
+ # process the line to make it more conventional looking.
+ line="$(echo "$line" | sed -e 's/.*name="\([^"]*\)" value="\([^"]*\)"/\1=\2/')"
+ # split the line into the variable name and value.
+ IFS='=' read -a assignment <<< "$line"
+ local var="${assignment[0]}"
+ local value="${assignment[1]}"
+ if [ "${value:0:1}" == '"' ]; then
+ # assume the entry was in quotes and remove them.
+ value="${value:1:$((${#value} - 2))}"
+ fi
+ if [ "$find_var" == "$var" ]; then
+ echo "$value"
+ fi
+ done < "$file"
+ }
+
+ ############################
+
# goes to a particular directory passed as parameter 1, and then removes all
# the parameters after that from that directory.
function push_whack_pop()
{
local dir="$1"; shift
pushd "$dir" &>/dev/null
+ if [ $? -ne 0 ]; then echo failed to enter dir--quitting.; fi
rm -rf $* &>/dev/null
+ if [ $? -ne 0 ]; then echo received a failure code when removing.; fi
popd &>/dev/null
}
##############
+#hmmm: this points to an extended functions file being needed; not all of these are core.
+
+ # displays documentation in "md" formatted files.
+ function show_md()
+ {
+ local file="$1"; shift
+ pandoc "$file" | lynx -stdin
+ }
+
+ ##############
+
# just shows a separator line for an 80 column console, or uses the first
# parameter as the number of columns to expect.
function separator()
##############
- function function_sentinel() { return 0; }
+ function function_sentinel()
+ {
+ return 0;
+ }
if [ ! -z "$SHELL_DEBUG" ]; then echo "feisty meow function definitions done."; fi