# Basic Settings set shell zsh set shellopts '-eu:--shwordsplit' set ifs "\n" set scrolloff 5 set previewer ~/.config/lf/lf-preview set wrapscroll set sortby time set info size:time set reverse set incsearch set color256 set icons %{{ w=$(tput cols) if [ $w -le 80 ]; then lf -remote "send $id set ratios 1:1" elif [ $w -le 160 ]; then lf -remote "send $id set ratios 1:2:2" else lf -remote "send $id set ratios 1:3:2" fi }} # Custom Functions cmd open ${{ case $(file --mime-type $f -bL) in text/troff) man ./ $f;; text/*) $EDITOR $fx;; image/x-xcf|image/svg+xml) setsid gimp $f >/dev/null 2>&1 & ;; image/gif) setsid sxiv-gif $f 2>/dev/null & ;; image/*) setsid sxiv-rifle $f 2>/dev/null & ;; audio/*) mpv --input-ipc-server=/tmp/mpvsoc$(date +%%s) $f ;; video/*) setsid mpv --input-ipc-server=/tmp/mpvsoc$(date +%%s) $f -quiet >/dev/null 2>&1 & ;; application/pdf|application/cbz|application/cbr) setsid zathura $fx >/dev/null 2>&1 & ;; *) for f in $fx; do setsid $OPENER $f > /dev/null 2> /dev/null & done;; esac }} cmd bulkrename ${{ 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" }} # insert cmd rename-insert &{{ if [ "$(echo "$fx" | wc -l)" -gt 1 ]; then lf -remote "send $id echo You can't change more than one file name" lf -remote "send $id unselect" else len="$(basename "$f" | wc -m)" # length of selected file/directory for i in $(seq "$len"); do pos="${pos}" # how many times do I have to press in order to get first char done lf -remote "send $id rename" lf -remote "send $id push $pos" fi }} # append before ext cmd rename-before-ext &{{ if [ "$(echo "$fx" | wc -l)" -gt 1 ]; then lf -remote "send $id echo You can't change more than one file name" lf -remote "send $id unselect" else if [ -d "$f" ]; then lf -remote "send $id rename" else ext_len="$(echo ${f##*.} | wc -m)" # extention length for i in $(seq "$ext_len"); do pos="${pos}" done lf -remote "send $id rename" lf -remote "send $id push "$pos"" fi fi }} # change its name entirely cmd rename-new &{{ if [ "$(echo "$fx" | wc -l)" -gt 1 ]; then lf -remote "send $id echo You can't change more than one file name" lf -remote "send $id unselect" else lf -remote "send $id rename" lf -remote "send $id push " fi }} cmd moveto ${{ set -f clear; echo "Move to where?" dest="$(cut -d' ' -f2- ~/.config/directories | fzf)" && eval mv -iv $fx $dest && notify-send "File(s) moved to $dest." }} cmd copyto ${{ set -f clear; echo "Copy to where?" dest="$(cut -d' ' -f2- ~/.config/directories | fzf)" && eval cp -ivr $fx $dest && notify-send "File(s) copies to $dest." }} cmd paste ${{ send="while read -r line; do lf -remote \"send $id echo \$line\"; done && lf -remote 'send reload'" load=$(lf -remote 'load') mode=$(echo "$load" | sed -n '1p') list=$(echo "$load" | sed '1d') s='' && [ ! -w . ] && s='sudo' case "$mode" in copy) cmd='cp-p';; move) cmd='mv-p';; esac cmd="$cmd --new-line" for f in $list; do $s sh -c "$cmd --backup=numbered \"$f\" . | $send &" done lf -remote 'send load' lf -remote 'send clear' }} cmd paste-rsync &{{ 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' }} cmd fzf_jump ${{ res="$(find . -maxdepth 3 | fzf-tmux --reverse --header='Jump to location')" if [ -f "$res" ]; then cmd="select" elif [ -d "$res" ]; then cmd="cd" fi lf -remote "send $id $cmd \"$res\"" }} cmd broot_jump ${{ f=$(mktemp) res="$(broot --outcmd $f && cat $f | sed 's/cd //')" rm -f "$f" if [ -f "$res" ]; then cmd="select" elif [ -d "$res" ]; then cmd="cd" fi lf -remote "send $id $cmd \"$res\"" }} cmd Link %{{ lf -remote 'load' | while read file; do if [ ! -n "${mode+1}" ]; then mode="$file" continue fi files+=("$file") done if [ "${#files[@]}" -le 1 ]; then lf -remote "send $id echo no files to link" exit 0 fi # symbolicly 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 }} cmd nopreview &{{ lf -remote "send $id set nopreview" lf -remote "send $id set ratios 1:3" # or whatever }} # Bindings # Remove some defaults map m map n map "'" map '"' map d map p map w map y map c map u map e map / cmap cmd-escape map | top map ¿ bottom map push A map cut map copy map reload map push $touch map push $mkdir map delete map paste map open map delete map yy copy map yn $basename -z $f | xsel -i -b map yp $readlink -fn $f | xsel -i -b map Y %cp -ri $fs . map dd cut map D %mv -i $fs . map pp paste map pr paste-rsync map . set hidden! map uu unselect map uy clear map S shell map cc push A # new rename map I push A # at the very beginning map A rename # at the very end map i push A. # before extension map a push A # after extension map B bulkrename map P :Link map f broot_jump map $lf -remote "send $id select '$(fzf)'" map / $lf -remote "send $id select \"$(FZF_DEFAULT_COMMAND='fd --max-depth=1' fzf-tmux)\"" map F $find | lf -remote "send $id select $(fzf-tmux --height 50% --reverse --border --margin 5% --inline-info --color border:#005688,bg+:#16252E,fg+:#26c6da,hl+:#ffffff,hl:#26c6da)" map cx %chmod +x $f map bg $setbg $f map o open $f map u %du -sh $f # Movement map gu cd ~/Documents/ map gE cd /etc map gU cd /usr map gd cd ~/Downloads map g. cd ~/.config map gs cd ~/.local/share map gr cd /run/media/deadguy map gm cd /mnt/remote map gc cd /mnt/cel map gb cd ~/.local/bin map gR cd / map gv cd ~/Videos/Learning map gp cd ~/Pictures map cg $$EDITOR ~/.config/lf/lfrc