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

时间:2015-02-26 18:22:43

标签: vim copy-paste tmux

当我从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'默认设置 - 没有区别。

2 个答案:

答案 0 :(得分: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'或其衍生物。”

我不知道这个的副作用。

答案 1 :(得分:2)

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

  

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

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

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