197 lines
5.0 KiB
Bash
197 lines
5.0 KiB
Bash
#!/bin/sh
|
|
|
|
# set '-eu' options for shell commands
|
|
# These options are used to have safer shell commands. Option '-e' is used to
|
|
# exit on error and option '-u' is used to give error for unset variables.
|
|
# Option '-f' disables pathname expansion which can be useful when $f, $fs, and
|
|
# $fx variables contain names with '*' or '?' characters. However, this option
|
|
# is used selectively within individual commands as it can be limiting at
|
|
# times.
|
|
set shellopts '-eu'
|
|
|
|
# set internal field separator (IFS) to "\n" for shell commands
|
|
# This is useful to automatically split file names in $fs and $fx properly
|
|
# since default file separator used in these variables (i.e. 'filesep' option)
|
|
# is newline. You need to consider the values of these options and create your
|
|
# commands accordingly.
|
|
set ifs "\n"
|
|
|
|
# leave some space at the top and the bottom of the screen
|
|
set scrolloff 10
|
|
|
|
# Basic Settings
|
|
set preview true
|
|
set shell dash
|
|
set previewer ~/.config/lf/preview
|
|
set cleaner ~/.config/lf/cleaner
|
|
set drawbox true
|
|
set info time
|
|
|
|
# Custom Functions
|
|
cmd open ${{
|
|
setsid -f xdg-open "$f" >/dev/null 2>&1 &
|
|
}}
|
|
|
|
cmd __cd :cd "$1"
|
|
|
|
# cd
|
|
cmd cd ${{
|
|
kill $pid
|
|
eval "inotifywait -me MODIFY $1 | \
|
|
while read LINE; do send $id :reload; done &"
|
|
pid=$!
|
|
send $id :__cd
|
|
}}
|
|
|
|
# Share on telegram
|
|
cmd send %wmctrl -x -a Telegram.TelegramDesktop && telegram-desktop -sendpath $(readlink -f "$f")
|
|
|
|
# Open lf config
|
|
cmd config $$EDITOR "~/.config/lf/lfrc"
|
|
|
|
# mkdir with :mkdir
|
|
cmd mkdir %mkdir -- "$@"
|
|
|
|
# rename file
|
|
cmd rename %mv "$f" $(echo "$@" | sed 's/ /\ /g')
|
|
|
|
# Open editor
|
|
cmd edit ${{
|
|
setsid -f "$TERMINAL -e $EDITOR $f" &
|
|
}}
|
|
|
|
# Change file mode bits
|
|
cmd chmod %chmod "$@" && echo "Mode bits changed" & lf -remote reload
|
|
|
|
# Copy filename without extension
|
|
cmd yank-basename $basename -a -- $fx | head -c-1 | xclip --clipboard
|
|
|
|
# Upload selected files to 0x0 and yank it's path and link
|
|
cmd share %printf "$fx\n $(curl -F file="@$fx" http://0x0.st)" | xsel -b && echo "File shared"
|
|
|
|
# Rotate file
|
|
cmd rotate-file %{{
|
|
case "$1" in
|
|
right) direction=1;;
|
|
left) direction=-1;;
|
|
*) direction=0;;
|
|
esac
|
|
case $(file --mime-type "$f" -bL) in
|
|
image/*) convert "$f" -rotate $((90*direction)) "$f";;
|
|
application/pdf) pdftk "$f" cat 1-end"$1" output "rotated-${f##*/}" \
|
|
&& rm "$f" \
|
|
&& mv "rotated-${f##*/}" "$f";;
|
|
video/*) ffmpeg -i "$f" -vf "transpose=$((direction+1))" "rotated-${f##*/}" \
|
|
&& rm "$f" \
|
|
&& mv "rotated-${f##*/}" "$f";;
|
|
inode/directory) for file in $(ls "$f"); do rotate "$1" "$file"; done;;
|
|
esac
|
|
echo "File rotated"
|
|
}}
|
|
|
|
# Rotate selected files
|
|
cmd rotate %{{
|
|
case "$1" in
|
|
right) direction=1;;
|
|
left) direction=-1;;
|
|
*) direction=0;;
|
|
esac
|
|
for file in "$fx"; do
|
|
case $(file --mime-type "${file}" -bL) in
|
|
image/*) convert "${file}" -rotate $((90*direction)) "${file}";;
|
|
application/pdf) pdftk "${file}" cat 1-end"$1" output "rotated-${file##*/}" \
|
|
&& rm "${file}" \
|
|
&& mv "rotated-${file##*/}" "$file";;
|
|
video/*) ffmpeg -i "${file}" -vf "transpose=$((direction+1))" "rotated-${file##*/}" \
|
|
&& rm "${file}" \
|
|
&& mv "rotated-${file##*/}" "${file}";;
|
|
esac
|
|
done
|
|
echo "File rotated!"
|
|
}}
|
|
|
|
cmd extract ${{
|
|
set -f
|
|
case $f in
|
|
*.tar.bz|*.tar.bz2|*.tbz|*.tbz2) tar xjvf $f;;
|
|
*.tar.gz|*.tgz) tar xzvf $f;;
|
|
*.tar.xz|*.txz) tar xJvf $f;;
|
|
*.zip) unzip $f;;
|
|
*.rar) unrar x $f;;
|
|
*.7z) 7z x $f;;
|
|
esac
|
|
}}
|
|
|
|
cmd compress ${{
|
|
set -f
|
|
mkdir $1
|
|
cp -r $fx $1
|
|
tar czf $1.tar.gz $1
|
|
rm -rf $1
|
|
}}
|
|
|
|
cmd newfold %{{
|
|
set -f
|
|
mkdir -- "$1"
|
|
mv -- $fx "$1"
|
|
}}
|
|
|
|
cmd term &{{
|
|
setsid -f $TERMINAL >/dev/null 2>&1 & disown
|
|
}}
|
|
|
|
cmd e :edit
|
|
cmd q :quit
|
|
|
|
# Bindings
|
|
# Remove some defaults
|
|
map n
|
|
map e
|
|
map r
|
|
map dd
|
|
|
|
# File openers
|
|
map ee $$EDITOR "$f"
|
|
map e! $doas $EDITOR "$f"
|
|
map b &setsid -f $BROWSER "$f"
|
|
|
|
# Basic functions
|
|
mao l cd "$f"
|
|
map c copy && echo "$fx" | xsel -b
|
|
map d delete
|
|
map x cut
|
|
map <enter> open
|
|
map <delete> delete
|
|
map rc push :rename<space>
|
|
map re $lf -remote "send $id :rename<space>$(printf '%q' ${f##*/})"
|
|
map <a-h> set hidden!
|
|
map <a-:> push $<space>
|
|
map <a-n> push :newfold<space>
|
|
map <a-r><a-r> :rotate right
|
|
map <a-r><a-l> :rotate left
|
|
map <a-t> :term
|
|
|
|
# Movement
|
|
map gk top
|
|
map gj bottom
|
|
map gD cd ~/desktop
|
|
map gc cd ~/.config
|
|
map gd cd ~/documents
|
|
map gl cd ~/.local/share/downloads
|
|
map gm cd ~/music
|
|
map gp cd ~/pictures
|
|
map gv cd ~/videos
|
|
|
|
# run on startup
|
|
cmd on-cd &{{
|
|
# '&' commands run silently in background (which is what we want here),
|
|
# but are not connected to stdout.
|
|
# To make sure our escape sequence still reaches stdout we pipe it to /dev/tty
|
|
printf "\033]0; $(pwd | sed "s|$HOME|~|;s|.*/||g") - lf\007" > /dev/tty
|
|
}}
|
|
|
|
# also run at startup
|
|
on-cd
|
|
|
|
%[ $LF_LEVEL -eq 1 ] || echo "Warning: You're in a nested lf instance of depth $LF_LEVEL!"
|