Skip to main content

A macOS command-line utility for switching default file associations by file extension

Project description

macdefault

A macOS command-line utility for switching default file associations by file extension.

Overview

macdefault changes the default app for any file extension using macOS LaunchServices and duti. It also includes preset switches for common office suites.

What it does:

  • Pick a default app for any extension interactively (--ext=mp3).
  • Switch office presets in one command (--microsoft, --wps, --apple).
  • Show current defaults and installed bundle IDs for troubleshooting.

Preset extensions (suite mode):

  • doc, docx, xls, xlsx, ppt, pptx, rtf, csv

Requirements

  • macOS
  • Python 3.10+
  • duti (brew install duti)

Quick Start with uv

brew install duti
uv tool install macdefault
macdefault --help

Installation

pip

python -m pip install macdefault
macdefault --help

From source (development)

git clone https://github.com/ac1982/macdefault.git
cd macdefault
uv sync
uv run macdefault --help

Usage

Set any extension

Choose a default app for a specific extension:

macdefault --ext=mp3

Show candidates without making changes:

macdefault --ext=mp3 --show

Interactive selection:

  • Up/Down arrows to move
  • Enter to confirm
  • 1-9 to quick select
  • q to cancel

Switch office suites

Switch all preset extensions to Microsoft Office:

macdefault --microsoft
# or
macdefault --office

Switch to WPS Office:

macdefault --wps
# or
macdefault --kingsoft

Switch to Apple iWork:

macdefault --apple

Diagnostics

Print a summary of installed suites:

macdefault --print-bundle-ids

Full diagnostic output (bundle IDs + current defaults):

macdefault --doctor

Additional options

Dry run (preview changes without applying):

macdefault --microsoft --dry-run

Disable verification (skip checking if changes succeeded):

macdefault --wps --no-verify

Fail fast (stop on first error):

macdefault --apple --fail-fast

How It Works

  1. Discovery: scans common application directories (/Applications, etc.)
  2. UTI matching: uses macOS Uniform Type Identifiers to find apps that support each extension
  3. LaunchServices: registers apps with lsregister when needed
  4. duti: applies defaults via duti -s <bundle-id> <extension> all
  5. Verification: checks that changes were applied correctly

Special handling

  • WPS Office: uses a stable path (/Applications/wpsoffice.app) since LaunchServices name lookup can be unreliable
  • Microsoft Word .doc: includes repair logic if the default does not stick

Troubleshooting

"duti not found"

  • Install via: brew install duti

"Microsoft Office apps not fully resolvable"

  • Ensure Word, Excel, and PowerPoint are installed in /Applications
  • Try running macdefault --print-bundle-ids to see what is detected

Changes do not stick for .doc

  • The script re-registers Word with LaunchServices and tries multiple UTI identifiers

App not appearing in --ext list

  • The app must declare support for that file type in its Info.plist
  • Workaround: Finder right-click file -> Open With -> Other -> Change All

Project Structure

macdefault/
├── macdefault.py       # Main script
├── pyproject.toml      # Project metadata and dependencies
├── README.md           # This file
├── .python-version     # Python version specification
└── .gitignore          # Git ignore rules

Development

Running tests

# Add tests in the future
uv run pytest

Code formatting

# Add formatters as dev dependencies if needed
uv add --dev ruff black
uv run black macdefault.py
uv run ruff check macdefault.py

Technical Details

  • Uses mdls for fast metadata queries when available
  • Falls back to parsing Info.plist directly
  • Filters out overly-generic UTIs (public.data, public.item, public.content)
  • Supports wide Unicode characters in table output via wcwidth
  • Interactive mode supports q to cancel

License

MIT License - See LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

macdefault-0.2.3.tar.gz (46.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

macdefault-0.2.3-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file macdefault-0.2.3.tar.gz.

File metadata

  • Download URL: macdefault-0.2.3.tar.gz
  • Upload date:
  • Size: 46.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for macdefault-0.2.3.tar.gz
Algorithm Hash digest
SHA256 d5010c8ccfe7aa5f2f20d823a44630e7edf028540fcf1a56f4081c130de3691d
MD5 93e2f164fa7464437f674358f9eb1c33
BLAKE2b-256 8a4014da71cf1f5b8ce698a4a35e20f8f0db34173acb5053600122f23deb4bfe

See more details on using hashes here.

File details

Details for the file macdefault-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: macdefault-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for macdefault-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 885bd6b4c3c829d795806c5253676085a37c575234d9e4086e66b35c4b9211e4
MD5 942db61e49ed45209428bccd793325e8
BLAKE2b-256 b50b342c5b2f1214f4363a0568971c090726cc6c74c902e5ca1bbf31f78d1b4c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page