Bagaimana cara mengaitkan semua jenis file dalam Wine dengan aplikasi asli yang sesuai?

8

Ini mudah dilakukan untuk satu jenis file, seperti yang dijawab dalam Cara mengaitkan jenis file dalam Wine dengan aplikasi asli? , dengan membuat .reguntuk tipe file yang diinginkan. Tapi ini hanya untuk AVI. Saya menggunakan beberapa aplikasi anggur (uTorrent, Soulseek, Eudora, untuk beberapa nama) yang dapat meluncurkan berbagai file. Lampiran email, misalnya, dapat berupa JPG, DOC, PDF, PPS ... tidak mungkin (dan tidak diinginkan) untuk melacak semua jenis file yang mungkin diterima seseorang dalam email atau mengunduh dalam torrent.

Jadi saya butuh solusi untuk menjadi lebih umum dan luas. Saya membutuhkan asosiasi file untuk menghormati aplikasi asli apa pun yang saat ini dikonfigurasi. Dan saya ingin ini dilakukan untuk semua jenis file yang dikonfigurasi di sistem saya.

Saya sudah menemukan cara membuat solusinya generik. Cukup dengan mengganti aplikasi yang diluncurkan .reguntuk winebrowser, seperti ini:

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

Saya sudah menguji ini dan berfungsi dengan benar. Karena winebrowser digunakan xdg-opensebagai backend, dan mengubah jalur windows saya menjadi Unix, aplikasi yang benar (Linux) diluncurkan.

Jadi saya memerlukan "batch" updater ke registry wine, semacam wine-update-associationsskrip yang dapat saya jalankan setiap kali aplikasi baru diinstal. Mungkin alat yang bisa:

  • Daftar semua Mime Jenis jenis dalam sistem saya yang memiliki default, diinstal aplikasi terkait
  • Ekstrak semua info yang diperlukan (glob, tipe mime, dll)
  • Buat file .REG dalam format di atas

Bagian yang sulit adalah: Saya telah mencari BANYAK untuk menemukan info tentang bagaimana asosiasi dilakukan di Ubuntu 10.10 dan seterusnya, dan dokumentasi langka dan membingungkan, untuk sedikitnya. Freedesktop.org tidak memiliki spesifikasi lengkap, dan bahkan dokumen Gnome sudah usang. Sejauh ini saya sudah mengumpulkan 4 file yang berisi info asosiasi, tetapi saya tidak tahu harus menggunakan (atau mengapa) apa, atau bagaimana menggunakannya untuk menghasilkan .regfile:

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

Bantuan, naskah, atau penjelasan apa pun akan sangat dihargai!

Terima kasih!

MestreLion
sumber

Jawaban:

2

Bertahun-tahun kemudian, saya membuat sebuah utilitas kecil yang memindai basis data MIME (baik sistem maupun pengguna) dan mendaftarkan semua tipe mime asli yang dikenal di registri Windows.

Ini digunakan xdg-openuntuk membuka file jika ada aplikasi default (asli) untuk tipe mime itu, jika tidak digunakan packagekituntuk mencari paket yang dapat menangani file itu (seperti apa yang dilakukan Nautilus). Jadi persyaratan awal saya hanya mendaftarkan ekstensi yang sudah diinstal, aplikasi asli tidak diperlukan lagi. Namun, skrip versi awal memang hanya memfilter tipe-tipe seperti itu. Cuplikan yang memungkinkan adalah:

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)
    }'

Secara default skrip saya hanya mendaftarkan tipe asli yang tidak memiliki penangan di registri windows, tetapi skrip juga dapat mengesampingkan asosiasi tersebut (jadi, misalnya, file jpeg dibuka di penampil asli alih-alih browser anggur Gecko default). Itu juga dapat mengabaikan beberapa ekstensi bahkan jika mereka tidak memiliki penangan di windows.

Itu mencoba yang terbaik untuk menjadi winemenubuilder-friendly, artinya semua asosiasi yang dibuat tidak dipublikasikan sebagai asosiasi asli (atau sebagai mimetipe ekstensi anggur-x) oleh winemenubuilder, yang akan jelek dan berpotensi menyebabkan loop. Ini sangat rumit dan belum sempurna, khususnya dengan ekstensi case campuran (.C dan .c misalnya)

Karena itu, saya harap skrip ini berguna untuk semua orang:

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

Selamat datang, perbaikan!

MestreLion
sumber
naskahmu mengatakan itu berhasil, tetapi tidak ada yang berubah dalam anggur untukku. Tidak masalah besar, saya menemukan solusi lain di aplikasi anggur Everythingitu sendiri, tetapi saya hanya ingin memberi tahu Anda
phil294
1

EDIT:

