Как разрешить аргумент, содержащий пробелы с библиотекой python3 cmd? - PullRequest
0 голосов
/ 02 мая 2019

Я использую библиотеку cmd для создания простого интерфейса командной строки с дополнением кода.Проблема возникает, когда аргумент команды содержит специальные символы.Завершение кода выполняется только в последней части, разделенной этими специальными символами.

Вот простой код для его проверки:

class Test(Cmd):
    def complete_test(self, text, line, b, e):
    print(text)
    print(line)
    print(b)
    print(e)

Тип test и аргумент, содержащий, например, косую черту.Только последняя часть после / включается в text, и если вы что-то возвращаете, заменяется только эта последняя часть.

Я использовал комментарии под этим ответом, чтобы исправить проблемы с другимиспециальные символы.Но я не могу просто сделать readline.set_completer_delims(""), потому что завершение кода не работает.Мне нужно, по крайней мере, установить пробел в качестве разделителя (readline.set_completer_delims(" ")), чтобы его завершение кода нашло начало аргументаНо теперь я не могу пропустить пути, содержащие пробелы (см. Мой код завершения ниже):

def complete_export(self, text:str, line:str, begidx, endidx):
    return [x for x in glob(text + "*") if x.startswith(text)]

Моя export команда требует только один аргумент - путь, поэтому идеальным поведением было бы считать первый пробел началомаргумента и другие пробелы будут считаться частью пути.

Примечание: я понял, что можно использовать аргумент line и извлекать путь вручную, но завершение кода все равно заменит только последнюю часть, поэтому путьдолжно быть отредактировано.Я представил это как ответ, но это не очень элегантное решение.

1 Ответ

0 голосов
/ 02 мая 2019

Вот решение, которое вручную отделяет путь от line, выполняя глобализацию и возвращая только части пути после пробелов, которые уже присутствуют.Одна из проблем заключается в том, что если пути содержат пробелы, если вы дважды нажмете клавишу Tab, вы получите предложения только для оставшегося текста после пробела.В зависимости от варианта использования это может быть проблемой.

def complete_export(self, text:str, line:str, begidx, endidx):
    path = line[line.find(" ")+1:]  # get everything after space
    return [" ".join(x.split(" ")[(line.count(" ") - 1):]) for x in glob(path + "*")]  # completion suggestions after last space
...