将文本从 VirtualBox Debian 来宾复制到 Windows 7 主机添加行
Copying text from VirtualBox Debian guest to Windows 7 host adds lines
我是 运行 VirtualBox 5.0.5 on 64-bit Windows 7 host with guest 64-bit Debian 7. 剪贴板是双向的。
当我从客户机上的 Sublime Text 2 复制文本并将其粘贴到主机上的任何编辑器中时,每行都会添加一个额外的换行符。从其他来源复制时似乎不会发生。如果它为了 Windows' 添加回车符 returns,这在某种程度上是有道理的,即将“\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 lines, y characters selected." 时,每一行结尾仅计为 1 个字符而不是 2 个字符我猜 Sublime Text 2 有一些激进的行结束管理,它不能与剪贴板正确通信。
我不知道这是否有用,但如果我查询 Windows 剪贴板的格式,它会报告
1 TEXT
7 OEMTEXT
13 UNICODETEXT
16 LOCALE
尝试更改 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",
}
更新该设置只会影响新文件。
如果您发现它解决了您的问题,以下插件可能会有用:
我写了一个简单的插件,允许您将任何选定的文本复制到剪贴板,同时用您选择的换行符替换它。
另存为:
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,然后安装了 Sublime Text 3,并尽可能地在我的旧虚拟机上配置它们以接近 Sublime Text 2客人.
从新客户机上的 Sublime Text 3 复制文本到 Windows 7 主机没有有这个问题,而从同一个客户机上的 Sublime Text 2 复制文本新客人 仍然 。我将此归因于 Sublime Text 2 和 Windows 之间的错误,该错误已在 Sublime Text 3 的修订版中解决。
解决方案:升级到 Sublime Text 3。
我是 运行 VirtualBox 5.0.5 on 64-bit Windows 7 host with guest 64-bit Debian 7. 剪贴板是双向的。
当我从客户机上的 Sublime Text 2 复制文本并将其粘贴到主机上的任何编辑器中时,每行都会添加一个额外的换行符。从其他来源复制时似乎不会发生。如果它为了 Windows' 添加回车符 returns,这在某种程度上是有道理的,即将“\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 lines, y characters selected." 时,每一行结尾仅计为 1 个字符而不是 2 个字符我猜 Sublime Text 2 有一些激进的行结束管理,它不能与剪贴板正确通信。
我不知道这是否有用,但如果我查询 Windows 剪贴板的格式,它会报告
1 TEXT
7 OEMTEXT
13 UNICODETEXT
16 LOCALE
尝试更改 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",
}
更新该设置只会影响新文件。
如果您发现它解决了您的问题,以下插件可能会有用:
我写了一个简单的插件,允许您将任何选定的文本复制到剪贴板,同时用您选择的换行符替换它。
另存为:
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,然后安装了 Sublime Text 3,并尽可能地在我的旧虚拟机上配置它们以接近 Sublime Text 2客人.
从新客户机上的 Sublime Text 3 复制文本到 Windows 7 主机没有有这个问题,而从同一个客户机上的 Sublime Text 2 复制文本新客人 仍然 。我将此归因于 Sublime Text 2 和 Windows 之间的错误,该错误已在 Sublime Text 3 的修订版中解决。
解决方案:升级到 Sublime Text 3。