Open6

Arcの設定移行

DANDAN

以下は同期できてない

  • Favorite tabs (サイドバー上部にピン留めされてるタブ)
  • 拡張機能
  • キーボードショートカット
  • その他設定
    • アイコンのデザイン
    • URL全体を表示する
    • Arc Max、何を使うか
DANDAN

拡張機能とか設定とかを移行するスクリプトを書いてみたけどダメだった。
拡張機能のファイルは移行されても、Arcに拡張機能が認識されない、、、

arc-backup.sh
#!/bin/bash
# Arcを終了
osascript -e 'tell application "Arc" to quit'
sleep 2

# バックアップ先ディレクトリ
BACKUP_DIR=~/Dropbox/ArcBackup
mkdir -p $BACKUP_DIR

# 日付を含むバックアップファイル名
BACKUP_FILE=$BACKUP_DIR/arc_settings_$(date +%Y%m%d_%H%M%S).tar.gz

# 必要なディレクトリをバックアップ
echo "Arcの設定をバックアップしています..."

# 一時ディレクトリを作成
TEMP_DIR=$(mktemp -d)
mkdir -p $TEMP_DIR/Arc_Backup

# 必要なファイル/ディレクトリをコピー
ARC_DATA=~/Library/Application\ Support/Arc/User\ Data/Default

# 拡張機能関連
cp -R "$ARC_DATA/Extensions" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp -R "$ARC_DATA/Extension State" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp -R "$ARC_DATA/Extension Rules" "$TEMP_DIR/Arc_Backup/" 2>/dev/null

# 設定関連
cp "$ARC_DATA/Preferences" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp "$ARC_DATA/Secure Preferences" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp ~/Library/Application\ Support/Arc/User\ Data/Local\ State "$TEMP_DIR/Arc_Backup/" 2>/dev/null

# ブックマーク/履歴
cp -R "$ARC_DATA/Bookmarks" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp -R "$ARC_DATA/Favicons" "$TEMP_DIR/Arc_Backup/" 2>/dev/null

# Arc固有の設定
cp -R "$ARC_DATA/Arc Spaces" "$TEMP_DIR/Arc_Backup/" 2>/dev/null
cp -R "$ARC_DATA/Arc Settings" "$TEMP_DIR/Arc_Backup/" 2>/dev/null

# アーカイブ作成
tar -czf "$BACKUP_FILE" -C "$TEMP_DIR" Arc_Backup

# 一時ディレクトリを削除
rm -rf "$TEMP_DIR"

echo "Arcの設定をバックアップしました: $BACKUP_FILE"
arc-restore.sh
#!/bin/bash
# Arcを終了
osascript -e 'tell application "Arc" to quit'
sleep 2

# バックアップ元ディレクトリ
BACKUP_DIR=~/Dropbox/ArcBackup

# 最新のバックアップファイルを取得
BACKUP_FILE=$(ls -t $BACKUP_DIR/arc_settings_*.tar.gz | head -1)

# バックアップファイルの存在確認
if [ -z "$BACKUP_FILE" ]; then
  echo "バックアップファイルが見つかりません: $BACKUP_DIR/arc_settings_*.tar.gz"
  exit 1
fi

echo "次のバックアップファイルから復元します: $BACKUP_FILE"

# 一時ディレクトリを作成
TEMP_DIR=$(mktemp -d)

# アーカイブを展開
tar -xzf "$BACKUP_FILE" -C "$TEMP_DIR"

# Arcのデータディレクトリ
ARC_DATA=~/Library/Application\ Support/Arc/User\ Data/Default

# 復元前に既存の設定をバックアップ
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_BEFORE_RESTORE=~/ArcBackupBeforeRestore_$TIMESTAMP
mkdir -p "$BACKUP_BEFORE_RESTORE"

echo "既存の設定を $BACKUP_BEFORE_RESTORE にバックアップしています..."

# 既存の設定全体をバックアップ
if [ -d "$ARC_DATA" ]; then
  cp -R "$ARC_DATA" "$BACKUP_BEFORE_RESTORE/" 2>/dev/null
fi

# 復元対象のディレクトリを一度削除してから復元(完全に上書きするため)
echo "バックアップから設定を復元しています..."

# 復元対象のディレクトリ/ファイルを削除
if [ -d "$ARC_DATA/Extensions" ]; then rm -rf "$ARC_DATA/Extensions"; fi
if [ -d "$ARC_DATA/Extension State" ]; then rm -rf "$ARC_DATA/Extension State"; fi
if [ -d "$ARC_DATA/Extension Rules" ]; then rm -rf "$ARC_DATA/Extension Rules"; fi
if [ -f "$ARC_DATA/Preferences" ]; then rm "$ARC_DATA/Preferences"; fi
if [ -f "$ARC_DATA/Secure Preferences" ]; then rm "$ARC_DATA/Secure Preferences"; fi
if [ -d "$ARC_DATA/Bookmarks" ]; then rm -rf "$ARC_DATA/Bookmarks"; fi
if [ -d "$ARC_DATA/Favicons" ]; then rm -rf "$ARC_DATA/Favicons"; fi
if [ -d "$ARC_DATA/Arc Spaces" ]; then rm -rf "$ARC_DATA/Arc Spaces"; fi
if [ -d "$ARC_DATA/Arc Settings" ]; then rm -rf "$ARC_DATA/Arc Settings"; fi

# 必要なディレクトリを作成
mkdir -p "$ARC_DATA"

# バックアップから設定を復元
cp -R "$TEMP_DIR/Arc_Backup/"* "$ARC_DATA/" 2>/dev/null

