vimv icon indicating copy to clipboard operation
vimv copied to clipboard

Guard against accidentally moving the lines around

Open tbodt opened this issue 8 years ago • 1 comments

This could be done by adding a number to each line and sorting by that number after the editor finishes.

tbodt avatar Aug 15 '17 01:08 tbodt

This is the implementation I currently have.

There is probably is still some bugs/corner cases however once out of sync none of the files should be modified.

#!/bin/bash

# Lists the current directory's files in Vim,
# so you can edit it and save to rename them

# USAGE: vimv [file1 file2]

# Modification of: https://github.com/thameera/vimv
# Rewritten by Nathaniel Maia, December 2018
#
# Added: numerical sorting, less IO/redirection, error checking.

# temp out file
tmpof=/tmp/vimv.$$

if [[ $# -ne 0 ]]; then
    if=("$@")
else
    IFS=$'\r\n' GLOBIGNORE='*' command eval 'if=( $(ls -A) )'
fi

ifstr=""
for (( i=0; i<${#if[@]}; ++i )); do
    ifstr+="$i\t${if[$i]}\n"
done

if (( i > 0 )); then
    printf "$ifstr" > $tmpof && ${EDITOR:-vi} $tmpof
else
    printf "no input paths\n"; exit 1
fi

i=0 t=0 l=-1
IFS=$'\r\n'
GLOBIGNORE='*'

while read -r line; do
    of="${line#*	}"

    # Ensure: out file name > 0 chars and line num is sequence of 0,1,2,3...
    if (( ${#of} > 0 && i == ${line%	*} && i - 1 == l )); then
        (( l++ ))
        if [[ "${if[i]}" != "$of" ]]; then
            if git ls-files --error-unmatch "${if[i]}" >/dev/null 2>&1; then
                command git mv "${if[i]}" "$of" && (( t++ ))
            else
                command mv "${if[i]}" "$of" && (( t++ ))
            fi
        fi
    fi
    (( i++ ))
done <<< "$(sort -n $tmpof)"

printf "%d paths renamed\n" $t
command rm $tmpof

natemaia avatar Dec 31 '18 08:12 natemaia