---
# Copyright (c) 2017, 2026, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

title: 'JSHELL(1) JDK @@VERSION_SHORT@@ | JDK Commands'
date: @@COPYRIGHT_YEAR@@
lang: en
---

## Name

jshell - interactively evaluate declarations, statements, and expressions of
the Java programming language in a read-eval-print loop (REPL)

## Synopsis

`jshell` \[*options*\] \[*load-files*\]

*options*
:   Command-line options, separated by spaces. See [Options for jshell].

*load-files*
:   One or more scripts to run when the tool is started. Scripts can contain
    any valid code snippets or JShell commands.

    The script can be a local file or one of following predefined scripts:

    `DEFAULT`
    :   Loads the default entries, which are commonly used as imports.

    `JAVASE`
    :   Imports all Java SE packages.

    `PRINTING`
    :   Defines `print`, `println`, and `printf` as `jshell` methods for use
        within the tool.

    `TOOLING`
    :   Defines `javac`, `jar`, and other methods for running JDK tools via
        their command-line interface within the `jshell` tool.

    For more than one script, use a space to separate the names. Scripts are
    run in the order in which they're entered on the command line. Command-line
    scripts are run after startup scripts. To run a script after JShell is
    started, use the `/open` command.

    To accept input from standard input and suppress the interactive I/O, enter
    a hyphen (-) for *load-files*. This option enables the use of the `jshell`
    tool in pipe chains.

## Description

JShell provides a way to interactively evaluate declarations, statements, and
expressions of the Java programming language, making it easier to learn the
language, explore unfamiliar code and APIs, and prototype complex code. Java
statements, variable definitions, method definitions, class definitions, import
statements, and expressions are accepted. The bits of code entered are called
snippets.

As snippets are entered, they're evaluated, and feedback is provided. Feedback
varies from the results and explanations of actions to nothing, depending on
the snippet entered and the feedback mode chosen. Errors are described
regardless of the feedback mode. Start with the verbose mode to get the most
feedback while learning the tool.

Command-line options are available for configuring the initial environment when
JShell is started. Within JShell, commands are available for modifying the
environment as needed.

Existing snippets can be loaded from a file to initialize a JShell session, or
at any time within a session. Snippets can be modified within the session to
try out different variations and make corrections. To keep snippets for later
use, save them to a file.

## Options for jshell

