Нужна помощь в реализации новых команд в 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"
}
}
Я согласен, что это слишком сложно.