##// END OF EJS Templates
stock completer for hg (mercurial)
vivainio -
Show More
@@ -1,133 +1,155 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,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 53 # only a local version for py 2.4, pkgutil has no walk_packages() there
54 54 if sys.version_info < (2,5):
55 55 for el in [f[:-3] for f in glob.glob("*.py")]:
56 56 yield el
57 57 return
58 58
59 59 global pkg_cache
60 60 import pkgutil,imp,time
61 61 #current =
62 62 if pkg_cache is None:
63 63 print "\n\n[Standby while scanning modules, this can take a while]\n\n"
64 64 pkg_cache = list(pkgutil.walk_packages())
65 65
66 66 already = set()
67 67 for ld, name, ispkg in pkg_cache:
68 68 if name.count('.') < event.symbol.count('.') + 1:
69 69 if name not in already:
70 70 already.add(name)
71 71 yield name + (ispkg and '.' or '')
72 72 return
73 73
74 74 ip.set_hook('complete_command', module_completer, str_key = 'import')
75 75 ip.set_hook('complete_command', module_completer, str_key = 'from')
76 76
77 77 svn_commands = """\
78 78 add blame praise annotate ann cat checkout co cleanup commit ci copy
79 79 cp delete del remove rm diff di export help ? h import info list ls
80 80 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
81 81 pe propget pget pg proplist plist pl propset pset ps resolved revert
82 82 status stat st switch sw unlock update
83 83 """
84 84
85 85 def svn_completer(self,event):
86 86 if len((event.line + 'placeholder').split()) > 2:
87 87 # the rest are probably file names
88 88 return ip.IP.Completer.file_matches(event.symbol)
89 89
90 90 return svn_commands.split()
91 91
92 92 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
93 93
94 hg_commands = """
95 add addremove annotate archive backout branch branches bundle cat
96 clone commit copy diff export grep heads help identify import incoming
97 init locate log manifest merge outgoing parents paths pull push
98 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
99 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
100 qselect qseries qtop qunapplied recover remove rename revert rollback
101 root serve showconfig status strip tag tags tip unbundle update verify
102 version
103 """
104
105 def hg_completer(self,event):
106 """ Completer for mercurial commands """
107 if len((event.line + 'placeholder').split()) > 2:
108 # the rest are probably file names
109 return ip.IP.Completer.file_matches(event.symbol)
110
111 return hg_commands.split()
112
113 ip.set_hook('complete_command', hg_completer, str_key = 'hg')
114
115
94 116 def runlistpy(self, event):
95 117 comps = shlex.split(event.line)
96 118 relpath = (len(comps) > 1 and comps[-1] or '')
97 119
98 120 #print "rp",relpath # dbg
99 121 lglob = glob.glob
100 122 isdir = os.path.isdir
101 123 if relpath.startswith('~'):
102 124 relpath = os.path.expanduser(relpath)
103 125 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
104 126 if isdir(f)]
105 127 pys = [f.replace('\\','/') for f in lglob(relpath+'*.py')]
106 128 return dirs + pys
107 129
108 130 ip.set_hook('complete_command', runlistpy, str_key = '%run')
109 131
110 132 def cd_completer(self, event):
111 133 relpath = event.symbol
112 134
113 135 if '-b' in event.line:
114 136 # return only bookmark completions
115 137 bkms = self.db.get('bookmarks',{})
116 138 return bkms.keys()
117 139
118 140 if event.symbol == '-':
119 141 # jump in directory history by number
120 142 ents = ['-%d [%s]' % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
121 143 if len(ents) > 1:
122 144 return ents
123 145 return []
124 146
125 147
126 148 if relpath.startswith('~'):
127 149 relpath = os.path.expanduser(relpath).replace('\\','/')
128 150 found = [f.replace('\\','/')+'/' for f in glob.glob(relpath+'*') if os.path.isdir(f)]
129 151 if not found:
130 152 return [relpath]
131 153 return found
132 154
133 155 ip.set_hook('complete_command', cd_completer, str_key = '%cd')
General Comments 0
You need to be logged in to leave comments. Login now