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

对于单个文件类型,这很容易完成,如在如何将Wine中的文件类型与本机应用程序相关联中所述? ,通过为所需的文件类型创建.reg 。 但这只适用于AVI。 我使用一些可以发布各种文件的葡萄酒应用程序(uTorrent,Soulseek,Eudora,仅举几例)。 例如,电子邮件附件可以是JPG,DOC,PDF,PPS ……它不可能(并且不可取)跟踪可能在电子邮件中收到的所有可能的文件类型或在torrent中下载。

所以我需要一个更通用和更广泛的解决方案。 我需要文件关联来兑现当前配置的本机应用程序。 我希望在我的系统中配置的所有文件类型都能完成此操作。

我已经想出了如何使解决方案通用化。 只需将.reg已启动的应用程序替换为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 Types类型,这些类型具有关联的默认安装应用程序
  • 提取所有需要的信息(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 

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

谢谢!

多年以后,我创建了一个小实用程序来扫描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 = ) { 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 mimetypes)发布,这将是丑陋的并且可能导致循环。 这非常棘手且尚不完美,特别是混合大小写扩展(例如.C和.c)

也就是说,我希望这个脚本对每个人都有帮助:

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

欢迎改进!

编辑:

有一个关于此的葡萄酒错误 – 这比臭虫更有改进。 关键是要让ShellExecute调用xdg-open ,如果找不到,请查找gnome和kde默认值。 你应该能够应用补丁并最终拥有魔力:-)。 此解决方案更清晰,因为它不需要弄乱注册表。

更完整的是如何从源补丁和编译葡萄酒 。

结束编辑

我使用下面的脚本更新wine注册表以添加常用文件类型列表。
您可以扩展列表以添加更多类型。
它在gstart.exe文件中使用/usr/bin/gnome-open ,因此它不适用于非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. 在运行conf_wine.sh之前复制当前工作目录中的conf_wine.sh因为它会将其复制到.wine文件夹。
  2. 文件夹位置可以更改,例如gstart.exe不必位于c:\
  3. 没有魔力:必须手动添加新类型。 您可以改进它以读取Linux文件(mimeapps.list,..)并在需要时更新wine注册表。
  4. 测试至少在wine1.4中工作。

Wine FAQ: 如何将本机程序与Wine中的文件类型相关联?

我已经收集了所有地方的信息,并找到了以下工作:

我创建了一个名为〜/ .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

希望这可以帮助。