summaryrefslogtreecommitdiff
path: root/docs/features/history.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/features/history.rst')
-rw-r--r--docs/features/history.rst229
1 files changed, 227 insertions, 2 deletions
diff --git a/docs/features/history.rst b/docs/features/history.rst
index 9fd881d4..a2c9e2d7 100644
--- a/docs/features/history.rst
+++ b/docs/features/history.rst
@@ -6,10 +6,235 @@ For Developers
- Describe how cmd2 tracks history
- how persistent history works
-- differences in history and bash shell history (we only store valid commands in history)
+- differences in history and bash shell history (we only store valid commands
+ in history)
- reference the public code structures we use to store history
+``cmd2`` adds the option of making this history persistent via optional
+arguments to ``cmd2.Cmd.__init__()``:
+
+.. automethod:: cmd2.cmd2.Cmd.__init__
+
+
For Users
---------
-- describe the uses of the built in history command
+You can use the up and down arrow keys to move through the history of
+previously entered commands.
+
+If the ``readline`` module is installed, you can press ``Control-p`` to move to
+the previously entered command, and ``Control-n`` to move to the next command.
+You can also search through the command history using ``Control-r``.
+
+Eric Johnson hosts a nice `readline cheat sheet
+<http://readline.kablamo.org/emacs.html>`_, or you can dig into the `GNU
+Readline User Manual
+<https://tiswww.case.edu/php/chet/readline/rluserman.html>`_ for all the
+details, including instructions for customizing the key bindings.
+
+``cmd2`` makes a third type of history access available with the ``history``
+command. Each time the user enters a command, ``cmd2`` saves the input. The
+``history`` command lets you do interesting things with that saved input. The
+examples to follow all assume that you have entered the following commands::
+
+ (Cmd) alias create one !echo one
+ Alias 'one' created
+ (Cmd) alias create two !echo two
+ Alias 'two' created
+ (Cmd) alias create three !echo three
+ Alias 'three' created
+ (Cmd) alias create four !echo four
+ Alias 'four' created
+
+In it's simplest form, the ``history`` command displays previously entered
+commands. With no additional arguments, it displays all previously entered
+commands::
+
+ (Cmd) history
+ 1 alias create one !echo one
+ 2 alias create two !echo two
+ 3 alias create three !echo three
+ 4 alias create four !echo four
+
+If you give a positive integer as an argument, then it only displays the
+specified command::
+
+ (Cmd) history 4
+ 4 alias create four !echo four
+
+If you give a negative integer *N* as an argument, then it display the *Nth*
+last command. For example, if you give ``-1`` it will display the last command
+you entered. If you give ``-2`` it will display the next to last command you
+entered, and so forth::
+
+ (Cmd) history -2
+ 3 alias create three !echo three
+
+You can use a similar mechanism to display a range of commands. Simply give two
+command numbers separated by ``..`` or ``:``, and you will see all commands
+between, and including, those two numbers::
+
+ (Cmd) history 1:3
+ 1 alias create one !echo one
+ 2 alias create two !echo two
+ 3 alias create three !echo three
+
+If you omit the first number, it will start at the beginning. If you omit the
+last number, it will continue to the end::
+
+ (Cmd) history :2
+ 1 alias create one !echo one
+ 2 alias create two !echo two
+ (Cmd) history 2:
+ 2 alias create two !echo two
+ 3 alias create three !echo three
+ 4 alias create four !echo four
+
+If you want to display the last three commands entered::
+
+ (Cmd) history -- -3:
+ 2 alias create two !echo two
+ 3 alias create three !echo three
+ 4 alias create four !echo four
+
+Notice the double dashes. These are required because the history command uses
+``argparse`` to parse the command line arguments. As described in the `argparse
+documentation <https://docs.python.org/3/library/argparse.html>`_ , ``-3:`` is
+an option, not an argument:
+
+ If you have positional arguments that must begin with - and don’t look
+ like negative numbers, you can insert the pseudo-argument '--' which tells
+ parse_args() that everything after that is a positional argument:
+
+There is no zeroth command, so don't ask for it. If you are a python
+programmer, you've probably noticed this looks a lot like the slice syntax for
+lists and arrays. It is, with the exception that the first history command is
+1, where the first element in a python array is 0.
+
+Besides selecting previous commands by number, you can also search for them.
+You can use a simple string search::
+
+ (Cmd) history two
+ 2 alias create two !echo two
+
+Or a regular expression search by enclosing your regex in slashes::
+
+ (Cmd) history '/te\ +th/'
+ 3 alias create three !echo three
+
+If your regular expression contains any characters that ``argparse`` finds
+interesting, like dash or plus, you also need to enclose your regular
+expression in quotation marks.
+
+This all sounds great, but doesn't it seem like a bit of overkill to have all
+these ways to select commands if all we can do is display them? Turns out,
+displaying history commands is just the beginning. The history command can
+perform many other actions:
+
+- running previously entered commands
+- saving previously entered commands to a text file
+- opening previously entered commands in your favorite text editor
+- running previously entered commands, saving the commands and their output
+ to a text file
+- clearing the history of entered commands
+
+Each of these actions is invoked using a command line option. The ``-r`` or
+``--run`` option runs one or more previously entered commands. To run command
+number 1::
+
+ (Cmd) history --run 1
+
+To rerun the last two commands (there's that double dash again to make argparse
+stop looking for options)::
+
+ (Cmd) history -r -- -2:
+
+Say you want to re-run some previously entered commands, but you would really
+like to make a few changes to them before doing so. When you use the ``-e`` or
+``--edit`` option, ``history`` will write the selected commands out to a text
+file, and open that file with a text editor. You make whatever changes,
+additions, or deletions, you want. When you leave the text editor, all the
+commands in the file are executed. To edit and then re-run commands 2-4 you
+would::
+
+ (Cmd) history --edit 2:4
+
+If you want to save the commands to a text file, but not edit and re-run them,
+use the ``-o`` or ``--output-file`` option. This is a great way to create
+:ref:`scripts`, which can be executed using the ``run_script`` command. To
+save the first 5 commands entered in this session to a text file::
+
+ (Cmd) history :5 -o history.txt
+
+The ``history`` command can also save both the commands and their output to a
+text file. This is called a transcript. See
+:ref:`features/transcripts:Transcripts` for more information on how transcripts
+work, and what you can use them for. To create a transcript use the ``-t`` or
+``--transcription`` option::
+
+ (Cmd) history 2:3 --transcript transcript.txt
+
+The ``--transcript`` option implies ``--run``: the commands must be re-run in
+order to capture their output to the transcript file.
+
+The last action the history command can perform is to clear the command history
+using ``-c`` or ``--clear``::
+
+ (Cmd) history -c
+
+In addition to these five actions, the ``history`` command also has some
+options to control how the output is formatted. With no arguments, the
+``history`` command displays the command number before each command. This is
+great when displaying history to the screen because it gives you an easy
+reference to identify previously entered commands. However, when creating a
+script or a transcript, the command numbers would prevent the script from
+loading properly. The ``-s`` or ``--script`` option instructs the ``history``
+command to suppress the line numbers. This option is automatically set by the
+``--output-file``, ``--transcript``, and ``--edit`` options. If you want to
+output the history commands with line numbers to a file, you can do it with
+output redirection::
+
+ (Cmd) history 1:4 > history.txt
+
+You might use ``-s`` or ``--script`` on it's own if you want to display history
+commands to the screen without line numbers, so you can copy them to the
+clipboard::
+
+ (Cmd) history -s 1:3
+
+``cmd2`` supports both aliases and macros, which allow you to substitute a
+short, more convenient input string with a longer replacement string. Say we
+create an alias like this, and then use it::
+
+ (Cmd) alias create ls shell ls -aF
+ Alias 'ls' created
+ (Cmd) ls -d h*
+ history.txt htmlcov/
+
+By default, the ``history`` command shows exactly what we typed::
+
+ (Cmd) history
+ 1 alias create ls shell ls -aF
+ 2 ls -d h*
+
+There are two ways to modify that display so you can see what aliases and
+macros were expanded to. The first is to use ``-x`` or ``--expanded``. These
+options show the expanded command instead of the entered command::
+
+ (Cmd) history -x
+ 1 alias create ls shell ls -aF
+ 2 shell ls -aF -d h*
+
+If you want to see both the entered command and the expanded command, use the
+``-v`` or ``--verbose`` option::
+
+ (Cmd) history -v
+ 1 alias create ls shell ls -aF
+ 2 ls -d h*
+ 2x shell ls -aF -d h*
+
+If the entered command had no expansion, it is displayed as usual. However, if
+there is some change as the result of expanding macros and aliases, then the
+entered command is displayed with the number, and the expanded command is
+displayed with the number followed by an ``x``.
+