标签: jline

如何取消ConsoleReader.readLine()

首先,我正在学习scala和java世界的新手.我想创建一个控制台并将此控制台作为可以启动和停止的服务运行.我能够将ConsoleReader运行到Actor中,但我不知道如何正确地停止ConsoleReader.这是代码:

import eu.badmood.util.trace
import scala.actors.Actor._

import tools.jline.console.ConsoleReader

object Main {

  def main(args:Array[String]){
    //start the console
    Console.start(message => {
      //handle console inputs
      message match {
        case "exit" => Console.stop()
        case _ => trace(message)
      }
    })

    //try to stop the console after a time delay
    Thread.sleep(2000)
    Console.stop()

  }

}

object Console {

  private val consoleReader = new ConsoleReader()

  private var running = false

  def start(handler:(String)=>Unit){
    running = true
    actor{
      while (running){
        handler(consoleReader.readLine("\33[32m> \33[0m"))
      }
    }
  }

  def stop(){
    //how to cancel an …
Run Code Online (Sandbox Code Playgroud)

scala jline actor

10
推荐指数
1
解决办法
2922
查看次数

zookeeper客户端不提供CLI"禁用jline支持"消息

我刚刚起床CDH 5.4并安装了zookeeper.之前我曾多次成功使用过zkCli.这次命令行启动在到达提示符之前停止

Welcome to ZooKeeper!
JLine support is disabled
2015-05-04 18:18:33,936 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@975] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-04 18:18:33,952 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@852] - Socket connection established to localhost/127.0.0.1:2181, initiating session
2015-05-04 18:18:33,985 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x34d12349d0a15cf, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
Run Code Online (Sandbox Code Playgroud)

我知道通常的打印输出是启用了JLine支持

是什么让它陷入困境?我没有看到任何方法来改变这个Cloudera管理器配置页面.

java hadoop jline cloudera apache-zookeeper

10
推荐指数
1
解决办法
4784
查看次数

Java键盘输入在控制台应用程序中解析

我刚开始搞乱JLine来解析控制台模式下的字符输入.它似乎运作良好,但我想知道:

在JLine中是否存在非阻塞方式以查明字符是否可用?(就像kbhit()在Windows中一样.)

我想我总是可以将键盘输入包装在自己的线程中,然后将线程安全队列中的键盘字符提供给主线程,但这似乎是不必要的.

编辑:这是逐字符解析.我不打算使用GUI.在控制台模式下,Java中通常的InputStream I/O要求您首先按Enter键(例如,它只是缓冲输入).请不要告诉我在Java中无法在控制台模式下输入逐个字符的输入; 事实并非如此.JLine使用具有平台相关实现的可移植接口来实现它.

编辑更新:我能够组合一个帮助程序类来在工作线程中执行阻塞I/O(对于每个字符的I/O使用JLine,警告:您必须自己解析Ctrl-C!)然后进行通信通过带有isempty()例程的同步队列.对于我现在正在做的事情,这很好,但我真的想知道未来的好方法.

java keyboard jline

8
推荐指数
1
解决办法
1万
查看次数

通过Eclipse调试Jline2应用程序

我正在使用Jline2框架在Java中构建一个控制台应用程序.在Windows 7上从Eclipse启动应用程序时,shell立即存在,并且不会等待用户输入命令.

什么可能出错?

java console-application jline

8
推荐指数
1
解决办法
1525
查看次数

jline2打印"^ J"时应该在telnet控制台上打印"\n"

我正在使用JLine 2(v2.13)和Socket IO为我的应用程序创建一个管理控制台,可以通过普通的telnet客户端访问.但是我发现打印出换行符时会打印出奇怪的符号:

act.app.restart  restart app^Jact.job.list  List jobs
Run Code Online (Sandbox Code Playgroud)

正确的输出应该是:

act.app.restart  restart app
act.job.list     List jobs
Run Code Online (Sandbox Code Playgroud)

我追溯到代码,发现以下代码行导致了麻烦:

在此输入图像描述

