diff --git a/fff b/fff index 7c249ac..8e5cad4 100755 --- a/fff +++ b/fff @@ -162,6 +162,29 @@ status_line() { "$LINES" } +get_file_sizes() { + # Get sizes of files. + [[ -z ${files[*]} ]] && + return + + IFS=$'\n' read -d "" -ra file_sizes < <(du -ks "${files[@]}") + file_sizes=("${file_sizes[@]//[[:space:]]*}") + + # Find the longest file size. + for size in "${file_sizes[@]}"; do + ((${#size} > max_size)) && + ((max_size=${#size})) + done + + # Convert byte formatted sizes to human-readable. + for i in "${!file_sizes[@]}"; do + case "${file_sizes[i]}" in + ???|??|?) file_sizes[i]+="KB" ;; + *) file_sizes[i]="$((file_sizes[i]/1024))MB" ;; + esac + done +} + read_dir() { # Read a directory to an array and sort it directories first. local dirs=() @@ -187,11 +210,16 @@ read_dir() { list=("${dirs[@]}" "${files[@]}") + # Retrieve file sizes if enabled. + ((${FFF_SHOW_SIZE:=1} == 1)) && + get_file_sizes + # Indicate that the directory is empty. [[ -z ${list[0]} ]] && list[0]="empty" ((list_total=${#list[@]}-1)) + ((dir_total=${#dirs[@]})) # Save the original dir in a second list as a backup. cur_list=("${list[@]}") @@ -277,7 +305,14 @@ print_line() { # Remove all non-printable characters. file_name="${file_name//[^[:print:]]/^[}" - printf '\r%b%s\e[m\r' "$format" "${file_name}${suffix}" + ((${FFF_SHOW_SIZE:=1} == 1)) && [[ -f ${list[$1]} ]] && { + local file_size="${file_sizes[$1-dir_total]}" + file_name="${file_name:0:$((COLUMNS-max_size-1))}" + } + + printf '\r%b%s\e[m\e[%sC\e[%sD%s\r' \ + "$format" "${file_name}${suffix}" \ + "$COLUMNS" "${#file_size}" "$file_size" } draw_dir() {