Bash의 기본 기능은 현재 작업 디렉터리에 관계없이 다양한 bin 디렉터리에 저장된 명령을 완료하는 것입니다. 이를 통해 사용자는 실행해야 하는 디렉터리의 전체 경로를 지정하지 않고도 명령과 바이너리를 체계적으로 유지할 수 있습니다.
Bash는 나보다 먼저 이 명령 완성을 어떻게 제공했습니까?달리기내 생각에 디자인 관점에서 이러한 bin 파일은 내가 실행하기 전에 동일한 명령 완료를 기대하는 것이 합리적이라고 생각합니다.편집하다그들을.
내 특별한 경우에는 이는 내 편집기의 완성 기능을 수정하여 vi
현재 작업 디렉터리의 파일 이름뿐만 아니라 내 파일 이름도 포함하도록 의미합니다 ~/bin/
(실제로 다른 컨테이너의 파일을 추가하는 것에 대해서는 신경 쓰지 않습니다. 명령).
간단한 수정이것그래서 대답은 이렇습니다.
$ source _vi
$ complete -f -F _vi vi
여기서 _vi는 다음과 같이 정의됩니다.
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local pat="~/bin/*"
COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));
i=0
for item in "${COMPREPLY[@]}"; do
COMPREPLY[$i]="${item##*/}"
i+=1
done;
return 0;
}
하지만 vi는 파일을 열려면 전체 경로를 전달해야 합니다!
그래서 내 질문은: 내가 어떻게 할 수 있습니까?탭 완료파일 이름은 다음에서 왔지만 ~/bin/
여전히통과전체 경로 vi
? 이건 그냥 |
꿈인가요? 완전히 다른 접근 방식을 시도해야 할까요?
~/bin/*
제가 사용할 때는 vi (TAB)(TAB)
!
편집하다:
@roaima의 답변과 아래에 설명된 제안 사항을 기반으로 제가 사용하는 기능은 다음과 같습니다. 내가 관심 있는 두 디렉터리(바이너리 및 구성 파일) 이외의 디렉터리에 있는 파일에 디렉터리 독립적 완성 액세스를 쉽게 추가할 수 있습니다.
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local bin_dir="~/bin/"
local dot_dir="~/dotfiles/"
COMPREPLY=($(compgen -f -G "$bin_dir*" -- "$bin_dir${word}"));
COMPREPLY+=($(compgen -f -G "$dot_dir*" -- "$dot_dir${word}"));
return 0;
}
답변1
가장 쉬운 방법은 $item
다음에 경로를 추가할 때 경로를 제거 하지 않는 것입니다 $COMPREPLY[$i]
.
_vi ()
{
local word=${COMP_WORDS[COMP_CWORD]};
local pat="~/bin/*"
COMPREPLY=($(compgen -f -G "$pat" -- "~/bin/${word}"));
return 0;
}
가능한 목록은 경로 구성 요소 없이 표시되지만 성공적으로 완료되면 경로가 삽입됩니다.
대안은 현재 디렉토리에서 파일 이름을 찾는 쉘 스크립트를 사용하여 자체적으로 확장하는 것입니다 . 파일 이름 이 vi
없으면 . 검색하기 /.~/bin/
$CDPATH
~/bin