<p>电力线和iTerm2 Shell集成不再协同工作</p>

创建于 2017-10-09  ·  7评论  ·  资料来源: powerline/powerline

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集成初始化程序移动到电力线以下)。

cshell serror in environment bug

所有7条评论

您必须在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 。 有人需要告诉问题跟踪器

  1. 必须用引号引起来以保留换行符,文字中的双精度空格等。
  2. 整个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)
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

guyzmo picture guyzmo  ·  5评论

sachevl picture sachevl  ·  3评论

yyandrew picture yyandrew  ·  5评论

paanvaannd picture paanvaannd  ·  7评论

adamk33n3r picture adamk33n3r  ·  4评论