Exibindo um indicador enquanto o zsh procura conclusões

Exibindo um indicador enquanto o zsh procura conclusões

Em algumas situações, o zsh demora muito para gerar uma lista de conclusões. Talvez seja necessário listar alguns arquivos em um servidor remoto ou talvez seja necessário executar uma ferramenta que tenha um longo tempo de inicialização. Nessas situações, depois de pressionar Tabpara iniciar a conclusão, a exibição da tela não muda imediatamente e nem sempre fica claro se o zsh ainda está gerando a lista de conclusões, ele gerou a lista, mas não há conclusões para o que eu digitei ou a conclusão simplesmente não é suportada no contexto atual.

Existe alguma maneira de exibir algum tipo de indicador enquanto o zsh cria a lista de conclusão? De maneira mais geral, existe uma maneira de o zsh executar uma função definida pelo usuário antes de começar a construir a lista e, em seguida, executar uma função diferente quando terminar?

Responder1

O ponto de entrada de conclusão é a função_main_complete. Ele chama o gancho compprefuncsapós definir opções de shell e variáveis ​​relacionadas à conclusão e antes de analisar as configurações de exibição da conclusão e executar as conclusões. Ele chama o gancho comppostfuncslogo antes de retornar normalmente, independentemente de as conclusões terem sido encontradas ou não, mas não antes de retornar em uma interrupção do teclado ( Ctrl+ C).

Cada gancho é um array de nomes de funções; as funções são chamadas em ordem e seu status de retorno é ignorado. _main_complete_apaga o array antes de chamar as funções, então elas precisam se reinserir.

Eu uso ozsh/terminfomódulopara exibir um indicador no canto inferior direito da string. A finalização apaga esse indicador, pelo menos na configuração que testei.

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)

informação relacionada