プログラムによる/スクリプトによるデフォルトのOpen-With設定の変更


8

プログラムで/スクリプトを使用してファイルの種類を開くアプリを変更する方法はありますか?

基本的に、私はWebサイトで作業していることがあり、すべてのWebファイルをテキストエディター(* .php、*。html、*。htmなど)で開くように設定したいです。

ただし、それ以外の場合は、ファイルを表示したいだけなので、ブラウザで開きます。

現在、アイテムをドックアイコンにドラッグしていますが、これは機能しますが、特にキーボードのみで多数のファイルを処理している場合は遅くなります。

基本的に、私が欲しいのは、すべてのopen-with設定を変更する小さなapplescript /何でもです。
そうすることで、open-withプログラムごとに1つのスクリプトを作成し、前後に変更することができます。

ありがとう。

回答:


10

これは可能ですが、おそらくあなたが考えるほど簡単ではありません。Uniform Type Identifiersをよく理解する必要があります。WikipediaのUniform Type Identifierページを見てください。

OS Xは、優先ファイルの関連付けに関する情報を、という名前の設定ファイルに保存しますcom.apple.LaunchServices.plist。そのファイルを見つけて変更する前に、デフォルトのOS Xのドメイン階層(別名「設定」)をよく理解しておくことをお勧めします。これに関するまともな記事はここにあります。(免責事項:彼らはそのサイトで何かを販売しているようです。私はそれが何であるかを知りませんし、それらとは関連がありません。説明は単なる良い説明です。)

デフォルトとUTI(医療の種類ではない)についてすべて理解したところで、スクリプト/コマンドラインからファイルの関連付けを設定する方法について説明します。

まず、関連付けを行うファイルを識別する適切な方法を知る必要があります。

UTIが重要であると私が言った方法を覚えていますか?ファイルを識別する方法は複数あります。型がシステムで正式に宣言されているかどうかによって異なります。たとえば、TextMateやTextWranglerなどのまともなテキストエディターは、システムで使用するときに、型階層にかなりの数の型宣言を追加します。ただし、これらのアプリケーションがない場合は、これらの型が宣言されていない可能性があります。

わかりました、十分な話。例:

ファイルのUTIを取得します。

$ mdls myFile.xml
...
kMDItemContentType             = "public.xml"
kMDItemContentTypeTree         = (
    "public.xml",
    "public.text",
    "public.data",
    "public.item",
    "public.content"
)
...

うんいいね。使用できる明示的なコンテンツタイプ。それをどこかに書き留めてください。

$ mdls myFile.myExtn
...
kMDItemContentType             = "dyn.ah62d4rv4ge8048pftb4g6"
kMDItemContentTypeTree         = (
    "public.data",
    "public.item"
)
...

おっとっと。OS Xは ".myExtn"ファイルを認識しません。したがって、それは私たちが何にも使用できない動的UTIを作成しました。そして親の型はあまりにも一般的すぎて役に立たない。

ファイルが何であるかがわかったところで、LaunchServices.plistファイルを見て、何ができるか見てみましょう。

$defaults read com.apple.LaunchServices
{
    ...
    LSHandlers =     (
                {
            LSHandlerContentType = "public.html";
            LSHandlerRoleAll = "com.apple.safari";
            LSHandlerRoleViewer = "com.google.chrome";
        },
    ...
                {
            LSHandlerContentTag = myExtn;
            LSHandlerContentTagClass = "public.filename-extension";
            LSHandlerRoleAll = "com.macromates.textmate";
        },
    ...
    );
    ...
}

したがって、「良い」コンテンツタイプを使用する場合は、最初の構成の方が適しています。それ以外の場合、他の構成要素。そのファイルには他の構成要素がありますが、それらはあなたが尋ねたものとは関係ありません。出力を確認するときに、それらが存在することを確認してください。

ご覧のとおり、使用するアプリケーションのUTIを見つける必要があります。上記の例ではSafarとTextMateのUTIを使用していますが、一般的にアプリケーションのUTIを見つけるには、次のようにします。

$ cd /Applications/MyApp.app/Contents
$ less Info.plist
...
        <key>CFBundleIdentifier</key>
        <string>com.apple.Safari</string>
