dotfiles/home/bin/vimv

45 lines
1.1 KiB
Plaintext
Raw Permalink Normal View History

2023-04-07 15:46:30 +00:00
#!/usr/bin/env bash
set -eu
2021-02-11 16:25:39 +00:00
# Lists the current directory's files in Vim, so you can edit it and save to rename them
# USAGE: vimv [file1 file2]
# https://github.com/thameera/vimv
2023-04-07 15:46:30 +00:00
declare -r FILENAMES_FILE=$(mktemp "${TMPDIR:-/tmp}/vimv.XXX")
2021-02-11 16:25:39 +00:00
trap '{ rm -f "${FILENAMES_FILE}" ; }' EXIT
if [ $# -ne 0 ]; then
src=( "$@" )
else
2023-04-07 15:46:30 +00:00
IFS=$'\r\n' GLOBIGNORE='*' command eval 'src=($(ls))'
2021-02-11 16:25:39 +00:00
fi
for ((i=0;i<${#src[@]};++i)); do
echo "${src[i]}" >> "${FILENAMES_FILE}"
done
${EDITOR:-vi} "${FILENAMES_FILE}"
2023-04-07 15:46:30 +00:00
IFS=$'\r\n' GLOBIGNORE='*' command eval 'dest=($(cat "${FILENAMES_FILE}"))'
2021-02-11 16:25:39 +00:00
2023-04-07 15:46:30 +00:00
if (( ${#src[@]} != ${#dest[@]} )); then
echo "WARN: Number of files changed. Did you delete a line by accident? Aborting.." >&2
exit 1
fi
declare -i count=0
2021-02-11 16:25:39 +00:00
for ((i=0;i<${#src[@]};++i)); do
if [ "${src[i]}" != "${dest[i]}" ]; then
2023-04-07 15:46:30 +00:00
mkdir -p "$(dirname "${dest[i]}")"
2021-02-11 16:25:39 +00:00
if git ls-files --error-unmatch "${src[i]}" > /dev/null 2>&1; then
git mv "${src[i]}" "${dest[i]}"
else
mv "${src[i]}" "${dest[i]}"
fi
2023-04-07 15:46:30 +00:00
((++count))
2021-02-11 16:25:39 +00:00
fi
done
echo "$count" files renamed.