.. _module-pw_console-user_guide:

User Guide
==========

.. seealso::

   This guide can be viewed online at:
   https://pigweed.dev/pw_console/py/pw_console/docs/user_guide.html


The Pigweed Console provides a Python repl (read eval print loop) and log viewer
in a single-window terminal based interface.


Starting the Console
--------------------

::

  pw rpc -s localhost:33000 --proto-globs pw_rpc/echo.proto


Exiting
~~~~~~~

There are a few ways to exit the Pigweed Console user interface:

1.  Click the :guilabel:`[File]` menu and then :guilabel:`Exit`.
2.  Type ``quit`` or ``exit`` in the Python Input window and press :kbd:`Enter`.
3.  Press :kbd:`Ctrl-d` once to show the quit confirmation dialog. From there
    press :kbd:`Ctrl-d` a second time or :kbd:`y` will exit.
4.  Press :kbd:`Ctrl-x` quickly followed by :kbd:`Ctrl-c` will exit without
    confirmation.
5.  Press :kbd:`Ctrl-p` to search for commands, type ``exit``, then press
    :kbd:`Enter`.


Interface Layout
----------------

On startup the console will display multiple windows one on top of the other.

::

  +---------------------------------------------------------+
  | [File] [Edit] [View] [Window] [Help]    Pigweed Console |
  +=========================================================+
  |                                                         |
  |                                                         |
  |                                                         |
  | Log Window                                              |
  +=========================================================+
  |                                                         |
  |                                                         |
  | Python Results                                          |
  +- - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
  |                                                         |
  | Python Input                                            |
  +---------------------------------------------------------+


Navigation
----------

All menus, windows, and toolbar buttons can be clicked on. Scrolling with the
mouse wheel should work too. This requires that your terminal is able to send
mouse events.


Navigation with the Keyboard
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The main menu can be searched by pressing :kbd:`Ctrl-p`. This opens a fuzzy
search box containing all main menu item actions.

Words separated by spaces are used to narrow down the match results. The order
each word is entered does not matter.

.. figure:: /pw_console/images/command_runner_main_menu.svg
  :alt: Main menu item search dialog.

============================================  =====================
Function                                      Keys
============================================  =====================
Open main menu search                         :kbd:`Ctrl-p`
Cancel search                                 :kbd:`Ctrl-c`
Run selected item                             :kbd:`Enter`

Select next item                              :kbd:`Tab`
                                              :kbd:`Down`
Select previous item                          :kbd:`Shift-Tab`
                                              :kbd:`Up`
============================================  =====================

Switching Focus
~~~~~~~~~~~~~~~

Clicking on any window will focus on it. Alternatively, the key bindings below
will switch focus.

============================================  =====================
Function                                      Keys
============================================  =====================
Switch focus to the next window or tab        :kbd:`Ctrl-Alt-n`
Switch focus to the previous window or tab    :kbd:`Ctrl-Alt-p`

Switch focus to the next UI element           :kbd:`Shift-Tab`
                                              :kbd:`Ctrl-Right`
Switch focus to the previous UI element       :kbd:`Ctrl-Left`

Move selection in the main menu               :kbd:`Up`
                                              :kbd:`Down`
                                              :kbd:`Left`
                                              :kbd:`Right`
============================================  =====================


Toolbars
~~~~~~~~

Log toolbar functions are clickable. You can also press the keyboard
shortcut highlighted in blue:

::

        / : Search  f : [x] Follow  t : [x] Table  w : [ ] Wrap  C : Clear


Log Window
~~~~~~~~~~

Log Window Navigation
^^^^^^^^^^^^^^^^^^^^^

============================================  =====================
Function                                      Keys
============================================  =====================
Move cursor up 1 line                         :kbd:`Up`
                                              :kbd:`k`

Move cursor down 1 line                       :kbd:`Down`
                                              :kbd:`j`

Move cursor up 5 lines                        :guilabel:`Mouse Wheel Up`
Move cursor down 5 lines                      :guilabel:`Mouse Wheel Down`

Move cursor up one page                       :kbd:`PageUp`
Move cursor down one page                     :kbd:`PageDown`

Jump to the beginning                         :kbd:`g`
Jump to the end                               :kbd:`G`
============================================  =====================

Log Line Selection
^^^^^^^^^^^^^^^^^^

