在Java程序中实现命令历史记录?

问题描述 投票:0回答:4

我需要一些编码建议。我编写了一个简单的 Java 程序,该程序在我公司的一个内部网站中运行。它是一个命令行程序,用户可以在其中输入

copy file1 to remote1
compare file1 to file2 archive diff
等命令。我的同事很喜欢它并且经常使用它。

问题是用户的命令往往很长且重复。他们问我是否可以在程序中实现命令历史记录。这样,他们就可以使用向上箭头或其他东西来滚动、编辑和重新提交以前的命令。无需记住先前会话中输入的命令,只需记住当前会话即可。

我已经考虑过了,我想我可以从头开始想出一个解决方案……但这需要几周的时间来开发。我宁愿实现一个可用的包或模块,如果存在并且不会太麻烦的话。我知道这是一个开放式问题,但有人可以推荐这样的资源吗?

java package
4个回答
2
投票

我不明白为什么要花这么长时间来开发。这是一个基本的解决方案:

class CommandSession {
    private List<Command> commands = new ArrayList<>();
    private ListIterator<Command> scroller;

    public void execute(Command command) {
        scroller = null;
        commands.add(command);
        command.execute();
    }

    public Command scrollUp() {
        if (scroller == null) {
            scroller = commands.listIterator(commands.size());
        }
        if (scroller.hasPrevious()) {
            return scroller.previous();
        }
        return null;
    }
}

您可以通过各种方式对其进行调整以获得更高级的功能,但总的来说,这是一个非常基本的概念。


1
投票

如果您使用的是 *nix 环境,那么 rlwrap 可能就是您正在寻找的。

rlwrap 尝试完全透明 - 您(或您的 shell)不应该注意到命令和 rlwrap 命令之间的任何区别 - 当然,除了添加的 readline 功能。这甚至应该 当您从以下位置重定向、传送和发送信号时,这一点仍然成立: 和命令,或者当命令操纵其终端设置时。

有很多选项可以添加(可编程)完成,处理 多行输入、颜色和重写提示。如果你不需要它们 (你可能不会),你可以跳过本手册页的其余部分。

如果没有,你可以使用cygwin才能使用它


1
投票

我在我的项目中使用了CRaSH。它基本上是一个用户需要连接的 SSH shell(也支持用户名/密码),是的,支持命令中的历史记录。命令是用 Groovy 编写的。


0
投票

Æsh(另一个可扩展的外壳)Readline

© www.soinside.com 2019 - 2024. All rights reserved.