我正在尝试让我的外壳额外的很奇特,我希望如果在过去的 X 个命令中没有使用过命令,提示符的某些部分就会消失。例如,我希望只有在过去的 100 个命令中使用过 rvm 时,RVM 才会出现在我的提示符中。我写了这个函数:
function check_history() {
setopt XTRACE
local depth=$2
local check_string=$1
for i in $(seq 1 $depth); do
local hist_string=!-${i}:0
if [[ $hist_string == *${check_string}* ]]; then
return 0
fi
done
return 1
}
但是,根据目前的测试,它!-${i}
会在函数定义时进行评估,而不是每次执行时。我尝试将其放在单引号中,或者使用eval
,但并没有取得太大进展。
那么.. 是否有可能在函数执行时评估这些?我尝试查看fc
手册页中隐晦地引用的,但我不明白如何使用fc
。
答案1
谢谢韋- 这让我走上了正确的道路。
这就是我最终得到的结果:
local rvm_ruby='$(rvm_prompt_timed)'
function check_history() {
local depth=$2
local check_string=$1
if [[ "${depth}" == "" ]]; then
depth=-10
fi
fc -l -m "*${check_string}*" $depth 2&>1 > /dev/null
}
function rvm_prompt_timed() {
check_history rvm -20
if [[ $? -eq 0 ]]; then
echo "%{$fg[red]%}‹$(rvm-prompt i v g)›%{$reset_color%}"
fi
}
PROMPT="╭─${user_host} ${current_dir} ${rvm_ruby}${git_branch}${tf_prompt}${kube} ${return_code}
╰─%B$%b "
现在,当我在 20 个命令中没有使用 rvm 时,它就会从我的提示中消失!