============================================  =====================
Function                                      Keys
============================================  =====================
Select the next log line                      :kbd:`Shift-Down`
Select the previous log line                  :kbd:`Shift-Up`

Select a range of log lines                   :guilabel:`Left Mouse Drag`

Select all lines                              :kbd:`Ctrl-a`
Clear Selection                               :kbd:`Ctrl-c`
============================================  =====================

When making log line selections a popup will appear in the upper right of the log
window showing the number of lines selected along with copy and export options.

::

  +--------------------------------------------------------+
  | 32 Selected  Format:  [✓] Table  [ ] Markdown          |
  | [ Cancel ]  [ Select All ]   [ Save as File ] [ Copy ] |
  +--------------------------------------------------------+


Log Window Functions
^^^^^^^^^^^^^^^^^^^^

============================================  =====================
Function                                      Keys
============================================  =====================
Open the search bar                           :kbd:`/`
                                              :kbd:`Ctrl-f`
Save a copy of logs to a file                 :kbd:`Ctrl-o`
Toggle line following.                        :kbd:`f`
Toggle table view.                            :kbd:`t`
Toggle line wrapping.                         :kbd:`w`
Clear log pane history.                       :kbd:`C`
============================================  =====================

Log Window Management
^^^^^^^^^^^^^^^^^^^^^^^

============================================  =====================
Function                                      Keys
============================================  =====================
Duplicate this log pane.                      :kbd:`Insert`
Remove log pane.                              :kbd:`Delete`
============================================  =====================

Log Searching
^^^^^^^^^^^^^

============================================  =====================
Function                                      Keys
============================================  =====================
Open the search bar                           :kbd:`/`
                                              :kbd:`Ctrl-f`
Navigate search term history                  :kbd:`Up`
                                              :kbd:`Down`
Start the search and highlight matches        :kbd:`Enter`
Close the search bar without searching        :kbd:`Ctrl-c`
============================================  =====================

Here is a view of the search bar:

::

  +--------------------------------------------------------------------------+
  | Search   Column:All Ctrl-t   [ ] Invert Ctrl-v   Matcher:REGEX Ctrl-n    |
  | /                                            Search Enter  Cancel Ctrl-c |
  +--------------------------------------------------------------------------+

Across the top are various functions with keyboard shortcuts listed. Each of
these are clickable with the mouse.

**Search Parameters**

- ``Column:All`` Change the part of the log message to match on. For example:
  ``All``, ``Message`` or any extra metadata column.

- ``Invert`` match. Find lines that don't match the entered text.

- ``Matcher``: How the search input should be interpreted.

  - ``REGEX``: Treat input text as a regex.

  - ``STRING``: Treat input as a plain string. Any regex characters will be
    escaped when search is performed.

  - ``FUZZY``: input text is split on spaces using the ``.*`` regex. For
    example if you search for ``idle run`` the resulting search regex used
    under the hood is ``(idle)(.*?)(run)``. This would match both of these
    lines:

    .. code-block:: text

       Idle task is running
       Idle thread is running

**Active Search Shortcuts**

When a search is started the bar will close, log follow mode is disabled and all
matches will be highlighted.  At this point a few extra keyboard shortcuts are
available.

============================================  =====================
Function                                      Keys
============================================  =====================
Move to the next search result                :kbd:`n`
                                              :kbd:`Ctrl-g`
                                              :kbd:`Ctrl-s`
Move to the previous search result            :kbd:`N`
                                              :kbd:`Ctrl-r`
Clear active search                           :kbd:`Ctrl-c`
Creates a filter using the active search      :kbd:`Ctrl-Alt-f`
Reset all active filters.                     :kbd:`Ctrl-Alt-r`
============================================  =====================


Log Filtering
^^^^^^^^^^^^^

Log filtering allows you to limit what log lines appear in any given log
window. Filters can be added from the currently active search or directly in the
search bar.

- With the search bar **open**:

  Type something to search for then press :kbd:`Ctrl-Alt-f` or click on
  :guilabel:`Add Filter`.

- With the search bar **closed**:

  Press :kbd:`Ctrl-Alt-f` to use the current search term as a filter.

When a filter is active the ``Filters`` toolbar will appear at the bottom of the
log window. For example, here are some logs with one active filter for
``lorem ipsum``.

