2015-03-12 3 views
1

Я создал свою собственную функцию завершения bash. Я сделал несколько исправлений. Само завершение меня устраивает, но я нарушил авто пространство после коротких вариантов -a, -p, -hЗавершение Bash на коротких опциях

Значение, когда я печатаю editcfg -fil<TAB> это autocompletes в editcfg -file (пробел после -file). Однако, если я наберу editcfg -p<TAB>, он не будет автокосмически после -p.

функция:

_editcfg() 
{ 
    local cur prev opts presets u_opts; 
    COMPREPLY=(); 
    cur="${COMP_WORDS[COMP_CWORD]}"; 
    prev="${COMP_WORDS[COMP_CWORD-1]}"; 
    opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h"); 
    presets=("default" "empty"); 
    u_opts=(); 
    for i in "${opts[@]}"; 
    do 
     for j in "${COMP_WORDS[@]}"; 
     do 
      if [[ "$i" == "$j" ]]; then 
       continue 2; 
      fi; 
     done; 
     u_opts+=("$i"); 
    done; 
    case ${prev} in 
     -p) 
      COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur})); 
      return 0 
     ;; 
     -file) 
      COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null)); 
      return 0 
     ;; 
     -h | -version) 
      u_opts=(); 
      return 0 
     ;; 
    esac; 
    COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur})); 
    return 0 
} 

Что я пропустил?

Благодаря

+0

Если вы '2' продолжить * * после добавления текущей опции к' u_opts' ли это исправить? 'Editcfg -file ' добавить пробел? –

+0

Добавление 'continue 2' не исправляет его. 'editcfg -file ' также не заполняет его. Кажется, только когда предоставляется частичная опция. –

ответ

1

Я обновил 2-ю петлю for и она работала хорошо:

_editcfg() 
{ 
    local cur prev opts presets u_opts; 
    COMPREPLY=(); 
    cur="${COMP_WORDS[COMP_CWORD]}"; 
    prev="${COMP_WORDS[COMP_CWORD-1]}"; 
    opts=("-n" "-p" "-file" "-a" "-verbose" "-version" "-h"); 
    presets=("default" "empty"); 
    u_opts=(); 
    for i in "${opts[@]}"; do 
     for ((j = 0; j < COMP_CWORD; ++j)) do 
      if [[ "$i" == "${COMP_WORDS[j]}" ]]; then 
       continue 2; 
      fi; 
     done; 
     u_opts+=("$i"); 
    done; 
    case ${prev} in 
     -p) 
      COMPREPLY=($(compgen -W "${presets[*]}" -- ${cur})); 
      return 0 
     ;; 
     -file) 
      COMPREPLY=($(compgen -fd -- ${cur} 2>/dev/null)); 
      return 0 
     ;; 
     -h | -version) 
      u_opts=(); 
      return 0 
     ;; 
    esac; 
    COMPREPLY=($(compgen -W "${u_opts[*]}" -- ${cur})); 
    return 0 
} 
+0

Определенно работает. Не понимаю, почему :(Также с 'for j in '! $ {COMP_WORDS [@]}" ... ' –

+0

С кодом, когда вы вводите' -p 'массив' COMPREPLY' не будет включать '- p' then Bash думал бы, что текущее слово * ('-p') не может автозаполнять любую строку в' COMPREPLY', поэтому Bash вообще не изменит * текущее слово *. В моем коде 'COMPREPLY' будет включать' - p', поэтому Bash знал бы, что текущее слово * ('-p') может автокомпонировать строку (' -p') в 'COMPREPLY' однозначно, чтобы она автоматически заполнила строку (от' -p' до '-p ') и вставьте ПРОСТРАНСТВО. – pynexj

+0

Мне очень сложно объяснить это на английском языке. :) – pynexj

Смежные вопросы