Добавить пробелы в конце некоторых опций автозаполнения Bash, но не в другие? - PullRequest
10 голосов
/ 26 февраля 2010

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

$ javaProgram -Dproperty=foo option1 option2

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 29 августа 2012

Компонент C4H5As в завершение bash для scp, сохраняющий добавленное пространство, - это не амперсанд, а всего лишь синтаксис sed для замены с заменой.

Вы должны изменить IFS, чтобы compgen делил ввод не на пробелы, а на переводы строк и табуляции:

local IFS=$'\t\n'
COMPREPLY=( $(compgen -W "$options" -- $cur) )
2 голосов
/ 29 сентября 2016

Вы можете сделать это, удалив пробелы с соответствующей опцией, а затем добавить их обратно вручную для тех опций, где вы их хотите, используя простое завершение -W ("список слов"):

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram

Автозаполнение теперь будет вставлять пробел после option1 и option2, но ни один после Dproperty=.

1 голос
/ 26 февраля 2010

Деннис прав на деньги, в функции, на которую вы ссылаетесь 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 голос
/ 26 февраля 2010

Было бы полезно увидеть код, который у вас есть.

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

...