::

  +------------------------------------------------------------------------------+
  | Time               Lvl  Module  Message                                      |
  +------------------------------------------------------------------------------+
  | 20210722 15:38:14  INF  APP     Log message # 270 Lorem ipsum dolor sit amet |
  | 20210722 15:38:24  INF  APP     Log message # 280 Lorem ipsum dolor sit amet |
  | 20210722 15:38:34  INF  APP     Log message # 290 Lorem ipsum dolor sit amet |
  | 20210722 15:38:44  INF  APP     Log message # 300 Lorem ipsum dolor sit amet |
  | 20210722 15:38:54  INF  APP     Log message # 310 Lorem ipsum dolor sit amet |
  | 20210722 15:39:04  INF  APP     Log message # 320 Lorem ipsum dolor sit amet |
  +------------------------------------------------------------------------------+
  |  Filters   <lorem ipsum (X)>  Ctrl-Alt-r : Clear Filters                     |
  +------------------------------------------------------------------------------+
  |   Logs   / : Search  f : [x] Follow  t : [x] Table  w : [ ] Wrap  C : Clear  |
  +------------------------------------------------------------------------------+

**Stacking Filters**

Adding a second filter on the above logs for ``# 2`` would update the filter
toolbar to show:

::

  +------------------------------------------------------------------------------+
  | Time               Lvl  Module  Message                                      |
  +------------------------------------------------------------------------------+
  |                                                                              |
  |                                                                              |
  |                                                                              |
  | 20210722 15:38:14  INF  APP     Log message # 270 Lorem ipsum dolor sit amet |
  | 20210722 15:38:24  INF  APP     Log message # 280 Lorem ipsum dolor sit amet |
  | 20210722 15:38:34  INF  APP     Log message # 290 Lorem ipsum dolor sit amet |
  +------------------------------------------------------------------------------+
  |  Filters   <lorem ipsum (X)>  <# 2 (X)>  Ctrl-Alt-r : Clear Filters          |
  +------------------------------------------------------------------------------+
  |   Logs   / : Search  f : [x] Follow  t : [x] Table  w : [ ] Wrap  C : Clear  |
  +------------------------------------------------------------------------------+

Any filter listed in the Filters toolbar and can be individually removed by
clicking on the red ``(X)`` text.


Python Window
~~~~~~~~~~~~~


Running Code in the Python Repl
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

-  Type code and hit :kbd:`Enter` to run.
-  If multiple lines are used, move the cursor to the end and press
   :kbd:`Enter` twice.
-  :kbd:`Up` / :kbd:`Down` Navigate command history
-  :kbd:`Ctrl-r` Start reverse history searching
-  :kbd:`Ctrl-c` Erase the input buffer
-  :kbd:`Ctrl-v` Paste text from the clipboard to the input buffer
-  :kbd:`Ctrl-Alt-c` Copy the Python Output to the system clipboard

   -  If the input buffer is empty:
      :kbd:`Ctrl-c` cancels any currently running Python commands.

-  :kbd:`F2` Open the python repl settings (from
   `ptpython <https://github.com/prompt-toolkit/ptpython>`__). This
   works best in vertical split mode.

   -  To exit: hit :kbd:`F2` again.
   -  Navigate options with the arrow keys, Enter will close the menu.

-  :kbd:`F3` Open the python repl history (from
   `ptpython <https://github.com/prompt-toolkit/ptpython>`__).

   -  To exit: hit :kbd:`F3` again.
   -  Left side shows previously entered commands
   -  Use arrow keys to navigate.
   -  :kbd:`Space` to select as many lines you want to use

      -  Selected lines will be appended to the right side.

   -  :kbd:`Enter` to accept the right side text, this will be inserted
      into the repl.


Copy & Pasting
~~~~~~~~~~~~~~

Copying Text
^^^^^^^^^^^^

Text can be copied from the Log and Python windows when they are in focus with
these keybindings.

============================================  =====================
Function                                      Keys
============================================  =====================
Copy Logs from the focused log window         :kbd:`Ctrl-c`
Copy Python Output if window is focused       :kbd:`Ctrl-Alt-c`
============================================  =====================

Text will be put in the host computer's system clipboard using the
`pyperclip package <https://pypi.org/project/pyperclip/>`__.

The above functions can also be accessed by clicking on the toolbar help text or
accessed under the :guilabel:`[Edit]` menu.

