# klevstul

# --------------------
# set
# --------------------

# 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

# Use the `dim` attribute instead of underline for the cursor in the preview pane
set cursorpreviewfmt "\033[7;2m"

# ctpv
# https://github.com/NikitaIvanovV/ctpv
set preview true
set previewer ctpv
set cleaner ctpvclear
&ctpv -s $id
&ctpvquit $id

# --------------------
# map
# --------------------

map <delete> trash-confirm                          # use '<delete>' key for 'trash'
map <c-delete> trash                                # control + delete - for no confirm - you have control
map <esc> :unselect; clear                          # clear all selected
map ` !true                                         # show the result of execution of previous commands
map a :push %mkdir<space>                           # mkdir command. See wiki if you want it to select created dir | :push is used to keybind these commands to avoid typing (e.g. map a :push %mkdir<space>) | https://github.com/gokcehan/lf/wiki/FAQ
map b multi-dragon
map e edit                                          # see edit command below
#map o &xdg-open $f                                  # dedicated keys for file opener actions
map o open
map w :push %touch<space>                           # write (create) new file

#map <enter> shell                                   # use enter for shell commands
#map <a-r> recol
#map x $$f                                           # execute current file (must be executable)
#map X !$f

# --------------------
# cmd
# --------------------

# 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. Below example uses an
# editor for text files and a file opener for the rest:
#
# cmd open &{{
#    case $(file --mime-type -Lb $f) in
#        text/*) lf -remote "send $id \$$EDITOR \$fx";;
#        *) for f in $fx; do $OPENER $f > /dev/null 2> /dev/null & done;;
#    esac
# }}

cmd open ${{

    case "$f" in
        *.[Cc][Ss][Vv]*) onlyoffice-desktopeditors $fx &;;
        *.[Dd][Oo][Cc][Xx]*) onlyoffice-desktopeditors $fx &;;
        *.[Gg][Ii][Ff]*) feh $fx &;;
        *.[Jj][Pp][Gg]*) feh $fx &;;
        *.[Jj][Pp][Ee][Gg]*) feh $fx &;;
        *.[Mm][Pp][4]*) mpv $fx &;;
        *.[Pp][Dd][Ff]*) mupdf $fx &;;
        *.[Pp][Nn][Gg]*) feh $fx &;;
        *.[Rr][Pp][Pp]*) reaper $fx &;;
        *.[Xx][Ll][Ss][Xx]*) onlyoffice-desktopeditors $fx &;;
        *) case $(file --mime-type -Lb $f) in
               text/*) nano $fx;;
               *) for f in $fx; do xdg-open $f > /dev/null 2> /dev/null & done;;
           esac
    esac

}}

# reconfigure columns, based on with | https://github.com/gokcehan/lf/blob/master/doc.md
cmd recol %{{
    if [ $lf_width -le 80 ]; then
        lf -remote "send $id set ratios 1:2"
    elif [ $lf_width -le 160 ]; then
        lf -remote "send $id set ratios 1:2:3"
    else
        lf -remote "send $id set ratios 1:2:3:5"
    fi
}}

#cmd open ${{
#    test -L $f && f=$(readlink -f $f)
#        case $(file --mime-type $f -b) in
#            text/*) geany $fx;;
#            *) for f in $fx; do xdg-open $f > /dev/null 2> /dev/null & done;;
#        esac
#    }}

# define a custom 'rename' command without prompt for overwrite
# cmd rename %[ -e $1 ] && printf "file exists" || mv $f $1
# map r push :rename<space>

# move current file or selected files to trash folder
# (also see 'man mv' for backup/overwrite options)
#cmd trash %set -f; mv $fx ~/.trash
# $f: single file, $fx: multiple files

cmd trash %tp.sh "$fx"

# https://github.com/gokcehan/lf/issues/45#issuecomment-260347057
# https://unix.stackexchange.com/questions/617576/read-from-terminal-without-waiting-for-enter
cmd trash-confirm ${{
    echo 'file(s) selected:'
    echo $fx
    echo 'delete? [y/n]'
    read -n1 ans
    [ $ans = 'y' ] && (echo 'deleting files…' && tp.sh "$fx") || echo 'cancelled…'
}}

# extract the current file with the right command (https://xkcd.com/1168/)
cmd extract %extract.sh "$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
}}

# dragon
cmd dragon %dragon-drop --all --and-exit "$fx"
cmd dragon-stay %dragon-drop --all "$fx"
cmd dragon-individual %dragon-drop "$fx"
cmd dragin %dragin.sh
cmd multi-dragon %lfMultiSelectHandler.sh "dragon-drop --and-exit" "$fx"
cmd md :multi-dragon

# change dir
cmd cdd :cd /home/poq/syncDir/0_downloads
cmd cdg :cd /home/poq/syncDir/repos/git
cmd cdh :cd /home/poq
cmd cdi :cd /home/poq/syncDir/0_inProgress
cmd cdn :cd /mnt/nas
cmd cdp :cd /home/poq/pCloudDrive
cmd cdq :cd /home/poq/syncDir/repos/git/gi.op.fo/quick
cmd cds :cd /home/poq/syncDir

# yanks
cmd yank-dirname ${{ dirname "$f" | wl-copy -n }}
cmd yank-path ${{ realpath "$f" | wl-copy -n }}
cmd yank-filename ${{ basename "$f" | wl-copy -n }}

cmd yd :yank-dirname
cmd yp :yank-path
cmd yf :yank-filename

# misc
cmd edit $nano "$fx"
