问题标签 [jline]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1641 浏览

java - 如何用 JLine 编写等效的 KeyListener?

我正在开发一个用 Java 编写的控制台应用程序。我要做的是处理用户键盘输入。当在终端中使用我们的程序启动一个长进程时,用户必须可以'q'随时按下以停止该进程(该进程在单独的线程上运行)。

我尝试了几件事:

  • 在另一个不同的线程中运行读取用户输入并向InterruptedException进程线程抛出的东西
  • 使用 JLine 及其ConsoleReader
  • 使用 JLine 并添加一个TriggeredAction链接到键盘键

但每次,我都面临同样的问题:用户必须ENTER按键,而我不希望这样。

如果您有任何想法或我的问题的实际解决方案,感谢您的帮助。

PS:请,如果您认为这是不可能的,请不要回答。我知道这是可能的。

0 投票
2 回答
3859 浏览

java - 每行使用多字命令的 JLine 示例

我似乎找不到每行使用多个命令的示例。

例如,假设我想编写一个类似于 cisco ios 的 cli,您可能在一行中有多个级别的命令。

例如。第一个单词可能是“show”,然后当您键入“show”并点击选项卡时,将显示下一组选项(cisco 示例使用“?”来显示列表)。

我正在考虑使用 readCharacter 一次读取一个字符,然后在看到空格后解析该行。

有没有其他人对这种类型的要求有任何 Jline 经验?

0 投票
1 回答
455 浏览

intellij-idea - 如何执行 SBT 托管的 JLine 类

我正在开发一个基于 JLine 的应用程序,我显然想在开发时对其进行测试。

JLine 是一个方便的库,它为 JVM 应用程序提供交互式控制台功能。

JLine 在 Intellij 控制台中不起作用,可能是因为他们已经将 tab 键用于他们自己的邪恶需求,而我要测试的是 tab-completion,因为我正在实现一些 tab-completed 命令。

我掉到 SBT 控制台,然后尝试run-main Example simple,但我抛出了一个异常,因为类加载器中现在有两个 jline 库 - 我的一个,以及 SBT 使用的一个,因此应用程序在加载 JLine 库时爆炸(单例是邪恶的).. ..

叹息......在 SBT 控制台上转了一圈,发现我可以运行:

我知道我可以解析该列表,显然空格或逗号将是一个完全可行的分隔符,但 Scala 开发人员似乎并没有这样连接......

但是 SBT 似乎只在我在它的控制台中时解析该命令,如果我从实际的 UNIX 控制台执行该命令,如下所示:

当我在类路径上有 100 个 jar 时(有点夸张),我正在尝试自动化这个过程,有什么建议吗?

0 投票
2 回答
1334 浏览

scala - 如何在调用 Scala JLine 之间保存和加载历史记录

我在我的 CLI 程序中使用Scala JLine 。它工作正常,但每次我重新启动程序时它都会忘记我的历史记录。我看到一个名为 的类FileHistory,并且我看到ConsoleReader该类有一个名为的方法,该方法setHistory()采用FileHistory. 我希望调用该方法会导致它创建或加载并保存包含我的历史记录的文件。但事实并非如此。

不幸的是,文档几乎不存在。我怎样才能让它在下次运行启用 JLine 的程序时记住我在上次运行中键入的命令?

更新

米兰德斯在下面给出的正确答案。感谢 mirandes 和 som-snytt 的帮助(是的溶剂)响应。

0 投票
1 回答
1072 浏览

java - 使用 java jline 打印输出时放置输入

如何在打印出文本的同时放置输入文本而不影响我放置的内容?

我正在尝试创建一个服务器,其中不断打印调试信息,但同时我希望能够在仍然看到正在显示的信息的同时执行命令,但是在不影响已经输入的信息的情况下完成它在输入字段中。(Minecraft Bukkit 就是一个例子)

示例:http: //i43.tinypic.com/2e1ufzp.gif

0 投票
0 回答
467 浏览

java - 使用管道和java重定向输入

我在 MSDN中阅读了使用重定向输入和输出创建子进程。

而且我已经重定向了输出。但在我的情况下,重定向输入与此示例不同。

我已经java -jar xxx.jar在子进程中运行。并且将输入重定向到 stdinPipe 是成功的。但是我发现子进程 jar 不读取输入。

我已经像这样重定向了输入句柄:

当我使用bSuccess = WriteFile(g_hChildStd_IN_Wr, pCmd, strlen(pCmd), &dwWritten, NULL);.It 在我用于输出和输入的小测试 jar 文件上运行System.out.println()完美System.in.read()

