ZSH 评估函数内的历史记录?

ZSH 评估函数内的历史记录?

我正在尝试让我的外壳额外的很奇特,我希望如果在过去的 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 时,它就会从我的提示中消失!

相关内容