Terminal 一次滚动整个多行命令的Readline类型包装器

Terminal 一次滚动整个多行命令的Readline类型包装器,terminal,readline,read-eval-print-loop,Terminal,Readline,Read Eval Print Loop,我正在使用增强的kotlinREPL,并输入了多行代码片段: $rlwrap bin/ki.sh ki-shell 0.3/1.4.21 type :h for help [0] fun reformat( str: String, normalizeCase: Boolean = true, upperCaseFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false, wordSep

我正在使用增强的
kotlin
REPL,并输入了多行代码片段:

$rlwrap bin/ki.sh
ki-shell 0.3/1.4.21
type :h for help
[0] fun reformat(
    str: String,
    normalizeCase: Boolean = true,
    upperCaseFirstLetter: Boolean = true,
    divideByCamelHumps: Boolean = false,
    wordSeparator: Char = ' ',
)
 {
  println("In reformat")
}
如果您观察得很仔细,您可能已经注意到kotlin外壳已经用
rlwrap
进行了“包装”。我曾希望它能提供一次按键来滚动通过多行命令。但是,正如在下面的屏幕截图中所看到的,向上箭头键(同样,shift-或option-或command-或control-向上箭头)一次只向上移动一行

那么,有没有类似REPL的实用程序的包装器可以支持多行滚动呢

请注意,
scala
REPL与
ipython
在某些情况下一样具有多行滚动功能(在我的情况下,仅在
iTerm
下,而不是在
终端下)


我使用的是macOS Catalina,但我希望答案同样适用于大多数*NIX变体。

来自
rlwrap
手册:

-m, --multi-line [newline_substitute]
  Enable  multi-line input using a "newline substitute" character
  sequence (" \ ", [space-backslash-space] by default). Newline sub‐
  stitutes are translated to newlines before sending the input to 
  command.  With this option, you can call an external  editor  
  $RLWRAP_EDITOR  on  the  (expanded)  current  input  with the    
  rlwrap_call_editor key (CTRL-^ by default)
使用
rlwrap-m
时,按CTRL+^将使您进入一个编辑器,您可以在其中编辑多行代码段。退出编辑器后,代码段将被发送到
rlwrap
ped命令,并作为一行(换行符替换为“换行符”)在历史记录中以↑ 及↓ 仍将这些代码段显示为一行,但您可以随时在编辑器中通过再次按CTRL+^将其扩展为多行文本

这并不完全是您想要的,但它确实可以一次滚动整个多行命令,我更喜欢这种方式,例如,
ipython
,在这种情况下,您仍然(至少在我使用的终端上)必须按↑ 经过一个大函数定义几次

当然,与任何readline包装器一样,也存在一些不足之处:您将看到CLI可能具有的任何上下文相关的完成,甚至微不足道的
rlwrap
完成机制也无法在多行编辑器中工作

设置:

它应该是“开箱即用”的,只需发布

$rlwrap-m-a#-a因为您的cli可能
#已经有行编辑了吗
一些调整:

  • 如果您喜欢不同的编辑器,请添加一行
    export-RLWRAP\u EDITOR='[-opts]
    .bashrc
    中。默认值为
    vi+%L
    <
    RLWRAP\u编辑器中的code>%F
    %L
    %C
    将分别替换为文件名、行和列,以便将您放入编辑器中光标所在的位置
    RLWRAP
  • 要使用不同的编辑热键,请将类似于
    “\C-b”:rlwrap call editor
    的行添加到
    ~/.inputrc
    (默认为CTRL+^)
  • 要使用不同的“换行符替换”(例如“| |”),请向
    -m
    添加一个参数,如
    rlwrap-m'| |'
    (默认值为
    '\'
  • 如果您选择的
    编辑器根据文件扩展名进行语法着色,请添加一个参数
    -M.ext
    (默认值:无扩展名)
例如:

export-RLWRAP\u EDITOR='my\u edit--在退出%F时自动保存:%L'
# ... 或者把上面的东西放进去
rlwrap-a-m':'-m_bas ql superbasic#。。。那些日子

这看起来很有希望。我想有必要找到一个
.kt
语法文件?我正在调查,这取决于你的编辑。我是一个
emacs
的家伙,因此肯定存在一个kotlin-“模式”。如果您指定
.kt
文件扩展名需要kotlin模式,Bob的叔叔..您能拼凑出这里的命令行吗?这似乎是朝着/包含正确答案的方向发展,但要获得有效的结果是相当具有挑战性的。我正在考虑另外问一个问题,关于如何将
rlwrap
与kotlinI一起使用,因为kotlinI在安装kotlin shell方面运气不好,所以我将尝试给出一个总体路线图。请注意,使用任何readline包装器也会丢失一些功能,例如上下文感知完成。