zsh 완료 : 특정 디렉토리에서 파일 이름 가져 오기


10

좋아, 약간의 배경 : 나는 Mac을 사용하고 CLI에서 가능한 한 많이한다.

특히, 나는 종종 USB 스틱 cp이나 mv파일에 튀어 나와서 즉시 꺼내고 싶다. 이것은 (10.7에서) 빈 데스크탑 공간 (보통 두 칸 이상 떨어진 곳)으로 가서 디스크를 선택하고 "command-e"를 누르는 것을 제외하고는 키 마운트 해제를 제외하고는 일반적으로 소수의 키 입력으로 수행 할 수 있습니다. 솔직히 말해서이 마운트 해제 절차는 프로세스에서 가장 시간이 많이 걸리고 지루한 부분입니다.

간단히 입력 할 수있는 것이 훨씬 더 자연스럽고 효율적입니다.

ej<tab> J<tab>

내 USB 스틱이 / Volumes / Jefferson에 마운트되어 있다고 가정하십시오. 6 번의 키 입력으로 얻을 수있는 것은 다음과 같습니다.

eject /Volumes/Jefferson

다음 명령을 실행해야합니다.

diskutil unmount /Volumes/Jefferson

그래서 나는 멋진 작은 기능을 썼습니다 :

eject() {
    diskutil unmount /Volumes/$1
}

그리고 완성 기능은 다음과 같습니다.

compdef '_files -g "/Volumes/*"' eject  

그러나 이것에 문제가 있습니다. 이 _files함수는 완전한 경로를 생성합니다. 이제 "eject"함수의 행을로 변경하면 문제 diskutil unmount $1가 해결되지만 경로는 / Volumes /로 시작하므로 마운트 지점 이름의 첫 문자를 입력 할 수 없습니다. 예를 들어,을 입력 J<tab하면 PWD의 파일에 대한 자동 완성이 제공됩니다. /Volumes/J<tab>원하는 완성을 얻으려면 입력 해야합니다.

그렇다면 완전한 경로를 생성하는 대신 미리 정의 된 특정 위치에서 파일 이름을 가져 오는 완성 기능이 있습니까?

나는 이것을 6 번의 키 입력으로 낮추고 싶습니다.

답변:


12
_files -W /Volumes

의 설명서를 참조하십시오 _path_files.


완전한! 나는 그것이 내장되어야한다는 것을 알고 있었다. 정말 고마워!
Marshall Eubanks

그렇다면이 완성 함수를 자동로드하는 방법은 무엇입니까? fpath compdef에있는 파일 _eject에 줄을 넣으려고 했습니다. 자동로드 라인을 사용하거나 사용하지 않고 시도했습니다. 나는 완성 함수에 대한 몇 가지 가이드를 보았고 아무도 이와 같은 실제 간단한 예제를 수행하는 방법을 다루지 않았으며 그들의 예제를 기반으로 시도한 것은 없습니다.
Marshall Eubanks

@marshaul #compdef eject파일의 첫 줄과 실제 코드가 필요합니다. 설명서의 자동로드 파일 아래를 참조하십시오 . 처음에 라인을 추가하지 않은 경우 캐시를 삭제하고 ~/.zcompdumpzsh를 다시 시작 해야 할 수도 있습니다 .
Gilles 'SO- 악마 그만해'

아! 삭제 ~/.zcompdump가 트릭을 수행했습니다. 다시 감사합니다!
Marshall Eubanks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.