这件事让我抓狂。我已经在互联网和 SE 上搜索过,发现了很多相关问题,但没有一个能解决我的问题。
我在 tmux 中使用 Zsh。直到几天前一切都运行良好,但现在当我退出 vim 时,缓冲区的内容仍保留在屏幕上。我不想这样。我通过传递-X
选项在 less 上获得了这种行为。问题是 vim 终端配置看起来很好:
:set t_ti?
:t_ti=^[[?1049h
:set t_te?
:t_te=^[[?1049l
tmux 的alternate-screen
选项是on
。
我不知道现在该看哪里。
仅供参考,这是我的点文件:https://github.com/fuadsaud/JARVIS
答案1
首先,这些t_ti
和t_te
设置看起来不错。
但要检查一下显而易见的事情(抱歉)......
当您说 时^[
,这必须是一个控制字符 (Escape),而不是两个字符 (^
和[
)。我不确定如何在 vim 中具体检查这一点,但在我的 vim 上,:set t_ti?
它以不同的颜色显示^[
,这有点表明它是一个控制字符。
另外,您没有提到您正在运行什么终端仿真器和平台。它可能有影响,您应该将其与 vim 和 tmux 的版本一起放在您的问题中。但是,如果您说您已经可以使用命令less
(没有和和 -X
分别),那么这表明您的终端仿真器和 tmux 设置是正确的,而我怀疑是 vim 的问题。
确认如下(记住^[
必须输入作为控制字符,例如Ctrl-v
后跟Escape
):
less /etc/hosts # should use alternate screen (desired)
less -X /etc/hosts # should leave it's output on screen (undesired)
echo -n "^[[?1049h"; less -X /etc/hosts; echo -n "^[[?1049l"
# should use alternate screen (desired)
如果最后一条命令使用 less 给出了所需的行为。尝试使用 vim 采取同样的方法:
echo -n "^[[?1049h"; vim /etc/hosts; echo -n "^[[?1049l"
# should use alternate screen (desired)
退出 vim 后,屏幕应该恢复到之前的内容(您想要的行为)。如果是这样,那么您可以使用别名或包装器脚本来组合一个非常笨拙的解决方法。但是,如果您在诊断中到达这个阶段,那么几乎肯定是 vim 或其部分配置存在问题,在退出时没有发送 t_te 序列,我首先将 .vimrc 和 .vim 移开,然后使用干净的配置进行测试:
cd
mv .vimrc .vimrc-safe
mv .vim .vim-safe
然后是二进制切割时间,这应该很有趣。:-) 希望这会有所帮助。