If you need to copy text from any other part of the UI you will have to use your
terminal's built in text selection:

**Linux**

- Holding :kbd:`Shift` and dragging the mouse in most terminals.

**Mac**

- **Apple Terminal**:

  Hold :kbd:`Fn` and drag the mouse

- **iTerm2**:

  Hold :kbd:`Cmd+Option` and drag the mouse

**Windows**

- **Git CMD** (included in `Git for Windows <https://git-scm.com/downloads>`__)

  1. Click on the Git window icon in the upper left of the title bar
  2. Click ``Edit`` then ``Mark``
  3. Drag the mouse to select text and press Enter to copy.

- **Windows Terminal**

  1. Hold :kbd:`Shift` and drag the mouse to select text
  2. Press :kbd:`Ctrl-Shift-C` to copy.

Pasting Text
^^^^^^^^^^^^

Text can be pasted into the Python Input window from the system clipboard with
:kbd:`Ctrl-v`.

If you are using the console on a separate machine (over an ssh connection for
example) then pasting will use that machine's clipboard. This may not be the
computer where you copied the text. In that case you will need to use your
terminal emulator's paste function. How to do this depends on what terminal you
are using and on which OS. Here's how on various platforms:

**Linux**

- **XTerm**

  :kbd:`Shift-Insert` pastes text

- **Gnome Terminal**

  :kbd:`Ctrl-Shift-V` pastes text

**Windows**

- **Git CMD** (included in `Git for Windows <https://git-scm.com/downloads>`__)

  1. Click on the Git icon in the upper left of the windows title bar and open
     ``Properties``.
  2. Checkmark the option ``Use Ctrl+Shift+C/V as Copy Paste`` and hit ok.
  3. Then use :kbd:`Ctrl-Shift-V` to paste.

- **Windows Terminal**

  1. :kbd:`Ctrl-Shift-V` pastes text.
  2. :kbd:`Shift-RightClick` also pastes text.


Window Management
~~~~~~~~~~~~~~~~~

Any window can be hidden by clicking the :guilabel:`[x] Show Window` checkbox
under the :guilabel:`[Window]` menu.

The active window can be moved and resized with the following keys. There are
also menu options under :guilabel:`[View]` for the same actions. Additionally,
windows can be resized with the mouse by click dragging on the :guilabel:`====`
text on the far right side of any toolbar.

============================================  =====================
Function                                      Keys
============================================  =====================
Enlarge window height                         :kbd:`Alt-=`
Shrink window height                          :kbd:`Alt--`
                                              (:kbd:`Alt` and :kbd:`Minus`)
Enlarge vertical split width                  :kbd:`Alt-,`
Shrink vertical split width                   :kbd:`Alt-.`
Reset window sizes                            :kbd:`Ctrl-u`

Move window up                                :kbd:`Ctrl-Alt-Up`
Move window down                              :kbd:`Ctrl-Alt-Down`
Move window left                              :kbd:`Ctrl-Alt-Left`
Move window right                             :kbd:`Ctrl-Alt-Right`
============================================  =====================

Moving windows left and right will create a new vertical splits. Each vertical
stack can contain multiple windows and show windows as a stack or tabbed
view.

For example here we have 3 window panes in a single stack. If you focus on Log
Window 1 and move it to the right a new stack is formed in a vertical
split. This can be done repeatedly to form additional window stacks.

::

  +----------------------------------+     +----------------------------------+
  | [File] [View] [Window]   Console |     | [File] [View] [Window]   Console |
  +==================================+     +================+=================+
  | Log Window 1                     |     | Log Window 2   | Log Window 1    |
  |                                  |     |                |                 |
  +==================================+     |                |                 |
  | Log Window 2                     |     |                |                 |
  |                                  |     |                |                 |
  +==================================+     +================+                 |
  |                                  |     |                |                 |
  |                                  |     |                |                 |
  | Python Results                   |     | Python Results |                 |
  |                                  |     |                |                 |
  | Python Input                     |     | Python Input   |                 |
  +----------------------------------+     +----------------+-----------------+

Color Depth
-----------

Some terminals support full 24-bit color and pw console will use that by default
in most cases. One notable exeception is Apple Terminal on MacOS which supports
256 colors only. `iTerm2 <https://iterm2.com/>`__ is a good MacOS alternative
that supports 24-bit colors.

