summaryrefslogtreecommitdiff
path: root/README.rst
blob: 6db4843be15cd26bd2d7ecd7602286d72f5a6df9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
cmd2
====

.. image:: https://secure.travis-ci.org/python-cmd2/cmd2.png?branch=master
   :target: https://travis-ci.org/python-cmd2/cmd2
   :alt: Build status

.. image:: https://ci.appveyor.com/api/projects/status/github/python-cmd2/cmd2?branch=master
   :target: https://ci.appveyor.com/project/FedericoCeratto/cmd2
   :alt: Appveyor build status

.. image:: https://readthedocs.org/projects/cmd2/badge/?version=latest
    :target: http://cmd2.readthedocs.io/en/latest/?badge=latest
    :alt: Documentation Status

.. image:: https://img.shields.io/pypi/v/cmd2.svg
   :target: https://pypi.python.org/pypi/cmd2/
   :alt: Latest Version

.. image:: https://img.shields.io/pypi/l/cmd2.svg
    :target: https://pypi.python.org/pypi/cmd2/
    :alt: License


cmd2 is a tool for writing command-line interactive applications for Python 2.7 and Python 3.3+.  It is based on the
Python Standard Library's cmd_ module, and can be used any place cmd is used simply by importing cmd2 instead.  It is
pure Python code with the only 3rd-party dependencies being on six_ and pyparsing_

.. _cmd: https://docs.python.org/3/library/cmd.html
.. _six: https://pypi.python.org/pypi/six
.. _pyparsing: http://pyparsing.wikispaces.com

The latest documentation for cmd2 can be read online here: https://cmd2.readthedocs.io/en/latest/

See the `Installation Instructions`_ in the cmd2 documentation for instructions on installing, upgrading, and
uninstalling cmd2.

.. _`Installation Instructions`: https://cmd2.readthedocs.io/en/latest/install.html

The project is `maintained at GitHub`_.  Bug reports may be submitted directly to the `issue tracker`_.  Contributions
are welcome, see the `Contributor's Guide`_ for more inforamation.

.. _`maintained at GitHub`: https://github.com/python-cmd2/cmd2
.. _`issue tracker`: https://github.com/python-cmd2/cmd2/issues
.. _pytest: http://docs.pytest.org
.. _Contributor's Guide: https://github.com/python-cmd2/cmd2/blob/master/CONTRIBUTING.md


Feature Support
---------------

cmd2 provides the following features, in addition to those already existing in cmd_:

