使用current命令生成fish shell提示符

时间:2014-01-02 20:47:53

标签: git shell prompt fish

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

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更新为正确的字符串。

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

[UPDATE]

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

~> 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⚡

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

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

2 个答案:

答案 0 :(得分:2)

我发现这是一个已知问题,尚未确定。

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

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

答案 1 :(得分:0)

您可以使用echo $history[1]

从历史记录中获取上一个命令

您可能需要查看/ usr / share / fish / functions

中的__terlar_git_prompt功能

您可以折叠切换案例:

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

我怀疑你遇到了时间问题。在不查看它的情况下,可能会在$ history数组更新之前处理提示。但是,请考虑使用鱼附带的功能:

$ function fish_prompt; printf "%s%s> " (prompt_pwd) (__terlar_git_prompt); end
~> cd src/glennj/skel
~/s/g/skel|master✓>