▲GN⁺ 8달전 | parent | ★ favorite | on: Bash와 Zsh에서 간단한 탭 자동완성 작성하기(mill-build.org)Hacker News 의견 fish에서 관심 있는 프로그램이 man 페이지를 제공한다면 fish_update_completions만 실행하면 됨 이 명령은 시스템의 모든 man 페이지를 파싱해 자동 완성 파일을 ~/.cache/fish/generated_completions/에 생성함 man 페이지가 부실하거나 없으면 직접 작성해 upstream에 기여할 수 있음 fish의 포맷은 단순해서 공식 문서만 보면 충분함 예: curl의 -L → 'Follow redirects', -O → 'Write output to file named as remote file' 화면 공유할 때 사람들이 내가 zsh와 플러그인들을 쓰는 줄 아는데, 사실은 기본 설정만으로도 예쁜 fish를 쓰고 있음 하지만 car TAB이 blkdiscard로 확장되는 비접두사 자동 완성 때문에 cargo가 PATH에 없어도 오작동하는 점은 개선되면 좋겠음 man 페이지 없이 --help만 제공하는 프로그램의 경우, fish에 zsh의 _gnu_generic이나 bash의 complete -F _longopt 같은 기능이 있는지 궁금함 zsh에서도 man 페이지 기반 자동 완성을 생성하는 스크립트가 있음 → zsh-manpage-completion-generator OpenSUSE에서 zypper search fish-completion을 치면 200개가 넘는 패키지가 나와서 뭔가 수상하다고 느꼈음 bash 자동 완성이 점점 “똑똑해지면서” 현재 커서 위치에 파일명이 적절치 않다고 판단하면 파일/디렉토리 완성을 막는 점이 불편함 차라리 항상 파일명 완성으로 fallback하는 게 낫다고 생각함 이 때문에 완성 스크립트를 다 꺼버릴까 고민한 적도 있음 bash에는 M-/에 바인딩된 complete-filename처럼 문맥 무시하고 파일명만 완성하는 함수들이 있음 특정 명령어의 파일 완성이 완전히 깨져서, ls로 먼저 완성한 뒤 명령어를 바꾸는 식으로 우회함 파일명이 존재하지만 실행 불가할 때는 “file foo.exe exists but it isn't executable” 같은 메시지를 주는 게 혼란이 덜함 complete -r 실행 후 원하는 대로 동작하는 걸 보면 bash-completion 스크립트에 문제가 있는 듯함 웹 폼에서 이메일 입력 시, 첫 글자만 쳐도 “Invalid email!” 오류를 띄우는 프론트엔드 검증처럼 답답한 UX와 비슷함 내가 작성한 글인데, 다른 사람들도 흥미롭게 읽었으면 함 zsh 완성 스크립트를 매번 로드하는 대신 $fpath에 설치하면 캐시되어 시작 속도가 빨라짐 Homebrew 배포 시 자동으로 completions를 설치할 수 있음 zsh 완성은 규모가 커서 익히기 어렵지만, 회사에서 ansible 래퍼 스크립트에 플레이북별 옵션, 태그 자동 완성 등을 추가하며 점점 다듬고 있음 최근 CLI 개발에 usage 라이브러리를 쓰기 시작했음 → clap과 통합되고, completions·argparse·man 페이지 생성 가능 fish 스크립트의 argparse 블록을 교체할 가치는 고민 중이지만, optparse보다는 훨씬 나음 나도 비슷한 CLI 사양 정의 도구를 만들고 있는데, fish 지원을 막 추가했음 bash/zsh에서 JSON 필드 자동 완성을 지원하는 fx.wtf를 소개함 ijq보다 가볍지만, 상황에 따라 유용할 수 있음 zsh 내장 함수로 completer를 만드는 튜토리얼 → zsh-completions-howto 프로그램이 bash 스크립트를 작성하지 않아도 되게 하는 표준 플래그가 있는지 궁금함 zsh에서는 _gnu_generic으로 --help 기반 간단 완성이 가능함 Rust의 clap_complete, ripgrep의 --generate 옵션, PHP Symfony의 런타임 완성 생성 등 사례가 있음 공통 파서 라이브러리들이 자동으로 구현해주는 --completion 표준이 있으면 좋겠음 ksh에서는 배열 정의만으로 간단히 완성을 구현할 수 있음 예: complete_kill_1 배열에 시그널 이름을 넣으면 kill 명령 첫 인자 완성 제공 이게 ksh93 문법인지, oksh에 백포트된 건지 궁금함 내가 만든 간단한 zsh 완성 스니펫 예시: set-java-home 함수에서 ~/apps/java/* 목록을 버전으로 완성하도록 _describe 사용 거의 원라인에 가까운 간단한 구조임 LLM의 주된 기능이 자동 텍스트 완성이라 그런지, GitHub Copilot이 vscode 터미널에서 bash와 zsh 완성을 꽤 잘해줌
Hacker News 의견
fish_update_completions만 실행하면 됨~/.cache/fish/generated_completions/에 생성함curl의-L→ 'Follow redirects',-O→ 'Write output to file named as remote file'car TAB이blkdiscard로 확장되는 비접두사 자동 완성 때문에 cargo가 PATH에 없어도 오작동하는 점은 개선되면 좋겠음--help만 제공하는 프로그램의 경우, fish에 zsh의_gnu_generic이나 bash의complete -F _longopt같은 기능이 있는지 궁금함zypper search fish-completion을 치면 200개가 넘는 패키지가 나와서 뭔가 수상하다고 느꼈음complete-filename처럼 문맥 무시하고 파일명만 완성하는 함수들이 있음ls로 먼저 완성한 뒤 명령어를 바꾸는 식으로 우회함complete -r실행 후 원하는 대로 동작하는 걸 보면 bash-completion 스크립트에 문제가 있는 듯함$fpath에 설치하면 캐시되어 시작 속도가 빨라짐_gnu_generic으로--help기반 간단 완성이 가능함--generate옵션, PHP Symfony의 런타임 완성 생성 등 사례가 있음--completion표준이 있으면 좋겠음complete_kill_1배열에 시그널 이름을 넣으면kill명령 첫 인자 완성 제공set-java-home함수에서~/apps/java/*목록을 버전으로 완성하도록_describe사용