To force a particular color depth: set one of these environment variables before
launching the console. For ``bash`` and ``zsh`` shells you can use the
``export`` command.

::

   # 1 bit | Black and white
   export PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_1_BIT
   # 4 bit | ANSI colors
   export PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_4_BIT
   # 8 bit | 256 colors
   export PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_8_BIT
   # 24 bit | True colors
   export PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_24_BIT

For Windows command prompt (``cmd.exe``) use the ``set`` command:

::

   set PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_1_BIT
   set PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_4_BIT
   set PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_8_BIT
   set PROMPT_TOOLKIT_COLOR_DEPTH=DEPTH_24_BIT

Configuration
-------------

Pigweed Console supports loading project and user specific settings stored in
YAML files. Each file follows the same format and are loaded one after the
other. Any setting specified multiple locations will be overridden by files
loaded later in the startup sequence.

1. ``$PW_PROJECT_ROOT/.pw_console.yaml``

   Project level config file. This is intended to be a file living somewhere
   under a project folder and is checked into version control. It serves as a
   base config for all users to inherit from.

2. ``$PW_PROJECT_ROOT/.pw_console.user.yaml``

   User's personal config file for a specific project. This can be a file that
   lives in a project folder but is git-ignored and not checked into version
   control. This lets users change settings applicable to this project only.

3. ``$HOME/.pw_console.yaml``

   A global user based config file. This file is located in the user's home
   directory and settings here apply to all projects. This is a good location to
   set appearance options such as:

   .. code-block:: yaml

      ---
      config_title: pw_console
      ui_theme: nord
      code_theme: pigweed-code
      swap_light_and_dark: False
      spaces_between_columns: 2
      hide_date_from_log_time: False

It's also possible to specify a config file via a shell environment variable. If
this method is used only this config file is applied. Project and user config
file options will not be set.

::

   export PW_CONSOLE_CONFIG_FILE=/home/.config/pw_console/config.yaml

Example Config
~~~~~~~~~~~~~~

