如何调试 Inkscape 剪贴板问题

如何调试 Inkscape 剪贴板问题

在我的计算机上,Inkscape 有时会陷入一种奇怪的状态,导致剪贴板操作失灵。将元素复制到剪贴板后,它开始生成许多窗口:

  • 后记输出窗口,询问输出什么级别的 Postscript 以及各种设置
  • 临时展示窗口具有tmpNNNNN.svg` 作为标题,并显示剪贴板的内容
  • 脚本错误输出窗口,说运行脚本时出现问题:Inkscape 已从执行的脚本中收到附加数据。脚本未返回错误,但这可能表示结果不会如预期。。然后窗口包含以下回溯:

    UniConvertor failed:
    Traceback (most recent call last):
      File "/usr/bin/uniconvertor", line 13, in <module>
        uniconv_run()
      File "/usr/lib/python2.7/dist-packages/uniconvertor/__init__.py", line 83, in uniconv_run
        from app.io import load
      File "/usr/lib/python2.7/dist-packages/uniconvertor/app/__init__.py", line 69, in <module>
        from conf.configurator import Configurator
      File "/usr/lib/python2.7/dist-packages/uniconvertor/app/conf/configurator.py", line 11, in <module>
        from app.events import connector
      File "/usr/lib/python2.7/dist-packages/uniconvertor/app/__init__.py", line 69, in <module>
        from conf.configurator import Configurator
      File "/usr/lib/python2.7/distpackages/uniconvertor/app/conf/configurator.py", line 13, in <module>
        from sk1libs.utils.fs import gethome
    ImportError: No module named sk1libs.utils.fs
    

选择窗口并关闭/取消它们非常棘手。而且越来越多的窗口开始出现,间隔几秒钟。此外,我正在编辑文件的主窗口将其标题更改为记忆文件N。如果我设法保存该窗口中的更改并退出,那么我可以重新启动并成功恢复工作。

一旦 Inkscape 进入此状态,即使重新启动后,它似乎仍会在复制时继续这样表现。如果我卸载该python-uniconvertor软件包,我仍然会看到上述窗口,但我得到的不是回溯:

You need to install the UniConvertor software.
For GNU/Linux: install the package python-uniconvertor.
For Windows: download it from https://sk1project.net/modules.php?name=Products&product=uniconvertor&op=download
and install into your Inkscape's Python location

有各种漏洞 报告使用 UniConvertor - 它似乎无人维护且无法使用 - 但我实际上并不想在复制和粘贴时进行任何转换,只是想在 Inkscape 本身中的 SVG 文件内复制元素,有时也在 Inkscape 中的文件之间复制元素。

如果我删除使用 uniconvertor 和 sk1 的扩展/usr/share/inkscape/extensions,则 uniconvertor 和脚本错误输出窗口不会出现,但我仍然会得到重复的 Postscript 和临时显示窗口等

我该如何调试为什么复制会执行如此奇怪的操作?

答案1

从命令行运行 inkscape,并在显示不受欢迎的额外窗口时将其暂停。然后运行ps -o command并观察启动了哪些额外进程,例如:

/usr/bin/python gimp_xcf.py --tab="Options" --guides=false --grid=false --background=false --dpi=96 /tmp/ink_ext_XXXXXX.svgPAIY3Y
/bin/sh -c gimp -i --batch-interpreter plug-in-script-fu-eval -b - > /tmp/tmp6qiytj/junk_from_gimp.txt 2>&1
gimp -i --batch-interpreter plug-in-script-fu-eval -b -

这些是导致问题的其他输出扩展。它们一次只能运行一个。要查找所有输出扩展,请grep -l '<output>' *.inx在扩展目录中执行。删除.inx这些输出扩展的文件(或将它们移动到其他位置)将修复此错误。

答案2

听起来 Inkscape 的内部状态很乱。您可以尝试使用 Python 调试器运行 Inkspace pdb,但我认为这并不容易。您还可以尝试调查剪贴板上是否有一些奇怪的东西,然后可能会触发问题(在这种情况下,问题可能是写入剪贴板的进程部分和/或对损坏的剪贴板内容做出反应的代码)。

要调试剪贴板内容,我会使用xclip。X Window 系统(包括 X.org)有三个剪贴板:主剪贴板 ( XA_PRIMARY)、辅助剪贴板 ( XA_SECONDARY) 和剪贴板 ( XA_CLIPBOARD)。据我所知,只有剪贴板可以包含非文本数据,因此仅调查剪贴板就足够了。

要找出剪贴板当前具有的所有变体(例如,如果你知道当前剪贴板内容将触发该问题),你可以运行

xclip -out -selection clipboard -target TARGETS

它将显示与剪贴板当前内容相关的不同数据变体的键。如果剪贴板上有 Inkscape 内容,则键列表相当长:

TIMESTAMP
TARGETS
MULTIPLE
image/x-inkscape-svg
image/svg+xml
image/x-inkscape-svg-compressed
image/svg+xml-compressed
text/plain
application/pdf
image/x-postscript
image/x-e-postscript
image/x-emf
image/x-wmf
text/x-povray-script
text/x-javafx-script
text/x-povray-script
text/x-tex
text/xml+fxg
image/svg+xml
application/x-xsk1
text/xml+xaml
application/x-zip
application/tar
application/x-xcf
image/hpgl
text/html
image/dxf
image/dxf
image/x-plt
application/x-zip
image/sif
image/png

您可以使用参数提取任何这些键的二进制内容,-target参数中填充您要提取的值。在某些情况下,键将包含分号和/或特殊字符,您必须对这些字符进行编码才能将其正确传递给程序。

例如,

xclip -out -selection clipboard -target 'image/x-inkscape-svg'

将以未压缩的 inkscape 文档形式将内容的 XML 编码版本发送到剪贴板上。

我不知道 Inkscape 在您按Ctrl+V粘贴内容时选择其中一种格式的逻辑。我猜它更喜欢带有字母“inkscape”的格式作为最佳选项。

相关内容