##// END OF EJS Templates
import completer: only crippled 'local' version for py 2.4
vivainio -
Show More
@@ -1,124 +1,130 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 import glob,os,shlex
15 import glob,os,shlex,sys
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 48 pkg_cache = None
49 49
50 50 def module_completer(self,event):
51 51 """ Give completions after user has typed 'import' """
52
52
53 # only a local version for py 2.4, pkgutil has no walk_packages() there
54 if sys.version_info < (2,5):
55 for el in [f[:-3] for f in glob.glob("*.py")]:
56 yield el
57 return
58
53 59 global pkg_cache
54 60 import pkgutil,imp,time
55 #current =
61 #current =
56 62 if pkg_cache is None:
57 63 print "\n\n[Standby while scanning modules, this can take a while]\n\n"
58 64 pkg_cache = list(pkgutil.walk_packages())
59 65
60 66 already = set()
61 67 for ld, name, ispkg in pkg_cache:
62 68 if name.count('.') < event.symbol.count('.') + 1:
63 69 if name not in already:
64 70 already.add(name)
65 71 yield name + (ispkg and '.' or '')
66 72 return
67 73
68 74 ip.set_hook('complete_command', module_completer, str_key = 'import')
69 75 ip.set_hook('complete_command', module_completer, str_key = 'from')
70 76
71 77 svn_commands = """\
72 78 add blame praise annotate ann cat checkout co cleanup commit ci copy
73 79 cp delete del remove rm diff di export help ? h import info list ls
74 80 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
75 81 pe propget pget pg proplist plist pl propset pset ps resolved revert
76 82 status stat st switch sw unlock update
77 83 """
78 84
79 85 def svn_completer(self,event):
80 86 if len((event.line + 'placeholder').split()) > 2:
81 87 # the rest are probably file names
82 88 return ip.IP.Completer.file_matches(event.symbol)
83 89
84 90 return svn_commands.split()
85 91
86 92 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
87 93
88 94 def runlistpy(self, event):
89 95 comps = shlex.split(event.line)
90 96 relpath = (len(comps) > 1 and comps[-1] or '')
91 97
92 98 print "rp",relpath
93 99 if relpath.startswith('~'):
94 100 relpath = os.path.expanduser(relpath)
95 101 dirs = [f.replace('\\','/') + "/" for f in glob.glob(relpath+'*') if os.path.isdir(f)]
96 102 pys = [f.replace('\\','/') for f in glob.glob(relpath+'*.py')]
97 103 return dirs + pys
98 104
99 105 ip.set_hook('complete_command', runlistpy, str_key = '%run')
100 106
101 107 def cd_completer(self, event):
102 108 relpath = event.symbol
103 109
104 110 if '-b' in event.line:
105 111 # return only bookmark completions
106 112 bkms = self.db.get('bookmarks',{})
107 113 return bkms.keys()
108 114
109 115 if event.symbol == '-':
110 116 # jump in directory history by number
111 117 ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
112 118 if len(ents) > 1:
113 119 return ents
114 120 return []
115 121
116 122
117 123 if relpath.startswith('~'):
118 124 relpath = os.path.expanduser(relpath).replace('\\','/')
119 125 found = [f.replace('\\','/')+'/' for f in glob.glob(relpath+'*') if os.path.isdir(f)]
120 126 if not found:
121 127 return [relpath]
122 128 return found
123 129
124 ip.set_hook('complete_command', cd_completer, str_key = '%cd') No newline at end of file
130 ip.set_hook('complete_command', cd_completer, str_key = '%cd')
General Comments 0
You need to be logged in to leave comments. Login now