##// END OF EJS Templates
use package cache in import completer, for performance
vivainio -
Show More
@@ -1,115 +1,120 b''
1 1 """ Tab completion support for a couple of linux package managers
2 2
3 3 This is also an example of how to write custom completer plugins
4 4 or hooks.
5 5
6 6 Practical use:
7 7
8 8 [ipython]|1> import ipy_linux_package_managers
9 9 [ipython]|2> apt-get u<<< press tab here >>>
10 10 update upgrade
11 11 [ipython]|2> apt-get up
12 12
13 13 """
14 14 import IPython.ipapi
15 15 import glob,os,shlex
16 16
17 17 ip = IPython.ipapi.get()
18 18
19 19 def apt_completers(self, event):
20 20 """ This should return a list of strings with possible completions.
21 21
22 22 Note that all the included strings that don't start with event.symbol
23 23 are removed, in order to not confuse readline.
24 24
25 25 """
26 26 # print event # dbg
27 27
28 28 # commands are only suggested for the 'command' part of package manager
29 29 # invocation
30 30
31 31 cmd = (event.line + "<placeholder>").rsplit(None,1)[0]
32 32 # print cmd
33 33 if cmd.endswith('apt-get') or cmd.endswith('yum'):
34 34 return ['update', 'upgrade', 'install', 'remove']
35 35
36 36 # later on, add dpkg -l / whatever to get list of possible
37 37 # packages, add switches etc. for the rest of command line
38 38 # filling
39 39
40 40 raise IPython.ipapi.TryNext
41 41
42 42
43 43 # re_key specifies the regexp that triggers the specified completer
44 44
45 45 ip.set_hook('complete_command', apt_completers, re_key = '.*apt-get')
46 46 ip.set_hook('complete_command', apt_completers, re_key = '.*yum')
47 47
48 pkg_cache = None
49
48 50 def module_completer(self,event):
49 51 """ Give completions after user has typed 'import' """
50 52
53 global pkg_cache
51 54 import pkgutil,imp,time
52 for ld, name, ispkg in pkgutil.walk_packages():
53 if ispkg:
54 yield name + '.'
55 else:
56 yield name
55 #current =
56 if pkg_cache is None:
57 print "\n\n[Standby while scanning modules, this can take a while]\n\n"
58 pkg_cache = list(pkgutil.walk_packages())
59
60 for ld, name, ispkg in pkg_cache:
61 yield name
57 62 return
58 63
59 64 ip.set_hook('complete_command', module_completer, str_key = 'import')
60 65 ip.set_hook('complete_command', module_completer, str_key = 'from')
61 66
62 67 svn_commands = """\
63 68 add blame praise annotate ann cat checkout co cleanup commit ci copy
64 69 cp delete del remove rm diff di export help ? h import info list ls
65 70 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
66 71 pe propget pget pg proplist plist pl propset pset ps resolved revert
67 72 status stat st switch sw unlock update
68 73 """
69 74
70 75 def svn_completer(self,event):
71 76 if len((event.line + 'placeholder').split()) > 2:
72 77 # the rest are probably file names
73 78 return ip.IP.Completer.file_matches(event.symbol)
74 79
75 80 return svn_commands.split()
76 81
77 82 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
78 83
79 84 def runlistpy(self, event):
80 85 comps = shlex.split(event.line)
81 86 relpath = (len(comps) > 1 and comps[-1] or '')
82 87
83 88 print "rp",relpath
84 89 if relpath.startswith('~'):
85 90 relpath = os.path.expanduser(relpath)
86 91 dirs = [f.replace('\\','/') + "/" for f in glob.glob(relpath+'*') if os.path.isdir(f)]
87 92 pys = [f.replace('\\','/') for f in glob.glob(relpath+'*.py')]
88 93 return dirs + pys
89 94
90 95 ip.set_hook('complete_command', runlistpy, str_key = '%run')
91 96
92 def listdirs(self, event):
97 def cd_completer(self, event):
93 98 relpath = event.symbol
94 99
95 100 if '-b' in event.line:
96 101 # return only bookmark completions
97 102 bkms = self.db.get('bookmarks',{})
98 103 return bkms.keys()
99 104
100 105 if event.symbol == '-':
101 106 # jump in directory history by number
102 107 ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
103 108 if len(ents) > 1:
104 109 return ents
105 110 return []
106 111
107 112
108 113 if relpath.startswith('~'):
109 114 relpath = os.path.expanduser(relpath).replace('\\','/')
110 115 found = [f.replace('\\','/')+'/' for f in glob.glob(relpath+'*') if os.path.isdir(f)]
111 116 if not found:
112 117 return [relpath]
113 118 return found
114 119
115 ip.set_hook('complete_command', listdirs, str_key = '%cd') No newline at end of file
120 ip.set_hook('complete_command', cd_completer, str_key = '%cd') No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now