iTerm2 :内部版本3.1.4.beta.1
电力线:2.6
bash_login的内容:
# iterm shell integration
test -e ${HOME}/.iterm2_shell_integration.bash && source ${HOME}/.iterm2_shell_integration.bash
# powerline prompt
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/local/lib/python2.7/site-packages/powerline/bindings/bash/powerline.sh
$ PROMPT_COMMAND的内容:
__bp_precmd_invoke_cmd; _powerline_set_prompt; __bp_interactive_mode
Shell的第一个提示起作用(存在iterm的小V形符号,第一个命令记录在Toolbelt > Command History
所有后续提示都不会调用iterm shell集成函数。
无论谁在PS1上遇到第一个破解,行为都是相同的(即,如果我将iterm shell集成初始化程序移动到电力线以下)。
您必须在bashrc中包含其他内容,iTerm Shell集成或电力线均未定义__bp_precmd_invoke_cmd。 首先处理这个问题,我发现iTerm集成没有任何问题,只是它有一个错误。
当我有
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
source ~/.vam/powerline/powerline/bindings/bash/powerline.sh
source ~/tmp/iterm2_shell_integration
PROMPT_COMMAND是预期的_powerline_status_wrapper _powerline_set_prompt; iterm2_preexec_invoke_cmd
(尽管如果没有iTerm2,我无法确认它是否按预期工作)。 (状态包装器是最近添加的,尚未发布。)
我必须说,尽管iTerm2 Shell集成包含一个严重的错误,该错误会阻止电源线提示在某些情况下正常工作(包括在tmux中运行的电源线本身,除非禁用了tmux集成,尽管iterm集成不支持tmux,所以它不支持tmux)击中他们)使用附加到PROMPT_COMMAND的相同方法:
PROMPT_COMMAND="$(echo -n $PROMPT_COMMAND | sed -e 's/; *$//'); iterm2_preexec_invoke_cmd";
:请注意,未引用$PROMPT_COMMAND
。 有人需要告诉问题跟踪器
整个sed
东西和整个if
是完全没用的,只是他们不应该使用分号而是写
PROMPT_COMMAND="$PROMPT_COMMAND"$'\niterm2_preexec_invoke_cmd'
:如果使用换行符作为命令分隔符,则不会出现它们所指的错误,因为一个人可以使用任意数量的换行符作为分隔符,并且在行尾或前导换行符时不会出现任何问题(因此不必费心检查$ PROMPT_COMMAND首先是空的:此行将替换iterm2_preexec_install中的所有六个if
行)。
无论如何,我都不认为这是电力线或iterm集成问题,请处理添加__bp_…的东西。
iTerm2绝对使用bash-preexec-这是bash-preexec的起源。 我认为您正在从提取bash-preexec
之前查看iterm2 shell集成的旧版本。
(而且,仅供参考,奇怪的sed
已经消失了–但是由于电力线用来设置PROMPT_COMMAND的方式,它不在那儿了吗?)
无论如何, bash-preexec
的最新版本(v0.3.4)解决了该问题。 新版本使用DEBUG陷阱将添加到PROMPT_COMMAND的所有新内容添加到bp preexec命令集中,这具有电力线的副作用,不再显示在PROMPT_COMMAND var中:
echo $PROMPT_COMMAND
__bp_precmd_invoke_cmd; __bp_interactive_mode
对于在iterm2合并新的bash-preexec之前一直关注此问题的其他人:只需将v0.3.4复制粘贴到您的iterm2_shell_integration.bash
@lastobelus我使用https://www.iterm2.com/documentation-shell-integration.html (即https://iterm2.com/misc/bash_startup.in)中建议的链接下载了iTerm2 shell集成,但都不包含source
或点命令,也没有定义__bp*
函数,尽管它确实创建了precmd / preexec钩子,并且确实包含sed
。
我遇到了同样的问题,我的$PROMPT_COMMAND
是:
echo $PROMPT_COMMAND
__bp_precmd_invoke_cmd; __bp_interactive_mode
对我来说,解决方法是在precmd_functions
采购powerline.sh
之后,将_powerline_set_prompt
附加到precmd_functions
bashrc
:
...
# Regular powerline configuration
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
source <powerline_folder>/powerline.sh
# Next line is the workaround
precmd_functions+=(_powerline_set_prompt)
...
希望这对某人有帮助。
对于在2 1/2年后遇到同一问题的其他人来说,以下解决方法对我有效,最近安装了带有iTerm 2的Mac OS Mojave 2上发布了该版本:
function _powerline_set_prompt() {
PS1="$(powerline-shell "$?")"
}
precmd_functions+=(_powerline_set_prompt)