# 一時ディレクトリを削除
rm -rf "$TEMP_DIR"

echo "Arcの設定を復元しました"
echo "元の設定は $BACKUP_BEFORE_RESTORE に保存されています"
DANDAN

古いArcの拡張機能をリストアップして、拡張機能ページのリンク一覧のHTMLを出力するようにした。

#!/bin/bash
# Arcの拡張機能リストを生成するスクリプト

# Arcのデータディレクトリ
ARC_DATA=~/Library/Application\ Support/Arc/User\ Data/Default

# 拡張機能ディレクトリ
EXT_DIR="$ARC_DATA/Extensions"

# 出力ファイル
OUTPUT_FILE=~/Dropbox/settings/arc_extensions.html

# HTMLファイルのヘッダー
echo '<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Arc拡張機能リスト</title>
  <style>
    body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; }
    .extension { margin-bottom: 20px; padding: 10px; border: 1px solid #ddd; border-radius: 5px; position: relative; }
    .name { font-weight: bold; font-size: 18px; margin-left: 40px; }
    .id { color: #666; font-family: monospace; margin-left: 40px; }
    .install-btn { display: inline-block; margin-top: 10px; margin-left: 40px; padding: 5px 10px; background: #4285f4; color: white; text-decoration: none; border-radius: 3px; }
    .number { position: absolute; top: 10px; left: 10px; background: #f1f1f1; padding: 5px 10px; border-radius: 50%; font-weight: bold; }
  </style>
</head>
<body>
  <h1>Arc拡張機能リスト</h1>
  <p>以下のリンクをクリックして拡張機能をインストールしてください。</p>' > $OUTPUT_FILE

# 拡張機能ディレクトリが存在するか確認
if [ ! -d "$EXT_DIR" ]; then
  echo "  <p>拡張機能ディレクトリが見つかりません。</p>" >> $OUTPUT_FILE
  echo "</body></html>" >> $OUTPUT_FILE
  echo "拡張機能ディレクトリが見つかりません: $EXT_DIR"
  exit 1
fi

# カウンター初期化
counter=1

# 各拡張機能のIDとマニフェスト情報を取得
for ext_id in $(ls "$EXT_DIR"); do
  if [ -d "$EXT_DIR/$ext_id" ]; then
    # 最新のバージョンディレクトリを取得
    version=$(ls -1 "$EXT_DIR/$ext_id" | sort -V | tail -1)

    if [ -n "$version" ]; then
      manifest_file="$EXT_DIR/$ext_id/$version/manifest.json"

      if [ -f "$manifest_file" ]; then
        # マニフェストからnameを取得
        name=$(grep -o '"name": "[^"]*"' "$manifest_file" | head -1 | cut -d'"' -f4)

        # __MSG_extName__形式の名前を処理
        if [[ "$name" == *"__MSG_"* ]]; then
          # _locales/en/messages.jsonからの名前取得を試みる
          locale_file="$EXT_DIR/$ext_id/$version/_locales/en/messages.json"
          if [ -f "$locale_file" ]; then
            # メッセージキーを抽出 (__MSG_extName__から extName を取得)
            msg_key=$(echo "$name" | sed -n 's/__MSG_\(.*\)__/\1/p')
            # messagesファイルから該当するメッセージを取得
            actual_name=$(grep -A 5 "\"$msg_key\"" "$locale_file" | grep "message" | head -1 | cut -d'"' -f4)
            if [ -n "$actual_name" ]; then
              name="$actual_name"
            else
              # 英語がなければ他の言語を試す
              for lang_dir in $(ls "$EXT_DIR/$ext_id/$version/_locales/"); do
                locale_file="$EXT_DIR/$ext_id/$version/_locales/$lang_dir/messages.json"
                if [ -f "$locale_file" ]; then
                  actual_name=$(grep -A 5 "\"$msg_key\"" "$locale_file" | grep "message" | head -1 | cut -d'"' -f4)
                  if [ -n "$actual_name" ]; then
                    name="$actual_name"
                    break
                  fi
                fi
              done
            fi
          fi

          # それでも名前が取得できなければ、拡張機能IDを使用
          if [[ "$name" == *"__MSG_"* ]]; then
            name="拡張機能 (ID: $ext_id)"
          fi
        fi

        # Chrome Web Storeのリンクを生成
        echo "  <div class='extension'>
    <div class='number'>$counter</div>
    <div class='name'>$name</div>
    <div class='id'>ID: $ext_id</div>
    <a class='install-btn' href='https://chrome.google.com/webstore/detail/$ext_id' target='_blank'>インストール</a>
  </div>" >> $OUTPUT_FILE

        # カウンターを増やす
        ((counter++))
      fi
    fi
  fi
done

# HTMLファイルのフッター
echo '</body>
</html>' >> $OUTPUT_FILE

echo "拡張機能リストを生成しました: $OUTPUT_FILE"
echo "このHTMLファイルを開いて、各拡張機能のインストールボタンをクリックしてください。"
echo "合計 $((counter-1)) 個の拡張機能が見つかりました。"
DANDAN

これで新PCでは

  • Arcをインストール&ログイン(これでSpaceとブックマークは同期される)
  • スクリプトで生成されたhtmlファイルを元に、拡張機能を1つ1つダウンロード
  • 拡張機能の設定をする(Vimiumの設定ファイルをコピペしたりする)
  • Arcの設定を手動でポチポチやる
    • Ctrl + Mで過去開いたタブにアクセスできるようにする
  • PIN(上部に固定表示されるブックマーク)の設定を手動でポチポチやる

って感じで一通り移行できそう。