開いているアプリケーションとタブの状態をファイルに保存して復元できるようにする


6

私は同じアプリケーションがインストールされている2台のコンピュータを持っています、そして私は仕事に両方を使います。私は一方から他方へシームレスに移動したいと思います 前のアプリケーションで開いていたアプリケーションの状態をコマンドで再現する

というアプリケーションを調べました。 キーボードマエストロ しかし、開いているアプリケーションやタブを任意に保存することはできないようで、代わりに特定のマクロを作成します。

AppleScriptを使えば、多分私はオープンなアプリケーションのリストを使うことができます。

osascript -e 'tell application "System Events" to get name of every process where visible is true'

しかし、私はそこからどこへ行くのか、それが可能でさえあるのかどうかわからない。

多分私は代わりにユーザーセッションを調べるべきです。誰かが私が同期するべきだと提案しました ~/Library/Preferences/ByHost/com.apple.loginwindow.* 2台のコンピュータにまたがっていますが、それだけで十分であるかどうかはわかりません。ログアウトしてからログインし直す必要があります。これは望ましくありません。

これを達成する方法についての任意のポインタ?

範囲

プログラムを「ホットリロード」できなくても問題ありません。ウィンドウの位置も一つではありません。キーストロークで、保存した状態ファイルからすべてを閉じてアプリケーションを開くことができれば、それで十分です。他のコンピュータで開いていたファイルを開くアプリに関するものがほとんどです。私が複数の保存された状態を持つことができれば(例えばプロジェクトごとに1つ)、それは素晴らしいことです。私はいくつかの初期コードを取得できれば私はそこからそれを取ることができる


両方のマシンがSavedStateファイルへのデータの読み書きが可能な共有ファイルシステムにアクセスできなければ、なぜそれが不可能になるのでしょうか。どのようにしてこれを達成しますか?あ iCloud フォルダが適している ドロップボックス フォルダ。あなたのマシンがインターネット上の固定IPアドレスでアクセス可能であれば、それらの間でAppleScriptからApple Eventsを送ることさえできますが、私はこれが最初の試み方法ではないと思います。私は、各コンピュータ上のスクリプトと、その2つの間で同期する共有のSavedStateファイルに目を向けました。
CJK

それが目標です。質問は どうやって 。誰かが私が同期することを提案しました ~/Library/Preferences/ByHost/com.apple.loginwindow.* 2台のコンピュータ間で。
ajf-

それだけでは不十分ですが、前提は良いものです。私は考えを持ち、あなたに戻ります。アプリケーションごとに固有のものがあります .savedstate ファイルなので、調べます。
CJK

ありがとうございます。私は注意を引くことができるかどうか見るために同様に賞金を始めました。あなたの提案に従って、私は調べてきました ~/Library/Saved Application State/。そのディレクトリとAppleScriptを同期させているようです。 開くアプリケーション トリックをすることができますか?
ajf-

回答:


2

注:まだ回答中です...

アプリケーションの実行状態を同期するスクリプトの詳細を記述するためのもう1つの節私は最初にこれらのスクリプトを書かなければなりません。


目的

大まかに言って、2つのMacがアプリケーションの状態やプロパティ、ロードされたドキュメント、アクティブに実行されているアプリケーションなど、ユーザー環境に関する情報を保存および共有する手段を考案する

あなたの最初の要求は あるマシンから別のマシンへシームレスに移動し、前のアプリケーションで開いていたアプリケーションの状態をコマンドで再現します。 あなたはそれ以来あなたの期待を少し緩和し、そして「ホットリロード」アプリケーションが求められていないこと、そしてウィンドウのサイズや位置のような細目は問題ではないことを明らかにしました。

概念的な方法論

1. 2つのスクリプトと1つの共有データファイル

私の最初のアイデアは、アプリケーション環境に関する情報を取得し、それを両方のマシンがアクセスできる共有ファイルに保存することを担当するハンドラを持つスクリプト(おそらくAppleScript)を各マシンにコピーすることでした。経由 ドロップボックス iCloud ……)スクリプトには、この共有ファイルの内容を取得して設定をローカル環境に適用するための個別のハンドラがあります。これは、設定を適用するためにユーザーがマシンに到着したときに一度スクリプトを実行することを要求します。また、新しい設定で共有データファイルを更新するためにマシンを離れる直前に一度。

2。 .savedState 同期

私の2番目の考えは、次の場所にあるファイルを同期するという他の人の概念からヒントを得たものです。 ~/Library/Preferences/ByHost/com.apple.loginwindow.*。そうしても意味がありませんが、同期するかどうかという問題が生じます。 .savedState フォルダ内のファイル ~/Library/Saved Application State 解決策だろう。

