如何从Mac OS X的“最近打开”菜单中删除单个项目?


8

大多数基于文档的Mac OS X应用程序都有一个文件--->打开最近...菜单项。这是您使用该程序打开的最近文件的列表。删除所有项目很容易;只需选择清除菜单

但是,有时您可能只想删除一个或两个而不是所有内容,例如一个不再存在的文件,或者一个您不想再看到的文件。如何从“最近打开”列表中删除单个项目,而不删除其他任何内容?

打开最近...示例


1
不再存在的文件不会显示在正确实现“ 打开最近”菜单的所有应用程序中(通过不更改Cocoa默认值)。
丹尼尔·贝克

Answers:


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

哈哈,谢谢你的剧本!极有帮助!:)
Dave Gallagher

我知道已经有一段时间了,但是我现在正在抓取这个脚本。非常感谢您抽出宝贵的时间来编写它。
罗布

@Rob不客气。请注意,这是在OS X 10.6 Snow Leopard是当前发行版时编写的,因此此后可能已经发生了变化。
丹尼尔·贝克

在Mavericks上,需要注销才能保存更改(在重新打开xCode之前)!
natanavra

2

您要求的不是受支持的功能。

但是,有些说明建议可以通过编辑/Users/YOURUSERNAME/Library/Preferences/com.apple.recentitems.plist,然后注销并重新登录来删除单个项目。

该文件是针对系统范围的历史记录的;我找不到专门用于预览历史记录的列表。假设您正在运行Leopard或更高版本,则plist文件是二进制文件,因此基本的文本编辑器将无法处理它。Text Wrangler是一个免费的编辑器,可以处理二进制文件。

来源:从“最近的项目”列表中删除单个项目

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.