Cygwin bash 提示在同一行换行

wti*_*ing 64 cygwin bash

我正在使用 Cygwin bash 提示符,对于长命令,尽管将我的 PS1 设置为简单的“$”,但文本将在同一行上换行而不是转到下一行。

这是一个截图,
截屏

jtp*_*yda 68

我已经在使用 MinTTY,在 PS1 中删除换行符也没有帮助。此页面上的一条建议确实有所帮助。我执行了这个 bash 命令:

kill -WINCH $$
Run Code Online (Sandbox Code Playgroud)

就我而言,即使在注销并重新登录后,运行它也可以解决问题。我不确定是否总是如此。

  • @ivan_pozdeev,我刚刚发现你只需要在 vim 打开时调整大小:vim 获取信号并以新的大小重绘,但它没有传递给它的父进程,因此 bash 仍然认为screen 是 vim 打开时的样子。 (10认同)
  • 根据`-WINCH` 判断,这向bash 进程发出终端窗口已调整大小的信号。所以这应该在每个终端窗口调整大小后完成,我猜。 (2认同)

dig*_*doo 26

对我来说,解决方案是将以下几行添加到 .bashrc:

PS1='\[\e[32m\]\u@\h:\W> \[\e[0m\]'
TERM=cygwin
export PS1
export TERM
Run Code Online (Sandbox Code Playgroud)

请注意,提示中的不可打印字符必须包含在 \[... 中\]

  • 正如@ak2 在原始问题下的评论中提到的, export TERM=cygwin 足以解决这个问题。 (8认同)
  • 对我来说这还不够。如果 PS1 包含未包含在 \\[...\\] 中的转义序列,则换行问题将持续存在。在您的情况下设置 TERM 环境变量可能就足够了,但我对此表示怀疑。 (2认同)

小智 8

我对 MinTTY 也有同样的问题。该问题可能与主要提示(PS1)有关。

我的解决方案是从 PS1 中删除最后一个“换行”字符(就在“$”符号之前):

user@host ~
$ echo $PS1
\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

user@host ~
$ export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$ '

user@host ~ $
Run Code Online (Sandbox Code Playgroud)

请参阅http://cygwin.com/ml/cygwin/2001-07/msg00140.html以供参考。

要使此更改持久化,请添加 export PS1='[\e]0;\w\a]\n[\e[32m]\u@\h [\e[33m]\w[\e[0m]\ $ ' 到您的 ~/.bashrc 文件。


blo*_*ong 8

正如dregadak2所评论的,export TERM=cygwin在我的~/.bashrc文件中设置足以为我解决这个问题。


Igu*_*aut 8

@jtpereyda 的回答肯定是正确的。但出于某种原因,我不能放过它,并挖得更深一些。

扩展此评论,如果您在 vim(或任何其他从外壳控制 tty 的全屏应用程序)中调整终端的大小,结果SIGWINCH通常不会发送到外壳,因此当它重新获得控制权时,它不会不知道终端已调整大小。

当您调整终端大小时,它应该ioctl(..., TIOCSWINSZ, ...)在运行 vim 的主 pty 上调用 an 。这反过来会导致一个killpg(SIGWINCH)on vim 的进程组。

问题是 vim 在它自己的进程组中运行,与它被执行的 shell 不同,所以 bash shell 没有收到SIGWINCH并且没有适当地调整它的行/列。

如果您想要永久的解决方法,请添加shopt -s checkwinsize到您的.bashrc. 这使得 bashioctl(..., TIOCGWINSZ, ..)在从每个命令返回后检查窗口大小 ( ),并更新其行/列。

  • 我想引用一个我认为使连接更加明显的不同问题,但简而言之,OP 问题的一个可能原因是打开一个完整的终端应用程序,如 vim,调整终端大小,然后退出。正如我所解释的,外壳看不到 SIGWINCH,所以当您退出 vim 时,它仍然认为终端是以前的大小,从而导致各种换行问题。 (2认同)

nik*_*nik 2

你的终端设置有问题(可能)。
我想您可能已经尝试过退出该会话并重新启动一个新会话。

虽然您没有找到适用于 Cygwin 终端的解决方案,但请尝试一下MinTTY(实际上它更好)。