我正在尝试在我的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
答案 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✓>