Отображение индикатора, когда zsh ищет завершения

У меня есть несколько предложений, поэтому я решил написать ответ.

  1. Существует несоответствие относительно primary_mappings.txtи secondary_mappings.txt, которые называются primary-mappings.txtи secondary-mappings.txtв сценарии. Вы, конечно, должны переименуйте файлы (или измените их имя скриптом ).

  2. Я бы создал две функции для регистрации в STDERR и выхода из программы. Это имеет то преимущество, что лучше читается, менее подвержено ошибкам и позволяет вам выходить из вызовов функций (он отвечает У меня нет механизма для выхода из сценария оболочки):

    trap "exit 1" TERM
    export TOP_PID=$$
    log_error () {
       echo "$1">&2;
    }
    log_error_and_exit () {
       echo "$1">&2;
       kill -s TERM $TOP_PID
    }
    
  3. Кажется, вы хотите протоколировать ошибки в STDERR, но иногда пишете в STDOUT. Предполагая, что вы просто забыли пару >&2, их легко стандартизировать, используя наши недавно созданные функции:

    а.

    [ -z "$clientid" ] && { echo "cannot find clientid for $(hostname -f)"; exit 1; }
    

    становится:

    [ -z "$clientid" ] && { log_error_and_exit "Cannot find ClientID for $(hostname -f)"; }
    

    б.

    *) echo "unknown host: $(hostname -f), exiting." && exit 1 ;;
    

    становится:

    *) log_error_and_exit "Unknown host: $(hostname -f), exiting." ;;
    
  4. Вы, кажется, забыли это сделать:

    If for whatever reason, I cannot find either primary or secondary files for that clientid from that file, then I will exit from shell script and log an error message.

    mappingsByClientID () {
      id=$1 # 1 to 5
      file=$path/${mapfiles[$2]} # 0 to 1
      if [[ $(< $file) != *" $1="* ]]; then
          log_error_and_exit "ClientID $1 out of range for $file";
      fi
      arr=($(sed -r "s/.*\b${id}=\[([^]\]+).*/\1/; s/,/ /g" $file))
      echo "${arr[@]}"
    }
    
  5. Сейчас вы этого не делаете:

    if for whatever reason, I cannot find those files then I want to exit from the shell script with message that tells me what files are missing.

    Так как вы exitкак только обнаружите, что пропавший файл, вы никогда не получите сообщения более чем об одном файле! Решение состоит в том, чтобы создать переменную для отслеживания состояния ошибки,и проверьте его в конце проверки:

    # this is for verification to see all files got copied or not
    # in primary and secondary folder
    set -- "$primary" "$secondary"
    typeset -n array
    errors=false
    for array in pri snd; do
        for num in "${array[@]}"; do
            name="hello_monthly_${num}_999_1.data"
            if [ ! -f "$1/$name" ]; then
                {  log_error "$name not found in $1" && errors=true; }
            fi
        done
        shift
    done
    if [ "$errors" = true ]; then
        exit 1
    fi
    
2
07.04.2020, 21:12
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)
3
28.04.2021, 23:18

Теги

Похожие вопросы