Мне интересно, возможно ли это в Bash, но я хотел бы использовать автодополнение табуляции, чтобы полностью заменить текущий расширяемый аргумент. Я приведу пример: Я хотел бы иметь функцию, которая перемещается вверх на произвольное количество уровней в дереве, поэтому я могу вызвать до 2 И это бы cd мне 2 каталога вверх. Тем не менее, я хотел бы сделать так, чтобы, если я нажму вкладку под номером 2, он расширит это число до пути (либо относительного, либо абсолютного, либо в порядке). У меня это почти работает с использованием полной встроенной функции, за исключением того, что она будет добавлять только текст, так что это будет что-то вроде вверх 2/Volumes/Dev/
Можно ли заменить готовый символ?
Заранее спасибо :)
Так что большое спасибо chepner, потому что проверка моего кода выявила мою ошибку. Я сравнивал с неправильным var, и код отладки, который у меня был, приводил к тому, что значение не заменялось.
Для всех, кому интересно, вот код (и может быть гораздо лучший способ сделать это):
# Move up N levels of the directory tree
# Or by typing in some dir in the PWD
# eg. Assuming your PWD is "/Volumes/Users/natecavanaugh/Documents/stuff"
# `up 2` moves up 2 directories to "/Volumes/Users/natecavanaugh"
# `up 2/` and pressing tab will autocomplete the dirs in "/Volumes/Users/natecavanaugh"
# `up Users` navigate to "/Volumes/Users"
# `up us` and pressing tab will autocomplete to "/Volumes/Users"
function up {
dir="../"
if [ -n "$1" ]; then
if [[ $1 =~ ^[0-9]+$ ]]; then
strpath=$( printf "%${1}s" );
dir=" ${strpath// /$dir}"
else
dir=${PWD%/$1/*}/$1
fi
fi
cd $dir
}
function _get_up {
local cur
local dir
local results
COMPREPLY=()
#Variable to hold the current word
cur="${COMP_WORDS[COMP_CWORD]}"
local lower_cur=`echo ${cur##*/} | tr [:upper:] [:lower:]`
# Is the arg a number or number followed by a slash
if [[ $cur =~ ^[0-9]+/? ]]; then
dir="../"
strpath=$( printf "%${cur%%/*}s" );
dir=" ${strpath// /$dir}"
# Is the arg just a number?
if [[ $cur =~ ^[0-9]+$ ]]; then
COMPREPLY=($(compgen -W "${dir}"))
else
if [[ $cur =~ /.*$ ]]; then
cur="${cur##*/}"
fi
results=$(for t in `cd $dir && ls -d */`; do if [[ `echo $t | tr [:upper:] [:lower:]` == "$lower_cur"* ]]; then echo "${t}"; fi done)
COMPREPLY=($(compgen -P "$dir" -W "${results}"))
fi
else
# Is the arg a word that we can look for in the PWD
results=$(for t in `echo $PWD | tr "/" "\n"`; do if [[ `echo $t | tr [:upper:] [:lower:]` == "$lower_cur"* ]]; then echo "${t}"; fi; done)
COMPREPLY=($(compgen -W "${results}"))
fi
}
#Assign the auto-completion function _get for our command get.
complete -F _get_up up