zsh가 완료를 찾는 동안 표시기 표시

zsh가 완료를 찾는 동안 표시기 표시

어떤 상황에서는 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)

관련 정보