1

我正在尝试在我的 fish shell 提示符中生成 git status 。我遇到的问题是获取 git status 有点慢。所以,我想将当前的 git 状态保存在一个全局变量中,并且只在用户运行某些命令(例如“cd”和“git”)时更新它。我试图获取用户使用“历史”命令执行的最后一个命令,但结果好坏参半。这是我的代码:

function update_git_status --description 'Calculate new git current branch based on location and set __git_status'
  set -g __git_status (python ~/.oh-my-fish/themes/oneself/gitstatus.py)
end

function fish_right_prompt
  set -l git_color  (set_color red)
  set -l normal (set_color normal)

  # Update git current branch when certain commands are run
  switch $history[1]
    case 'git *' 'cd *' 'cd'
      update_git_status
 end

  # Git status
  echo "$git_color$__git_status$normal"

end

这段代码的主要问题是,由于某种原因,历史并不总是立即返回最后一个命令。如果我运行“cd”或“git”以外的命令,然后 cd 进入 git 目录,则需要执行另一个命令才能将 git_status 更新为正确的字符串。

是否有其他方法可以在需要生成提示之前执行命令?

[更新]

这是尝试显示问题的终端输出:

~> history --clear
Are you sure you want to clear history ? (y/n)
read> y
History cleared!                                                                                         
~>  echo $history[1]

~> ls
documents  etc   bin  downloads  Desktop media     notes
~>  echo $history[1]
ls
~> cd ~/.oh-my-fish/
~/oh-my-fish>  echo $history[1]
cd ~/.oh-my-fish/
~/oh-my-fish>                                                                    master⚡

当我 cd 进入 git 目录(在本例中为 .oh-my-fish)时,分支名称应立即出现。但是,只有在我执行另一个命令之后它才最终出现。我认为“echo $history[1]”在命令行上返回正确的值,但不是从提示方法中运行时。

顺便说一句,这是我的 github 存储库的链接,其中包含所有这些代码:https ://github.com/oneself/oh-my-fish

4

2 回答 2

2

我发现这是一个已知问题,尚未修复。

https://github.com/fish-shell/fish-shell/issues/984

实际问题是向历史添加项目是在一个线程中完成的,该线程在fish_prompt之后执行

于 2014-01-06T06:59:11.713 回答
0

您可以使用从历史记录中获取上一个命令echo $history[1]

您可能需要检查__terlar_git_prompt/usr/share/fish/functions 中的函数

您可以折叠您的开关盒:

  switch $__last_command
    case 'git *' 'cd *' 'cd'
      update_git_status
  end

我怀疑你遇到了时间问题。如果不对其进行调查,可能会在更新 $history 数组之前处理提示。但是,请考虑使用 fish 附带的函数:

$ function fish_prompt; printf "%s%s> " (prompt_pwd) (__terlar_git_prompt); end
~> cd src/glennj/skel
~/s/g/skel|master✓> 
于 2014-01-03T00:12:29.587 回答