В некоторых ситуациях 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)