zsh를 사용하여 거의 완벽한 "단일 파일 선택기"를 갖고 싶습니다. 지금까지는 명령줄 zle 설정에 중점을 두는 경향이 있으므로 어떤 문제도 보지 못했습니다. 사용자에게 디렉터리의 단일 파일을 묻는 파일 선택기를 작성한다고 가정해 보겠습니다. 다음은 작동하지만 몇 가지 개선이 필요한 시작 코드입니다.
- 강조 표시: 현재 메뉴 옵션이 반전 영상으로 강조 표시되어야 합니다.
- 순서: 가능한 파일 완성이 프롬프트 아래에 표시되어야 합니다.
- 프롬프트 단계별 실행: 위의 가능한 옵션을 인쇄한 후에는 프롬프트가 아래로 진행되어서는 안 됩니다. 이는 2와 관련이 있습니다.
- 하나만: 사용자에게 여러 개가 아닌 파일 이름 하나만 요청하므로 첫 번째 항목을 완료하려면 Tab 키만 누르십시오. (이것은 "기능적으로 올바른" 것을 의미합니다.)
- 크기: 가능한 완료 횟수가 힌트 아래 범위를 초과하는 경우 정상적으로 처리될 수 있습니다. 백업 화면이 있고 화면 이동이나 스크롤이 불가능하다고 가정합니다.
- 보너스: 단일 파일 선택기의 또 다른 좋은 기능이 생각나면 자유롭게 추가해 주세요. 그러나 별도의 목록에 넣거나 위의 해결 방법 1~5에서 제거하는 방법을 설명하는 설명과 함께 넣는 것이 좋습니다.
참고: 대답은 독립형 zsh 코드입니다. 사용자가 .zshrc를 편집하거나 일부 zsh 확장/플러그인/프레임워크/라이브러리를 설치할 필요가 없습니다.
foofiles.zsh
임시 디렉터리 chmod에 파일을 만들고 실행합니다.
#!/usr/bin/env zsh
setopt extendedglob
setopt globcomplete
setopt nomenucomplete
mkdir ./foo 2>/dev/null
cd ./foo
touch abcd ebcf gbch ijkl mnop qrst unov wxyz
cd ..
function foofileselector {
cd ./foo/
local curcontext=foofileselector:::
vared -p "Select file: " -c foofile;
cd ..
}
function _foofileselector {
_files -W ./foo/
}
zstyle ':completion:foofileselector:*:' insert-tab false completer _foofileselector
autoload -Uz compinit && compinit
foofileselector
[[ -z $foofile ]] && foofile="NIL"
echo "You selected: $foofile"
rm -rf ./foo/
이것은 가깝습니다 (짐파일이 완료되었습니다):