annotate Lib/cmd.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents 668c5ca4e0d4
children 0a6b88190b8b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
1 """A generic class to build line-oriented command interpreters.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
2
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
3 Interpreters constructed with this class obey the following conventions:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
4
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
5 1. End of file on input is processed as the command 'EOF'.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
6 2. A command is parsed out of each line by collecting the prefix composed
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
7 of characters in the identchars member.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
8 3. A command `foo' is dispatched to a method 'do_foo()'; the do_ method
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
9 is passed a single argument consisting of the remainder of the line.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
10 4. Typing an empty line repeats the last command. (Actually, it calls the
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
11 method `emptyline', which may be overridden in a subclass.)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
12 5. There is a predefined `help' method. Given an argument `topic', it
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
13 calls the command `help_topic'. With no arguments, it lists all topics
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
14 with defined help_ functions, broken into up to three topics; documented
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
15 commands, miscellaneous help topics, and undocumented commands.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
16 6. The command '?' is a synonym for `help'. The command '!' is a synonym
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
17 for `shell', if a do_shell method exists.
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
18 7. If completion is enabled, completing commands will be done automatically,
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
19 and completing of commands args is done by calling complete_foo() with
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
20 arguments text, line, begidx, endidx. text is string we are matching
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
21 against, all returned matches must begin with it. line is the current
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
22 input line (lstripped), begidx and endidx are the beginning and end
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18855
diff changeset
23 indexes of the text being matched, which could be used to provide
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
24 different completion depending upon which position the argument is in.
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
25
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
26 The `default' method may be overridden to intercept commands for which there
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
27 is no do_ method.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
28
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
29 The `completedefault' method may be overridden to intercept completions for
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18855
diff changeset
30 commands that have no complete_ method.
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
31
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
32 The data member `self.ruler' sets the character used to draw separator lines
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
33 in the help messages. If empty, no ruler line is drawn. It defaults to "=".
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
34
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
35 If the value of `self.intro' is nonempty when the cmdloop method is called,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
36 it is printed out on interpreter startup. This value may be overridden
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
37 via an optional argument to the cmdloop() method.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
38
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
39 The data members `self.doc_header', `self.misc_header', and
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
40 `self.undoc_header' set the headers used for the help function's
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
41 listings of documented functions, miscellaneous topics, and undocumented
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
42 functions respectively.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
43
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
44 These interpreters use raw_input; thus, if the readline module is loaded,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
45 they automatically support Emacs-like command history and editing features.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
46 """
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
17155
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
48 import string, sys
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15543
diff changeset
50 __all__ = ["Cmd"]
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15543
diff changeset
51
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 PROMPT = '(Cmd) '
18781
01ae962df885 Use string.ascii_letters instead of string.letters (SF bug #226706).
Fred Drake <fdrake@acm.org>
parents: 17155
diff changeset
53 IDENTCHARS = string.ascii_letters + string.digits + '_'
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 class Cmd:
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
56 """A simple framework for writing line-oriented command interpreters.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
57
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
58 These are often useful for test harnesses, administrative tools, and
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
59 prototypes that will later be wrapped in a more sophisticated interface.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
60
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
61 A Cmd instance or subclass instance is a line-oriented interpreter
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
62 framework. There is no good reason to instantiate Cmd itself; rather,
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
63 it's useful as a superclass of an interpreter class you define yourself
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
64 in order to inherit Cmd's methods and encapsulate action methods.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
65
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
66 """
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
67 prompt = PROMPT
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
68 identchars = IDENTCHARS
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
69 ruler = '='
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
70 lastcmd = ''
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
71 cmdqueue = []
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
72 intro = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
73 doc_leader = ""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
74 doc_header = "Documented commands (type help <topic>):"
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
75 misc_header = "Miscellaneous help topics:"
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
76 undoc_header = "Undocumented commands:"
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
77 nohelp = "*** No help on %s"
17155
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
78 use_rawinput = 1
1315
acdc0b9a6c78 * aifc.py: don't die on invalid MARK chunk
Guido van Rossum <guido@python.org>
parents: 1086
diff changeset
79
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18855
diff changeset
80 def __init__(self, completekey='tab'):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
81 """Instantiate a line-oriented interpreter framework.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
82
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
83 The optional argument is the readline name of a completion key;
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
84 it defaults to the Tab key. If completekey is not None and the
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
85 readline module is available, command completion is done
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
86 automatically.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
87
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
88 """
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
89 if completekey:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
90 try:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
91 import readline
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
92 readline.set_completer(self.complete)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
93 readline.parse_and_bind(completekey+": complete")
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
94 except ImportError:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
95 pass
8615
e7822b64a33d Gotta have an __init__() method -- pdb.py calls it!
Guido van Rossum <guido@python.org>
parents: 8584
diff changeset
96
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
97 def cmdloop(self, intro=None):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
98 """Repeatedly issue a prompt, accept input, parse an initial prefix
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
99 off the received input, and dispatch to action methods, passing them
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
100 the remainder of the line as argument.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
101
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
102 """
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
103
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
104 self.preloop()
15543
785155e2cfca Update the code to better reflect recommended style:
Fred Drake <fdrake@acm.org>
parents: 13533
diff changeset
105 if intro is not None:
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
106 self.intro = intro
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
107 if self.intro:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
108 print self.intro
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
109 stop = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
110 while not stop:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
111 if self.cmdqueue:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
112 line = self.cmdqueue[0]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
113 del self.cmdqueue[0]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
114 else:
17155
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
115 if self.use_rawinput:
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
116 try:
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
117 line = raw_input(self.prompt)
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
118 except EOFError:
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
119 line = 'EOF'
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
120 else:
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
121 sys.stdout.write(self.prompt)
22532
9198fb0435fb backport nascheme's checkin of
Michael W. Hudson <mwh@python.net>
parents: 19119
diff changeset
122 sys.stdout.flush()
17155
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
123 line = sys.stdin.readline()
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
124 if not len(line):
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
125 line = 'EOF'
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
126 else:
1550872249e9 This is SF patch #405952, by Anthony Baxter:
Guido van Rossum <guido@python.org>
parents: 16478
diff changeset
127 line = line[:-1] # chop \n
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
128 line = self.precmd(line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
129 stop = self.onecmd(line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
130 stop = self.postcmd(stop, line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
131 self.postloop()
8584
cb7fcfb56275 Improved by Eric Raymond.
Guido van Rossum <guido@python.org>
parents: 8410
diff changeset
132
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
133 def precmd(self, line):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
134 """Hook method executed just before the command line is
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
135 interpreted, but after the input prompt is generated and issued.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
136
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
137 """
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
138 return line
8584
cb7fcfb56275 Improved by Eric Raymond.
Guido van Rossum <guido@python.org>
parents: 8410
diff changeset
139
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
140 def postcmd(self, stop, line):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
141 """Hook method executed just after a command dispatch is finished."""
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
142 return stop
8584
cb7fcfb56275 Improved by Eric Raymond.
Guido van Rossum <guido@python.org>
parents: 8410
diff changeset
143
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
144 def preloop(self):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
145 """Hook method executed once when the cmdloop() method is called."""
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
146 pass
8584
cb7fcfb56275 Improved by Eric Raymond.
Guido van Rossum <guido@python.org>
parents: 8410
diff changeset
147
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
148 def postloop(self):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
149 """Hook method executed once when the cmdloop() method is about to
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
150 return.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
151
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
152 """
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
153 pass
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
155 def parseline(self, line):
16478
edc0c99a69d6 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16280
diff changeset
156 line = line.strip()
13533
1e7c32bddb8f Bug fix: ? and ! were not full aliases for `help' and `shell' as implied in
Eric S. Raymond <esr@thyrsus.com>
parents: 11691
diff changeset
157 if not line:
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
158 return None, None, line
13533
1e7c32bddb8f Bug fix: ? and ! were not full aliases for `help' and `shell' as implied in
Eric S. Raymond <esr@thyrsus.com>
parents: 11691
diff changeset
159 elif line[0] == '?':
1e7c32bddb8f Bug fix: ? and ! were not full aliases for `help' and `shell' as implied in
Eric S. Raymond <esr@thyrsus.com>
parents: 11691
diff changeset
160 line = 'help ' + line[1:]
1e7c32bddb8f Bug fix: ? and ! were not full aliases for `help' and `shell' as implied in
Eric S. Raymond <esr@thyrsus.com>
parents: 11691
diff changeset
161 elif line[0] == '!':
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
162 if hasattr(self, 'do_shell'):
13533
1e7c32bddb8f Bug fix: ? and ! were not full aliases for `help' and `shell' as implied in
Eric S. Raymond <esr@thyrsus.com>
parents: 11691
diff changeset
163 line = 'shell ' + line[1:]
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
164 else:
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
165 return None, None, line
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
166 i, n = 0, len(line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
167 while i < n and line[i] in self.identchars: i = i+1
16478
edc0c99a69d6 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16280
diff changeset
168 cmd, arg = line[:i], line[i:].strip()
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
169 return cmd, arg, line
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18855
diff changeset
170
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
171 def onecmd(self, line):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
172 """Interpret the argument as though it had been typed in response
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
173 to the prompt.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
174
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
175 This may be overridden, but should not normally need to be;
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
176 see the precmd() and postcmd() methods for useful execution hooks.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
177 The return value is a flag indicating whether interpretation of
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
178 commands by the interpreter should stop.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
179
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
180 """
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
181 cmd, arg, line = self.parseline(line)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
182 if not line:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
183 return self.emptyline()
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
184 if cmd is None:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
185 return self.default(line)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
186 self.lastcmd = line
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
187 if cmd == '':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
188 return self.default(line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
189 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
190 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
191 func = getattr(self, 'do_' + cmd)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
192 except AttributeError:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
193 return self.default(line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
194 return func(arg)
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
196 def emptyline(self):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
197 """Called when an empty line is entered in response to the prompt.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
198
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
199 If this method is not overridden, it repeats the last nonempty
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
200 command entered.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
201
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
202 """
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
203 if self.lastcmd:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
204 return self.onecmd(self.lastcmd)
8584
cb7fcfb56275 Improved by Eric Raymond.
Guido van Rossum <guido@python.org>
parents: 8410
diff changeset
205
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
206 def default(self, line):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
207 """Called on an input line when the command prefix is not recognized.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
208
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
209 If this method is not overridden, it prints an error message and
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
210 returns.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
211
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
212 """
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
213 print '*** Unknown syntax:', line
624
0e436200bf12 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
215 def completedefault(self, *ignored):
23574
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
216 """Method called to complete an input line when no command-specific
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
217 complete_*() method is available.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
218
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
219 By default, it returns an empty list.
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
220
668c5ca4e0d4 Backport change to 1.29 adding docstrings
Raymond Hettinger <python@rcn.com>
parents: 22532
diff changeset
221 """
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
222 return []
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
223
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
224 def completenames(self, text, *ignored):
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
225 dotext = 'do_'+text
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
226 return [a[3:] for a in self.get_names() if a.startswith(dotext)]
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
227
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
228 def complete(self, text, state):
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
229 """Return the next possible completion for 'text'.
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
230
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
231 If a command has not been entered, then complete against command list.
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
232 Otherwise try to call complete_<command> to get list of completions.
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
233 """
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
234 if state == 0:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
235 import readline
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
236 origline = readline.get_line_buffer()
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
237 line = origline.lstrip()
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
238 stripped = len(origline) - len(line)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
239 begidx = readline.get_begidx() - stripped
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
240 endidx = readline.get_endidx() - stripped
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
241 if begidx>0:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
242 cmd, args, foo = self.parseline(line)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
243 if cmd == '':
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
244 compfunc = self.completedefault
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
245 else:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
246 try:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
247 compfunc = getattr(self, 'complete_' + cmd)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
248 except AttributeError:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
249 compfunc = self.completedefault
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
250 else:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
251 compfunc = self.completenames
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
252 self.completion_matches = compfunc(text, line, begidx, endidx)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
253 try:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
254 return self.completion_matches[state]
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
255 except IndexError:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
256 return None
19119
600a9a2b7a18 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 18855
diff changeset
257
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
258 def get_names(self):
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
259 # Inheritance says we have to look in class and
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
260 # base classes; order is not important.
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
261 names = []
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
262 classes = [self.__class__]
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
263 while classes:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
264 aclass = classes[0]
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
265 if aclass.__bases__:
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
266 classes = classes + list(aclass.__bases__)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
267 names = names + dir(aclass)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
268 del classes[0]
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
269 return names
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
270
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
271 def complete_help(self, *args):
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
272 return self.completenames(*args)
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
273
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
274 def do_help(self, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
275 if arg:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
276 # XXX check arg syntax
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
277 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
278 func = getattr(self, 'help_' + arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
279 except:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
280 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
281 doc=getattr(self, 'do_' + arg).__doc__
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
282 if doc:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
283 print doc
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
284 return
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
285 except:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
286 pass
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
287 print self.nohelp % (arg,)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
288 return
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
289 func()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
290 else:
18855
6f301b3cf323 Patch #416224: add readline completion to cmd.Cmd.
Martin v. Löwis <martin@v.loewis.de>
parents: 18781
diff changeset
291 names = self.get_names()
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
292 cmds_doc = []
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
293 cmds_undoc = []
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
294 help = {}
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
295 for name in names:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
296 if name[:5] == 'help_':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
297 help[name[5:]]=1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
298 names.sort()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
299 # There can be duplicates if routines overridden
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
300 prevname = ''
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
301 for name in names:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
302 if name[:3] == 'do_':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
303 if name == prevname:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
304 continue
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
305 prevname = name
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
306 cmd=name[3:]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
307 if help.has_key(cmd):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
308 cmds_doc.append(cmd)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
309 del help[cmd]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
310 elif getattr(self, name).__doc__:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
311 cmds_doc.append(cmd)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
312 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
313 cmds_undoc.append(cmd)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
314 print self.doc_leader
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
315 self.print_topics(self.doc_header, cmds_doc, 15,80)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
316 self.print_topics(self.misc_header, help.keys(),15,80)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
317 self.print_topics(self.undoc_header, cmds_undoc, 15,80)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
318
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
319 def print_topics(self, header, cmds, cmdlen, maxcol):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
320 if cmds:
16280
8b81a7e58a1d unnecessary semicolon
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 16070
diff changeset
321 print header
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
322 if self.ruler:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
323 print self.ruler * len(header)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
324 (cmds_per_line,junk)=divmod(maxcol,cmdlen)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
325 col=cmds_per_line
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
326 for cmd in cmds:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
327 if col==0: print
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
328 print (("%-"+`cmdlen`+"s") % cmd),
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
329 col = (col+1) % cmds_per_line
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 10820
diff changeset
330 print "\n"