bash - الإكمال التلقائي القائم على سيمفوني فواصل الإكمال التلقائي سكب



symfony autocomplete (1)

أنا باستخدام أدوات فب http://robo.li و n98-magerun.phar - على حد سواء تقوم على مكونات كلي سيمبفوني ل.

عندما أستخدم النص البرمجي للإكمال التلقائي:

https://gist.github.com/caseyfw/51bdbcb37e5dfb91b74e

#!/bin/sh
function __robo_list_cmds ()
{
      robo list --raw | awk '{print $1}' | sort
}

function __robo_list_opts ()
{
    robo list --no-ansi | sed -e '1,/Options:/d' -e '/^$/,$d' -e 's/^ *//' -e 's/ .*//' | sort
}

_robo()
{
    local cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=($(compgen -W "$(__robo_list_opts) $(__robo_list_cmds)" -- ${cur}))
    return 0;
}

complete -o default -F _robo robo
COMP_WORDBREAKS=${COMP_WORDBREAKS//:}

فإنه يكسر الإكمال التلقائي للأمر scp (الذي عادة ما يكمل الملفات على ملقم بعيد - ولكن مع هذا - لا علاقة لها - إكمال روبو في مكان، سكب يزيل اسم المضيف من الأمر)

لماذا هذا؟ كيفية إصلاح؟

تصحيح

استنادا إلى الجواب، النسخة الثابتة هنا:

https://gist.github.com/amenk/d68f1fe54b156952ced621f771ff48ba


هذا ربما لا علاقة له مع كومبوسب robo الخاص بك. ولا مع وظيفة إكمال _scp المرتبطة scp .

ربما يرجع ذلك إلى COMP_WORDBREAKS=${COMP_WORDBREAKS//:} .

تمت إزالة : من قائمة الفواصل. على ما يبدو _scp قوية بما فيه الكفاية لتتصرف نفسه مع أو بدون : كفاصل كلمة. ويعرض نفس قائمة المرشحين المكتملين. ولكن الرمز المميز الذي يحل محله عندما يقوم _scp بإرجاع مرشح واحد فقط للانتهاء، على سبيل المثال scp host:public_ht ، هو host:public_ht ، بدلا من public_ht فقط. البرهان:

$ _foobar () { COMPREPLY=bazcux; return 0; }
$ complete -o default -F _foobar foobar
$ echo $COMP_WORDBREAKS
"'><=;|&(:

إذا حاولت إكمال foobar host:public_ht ، فستحصل على foobar host:bazcux لأن الرمز المميز هو مجرد public_ht . بينما مع:

$ COMP_WORDBREAKS=${COMP_WORDBREAKS//:}
$ echo $COMP_WORDBREAKS
"'><=;|&(

إذا حاولت إكمال foobar host:public_ht ، يمكنك الحصول على foobar bazcux لأنه هو host:public_ht الكامل host:public_ht التي يتم استبدالها bazcux .

الحل لمشكلتك هو على الأرجح للتكيف مع وظيفة إكمال _robo الخاصة بك بحيث لا تتطلب ما : ليس فاصل كلمة. شيء مثل:

_stem () {
    local lcur lprev
    lcur="$cur"
    stem="$lcur"
    for (( i = cword - 1; i >= 0; i -= 1 )); do
        lprev="${words[i]}"
        [[ $lcur == ":" ]] && [[ $lprev == ":" ]] && break
        [[ $lcur != ":" ]] && [[ $lprev != ":" ]] && break
        stem="$lprev$stem"
        lcur="$lprev"
    done
}

_robo () {
    local cur prev words cword
    _init_completion || return
    local stem options
    options=($(__robo_list_opts) $(__robo_list_cmds))
    COMPREPLY=()
    _stem
    COMPREPLY=($(compgen -W '${options[@]}' -- "$stem"))
    [[ $stem =~ : ]] && stem=${stem%:*}: && COMPREPLY=(${COMPREPLY[@]#"$stem"})
    return 0
}

complete -o default -F _robo robo

حل أبسط (على ما يبدو) يتكون من استبدال الدالة _stem أعلاه الدالة __reassemble_comp_words_by_ref الموجودة في مكتبة bash_completion :

_robo () {
    local cur prev words cword
    _init_completion || return
    __reassemble_comp_words_by_ref ":" words cword
    options=($(__robo_list_opts) $(__robo_list_cmds))
    COMPREPLY=($(compgen -W '${options[@]}' -- "$cur"))
    return 0
}

complete -o default -F _robo robo

كل هذا ربما ليس بالضبط ما تريد. أنا لا أعرف robo.il وربما هناك العديد من التحسينات التي من شأنها أن تأخذ المزيد من السياق في الاعتبار لاقتراح استكمالات محددة. ولكن قد تكون نقطة انطلاق.





autocomplete