将文本从VirtualBox Debian guest虚拟机复制到Windows 7主机会添加行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将文本从VirtualBox Debian guest虚拟机复制到Windows 7主机会添加行相关的知识,希望对你有一定的参考价值。
我在带有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 n r n”结尾的每一行,无论default_line_ending
设置为什么,并且无论哪一行结束源文件实际上包含。大多数Windows程序只是将“ r n r n”解释为两行,并放置两种预期的格式;我将Notepad ++配置为默认使用Unix行结尾,因此它将“ r n n n”转换为“ n n”。
更新1.5
示例案例:从guest虚拟机中的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
尝试更改default_line_ending
文件中的Preferences设置。
{
// 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 = "
"
invalid_LineBreak = "
"
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
取代。
通过在用户replace_linebreaks_to_clipboard
文件中包含以下代码,添加首选键绑定以执行sublime-keymap
命令。
{
"keys": [ "ctrl+shift+alt+c" ],
"command": "replace_linebreaks_to_clipboard",
},
我已经创建了一个运行Debian 9的全新虚拟机来宾。我在其上安装了Sublime Text 2,然后安装了Sublime Text 3,并在我的旧客户机上尽可能接近Sublime Text 2。
将新guest虚拟机上的Sublime Text 3中的文本复制到Windows 7主机没有此问题,而从同一新guest虚拟机上的Sublime Text 2复制文本仍然有效。我正在粉碎Sublime Text 2和Windows之间的一个错误,这个错误在Sublime Text 3的修订版本中被解决了。
解决方案:升级到Sublime Text 3。
以上是关于将文本从VirtualBox Debian guest虚拟机复制到Windows 7主机会添加行的主要内容,如果未能解决你的问题,请参考以下文章
VirtualBox创建的Debian虚拟机与Windows宿主共享文件
感谢,解决了VirtualBox下 debian安装增强功能