另一个奇怪的事情是当我按下向上箭头来获取历史记录时,控制台打印出来^[[A并且没有其他任何事情发生.

有谁有想法吗?

更新:添加了相关的源代码

  1. 接受传入telnet连接的代码:

在此输入图像描述

  1. 创建ConsoleReader和分派命令的代码:

在此输入图像描述

更新2

对不起,我已经消失了一段时间.刚回来,因为我的项目让我呼吸新鲜空气.所以这就是发生的事情:我创建了一个PrintWriter并将其用作^J问题的解决方法:

在此输入图像描述

但是,jline2与telnet会话一起使用时还有许多其他问题:

  1. 键入<TAB>显示选项卡而不是激活完整列表.但是,在我按下回车键后,它会给我一个完整的列表以及一条错误消息: 在此输入图像描述
  2. 键入<UP>箭头,显示^[[A,按回车键,它将执行我的最后一个命令.但是我丢失了命令行编辑

问题仍然存在,我相信应该有办法解决它只需要一些指导......

java telnet jline stty jline2

8
推荐指数
1
解决办法
355
查看次数

类似于readline的Java库

您使用哪个类似readline的Java库?像"readline"这样的库我指的是用于编辑控制台输入的库,支持历史记录,制表符完成以及类似的东西.我正在寻找一个,我无法从众多选择中选择(jLine - unmaintained,java-readline - 2003年最后一次发布,其他?)

java readline console-application tab-completion jline

6
推荐指数
1
解决办法
2605
查看次数

clojure/lein REPL with jline

出于某种原因,我无法使用jj的clojure REPL,我做的是git克隆github上的clojure存储库然后运行ant来构建它,然后我将jline-0.9.94.jar下载到clojure.jar的目录中,然后运行以下命令:

java -cp jline-0.9.94.jar:clojure.jar jline.ConsoleRunner clojure.main
Run Code Online (Sandbox Code Playgroud)

并得到以下错误:

    Exception in thread "main" java.lang.ClassNotFoundException: clojure.main
 at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:317)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
 at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:375)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:164)
 at jline.ConsoleRunner.main(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

以下是我当前目录中的文件:

vvshs-macbook-2:clojure vvsh$ ls
build.xml                                 clojure-sources-1.2.0-master-SNAPSHOT.jar epl-v10.html                              src
classes                                   clojure-sources.jar                       jline-0.9.94.jar                          test
clojure-1.2.0-master-SNAPSHOT.jar         clojure.iml                               pom-template.xml
clojure-slim-1.2.0-master-SNAPSHOT.jar    clojure.jar                               pom.xml
clojure-slim.jar                          doc                                       readme.txt
vvshs-macbook-2:clojure vvsh$ 
Run Code Online (Sandbox Code Playgroud)

我在clojure 1.1和lein repl上得到了同样的错误(似乎lein维护了自己的clojure版本).

顺便说一句,这是在mac ox 10.5.8

java version "1.5.0_24"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_24-b02-357-9M3165)
Java HotSpot(TM) Client VM (build …
Run Code Online (Sandbox Code Playgroud)

clojure jline

6
推荐指数
1
解决办法
3017
查看次数

用jline预填充一条线

无论是使用的JLine(或JLine2),是有可能发出一个电话readlineConsoleReader,并有中,除了标准的提示,缓冲区预填充我选择的字符串?

我试过这样做,例如:

reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");
Run Code Online (Sandbox Code Playgroud)

这似乎确实写入缓冲区,但该行只显示提示.如果我按回车键,就会按照我的预期readLine返回"Default".如果我清除屏幕,则会重新绘制缓冲区并正确显示.

我的理解是,reader.redrawLine()在打电话之后我应该以某种方式打电话readLine.然而,最后一个是阻塞,这使得它很难(不是不可能,但使用第二个线程肯定是错误的).

java readline jline

6
推荐指数
1
解决办法
695
查看次数

JLine仅适用于IDEA

当代码在想法中运行时,我没有使用jline的问题.使用bat文件运行时,编辑字符不会发送到终端.

java -classpath ..\JActor\target\classes;..\JID\target\classes;target\classes;..\slf4j-api-1.7.2.jar;..\slf4j-simple-1.7.2.jar;..\apache-sshd-0.8.0\lib\sshd-core-0.8.0.jar;..\apache-sshd-0.8.0\lib\mina-core-2.0.5.jar;..\apache-sshd-0.8.0\lib\bcprov-jdk15-140.jar;..\jline-2.9.jar;..\joda-time-2.1.jar org.agilewiki.jasocket.sshd.SSHServer %1%
Run Code Online (Sandbox Code Playgroud)

我检查了jline jar文件,它包含了jansi和hawtjni的fusesource代码.

java jline

6
推荐指数
1
解决办法
467
查看次数

使用JLine在一行上完成多个命令

我想知道如何实现ArgumentCompleter这样一个如果我完成一个完整有效的命令,那么它将开始制作一个新命令的选项卡.

我原以为它可以构造成这样的东西:

final ConsoleReader consoleReader = new ConsoleReader()

final ArgumentCompleter cyclicalArgument = new ArgumentCompleter();
cyclicalArgument.getCompleters().addAll(Arrays.asList(
        new StringsCompleter("foo"), 
        new StringsCompleter("bar"), 
        cyclicalArgument));

consoleReader.addCompleter(cyclicalArgument);
consoleReader.readLine();
Run Code Online (Sandbox Code Playgroud)

但是现在,在完成第一个选项卡后,这将停止工作 foo bar

是否有人熟悉图书馆,告诉我如何实施这个?或者有一种已知的方法可以做到这一点,我错过了吗?这也是使用JLine2.

java jline

6
推荐指数
1
解决办法
639
查看次数