.. code-block:: yaml

   ---
   config_title: pw_console

   # Repl and Search History files
   # Setting these to a file located $PW_PROJECT_ROOT is a
   # good way to make Python repl history project specific.

   # Default: $HOME/.pw_console_history
   repl_history: $PW_PROJECT_ROOT/.pw_console_history

   # Default: $HOME/.pw_console_search
   search_history: $PW_PROJECT_ROOT/.pw_console_search

   # Theme Settings

   # Default: dark
   ui_theme: high-contrast-dark

   # Default: pigweed-code
   code_theme: material

   # Default: False
   swap_light_and_dark: False

   # Log Table View Settings

   # Number of spaces to insert between columns
   # Default: 2
   spaces_between_columns: 2

   # Hide the year month and day from the time column.
   hide_date_from_log_time: False

   # Show the Python file and line number responsible for creating log messages.
   show_python_file: False
   # Show the Python logger responsible for creating log messages.
   show_python_logger: False
   # Show the 'file' metadata column.
   show_source_file: False

   # Custom Column Ordering
   # By default columns are ordered as:
   #   time, level, metadata1, metadata2, ..., message
   # The log message is always the last value and not required in this list.
   column_order:
     # Column name
     - time
     - level
     - metadata1
     - metadata2

   # If True, any metadata field not listed above in 'column_order'
   # will be hidden in table view.
   column_order_omit_unspecified_columns: False

   # Unique Colors for Column Values
   #   Color format: 'bg:#BG-HEX #FG-HEX STYLE'
   # All parts are optional.
   # Empty strings will leave styling unchanged.
   column_colors:
     # Column name
     time:
     level:
     metadata1:
       # Field values
       # Default will be applied if no match found
       default: '#98be65'
       BATTERY: 'bg:#6699cc #000000 bold'
       CORE1: 'bg:#da8548 #000000 bold'
       CORE2: 'bg:#66cccc #000000 bold'
     metadata2:
       default: '#ffcc66'
       APP: 'bg:#ff6c6b #000000 bold'
       WIFI: '#555555'

   # Each window column is normally aligned side by side in vertical splits. You
   # can change this to one group of windows on top of the other with horizontal
   # splits using this method

   # Default: vertical
   window_column_split_method: vertical

   # Window Layout
   windows:
     # First window column (vertical split)
     # Each split should have a unique name and include either
     # 'stacked' or 'tabbed' to select a window pane display method.
     Split 1 stacked:
       # Items here are window titles, each should be unique.
       # Window 1
       Device Logs:
         height: 33  # Weighted value for window height
         hidden: False  # Hide this window if True
       # Window 2
       Python Repl:
         height: 67
       # Window 3
       Host Logs:
         hidden: True

     # Second window column
     Split 2 tabbed:
       # This is a duplicate of the existing 'Device Logs' window.
       # The title is 'NEW DEVICE'
       NEW DEVICE:
         duplicate_of: Device Logs
         # Log filters are defined here
         filters:
           # Metadata column names here or 'all'
           source_name:
             # Matching method name here
             # regex, regex-inverted, string, string-inverted
             regex: 'USB'
           module:
             # An inverted match will remove matching log lines
             regex-inverted: 'keyboard'
       NEW HOST:
         duplicate_of: Host Logs
         filters:
           all:
             string: 'FLASH'

     # Third window column
     Split 3 tabbed:
       # This is a brand new log Window
       Keyboard Logs - IBM:
         loggers:
           # Python logger names to include in this log window
           my_cool_keyboard_device:
             # Level the logger should be set to.
             level: DEBUG
           # The empty string logger name is the root Python logger.
           # In most cases this should capture all log messages.
           '':
             level: DEBUG
         filters:
           all:
             regex: 'IBM Model M'
       Keyboard Logs - Apple:
         loggers:
           my_cool_keyboard_device:
             level: DEBUG
         filters:
           all:
             regex: 'Apple.*USB'

   # Command Runner dialog size and position
   command_runner:
     width: 80
     height: 10
     position:
       top: 3  # 3 lines below the top edge of the screen
       # Alternatively one of these options can be used instead:
       # bottom: 2  # 2 lines above the bottom edge of the screen
       # left: 2    # 2 lines away from the left edge of the screen
       # right: 2   # 2 lines away from the right edge of the screen

   # Key bindings can be changed as well with the following format:
   #   named-command: [ list_of_keys ]
   # Where list_of_keys is a string of keys one for each alternate key
   # To see all named commands open '[Help] > View Key Binding Config'
   # See below for the names of special keys
   key_bindings:
     log-pane.move-cursor-up:
     - j
     - up
     log-pane.move-cursor-down:
     - k
     - down
     log-pane.search-next-match:
     - n
     log-pane.search-previous-match:
     - N

     # Chorded keys are supported.
     # For example, 'z t' means pressing z quickly followed by t.
     log-pane.shift-line-to-top:
     - z t
     log-pane.shift-line-to-center:
     - z z

   # Python Repl Snippets (Project owned)
   snippets:
     Count Ten Times: |
       for i in range(10):
           print(i)
     Local Variables: |
       locals()

   # Python Repl Snippets (User owned)
   user_snippets:
     Pretty print format function: |
       import pprint
       _pretty_format = pprint.PrettyPrinter(indent=1, width=120).pformat
     Global variables: |
       globals()


Changing Keyboard Shortcuts
---------------------------

Pigweed Console uses `prompt_toolkit
<https://python-prompt-toolkit.readthedocs.io/en/latest/>`_ to manage its
keybindings.

Bindings can be changed in the YAML config file under the ``key_bindings:``
section by adding a named function followed by a of keys to bind. For example
this config sets the keys for log pane cursor movement.

- Moving down is set to :kbd:`j` or the :kbd:`Down` arrow.
- Moving up is set to :kbd:`k` or the :kbd:`Up` arrow.

.. code-block:: yaml

   key_bindings:
     log-pane.move-cursor-down:
     - j
     - down
     log-pane.move-cursor-up:
     - k
     - up

List of Special Key Names
~~~~~~~~~~~~~~~~~~~~~~~~~

This table is from prompt_toolkit's :bdg-link-primary-line:`List of special keys
<https://python-prompt-toolkit.readthedocs.io/en/latest/pages/advanced_topics/key_bindings.html#list-of-special-keys>`.