確かに、2つの異なるシステム間でこれらのファイルを同期しようとすることによる完全な悪影響が何かを知ることはできません。それは悪いことが起こると言うことではありませんが、それは未知の領域なので、望ましくない結果の可能性があります。しかし、私の考えでは、それが大体において安全であり、恐らく全く無害であるということです。 .savedState 解決策は、ファイルを削除することです。 .savedState ファイルを作成し、問題のアプリケーションが新しいファイルを生成できるようにします。

私はこれら二つの方法の組み合わせが必要になると思う。

同期中

を同期しています ~/ Dropbox経由のフォルダ

ホームフォルダを同期しても、各マシンでドキュメントを利用できるようにするための手段しか提供されていない可能性がありますが、おそらく同期することはできません ~/Library 場所を変更できない場合は、フォルダまた、このフォルダのサイズは私のシステムでは26GBなので、追加のクラウドストレージスペースの購読料を支払う必要があります。

最終的に、ホームフォルダの同期がに限定されている場合 DownloadsDocumentsMusic、そして Movies、それを持っていることよりも多くの利益ではありません Documents そして Desktop フォルダを同期しました iCloud

ただし、両方のコンピューター上の同じファイルにアクセスし、一方の変更をもう一方のコンピューターに反映させることが重要になるため、文書を同期させることは重要です。 iCloud 非常に遅いですが、この仕事には問題ありません。

を同期しています ~/Library フォルダ

~/Library フォルダ、または少なくともその特定のサブフォルダは、 .savedState システム間でアプリケーションの状態をマッピングするためのファイル。ホームクラウドストレージソリューションはこのタスクには理想的です。サブスクリプション料はかかりません。あなたの機密データはあなたの所持品としては安全であり、 ドロップボックス または 林檎 ;インターネットを介して同期している場合は、ISPによって課される速度以外に速度調整はありません。

私はすでに使っています Resilio Sync これは、個人使用は無料で、ピアツーピア転送を使用して、アプリケーションをインストールした任意のマシンまたはデバイス間で選択したフォルダを同期させることができます。それを選択するのは簡単な場合です ~/Library フォルダまたは ~/Library/Saved Application State フォルダを監視してリアルタイムで同期します。フォルダはそのままにしておくことができます。追加機能の支払いをする場合(一括払い)、フォルダ内の個々のファイルを選択的に同期し、データセキュリティのためにそれらを暗号化できます。私は本当にこのアプリケーションをお勧めします、そしてそれはこの特定の状況にとって理想的なようです。

スクリプティング

同期している場合 .savedState ファイルが成功した場合、他のマシンで実行されていたアプリケーションを開く(または開く)ためのスクリプトが必要になるかもしれません。再オープンすることで、アプリケーションに最新の情報を読み取らせることができます。 .savedState ファイルを作成し、他のシステムでの状態を複製します。これは部分的に成功すると思いますが、おそらく全部ではないでしょう。

実行中のアプリケーションのリストを取得する

アプリケーションが実行されているかどうかをテストするにはさまざまな方法があり、完璧なテストはないため、これは実際よりも複雑です。ウィンドウに表示されるアプリケーションはフォアグラウンドにあります。バックグラウンドプロセスとして実行されている、メニューバーアプリケーション、ウィンドウのないものもあります。また、ドックに隠されたアプリケーションが最小化され、表示ウィンドウが表示されないこともあります。

AppleScriptでいくつかの異なるメソッドを試した後、このコード行は、メニューバーアプリケーションを含む、実行中のアプリケーションの優れた包括的なリストを生成するようです。

    tell application "System Events" to set OpenApps to the ¬
        name of every application process whose ¬
        class of its menu bar contains menu bar and ¬
        POSIX path of the application file does not start with "/System" and ¬
        POSIX path of the application file does not start with "/Library"

結果を返すのに数秒かかりますが、スクリプトが賢明な方法で実装されている場合、速度がそれほど問題になるとは思わない。

実行中のアプリケーションのリストを取得するBashメソッドはこれです。

    IFS=$'\r\n'; basename $( \
    egrep -i -e '^/Applications/.*\.app/Contents/MacOS/[^/]+$' \
    <<<"$(ps -U 501 -o 'comm')" ) | sort -u

高速です(瞬時)が、メニューバーやバックグラウンドアプリケーションがいくつか欠けています。

キャプチャする最も重要なアプリケーションはフォアグラウンドで対話しているものであり、それらはほとんどのメソッドで捕捉されるため、どちらの方法でも最終的には必要なものに適していると思います。

共有設定ファイルに情報を保存する

保存する必要がある設定を書くことはaにすることができます .plist 格納するファイル キーと値のペア データ型と一緒にデータの。これにより、任意の値をその名前で保存および取得できます。また、AppleScriptまたはコマンドラインユーティリティを使用してプログラム的に読み書きするのも比較的簡単です。 plutil

共有設定ファイルが次の場所に保存されると仮定しましょう。 ~/Example/savedState.plist どこで ~/Example/ 両方のコンピュータがアクセスできるある種の共有フォルダ(クラウドストレージフォルダなど)です。

