OS X终端文本堆叠在自身之上

时间:2012-08-06 15:29:12

标签: macos terminal osx-lion

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

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

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

before

文字到达窗口边缘后

after

我还提供了文字和窗口设置的屏幕截图,以防有些帮助。

文字设置:

text

窗口设置:

window

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

5 个答案:

答案 0 :(得分:61)

PS1环境变量确定shell的提示符。 man bash提供完整的文档。 (实际上有几个,针对不同的模式)。

可以设置多个文件,通常是~/.profile~/.bashrc/etc/profile/etc/bashrc中的一个。

如果您要在其中包含颜色代码或其他控制序列,则必须正确地用\[\]包裹它们(并且不包装普通文本),否则行编辑可能会变得混乱像你的情况一样。我建议将PS1重置为默认值,然后小心地逐项添加着色。

例如:

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

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

答案 1 :(得分:7)

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

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

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

但是会产生一种奇怪的行为: 我找到了解决@koiyu回答问题的方法。

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

答案 2 :(得分:5)

由于错误使用颜色代码,我曾经遇到同样的问题。这是我的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 $ "

希望这有帮助。

答案 3 :(得分:1)

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

<强>之前:

before

<强>后:

after

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

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

然后我去改变窗口的颜色,因为我可以。

答案 4 :(得分:0)

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

因此,这是我经常使用的一种技巧,可以使它正确并使其更具可读性。

我首先像这样创建一个名为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)\$ "

希望这会有所帮助!