Нужна помощь в реализации новых команд в groovysh

Я нашел очень мало информации о создании новых команд для Groovysh. Я хотел бы использовать его как обычную часть моей среды разработки, в некоторой степени заменяя cmd.exe().

Я заметил, что в groovysh есть команда "register", которая позволяет вам регистрировать новые команды. После того, как я ничего не нашел, я посмотрел на исходный код существующих команд и придумал следующее:

import org.codehaus.groovy.tools.shell.*

class test extends CommandSupport
{
    public static final String COMMAND_NAME = 'findall'

    // Printed when you use the help command specifying 'find' as an argument
    String help="Help"
    String usage="Usage"

    // Printed when you use the help command with no arguments
    String description="Description"    

    public test(org.codehaus.groovy.tools.shell.Groovysh shell)
    {
            super(shell, COMMAND_NAME, 'find')
    }
    Object execute(List<String> args)
    {
        return "Commanded "+args+" "+args.size()
    }

}

Это делает большую часть того, что я хочу, но у меня есть пара проблем с этим. Прежде всего, вещь, передаваемая в "execute", предварительно подвергается синтаксическому анализу. Если я попытаюсь найти строку типа "проверить странный интервал", я получу ["тест, странный, интервал"], я могу использовать кавычки, чтобы перестроить то, что предполагалось заключить в одну строку, но я не могу заменить лишние пробелы "

Вторая проблема заключается в том, что я хотел бы использовать завершение вкладки. Я вижу, что есть команды getCompleter и makeCompleters, но нет никакой информации о том, что такое завершитель... ссылка на страницу javadocs, которая не существует.

В библиотеке JLine есть завершители, но я не уверен, что это одно и то же (я склонен сомневаться в этом, потому что JLine недоступен из groovysh, если вам нужно использовать их для написания сценариев, вы думаете, что они будут доступны)

Если кто-нибудь знает блог, в котором рассказывается о том, как делать подобные вещи, или есть несколько минимальных примеров, я буду признателен за помощь.

1 ответ

Вы расшифровали отличный источник. Вы можете вернуть jline complete в переопределенный метод createCompleters. Вы также можете использовать completeres из org.codehaus.groovy.tools.shell.util.

import jline.console.completer.StringsCompleter
import org.codehaus.groovy.tools.shell.CommandSupport
import org.codehaus.groovy.tools.shell.Groovysh
import org.codehaus.groovy.tools.shell.util.SimpleCompletor;

public class GroovyshCmd extends CommandSupport {
    public static final String COMMAND_NAME = ':mycmd'
    public static final String SHORTCUT = ':my'

    protected GroovyshCmd(Groovysh shell) {
        super(shell, COMMAND_NAME, SHORTCUT)
    }

    @Override
    public List<Completer> createCompleters() {
        //return [new SimpleCompletor((String[])["what", "ever", "here"]), null]
        return [new StringsCompleter("what", "ever", "here"), null]
    }

    @Override
    public Object execute(List<String> args) {
        println "yo"
    }
}

Я согласен, что это слишком сложно.

Другие вопросы по тегам