Добавьте пробелы в конец некоторых опций автоматического заполнения Bash, но не другим?

Я пытаюсь создать сценарий завершения Bash для программы Java. Типичный вызов той программы мог бы быть похожим на это:

$ javaProgram -Dproperty=foo option1 option2

Часть моего сценария должна будет предложить различные свойства Java, которые доступны для этой программы (т.е. когда пользователь вводит -D, сценарий предложил бы, скажем, property=, разрешение пользователю затем ввести значение).

Я хотел бы, чтобы завершение не вставило пробел после того, как равняется знаку. Однако, когда пользователь вводит различные варианты для программы (option1 и option2 в вышеупомянутом примере), я хотел бы, чтобы сценарий сделал завершение и вставил пробел, когда это завершается.

Я плохо знаком со сценариями завершения Bash, но я знаю nospace опция для complete встроенная оболочка. Это, кажется, не работает на compgen встроенный, тем не менее, который походит на то, что я хочу. Я попытался использовать nospace, и затем явно включая пробелы в конце подходящих вариантов, но они, кажется, не удаются.

Кто-либо знает, как получить пробелы в конце некоторых опций, но никакие пробелы в конце других?

12
задан Benjamin W. 29 September 2016 в 19:39
поделиться

2 ответа

Деннис прав на деньгах, в функции, на которую вы ссылаетесь с помощью complete -F _your_func , вам нужно что-то вроде этого (взято из / etc / bash_completion):

    # escape spaces; remove executables, aliases, pipes and sockets;
    # add space at end of file names
    COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
               command ls -aF1d "$path*" 2>/dev/null | \
               sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \
               -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
    return 0

В этом конкретном примере используется -o nospace , но добавляет пробел вручную. Это последний -e ('s / [^ \ /] $ / & / g') , который добавляет пробел. В этом случае он добавляется только в том случае, если последний параметр не заканчивается косой чертой (это каталог и файлы для автозаполнения).

Ключевым отличием, похоже, является добавление амперсанда перед пробелом. Попробуйте это и посмотрите, работает ли это.

1
ответ дан 2 December 2019 в 22:05
поделиться

Было бы полезно увидеть имеющийся у вас код.

Однако посмотрите код завершения для scp в /etc/bash_completion.d/ssh , если он у вас есть. Он ставит пробелы после имен локальных файлов, но не после имен хостов.

1
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: