osx 中 tmux 的奇怪行为/渲染

osx 中 tmux 的奇怪行为/渲染

我已经遇到这个问题有一段时间了,这真的很烦人,但我不知道问题出在哪里。当我在终端上启动 tmux 会话时,无论是在 Terminal.app 还是 iTerm2 上,提示符和我输入的文本之间总是会出现一个奇怪的空格,大约是我在 tmux 之外得到的空格的 3 倍。这本身不是什么大问题,但是当我尝试按退格键删除某些内容或使用 vi 模式 (zsh) 修改某些内容时,光标显示为文本在正确的位置(它在 tmux 之外的显示方式),但文本在错误的位置,因此不可能知道我实际修改了什么。此外,当我按下回车键时,我可以看到文本闪烁到正确的位置,但这在那时并没有什么用。

我尝试在启动 tmux 时使用不同的选项报告 $TERM 类型,但似乎都没有使情况变得更好。

有谁知道可能是什么问题吗?

编辑:这是我的 $PROMPT/$PS1:%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}

答案1

我在提示中使用多字节(UTF-8 编码)字符时看到过类似的问题,但仅当tmuxutf8窗口选项已关闭。

要识别此类字符,请寻找 ASCII 字符集之外的任何“奇特”形状、特殊符号或重音字符(即 U+007F 之外的任何 Unicode 代码点)。

要检查该utf8选项是否处于活动状态,请在出现问题的窗口中使用此命令:

tmux show-option -gw utf8 \; show-option -w utf8

(或tmux :提示符不带前导符tmux和反斜杠)

如果显示两个值,则第二个值是该窗口的活动值。第一个(或唯一)值是全局值,如果未建立窗口本地值,则将使用该值。

如果您看到的值与配置文件中建立的值不同,那么您可能需要重新启动服务器(或者当且仅当配置文件所做的更改是幂等的,那么您可以source这样做:)tmux source ~/.tmux.conf


出现此问题的原因是(未utf8启用)tmux并且您的外部终端仿真器对于使用多少列来显示每个多字节字符有不同的想法。tmux期望多字节字符占用多列(每个字节一列),但您的外部模拟器可能配置为将其识别为单个 UTF-8 字符,因此将其呈现在单个列中。

这个问题在提示因为会仔细跟踪光标的位置,以便知道何时换行以及需要做什么才能正确地重新绘制提示。不幸的是,(非utf8)之间的不匹配tmux并且(配置为 UTF-8 的)外部模拟器会导致tmux报告位于预期位置右侧几列的光标位置(提示中每个多字节字符中的每个额外字节都有一个额外空格)。

启用utf8tmux解决了这个问题,因为tmux外部模拟器会将每个多字节 UTF-8 代码点的序列识别为占用单个列。重新配置外部模拟器以使用单字节编码也可以修复差异,但代价是无法正确查看 UTF-8 编码数据(尽管这种视图基本上可以向您展示tmuxutf8关闭时处于“思考”状态)。

答案2

我在 Terminal.app 中遇到了完全相同的错误。修复方法是转到“settings/settings/advanced”,然后将“Declare terminal as”更改为 xterm-256color。不知道为什么 :)

相关内容