JSHELL(1)

πŸ“¦ version 23.0.2.0, in opensuse-leap 16.0

πŸ’» jshell(1) β€” JDK Commands πŸ¦‹


🌸 NAME 🌸

okay so jshell is the tool that lets you interactively evaluate declarations, statements, and expressions of the Java programming language in a read-eval-print loop (REPL) β€” it's giving β€œJava, but make it a conversation” πŸ’…


✨ 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 these predefined scripts, bestie:

  • 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 β€” highly recommend, no cap πŸ’―

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.
  • -Cflag β€” 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, -h, -? β€” prints a summary of standard options and exits the tool.
  • --help-extra, -X β€” prints a summary of nonstandard options and exits the tool. nonstandard options are subject to change without notice.
  • -Jflag β€” 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 -Rflag. alternatively, use -Jflag 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.
  • -Rflag β€” 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. this is where the main character energy really kicks in πŸ‘‘

🌟 /drop

/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

/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

/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, bestie β€” this is the little crew of flags that shows up here:

  • --add-modules module[,module...] β€” tells it which root modules to resolve on top of the initial module ✨
  • --add-exports source-module/package=target-module[,target-module]* β€” exports package from source-module over to target-module, and you can list a whole squad of target modules separated by commas πŸ’…
  • --class-path path β€” where it goes hunting for class files, aka the directories and archives it searches. Heads up though: this option overrides the path that's chilling in the CLASSPATH environment variable. If that env var isn't set and you didn't pass this option, then it just searches the current directory, no big deal. On Linux and macOS you separate the items in the path with a colon (:), and on Windows you use a semicolon (;) 🫢
  • --module-path modulepath β€” tells it where to find your application modules. Same separator rules, periodt: colon (:) on Linux and macOS, semicolon (;) on Windows 🌸

πŸ’€ /exit [integer-expression-snippet]

Exits the tool. That's it, that's the vibe.

If you don't feed it a snippet, the exit status is literally zero. If you do enter a snippet and the result of that snippet is an integer, then that result gets used as the exit status β€” main character energy fr fr.

But if an error occurs, or the snippet's result isn't an integer? An error is displayed and the tool stays active. No escape. You live here now 😭

πŸŽ€ /history

Displays what was entered in this session. Basically the receipts of everything you typed, bestie.

✨ /help [command|subject]

Displays information about commands and subjects. If you enter no options at all, you get a summary of info for all the commands plus a list of the available subjects. If you give it a valid command, you get the expanded info for that command. And if you enter a valid subject, you get the info about that subject.

