【问题标题】:Copying text from VirtualBox Debian guest to Windows 7 host adds lines从 VirtualBox Debian 来宾复制文本到 Windows 7 主机添加行
【发布时间】:2016-09-07 14:14:23
【问题描述】:

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

当我从客户机上的 Sublime Text 2 复制文本并将其粘贴到主机上的任何编辑器时,每行都会添加一个额外的换行符。从其他来源复制时似乎不会发生这种情况。如果为了 Windows 的缘故添加回车,这在某种程度上是有意义的,即将“\n”更改为“\r\n”,但事实并非如此,它将“\n”更改为“\n\n”。

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

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

更新

我编写了一个小型 Windows 程序来检查 Windows 剪贴板,看起来剪贴板实际上正在替换以“\r\r\n”结尾的每一行,无论 default_line_ending 设置为什么,并且没有无论源文档实际包含哪一行结尾。大多数 Windows 程序只是简单地将 "\r\r\n" 解释为两行,并放置两个预期的格式;我已将 Notepad++ 配置为默认使用 Unix 行尾,因此它将“\r\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 Text 2 的文本的剪贴板时,会检索到混乱的结束行。当我从主机或访客的其他来源复制文本时,不会发生这种情况。

另一个现象是,如果我在客人的任何地方突出显示文本,如果我在客人或主机的任何地方按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

【问题讨论】:

    标签: debian sublimetext2 virtualbox clipboard windows-7-x64


    【解决方案1】:

    尝试更改Preferences 文件中的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",
    }
    

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

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

    【讨论】:

    • 我尝试将设置 default_line_endingsystem 更改为 unixwindows,但在所有情况下,从 Sublime Text 2 和将其粘贴到 Windows 中。我在 Sublime Text 2 中保存了文件,然后在十六进制编辑器中打开它们并确认文件以正确的行结尾保存,所以我怀疑这些插件是否会有所帮助。
    【解决方案2】:

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


    另存为: 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_LineBreakinvalid_LineBreak 值(@ 第 3 和 4 行)。

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


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

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

    【讨论】:

    • 非常感谢您的插件,但它没有工作。为了验证我的设置是否正确,我将valid_LineBreak 设置为其他打印​​字符,例如“X”,并且换行符确实被替换为“X”——但前提是invalid_LineBreak 设置为 Sublime文本 2 假定 正在生成 ("\n"),而不是剪贴板中不需要的换行符 ("\r")。无论我做什么,Windows 仍然将剪贴板中的换行符读取为“\r\r\n”。 Sublime Text 2 和 VirtualBox 剪贴板之间一定有某种奇怪的脱节连接。
    • @AufbeschissenerKunde:确实很奇怪......也许VirtualBox剪贴板更喜欢\r?您是否尝试将\r 用作valid_LineBreak\n 用作invalid_LineBreak
    【解决方案3】:

    我创建了一个运行 Debian 9 的全新虚拟机客户机。我在其上安装了 Sublime Text 2,然后是 Sublime Text 3,并在我的旧客户机上将它们配置为尽可能接近 Sublime Text 2。

    将新客户机上的 Sublime Text 3 中的文本复制到 Windows 7 主机没有有这个问题,而从同一个新客户机上的 Sublime Text 2 复制文本仍然有时间>。我将此归结为 Sublime Text 2 和 Windows 之间的错误,该错误已在 Sublime Text 3 的修订版中解决。

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

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2013-06-23
      • 2013-07-06
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多