Як я можу змінити програму за замовчуванням для всіх файлів певного типу файлів через термінал в OS X?
Як я можу змінити програму за замовчуванням для всіх файлів певного типу файлів через термінал в OS X?
Відповіді:
У мене є більш простий спосіб. Ви хочете домашню мову, якщо у вас її ще немає:
/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
osascript -e 'id of app "$appName"'ідентифікатор будь-якого додатка, встановленого у вашій системі
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Редагувати ~/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
x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xскопіювати та вставити ці записи LSHandlers. Щоб отримати ідентифікатор пакета, ви можете це зробити osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
defaultsщо, здається, не здатний це зробити, і для цього потрібно кілька PlistBuddyдзвінків. Але це можливо зробити в сценарії оболонки для багаторазового використання.