如何将 Wine 中的所有文件类型与其相应的本机应用程序关联?

如何将 Wine 中的所有文件类型与其相应的本机应用程序关联?

这很容易做到单身的文件类型,如回答中所述如何将 Wine 中的文件类型与本机应用程序关联?,通过为所需文件类型创建一个.reg。但这仅适用于 AVI。我使用一些 Wine 应用程序(uTorrent、Soulseek、Eudora,仅举几例),它们可以启动各种文件。例如,电子邮件附件可以是 JPG、DOC、PDF、PPS……不可能(也不可取)追踪人们可能在电子邮件中收到或在 torrent 中下载的所有可能的文件类型。

因此我需要一个更通用、更全面的解决方案。我需要文件关联来遵守当前配置的任何本机应用程序。我希望这样做全部我的系统中配置的文件类型。

我已经想出了如何使解决方案通用。只需替换.regfor中启动的应用程序winebrowser,如下所示:

[HKEY_CLASSES_ROOT\.pdf]
@="PDFfile"
"Content Type"="application/pdf"
[HKEY_CLASSES_ROOT\PDFfile\Shell\Open\command]
@="C:\\windows\\system32\\winebrowser.exe \"%1\""

我已经测试过了,它工作正常。由于 winebrowser 用作xdg-open后端,并将我的 Windows 路径转换为 ​​Unix 路径,因此启动了正确的 (Linux) 应用程序。

因此,我需要一个 Wine 注册表的“批量”更新程序,即wine-update-associations每当安装新应用时都可以运行的脚本。也许一个工具可以:

  • 列出我的系统中的所有 Mime 类型具有默认值,已安装应用程序相关
  • 提取所有需要的信息(glob、mime 类型等)
  • 生成上述格式的.REG文件

棘手的部分是:我搜索了很多资料来查找有关如何在 Ubuntu 10.10 及更高版本中进行关联的信息,但文档很少,至少可以说令人困惑。Freedesktop.org 没有完整的规范,甚至 Gnome 文档也已过时。到目前为止,我收集了4包含关联信息的文件,但我不知道使用哪个(或为什么),或者如何使用它们来生成文件.reg

~/.local/share/applications/mimeapps.list
~/.local/share/applications/miminfo.cache
/usr/share/applications/miminfo.cache
/etc/gnome/defaults.list

任何帮助、脚本或解释都将不胜感激!

谢谢!

答案1

多年后,我制作了一个小工具,可以扫描 MIME 数据库(系统和用户)并注册全部Windows 注册表中已知的本机 MIME 类型。

如果存在该 mime 类型的默认(本机)应用程序,则它用于xdg-open打开文件,否则用于packagekit搜索可以处理该文件的包(就像 Nautilus 所做的那样)。因此,我最初要求只注册安装了本机应用程序的扩展,现在不再需要了。但是,脚本的早期版本确实只过滤了此类类型。实现这一点的代码片段是:

perl -e '
    use strict; use warnings;
    use File::MimeInfo::Magic; use File::MimeInfo::Applications;
    while (my $line = <STDIN>) {
      chomp($line);
      my ($ext, $mime) = (split/\t/, $line);
      my ($def, @apps) = mime_applications_all($mime);
      print "$line\n" if ($def || @apps)
    }'

默认情况下,我的脚本仅注册在 Windows 注册表中没有处理程序的本机类型,但它也可以覆盖此类关联(例如,jpeg 文件将在本机查看器中打开,而不是在默认的 Gecko wine 浏览器中打开)。它还可以忽略某些扩展,即使它们在 Windows 中没有处理程序。

它尽力使 winemenubuilder 友好,这意味着它创建的所有关联都不会被 winemenubuilder 发布为本机关联(或 x-wine-extension mimetype),这会很丑陋并且可能导致循环。这非常棘手,还不完美,特别是对于混合大小写的扩展名(例如 .C 和 .c)

话虽如此,我希望这个脚本对每个人都有帮助:

https://github.com/MestreLion/wine-tools/blob/master/wine-import-extensions

