---
layout: docu
redirect_from:
- /docs/api/cli/editing
- /docs/api/cli/editing/
- /docs/clients/cli/editing
title: Editing
---

> The linenoise-based CLI editor is currently only available for macOS and Linux.

DuckDB's CLI uses a line-editing library based on [linenoise](https://github.com/antirez/linenoise), which has shortcuts that are based on [Emacs mode of readline](https://readline.kablamo.org/emacs.html). Below is a list of available commands.

## Moving

|       Key       |                                 Action                                 |
|-----------------|------------------------------------------------------------------------|
| `Left`          | Move back a character                                                  |
| `Right`         | Move forward a character                                               |
| `Up`            | Move up a line. When on the first line, move to previous history entry |
| `Down`          | Move down a line. When on last line, move to next history entry        |
| `Home`          | Move to beginning of buffer                                            |
| `End`           | Move to end of buffer                                                  |
| `Ctrl`+`Left`   | Move back a word                                                       |
| `Ctrl`+`Right`  | Move forward a word                                                    |
| `Ctrl`+`A`      | Move to beginning of buffer                                            |
| `Ctrl`+`B`      | Move back a character                                                  |
| `Ctrl`+`E`      | Move to end of buffer                                                  |
| `Ctrl`+`F`      | Move forward a character                                               |
| `Alt`+`Left`    | Move back a word                                                       |
| `Alt`+`Right`   | Move forward a word                                                    |

## History

|     Key    |            Action              |
|------------|--------------------------------|
| `Ctrl`+`P` | Move to previous history entry |
| `Ctrl`+`N` | Move to next history entry     |
| `Ctrl`+`R` | Search the history             |
| `Ctrl`+`S` | Search the history             |
| `Alt`+`<`  | Move to first history entry    |
| `Alt`+`>`  | Move to last history entry     |
| `Alt`+`N`  | Search the history             |
| `Alt`+`P`  | Search the history             |

## Changing Text

|        Key        | Action                                                   |
|-------------------|----------------------------------------------------------|
| `Backspace`       | Delete previous character                                |
| `Delete`          | Delete next character                                    |
| `Ctrl`+`D`        | Delete next character. When buffer is empty, end editing |
| `Ctrl`+`H`        | Delete previous character                                |
| `Ctrl`+`K`        | Delete everything after the cursor                       |
| `Ctrl`+`T`        | Swap current and next character                          |
| `Ctrl`+`U`        | Delete all text                                          |
| `Ctrl`+`W`        | Delete previous word                                     |
| `Alt`+`C`         | Convert next word to titlecase                           |
| `Alt`+`D`         | Delete next word                                         |
| `Alt`+`L`         | Convert next word to lowercase                           |
| `Alt`+`R`         | Delete all text                                          |
| `Alt`+`T`         | Swap current and next word                               |
| `Alt`+`U`         | Convert next word to uppercase                           |
| `Alt`+`Backspace` | Delete previous word                                     |
| `Alt`+`\`         | Delete spaces around cursor                              |

## Completing

|      Key      |                          Action                        |
|---------------|--------------------------------------------------------|
| `Tab`         | Autocomplete. When autocompleting, cycle to next entry |
| `Shift`+`Tab` | When autocompleting, cycle to previous entry           |
| `Esc`+`Esc`   | When autocompleting, revert autocompletion             |

## Miscellaneous

|    Key     |                           Action                                                   |
|------------|------------------------------------------------------------------------------------|
| `Enter`    | Execute query. If query is not complete, insert a newline at the end of the buffer |
| `Ctrl`+`J` | Execute query. If query is not complete, insert a newline at the end of the buffer |
| `Ctrl`+`C` | Cancel editing of current query                                                    |
| `Ctrl`+`G` | Cancel editing of current query                                                    |
| `Ctrl`+`L` | Clear screen                                                                       |
| `Ctrl`+`O` | Cancel editing of current query                                                    |
| `Ctrl`+`X` | Insert a newline after the cursor                                                  |
| `Ctrl`+`Z` | Suspend CLI and return to shell, use `fg` to re-open                               |

## Using Read-Line

If you prefer, you can use [`rlwrap`](https://github.com/hanslub42/rlwrap) to use read-line directly with the shell. Then, use `Shift`+`Enter` to insert a newline and `Enter` to execute the query:

```bash
rlwrap --substitute-prompt="D " duckdb -batch
```