272 lines
12 KiB
Bash
Executable File
272 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
about="
|
|
### Dmen File Manager #############################################
|
|
# Version 0.1.2 by Scott Garrett <wintervenom [(a)] archlinux.us> #
|
|
###################################################################"
|
|
|
|
### Changelog #####################################################
|
|
# 0.1.0 # * Initial version #
|
|
# 0.1.1 # + Option 'Open last used dir' #
|
|
# # + Options 'Always open dirs' and 'Always open files' #
|
|
# 0.1.2 # + Config moved to $XDG_CONFIG_HOME #
|
|
# # + Options for dmenu styling #
|
|
# # + Option to change executor #
|
|
# # + Option to open file manager in current directory #
|
|
# # + Plugins support #
|
|
# see repo (github.com/hangtwenty/dmenfm) for changes since 0.1.2 #
|
|
###################################################################
|
|
|
|
function defaults {
|
|
show_hidden=0
|
|
show_backup=0
|
|
always_open_files=0
|
|
always_open_dirs=0
|
|
open_last=1
|
|
dmenu_caseinsens=1
|
|
dmenu_onbottom=1
|
|
dmenu_bg='#000000'
|
|
dmenu_fg='#9999CC'
|
|
dmenu_sbg='#000066'
|
|
dmenu_sfg='#FFFFFF'
|
|
executor='xdg-open'
|
|
editor='vim'
|
|
filemanager='dolphin'
|
|
}
|
|
|
|
function saveconfig {
|
|
echo "show_hidden=$show_hidden
|
|
show_backup=$show_backup
|
|
always_open_dirs=$always_open_dirs
|
|
always_open_files=$always_open_files
|
|
open_last=$open_last
|
|
dmenu_caseinsens=$dmenu_caseinsens
|
|
dmenu_onbottom=$dmenu_onbottom
|
|
dmenu_bg='$dmenu_bg'
|
|
dmenu_fg='$dmenu_fg'
|
|
dmenu_sbg='$dmenu_sbg'
|
|
dmenu_sfg='$dmenu_sfg'
|
|
editor=\"$editor\"
|
|
executor='xdg'
|
|
filemanager=\"$filemanager\"
|
|
last_dir=\"$(pwd)\"
|
|
" > "$config"
|
|
}
|
|
|
|
function setmenu {
|
|
menu="$menu $([ "$dmenu_caseinsens" == '1' ] && echo '-i') $([ "$dmenu_onbottom" == '1' ] && echo '-b') -nb $dmenu_bg -nf $dmenu_fg -sb $dmenu_sbg -sf $dmenu_sfg"
|
|
}
|
|
|
|
if [ -z "$XDG_CONFIG_HOME" ]; then
|
|
xdg_config_home="$HOME/.config"
|
|
else
|
|
xdg_config_home=$XDG_CONFIG_HOME
|
|
fi
|
|
|
|
file=1
|
|
config_file="preferences"
|
|
config_dir="$xdg_config_home/dmenfm"
|
|
config="$config_dir/$config_file"
|
|
plugins_dir="$config_dir/plugins"
|
|
menu='rofi -dmenu'
|
|
|
|
[ ! -d "$config_dir" ] && mkdir "$config_dir"
|
|
[ ! -d "$plugins_dir" ] && mkdir "$plugins_dir"
|
|
[ ! -d "$plugins_dir/browser" ] && mkdir "$plugins_dir/browser"
|
|
[ ! -d "$plugins_dir/operations" ] && mkdir "$plugins_dir/operations"
|
|
[ ! -d "$plugins_dir/preferences" ] && mkdir "$plugins_dir/preferences"
|
|
[ -e "$HOME/.dmanfs" ] && mv "$HOME/.dmanfs" "$config"
|
|
|
|
defaults
|
|
touch "$config"
|
|
source "$config"
|
|
setmenu
|
|
[[ "$last_dir" && "$open_last" == 1 ]] && cd "$last_dir"
|
|
|
|
while [ "$file" ]; do
|
|
file=$((echo -e '..\n.'; ls $([[ "$show_hidden" == '1' ]] && echo '-A') $([[ "$show_backup" == '1' ]] && echo '-B'); echo -e "[Preferences]\n[Open in $filemanager]"; ls -B "$plugins_dir/browser") | $menu -p "$(basename $(pwd))")
|
|
if [ "$file" ]; then
|
|
if [ -e "$file" ]; then
|
|
if $([ -d "$file" ] && [[ "$always_open_dirs" != '1' && "$file" != "." && "$file" != ".." ]]) || $([ -f "$file" ] && [[ "$always_open_files" != '1' ]]); then
|
|
owd=$(pwd)
|
|
opt=$((echo 'Open'; ([ -f "$file" ] && echo 'Edit'); echo -e 'Copy\nMove\nRename\nDelete'; ls -B "$plugins_dir/operations") | $menu -p "<$file>")
|
|
else
|
|
opt='Open'
|
|
fi
|
|
case "$opt" in
|
|
'Open')
|
|
if [ -d "$file" ]; then
|
|
cd "$file"
|
|
else
|
|
if [ "$executor" ] && which "$executor" &> /dev/null; then
|
|
exec "$executor" "$owd/$file" &
|
|
unset file
|
|
elif which exo-open &> /dev/null; then
|
|
exo-open "$owd/$file"
|
|
unset file
|
|
elif gnome-open &> /dev/null; then
|
|
gnome-open "$owd/$file"
|
|
unset file
|
|
else
|
|
xmessage 'No executor found. Set one in [Preferences].'
|
|
fi
|
|
fi
|
|
;;
|
|
'Edit')
|
|
if [ "$editor" ] && which "$editor" &> /dev/null; then
|
|
exec "$editor" "$owd/$file" &
|
|
unset file
|
|
elif which geany &> /dev/null; then
|
|
exec geany "$owd/$file"
|
|
unset file
|
|
elif which gedit &> /dev/null; then
|
|
exec gedit "$owd/$file"
|
|
unset file
|
|
elif which kwrite &> /dev/null; then
|
|
exec kwrite "$owd/$file"
|
|
unset file
|
|
else
|
|
xmessage 'No editor found. Set one in [Preferences].'
|
|
fi
|
|
;;
|
|
'Copy')
|
|
cdir=1
|
|
while [ "$cdir" ]; do
|
|
cdir=$((echo -e '..\n.'; ls $([[ "$show_hidden" == 1 ]] && echo "-A") $([[ "$show_backup" == 1 ]] && echo "-B") -d */) | $menu -p "Copy <$file> to:")
|
|
if [[ "$cdir" ]]; then
|
|
opt=$(echo -e 'Open\nCopy' | $menu -p "Copy <$file> to <$cdir>:")
|
|
if [[ "$opt" == "Open" ]]; then
|
|
cd "$cdir"
|
|
elif [[ "$opt" == "Copy" ]]; then
|
|
echo "$file"
|
|
[ -e "$cdir/$file" ] && opt=$(echo -e "No\nYes" | $menu -p "Replace existing <$file>?")
|
|
[[ "$opt" == "Copy" || "$opt" == "Yes" ]] && cp -af "$owd/$file" "$cdir/$file"
|
|
unset cdir
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
'Move')
|
|
cdir=1
|
|
while [ "$cdir" ]; do
|
|
cdir=$((echo -e '..\n.' && ls $([[ "$show_hidden" == 1 ]] && echo "-A") $([[ "$show_backup" == 1 ]] && echo "-B") -d */) | $menu -p "Move <$file> to:")
|
|
if [[ "$cdir" ]]; then
|
|
opt=$(echo -e 'Open\nMove' | $menu -p "Move <$file> to <$cdir>:")
|
|
if [[ "$opt" == "Open" ]]; then
|
|
cd "$cdir"
|
|
elif [[ "$opt" == "Move" ]]; then
|
|
echo "$file"
|
|
[ -e "$cdir/$file" ] && opt=$(echo -e "No\nYes" | $menu -p "Replace existing <$file>?")
|
|
[[ "$opt" == "Move" || "$opt" == "Yes" ]] && mv -f "$owd/$file" "$cdir/$file"
|
|
unset cdir
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
'Rename')
|
|
opt=$(echo "" | $menu -p "Rename <$file> to:")
|
|
[ "$opt" ] && mv -f "$file" "$opt"
|
|
;;
|
|
'Delete')
|
|
opt=$(echo -e "No\nYes" | $menu -p "Really delete <$file>?")
|
|
[[ "$opt" == "Yes" ]] && rm -rf "$file"
|
|
;;
|
|
*) [ "$opt" ] && [ -e "$plugins_dir/operations/$opt" ] && source "$plugins_dir/operations/$opt" ;;
|
|
esac
|
|
elif [[ "$file" =~ '[Open in' ]]; then
|
|
which "$filemanager" &> /dev/null && exec "$filemanager" . &
|
|
unset file
|
|
elif [[ "$file" == '[Preferences]' ]]; then
|
|
opt=1
|
|
while [ "$opt" ]; do
|
|
opt=$((echo "[$show_hidden] Show hidden files
|
|
[$show_backup] Show backup files
|
|
[$always_open_dirs] Always open dirs
|
|
[$always_open_files] Always open files
|
|
[$open_last] Open last used dir
|
|
[$dmenu_caseinsens] Case-insensitive
|
|
[$dmenu_onbottom] Display on bottom
|
|
[$dmenu_bg] Background
|
|
[$dmenu_fg] Foreground
|
|
[$dmenu_sbg] Selected background
|
|
[$dmenu_sfg] Selected foreground
|
|
[$executor] Executor
|
|
[$editor] Editor
|
|
[$filemanager] File manager
|
|
Set defaults
|
|
About"; ls -B "$plugins_dir/preferences") | $menu -p "Preferences")
|
|
case "$opt" in
|
|
*'hidden files') (('show_hidden=!show_hidden')) ;;
|
|
*'backup dirs') (('show_backup=!show_backup')) ;;
|
|
*'open dirs') (('always_open_dirs=!always_open_dirs')) ;;
|
|
*'open files') (('always_open_files=!always_open_files')) ;;
|
|
*'used dir') (('open_last=!open_last')) ;;
|
|
*'insensitive') (('dmenu_caseinsens=!dmenu_caseinsens')) ;;
|
|
*'on bottom') (('dmenu_onbottom=!dmenu_onbottom')) ;;
|
|
*'Background')
|
|
opt=$(echo -e "$dmenu_bg\n[Default]" | $menu -p "Background:")
|
|
[[ "$opt" == '[Default]' ]] && opt='000000'
|
|
[ "$opt" ] && dmenu_bg="$opt"
|
|
dmenu_test=1
|
|
;;
|
|
*'Foreground')
|
|
opt=$(echo -e "$dmenu_fg\n[Default]" | $menu -p "Foreground:")
|
|
[[ "$opt" == '[Default]' ]] && opt='9999CC'
|
|
[ "$opt" ] && dmenu_fg="$opt"
|
|
dmenu_test=1
|
|
;;
|
|
*'Selected background')
|
|
opt=$(echo -e "$dmenu_bg\n[Default]" | $menu -p "Selected background:")
|
|
[[ "$opt" == '[Default]' ]] && opt='000066'
|
|
[ "$opt" ] && dmenu_sbg="$opt"
|
|
dmenu_test=1
|
|
;;
|
|
*'Selected foreground')
|
|
opt=$(echo -e "$dmenu_bg\n[Default]" | $menu -p "Selected foreground:")
|
|
[[ "$opt" == '[Default]' ]] && opt='FFFFFF'
|
|
[ "$opt" ] && dmenu_sfg="$opt"
|
|
dmenu_test=1
|
|
;;
|
|
*'Executor')
|
|
opt=$(echo -e "$executor\n[Default]" | $menu -p "Executor:")
|
|
[[ "$opt" == '[Default]' ]] && opt='exo'
|
|
[ "$opt" ] && editor="$opt"
|
|
;;
|
|
*'Editor')
|
|
opt=$(echo -e "$editor\n[Default]" | $menu -p "Editor:")
|
|
[[ "$opt" == '[Default]' ]] && opt='geany'
|
|
[ "$opt" ] && editor="$opt"
|
|
;;
|
|
*'File manager')
|
|
opt=$(echo -e "$filemanager\n[Default]" | $menu -p "File manager:")
|
|
[[ "$opt" == '[Default]' ]] && opt='thunar'
|
|
[ "$opt" ] && filemanager="$opt"
|
|
;;
|
|
*'defaults')
|
|
opt=$(echo -e "No\nYes" | $menu -p "Really set defaults?")
|
|
[[ "$opt" == "Yes" ]] && defaults
|
|
;;
|
|
'About') xmessage -maxWidth 80 -maxHeight 80 "$about" ;;
|
|
*)
|
|
[ "$opt" ] && [ -e "$plugins_dir/preferences/$opt" ] && source "$plugins_dir/preferences/$opt"
|
|
;;
|
|
esac
|
|
done
|
|
menu="$menu $([ "$dmenu_caseinsens" == '1' ] && echo '-i') $([ "$dmenu_onbottom" == '1' ] && echo '-b') -nb $dmenu_bg -nf $dmenu_fg -sb $dmenu_sbg -sf $dmenu_sfg"
|
|
if [[ "$dmenu_test" == '1' ]]; then
|
|
if [[ "OK" != "$(echo 'OK' | $menu -p 'Dmenu settings changed.')" ]]; then
|
|
defaults
|
|
source "$config"
|
|
setmenu
|
|
echo 'OK' | $menu -p 'Error in Dmenu settings. Reverted.'
|
|
fi
|
|
fi
|
|
saveconfig
|
|
elif [ -e "$plugins_dir/browser/$file" ]; then
|
|
source "$plugins_dir/browser/$file"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
saveconfig
|