The following values for subject are valid, iykyk:

  • context β€” describes the options that are available for configuring the environment
  • intro β€” provides an introduction to the tool (hi, welcome, here's the lore)
  • shortcuts β€” describes the keystrokes for completing commands and snippets. See Input Shortcuts πŸ’…

πŸ¦‹ /imports

Displays the current active imports β€” and yes, that includes the ones from the startup scripts and the scripts you entered on the command line when JShell was started. Full transparency, we love to see it.

🌸 /list [option]

Displays a list of snippets and their IDs. If you enter no option, you get all the active snippets displayed β€” but the startup snippets stay hidden, they're shy πŸ™ˆ

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, hand over the starting ID and the ending ID separated with a hyphen. Making a list? Separate the items with a space, bestie.
  • -all β€” displays all snippets, including startup snippets and the ones that failed, got overwritten, or were dropped. Little ID decoder for you: IDs that begin with s are startup snippets, and IDs that begin with e are snippets that failed πŸ’€
  • -start β€” displays the startup snippets that were evaluated when JShell was started

πŸ‘‘ /methods [option]

Displays info about the methods that were entered. No option? Then you get the name, parameter types, and return type of all the active methods. Gorgeous, complete, iconic.

The following options are valid:

  • {name|id|startID-endID} [{name|id|startID-endID}...] β€” displays info for the methods identified by name, ID, or ID range. For a range of IDs, give the starting ID and ending ID separated with a hyphen. For a list, separate the items in the list with a space. Pro tip from me to you: use the /list command to see the IDs of the code snippets 🫢
  • -all β€” displays info for all methods, including the ones added when JShell was started, plus methods that failed, were overwritten, or were dropped
  • -start β€” displays info for the startup methods that were added when JShell was started

🌈 /open file

Opens the script you specified and reads the snippets into the tool. That script can be a local file, or it can be one of these predefined scripts β€” yes, they're built in, no cap:

  • 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, right there inside the jshell tool πŸ”₯

⭐ /reload [options]

Restarts the session, and here's exactly how it does it:

  • Updates the environment settings with the options you gave it, if any
  • Resets the execution state
  • Runs the startup scripts
  • Replays the history in the order entered β€” and that history includes all valid snippets or /drop commands entered at the jshell prompt, in scripts entered on the command line, or in scripts entered with the /open command

Environment settings you entered on the command line, or that you provided with a previous /reset, /env, or /reload command, are maintained β€” unless you enter an option that overwrites the setting. Rude but fair.

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 still displayed though, we're not hiding those πŸ™ˆ
  • -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 β€” genuinely such a slay feature πŸ’–

🧚 /reset [options]

Discards all entered snippets and restarts the session like this:

  • 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. Gone. Poof. Say goodbye 😭

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 you specified. If you enter no options, then the active snippets are what get saved. Simple, clean, hygienic.

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. Again: 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 (yes, an empty file β€” that's the correct behaviour, don't @ me)

πŸ’œ /set [setting]

Sets configuration information β€” including the external editor, startup settings, and feedback mode. This command is also the one you use to create a custom feedback mode with customized prompt, format, and truncation values. And if you enter no setting at all, then the current setting for the editor, startup settings, and feedback mode are displayed for you.

The following values are valid for setting:

editor [options] [command]

okay so this one sets the command that launches your external editor when you type /edit πŸ’… the command can totally include arguments, just separate them with spaces. type it with no command and no options and it'll show you what the current setting is.

the options that actually work here:

  • -default β€” sets your editor to the default editor that ships with JShell ✨ but heads up: you can't use this one if you're also entering a command to start an editor.
  • -delete β€” sets the editor back to whatever was in effect when the session started 🫢 if you pair it with -retain, then the retained editor setting gets deleted and the editor gets set to the first one of these environment variables it finds: JSHELLEDITOR, VISUAL, or EDITOR. and if none of those editor environment variables are set? then this option just sets the editor to the default editor. also, same deal as above: can't use it if a command for starting an editor is entered.
  • -retain β€” saves your editor setting across sessions πŸ’Ύ if you enter no other option and no command, then the current setting is what gets saved.
  • -wait β€” prompts you to say when editing is done πŸ™ˆ otherwise control goes back to JShell the moment the editor exits. use this one if your editor exits immediately, like when an edit window already exists. and this option is only valid when a command for starting an editor is entered.

feedback [mode]

sets the feedback mode that JShell uses to respond to your input πŸŽ€ type it with no mode and it'll show you the current one.

the valid modes are: concise, normal, silent, verbose, plus any custom mode you made with the /set mode command ✨


format mode field "format-string" selector

sets the format of the feedback JShell gives you back 🌸 and the display logic here is kinda layered so stay with me:

  • no mode entered β†’ current formats for all fields for all feedback modes get displayed
  • only a mode entered β†’ current formats for that mode get displayed
  • only a mode and field entered β†’ current formats for that field get displayed

to actually define a format, you need these arguments:

  • mode β€” the feedback mode the response format applies to. only custom modes created with the /set mode command can be modified πŸ‘‘
  • field β€” the context-specific field the response format applies to. the fields are described in the online help, which you get to from JShell using /help /set format πŸ“–
  • "format-string" β€” the string used as the response format for the specified field and selector. the structure of the format string is, again, described in the online help via /help /set format ✨
  • selector β€” the context in which the response format applies. selectors are described in the online help too, same route: /help /set format πŸ¦‹

mode [mode-name] [existing-mode] [options]

creates a custom feedback mode with the name you give it πŸ’– if you enter no mode name, you get the settings for all modes displayed, which includes the mode, prompt, format, and truncation settings. and if you hand it the name of an existing mode, the settings from that existing mode get copied over to the new one you're creating. cute, right? πŸŽ€

the valid options:

  • -command | -quiet β€” sets the level of feedback shown for commands when using this mode. this option is required when creating a feedback mode. -command shows info and verification feedback for commands; -quiet shows only the essential stuff, like 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, pair this with the -retain option. and nope, predefined modes can't be deleted πŸ™…
  • -retain β€” saves the named feedback mode across sessions. name of the mode to retain is required πŸ’Ύ

then you configure your shiny new feedback mode with the /set prompt, /set format, and /set truncation commands ✨

and to actually start using it, hit up /set feedback 🌈


prompt mode "prompt-string" "continuation-prompt-string"

sets the prompts for input inside JShell πŸŽ€ no mode entered β†’ current prompts for all feedback modes displayed. only a mode entered β†’ current prompts for that mode displayed.

to define a prompt, these arguments are required:

  • mode β€” the feedback mode the prompts apply to. only custom modes created with the /set mode command can be modified πŸ‘‘
  • "prompt-string" β€” the string used as the prompt for the first line of input.
  • "continuation-prompt-string" β€” the string used as the prompt for the additional input lines you need to complete a snippet πŸ¦‹

start [-retain] [file [file...]|option]

sets the names of the startup scripts used the next time you enter /reset, /reload, or /env πŸ”₯ enter more than one script and they run in the order you entered them. enter no scripts and no options and you'll see the current startup settings.

the scripts can be local files, or one of these predefined ones:

  • 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 inside the jshell tool πŸ› οΈ

the valid options:

  • -default β€” sets the startup settings to the default settings.
  • -none β€” specifies that no startup settings are used πŸ’€

and use the -retain option to save the start setting across sessions πŸ’Ύ


truncation mode length selector

sets the maximum length of a displayed value βœ‚οΈ no mode entered β†’ current truncation values for all feedback modes displayed. only a mode entered β†’ current truncation values for that mode displayed.

to define truncation values, these arguments are required:

  • mode β€” the feedback mode the truncation value applies to. only custom modes created with the /set mode command can be modified πŸ‘‘
  • length β€” the unsigned integer to use as the maximum length for the specified selector πŸ”’
  • selector β€” the context the truncation value applies to. selectors are described in the online help, which you reach from JShell using /help /set truncation πŸ“–

/types [option]

displays the classes, interfaces, and enums you entered πŸ¦‹ no option entered β†’ all current active classes, interfaces, and enums get displayed.

the valid options:

  • {name|id|startID-endID} [{name|id|startID-endID}...] β€” displays info for classes, interfaces, and enums identified by name, ID, or ID range. for a range of IDs, give the starting ID and ending ID separated by a hyphen. for a list, separate the items with a space. and use the /list command to see the IDs of the code snippets ✨
  • -all β€” displays info for all classes, interfaces, and enums, including the ones added when JShell was started, plus ones that failed, were overwritten, or were dropped πŸ’€
  • -start β€” displays info for startup classes, interfaces, and enums that were added when JShell was started πŸŽ€

/vars [option]

displays the name, type, and value of the variables you entered πŸ’– no option entered β†’ all current active variables get displayed.

the valid options:

  • {name|id|startID-endID} [{name|id|startID-endID}...] β€” displays info for variables identified by name, ID, or ID range. for a range of IDs, give the starting ID and ending ID separated by a hyphen. for a list, separate the items with a space. and use /list if you need 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. It’s the full lore, bestie πŸ’–
  • -start β€” Displays information for startup variables that were added when JShell was started. The origin-story variables ✨
  • /? β€” Same as the /help command. Literally the shortcut 🫢
  • /! β€” Reruns the last snippet. Yes, the last one πŸ”₯
  • /{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. The syntax is giving β€œpick your faves” energy πŸ’…
  • /-n β€” Reruns the -nth previous snippet. For example, if 15 code snippets were entered, then /-4 runs the 11th snippet. Commands aren't included in the count. Math but make it shell 😭

✨ INPUT SHORTCUTS ✨

The following shortcuts are available for entering commands and snippets in JShell. These are your little cheat codes, no cap πŸŽ€

🧚 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. Autocomplete said β€œI got you” ✨
  • <tab> in a method call β€” 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. Method intel unlocked πŸ¦‹
  • 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. Variable glow-up πŸ’…
  • 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. Methodify it 🌸
  • 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. Import rescue mission 🫢

🌈 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. iykyk πŸ’–

Abbreviations are also accepted for subcommands, command arguments, and command options. For example, use /m -a to display all methods. Slay πŸ’…

πŸ•°οΈ 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. Time travel but make it shell ✨

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 through later entries. The search bar said β€œI’m built in” πŸ”₯

πŸ’… 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.

Quick vibe check: no Meta key? Your Alt key is often doing the Meta key’s job, bestie 🫢

⭐ Line Editing Shortcuts ⭐

  • 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 πŸŽ€

Okay so real talk β€” the feedback mode is basically the whole personality of your shell. It controls three things, bestie:

  • the prompt that's displayed
  • the feedback messages that are provided as snippets are entered
  • the maximum length of a displayed value

Predefined feedback modes are provided (thank u, defaults πŸ’–), and commands for creating custom feedback modes are also provided. So yeah β€” you can build your own. Let's go.


✨ Step one: make the mode ✨

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

Lowkey iconic β€” it's born, it's slaying, it exists.


🌸 Step two: the prompts 🌸

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.

First, peek at what you got:

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

Then make it yours:

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

The way that second one is for your continuation lines… chef's kiss πŸ˜­πŸ’…


πŸ¦‹ Step three: truncation nation πŸ¦‹

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

So 72 for the general vibe, 500 specifically for varvalue because she's extra. Periodt.


⭐ Step four: format the feedback ⭐

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

Not me customizing one specific string because I can πŸ™ˆβœ¨


πŸ‘‘ Step five: actually use it πŸ‘‘

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$

Look at those custom prompts doing their little walk πŸ˜­πŸ’– prompt$ and continue$ out here with main character energy, and the method feedback saying defined because we told it to. Slay.


Heads up bestie: this is a reference doc, so all those flags and strings are doing exactly what the page says β€” nothing more, nothing less. No cap.

And that's the whole page! πŸ’œ This one came from the JDK 23 docs, dated 2024 β€” so if you're reading this, thank the 2024-era JDK crew for writing it all down. Go forth and customize your prompts, you beautiful nerd πŸ«ΆπŸŒˆπŸ’…

πŸ“¦ where this page comes from