mirror of
https://github.com/LukeSmithxyz/voidrice.git
synced 2026-01-30 09:48:11 +01:00
You can see the example video below (15 seconds). ## Improvements - Directories are excluded. You can't mistakenly rename directories now or you don't have to exclude them manually. - The extensions are excluded. Therefore, creating macros or editing in general is easier in the editor and there is no chance of messing up extensions. The extensions will be there as they are after editing. ## Justifications - The original code fetched filenames without any specific order. In the new version, filenames are fetched in version sort order (sort -fV) to ensure a natural order, making it more intuitive for users. This is particularly useful when dealing with sequences of files (like episodes of a TV show or a series of images). - Previously, the code used ls to get the file names. This approach can be problematic. The updated version uses find, a more robust and dependable method to retrieve files, and cut to trim the unnecessary ./ from the beginning. This change also helps us exclude directories from the list. - It now separately stores the base filenames and their extensions. This prevents accidental renaming of file extensions, ensuring that only the desired part of the filename is modified. It adds an extra layer of precision, ensuring that a user doesn't mistakenly rename a file extension. - It utilizes multiple file descriptors (3, 4, and 5) to read from the temporary files concurrently. This allows for a more structured loop when renaming files, making the code clearer and more maintainable. This removes the need for line by line operations and makes the process much more minimal and faster. - The script can still work with Dash as a /bin/sh link. ## Performance Optimizations: - The script still has minimal dependencies. - Instead of reading and writing the entire content of files multiple times, the script uses the mktemp command to create temporary files and then employs file descriptors to read them concurrently. This minimizes file IO operations that can be a significant bottleneck. - The script processes most data in-memory. Reading from and writing to memory is much faster than disk operations as you already know. - The while loop uses file descriptors to read three files concurrently. This parallelization minimizes the number of loop iterations, making the loop more efficient than sequential alternatives.
162 lines
5.4 KiB
Plaintext
162 lines
5.4 KiB
Plaintext
# Luke's lf settings
|
|
|
|
|
|
# Note on Image Previews
|
|
# For those wanting image previews, like this system, there are four steps to
|
|
# set it up. These are done automatically for LARBS users, but I will state
|
|
# them here for others doing it manually.
|
|
#
|
|
# 1. ueberzug must be installed.
|
|
# 2. The scope file (~/.config/lf/scope for me), must have a command similar to
|
|
# mine to generate ueberzug images.
|
|
# 3. A `set cleaner` line as below is a cleaner script.
|
|
# 4. lf should be started through a wrapper script (~/.local/bin/lfub for me)
|
|
# that creates the environment for ueberzug. This command can be be aliased
|
|
# in your shellrc (`alias lf="lfub") or if set to a binding, should be
|
|
# called directly instead of normal lf.
|
|
|
|
# Basic vars
|
|
set shellopts '-eu'
|
|
set ifs "\n"
|
|
set scrolloff 10
|
|
set icons
|
|
set period 1
|
|
set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml"
|
|
set cleaner '~/.config/lf/cleaner'
|
|
set previewer '~/.config/lf/scope'
|
|
set autoquit true
|
|
|
|
# cmds/functions
|
|
cmd open ${{
|
|
case $(file --mime-type "$(readlink -f $f)" -b) in
|
|
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet) localc $fx ;;
|
|
image/vnd.djvu|application/pdf|application/octet-stream|application/postscript) setsid -f zathura $fx >/dev/null 2>&1 ;;
|
|
text/*|application/json|inode/x-empty|application/x-subrip) $EDITOR $fx;;
|
|
image/x-xcf) setsid -f gimp $f >/dev/null 2>&1 ;;
|
|
image/svg+xml) display -- $f ;;
|
|
image/*) rotdir $f | grep -i "\.\(png\|jpg\|jpeg\|gif\|webp\|avif\|tif\|ico\)\(_large\)*$" |
|
|
setsid -f nsxiv -aio 2>/dev/null | while read -r file; do
|
|
[ -z "$file" ] && continue
|
|
lf -remote "send select \"$file\""
|
|
lf -remote "send toggle"
|
|
done &
|
|
;;
|
|
audio/*|video/x-ms-asf) mpv --audio-display=no $f ;;
|
|
video/*) setsid -f mpv $f -quiet >/dev/null 2>&1 ;;
|
|
application/pdf|application/vnd.djvu|application/epub*) setsid -f zathura $fx >/dev/null 2>&1 ;;
|
|
application/pgp-encrypted) $EDITOR $fx ;;
|
|
application/vnd.openxmlformats-officedocument.wordprocessingml.document|application/vnd.oasis.opendocument.text|application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/octet-stream|application/vnd.oasis.opendocument.spreadsheet|application/vnd.oasis.opendocument.spreadsheet-template|application/vnd.openxmlformats-officedocument.presentationml.presentation|application/vnd.oasis.opendocument.presentation-template|application/vnd.oasis.opendocument.presentation|application/vnd.ms-powerpoint|application/vnd.oasis.opendocument.graphics|application/vnd.oasis.opendocument.graphics-template|application/vnd.oasis.opendocument.formula|application/vnd.oasis.opendocument.database) setsid -f libreoffice $fx >/dev/null 2>&1 ;;
|
|
*) for f in $fx; do setsid -f $OPENER $f >/dev/null 2>&1; done;;
|
|
esac
|
|
}}
|
|
|
|
cmd mkdir $mkdir -p "$(echo $* | tr ' ' '\ ')"
|
|
|
|
cmd extract ${{
|
|
clear; tput cup $(($(tput lines)/3)); tput bold
|
|
set -f
|
|
printf "%s\n\t" "$fx"
|
|
printf "extract?[y/N]"
|
|
read ans
|
|
[ $ans = "y" ] && aunpack $fx
|
|
}}
|
|
|
|
cmd delete ${{
|
|
clear; tput cup $(($(tput lines)/3)); tput bold
|
|
set -f
|
|
printf "%s\n\t" "$fx"
|
|
printf "delete?[y/N]"
|
|
read ans
|
|
[ $ans = "y" ] && rm -rf -- $fx
|
|
}}
|
|
|
|
cmd moveto ${{
|
|
clear; tput cup $(($(tput lines)/3)); tput bold
|
|
set -f
|
|
clear; echo "Move to where?"
|
|
dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" &&
|
|
for x in $fx; do
|
|
eval mv -iv \"$x\" \"$dest\"
|
|
done &&
|
|
notify-send "🚚 File(s) moved." "File(s) moved to $dest."
|
|
}}
|
|
|
|
cmd copyto ${{
|
|
clear; tput cup $(($(tput lines)/3)); tput bold
|
|
set -f
|
|
clear; echo "Copy to where?"
|
|
dest="$(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf | sed 's|~|$HOME|')" &&
|
|
for x in $fx; do
|
|
eval cp -ivr \"$x\" \"$dest\"
|
|
done &&
|
|
notify-send "📋 File(s) copied." "File(s) copies to $dest."
|
|
}}
|
|
|
|
cmd setbg "$1"
|
|
|
|
cmd bulkrename ${{
|
|
tmpfile_old="$(mktemp)"
|
|
tmpfile_new="$(mktemp)"
|
|
tmpfile_ext="$(mktemp)"
|
|
|
|
[ -n "$fs" ] && fs=$(basename -a $fs | sort -fV) || fs=$(find . -maxdepth 1 -type f | cut -c 3- | sort -fV)
|
|
|
|
for f in $fs; do
|
|
echo "${f%.*}" >> "$tmpfile_old"
|
|
echo "${f##*.}" >> "$tmpfile_ext"
|
|
done
|
|
|
|
cp "$tmpfile_old" "$tmpfile_new"
|
|
$EDITOR "$tmpfile_new"
|
|
|
|
[ "$(wc -l < "$tmpfile_old")" -eq "$(wc -l < "$tmpfile_new")" ] || { rm -f "$tmpfile_old" "$tmpfile_new" "$tmpfile_ext"; exit 1; }
|
|
|
|
exec 3<"$tmpfile_old"
|
|
exec 4<"$tmpfile_ext"
|
|
exec 5<"$tmpfile_new"
|
|
|
|
while IFS= read -r old_name <&3 && IFS= read -r ext <&4 && IFS= read -r new_name <&5; do
|
|
[ "$old_name" = "$new_name" ] || [ -e "$new_name.$ext" ] || mv -- "$old_name.$ext" "$new_name.$ext"
|
|
done
|
|
|
|
rm -f "$tmpfile_old" "$tmpfile_new" "$tmpfile_ext"
|
|
lf -remote "send $id unselect"
|
|
}}
|
|
|
|
# Bindings
|
|
map <c-f> $lf -remote "send $id select \"$(fzf)\""
|
|
map J $lf -remote "send $id cd $(sed -e 's/\s*#.*//' -e '/^$/d' -e 's/^\S*\s*//' ${XDG_CONFIG_HOME:-$HOME/.config}/shell/bm-dirs | fzf)"
|
|
map gh
|
|
map g top
|
|
map D delete
|
|
map E extract
|
|
map C copyto
|
|
map M moveto
|
|
map <c-n> push :mkdir<space>
|
|
map <c-r> reload
|
|
map <c-s> set hidden!
|
|
map <enter> shell
|
|
map x $$f
|
|
map X !$f
|
|
map o &mimeopen "$f"
|
|
map O $mimeopen --ask "$f"
|
|
|
|
map A :rename; cmd-end # at the very end
|
|
map c push A<c-u> # new rename
|
|
map I :rename; cmd-home # at the very beginning
|
|
map i :rename # before extension
|
|
map a :rename; cmd-right # after extension
|
|
map B bulkrename
|
|
map b $setbg $f
|
|
|
|
map <c-e> down
|
|
map <c-y> up
|
|
map V push :!nvim<space>
|
|
|
|
map W $setsid -f $TERMINAL >/dev/null 2>&1
|
|
|
|
map Y $printf "%s" "$fx" | xclip -selection clipboard
|
|
|
|
# Source Bookmarks
|
|
source "~/.config/lf/shortcutrc"
|