I ran it and my Mnemonics.plist went from 1.4MB to 889KB. I guess in six years
of usage QS learned a lot about what I typed. :)
QS seems to be working fine and startup does seem a little faster.
Howard
On Nov 9, 2011, at 11:09 AM, Rob McBroom wrote:
> On Nov 7, 2011, at 3:16 PM, Patrick Robertson wrote:
>
>> * Rob's done a bit of work cleaning up mnemonics, he'll probably have a good
>> idea where the things are stored.
>> * He may also be able to send over a script that can 'clean up' your
>> mnemonics.
>
> The script makes up for a previous bug as described in the fix.
>
> https://github.com/quicksilver/Quicksilver/pull/446
>
> It’ll remove useless entries [potentially] speeding up the matching process.
> We’ve talked about including the script in a couple of Quicksilver releases
> and having it run in the background, but I’m not sure of the best way to
> handle that.
>
> Feel free to run it manually for now (`python clean_mnemonics.py` in the
> Terminal). Your original file will be copied to the Desktop. Hang onto it in
> case you run into any problems. It’ll quit Quicksilver for you and restart it
> after, so leave it up and running.
>
> --
> Rob McBroom
> <http://www.skurfer.com/>
>
>
>
> --
> Rob McBroom
> <http://www.skurfer.com/>
>
import os
import sys
import plistlib
from shutil import copy
from commands import getstatusoutput
qsquit = getstatusoutput('osascript -e \'tell application "Quicksilver" to quit\'')
if qsquit[0] > 0:
print 'Unable to quit Quicksilver'
sys.exit(qsquit[0])
home = os.getenv('HOME', '')
plist_path = home + '/Library/Application Support/Quicksilver/Mnemonics.plist'
# plist_path = home + '/Desktop/Mnemonics.plist'
## back up the original to ~/Desktop if this is the first run
if not os.path.exists(home + '/Desktop/Mnemonics.plist'):
copy(plist_path, home + '/Desktop/')
mnemonics = plistlib.readPlist(plist_path)
cleaned = {
'abbreviation': {},
'implied': {},
}
## check these paths for files that no longer exist
prefixes = [
home,
'/Applications',
]
## by abbrevation
for (abbr, vals) in mnemonics['abbreviation'].items():
## get rid of empty abbreviations
if abbr == '': continue
## get single-object items
singles = []
for v in vals:
if ' /' in v: continue
if True in [v.startswith(pf) for pf in prefixes]:
if not os.path.exists(v): continue
singles.append(v)
if len(singles) > 0:
cleaned['abbreviation'][abbr] = singles
## by object
for (qso, abbrs) in mnemonics['implied'].items():
## remove references to multiple objects
if ' /' in qso: continue
## remove references to files that don't exist
## (but only from common locations on the mounted volume)
if True in [qso.startswith(pf) for pf in prefixes]:
if not os.path.exists(qso): continue
## remove empty abbreviations
for (abb, count) in abbrs.items():
if abb == '': continue
if cleaned['implied'].has_key(qso):
cleaned['implied'][qso][abb] = count
else:
cleaned['implied'][qso] = {}
cleaned['implied'][qso][abb] = count
# plistlib.writePlist(cleaned, home + '/Desktop/clean.plist')
plistlib.writePlist(cleaned, plist_path)
relaunch = getstatusoutput('open -a Quicksilver')