【问题标题】:OS X Terminal text stacking on top of itselfOS X 终端文本堆叠在自身之上
【发布时间】:2012-08-03 14:26:57
【问题描述】:

我在 Mac OS X Lion 的终端应用程序中遇到了一个奇怪的问题。当我输入一长行文本时,当它到达终端窗口的边缘时应该换行到下一行,它会继续在其上一行的文本顶部键入。

以下是一些有助于说明问题的屏幕截图:

在我的文字到达窗口边缘之前:

文字到达窗口边缘后:

我还提供了我的文本和窗口设置的屏幕截图,以备不时之需。

文字设置:

窗口设置:

提前感谢您提供的任何帮助。我有这个问题有一段时间了,只是从来没有解决过。现在,当我遇到需要大 grep 命令和长路径名的事情时,它真的变得很痛苦。

【问题讨论】:

  • 你有没有为PS1 环境变量尝试过不那么花哨的值?试试export PS1='> ' ; reset
  • @hamstergene 当我运行该命令并开始输入时,它工作正常。不过,打开一个新窗口会使它回到同一个问题。我不熟悉这个命令,但它似乎可以解决问题。您能否进一步解释如何使其成为永久性更改?谢谢!
  • @hamstergene 在做了一些研究之后,我弄清楚了这是指什么。我从没想过定制它和this seems to be a solid resource

标签: macos terminal osx-lion


【解决方案1】:

PS1 环境变量决定了 shell 的提示符是什么样的。 man bash 提供了完整的文档。 (实际上有几个,用于不同的模式)。

有许多文件可以设置它,通常是~/.profile~/.bashrc/etc/profile/etc/bashrc 之一。

如果您要在其中包含颜色代码或其他控制序列,您必须用 \[\] 正确包装它们(而不是包装普通文本),否则行编辑可能会像您的案子。我建议将PS1 重置为默认值,然后仔细逐项添加着色。

例如:

PS1='\[\033[1m\033[32m\]\u@\h \w\[\033[0m\]\$ '
       ^^^^^^^^^^^^^^^            ^^^^^^^

着色命令带有下划线。注意它们是如何被\[ \]包围的。

【讨论】:

  • 我实际上在此答案之上添加了一个基于您的评论的答案,但之所以选择此作为答案,是因为您对其进行了更深入的解释,并且您向我提供了初始信息以找到解决方案。我不确定是什么定义了我的原始 PS1 设置,但我编辑了我的 .bash_profile 并添加了适当的文本。这覆盖了之前的设置并成功了。
  • 谢谢你。出于某种原因,我访问的每个其他网站都有不正确的颜色代码(可能只是 OSX)。这是唯一在 OSX 中 100% 正常工作的。
  • 为我工作出色。与@Daryn 相同,任何其他方式都会有问题。谢谢!!!
  • 如果您也使用\e,则此方法有效,例如:\[\e[32m\]\u \[\e[36m\]\T \[\e[32m\]\w \[\e[0m\]\\$ 。并非每个\e 的左侧都有一个\[,每个m 的右侧都有一个\]
  • 值得注意的是\e 不如\033 通用,并且不适用于某些shell。如果你只使用 bash 很好,但如果你与其他人共享你的脚本,它们可能无法正常工作。
【解决方案2】:

我有同样的问题,如果你改变我发现

高级 > 仿真 > 将终端声明为:ANSI。

这解决了彩色 PS1 问题。使用 Mac 终端

BUT 会产生一种奇怪的行为: 我通过@koiyu 的回答找到了我的问题的解决方案。

https://apple.stackexchange.com/questions/37001/strange-behavior-in-terminal-with-custom-bash-profile/37036#37036

【讨论】:

  • 提供的链接为我解决了这个问题,\e[... 格式使用的颜色需要正确的转义序列 \[\e[...\] 以避免破坏您的控制台行为。
【解决方案3】:

由于错误使用颜色代码,我曾经遇到过同样的问题。这是我的PS1,它解决了这个问题。此外,如果您使用 GIT,那么这也有助于显示您正在处理的 git 分支以及您的工作树是否脏。把它放在你的 .profile 或 .bash_profile 中

# Git branch in prompt.
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

parse_git_dirty() {
    st=$(git status 2>/dev/null | tail -n 1)
    if [[ $st == "" ]]; then
        echo ''
    elif [[ $st == "nothing to commit (working directory clean)" ]]; then
        echo ''
    elif [[ $st == 'nothing added to commit but untracked files present (use "git add" to track)' ]]; then
        echo '?'
    else
        echo '*'
    fi
}

# coloring the terminal comman line
SB_GREEN="\[\033[1;32m\]"
SB_BLUE="\[\033[1;34m\]"
SB_RED="\[\033[1;31m\]"
SB_NOCOLOR="\[\033[0m\]"
export PS1="$SB_GREEN\u@\h$SB_NOCOLOR: $SB_BLUE\w$SB_GREEN\$(parse_git_branch)$SB_RED\$(parse_git_dirty)$SB_NOCOLOR $ "

希望这会有所帮助。

【讨论】:

  • 谢谢你,你是最棒的!
【解决方案4】:

hamstergene 的指导下,我想出了如何让它玩得更好。使用this Geek Stuff guidethis It's Me Tommy tutorial,我能够定义我希望我的PS1 文本如何显示。将其更改为更简化的内容消除了我遇到的奇怪的重叠文本问题。

之前:

之后:

我只是编辑了我的.bash_profile 并添加了以下行:

export PS1="[\u@\h] > ";

然后我去更改了窗口颜色,因为我可以。

【讨论】:

    【解决方案5】:

    最初的问题是 PS1 中有一条新线(仅供参考)

    通常它的颜色代码转义不正确,但如果不是这样,你的 ps1 中有一个新行

    【讨论】:

      【解决方案6】:

      正如其他人所说,您必须将颜色命令正确包装在转义方括号中。但是,对我来说,这让字符串看起来非常非常混乱!

      因此,我使用了一个技巧来始终正确并使其更具可读性。

      我首先创建了一个名为 setColor 的 shell 函数,就像这样......

      setColor(){
          echo "\[\033[${1}m\]"
      }
      

      那我就这样用了……

      PS1="$(setColor 92)\u$(setColor 37):$(setColor 96)\w $(setColor)\$ "
      

      这和写这个是一样的……

      \[\033[92m\]\u\[\033[37m\]:\[\033[96m\]\w \[\033[m\]$
      

      ...但正如你所看到的,前者更清晰,也保证了一切都被正确地转义了。

      注意,您也可以使用; 字符指定多种颜色。唯一的事情是你必须明确地转义它,所以92;41变成92\;41,就像这样......

      PS1="$(setColor 92\;41)\u$(setColor 37):$(setColor 96)\w $(setColor)\$ "
      

      再一次,比这更容易阅读......

      \[\033[92;41m\]\u\[\033[37m\]:\[\033[96m\]\w \[\033[m\]$
      

      您可以更进一步,为颜色定义常量,甚至使用您最常用的颜色名称定义“包装器”函数,这样您就可以编写...

      PS1="$(setRed)\u$(setBlue):$(setGreen)\w $(resetColor)\$ "
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 2016-11-09
        • 2011-03-27
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        相关资源
        最近更新 更多