Как удалить один элемент из меню «Открыть последние» в Mac OS X?

8

Большинство основанных на документе приложений Mac OS X имеют пункт меню File ---> Open Recent .... Это список последних файлов, которые вы открыли с помощью программы. Удалить все предметы легко; просто выберите Очистить меню .

Однако иногда вы можете просто захотеть удалить один или два элемента, а не все, например, файл, который больше не существует, или файл, который вы больше никогда не захотите видеть. Как удалить один элемент из списка «Открыть последние», не удаляя ничего другого?

Открыть последние ... пример

Дэйв Галлахер
источник
1
Файлы, которые больше не существуют, отображаются не во всех приложениях, в которых правильно реализовано меню « Открыть последние» (без изменения параметра «Какао по умолчанию»).
Даниэль Бек

Ответы:

14

В большинстве приложений последние специфичные для приложения документы находятся в файле с именем:

~/Library/Preferences/com.company.application.LSSharedFileList.plist

Чтобы перечислить все эти файлы в Терминале, введите следующее:

ls -Ad Library/Preferences/* | grep LSSharedFileList

В Mac OS X 10.6 эти файлы (обычно) представлены в двоичном формате.

Используйте Редактор списка свойств (Apple Developer Tools / Xcode 3) или Xcode 4 для просмотра и редактирования.

Они перечитываются при запуске приложения, а не во время его работы. Вам нужно закрыть приложение во время редактирования этого файла.


Я думаю, мне было скучно ...

#!/usr/bin/env bash

mode=$2
if [ -z "$mode" ] ; then
    echo "Usage:"
    echo "$0 <filename> ls       - list recent file entries in specified *.LSSharedFileList.plist"
    echo "$0 <filename> rm <idx> - remove recent file entry with given index from specified plist"
    exit 1
fi

if [ "$mode" != "ls" ] && [ "$mode" != "rm" ] ; then
    echo "second argument must be one of [ls, rm]"
    exit 1
fi

file=$1
if [ -z $file ] ; then
    echo "Need argument (recent items plist file)!"
    exit 1
fi
if [ ! -f $file ] ; then
    echo "File $file does not exist!"
    exit 1
fi

if [ "$mode" = "ls" ] ; then
    i=0
    cont=1
    while [ $cont ] ; do
        recentfilename=$( /usr/libexec/PlistBuddy -c "Print RecentDocuments:CustomListItems:$i:Name" $file 2>/dev/null )
        if [ "$?" -ne "0" ] ; then
            cont=
        else
            echo "$i - $recentfilename"
            i=$(( $i + 1 ))
        fi
    done
fi

if [ "$mode" = "rm" ] ; then
    i=$3
    if [[ $i =~ ^-?[0-9]+$ ]] ; then
        # argument is integer
        $( /usr/libexec/PlistBuddy -c "Delete RecentDocuments:CustomListItems:$i" $file )
    else
        echo "Expected integer, got $i as third argument"
        exit 1
    fi
fi

Применение:

$ ./editrecent.sh 
Usage:
./editrecent.sh <filename> ls       - list recent file entries in specified *.LSSharedFileList.plist
./editrecent.sh <filename> rm <idx> - remove recent file entry with given index from specified plist


$ ./editrecent.sh Library/Preferences/com.macromates.textmate.LSSharedFileList.plist ls
0 - rcd
1 - artifactory.sh
2 - py.py
3 - iTunes Music Library.xml
4 - iTunes Library.xml
5 - gradle-proxy-support.diff
6 - DefaultGradlePropertiesLoader.java
7 - DefaultGradlePropertiesLoader-proxy.java
8 - gradle-proxy-support.patch
9 - DefaultKeyBinding.dict
10 - DefaultKeyBindings.dict

$ ./editrecent.sh Library/Preferences/com.macromates.textmate.LSSharedFileList.plist rm 3

$ ./editrecent.sh Library/Preferences/com.macromates.textmate.LSSharedFileList.plist ls
0 - rcd
1 - artifactory.sh
2 - py.py
3 - iTunes Library.xml
4 - gradle-proxy-support.diff
5 - DefaultGradlePropertiesLoader.java
6 - DefaultGradlePropertiesLoader-proxy.java
7 - gradle-proxy-support.patch
8 - DefaultKeyBinding.dict
9 - DefaultKeyBindings.dict
Даниэль Бек
источник
Ха-ха, спасибо за сценарий! Очень полезно! :)
Дэйв Галлахер
Я знаю, что это было некоторое время назад, но я только что взял этот сценарий. Большое спасибо, что нашли время, чтобы написать это.
Роб
@Rob Не за что. Обратите внимание, что это было написано, когда OS X 10.6 Snow Leopard была текущей версией, поэтому с тех пор все могло измениться.
Даниэль Бек
На Mavericks требуется выход из системы для сохранения изменений (перед повторным открытием xCode)!
Натанавра
2

То, что вы просите, не поддерживается.

Однако есть инструкции, предлагающие удалить отдельные элементы, отредактировав их /Users/YOURUSERNAME/Library/Preferences/com.apple.recentitems.plist, выйдя из системы и вернувшись обратно.

Этот файл предназначен для истории всей системы; Я не смог найти список специально для истории предварительного просмотра. Предполагая, что вы используете Leopard или новее, файл plist является двоичным, поэтому базовый текстовый редактор не справится с этим. Text Wrangler - это бесплатный редактор, который может обрабатывать двоичные списки.

Источник: удаление отдельных элементов из списка «Недавние элементы».

jcardinal
источник