将文本从VirtualBox Debian来宾复制到Windows7主机会增加行数



我在64位Windows 7主机上运行VirtualBox 5.0.5,使用来宾64位Debian 7。剪贴板是双向的。

当我在来宾上复制Sublime text 2的文本并将其粘贴到主机上的任何编辑器中时,每行都会添加一个额外的换行符。从其他来源复制时似乎不会出现这种情况。如果它是为了Windows而添加回车,也就是说,将"\n"更改为"\r\n",但事实并非如此,而是将"\n"更改为"\n\n"。

我通过将文本粘贴到Notepad++中,然后使用搜索和替换将每个"\n\n"替换为"\n"来解决这个问题,但我最终决定我厌倦了这样做。

我能做些什么来避免额外的换行符吗?

更新

我编写了一个Windows小程序来检查Windows剪贴板,看起来剪贴板实际上正在替换以"\r\n"结尾的每一行,无论default_line_ending设置为什么,也无论源文档实际包含哪一行结尾。大多数Windows程序只是将"\r\n"解释为两行,并放入两行所需格式;我将Notepad++配置为默认使用Unix行尾,所以它将"\r\n"转换为"\n\n"。

更新1.5

示例案例:从客人的Sublime Text 2中复制此内容(以"\n"作为行尾)

cat
on
mat

在Windows剪贴板中变为(具有十六进制和十进制解释):

c 0x63 99
a 0x61 97
t 0x74 116
? 0x0D 13
? 0x0D 13
? 0x0A 10
o 0x6F 111
n 0x6E 110
? 0x0D 13
? 0x0D 13
? 0x0A 10
m 0x6D 109
a 0x61 97
t 0x74 116

更新2

我写了一个Sublime Text 2插件来做类似的测试。在访客中复制此文本

cat
on
mat

放入来宾剪贴板(带十进制解释):

c 99
a 97
t 116
? 10
o 111
n 110
? 10
m 109
a 97
t 116

因此,根据Sublime Text 2,没有什么问题,但当Windows访问包含Sublime Text2文本的剪贴板时,会检索到混乱的结束行。当我在主机或来宾上复制来自其他来源的文本时,不会发生这种情况。

另一种现象是,如果我在来宾的任何位置突出显示文本,如果我按Ctrl+C在来宾或主持人的任何位置,来宾的突出显示就会消失。这是否与主要问题有关?或者这两者都是潜在问题的症状?

更新3

Sublime Text 2似乎总是将"\n"发送到剪贴板(在混乱之前),即使我将default_line_ending设置为windows,并且我从行结尾为"\r\n"的文本文件中复制。我还注意到,在Windows风格的文本文件中,当我高亮显示文本时,当Sublime text 2报告"选择了x行,y个字符"时,每行结尾只占1个字符,而不是2个字符。我猜Sublime text 2有一些激进的行结尾管理,它无法与剪贴板正确通信。

我不知道这是否有用,但如果我查询Windows剪贴板的格式,它会报告

 1 TEXT
 7 OEMTEXT
13 UNICODETEXT
16 LOCALE

尝试更改首选项文件中的default_line_ending设置。

{
  // Determines what character(s) are used to terminate each line in new files.
  // Valid values are 'system' (whatever the OS uses), 'windows' (CRLF) and
  // 'unix' (LF only).
  "default_line_ending": "system",
}

更新该设置只会影响新文件。

如果你发现它解决了你的问题,以下插件可能会很有用:

  • 行结束统一
  • RawLineEdit

我写了一个简单的插件,允许您将任何选定的文本复制到剪贴板,同时用您选择的换行符替换其换行符。


将其另存为:Packages/ReplaceLineBreaksToClipboard/ReplaceLineBreaksToClipboard.py

import sublime, sublime_plugin
valid_LineBreak   = "n"
invalid_LineBreak = "r"
class ReplaceLinebreaksToClipboardCommand( sublime_plugin.TextCommand ):
    def run( self, edit ):
        selections     = self.view.sel()
        selectionCount = len( selections )
        if selectionCount == 0:
            return
        clipboardText = ""
        for index in range( 0, selectionCount ):
            clipboardText += self.view.substr( selections[ index ] )
            if index < selectionCount - 1:
                clipboardText += valid_LineBreak
        clipboardText = clipboardText.replace( invalid_LineBreak, valid_LineBreak )
        sublime.set_clipboard( clipboardText )

设置valid_LineBreak&invalid_LineBreak值(@第3行和第4行)。

invalid_LineBreak的所有实例都将替换为valid_LineBreak


通过在用户sublime-keymap文件中包含以下代码,添加您的首选密钥绑定以执行replace_linebreaks_to_clipboard命令。

{
    "keys": [ "ctrl+shift+alt+c" ],
    "command": "replace_linebreaks_to_clipboard",
},

我创建了一个运行Debian 9的全新虚拟机来宾。我在上面安装了Sublime Text 2,然后安装了Sublame Text 3,并将它们配置为尽可能接近我的老客人的Sublime Text2。

将新来宾上的Sublime text 3中的文本复制到Windows 7主机不会出现此问题,而将同一新来宾上Sublime text 2中的文本拷贝到Windows 7上仍然会出现此问题。我将此归因于Sublime Text 2和Windows之间的一个错误,该错误在Sublime Text3的修订版中得到了解决。

解决方案:升级到Sublime Text 3。

最新更新