...

注:私は持っていない LSHandlerRoleAllとLSHandlerRoleViewerの違いを構成するもののアイデアを。そのドキュメントはどこにも見つかりません。私がやる参照してくださいLSHandlerRoleAllは一組だけ(つまり、全くLSHandlerRoleViewerはありません)、それはあなたがでタイプを関連付けるために望んでいることをアプリケーションにUTIに設定されていることである時のそれは99%です。

これまでのところ、ここでは、読者のための演習として必要な値を設定する方法を説明します。これらのものをいじることはやや危険です。ファイルをめちゃくちゃにして、ファイルの関連付けをまったく機能させないことは完全に可能です。次に、ファイルを破棄してやり直す必要があります。

いくつかのヒント:

  • defaults writeとその構文を読んでください
  • を見てくださいPlistBuddyman PlistBuddyそして/usr/libexec/PlistBuddy -h
  • このナンセンスをすべてスキップして、RCDefaultAppを使用してください。

RCDefaultはスクリプト可能ですか?私は彼らのサイトを見ました、そしてそれはそのようには見えません。
偽名

ネヴァーマインド、私は私が興味を持ってすべてのファイルの種類の型宣言を持っている。
フェイクネーム

素晴らしい記事。限りではLSHandlerRoleViewer、それが編集ではなく表示のデフォルトであることと関係があるのではないかと思います(apple.stackexchange.com/a/49998/206073は、これらの行に私を導きました)。しかし、どのコンテキストで表示または編集用に開いているかを判断できるかどうかはわかりませんが...(トピック外、CFBundleTypeRole同様の値を受け入れるように見えます)
Brett Zamir

また、com.apple.LaunchServices/com.apple.launchservices.secure後のMacOSシステムではドメインのようです...
Brett Zamir

2

1つのオプションは編集することです~/Library/Preferences/.GlobalPreferences.plist

defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=com.adobe.pdf;LSHandlerRoleAll=net.sourceforge.skim-app.skim;}'

あなたはできるエントリがすでに存在するかどうかを確認するためにPlistBuddyを使用しますが、私は再起動したり起動Servicesデータベースを再構築せずに変更を適用する方法を発見していません。

dutiを使用するとduti ~/.dutiこれを~/.duti次のように保存した後に実行できます。

net.sourceforge.skim-app.skim .pdf all

1

それは本当にあなたの質問に答えませんが、解決策になるかもしれません。

Finder のインスペクタには、現在選択されている1つまたは複数のファイルに関する情報が表示されます。

+ +I

Finder の[概要情報]ウィンドウは、複数のファイルが選択されている場合に役立ちます

^+ +I

同じタイプの複数のファイルを選択した場合、上記のどちらの方法でも、それらのファイルのOpen with:プロパティを簡単に切り替えることができます。


0

あなたの正確な質問への答えではなく、別の可能な解決策。コマンドラインから-a引数を使用して、特定のアプリケーションでドキュメントを開くことができます。

たとえば、現在のディレクトリにあるすべてのhtmlファイルを開きます。

> open -a 'Google Chrome' *.html

Atomテキストエディタでindex.htmlとJavaScriptコントローラファイルを開きます。

> open -a 'atom' index.html js/controllers/*.js

必要に応じて、これをAutomatorサービスに変更し、選択したファイルパスを引数として使用してショートカットキーを割り当てることができます。

ファイルを入力として受け取り、選択したファイルをChromeで開くAutomator AppleScriptの例を次に示します。

on run {input, parameters}
set openFiles to "open -a 'Google Chrome' " --note the trailing space
set filePaths to {}

--covert the filePaths to posix style
repeat with i from 1 to count of input
    set aFile to input's item i as alias
    set aFile to quoted form of POSIX path of aFile
    set filePaths's end to aFile
end repeat

--convert filePaths list to a string delimited by spaces
set tid to text item delimiters
set text item delimiters to " "
set filePaths to filePaths as text
set text item delimiters to tid

--Open files via commandline
do shell script openFiles & filePaths
return input

エンドラン

もちろん、アプリ名「Sublime」のテキストエディターを変更して別のサービスとして保存し、両方にショートカットキーを割り当てることもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.