Wine内のすべてのファイルタイプを対応するネイティブアプリケーションに関連付ける方法は?


8

これは、Wine内のファイルタイプをネイティブアプリケーションに関連付ける方法で回答されているように単一のファイルタイプに対して簡単に実行できます。.reg目的のファイルタイプのを作成します。ただし、これはAVI専用です。私は、幅広いファイルを起動できるいくつかのワインアプリ(uTorrent、Soulseek、Eudoraなど)を使用しています。たとえば、電子メールの添付ファイルは、JPG、DOC、PDF、PPSなどです。電子メールで受信したり、急流でダウンロードしたりする可能性のあるすべてのファイルタイプを追跡することは不可能です(望ましくありません)。

したがって、私はより一般的で幅広いソリューションを必要としています。現在設定されているネイティブアプリを尊重するために、ファイルの関連付けが必要です。システムで構成されているすべてのファイルの種類に対してこれを実行したいと思います。

ソリューションをジェネリックにする方法はすでにわかりました。次のように、起動したアプリを.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-update-associationsため、新しいアプリがインストールされるたびに実行できるスクリプトのようなwineのレジストリへの「バッチ」アップデータが必要です。多分できるツール:

  • デフォルトのインストール済みアプリが関連付けられている、システム内のすべてのMIMEタイプタイプをリストする
  • 必要なすべての情報(glob、mimeタイプなど)を抽出します
  • 上記の形式で.REGファイルを生成します。

トリッキーな部分は次のとおりです。私は、LOTを検索して、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

ヘルプ、スクリプト、または説明をいただければ幸いです。

ありがとう!

回答:


2

数年後、私はMIMEデータベース(システムとユーザーの両方)をスキャンし、Windowsレジストリにすべての既知のネイティブMIMEタイプを登録する小さなユーティリティを作成しました。

xdg-openそのMIMEタイプのデフォルト(ネイティブ)アプリケーションがある場合は、ファイルを開くために使用します。それ以外の場合は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ワインブラウザーではなくネイティブビューアで開かれます)。また、ウィンドウにハンドラーがない場合でも、一部の拡張機能を無視できます。

winemenubuilderに対応するよう最善を尽くします。つまり、作成するすべての関連付けがwinemenubuilderによってネイティブの関連付けとして(またはx-wine-extension mimetypesとして)公開されないため、醜く、ループが発生する可能性があります。これは非常にトリッキーであり、まだ完全ではありません。特に、大文字と小文字が混在する拡張子(.Cと.cなど)

とは言っても、このスクリプトがすべての人に役立つことを願っています。

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

改善は歓迎します!


あなたのスクリプトはそれが成功したと言いますが、私にとってワインの何も変わりませんでした。大きな問題はありませんでした。ワインアプリEverything自体に別の回避策を見つけましたが、お知らせしたいと思います
phil294

1

編集:

これに関してはワインのバグがあります-これはバグよりも改善の余地があります。重要なのは、ShellExecutecall xdg-openを実行することです。見つからない場合は、gnomeとkdeのデフォルトを探します。パッチを適用して、最後に魔法を使うことができるはずです:-)。レジストリをいじる必要がないため、このソリューションはよりクリーンです。

ここでより完全にするために、ソースからwineパッチ当ててコンパイルする方法を説明します

編集を終了

以下のスクリプトでwineレジストリを更新して、一般的なファイルタイプのリストを追加します。
リストを拡張してタイプを追加できます。ファイル内で
使用するため、Gnome以外のデスクトップではそのままでは機能しません/usr/bin/gnome-opengstart.exe

これを入れてください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 FAQ:Wineでネイティブプログラムをファイルタイプに関連付けるにはどうしたらいいですか?


努力の+1、しかしこれは私の問題をほとんど解決しません。まず、すでに質問で述べたgnome-openover を使用する意味はほとんどなくxdg-open、移植性がはるかに高くなります。次に、いくつかのファイル拡張子をハードコーディングするだけでは不十分です。「現在構成されているネイティブアプリを尊重するには、ファイルの関連付けが必要です。これは、システムで構成されているすべてのファイルタイプに対して実行する必要があります。」そして私はこれがトリッキーであることを知っています。私が興味を持っているのは、ノート3で言及した「魔法」です;)
MestreLion

最初に質問を少し早く読みすぎたと思います。xdg-openを使用しているのを確認したので、スクリプトで変更します。魔法について:1つの方法は、持っている代わりに、mimeファイル内のすべての項目を繰り返し読み取ることです。ただし、新しい拡張機能が追加されている可能性があるため、システムを更新するたびに実行する必要があります。しかし、それは毎日起こりません。
rosch

または、MIMEが更新されている場合にのみレジストリを更新するためにcronjobを残酷にセットアップします。
rosch

トリッキーな部分は、いつレジストリを更新するではなく、どのように、より正確にはどのファイル拡張子を更新するかです。MIMEデータベースを一貫して解析して、デフォルトでインストールされているアプリが関連付けられているすべての拡張機能を取得する方法がわかりません。または、あなたが言ったように:mimeファイル内のすべてのアイテムを繰り返し読み取る方法は?私mimeapps.lstにはここにインストールしていないMIMEタイプがいくつかあり、Wineアプリを指すものもあります(無限ループが発生します)
MestreLion

私の最初のコメントの英語の間違いについて申し訳ありません、私はそれを編集し、それが少しめちゃくちゃになりました。答えで私のEDITを読んでください。
rosch

0

私はあちこちで情報を集めました、そして、以下がうまくいくとわかりました:

〜/ .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\""

その後、あなたは

regedit linuxnative.reg

お役に立てれば。


助けてくれてありがとう!しかし、いくつかのよく知られている拡張機能のハードコードされたリストは私の問題を解決しません。また、あちこちから集めた情報」は、私とロッシュがgstart.exeスクリプトをコピーして貼り付けたものを含め、すでに投稿されている情報と同じようです。
MestreLion 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.