从tmux会话中的vim复制的文本用右边的空格填充

问题描述 投票:5回答:2

当我从tmux会话中运行Vim并将一些文本复制到剪贴板时,每行都会在右侧填充空格。

例如,假设我有一个这样的文本文件:

^some$
^text$

注意:我已经使用^$分别标记一行的开头和结尾。它们不是文件内容的一部分。

我启动tmux并在Vim中打开此文件。我按Shift键(阻止Vim处理鼠标点击)并按住鼠标左键标记完整文本。然后我用Shift + Ctrl + c将其复制到剪贴板。

剪贴板中的结果如下:

^some                                                  $
^text                                                  $

注意额外的空格。空格数取决于终端宽度。

如果我在没有tmux的情况下启动Vim,或者如果我只是cat文件内容然后复制它,则没有多余空格。所以它必须与Vim + tmux的组合有关。我在不同的Linux风格上看到了这一点,即在Ubuntu和Mint上。我在那里使用默认终端(Gnome Terminal 3.6.2)。

那我怎么能阻止这个呢?

编辑:我的tmux.conf

set-option -g prefix C-a
set-option -g mouse-utf8 off

set-option -g status-keys vi
set-window-option -g mode-keys vi
set-window-option -g mode-mouse on
set-option -g terminal-overrides 'xterm*:smcup@:rmcup@'

bind-key C-a last-window
bind-key C-h select-pane -L
bind-key C-l select-pane -R

# colors:
set-option -g status-bg black
set-option -g status-fg white
set-option -g status-left '#[fg=green]#H'
set-window-option -g window-status-current-bg red

编辑2:我也试过没有上面的.tmux.conf,使用tmux的默认设置 - 没有区别。

vim copy-paste tmux
2个回答
2
投票

嗯,我找到了一个解决方法,将屏幕上的TERM更改为xterm:

TERM = xterm vim

或者在〜/ .tmux.conf中使用以下内容

set -g default-terminal“xterm”

上面我在GNOME终端的本地shell和SecureCRT的远程shell中进行了测试。如果这仍然不起作用,也许你可以检查你的〜/ .vimrc或其他全局设置中没有“set t_ut =”,因为我发现这打破了我的解决方法。

但是在“man tmux”中,它说

“对于在tmux中运行的所有程序,必须将TERM环境变量设置为”screen“。新窗口将自动将”TERM = screen“添加到其环境中,但必须注意不要在shell启动文件中重置它。 “

“设置在此会话中创建的新窗口的默认终端 - TERM环境变量的默认值。要使tmux正常工作,必须将其设置为'screen'或其衍生物。”

我不知道这个的副作用。


2
投票

经过更多的调查,我找到了问题的根源。这是因为tmux不支持bce功能。来自xterm FAQ

术语“bce”代表“背面颜色擦除”。诸如现代xterm和rxvt之类的终端实现了背面颜色擦除,而诸如dtterm之类的终端则没有。 (我知道实现bce的大约一半模拟器)。当应用程序清除屏幕时,实现背面颜色擦除的终端将保留最后设置的背景颜色。未实现背面颜色擦除的终端会将背景颜色重置为默认颜色或初始颜色。以单色绘制大部分屏幕的应用程序在支持背面颜色擦除的终端上更有效。如ncurses常见问题解答中所述,不可避免地存在权衡标准化的权衡和问题。不出所料,ncurses支持xterm的行为。

最初的screen多路复用器具有此功能。我打开了一个feature request issue,但不幸的是他们拒绝实施它。所以最难的事实是:tmux没有解决方案。

更新:对于那些检查功能请求 - 祝你好运!作者非常自以为是,反应非常薄。他完全禁止我进入存储库,因为我敢于反驳他的一句嗤之以鼻的评论。照顾自己。

© www.soinside.com 2019 - 2024. All rights reserved.