46

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

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

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

前

文本到达窗口边缘后:

后

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

文字设置:

文本

窗口设置:

窗户

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

4

6 回答 6

72

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

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

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

例如:

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

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

于 2012-08-06T17:18:27.027 回答
8

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

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

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

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

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

于 2013-04-11T10:53:48.627 回答
8

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

希望这可以帮助。

于 2013-09-13T16:38:42.693 回答
2

在hamstergene的指导下,我能够弄清楚如何让它发挥得更好。使用这个 Geek Stuff 指南这个 It's Me Tommy 教程,我能够定义我希望我的 PS1 文本如何显示。将其更改为更简化的内容消除了我遇到的奇怪的重叠文本问题。

前:

前

后:

后

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

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

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

于 2012-08-06T17:15:52.123 回答
0

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

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

于 2017-08-11T19:44:00.557 回答
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)\$ "

希望这可以帮助!

于 2019-08-08T19:11:20.900 回答