| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | #!/usr/bin/python | 
					
						
							| 
									
										
										
										
											2009-02-12 19:23:49 +00:00
										 |  |  | #This code is licensed under the GPL, version 3. | 
					
						
							|  |  |  | #A full copy of the license can be obtained by contacting the author at the following email adress: joel.schaerer@laposte.net | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | from __future__ import division | 
					
						
							|  |  |  | import cPickle | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | from sys import argv | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2008-06-02 15:43:38 +00:00
										 |  |  | import signal | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def signal_handler(arg1,arg2): | 
					
						
							|  |  |  |     print "Received SIGINT, trying to continue" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | signal.signal(signal.SIGINT,signal_handler) #Don't break on sigint | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-01 13:45:48 +00:00
										 |  |  | #add the following to your .bashrc: | 
					
						
							|  |  |  | """ | 
					
						
							|  |  |  | PROMPT_COMMAND='autojump.py -a $(pwd)' | 
					
						
							|  |  |  | function j { cd "$(autojump.py $1)"; } | 
					
						
							|  |  |  | """ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-02 15:43:38 +00:00
										 |  |  | max_keyweight=1000 | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  | def uniqadd(list,key): | 
					
						
							|  |  |  |     if key not in list: | 
					
						
							|  |  |  |         list.append(key) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | def dicadd(dic,key,increment=1): | 
					
						
							|  |  |  |     dic[key]=dic.get(key,0.)+increment | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-02 08:25:32 +00:00
										 |  |  | def match(path,pattern,path_dict,re_flags=0): | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  |     import re | 
					
						
							|  |  |  |     if os.path.realpath(os.curdir)==path : return False | 
					
						
							| 
									
										
										
										
											2008-09-02 08:25:32 +00:00
										 |  |  |     if re.search(pattern,"/".join(path.split('/')[-1-pattern.count('/'):]),re_flags) is None: | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  |         return False | 
					
						
							|  |  |  |     else:  | 
					
						
							|  |  |  |         if os.path.exists(path) : return True | 
					
						
							|  |  |  |         else: #clean up dead directories | 
					
						
							|  |  |  |             del path_dict[path] | 
					
						
							|  |  |  |             return False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  | optlist, args = getopt.getopt(argv[1:], 'a',['stat','import','completion'])  | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  | dic_file=os.path.expanduser("~/.autojump_py") | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     aj_file=open(dic_file) | 
					
						
							|  |  |  |     path_dict=cPickle.load(aj_file) | 
					
						
							|  |  |  |     aj_file.close() | 
					
						
							|  |  |  | except IOError: | 
					
						
							|  |  |  |     path_dict={} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ('-a','') in optlist: | 
					
						
							|  |  |  |     dicadd(path_dict," ".join(args)) | 
					
						
							|  |  |  |     cPickle.dump(path_dict,open(dic_file,'w'),-1) | 
					
						
							|  |  |  | elif ('--stat','') in optlist: | 
					
						
							|  |  |  |     a=path_dict.items() | 
					
						
							|  |  |  |     a.sort(key=lambda e:e[1]) | 
					
						
							|  |  |  |     for path,count in a[-100:]: | 
					
						
							|  |  |  |         print "%.1f:\t%s" % (count,path) | 
					
						
							|  |  |  |     print "Total key weight: %d" % sum(path_dict.values()) | 
					
						
							|  |  |  | elif ('--import','') in optlist: | 
					
						
							|  |  |  |     for i in open(" ".join(args)).readlines(): | 
					
						
							|  |  |  |         dicadd(path_dict,i[:-1]) | 
					
						
							|  |  |  |     cPickle.dump(path_dict,open(dic_file,'w'),-1) | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  |     completion=False | 
					
						
							|  |  |  |     if ('--completion','') in optlist: | 
					
						
							|  |  |  |         completion=True | 
					
						
							|  |  |  |         results=[] | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  |     keyweight=sum(path_dict.values()) #Gradually forget about old directories | 
					
						
							|  |  |  |     if keyweight>max_keyweight: | 
					
						
							|  |  |  |         for k in path_dict.keys(): | 
					
						
							|  |  |  |             path_dict[k]*=0.9*max_keyweight/keyweight | 
					
						
							|  |  |  |     if not args: args=[''] | 
					
						
							|  |  |  |     dirs=path_dict.items() | 
					
						
							|  |  |  |     dirs.sort(key=lambda e:e[1],reverse=True) | 
					
						
							| 
									
										
										
										
											2008-09-02 08:25:32 +00:00
										 |  |  |     import re | 
					
						
							|  |  |  |     found=False | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  |     for path,count in dirs: | 
					
						
							| 
									
										
										
										
											2008-09-02 08:25:32 +00:00
										 |  |  |         if match(path," ".join(args),path_dict): #First look for case-matching path | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  |             if not completion: | 
					
						
							|  |  |  |                 print path | 
					
						
							|  |  |  |                 found=True | 
					
						
							|  |  |  |                 break | 
					
						
							| 
									
										
										
										
											2009-02-13 23:39:54 +00:00
										 |  |  |             else:  | 
					
						
							|  |  |  |                 uniqadd(results,path) | 
					
						
							| 
									
										
										
										
											2009-01-14 10:22:31 +00:00
										 |  |  |     dirs=path_dict.items() #we need to recreate the list since the first iteration potentially deletes paths | 
					
						
							|  |  |  |     dirs.sort(key=lambda e:e[1],reverse=True) | 
					
						
							| 
									
										
										
										
											2008-09-02 08:25:32 +00:00
										 |  |  |     if not found: | 
					
						
							|  |  |  |         for path,count in dirs: | 
					
						
							|  |  |  |             if match(path," ".join(args),path_dict,re.IGNORECASE): #Then try to ignore case | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  |                 if not completion: | 
					
						
							|  |  |  |                     print path | 
					
						
							|  |  |  |                     break | 
					
						
							| 
									
										
										
										
											2009-02-13 23:39:54 +00:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     uniqadd(results,path) | 
					
						
							| 
									
										
										
										
											2009-02-13 22:22:32 +00:00
										 |  |  |     if completion: | 
					
						
							| 
									
										
										
										
											2009-02-13 23:39:54 +00:00
										 |  |  |         print " ".join(("%.4d)_%s" % (n,r) for n,r in enumerate(results))) | 
					
						
							| 
									
										
										
										
											2008-04-21 09:43:07 +00:00
										 |  |  |     cPickle.dump(path_dict,open(dic_file+".tmp",'w'),-1) | 
					
						
							|  |  |  |     import shutil | 
					
						
							|  |  |  |     shutil.copy(dic_file+".tmp",dic_file) #cPickle.dump doesn't seem to be atomic, so this is more secure |