# _______ __________ # __ __ \_________ /___(_)____________________ # _ / / /__ __ \ __/_ /_ __ \_ __ \_ ___/ # / /_/ /__ /_/ / /_ _ / / /_/ / / / /(__ ) # \____/ _ .___/\__/ /_/ \____//_/ /_//____/ # /_/ # Shell set shell sh set shellopts '-eu' set ifs "\n" # Interface set ratios '1:2' set dircounts set hidden set info 'size' set icons set preview set previewer '~/.local/bin/scope.sh 2>/dev/null' # General set globsearch set incsearch set ignorecase set tabstop 4 # set filesep ' ' # _________ _________ # __ ____/____________ __________ _________ _____________ /_______ # _ / _ __ \_ __ `__ \_ __ `__ \ __ `/_ __ \ __ /__ ___/ # / /___ / /_/ / / / / / / / / / / / /_/ /_ / / / /_/ / _(__ ) # \____/ \____//_/ /_/ /_//_/ /_/ /_/\__,_/ /_/ /_/\__,_/ /____/ # # define a custom 'open' command # This command is called when current file is not a directory. You may want to # use either file extensions and/or mime types here cmd open ${{ case $(file --mime-type $f -b) in text/* | */xml) $EDITOR $fx;; audio/*) ffplay -nodisp -autoexit $fx;; video/*) mpv $fx;; *) for f in $fx; do setsid $OPENER $f > /dev/null 2> /dev/null & done;; esac }} cmd open-with %{{ printf "Open with: " read ans for file in "$fx" do $ans $file >/dev/null 2>&1 & done lf -remote 'send reload' }} # extract the current file with the right command # (xkcd link: https://xkcd.com/1168/) 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 atool %atool -xD "$f" # compress current file or selected files with tar and gunzip cmd tar ${{ set -f mkdir $1 cp -r $fx $1 tar czf $1.tar.gz $1 rm -rf $1 }} # compress current file or selected files with zip cmd zip ${{ set -f mkdir $1 cp -r $fx $1 zip -r $1.zip $1 rm -rf $1 }} # fzf cmd fzf_jump ${{ res="$(find . -maxdepth 1 | fzf --no-multi --reverse --header='Jump to location')" if [ -f "$res" ]; then cmd="select" elif [ -d "$res" ]; then cmd="cd" fi lf -remote "send $id $cmd \"$res\"" }} # selection cmd select-files ${{ { echo "$fs"; find -L "$(pwd)" -mindepth 1 -maxdepth 1 -type f; } | if [ "$lf_hidden" = "false" ]; then # remove any hidden files so you only select files you can see. grep -v '/\.[^/]\+$' else cat fi | sed '/^$/d' | sort | uniq -u | xargs -d '\n' -r -I{} lf -remote "send $id toggle {}" }} cmd select-dirs ${{ { echo "$fs"; find -L "$(pwd)" -mindepth 1 -maxdepth 1 -type d; } | if [ "$lf_hidden" = "false" ]; then grep -v '/\.[^/]\+$' else cat fi | sed '/^$/d' | sort | uniq -u | xargs -d '\n' -r -I{} lf -remote "send $id toggle {}" }} # cp, mv with progression cmd paste &{{ load=$(lf -remote 'load') mode=$(echo "$load" | sed -n '1p') list=$(echo "$load" | sed '1d') if [ $mode = 'copy' ]; then rsync -av --ignore-existing --progress $list . \ | stdbuf -i0 -o0 -e0 tr '\r' '\n' \ | while read line; do lf -remote "send $id echo $line" done elif [ $mode = 'move' ]; then mv -n $list . fi lf -remote 'send load' lf -remote 'send clear' }} # basic stuff cmd mkdir %mkdir "$@" cmd touch %touch "$@" cmd chmod %{{ printf "Mode Bits: " read ans for file in "$fx" do chmod $ans $file done lf -remote 'send reload' }} # bulk rename cmd bulk-rename ${{ old=$(mktemp) new=$(mktemp) [ -n $fs ] && fs=$(ls) printf "$fs\n" > $old printf "$fs\n" > $new $EDITOR $new [ $(cat $new | wc -l) -ne $(cat $old | wc -l) ] && exit paste $old $new | while read names; do src=$(printf $names | cut -f1) dst=$(printf $names | cut -f2) [ $src = $dst ] && continue [ -e $dst ] && continue mv $src $dst done rm $old $new lf -remote "send $id unselect" }} # symlink cmd Link %{{ for file in $(lf -remote 'load'); do if [ ! -n "${mode+1}" ]; then mode="$file" continue fi files+=("$file") done if [ "${#files[@]}" -lt 1 ]; then lf -remote "send $id echo no files to link files: ${files}" exit 0 fi # symbolically copy mode is indicating a soft link if [[ "$mode" == copy ]]; then ln -sr $files -t . # while a move mode is indicating a hard link elif [[ "$mode" == move ]]; then ln $files -t . fi }} # fzf + zlua/zoxide cmd fzz ${{ if command -v zoxide >/dev/null; then sel=$(zoxide query --list | fzf --no-multi) else sel=$(awk -F "|" '{print $1}' "$HOME/.local/share/zlua/zlua" | fzf --no-multi | awk '{$1=$1};1') fi lf -remote "send $id cd \"$sel\"" }} # ______ ___ _____ # ___ |/ /_____ ___________________(_)_____________ ________ # __ /|_/ /_ __ `/__ __ \__ __ \_ /__ __ \_ __ `/_ ___/ # _ / / / / /_/ /__ /_/ /_ /_/ / / _ / / / /_/ /_(__ ) # /_/ /_/ \__,_/ _ .___/_ .___//_/ /_/ /_/_\__, / /____/ # /_/ /_/ /____/ # unmap map d # general map . set hidden! map ; read map open map d delete map x cut map R reload map b $vi $fx # put lf to background map $ kill -STOP $PPID # dedicated key for file opener map o open-with # fzf map $vi $(fzf) map zlua map f :fzf_jump # archives map ax extract map aa atool map az push :zip map at push :tar # selection map select-dirs map select-files # symlink # y (select for copy) and P to paste soft-link # d (select for cut) and P to paste hard-link map P :Link # bookmarks map gh cd ~ map gC cd ~/Code map gD cd ~/Downloads map gA cd ~/Media map gU cd ~/Music map gP cd ~/Pictures map gV cd ~/Videos map gf cd ~/.config map gl cd ~/.local/share map ge cd /etc map gb cd /boot map gu cd /usr/share map gd cd /dev map go cd /opt map gv cd /var map gm cd /media map gi cd /run/media map gM cd /mnt map gt cd /tmp map gr cd / map gs cd /srv # map gk cd /bedrock/strata