나는 사용하려고cdablevars.zshrc
, 내 파일 에 설정하세요
# Set directory variables
setopt cdablevars
Home=/Users/benjamin
그러나 탭이 완료되기 전에 를 실행 cd Home
하거나 단순히 실행하지 않고 사용하는 척(예: 을 입력하는 것 ) 해야 합니다 .cd Home/Desktop/
첫 번째 터미널 창에서는 Home
탭 완성 기능을 사용할 수 없습니다 . 실행한 후에야 cd Home
. 탭 완성이 자동으로 인식되도록 변수를 설정할 수 있나요?
답변1
/ _cd
내장 기능의 완성자는 다음을 제공합니다.cd
pushd
이름 디렉터리에 추가되었습니다이름 디렉터리해시 테이블( hash -d
및 $nameddirs
연관 배열 참조)
이러한 내용은 해당 명명된 디렉터리를 참조할 때 채워집니다. 명명된 디렉터리 해시의 전체 빌드를 실행하더라도 항목 hash -df
만 추가됩니다 ~user
(문서에 명시되어 있음).
일반적인 zsh
대화형 세션에는 수백 개의 전역 변수가 있으며 그 중 대부분은 디렉터리를 포함하지 않습니다. 그것들을 완성으로 제공하는 것은 비생산적입니다.
또한 이는 cdablevars
역사적인 유물에 가깝고 주로 tcsh
예상보다 많은 문제를 포함하여 많은 문제를 일으키고 발생하는 사용자를 수용하기 위한 것입니다. 나는 개인적으로 그것을 멀리하고 싶습니다. 바라보다경로를 평가할 때 zsh가 느립니다.이에 대해 자세히 알아보세요.
그러나 어쨌든, cd ~Ho
Tab(사용하여~...
분명히IMO가 더 좋음) 에 추가하지 않는 한 의 유무에 관계없이 cdablevars
완전하지 않습니다 .Home
이름 디렉터리해시 테이블.
hash -d
그럼에도 불구하고 원한다면 계속해서 include를 사용할 수 있습니다 hash -d ${(k)parameters}
.
답변2
완료가 항상 작동하지 않는 이유
구체적인 효과는cdable_vars
cd foo
로 허용되는 바로가기 입니다 cd ~foo
.물결표 확장언제를 ~foo
나타낼 수 있는 것은 값이 슬래시로 시작하는 변수입니다.$foo
foo
이것완전한 코드~foo
매개변수가 실제로 인식되지 않습니다. 명령을 사용하지 않고도 문제를 재현할 수 있습니다 . cd
처음에는 echo ~f
Tab완료되지 않지만 ~foo
이 명령을 실행하면 완료됩니다.
두 번째로 성공한 이유는 ~foo
추가 foo
기능을 성공적으로 사용했기 때문입니다.명명된 디렉터리 해시 테이블(다음을 통해 액세스nameddirs
대량으로), 그것이 ~foo
바로 완성 코드가 찾고 있는 것입니다.
특정 변수에 대해 작동하게 만드는 방법
foo
절대 경로가 포함된 변수를 정의한 후 다음을 실행합니다.
hash -d foo=$foo
값이 변경되면 이 명령을 다시 실행할 필요가 없습니다 foo
.
자동으로 작동하게 하는 방법
내가 생각할 수 있는 유일한 방법은 _tilde
코드 완성을 통해 또는 명명된 디렉터리 해시 테이블에 해당 매개 변수를 강제로 추가하여 매개 변수 이름을 명명된 디렉터리로 지원하도록 패치하는 것입니다.
테스트되지 않음: _tilde
항목을 강제로 추가하도록 수정되었습니다 nameddirs
.
if [[ -o cdable_vars ]]; then
local p
for p in ${(k)parameters[(R)scalar*]}; do
if [[ ${(P)p} == /* ]]; then : ~$p 2>/dev/null; fi
done
fi