`--add-exports` *module*/*package*
:   Specifies a package to be considered as exported from its defining module.

`--add-modules` *module*\[`,`*module*...\]
:   Specifies the root modules to resolve in addition to the initial module.

`-C`*flag*
:   passes *flag* to the Java compiler inside JShell. For example, `-C-Xlint`
    enables all the recommended lint warnings, and `-C--release=<N>` compiles
    for Java SE N, as if --release N was specified.

`--class-path` *path*
:   Specifies the directories and archives that are searched to locate class
    files. This option overrides the path in the `CLASSPATH` environment
    variable. If the environment variable isn't set and this option isn't used,
    then the current directory is searched. For Linux and macOS, use a colon
    (:) to separate items in the path. For Windows, use a semicolon (;) to
    separate items.

`--enable-preview`
:   Allows code to depend on the preview features of this release.

`--execution` *specification*
:   Specifies an alternate execution engine, where *specification* is an
    ExecutionControl spec. See the documentation of the package jdk.jshell.spi
    for the syntax of the spec.

`--feedback` *mode*
:   Sets the initial level of feedback provided in response to what's entered.
    The initial level can be overridden within a session by using the
    `/set feedback` *mode* command. The default is `normal`.

    The following values are valid for *mode*:

    `verbose`
    :   Provides detailed feedback for entries. Additional information about
        the action performed is displayed after the result of the action. The
        next prompt is separated from the feedback by a blank line.

    `normal`
    :   Provides an average amount of feedback. The next prompt is separated
        from the feedback by a blank line.

    `concise`
    :   Provides minimal feedback. The next prompt immediately follows the code
        snippet or feedback.

    `silent`
    :   Provides no feedback. The next prompt immediately follows the code
        snippet.

    *custom*
    :   Provides custom feedback based on how the mode is defined. Custom
        feedback modes are created within JShell by using the `/set mode`
        command.

`--help` or `-h` or `-?`
:   Prints a summary of standard options and exits the tool.

`--help-extra` or `-X`
:   Prints a summary of nonstandard options and exits the tool. Nonstandard
    options are subject to change without notice.

`-J`*flag*
:   passes *flag* to the runtime system, but has no effect on the execution of
    code snippets. To specify flags that affect the execution of code snippets,
    use `-R`*flag*. Alternatively, use `-J`*flag* with `--execution local`.

`--module-path` *modulepath*
:   Specifies where to find application modules. For Linux and macOS, use a
    colon (:) to separate items in the path. For Windows, use a semicolon (;)
    to separate items.

`--no-startup`
:   Prevents startup scripts from running when JShell starts. Use this option
    to run only the scripts entered on the command line when JShell is started,
    or to start JShell without any preloaded information if no scripts are
    entered. This option can't be used if the `--startup` option is used.

`-q`
:   Sets the feedback mode to `concise`, which is the same as entering
    `--feedback concise`.

`-R`*flag*
:   passes *flag* to the runtime system only when code snippets are executed.
    For example, `-R-Dfoo=bar` means that execution of the snippet
    `System.getProperty("foo")` will return `"bar"`.

`-s`
:   Sets the feedback mode to `silent`, which is the same as entering
    `--feedback silent`.

`--show-version`
:   Prints version information and enters the tool.

`--startup` *file*
:   Overrides the default startup script for this session. The script can
    contain any valid code snippets or commands.

    The script can be a local file or one of the following predefined scripts:

    `DEFAULT`
    :   Loads the default entries, which are commonly used as imports.

    `JAVASE`
    :   Imports all Java SE packages.

    `PRINTING`
    :   Defines `print`, `println`, and `printf` as `jshell` methods for use
        within the tool.

    `TOOLING`
    :   Defines `javac`, `jar`, and other methods for running JDK tools via
        their command-line interface within the `jshell` tool.

    For more than one script, provide a separate instance of this option for
    each script. Startup scripts are run when JShell is first started and when
    the session is restarted with the `/reset`, `/reload`, or `/env` command.
    Startup scripts are run in the order in which they're entered on the
    command line.

    This option can't be used if the `--no-startup` option is used.

`-v`
:   Sets the feedback mode to `verbose`, which is the same as entering
    `--feedback verbose`.

`--version`
:   Prints version information and exits the tool.

## jshell Commands

Within the `jshell` tool, commands are used to modify the environment and
manage code snippets.

`/drop` {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
:   Drops snippets identified by name, ID, or ID range, making them inactive.
    For a range of IDs, provide the starting ID and ending ID separated with a
    hyphen. To provide a list, separate the items in the list with a space. Use
    the `/list` command to see the IDs of code snippets.

`/edit` \[*option*\]
:   Opens an editor. If no option is entered, then the editor opens with the
    active snippets.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Opens the editor with the snippets identified by name, ID, or ID range.
        For a range of IDs, provide the starting ID and ending ID separated
        with a hyphen. To provide a list, separate the items in the list with a
        space. Use the `/list` command to see the IDs of code snippets.

    `-all`
    :   Opens the editor with all snippets, including startup snippets and
        snippets that failed, were overwritten, or were dropped.

    `-start`
    :   Opens the editor with startup snippets that were evaluated when JShell
        was started.

    To exit edit mode, close the editor window, or respond to the prompt
    provided if the `-wait` option was used when the editor was set.

    Use the `/set editor` command to specify the editor to use. If no editor is
    set, then the following environment variables are checked in order:
    `JSHELLEDITOR`, `VISUAL`, and `EDITOR`. If no editor is set in JShell and
    none of the editor environment variables is set, then a simple default
    editor is used.

`/env` \[*options*\]
:   Displays the environment settings, or updates the environment settings and
    restarts the session. If no option is entered, then the current environment
    settings are displayed. If one or more options are entered, then the
    session is restarted as follows:

    -   Updates the environment settings with the provided options.

    -   Resets the execution state.

    -   Runs the startup scripts.

    -   Silently replays the history in the order entered. The history includes
        all valid snippets or `/drop` commands entered at the `jshell` prompt,
        in scripts entered on the command line, or scripts entered with the
        `/open` command.

    Environment settings entered on the command line or provided with a
    previous `/reset`, `/env`, or `/reload` command are maintained unless an
    *option* is entered that overwrites the setting.

    The following options are valid:

    `--add-modules` *module*\[`,`*module*...\]
    :   Specifies the root modules to resolve in addition to the initial
        module.

    `--add-exports` *source-module*`/`*package*`=`*target-module*\[`,`*target-module*\]\*
    :   Adds an export of *package* from *source-module* to *target-module*.

    `--class-path` *path*
    :   Specifies the directories and archives that are searched to locate
        class files. This option overrides the path in the `CLASSPATH`
        environment variable. If the environment variable isn't set and this
        option isn't used, then the current directory is searched. For Linux
        and macOS, use a colon (`:`) to separate items in the path. For Windows,
        use a semicolon (`;`) to separate items.

    `--module-path` *modulepath*
    :   Specifies where to find application modules. For Linux and macOS, use
        a colon (`:`) to separate items in the path. For Windows, use a
        semicolon (`;`) to separate items.

`/exit` \[*integer-expression-snippet*\]
:   Exits the tool. If no snippet is entered, the exit status is zero. If a
    snippet is entered and the result of the snippet is an integer, the result
    is used as the exit status. If an error occurs, or the result of the
    snippet is not an integer, an error is displayed and the tool remains
    active.

`/history`
:   Displays what was entered in this session.

`/help` \[*command*\|*subject*\]
:   Displays information about commands and subjects. If no options are
    entered, then a summary of information for all commands and a list of
    available subjects are displayed. If a valid command is provided, then
    expanded information for that command is displayed. If a valid subject is
    entered, then information about that subject is displayed.

    The following values for *subject* are valid:

    `context`
    :   Describes the options that are available for configuring the
        environment.

    `intro`
    :   Provides an introduction to the tool.

    `shortcuts`
    :   Describes keystrokes for completing commands and snippets. See [Input
        Shortcuts].

`/imports`
:   Displays the current active imports, including those from the startup
    scripts and scripts that were entered on the command line when JShell was
    started.

`/list` \[*option*\]
:   Displays a list of snippets and their IDs. If no option is entered, then
    all active snippets are displayed, but startup snippets aren't.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Displays the snippets identified by name, ID, or ID range. For a range
        of IDs, provide the starting ID and ending ID separated with a hyphen.
        To provide a list, separate the items in the list with a space.

    `-all`
    :   Displays all snippets, including startup snippets and snippets that
        failed, were overwritten, or were dropped. IDs that begin with `s` are
        startup snippets. IDs that begin with `e` are snippets that failed.

    `-start`
    :   Displays startup snippets that were evaluated when JShell was started.

`/methods` \[*option*\]
:   Displays information about the methods that were entered. If no option is
    entered, then the name, parameter types, and return type of all active
    methods are displayed.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Displays information for methods identified by name, ID, or ID range.
        For a range of IDs, provide the starting ID and ending ID separated
        with a hyphen. To provide a list, separate the items in the list with a
        space. Use the `/list` command to see the IDs of code snippets.

    `-all`
    :   Displays information for all methods, including those added when JShell
        was started, and methods that failed, were overwritten, or were
        dropped.

    `-start`
    :   Displays information for startup methods that were added when JShell
        was started.

`/open` *file*
:   Opens the script specified and reads the snippets into the tool. The script
    can be a local file or one of the following predefined scripts:

    `DEFAULT`
    :   Loads the default entries, which are commonly used as imports.

    `JAVASE`
    :   Imports all Java SE packages.

    `PRINTING`
    :   Defines `print`, `println`, and `printf` as `jshell` methods for use
        within the tool.

    `TOOLING`
    :   Defines `javac`, `jar`, and other methods for running JDK tools via
        their command-line interface within the `jshell` tool.

`/reload` \[*options*\]
:   Restarts the session as follows:

    -   Updates the environment settings with the provided options, if any.

    -   Resets the execution state.

    -   Runs the startup scripts.

    -   Replays the history in the order entered. The history includes all
        valid snippets or `/drop` commands entered at the `jshell` prompt, in
        scripts entered on the command line, or scripts entered with the
        `/open` command.

    Environment settings entered on the command line or provided with a
    previous `/reset`, `/env`, or `/reload` command are maintained unless an
    *option* is entered that overwrites the setting.

    The following options are valid:

    `--add-modules` *module*\[`,`*module*...\]
    :   Specifies the root modules to resolve in addition to the initial
        module.

    `--add-exports` *source-module*`/`*package*`=`*target-module*\[`,`*target-module*\]\*
    :   Adds an export of *package* from *source-module* to *target-module*.

    `--class-path` *path*
    :   Specifies the directories and archives that are searched to locate
        class files. This option overrides the path in the `CLASSPATH`
        environment variable. If the environment variable isn't set and this
        option isn't used, then the current directory is searched. For Linux
        and macOS, use a colon (`:`) to separate items in the path. For
        Windows, use a semicolon (`;`) to separate items.

    `--module-path` *modulepath*
    :   Specifies where to find application modules. For Linux and macOS, use
        a colon (`:`) to separate items in the path. For Windows, use a
        semicolon (`;`) to separate items.

    `-quiet`
    :   Replays the valid history without displaying it. Errors are displayed.

    `-restore`
    :   Resets the environment to the state at the start of the previous run of
        the tool or to the last time a `/reset`, `/reload`, or `/env` command
        was executed in the previous run. The valid history since that point is
        replayed. Use this option to restore a previous JShell session.

`/reset` \[*options*\]
:   Discards all entered snippets and restarts the session as follows:

    -   Updates the environment settings with the provided options, if any.

    -   Resets the execution state.

    -   Runs the startup scripts.

    History is not replayed. All code that was entered is lost.

    Environment settings entered on the command line or provided with a
    previous `/reset`, `/env`, or `/reload` command are maintained unless an
    *option* is entered that overwrites the setting.

    The following options are valid:

    `--add-modules` *module*\[`,`*module*...\]
    :   Specifies the root modules to resolve in addition to the initial
        module.

    `--add-exports` *source-module*`/`*package*`=`*target-module*\[`,`*target-module*\]\*
    :   Adds an export of *package* from *source-module* to *target-module*.

    `--class-path` *path*
    :   Specifies the directories and archives that are searched to locate
        class files. This option overrides the path in the `CLASSPATH`
        environment variable. If the environment variable isn't set and this
        option isn't used, then the current directory is searched. For Linux
        and macOS, use a colon (`:`) to separate items in the path. For
        Windows, use a semicolon (`;`) to separate items.

    `--module-path` *modulepath*
    :   Specifies where to find application modules. For Linux and macOS, use
        a colon (`:`) to separate items in the path. For Windows, use a
        semicolon (`;`) to separate items.

`/save` \[*options*\] *file*
:   Saves snippets and commands to the file specified. If no options are
    entered, then active snippets are saved.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Saves the snippets and commands identified by name, ID, or ID range.
        For a range of IDs, provide the starting ID and ending ID separated
        with a hyphen. To provide a list, separate the items in the list with a
        space. Use the `/list` command to see the IDs of the code snippets.

    `-all`
    :   Saves all snippets, including startup snippets and snippets that were
        overwritten or failed.

    `-history`
    :   Saves the sequential history of all commands and snippets entered in
        the current session.

    `-start`
    :   Saves the current startup settings. If no startup scripts were
        provided, then an empty file is saved.

`/set` \[*setting*\]
:   Sets configuration information, including the external editor, startup
    settings, and feedback mode. This command is also used to create a custom
    feedback mode with customized prompt, format, and truncation values. If no
    setting is entered, then the current setting for the editor, startup
    settings, and feedback mode are displayed.

    The following values are valid for `setting`:

    `editor` \[*options*\] \[*command*\]
    :   Sets the command used to start an external editor when the `/edit`
        command is entered. The command can include command arguments separated
        by spaces. If no command or options are entered, then the current
        setting is displayed.

        The following options are valid:

        `-default`
        :   Sets the editor to the default editor provided with JShell. This
            option can't be used if a command for starting an editor is
            entered.

        `-delete`
        :   Sets the editor to the one in effect when the session started. If
            used with the `-retain` option, then the retained editor setting is
            deleted and the editor is set to the first of the following
            environment variables found: `JSHELLEDITOR`, `VISUAL`, or `EDITOR`.
            If none of the editor environment variables are set, then this
            option sets the editor to the default editor.

            This option can't be used if a command for starting an editor is
            entered.

        `-retain`
        :   Saves the editor setting across sessions. If no other option or a
            command is entered, then the current setting is saved.

        `-wait`
        :   Prompts the user to indicate when editing is complete. Otherwise
            control returns to JShell when the editor exits. Use this option if
            the editor being used exits immediately, for example, when an edit
            window already exists. This option is valid only when a command for
            starting an editor is entered.

    `feedback` \[*mode*\]
    :   Sets the feedback mode used to respond to input. If no mode is entered,
        then the current mode is displayed.

        The following modes are valid: `concise`, `normal`, `silent`,
        `verbose`, and any custom mode created with the `/set mode` command.

    `format` *mode* *field* `"`*format-string*`"` *selector*
    :   Sets the format of the feedback provided in response to input. If no
        mode is entered, then the current formats for all fields for all
        feedback modes are displayed. If only a mode is entered, then the
        current formats for that mode are displayed. If only a mode and field
        are entered, then the current formats for that field are displayed.

        To define a format, the following arguments are required:

        *mode*
        :   Specifies a feedback mode to which the response format is applied.
            Only custom modes created with the `/set mode` command can be
            modified.

        *field*
        :   Specifies a context-specific field to which the response format is
            applied. The fields are described in the online help, which is
            accessed from JShell using the `/help /set format` command.

        `"`*format-string*`"`
        :   Specifies the string to use as the response format for the
            specified field and selector. The structure of the format string is
            described in the online help, which is accessed from JShell using
            the `/help /set format` command.

        *selector*
        :   Specifies the context in which the response format is applied. The
            selectors are described in the online help, which is accessed from
            JShell using the `/help /set format` command.

    `mode` \[*mode-name*\] \[*existing-mode*\] \[*options*\]
    :   Creates a custom feedback mode with the mode name provided. If no mode
        name is entered, then the settings for all modes are displayed, which
        includes the mode, prompt, format, and truncation settings. If the name
        of an existing mode is provided, then the settings from the existing
        mode are copied to the mode being created.

        The following options are valid:

        `-command`\|`-quiet`
        :   Specifies the level of feedback displayed for commands when using
            the mode. This option is required when creating a feedback mode.
            Use `-command` to show information and verification feedback for
            commands. Use `-quiet` to show only essential feedback for
            commands, such as error messages.

        `-delete`
        :   Deletes the named feedback mode for this session. The name of the
            mode to delete is required. To permanently delete a retained mode,
            use the `-retain` option with this option. Predefined modes can't
            be deleted.

        `-retain`
        :   Saves the named feedback mode across sessions. The name of the mode
            to retain is required.

        Configure the new feedback mode using the `/set prompt`, `/set format`,
        and `/set truncation` commands.

        To start using the new mode, use the `/set feedback` command.

    `prompt` *mode* `"`*prompt-string*`"` `"`*continuation-prompt-string*`"`
    :   Sets the prompts for input within JShell. If no mode is entered, then
        the current prompts for all feedback modes are displayed. If only a
        mode is entered, then the current prompts for that mode are displayed.

        To define a prompt, the following arguments are required:

        *mode*
        :   Specifies the feedback mode to which the prompts are applied. Only
            custom modes created with the `/set mode` command can be modified.

        `"`*prompt-string*`"`
        :   Specifies the string to use as the prompt for the first line of
            input.

        `"`*continuation-prompt-string*`"`
        :   Specifies the string to use as the prompt for the additional input
            lines needed to complete a snippet.

    `start` \[`-retain`\] \[*file* \[*file*...\]\|*option*\]
    :   Sets the names of the startup scripts used when the next `/reset`,
        `/reload`, or `/env` command is entered. If more than one script is
        entered, then the scripts are run in the order entered. If no scripts
        or options are entered, then the current startup settings are
        displayed.

        The scripts can be local files or one of the following predefined
        scripts:

        `DEFAULT`
        :   Loads the default entries, which are commonly used as imports.

        `JAVASE`
        :   Imports all Java SE packages.

        `PRINTING`
        :   Defines `print`, `println`, and `printf` as `jshell` methods for
            use within the tool.

        `TOOLING`
        :   Defines `javac`, `jar`, and other methods for running JDK tools via
            their command-line interface within the `jshell` tool.

        The following options are valid:

        `-default`
        :   Sets the startup settings to the default settings.

        `-none`
        :   Specifies that no startup settings are used.

        Use the `-retain` option to save the start setting across sessions.

    `truncation` *mode* *length* *selector*
    :   Sets the maximum length of a displayed value. If no mode is entered,
        then the current truncation values for all feedback modes are
        displayed. If only a mode is entered, then the current truncation
        values for that mode are displayed.

        To define truncation values, the following arguments are required:

        *mode*
        :   Specifies the feedback mode to which the truncation value is
            applied. Only custom modes created with the `/set mode` command can
            be modified.

        *length*
        :   Specifies the unsigned integer to use as the maximum length for the
            specified selector.

        *selector*
        :   Specifies the context in which the truncation value is applied. The
            selectors are described in the online help, which is accessed from
            JShell using the `/help /set truncation` command.

`/types` \[*option*\]
:   Displays classes, interfaces, and enums that were entered. If no option is
    entered, then all current active classes, interfaces, and enums are
    displayed.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Displays information for classes, interfaces, and enums identified by
        name, ID, or ID range. For a range of IDs, provide the starting ID and
        ending ID separated with a hyphen. To provide a list, separate the
        items in the list with a space. Use the `/list` command to see the IDs
        of the code snippets.

    `-all`
    :   Displays information for all classes, interfaces, and enums, including
        those added when JShell was started, and classes, interfaces, and enums
        that failed, were overwritten, or were dropped.

    `-start`
    :   Displays information for startup classes, interfaces, and enums that
        were added when JShell was started.

`/vars` \[*option*\]
:   Displays the name, type, and value of variables that were entered. If no
    option is entered, then all current active variables are displayed.

    The following options are valid:

    {*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
    :   Displays information for variables identified by name, ID, or ID range.
        For a range of IDs, provide the starting ID and ending ID separated
        with a hyphen. To provide a list, separate the items in the list with a
        space. Use the `/list` command to see the IDs of the code snippets.

    `-all`
    :   Displays information for all variables, including those added when
        JShell was started, and variables that failed, were overwritten, or
        were dropped.

    `-start`
    :   Displays information for startup variables that were added when JShell
        was started.

`/?`
:   Same as the `/help` command.

`/!`
:   Reruns the last snippet.

`/`{*name*\|*id*\|*startID*`-`*endID*} \[{*name*\|*id*\|*startID*`-`*endID*}...\]
:   Reruns the snippets identified by ID, range of IDs, or name. For a range of
    IDs, provide the starting ID and ending ID separated with a hyphen. To
    provide a list, separate the items in the list with a space. The first item
    in the list must be an ID or ID range. Use the `/list` command to see the
    IDs of the code snippets.

`/-`*n*
:   Reruns the -*n*th previous snippet. For example, if 15 code snippets were
    entered, then `/-4` runs the 11th snippet. Commands aren't included in the
    count.

## Input Shortcuts

The following shortcuts are available for entering commands and snippets in
JShell.

### Tab completion

**\<tab\>**
:   When entering snippets, commands, subcommands, command arguments, or
    command options, use the Tab key to automatically complete the item. If the
    item can't be determined from what was entered, then possible options are
    provided.

    Use the Tab key after entering the name of a class, interface, method, or
    field to see the description of the class, interface, method, or field.
    The description is based on the javadoc comment for the declaration of the
    class, interface, method, or field, when sources for the declaration are
    available.

    The sources for the JDK classes are looked up in the JDK's sources, if they
    can be found in the JDK installation. The sources may need to be added to
    the JDK installation separately.

    The sources of classes, interfaces, methods, and fields declared on the class path
    or module path are looked up in the entry on the class path or module path which
    contains the declaration. If the entry is a JAR file and it does not contain the source,
    then the source is looked up in a JAR file with the same path and name but with `.jar`
    replaced by `-sources.jar`, if such a file exists. For example, if `<directory>/lib.jar`
    does not contain the source, then `<directory>/lib-sources.jar` is searched if it exists.

    When searching for sources, JShell expects source files to be co-located with class files.
    That is, the source for a given class or interface must be in a file with the same path and name
    as the class file for the corresponding top-level class or interface, with `.class` replaced by `.java`.

    When entering a method call, use the Tab key after the method call's
    opening parenthesis to see the parameters for the method. If the method has
    more than one signature, then all signatures are displayed. Pressing the
    Tab key a second time displays the description of the method and the
    parameters for the first signature. Continue pressing the Tab key for a
    description of any additional signatures.

**Shift+\<Tab\> V**
:   After entering a complete expression, use this key sequence to convert the
    expression to a variable declaration of a type determined by the type of
    the expression.

**Shift+\<Tab\> M**
:   After entering a complete expression or statement, use this key sequence to
    convert the expression or statement to a method declaration. If an
    expression is entered, the return type is based on the type of the
    expression.

**Shift+\<Tab\> I**
:   When an identifier is entered that can't be resolved, use this key sequence
    to show possible imports that resolve the identifier based on the content
    of the specified class path.

### Command abbreviations

An abbreviation of a command is accepted if the abbreviation uniquely
identifies a command. For example, `/l` is recognized as the `/list` command.
However, `/s` isn't a valid abbreviation because it can't be determined if the
`/set` or `/save` command is meant. Use `/se` for the `/set` command or `/sa`
for the `/save` command.

Abbreviations are also accepted for subcommands, command arguments, and command
options. For example, use `/m -a` to display all methods.

### History navigation

A history of what was entered is maintained across sessions. Use the up and
down arrows to scroll through commands and snippets from the current and past
sessions. Use the Ctrl key with the up and down arrows to skip all but the
first line of multiline snippets.

### History search

Use the Ctrl+R key combination to search the history for the string entered.
The prompt changes to show the string and the match. Ctrl+R searches backwards
from the current location in the history through earlier entries. Ctrl+S
searches forward from the current location in the history though later entries.

## Input Editing

The editing capabilities of JShell are similar to that of other common shells.
Keyboard keys and key combinations provide line editing shortcuts. The Ctrl key
and Meta key are used in key combinations. If your keyboard doesn't have a Meta
key, then the Alt key is often mapped to provide Meta key functionality.

Table: Line Editing Shortcuts

Key or Key Combination   Action
-----------------------  -------
Return                   Enter the current line.
Left arrow               Move the cursor to the left one character.
Right arrow              Move the cursor to the right one character.
Ctrl+A                   Move the cursor to the beginning of the line.
Ctrl+E                   Move the cursor to the end of the line.
Meta+B                   Move the cursor to the left one word.
Meta+F                   Move the cursor to the right one word.
Delete                   Delete the character under the cursor.
Backspace                Delete the character before the cursor.
Ctrl+K                   Delete the text from the cursor to the end of the line.
Meta+D                   Delete the text from the cursor to the end of the word.
Ctrl+W                   Delete the text from the cursor to the previous white space.
Ctrl+Y                   Paste the most recently deleted text into the line.
Meta+Y                   After Ctrl+Y, press to cycle through the previously deleted text.
-----------------------  -------

## Example of Starting and Stopping a JShell Session

JShell is provided with the JDK. To start a session, enter `jshell` on the
command line. A welcome message is printed, and a prompt for entering commands
and snippets is provided.

```
% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell>
```

To see which snippets were automatically loaded when JShell started, use the
`/list -start` command. The default startup snippets are import statements for
common packages. The ID for each snippet begins with the letter *s*, which
indicates it's a startup snippet.

```
jshell> /list -start

  s1 : import java.io.*;
  s2 : import java.math.*;
  s3 : import java.net.*;
  s4 : import java.nio.file.*;
  s5 : import java.util.*;
  s6 : import java.util.concurrent.*;
  s7 : import java.util.function.*;
  s8 : import java.util.prefs.*;
  s9 : import java.util.regex.*;
 s10 : import java.util.stream.*;

jshell>
```

To end the session, use the `/exit` command.

```
jshell> /exit
|  Goodbye

%
```

## Example of Entering Snippets

Snippets are Java statements, variable definitions, method definitions, class
definitions, import statements, and expressions. Terminating semicolons are
automatically added to the end of a completed snippet if they're missing.

The following example shows two variables and a method being defined, and the
method being run. Note that a scratch variable is automatically created to hold
the result because no variable was provided.

```
jshell> int a=4
a ==> 4

jshell> int b=8
b ==> 8

jshell> int square(int i1) {
   ...> return i1 * i1;
   ...> }
|  created method square(int)

jshell> square(b)
$5 ==> 64
```

## Example of Changing Snippets

Change the definition of a variable, method, or class by entering it again.

The following examples shows a method being defined and the method run:

```
jshell> String grade(int testScore) {
   ...>     if (testScore >= 90) {
   ...>         return "Pass";
   ...>     }
   ...>     return "Fail";
   ...> }
|  created method grade(int)

jshell> grade(88)
$3 ==> "Fail"
```

To change the method `grade` to allow more students to pass, enter the method
definition again and change the pass score to `80`. Use the up arrow key to
retrieve the previous entries to avoid having to reenter them and make the
change in the `if` statement. The following example shows the new definition
and reruns the method to show the new result:

```
jshell> String grade(int testScore) {
   ...>     if (testScore >= 80) {
   ...>         return "Pass";
   ...>     }
   ...>     return "Fail";
   ...> }
|  modified method grade(int)

jshell> grade(88)
$5 ==> "Pass"
```

For snippets that are more than a few lines long, or to make more than a few
changes, use the `/edit` command to open the snippet in an editor. After the
changes are complete, close the edit window to return control to the JShell
session. The following example shows the command and the feedback provided when
the edit window is closed. The `/list` command is used to show that the pass
score was changed to `85`.

```
jshell> /edit grade
|  modified method grade(int)
jshell> /list grade

   6 : String grade(int testScore) {
           if (testScore >= 85) {
               return "Pass";
           }
           return "Fail";
       }
```

## Example of Creating a Custom Feedback Mode

The feedback mode determines the prompt that's displayed, the feedback messages
that are provided as snippets are entered, and the maximum length of a
displayed value. Predefined feedback modes are provided. Commands for creating
custom feedback modes are also provided.

Use the `/set mode` command to create a new feedback mode. In the following
example, the new mode `mymode`, is based on the predefined feedback mode,
`normal`, and verifying command feedback is displayed:

```
jshell> /set mode mymode normal -command
|  Created new feedback mode: mymode
```

Because the new mode is based on the `normal` mode, the prompts are the same.
The following example shows how to see what prompts are used and then changes
the prompts to custom strings. The first string represents the standard JShell
prompt. The second string represents the prompt for additional lines in
multiline snippets.

```
jshell> /set prompt mymode
|  /set prompt mymode "\njshell> " "   ...> "

jshell> /set prompt mymode "\nprompt$ " "   continue$ "
```

The maximum length of a displayed value is controlled by the truncation
setting. Different types of values can have different lengths. The following
example sets an overall truncation value of 72, and a truncation value of 500
for variable value expressions:

```
jshell> /set truncation mymode 72

jshell> /set truncation mymode 500 varvalue
```

The feedback displayed after snippets are entered is controlled by the format
setting and is based on the type of snippet entered and the action taken for
that snippet. In the predefined mode `normal`, the string `created` is
displayed when a method is created. The following example shows how to change
that string to `defined`:

```
jshell> /set format mymode action "defined" added-primary
```

Use the `/set feedback` command to start using the feedback mode that was just
created. The following example shows the custom mode in use:

```
jshell> /set feedback mymode
|  Feedback mode: mymode

prompt$ int square (int num1){
   continue$ return num1*num1;
   continue$ }
|  defined method square(int)

prompt$
```
