내가 읽고있다명령 별칭에 대한 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
필요한 만큼 엄격하지 않다는 것입니다. 이것이 궁극적으로 문제입니다.