Удаленное завершение URL в Bash

В настоящее время я добавляю поддержку удаленного завершения URL для svn в Bash. В настоящее время я использую модифицированный bash-completion-svn, который определяет, когда запускать завершение URL-адресов, выглядящих как

  svn+ssh://$HOST/$DIR/prefix_string

Мне удалось извлечь часть родительского каталога URL-адреса (svn+ssh://$HOST/$DIR) и вызвать в нем svn ls и

  cur_suffix=prefix_string

Теперь осталось, как использовать часть URL-адреса, относящуюся к каталогу, и prefix_string, введенный пользователем после него (может быть пустым), чтобы выполнить завершение. Могу ли я использовать compgen, чтобы это работало?

То есть получить список возможных дополнений, если последним символом в URL является косая черта или полный каталог, если суффикс пуст.

В настоящее время я использую

  fix=( $(compgen -o nospace -W "$remote_fileds" -- $cur_suffix))

чтобы сделать завершение для URL-адресов, таких как

svn://HOST/DIR/a 

завершить в пример

svn://HIST/DIR/a_file

Однако он всегда выбирает первую альтернативу, несмотря ни на что, и всегда вставляет пробел, хотя я написал -o nospace. Как предотвратить завершение завершения compgen, если есть другие возможные совпадения (префикс a не уникален) и как заставить эти совпадения печатать под курсором, не перемещая курсор. Это может сделать только complete?


person Nordlöw    schedule 08.10.2013    source источник
comment
Удалась ли вам ваша попытка? Можете ли вы поделиться некоторыми, где ваша работа? Меня также очень интересует завершение URL для подрывной деятельности.   -  person grundic    schedule 03.09.2014


Ответы (1)


Для моих сценариев завершения bash, которые обязательно работают в различных версиях bash с разными уровнями поддержки завершения, я использую следующую идиому, чтобы попытаться выполнить наилучшее «завершение», а затем изящно отступить, по крайней мере, к тому, что должно работать; например, предполагая команду svn2 и функцию завершения с именем _complete_svn2:

complete -o bashdefault -o default -o nospace -F _complete_svn2 svn2 2>/dev/null \
 || complete -o default -o nospace -F _complete_svn2 svn2 2>/dev/null \
 || complete -o default -F _complete_svn2 svn2 2>/dev/null \
 || complete -F _complete_svn2 svn2

В идеале "-o nospace" существует и работает, но если это не так, вы можете вернуться к "-o default".

Кроме того, в приведенном выше примере используется функция для генерации завершений, условно называемая _complete_svn2. Возможно, вы также можете попробовать использовать что-то подобное. Следующий пример работает для меня, показывая соответствующие параметры, не добавляя дополнительное пространство и т. Д. (Он намеренно не завершает параметры «-»):

_complete_svn2() {
    local options="one two three four five"
    local cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=()
    [[ ${cur} != -* ]] && COMPREPLY=( $(compgen -W "${options}" -- ${cur}) )
}

Например, (и пробел после «пять» не добавляется)

$ svn2 f[tab]
five four
$ svn2 fi[tab]
$ svn2 five
person michael    schedule 31.12.2013