JShell 虽然提供强大的内部编辑和历史检索功能,一如所有的 Shell,内部编辑特别适用单行,但对多行就有点无能为力。
为此,JShell 允许使用外部编辑器,适用于对多行代码段进行编辑,这是在命令行提示符下的另一种编辑方法。
JShell 外部编辑默认会使用 JShell 自带的编辑器,但同时也提供配置功能,允许我们自由选择合适的外部编辑器。
要打开外部编辑器,并在编辑器中一次编辑所有现有代码段,使用的没有任何选项的命令 /edit
。如果要在编辑器中编辑特定代码段,则需要使用带有代码段名称或 ID 的 /edit
命令。至于 ID 的获取,可以使用 /list
命令
例如,我们要编辑 class C
类,可以直接输入 /edit C
命令
jshell> /edit volume
这样就会打开默认的自带的编辑器
如果你输入的名称或 ID 不存在,则会提示 片段不存在
jshell> /edit volume | 没有此类片段: volume
我们还可以使用外部编辑器添加新的代码段。
当我们在外部编辑器中点击保存时,任何已更改的片段或新片段都会输入到 JShell 会话并立即执行。且立即显示代码片段运行的结果。
需要注意的是,执行外部编辑器中的代码,并不会出现任何提示,而且在编辑器关闭之前,无法在 JShell 窗口中输入命令或片段,因为它是独占的。
设置外部编辑器
现在我们来说说如何配置外部编辑器,如果我们没有指定编辑器,那么 JShell 会按顺序检查以下环境变量: JSHELLEDITOR
,VISUAL
和 EDITOR
。如果没有设置,则使用简单的默认编辑器。
为了自定义外部编辑器,需要使用 /set editor
命令。而传递给该命令的参数,则是想要使用的外部编辑器。
例如,如果要设置外部编辑器为 vim
,则可以使用下面的命令
jshell> /set editor vim | 编辑器设置为: vim
设置好了之后,我们就可以使用 /edit
命令打开现有的代码段并进行编辑
jshell> /edit
在外部编辑器窗口中定义一个类 C
并保存更改会在 JShell 窗口中生成以下输出:
jshell> /edit | 已替换 类 C | 已替换 类 C
如果设置的外部编辑器不存在,则会报错
jshell> /set editor kwrite | 编辑器设置为: kwrite jshell> /edit | Edit Error: process IO failure: Cannot run program "kwrite": error=2, No such file or directory jshell>
而退出外部编辑器的方法,就是直接关闭外部编辑器,关闭了之后,JShell 就会恢复可输入状态