- Searchable command history
- Load commands from file, save to file, edit commands in file
- Multi-line commands
- Case-insensitive commands
- Special-character shortcut commands (beyond cmd's ``@`` and ``!``)
- Settable environment parameters
- Parsing commands with flags
- Redirection to file with ``>``, ``>>``; input from file with ``<``
- Bare ``>``, ``>>`` with no filename send output to paste buffer
- Pipe output to shell commands with ``|``
- Simple transcript-based application testing
- Unicode character support (*Python 3 only*)

Instructions for implementing each feature follow.

- Searchable command history

    All commands will automatically be tracked in the session's history, unless the command is listed in Cmd's excludeFromHistory attribute.
    The history is accessed through the ``history``, ``list``, and ``run`` commands.
    If you wish to exclude some of your custom commands from the history, append their names
    to the list at Cmd.ExcludeFromHistory.

- Load commands from file, save to file, edit commands in file

    Type ``help load``, ``help save``, ``help edit`` for details.

- Multi-line commands

    Any command accepts multi-line input when its name is listed in ``Cmd.multilineCommands``.
    The program will keep expecting input until a line ends with any of the characters
    in ``Cmd.terminators`` .  The default terminators are ``;`` and ``/n`` (empty newline).

- Case-insensitive commands

    All commands are case-insensitive, unless ``Cmd.caseInsensitive`` is set to ``False``.

- Special-character shortcut commands (beyond cmd's "@" and "!")

    To create a single-character shortcut for a command, update ``Cmd.shortcuts``.

- Settable environment parameters

    To allow a user to change an environment parameter during program execution,
    append the parameter's name to ``Cmd.settable``.

- Parsing commands with ``optparse`` options (flags)

    ::

        @options([make_option('-m', '--myoption', action="store_true", help="all about my option")])
        def do_myfunc(self, arg, opts):
            if opts.myoption:
                ...

    See Python standard library's ``optparse`` documentation: http://docs.python.org/lib/optparse-defining-options.html


Tutorials
---------

A couple tutorials on using cmd2 exist:

    * A detailed PyCon 2010 talk by `Catherine Devlin`_, the original author
        * http://pyvideo.org/pycon-us-2010/pycon-2010--easy-command-line-applications-with-c.html
    * A nice brief step-by-step tutorial
        * https://kushaldas.in/posts/developing-command-line-interpreters-using-python-cmd2.html

.. _Catherine Devlin: https://github.com/catherinedevlin


Example Application
-------------------

Example cmd2 application (**examples/example.py**) ::

    '''A sample application for cmd2.'''

    from cmd2 import Cmd, make_option, options

    class CmdLineApp(Cmd):
        multilineCommands = ['orate']
        Cmd.shortcuts.update({'&': 'speak'})
        maxrepeats = 3
        Cmd.settable.append('maxrepeats')

        # Setting this true makes it run a shell command if a cmd2/cmd command doesn't exist
        # default_to_shell = True

        @options([make_option('-p', '--piglatin', action="store_true", help="atinLay"),
                  make_option('-s', '--shout', action="store_true", help="N00B EMULATION MODE"),
                  make_option('-r', '--repeat', type="int", help="output [n] times")
                 ])
        def do_speak(self, arg, opts=None):
            """Repeats what you tell me to."""
            arg = ''.join(arg)
            if opts.piglatin:
                arg = '%s%say' % (arg[1:], arg[0])
            if opts.shout:
                arg = arg.upper()
            repetitions = opts.repeat or 1
            for i in range(min(repetitions, self.maxrepeats)):
                self.stdout.write(arg)
                self.stdout.write('\n')
                # self.stdout.write is better than "print", because Cmd can be
                # initialized with a non-standard output destination

        do_say = do_speak     # now "say" is a synonym for "speak"
        do_orate = do_speak   # another synonym, but this one takes multi-line input

    if __name__ == '__main__':
        c = CmdLineApp()
        c.cmdloop()

The following is a sample session running example.py.
Thanks to Cmd2's built-in transcript testing capability, it also serves as a test
suite for example.py when saved as *exampleSession.txt*.
Running::

    python example.py -t exampleSession.txt

will run all the commands in the transcript against `example.py`, verifying that the output produced
matches the transcript.

example/exampleSession.txt::

    (Cmd) help

    Documented commands (type help <topic>):
    ========================================
    _relative_load  edit  help     list  orate  py    run   say  shell      show
    cmdenvironment  eof   history  load  pause  quit  save  set  shortcuts  speak

    (Cmd) help say
    Repeats what you tell me to.
    Usage: speak [options] arg

    Options:
      -h, --help            show this help message and exit
      -p, --piglatin        atinLay
      -s, --shout           N00B EMULATION MODE
      -r REPEAT, --repeat=REPEAT
                            output [n] times

    (Cmd) say goodnight, Gracie
    goodnight, Gracie
    (Cmd) say -ps --repeat=5 goodnight, Gracie
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    (Cmd) set maxrepeats 5
    maxrepeats - was: 3
    now: 5
    (Cmd) say -ps --repeat=5 goodnight, Gracie
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    (Cmd) hi
    -------------------------[1]
    help
    -------------------------[2]
    help say
    -------------------------[3]
    say goodnight, Gracie
    -------------------------[4]
    say -ps --repeat=5 goodnight, Gracie
    -------------------------[5]
    set maxrepeats 5
    -------------------------[6]
    say -ps --repeat=5 goodnight, Gracie
    (Cmd) run 4
    say -ps --repeat=5 goodnight, Gracie

    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    OODNIGHT, GRACIEGAY
    (Cmd) orate Four score and
    > seven releases ago
    > our BDFL
    > blah blah blah
    Four score and
    seven releases ago
    our BDFL
    blah blah blah
    (Cmd) & look, a shortcut!
    look, a shortcut!
    (Cmd) set prompt "---> "
    prompt - was: (Cmd)
    now: --->
    ---> say goodbye
    goodbye