나는 파일을 디렉토리( )에 복사하고 디렉토리에서 파일을 복사하는 push
두 가지 함수를 작성했습니다 . 이 기능을 사용할 때 bash가 해당 디렉토리의 이름을 자동 완성하기 를 원합니다 . 자동 완성 기능이 해당 디렉토리에서만 이름을 가져오길 원합니다. 현재 양식에서 자동 완성 기능은 소스 디렉터리( )에 일치하는 항목이 있는지 여부 에 관계없이 현재 디렉터리에서 파일 이름도 찾습니다 .pull
$FILE_EXCHANGE_DIR
pull
$FILE_EXCHANGE_DIR
여기에 내가 전달하는 함수의 두 가지 버전이 있습니다 complete
. 그들 중 누구도 직업이 없습니다.
_pull () {
local cmd="${1##*/}";
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
filelist=( $(ls ${FILE_EXCHANGE_DIR} ) )
local TEMP_COMPREPLY=( $(compgen -W "${filelist[@]}" -- ${word} ) )
COMPREPLY=( "${TEMP_COMPREPLY[@]}" )
return 0;
}
_pull ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local line=${COMP_LINE};
local pat="$FILE_EXCHANGE_DIR/*"
COMPREPLY=($(compgen -f -G "$pat" -- "$FILE_EXCHANGE_DIR/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
마지막으로, 나는
complete -f -F _pull pull
현재 디렉터리가 아닌 디렉터리(현재 디렉터리가 아님)에서만 이름을 완성할 수 있는 좋은 방법이 있습니까? 이는 소스에 일치하는 항목이 없더라도 기본적으로 수행되어야 합니까 readline
?
답변1
내가 올바르게 이해했다면 이것이 당신이 찾고 있는 것이어야 합니다:
_pull () {
# Set
IFS=$'\n' tmp=( $(compgen -W "$(ls "$FILE_EXCHANGE_DIR")" -- "${COMP_WORDS[$COMP_CWORD]}" ))
COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _pull pull
파일 이름의 공백도 이스케이프 처리합니다.
이는 -o default
기본값인 으로 수행되지만 명시적으로 어딘가( ? )로 설정하지 않는 한 readline
실제로는 아무 작업도 수행하지 않는 것처럼 보입니다. .initrc
파일 이름이 필요하면 를 사용하거나 -o filenames
계속 사용하세요 -f
.