欢迎改进!

答案2

编辑:

有一个关于此的葡萄酒虫- 这更像是一种改进,而不是一个错误。重点是调用ShellExecutexdg-open如果找不到,则查找 gnome 和 kde 默认值。您应该能够应用补丁并最终获得魔力 :-)。此解决方案是清洁工因为它不需要弄乱注册表。

为了更完整,这里是如何从源代码修补并编译 wine

结束编辑

我使用下面的脚本更新了 wine 注册表,以添加常见文件类型列表。
您可以扩展列表以添加更多类型。
它利用了文件/usr/bin/gnome-open中的gstart.exe不适用于非 Gnome 桌面

将其放入conf_wine.sh

#!/bin/bash

SRC=~
WINE=~/.wine
REG=$WINE/system.reg
GSTART=gstart.exe
GSTART_TARGET=$WINE/drive_c
EXE_TARGET=$WINE/drive_c/windows
FNKEY=/tmp/"key"$(date +%F_%H-%M-%S)".reg"

[ -e $FNKEY ] && { echo "temporary key file exists..try again"; exit 1; }

echo "copying gstart.exe"
cp $SRC/$GSTART $GSTART_TARGET
chmod +x $GSTART_TARGET

echo "backing up the registry"
cp $REG $REG.$(date +%F_%H-%M-%S).old

echo "setting new wine registry keys"
for i in http doc docx ppt pptx xls xlsx odt ods xml txt pdf odt svg zip ; do {
    echo "setting $i"
key='[HKEY_CLASSES_ROOT\.'$i']
@="'$i'file"
"Content Type"="application/'$i'"
[HKEY_CLASSES_ROOT\'$i'file\Shell\Open\command]
@="C:\\gstart.exe \"%1\""'
    echo "$key" > $FNKEY
    regedit $FNKEY
}
done

echo "done"

gstart.exe是一个 bash 脚本...是通向两个世界的桥梁:

#!/bin/bash

OPEN_HANDLER=/usr/bin/gnome-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG

# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR

# finally open the file
$OPEN_HANDLER "$RESULT"

笔记:

  1. 在运行之前将其复制gstart.exe到当前工作目录中 conf_wine.sh,因为它会将其复制到.wine文件夹中。
  2. 文件夹位置可以更改,例如gstart.exe不必坐在里面c:\
  3. 没有什么神奇之处:必须手动添加新类型。您可以改进它以读取 Linux 文件(mimeapps.list,..)并根据需要更新 wine 注册表。
  4. 至少在 wine1.4 中经过测试可以正常工作。

葡萄酒常见问题解答:如何在 Wine 中将本机程序与文件类型关联?

答案3

我收集了各处的信息并发现以下方法可行:

我创建了一个名为 ~/.wine/drive_c/gstart.exe 的文件

内容如下:

#!/bin/bash
OPEN_HANDLER=/usr/bin/xdg-open
# logging, optional
LOG=$HOME/.wine/gstart.exe-log.$(id -u -n)
echo "[ $(date) ] $# argument(s) received: '$@'" > $LOG
# convert the path
RESULT=$(winepath "$@" 2> /dev/null)
echo "$OPEN_HANDLER $RESULT" >> $LOG
TMP=$TMPDIR
TEMP=$TMPDIR
# finally open the file
$OPEN_HANDLER "$RESULT"

然后:在我的 ~/bin 中创建一个名为 linuxnative.reg 的文件

内容如下:

REGEDIT4
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.rtf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.odt]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.pdf]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.tif]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.doc]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.docx]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\.jpg]
@="linuxnative"
"Content Type"="application/linuxnative"
[HKEY_CLASSES_ROOT\linuxnative]
[HKEY_CLASSES_ROOT\linuxnative\shell]
[HKEY_CLASSES_ROOT\linuxnative\shell\open]
[HKEY_CLASSES_ROOT\linuxnative\shell\open\command]
@="c:\\gstart.exe \"%1\""

然后你做一个

注册表编辑器 linuxnative.reg

希望这可以帮助。

相关内容