Skip to main content

Read-Eval-Print-Loop

deno repl starts a read-eval-print-loop, which lets you interactively build up program state in the global context, it is especially useful for quick prototyping and checking snippets of code.

⚠️ Deno REPL supports JavaScript as well as TypeScript, however TypeScript code is not type-checked, instead it is transpiled to JavaScript behind the scenes.

⚠️ To make it easier to copy-paste code samples, Deno REPL supports import and export declarations. It means that you can paste code containing import ... from ...;, export class ... or export function ... and it will work as if you were executing a regular ES module.

Special variables

The REPL provides a couple of special variables, that are always available:

IdentifierDescription
_Yields the last evaluated expression
_errorYields the last thrown error
Deno 1.14.3
exit using ctrl+d or close()
> "hello world!"
"hello world!"
> _
"hello world!"
> const foo = "bar";
undefined
> _
undefined

Special functions

The REPL provides several functions in the global scope:

FunctionDescription
clear()Clears the entire terminal screen
close()Close the current REPL session

--eval flag

--eval flag allows you to run some code in the runtime before you are dropped into the REPL. This is useful for importing some code you commonly use in the REPL, or modifying the runtime in some way:

$ deno repl --allow-net --eval 'import { assert } from "https://deno.land/std/assert/mod.ts"'
Deno 1.36.0
exit using ctrl+d, ctrl+c, or close()
> assert(true)
undefined
> assert(false)
Uncaught AssertionError
at assert (https://deno.land/std@0.197.0/assert/assert.ts:7:11)
at <anonymous>:2:1

--eval-file flag

--eval-file flag allows you to run code from specified files before you are dropped into the REPL. Like the --eval flag, this is useful for importing code you commonly use in the REPL, or modifying the runtime in some way.

Files can be specified as paths or URLs. URL files are cached and can be reloaded via the --reload flag.

If --eval is also specified, then --eval-file files are run before the --eval code.

$ deno repl --eval-file=https://examples.deno.land/hello-world.ts,https://deno.land/std/encoding/ascii85.ts
Download https://examples.deno.land/hello-world.ts
Hello, World!
Download https://deno.land/std/encoding/ascii85.ts
Deno 1.20.5
exit using ctrl+d or close()
> rfc1924 // local (not exported) variable defined in ascii85.ts
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"

Relative Import Path Resolution

If --eval-file specifies a code file that contains relative imports, then the runtime will try to resolve the imports relative to the current working directory. It will not try to resolve them relative to the code file's location. This can cause "Module not found" errors when --eval-file is used with module files:

$ deno repl --eval-file=https://deno.land/std/hash/md5.ts
error in --eval-file file https://deno.land/std/hash/md5.ts. Uncaught TypeError: Module not found "file:///home/encoding/hex.ts".
at async <anonymous>:2:13
Deno 1.20.5
exit using ctrl+d or close()
> close()
$ deno repl --eval-file=https://deno.land/std/encoding/hex.ts
Download https://deno.land/std/encoding/hex.ts
Deno 1.20.5
exit using ctrl+d or close()
>

Tab completions

Tab completions are crucial feature for quick navigation in REPL. After hitting tab key, Deno will now show a list of all possible completions.

$ deno repl
Deno 1.14.3
exit using ctrl+d or close()
> Deno.read
readTextFile readFile readDirSync readLinkSync readAll read
readTextFileSync readFileSync readDir readLink readAllSync readSync

Keyboard shortcuts

KeystrokeAction
Ctrl-A, HomeMove cursor to the beginning of line
Ctrl-B, LeftMove cursor one character left
Ctrl-CInterrupt and cancel the current edit
Ctrl-DIf if line is empty, signal end of line
Ctrl-D, DelIf line is not empty, delete character under cursor
Ctrl-E, EndMove cursor to end of line
Ctrl-F, RightMove cursor one character right
Ctrl-H, BackspaceDelete character before cursor
Ctrl-I, TabNext completion
Ctrl-J, Ctrl-M, EnterFinish the line entry
Ctrl-KDelete from cursor to end of line
Ctrl-LClear screen
Ctrl-N, DownNext match from history
Ctrl-P, UpPrevious match from history
Ctrl-RReverse Search history (Ctrl-S forward, Ctrl-G cancel)
Ctrl-TTranspose previous character with current character
Ctrl-UDelete from start of line to cursor
Ctrl-VInsert any special character without performing its associated action
Ctrl-WDelete word leading up to cursor (using white space as a word boundary)
Ctrl-X Ctrl-UUndo
Ctrl-YPaste from Yank buffer
Ctrl-YPaste from Yank buffer (Meta-Y to paste next yank instead)
Ctrl-ZSuspend (Unix only)
Ctrl-_Undo
Meta-0, 1, ..., -Specify the digit to the argument. starts a negative argument.
Meta-<Move to first entry in history
Meta->Move to last entry in history
Meta-B, Alt-LeftMove cursor to previous word
Meta-BackspaceKill from the start of the current word, or, if between words, to the start of the previous word
Meta-CCapitalize the current word
Meta-DDelete forwards one word
Meta-F, Alt-RightMove cursor to next word
Meta-LLower-case the next word
Meta-TTranspose words
Meta-UUpper-case the next word
Meta-YSee Ctrl-Y
Ctrl-SInsert a new line

DENO_REPL_HISTORY

You can use DENO_REPL_HISTORY environmental variable to control where Deno stores the REPL history file. You can set it to an empty value, Deno will not store the history file.