Jak usunąć pojedynczy element z menu „Otwórz ostatnie” w systemie Mac OS X?

8

Większość aplikacji Mac OS X na bazie dokumentów mają ---> Otwórz ostatni ... Plik menu. To jest lista ostatnio otwieranych plików w programie. Usunięcie wszystkich przedmiotów jest łatwe; po prostu wybierz Wyczyść menu .

Czasami jednak możesz po prostu chcieć usunąć pojedynczy element lub dwa, a nie wszystko, na przykład plik, który już nie istnieje lub taki, którego już nigdy nie chcesz oglądać. Jak usunąć pojedynczy element z listy Otwórz ostatnie bez usuwania czegokolwiek innego?

Otwórz ostatni ... przykład

Dave Gallagher
źródło
1
Pliki, które już nie istnieją, nie są wyświetlane we wszystkich aplikacjach, które prawidłowo implementują menu Otwórz ostatnie (nie zmieniając domyślnego ustawienia Cocoa).
Daniel Beck

Odpowiedzi:

14

W większości aplikacji ostatnie dokumenty specyficzne dla aplikacji znajdują się w pliku o nazwie:

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

Aby wyświetlić listę wszystkich tych plików w Terminalu, wprowadź następujące dane:

ls -Ad Library/Preferences/* | grep LSSharedFileList

W systemie Mac OS X 10.6 pliki te są (zwykle) w formacie binarnym.

Użyj Edytora list właściwości (Apple Developer Tools / Xcode 3) lub Xcode 4, aby je wyświetlić i edytować.

Są one ponownie czytane po uruchomieniu aplikacji, a nie podczas jej działania. Musisz zamknąć aplikację podczas edycji tego pliku.


Chyba się nudziłem ...

#!/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

Stosowanie:

$ ./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
Daniel Beck
źródło
Ha ha, dzięki za scenariusz! Niezwykle pomocny! :)
Dave Gallagher
Wiem, że minęło trochę czasu, ale właśnie teraz chwytam ten skrypt. Wielkie dzięki za poświęcenie czasu na napisanie tego.
Rob
@Rob Nie ma za co. Pamiętaj, że zostało to napisane, gdy OS X 10.6 Snow Leopard był aktualną wersją, więc od tego czasu mogło się to zmienić.
Daniel Beck
W Mavericks konieczne jest wylogowanie, aby zmiany zostały zapisane (przed ponownym otwarciem xCode)!
natanavra
2

To, o co prosisz, nie jest obsługiwaną funkcją.

Istnieją jednak instrukcje sugerujące, że można usunąć poszczególne elementy poprzez edycję /Users/YOURUSERNAME/Library/Preferences/com.apple.recentitems.plist, a następnie wylogowanie i ponowne zalogowanie.

Ten plik dotyczy jednak historii całego systemu; Nie mogłem znaleźć listy specjalnie dla historii podglądu. Zakładając, że używasz systemu Leopard lub nowszego, plik plist jest binarny, więc podstawowy edytor tekstowy go nie obsłuży. Text Wrangler to darmowy edytor, który może obsługiwać listy binarne.

Źródło: Usuwanie pojedynczych elementów z listy „Najnowsze elementy”

jcardinal
źródło