Отображение индикатора во время поиска zsh дополнений

Отображение индикатора во время поиска zsh дополнений

В некоторых ситуациях zsh долго генерирует список дополнений. Возможно, ему нужно перечислить некоторые файлы на удаленном сервере или запустить инструмент, который долго запускается. В таких ситуациях после нажатия кнопки « TabНачать дополнение» экран не меняется сразу, и не всегда понятно, продолжает ли zsh генерировать список дополнений, сгенерировал список, но для введенного мной текста нет дополнений, или же дополнение просто не поддерживается в текущем контексте.

Есть ли способ отобразить какой-то индикатор, пока zsh строит список завершения? В более общем смысле, есть ли способ заставить zsh запустить пользовательскую функцию до того, как он начнет строить список, а затем запустить другую функцию, когда он закончит?

решение1

Входной точкой завершения является функция_main_complete. Он вызывает хук compprefuncsпосле установки параметров оболочки и переменных, связанных с завершением, и перед анализом настроек отображения завершения и выполнением завершений. Он вызывает хук 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)

Связанный контент