终端提示未正确换行

终端提示未正确换行

我有一个问题,如果我在 bash 中输入很长的命令,终端将无法正确呈现我输入的内容。我希望如果我有如下命令:

username@someserver ~/somepath $ ssh -i /path/to/private/key
[email protected]

该命令应呈现为两行。相反,它通常会环绕并开始在我的提示符顶部写入,有点像这样:

[email protected] -i /path/to/private/key

如果我决定返回并更改某些参数,则无法确定光标将显示在哪里,有时在提示的中间,但通常在线路上多于我正在打字的地方。

当我Up执行上一个命令时,会发生额外的乐趣。我已经在 gnome-terminal 和 terminator 以及 i3 和 Cinnamon 上尝试过这个。有人建议这是我的提示,所以这里是:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrllreset、 以及clear都按照他们所说的去做,但是当我重新输入命令时,还是Up会发生同样的事情。

我查了一下,checkwinsize在 bash 中启用了。这种情况发生在 80x24 和其他窗口尺寸上。

这只是我学会忍受的事情吗?有什么我应该知道的魔法吗?我已经决定只使用非常短的提示,但这并不能解决问题。

答案1

不可打印的序列应该是包含在\[和 中\]。看着你的PS1它之后有一个未封闭的序列\W。但是,第二个条目是多余的,并且它重复了前一个语句“1;34”

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

因此,这应该具有预期的颜色:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.

保持“原来的”这也应该有效:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

编辑:

出现这种行为的原因是因为bash认为提示比实际要长。举一个简单的例子,如果使用:

PS1="\033[0;34m$"
       1 2345678

提示符被认为是 8 个字符而不是 1 个字符。因此,如果终端窗口有 20 列,则在输入 12 个字符后,它被认为是 20 并换行。如果尝试执行退格键或 则这一点也很明显Ctrl+u。它停在第 9 列。

但是,除非在最后一列上,否则它也不会开始新行,因此第一行被覆盖。

如果继续输入,该行应在 32 个字符后换行到下一行。

答案2

这主要与终端假定的窗口大小与您的实际窗口大小不同有关。如果你使用的是bash,你可以尝试这个。

$ shopt checkwinsize

如果你没有得到

checkwinsize    on

然后激活它

$ shopt -s checkwinsize

然后尝试运行另一个命令(例如ls)或调整窗口大小一次,以上每次都对我有用。

特别是对于 Redhat 系统,该问题通常是由于错误配置~/.bashrc而不调用/etc/bashrc.通常,bash 会加载~/.bashrc预期调用的/etc/bashrc,默认情况下包含shopt -s checkwinsize.

答案3

我曾经在某个地方读过(不知道在哪里了)使用\001and\002代替\[and\]可以解决这个问题。它对我有用。

顺便说一句,定义 PS1 并不一定要看起来难看。

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset

答案4

COLUMNS这听起来像是您的&LINES环境变量设置的问题。当您调整窗口大小时,它们通常由 gnome-terminal 自动设置(我相信),您可以通过发出命令来强制手动设置它们resize

例子

如果我将 gnome-terminal 大小调整为 79x17,我的变量将显示如下:

$ echo $COLUMNS; echo $LINES
79
17

我可以像这样强制它:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;

相关内容