30

Как я могу изменить приложение по умолчанию для всех файлов определенного типа файлов через Терминал в OS X?

2 ответа2

35

У меня есть более простой способ. Вы будете хотеть Homebrew, если у вас его еще нет:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Установить дути:

brew install duti

Теперь вам нужно найти идентификатор приложения, которое вы хотите использовать, и назначить его расширению, для которого вы хотите его использовать. В этом примере я уже использую скобки для *.sh и хочу также использовать его для файлов *.md вместо xcode.

Получите идентификатор приложения по умолчанию для файлов .sh :

duti -x sh

output:
  Brackets.app
  /opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
  io.brackets.appshell

Последняя строка - это идентификатор.

Используйте этот идентификатор приложения для всех файлов .md :

duti -s io.brackets.appshell .md all
17

Правка ~/Library/Preferences/com.apple.LaunchServices.plist .

Добавьте запись в LSHandlers , содержащую UTI (ключ LSHandlerContentType , например, public.plain-text) и идентификатор пакета приложения (LSHandlerRoleAll , например, com.macromates.textmate).

В редакторе списка свойств это выглядит так:

альтернативный текст альтернативный текст

Чтобы сделать это из командной строки, используйте defaults или /usr/libexec/PlistBuddy . Оба имеют обширные страницы управления.

Например, чтобы открыть все файлы .plist используя Xcode:

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'

Конечно, вам нужно убедиться, что в UTI com.apple.property-list уже нет другой записи.

Вот более полный скрипт, который удалит существующие записи для UTI и добавит новую. Он может обрабатывать только LSHandlerContentType и всегда устанавливает LSHandlerRoleAll , а вместо параметров имеет жестко заданные идентификаторы комплекта. Помимо этого, он должен работать довольно хорошо.

#!/usr/bin/env bash

PLIST="$HOME/Library/Preferences/com.apple.LaunchServices.plist"
BUDDY=/usr/libexec/PlistBuddy

# the key to match with the desired value
KEY=LSHandlerContentType

# the value for which we'll replace the handler
VALUE=public.plain-text

# the new handler for all roles
HANDLER=com.macromates.TextMate

$BUDDY -c 'Print "LSHandlers"' $PLIST >/dev/null 2>&1
ret=$?
if [[ $ret -ne 0 ]] ; then
        echo "There is no LSHandlers entry in $PLIST" >&2
        exit 1
fi

function create_entry {
        $BUDDY -c "Add LSHandlers:$I dict" $PLIST
        $BUDDY -c "Add LSHandlers:$I:$KEY string $VALUE" $PLIST
        $BUDDY -c "Add LSHandlers:$I:LSHandlerRoleAll string $HANDLER" $PLIST
}

declare -i I=0
while [ true ] ; do
        $BUDDY -c "Print LSHandlers:$I" $PLIST >/dev/null 2>&1
        [[ $? -eq 0 ]] || { echo "Finished, no $VALUE found, setting it to $HANDLER" ; create_entry ; exit ; }

        OUT="$( $BUDDY -c "Print 'LSHandlers:$I:$KEY'" $PLIST 2>/dev/null )"
        if [[ $? -ne 0 ]] ; then 
                I=$I+1
                continue
        fi

        CONTENT=$( echo "$OUT" )
        if [[ $CONTENT = $VALUE ]] ; then
                echo "Replacing $CONTENT handler with $HANDLER"
                $BUDDY -c "Delete 'LSHandlers:$I'" $PLIST
                create_entry
                exit
        else
                I=$I+1 
        fi
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .