어떤 경우에는 zsh가 완성 목록을 생성하는 데 오랜 시간이 걸립니다. 원격 서버의 일부 파일을 나열해야 하거나 시작하는 데 시간이 오래 걸리는 도구를 실행해야 할 수도 있습니다. 이러한 경우 Tab시작 완료를 누른 후 화면 표시가 즉시 변경되지 않으며 zsh가 여전히 완료 목록을 생성하고 있는지 여부가 항상 명확하지 않습니다. 목록을 생성했지만 내 콘텐츠가 완료되지 않습니다. 입력되었거나 현재 컨텍스트에서 완성이 지원되지 않습니다.
zsh가 완성 목록을 작성하는 동안 일종의 표시기를 표시하는 방법이 있습니까? 보다 일반적으로, 목록 작성을 시작하기 전에 zsh가 사용자 정의 함수를 실행하도록 하고, 완료되면 다른 함수를 실행하도록 하는 방법이 있습니까?
답변1
완료를 위한 진입점은 다음 함수입니다._main_complete
. compprefuncs
쉘 옵션 및 완료 관련 변수가 설정된 후, 분석이 완료되기 전에 표시 설정 및 실행이 완료되기 전에 Hook을 호출합니다 . comppostfuncs
완료 여부에 관계없이 정상적으로 반환되기 전에 후크를 호출하지만 키보드 인터럽트( Ctrl+ C)가 반환되기 전에는 호출하지 않습니다.
각 후크는 함수 이름의 배열입니다. 이러한 함수는 순차적으로 호출되며 반환 상태는 무시됩니다. _main_complete_
배열은 함수를 호출하기 전에 지워지므로 스스로 다시 삽입해야 합니다.
나는 사용한다zsh/terminfo
기준 치수문자열의 오른쪽 아래 모서리에 표시기를 표시합니다. 적어도 제가 테스트한 구성에서는 완료되면 표시기가 제거됩니다.
zmodload zsh/terminfo
function set_completion_indicator {
echoti sc # save_cursor
echoti cup $((LINES - 1)) $((COLUMNS - $#1)) # cursor_position
echoti setaf $2 # set_foreground (color)
printf %s $1
echoti sgr 0 # exit_attribute_mode
echoti rc # restore_cursor
#sleep 1
}
completion_indicator_text='(completing)'
completion_indicator_color=3
function display_completion_indicator {
compprefuncs+=(display_completion_indicator)
set_completion_indicator $completion_indicator_text $completion_indicator_color
}
function hide_completion_indicator {
comppostfuncs+=(hide_completion_indicator)
# The completion code erases the indicator, so there's nothing to do.
}
compprefuncs+=(display_completion_indicator)
comppostfuncs+=(hide_completion_indicator)