.. list-table::
   :widths: 30 70
   :header-rows: 1

   * - Keyboard Function
     - Key Values

   * - Literal characters
     - ``a b c d e f g h i j k l m n o p q r s t u v w x y z``
       ``A B C D E F G H I J K L M N O P Q R S T U V W X Y Z``
       ``1 2 3 4 5 6 7 8 9 0``
       ``! @ # $ % ^ & * ( )``
       ``- _ + = ~``

   * - Escape and Shift-Escape
     - ``escape`` ``s-escape``

   * - Arrows
     - ``left`` ``right`` ``up`` ``down``

   * - Navigation
     - ``home`` ``end`` ``delete`` ``pageup`` ``pagedown`` ``insert``

   * - Control-letter
     - ``c-a c-b c-c c-d c-e c-f c-g c-h c-i c-j c-k c-l c-m``
       ``c-n c-o c-p c-q c-r c-s c-t c-u c-v c-w c-x c-y c-z``

   * - Control-number
     - ``c-1`` ``c-2`` ``c-3`` ``c-4`` ``c-5`` ``c-6`` ``c-7`` ``c-8`` ``c-9`` ``c-0``

   * - Control-arrow
     - ``c-left`` ``c-right`` ``c-up`` ``c-down``

   * - Other control keys
     - ``c-@`` ``c-\`` ``c-]`` ``c-^`` ``c-_`` ``c-delete``

   * - Shift-arrow
     - ``s-left`` ``s-right`` ``s-up`` ``s-down``

   * - Control-Shift-arrow
     - ``c-s-left`` ``c-s-right`` ``c-s-up`` ``c-s-down``

   * - Other Shift` keys
     - ``s-delete`` ``s-tab``

   * - F Keys
     - ``f1  f2  f3  f4  f5  f6  f7  f8  f9  f10 f11 f12``
       ``f13 f14 f15 f16 f17 f18 f19 f20 f21 f22 f23 f24``

There are some key aliases as well. Most of these exist due to how keys are
processed in VT100 terminals. For example when pressing :kbd:`Tab` terminal
emulators receive :kbd:`Ctrl-i`.

.. list-table::
   :widths: 40 60
   :header-rows: 1

   * - Key
     - Key Value Alias

   * - Space
     - ``space``

   * - ``c-h``
     - ``backspace``

   * - ``c-@``
     - ``c-space``

   * - ``c-m``
     - ``enter``

   * - ``c-i``
     - ``tab``

Binding Alt / Option / Meta
~~~~~~~~~~~~~~~~~~~~~~~~~~~

In terminals the :kbd:`Alt` key is converted into a leading :kbd:`Escape` key
press. For example pressing :kbd:`Alt-t` actually sends the :kbd:`Escape` key
followed by the :kbd:`t` key. Similarly :kbd:`Ctrl-Alt-t` sends :kbd:`Escape`
followed by :kbd:`Ctrl-t`.

To bind :kbd:`Alt` (or :kbd:`Option` on MacOS) add ``escape`` before the key
that should be modified.

.. code-block:: yaml

   key_bindings:
     window-manager.move-pane-down:
     - escape c-up  # Alt-Ctrl-up
     window-manager.move-pane-left:
     - escape c-left  # Alt-Ctrl-left
     window-manager.move-pane-right:
     - escape c-right  # Alt-Ctrl-right
     window-manager.move-pane-up:
     - escape c-down  # Alt-Ctrl-down

Key Sequence Bindings
~~~~~~~~~~~~~~~~~~~~~

Bindings can consist of multiple key presses in sequence. This is also known as
chorded keys. Multiple keys separated by spaces define a chorded key
binding. For example to bind :kbd:`z` quickly followed by :kbd:`t` use ``z t``.

.. code-block:: yaml

   key_bindings:
     log-pane.shift-line-to-top:
     - z t
     log-pane.shift-line-to-center:
     - z z


Known Issues
------------

Log Window
~~~~~~~~~~

- Tab character rendering will not work in the log pane view. They will
  appear as ``^I`` since prompt_toolkit can't render them. See this issue for
  details:
  https://github.com/prompt-toolkit/python-prompt-toolkit/issues/556


Upcoming Features
-----------------

For upcoming features see the Pigweed Console Bug Hotlist at:
https://bugs.chromium.org/u/542633886/hotlists/Console


Feature Requests
~~~~~~~~~~~~~~~~

Create a feature request bugs using this template:
https://bugs.chromium.org/p/pigweed/issues/entry?owner=tonymd@google.com&labels=Type-Enhancement,Priority-Medium&summary=pw_console