但是当我运行 jar 服务器时,输入无效并且重定向失败。我唯一知道的是 jar 使用。我ConsoleReader(System.in, System.out)不熟悉 java。所以有人能知道是什么禁止我重定向输入吗?

非常感谢!!

PS 源代码与开头给出的链接相同。


最后我发现jline.console.ConsoleReader.readLine(">",null)问题出在哪里。我用arg运行java,-nojline一切都很好!

我还没有阅读 jline.console.ConsoleReader 的源代码。我很高兴有人能告诉我 和 之间的System.in.read()区别jline.console.ConsoleReader.readLine(">",null)

问题代码如下:

因此,使用jline.console.ConsoleReader.readline()也不同于jline.console.ConsoleReader.readline(">",null).

我会继续研究。


jline源代码

readline() 函数等于 readline(null,null)。这意味着不会显示“>”提示,但根据第 493 行的源代码,其他提示相同。所以我怀疑这是我的 windows 操作系统(win8. 1)导致代码跑到if (!terminal.isSupported())代码中?还是我没看懂源代码?不熟悉java太难了。

0 投票
0 回答
124 浏览

vb.net - ProcessStartInfo 和 JLine

在 Visual Basic 中使用 ProcessStartInfo,我想重定向由 JLine 库处理的 Java 应用程序 I/O。输出正常,输入无效

我发现Process.StandardInput.WriteLine Not working on Java.exe。OP 通过停止 JLine解决了这个问题。

这是一个安全的解决方案吗? 你知道解决这个问题的其他方法吗?

0 投票
1 回答
725 浏览

java - 如何测试基于 jline 的控制台应用程序

我正在尝试测试一个使用jline处理与用户交互的控制台应用程序。

我正在使用ProcessBuilder启动应用程序,这使我可以访问应用程序的:

我期待使用与此类似的工作流程:

  • 开始申请
  • 阅读输出,直到我看到应用程序的提示>
  • 为我的测试用例发送输入,例如login
  • 读取输出,直到我看到预期的响应,例如Username:
  • 等等

但是,测试只是冻结了。单步执行代码,似乎jline在 Windows 上对 _getch 的 JNI 调用时冻结了。我猜这个问题是因为我从 ProcessBuilder 运行 Java,它是无头的,所以没有控制台,这会混淆窗口。根据 Jline 文档进行设置-Djline.terminal=jline.UnsupportedTerminal也无济于事。

我找到了一个讨论Python pexpect以测试(非 java)readline 应用程序的线程。

问题:如何仅使用 java 工具测试基于 jline 的应用程序?

0 投票
1 回答
304 浏览

windows - 光标键箭头在 SBT 0.13.* 中不起作用。嫌疑人杰琳。如何启用它们?

SBT-0.7.7 在启动器中捆绑了 JLine,它工作正常。例如:

我可以使用光标键浏览命令历史记录。它在 SBT-0.13.5 中不起作用:

当我按下光标键时,会出现可打印的字符,例如“pHpP”。在 target/.history 文件中,我们看到字符代码为“0xE0 0x48 0xE0 0x50”。在 Java8 和 64 位 Java 中也是如此。我还尝试了各种版本的 SBT 启动器和 jline.terminal 的各种值,例如-Djline.terminal =jline.AnsiWindowsTerminal无济于事。我还尝试了 -Djline.WindowsTerminal.directConsole=false - 然后光标键根本不起作用。在所有情况下,我都可以使用CTRL+PCTRL+N浏览历史。

SBT-0.13.* 从 Ivy 存储库%HOMEPATH%.sbt\boot\scala-2.10.3\org.scala-sbt\sbt\0.13.1\jline-2.11.jar 加载 JLine我检查了 JLine 的源代码。2.10.3 版有一个原始配置文件keybindings.properties和WindowsTerminal.java中的函数readVirtualKey()处理光标键。所有版本的 JLine 都会在临时目录(如%HOMEPATH%\AppData\Local\Temp\jline_.dll )中安装一个帮助 DLL ,这可能是有效的。

为什么它不能正常工作?如何使光标键起作用?

0 投票
1 回答
143 浏览

scala - 为什么出现异常“IllegalArgumentException:''''行缺少结束引号”

当我sbt从我的 unix 提示符运行时,我在控制台中的每个命令之后都会得到以下信息。

任何人都可以提示,指出我出了什么问题吗?