코드 검토: bash 별칭 자동 완성

코드 검토: bash 별칭 자동 완성

내가 읽고있다명령 별칭에 대한 bash 완성을 얻는 방법은 무엇입니까?Shawn J. Goff의 답변에는 뭔가가 필요하다고 생각합니다. 사용자 설정을 줄여서 귀하의 설정에서 가져오도록 설계된 작은 스크립트를 작성했지만 .bashrc제대로 작동하지 않으므로 누군가 내 실수를 알아차릴 수 있기를 바랍니다.

function make-completion-wrapper-1 () {
    local function_name="$2"
    local arg_count=$(($#-3))
    local comp_function_name="$(complete -pr $1|sed -e 's/^\(.* -F \)\([^ ]*\) [^ ]*$/\2/')"
    shift 2
    local function="
        function $function_name {
            ((COMP_CWORD+=$arg_count))
            COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
            "$comp_function_name"
            return 0
        }"
    echo "$function"
    eval "$function"
}

function make-completion-wrapper-2 () {
    local function_name="$1"
    local alias_name="$2"
    local comp_function_base="$(complete -pr $3|sed -e 's/^\(.* -F\)\( [^ ]*\) [^ ]*$/\1/')"
    echo "$comp_function_base $function_name $alias_name"
    eval "$comp_function_base $function_name $alias_name"
}

[ -e ~/.cache/bash_alias_complete ] && rm ~/.cache/bash_alias_complete

alias | \
    sed \
        -e 's/^alias //' \
        -e '/^\([^=]\+\)='\''\1 /d' \
        -e "/'.*=/d" -e '/\$/d' \
        -e h \
        -e "s/.*='\([^ ]*\)\( .*\)'$/\1! \1\2/" \
        -e 'y/ -!/__ /' -eG -e 's!\n[^=]*='\''\(.*\)'\''! \1!' \
        -e 's/^/make-completion-wrapper-1 /p' \
        -e 's/^[^ ]* [^ ]* \([^ ]*\) .*$/\1/' \
        -e x \
        -e 's!='\''\([^ ]*\) .*$! \1!' \
        -e x \
        -e 's!^!make-completion-wrapper-2 !' \
        -e G \
        -e 'y/\n/ /' \
    > ~/.cache/bash_alias_complete

. ~/.cache/bash_alias_complete

키를 누르면 다음 오류가 발생합니다 Tab.

bash: COMP_POINT - : syntax error: operand expected (error token is "- ")

노트:위의 코드는 파일(예: )에 배치할 수 있으며 myfuncs.bash, 그런 다음 셸이나 $HOME/.bashrc.

이 코드의 전체 변경 내역을 보려면 다음을 참조하세요.https://github.com/hildred/scripts.git

답변1

오류 메시지 COMP_POINT의 출처는 다음과 같습니다.배쉬 참조 매뉴얼:

COMP_POINT

현재 명령의 시작 부분을 기준으로 현재 커서 위치의 인덱스입니다. 현재 커서 위치가 현재 명령의 끝에 있는 경우 이 변수의 값은 ${#COMP_LINE}과 같습니다. 이 변수는 프로그래밍 가능 완성에 의해 호출되는 쉘 함수 및 외부 명령에서만 사용할 수 있습니다(프로그램 가능 완성 참조).

이 시도

귀하의 코드를 그대로 사용하려고합니다. 마지막 행까지 모든 것을 소싱할 때 효과적입니다. 이 줄을 실행하면 . ~/.cache/bash_alias_complete오류가 발생합니다. 여기에 포함시키기에는 너무 많습니다.

결과를 파일로 생성하는 데 몇 가지 문제가 있는 것 같습니다 ~/.cache/bash_alias_complete.

내가 겪은 오류

다음과 같은 별칭이 있습니다.

$ alias|grep cdc
alias cdl='cdctl -o1'
alias cdu='cdctl -o0'

귀하의 sed명령을 통해 해당 명령이 통과한 다음 내 캐시 파일로 전파되어 이러한 명령으로 인해 다음 오류가 발생합니다.

$ make-completion-wrapper-1 cdctl _cdctl__o1 cdctl -o1
$ make-completion-wrapper-2 _cdctl__o1 cdl cdctl
$ make-completion-wrapper-1 cdctl _cdctl__o0 cdctl -o0
$ make-completion-wrapper-2 _cdctl__o0 cdu cdctl
bash: complete: cdctl: no completion specification
 _cdctl__o1 cdl

다른 예도 있지만 요점은 명령이 sed필요한 만큼 엄격하지 않다는 것입니다. 이것이 궁극적으로 문제입니다.

관련 정보