Ada bug anggur tentang ini - yang lebih merupakan perbaikan daripada bug. Intinya adalah memiliki ShellExecutepanggilan xdg-open, dan jika tidak ditemukan, cari default gnome dan kde. Anda harus dapat menerapkan tambalan dan akhirnya memiliki keajaiban :-). Solusi ini lebih bersih karena tidak perlu dipusingkan dengan registri.

Untuk lebih lengkap di sini adalah cara menambal dan menyusun anggur dari sumber .

AKHIR EDIT

Saya memperbarui registri anggur dengan skrip di bawah ini untuk menambahkan daftar jenis file umum.
Anda dapat memperpanjang daftar untuk menambahkan lebih banyak jenis.
Itu memanfaatkan /usr/bin/gnome-opendalam gstart.exefile sehingga tidak akan berfungsi untuk desktop non-gnome seperti ini .

Masukkan ini 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"

Ini gstart.exeadalah skrip bash..dan adalah jembatan ke kedua dunia:

#!/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"

Catatan:

  1. salin gstart.exedi direktori kerja Anda saat ini sebelum dijalankan conf_wine.shkarena akan menyalinnya ke .winefolder.
  2. lokasi folder dapat diubah, mis. gstart.exetidak harus duduk c:\.
  3. tidak ada keajaiban: tipe baru harus ditambahkan secara manual. Anda bisa memperbaikinya untuk membaca file Linux (mimeapps.list, ..) dan memperbarui registri anggur jika diperlukan.
  4. diuji untuk bekerja setidaknya dalam anggur1.4.

Wine FAQ: Bagaimana cara saya mengaitkan program asli dengan tipe file dalam Wine?

Rosch
sumber
Memberi +1 untuk upaya ini, tetapi ini hampir tidak menyelesaikan masalah saya. Pertama, ada sedikit titik menggunakan gnome-openlebih xdg-open, yang saya telah disebutkan dalam pertanyaan, dan jauh lebih portabel. Kedua, hardcoding beberapa ekstensi file tidak cukup bagi saya: seperti yang saya katakan, "Saya perlu asosiasi file untuk menghormati aplikasi asli apa pun yang saat ini dikonfigurasi. Dan saya ingin ini dilakukan untuk semua jenis file yang dikonfigurasi dalam sistem saya." Dan saya sadar ini rumit. Itu adalah "keajaiban" yang Anda sebutkan dalam catatan Anda # 3 yang saya tertarik;)
MestreLion
Saya kira saya membaca pertanyaan Anda agak terlalu cepat pertama .. Saya melihat Anda menggunakan xdg-open dan saya akan mengubahnya di skrip saya. Tentang keajaiban: salah satu caranya adalah membaca ulang semua item dalam file mime alih-alih memilikinya. Tetapi Anda harus menjalankannya setiap kali Anda memperbarui sistem karena ekstensi baru mungkin telah ditambahkan. Itu tidak terjadi setiap hari.
rosch
Atau bahkan secara brutal mengatur cronjob untuk pembaruan registri..hanya memodifikasi registri jika pantomim telah diperbarui.
rosch
Bagian yang sulit bukanlah kapan memperbarui registri, tetapi bagaimana , atau, lebih tepatnya, memperbarui untuk ekstensi file mana? Aku tidak tahu bagaimana untuk secara konsisten mengurai database mime untuk mengambil semua ekstensi yang memiliki default, diinstal aplikasi terkait . Atau, seperti yang Anda katakan: bagaimana cara membaca iterate semua item dalam file mime ? Ada beberapa jenis pantomim di saya mimeapps.lstyang belum saya instal di sini, dan beberapa menunjuk kembali ke aplikasi Wine (yang akan menyebabkan loop tak terbatas)
MestreLion
Maaf tentang kesalahan bahasa Inggris dalam komentar pertama saya, saya mengeditnya dan itu sedikit kacau .. Silakan baca EDIT saya dalam jawabannya, di sana Anda memiliki keajaiban karena semua file diurus.
Rosch
0

Saya telah mengumpulkan Info di semua tempat dan menemukan yang berikut ini berfungsi:

Saya telah membuat file bernama ~ / .wine / drive_c / gstart.exe

dengan yang berikut ini:

#!/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"

Kemudian: Membuat file bernama linuxnative.reg di ~ / bin saya

dengan yang berikut ini:

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\""

maka Anda melakukan

regedit linuxnative.reg

Semoga ini membantu.

pengguna300778
sumber
Terima kasih telah mencoba membantu! Tetapi daftar hardcoded dari beberapa ekstensi terkenal tidak menyelesaikan masalah saya. Juga, "info yang Anda kumpulkan dari semua tempat" tampaknya merupakan info yang sama yang sudah saya posting dan bagikan, termasuk salinan dan rekatkan gstart.exeskripnya.
MestreLion