diff --git a/build/build.plugin.zsh b/build/build.plugin.zsh index 3873009..22ead36 100644 --- a/build/build.plugin.zsh +++ b/build/build.plugin.zsh @@ -85,97 +85,110 @@ EOF if [[ ${#local_build_dirs} -eq 0 ]]; then error "no build directories found"; return 1 elif [[ ${#local_build_dirs} -gt 1 ]]; then - zmodload zsh/curses && { - # Get the size of the terminal - local size=`stty size` - integer height=${size% *} - integer width=${size#* } + if command -v fzf &> /dev/null; then + # Use fzf to select a build directory + local_build_dir=$( + printf '%s\n' "${local_build_dir[@]}" $local_build_dirs | + fzf --layout=reverse --info=hidden --border=rounded \ + --height=$(( ${#local_build_dirs} + 5 )) + ) + if [[ $? -ne 0 ]]; then + return 1 + fi + else + # Fallback to zcurses selector when fzf is not available + zmodload zsh/curses && { + # Get the size of the terminal + local size=`stty size` + integer height=${size% *} + integer width=${size#* } - # Create the window and hide the cursor - zcurses init - zcurses addwin build-dir $height $width 0 0 + # Create the window and hide the cursor + zcurses init + zcurses addwin build-dir $height $width 0 0 - # Hide the cursor for zcurses, trap SIGINT to ensure cleanup in - # always-list occurs below - tput civis; trap 'return 130' INT + # Hide the cursor for zcurses, trap SIGINT to ensure cleanup in + # always-list occurs below + tput civis; trap 'return 130' INT - # Enter display loop - local key keypad - while (( 1 )); do - zcurses clear build-dir + # Enter display loop + local key keypad + while (( 1 )); do + zcurses clear build-dir - # Add the prompt text - zcurses move build-dir 1 1 - zcurses string build-dir 'Select a build directory:' + # Add the prompt text + zcurses move build-dir 1 1 + zcurses string build-dir 'Select a build directory:' - # Add the selections text - for (( i = 0; i < ${#local_build_dirs}; i++ )); do - integer line=$i+3 - zcurses move build-dir $line 1 - [[ $index -eq $i ]] && - zcurses string build-dir "* " || - zcurses string build-dir " " - zcurses string build-dir ${local_build_dirs[$i+1]} + # Add the selections text + for (( i = 0; i < ${#local_build_dirs}; i++ )); do + integer line=$i+3 + zcurses move build-dir $line 1 + [[ $index -eq $i ]] && + zcurses string build-dir "* " || + zcurses string build-dir " " + zcurses string build-dir ${local_build_dirs[$i+1]} + done + + # Display the text the and wait for input + zcurses refresh build-dir + zcurses input build-dir key keypad + + # Handle user input + case $key in + (UP|k|$'\C-P') + [[ $index -gt 0 ]] && index=$index-1 ;; + (DOWN|j|$'\C-N') + [[ $index -lt ${#local_build_dirs}-1 ]] && index=$index+1 ;; + (ENTER|$'\n') + break ;; + esac done + } always { + # Restore the cursor and cleanup zcurses + tput cvvis; tput cnorm + zcurses delwin build-dir + zcurses end + } - # Display the text the and wait for input - zcurses refresh build-dir - zcurses input build-dir key keypad - - # Handle user input - case $key in - (UP|k|$'\C-P') - [[ $index -gt 0 ]] && index=$index-1 ;; - (DOWN|j|$'\C-N') - [[ $index -lt ${#local_build_dirs}-1 ]] && index=$index+1 ;; - (ENTER|$'\n') - break ;; - esac - done - } always { - # Restore the cursor and cleanup zcurses - tput cvvis; tput cnorm - zcurses delwin build-dir - zcurses end - } + # On success setup the build directory for use + if [[ $? -eq 0 ]]; then + # Set the build directory from selection if empty + [[ -z $local_build_dir ]] && \ + local_build_dir=${local_build_dirs[$index+1]} + fi + fi fi fi - # On success setup the build directory for use - if [[ $? -eq 0 ]]; then - # Set the build directory from selection if empty - [[ -z $local_build_dir ]] && \ - local_build_dir=${local_build_dirs[$index+1]} + # If `build.ninja` exists in alias `ninja`, return. + local build + [ -f $local_build_dir/build.ninja ] && \ + build="ninja -C $local_build_dir" - # If `build.ninja` exists in alias `ninja`, return. - local build - [ -f $local_build_dir/build.ninja ] && \ - build="ninja -C $local_build_dir" + # If `Makefile` exists in alias `make`, return. + if [ -f $local_build_dir/Makefile ]; then + [ `uname` = Darwin ] && \ + local cpu_count=`sysctl -n hw.ncpu` || + local cpu_count=`grep -c '^processor' /proc/cpuinfo` + build="make -j $cpu_count -C $local_build_dir" + fi - # If `Makefile` exists in alias `make`, return. - if [ -f $local_build_dir/Makefile ]; then - [ `uname` = Darwin ] && \ - local cpu_count=`sysctl -n hw.ncpu` || - local cpu_count=`grep -c '^processor' /proc/cpuinfo` - build="make -j $cpu_count -C $local_build_dir" - fi + # If the build variable is not defined the command could not be determined + if [ -z $build ]; then + warning "build command detection failed: $local_build_dir" + # Prompt user to enter a build command + vared -p 'enter comand: ' build + fi - # If the build variable is not defined the command could not be determined - if [ -z $build ]; then - warning "build command detection failed: $local_build_dir" - # Prompt user to enter a build command - vared -p 'enter comand: ' build - fi + # Redefine the `build` alias and update the `~build` hash directory + alias build="$build" + hash -d build=$local_build_dir + export build_dir=$local_build_dir - # Redefine the `build` alias and update the `~build` hash directory - alias build="$build" - hash -d build=$local_build_dir - export build_dir=$local_build_dir - - # If `--build` is specified then evaluate the command. - if [[ -n $do_build ]]; then - eval build - fi + # If `--build` is specified then evaluate the command. + if [[ -n $do_build ]]; then + eval build fi }