AppleScriptを使用して、これは現在開いているアプリケーションのリストを保存する方法です。

    property plist : "~/Example/SavedState.plist"

    tell application "System Events"
        if not (the file plist exists) then make new property list file ¬
            with properties {name:plist}

        set plistf to the property list file named plist

        tell plistf to make new property list item with properties ¬
            {name:"OpenApps", kind:list, value:OpenApps}
    end tell

ここで変数 OpenApps 上記のAppleScriptスニペットからのものです。賢く、 make new property list コマンドは 上書きする すでに名前が付いている既存のキー/値項目 "OpenApps"だから、それは重複しません。

次に、システム上のアプリケーションを終了する方法が必要です。

    to kill(A as list, X as list)
        local A, X

        if A = {} then return

        script jury
            property A0 : item 1 of A
            property An : rest of A
            property OK : A0 is not in X
        end script

        tell the jury
            ignoring application responses
                if its OK then quit the application named (its A0)
                kill(its An, X)
            end ignoring
        end tell
    end kill

これは終了するアプリケーションのリストを渡される再帰ハンドラです(パラメータ A )および除外するアプリケーションのリスト(パラメータ) X )それはそれからリストを一つずつ調べ、適用がのものの1つでないことを点検 X それをやめてリストの残りに移動する前に。

文書を再度開く

同期の使用を採用することによって .savedState 1つのシステム上のアプリケーションが一度初期化されると(それを閉じて再び開くなどして)、もう一方のシステムで開かれていた文書が再び開かれることを望みます。

しかし、私たちが知ることができる(私たちの能力の範囲で)オープンでアクティブなドキュメントの私たち自身のリストを保存することが賢明であるかもしれません。


[解答に統合するための私への注意]

  • 私はそのいくつかに気づいた .savedState ファイルは ~/Library/Saved Application State エイリアスとして 実際のファイル自体ではなく(シンボリックリンク)。これらは通常リンクしています ~/Library/Containers/%bundle-id%/Data/Library/Saved Application State/%file% どこで %bundle-id% 例えば、 com.apple.Previewとその対応 %file% です com.apple.Preview.savedState

この意味は ~/Library/Containers 2台のマシン間でも同期する必要があります。

  • .savedState アプリケーションが正常に終了するたびにファイルは削除されます。したがって、1つのシステム上でアプリケーションを閉じると、それらのデータファイルが削除され、それらの削除が他のマシンと同期される可能性があります。

1

以前(Sierraより前)は、ポータブルホームディレクトリをネットワーク上に格納しておけば、同じユーザープロファイルで複数のマシンを簡単に使用できます。もちろん、数百ギガバイトのデータが含まれていないユーザープロファイルに最適です。有線LAN上でこのアプローチのパフォーマンスは非常によく、私が働いていたいくつかの場所はホットデスクを可能にするためにそれを使いました。

まだサポートされているこのような唯一のものはモバイルアカウントです。 https://support.apple.com/kb/ph25671

あるいは、iCloud Driveを使って同期することもできます。 ~/Desktop そして ~/Documents 必要な追加フォルダ

または、Homeフォルダを使ってクラウドに保存する方法もあります 同期 、Dropboxなど何でも。 https://www.amsys.co.uk/using-cloud-storage-sync-home-folder-macs/

これらはすべて1度に使用されているコンピュータを1台だけにするため、おそらく適切ではないでしょうか。


1
うまくいくでしょう。可能であれば、同時に1つは避けたいのですが、両方を同時に「使用」することはおそらくないので、リアルタイムではないと思います...ありがとう
ajf-

それでは、あるマシン上の個々のアプリケーションの状態を別のマシンのミラーに「復元」(転送)するために、これをどのように利用するのでしょうか。具体的には、ウィンドウの開き方、サイズ、配置方法、ドキュメントの適切なロード方法などについて説明します。
CJK

保存国はそれをすべきです
Matt Sephton

単に置き換えるだけではありません .savedstate ファイルそれらを置き換えても、時代遅れのウィンドウを閉じたり、新しいウィンドウを開いたり、サイズを変更したり再配置したり、ドキュメントをロードしたりすることはありません。 .savedstate データとそれに基づいて行動する。 (PS。あなたが返信する場合は私にタグを付けてください。
CJK

1
なるほど。これらの詳細を以前に知っておくと便利でした。窓や位置などを元に戻す方法についてのハードルにあったので答えを出すのを差し控えました。しかしそれは問題を幾分容易にする。時間があれば、おそらくあなたの質問を修正して、具体的に自分のものを含めることができます。 行う あなたがしないものに対して要求する。また、どのようなアプリケーションが関与しているかによっても異なります。これは、ドキュメントがスクリプトによって登録される方法に影響します。
CJK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.