mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
- this reduces the number of functions and allows lazy loading of
completion options, which makes it easy to quickly add any other
OpenFOAM application in completion.
The generic '_of_complete_' function handles (bash) completion for
any OpenFOAM application. On the first call for any particular
application, it retrieves the available options from the application
help output and adds this information to its environmental cache for
subsequent use.
- Tcsh completion uses the same function via a bash wrapper.
But since its wrapper is transient, the on-the-fly generation would
be less efficient. For this case, a pre-generated completion_cache
can be used, which is generated with
bin/tools/foamCreateCompletionCache
200 lines
5.6 KiB
Bash
Executable File
200 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
|
#------------------------------------------------------------------------------
|
|
# ========= |
|
|
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
# \\ / O peration |
|
|
# \\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
|
# \\/ M anipulation |
|
|
#------------------------------------------------------------------------------
|
|
# License
|
|
# This file is part of OpenFOAM.
|
|
#
|
|
# OpenFOAM is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# Script
|
|
# foamCreateCompletionCache
|
|
#
|
|
# Description
|
|
# Create cache of bash completion values for OpenFOAM applications
|
|
# The cached values are typically used by the tcsh completion wrapper.
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
defaultOutputFile="$WM_PROJECT_DIR/etc/config.sh/completion_cache"
|
|
|
|
usage() {
|
|
exec 1>&2
|
|
while [ "$#" -ge 1 ]; do echo "$1"; shift; done
|
|
cat<<USAGE
|
|
|
|
Usage: ${0##*/} [OPTION] [appName .. [appNameN]]
|
|
options:
|
|
-d dir | -dir dir Directory to process
|
|
-u | -user Add \$FOAM_USER_APPBIN to the search directories
|
|
-no-header Suppress header generation
|
|
-o FILE Write to alternative output
|
|
-h | -help Print the usage
|
|
|
|
Create cache of bash completion values for OpenFOAM applications.
|
|
The cached values are typically used by the tcsh completion wrapper.
|
|
Default search: \$FOAM_APPBIN only.
|
|
Default output: $defaultOutputFile
|
|
|
|
Uses the search directory if applications are specified.
|
|
|
|
USAGE
|
|
exit 1
|
|
}
|
|
|
|
# Report error and exit
|
|
die()
|
|
{
|
|
exec 1>&2
|
|
echo
|
|
echo "Error encountered:"
|
|
while [ "$#" -ge 1 ]; do echo " $1"; shift; done
|
|
echo
|
|
echo "See '${0##*/} -help' for usage"
|
|
echo
|
|
exit 1
|
|
}
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
searchDirs="$FOAM_APPBIN"
|
|
optHeader=true
|
|
unset outputFile
|
|
while [ "$#" -gt 0 ]
|
|
do
|
|
case "$1" in
|
|
-h | -help)
|
|
usage
|
|
;;
|
|
-d | -dir)
|
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
|
searchDirs="$2"
|
|
[ -d "$searchDirs" ] || die "directory not found '$searchDirs'"
|
|
shift
|
|
;;
|
|
-u | -user)
|
|
searchDirs="$searchDirs $FOAM_USER_APPBIN"
|
|
;;
|
|
-no-head*)
|
|
optHeader=false
|
|
;;
|
|
-o | -output)
|
|
[ "$#" -ge 2 ] || die "'$1' option requires an argument"
|
|
outputFile="$2"
|
|
shift
|
|
;;
|
|
-*)
|
|
usage "unknown option: '$1'"
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
: ${outputFile:=$defaultOutputFile}
|
|
|
|
# Verify that output is writeable
|
|
if [ -e "$outputFile" ]
|
|
then
|
|
[ -f "$outputFile" ] || \
|
|
die "Cannot overwrite $outputFile" "Not a file"
|
|
[ -w "$outputFile" ] || \
|
|
die "Cannot overwrite $outputFile" "No permission?"
|
|
else
|
|
[ -w "$(dirname $outputFile)" ] || \
|
|
die "Cannot write $outputFile" "directory is not writeble"
|
|
fi
|
|
|
|
exec 1>| $outputFile || exit $?
|
|
echo "Writing $outputFile" 1>&2
|
|
echo 1>&2
|
|
|
|
# Header not disabled
|
|
[ "$optHeader" = true ] && cat << HEADER
|
|
#----------------------------------*-sh-*--------------------------------------
|
|
# Cached options for bash completion of OpenFOAM applications.
|
|
# These are the values expected by the '_of_complete_' function
|
|
#
|
|
# Recreate with "${0##*/}"
|
|
|
|
# Global associative array (cached options for OpenFOAM applications)
|
|
declare -gA _of_complete_cache_;
|
|
|
|
# Clear existing cache.
|
|
_of_complete_cache_=()
|
|
|
|
#------------------------------------------------------------------------------
|
|
HEADER
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
# Scans the output of the application -help to detect options with/without
|
|
# arguments. Dispatch via _of_complete_
|
|
#
|
|
extractOptions()
|
|
{
|
|
local appName="$1"
|
|
local helpText=$($appName -help 2>/dev/null | sed -ne '/^ *-/p')
|
|
|
|
[ -n "$helpText" ] || {
|
|
echo "Error calling $appName" 1>&2
|
|
return 1
|
|
}
|
|
|
|
# Array of options with args
|
|
local argOpts=($(awk '/^ {0,4}-[a-z]/ && /</ {print $1}' <<< "$helpText"))
|
|
|
|
# Array of options without args
|
|
local boolOpts=($(awk '/^ {0,4}-[a-z]/ && !/</ {print $1}' <<< "$helpText"))
|
|
|
|
appName="${appName##*/}"
|
|
echo "$appName" 1>&2
|
|
echo "_of_complete_cache_[${appName}]=\"${argOpts[@]} | ${boolOpts[@]}\""
|
|
}
|
|
#------------------------------------------------------------------------------
|
|
|
|
[ "$#" -gt 0 ] || set -- ${searchDirs}
|
|
|
|
for item
|
|
do
|
|
if [ -d "$item" ]
|
|
then
|
|
# Process directory for applications - sort with ignore-case
|
|
echo "[directory] $item" 1>&2
|
|
choices="$(find $item -maxdepth 1 -executable -type f | sort -f 2>/dev/null)"
|
|
for appName in $choices
|
|
do
|
|
extractOptions $appName
|
|
done
|
|
elif command -v "$item" > /dev/null 2>&1
|
|
then
|
|
extractOptions $item
|
|
else
|
|
echo "No such file or directory: $item" 1>&2
|
|
fi
|
|
done
|
|
|
|
# Generate footer
|
|
[ "$optHeader" = true ] && cat << FOOTER
|
|
|
|
#------------------------------------------------------------------------------
|
|
FOOTER
|
|
|
|
#------------------------------------------------------------------------------
|