Binaries
Table of Contents
dmenumount
- Mount USB and Androiddmenuumount
- Unmount USB and Android devicesdmenukill
- Kill program using Dmenunordvpn-toggle
- Connect to VPN using NordVPNbukurun
- Open link from Bukui3exit
- Manage lock, suspend, reboot, …askpass-rofi
- GUI prompt for passwordsscreenshot
- Take Screenshotnetwork-toggle
- Toggle Networkmake-gif
- Convert anMP4
video toGIF
yt-audio
- Download-Audio from youtubeyt-video
- Download-Video from youtubesetbg
- Set Backgroundinsert-unicode
- Insert Unicode Iconinsert-nerd-fonts
- Insert Nerd Font Iconlinkhandler
- Open any URL with Default applicationopen
- Open any file usingrifle
lockscreen
- Lock Screenmopidy-restart
- Restart Mopidyupload
- Upload Scriptweather
- Display Weather in terminalpdf2bib
- Extract bibtex entry from PDF filepdf2png
- Convert a PDF to PNGconvert-file
- Convert any file to another filetypepdf-shrink
- Pdf Shrinkpdf-delete-annotations
- Delete Annotations from PDFspdf-delete-first-page
- Delete first page of PDFrofi-calc
- Simple Calculation using Rofipass-gen
- Generate Random Alphanumeric Passwordsxhkd-help
- List of keybindings using Rofi
nordvpn-toggle
- Connect to VPN using NordVPN
To use this this, nordvpn
must be installed: yay -S nordvpn-bin
.
tmpfile="/tmp/vpnstatus"; if [[ $(nordvpn status) == *"Connected"* ]]; then nordvpn disconnect && \ dunstify --replace=23198 "VPN" "Disconnected" && \ echo "off" > $tmpfile; else # Select Country to connect to country=`cat ~/.local/data/nordvpn_countries.txt | rofi -i -dmenu | sed 's/\s/_/g'`; dunstify --replace=23198 "VPN" "Connecting to $country..."; nordvpn connect $country && \ dunstify --replace=23198 "VPN" "Connected to $country" && \ echo "on" > $tmpfile; fi
bukurun
- Open link from Buku
Script taken from here that acts as a buku frontend using Rofi.
_rofi () { rofi -dmenu -i -no-levenshtein-sort -width 1000 "$@" } # display settings display_type=1 max_str_width=80 # keybindings switch_view="Alt+Tab" new_bookmark="Alt+n" actions="Alt+a" edit="Alt+e" delete="Alt+d" # colors help_color="#334433" # source global config if [[ -f /etc/buku_run.config ]] then source /etc/buku_run.config fi # source local config: if [[ -z $XDG_CONFIG_DIR ]] then if [[ -f $HOME/.config/buku_run/config ]] then source $HOME/.config/buku_run/config else echo "User config file \'~/.config/buku_run/config\' not found. using global config" fi else if [[ -f "${XDG_CONFIG_DIR}/buku_run/config" ]] then source "${XDG_CONFIG_DIR}/buku_run/config" else echo "User config file \'~/.config/buku_run/config\' not found. using global config" fi fi main () { HELP="Welcome to Buku. Use <span color='${help_color}'>${new_bookmark}</span> to add a new Bookmark Use <span color='${help_color}'>${switch_view}</span> to switch View. <span color='${help_color}'>${actions}</span> for actions" if [[ $mode == "bookmarks" ]]; then content=$(parseBuku) menu=$(echo "${content}" | _rofi -p '> ' -filter "${filter}" -mesg "${HELP}" -kb-custom-1 "${new_bookmark}" -kb-custom-2 "${switch_view}" -kb-custom-3 "${actions}" -kb-custom-4 "${edit}" -kb-custom-5 "${delete}") elif [[ $mode == "tags" ]]; then menu=$(buku --np --st | awk '{$NF=""; print $0}' | cut -d ' ' -f2- | _rofi -p '> ' -mesg "${HELP}" -kb-custom-1 "${new_bookmark}" -kb-custom-2 "${switch_view}" -kb-custom-3 "${actions}" -kb-custom-4 "${edit}" -kb-custom-5 "${delete}") fi val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 12 ]]; then optionsMenu elif [[ $val -eq 10 ]]; then addMark elif [[ $val -eq 14 ]]; then deleteMenu elif [[ $val -eq 13 ]]; then editMenu elif [[ $val -eq 11 ]]; then if [[ $mode == "bookmarks" ]]; then export mode="tags" mode=tags main elif [[ $mode == "tags" ]]; then export mode="bookmarks" mode=bookmarks main fi elif [[ $val -eq 0 ]]; then if [[ $mode == "bookmarks" ]]; then id=$(getId "$content" "$menu") for bm in ${id}; do buku -o "${bm}" done elif [[ $mode == "tags" ]]; then filter="${menu}" mode="bookmarks" main fi fi } optionsMenu () { if [[ $mode == "bookmarks" ]]; then askmenu=$(echo -e "< Return\n---\n1. Edit\n2. Delete" | _rofi -p '> ' -mesg "Choose Action for bookmark") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $askmenu == "< Return" ]]; then export mode=bookmarks main elif [[ $askmenu == "1. Edit" ]]; then editMenu elif [[ $askmenu == "2. Delete" ]]; then deleteMenu fi fi elif [[ $mode == "tags" ]]; then askmenu=$(echo -e "< Return\n---\n1. Replace Tag\n2. Delete Tag" | _rofi -p '> ' -mesg "Choose Action for tag \"${menu}\"") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $askmenu == "< Return" ]]; then export mode=tags main elif [[ $askmenu == "1. Replace Tag" ]]; then newtag=$(echo | _rofi -p '> ' -mesg "Enter new tag name for tag \"${menu}\"") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $newtag == "" ]]; then mode=tags main else buku -r "${menu}" "${newtag}" mode=tags main fi fi elif [[ $askmenu == "2. Delete Tag" ]]; then delask=$(echo -e "1. Yes\n2. No" | _rofi -p '> ' -mesg "Really delete tag?") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $delask == "1. Yes" ]]; then buku -r "${menu}" mode=tags main elif [[ $delask == "2. No" ]]; then mode=tags main fi fi fi fi fi } deleteMenu () { id=$(getId "$content" "$menu") delask=$(echo -e "1. Yes\n2. No" | _rofi -p '> ' -mesg "Really delete bookmark?") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $delask == "1. Yes" ]]; then buku -d ${id} --tacit mode=bookmarks main elif [[ $delask == "2. No" ]]; then optionsMenu fi fi } editMenu () { id=$(getId "$content" "$menu") title="$(getTitleFromId $id)" bookmark="$(getUrlFromId $id)" tags="$(getTagsFromId $id)" content=$(echo -e "1. title: $title\n2. url: $bookmark\n3. tags: $tags") editmenu=$(echo -e "< Return\n---\n${content}" | _rofi -p '> ') val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $editmenu == "< Return" ]]; then main elif [[ $editmenu == "tags: NOTAG" ]]; then addTags --update elif [[ $editmenu =~ tags:* ]]; then tags="${tags}" editTags elif [[ $editmenu =~ url:* ]]; then editBookmark elif [[ $editmenu =~ title:* ]]; then editTitle fi fi } editTags () { edittagsmenu=$(echo | _rofi -filter "${tags}" -p '> ' -mesg "Edit Tags and hit Enter") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then buku -u ${id} --tag "${edittagsmenu}" fi mode=bookmarks main } editBookmark () { bmarkmenu=$(echo "" | _rofi -p "> " -filter "${bookmark}" -mesg "Edit Bookmark and hit Enter") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $bmarkmenu == "http"* ]]; then buku -u "${id}" --url "${bmarkmenu}" else echo "" | rofi -e "Not a valid URI, Make sure URLs start with http" editBookmark fi fi mode=bookmarks main } editTitle () { titlemenu=$(echo "" | _rofi -p "> " -filter "${title}" -mesg "Edit Title and hit Enter") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then buku -u "${id}" --title "${titlemenu}" fi mode=bookmarks main } addMark () { inserturl=$(echo -e "$(xclip -o)" | _rofi -p '> ' -mesg "Use URL below or type manually") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then addTags fi } addTags () { inserttags=$(buku --np --st | awk '{$NF=""; print $0}' | cut -d ' ' -f2- | _rofi -p '> ' -mesg "Add some tags. Separate tags with ', '") val=$? if [[ $val -eq 1 ]]; then exit elif [[ $val -eq 0 ]]; then if [[ $(echo "${inserttags}" | wc -l) -gt 1 ]]; then taglist=$(echo "${inserttags}" | tr '\n' ',') tags=() for tag in $taglist; do tags+=("$tag") done else tags=${inserttags} fi if [[ $1 == "--update" ]]; then buku -u "${id}" --tag ${tags} else buku -a ${inserturl} ${tags} fi fi } parseBuku () { echo "$(buku --nc -p | gawk -v max="$max_str_width" -v type="$display_type" ' BEGIN { RS="" FS="\n" } { if ($3 == "") $3 = " # NOTAG" id = gensub(/([0-9]+)\.(.*)/, "\\1", "g", $1) url = substr(gensub(/\s+> (.*)/, "\\1", "g", $2),0,max) tags = gensub(/\s+# (.*)/, "\\1", "g", $3) title = substr(gensub(/[0-9]+\.\s*(.*)/, "\\1", "g", $1),0,max) if (type == 1) print id "\t" url "\t" tags else print id "\t" title "\t" tags if (type == 3) print " \t" url "\t " print "" } ' | column -t -s $'\t')" } getId () { id=$(echo "${2%% *}") if [ -z "$id" ]; then prev="" IFS=$'\n' for line in $1; do if [ "$2" = "$line" ]; then id=$(echo "${prev%% *}") break else prev="$line" fi done fi echo $id } getTitleFromId () { echo "$(buku --nc -p $1 | gawk ' BEGIN { RS="" FS="\n" } { print gensub(/[0-9]+\.\s*(.*)/, "\\1", "g", $1) } ')" } getUrlFromId () { echo "$(buku --nc -p $1 | gawk ' BEGIN { RS="" FS="\n" } { print gensub(/\s+> (.*)/, "\\1", "g", $2) } ')" } getTagsFromId () { echo "$(buku --nc -p $1 | gawk ' BEGIN { RS="" FS="\n" } { print gensub(/\s+# (.*)/, "\\1", "g", $3) } ')" } mode=bookmarks main
i3exit
- Manage lock, suspend, reboot, …
option=$(echo -e "Lock\nExit\nLogout\nSuspend\nHibernate\nReboot\nShutdown" | rofi -i -dmenu) case "$option" in "Lock") ~/.local/bin/lockscreen ;; "Exit") pkill -15 -t tty"$XDG_VTNR" Xorg ;; "Logout") loginctl terminate-session `loginctl session-status | head -n 1 | awk '{print $1}'` ;; "Suspend") systemctl suspend && ~/.local/bin/lockscreen ;; "Hibernate") systemctl hibernate && ~/.local/bin/lockscreen ;; "Reboot") confirmation=$(echo -e "Yes\nNo" | rofi -i -p "Are you sure you want to Reboot?" -dmenu) case "$confirmation" in "Yes") systemctl reboot ;; esac ;; "Shutdown") confirmation=$(echo -e "Yes\nNo" | rofi -i -p "Are you sure you want to Shutdown?" -dmenu) case "$confirmation" in "Yes") systemctl poweroff ;; esac ;; *) echo "== ! i3exit: missing or invalid argument ! ==" exit 2 esac exit 0
askpass-rofi
- GUI prompt for passwords
Take password prompt from STDIN, print password to STDOUT.
The sed piece just removes the colon from the provided prompt: rofi -p
already gives us a colon
rofi -dmenu \ -password \ -no-fixed-num-lines \ -p "$(printf "$1" | sed s/://)"
screenshot
- Take Screenshot
# Ask for screenshot type status=$(echo -e "All\nGUI\nSelection\nCropped\nCopy\nPretty\nShadow\nWindow" | rofi -i -dmenu -p "Type") if [ -z "$status" ]; then exit; fi # Ask for filename if not copying the image if [[ $status != "Copy" ]]; then name=$(echo -e "screenshot-$(date +"%m-%d-%y_%H-%M-%S")" | rofi -i -dmenu -p "Filename") if [ -z "$name" ]; then exit; fi filename=~/Pictures/$name.png fi case "$status" in "All") maim -u $filename ;; "GUI") flameshot gui -r > $filename && \ pkill flameshot;; "Selection") maim -u -s $filename ;; "Cropped") maim -u -s $filename && convert -trim $filename $filename ;; "Copy") maim -u -s | xclip -selection clipboard -t image/png ;; "Shadow") maim -u -s | convert - \( +clone -background black -shadow 80x3+5+5 \) +swap -background none -layers merge +repage $filename ;; "Pretty") maim -u -s $filename && \ convert $filename \( +clone -alpha extract -draw 'fill black polygon 0,0 0,5 5,0 fill white circle 5,5 5,0' \( +clone -flip \) -compose Multiply -composite \( +clone -flop \) -compose Multiply -composite \) -alpha off -compose CopyOpacity -composite $filename && \ convert $filename \( +clone -background black -shadow 40x5+0+0 \) +swap -background none -layers merge +repage $filename ;; "Window") maim -u -i $(xdotool selectwindow) $filename ;; esac
network-toggle
- Toggle Network
Minimal network manager to just toggle the Wifi or Ethernet connection.
result=$(nmcli device | sed '1d' | dmenu -l 20); interface=$(echo $result | awk -F ' ' '{print $1}'); status=$(echo $result | awk -F ' ' '{print $3}'); if [ $status == 'disconnected' ]; then nmcli device connect $interface else nmcli device disconnect $interface fi
make-gif
- Convert an MP4
video to GIF
First argument is the mp4
file and the second argument is the output gif
file.
palette="/tmp/palette.png" filters="fps=15,scale=320:-1:flags=lanczos" ffmpeg -v warning -i $1 -vf "$filters,palettegen" -y $palette ffmpeg -v warning -i $1 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y $2
yt-audio
- Download-Audio from youtube
if [ $TMUX ]; then tmux split -v -l 5 "cd ~/Downloads/ && youtube-dl --add-metadata -xic -f bestaudio/best $1" && tmux select-pane -U else cd ~/Downloads/; setsid nohup youtube-dl --add-metadata -xic -f bestaudio/best $1 &> /dev/null & fi
yt-video
- Download-Video from youtube
if [ $TMUX ]; then tmux split -v -l 5 "cd ~/Downloads/ && youtube-dl --add-metadata -ic $1" && tmux select-pane -U else cd ~/Downloads/; setsid nohup youtube-dl --add-metadata -ic $1 &> /dev/null & fi
setbg
- Set Background
First argument is either:
- the background file
- a directory, in such case it will pick a random picture file from that directory
bgloc="${XDG_CACHE_HOME:-$HOME/.cache/}/bg" # If the argument is a file [ -f "$1" ] && ln -sf "$(readlink -f "$1")" "$bgloc" # If the argument is a directory [ -d "$1" ] && ln -sf "$(find "$(readlink -f "$1")" -iregex '.*.\(jpg\|jpeg\|png\|gif\)' -type f | shuf -n 1)" "$bgloc" # Set the wallpaper xwallpaper --zoom "$bgloc"
insert-unicode
- Insert Unicode Icon
The list of emojis is available here.
# Must have xclip installed to even show menu. xclip -h 2>/dev/null || exit 1 chosen=$(cut -d ';' -f1 ~/.local/data/emojis | rofi -dmenu -i -l 20 | sed "s/ .*//") [ "$chosen" != "" ] || exit # If you run this command with an argument, it will automatically insert the character. if [ -n "$1" ]; then xdotool key Shift+Insert else echo "$chosen" | tr -d '\n' | xsel -ib dunstify "'$chosen' copied to clipboard." & fi
insert-nerd-fonts
- Insert Nerd Font Icon
The list of emojis is available here.
# Must have xsel installed to even show menu. xsel -h 2>/dev/null || exit 1 chosen=$(cat ~/.local/data/nerd-fonts | rofi -dmenu -i -l 20 | sed "s/ .*//") [ "$chosen" != "" ] || exit # If you run this command with an argument, it will automatically insert the character. if [ -n "$1" ]; then xdotool key Shift+Insert else echo "$chosen" | tr -d '\n' | xsel -ib dunstify "'$chosen' copied to clipboard." & fi
linkhandler
- Open any URL with Default application
Inspired from linkhandler
script (github).
This is used to open any url with the wanted program.
[ -z "$1" ] && { "$BROWSER"; exit; } case "$1" in *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*gif) setsid mpv -quiet "$1" >/dev/null 2>&1 & ;; *png|*jpg|*jpe|*jpeg) curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; *pdf|*cbz|*cbr) curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && zathura "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; *svg) curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" && inkview "/tmp/$(echo "$1" | sed "s/.*\///;s/%20/ /g")" >/dev/null 2>&1 & ;; *mp3|*flac|*opus|*mp3?source*) setsid curl -LO "$1" >/dev/null 2>&1 & ;; *) [ -f "$1" ] && setsid -f "$TERMINAL" -e "$EDITOR" "$1" >/dev/null 2>&1 || setsid -f "$BROWSER" "$1" >/dev/null 2>&1 esac
open
- Open any file using rifle
Simple alternative to xdg-open
, uses the rifle
program included with ranger
.
The default applications are listed here.
rifle -p $(rifle -l "$1" | rofi -dmenu -i | sed -n -e 's/\([0-9]*\):.*/\1/p') "$1"
lockscreen
- Lock Screen
A nice lockscreen that uses i3lock
.
It takes a screenshot, pixelize it and overlay an image in the lockscreens folder.
# First, turn off dunst killall -SIGUSR1 dunst && echo "off" > /tmp/dunststatus; # Turn off the music if it is playing. MPC_STATE=$(mpc | sed -n '2p' | cut -d "[" -f2 | cut -d "]" -f1) if [[ $MPC_STATE == "playing" ]]; then mpc pause fi # Take the screenshot and process it nicely temp_file="/tmp/screen.png" rm -f $temp_file maim $temp_file && \ # Pixelize the Screenshot convert $temp_file -scale 10% -scale 1000% $temp_file && \ # Overlay a random image in the lockscreens folder composite -gravity center $(find ~/.local/data/lockscreens/ -type f | shuf -n 1) $temp_file $temp_file; # Finally, lock the screen using =i3lock= i3lock --ignore-empty-password --nofork --image=$temp_file && \ # When unlocking, restart dunst killall -SIGUSR2 dunst && echo "on" > /tmp/dunststatus
mopidy-restart
- Restart Mopidy
Sometimes mopidy
need to be restarted…
pids=( $(pgrep -f mopidy) ) for pid in "${pids[@]}"; do if [[ $pid != $$ ]]; then kill "$pid" fi done echo "Killed mopidy." echo "Restarting mopidy..." mopidy --config ~/.config/mopidy/mopidy.conf >/dev/null 2>&1 & echo "Done"
upload
- Upload Script
Upload a file to https://0x0.st/ and copy the generated url.
if [ $TMUX ]; then tmux split -v -l 1 "curl --progress-bar -F\"file=@$1\" https://0x0.st | xsel -ib;" && tmux select-pane -U else curl --progress-bar -F"file=@$1" https://0x0.st | xsel -ib && \ dunstify 'Upload' 'Successful' || \ dunstify --urgency=critical 'Upload' 'Failed' fi
weather
- Display Weather in terminal
Get the weather from http://wttr.in/.
if [ -n "$*" ]; then address="wttr.in/" address+=$* else address="wttr.in/" fi if type sxiv > /dev/null 2>&1; then address+=".png" wget -qO- "$address" > /tmp/weather.png && \ sxiv -b /tmp/weather.png elif type feh > /dev/null 2>&1; then address+=".png" wget -qO- "$address" | feh - else curl "$address" fi
pdf2bib
- Extract bibtex entry from PDF file
pdf2doi () { pdfinfo "$1" | grep -io "doi:.*" | grep -Poi "10.\d+/[^\s]+" || \ pdftotext "$1" 2>/dev/null - | grep -io "doi:.*" -m 1 | grep -Poi "10.\d+/[^\s]+" || \ pdftotext "$1" 2>/dev/null - | grep -Poi "10.\d+/[^\s]+" } doi2bib () { # curl -LHs "Accept: application/x-bibtex" http://dx.doi.org/$1 -w "\\n" curl -s "http://api.crossref.org/works/$1/transform/application/x-bibtex" -w "\\n" } # If a file is specified, try to extract DOI from the file if [ -f "$1" ]; then doi=$(pdf2doi "$1") fi if hash rofi 2>/dev/null; then doi=$(echo "$doi" | rofi -i -dmenu -p "DOI") else doi=$(echo "$doi" | dmenu -i -p "DOI") fi if [ -n "$1" ]; then doi2bib $doi | xsel -ib && \ dunstify 'BibTeX' 'Copied to Clipboard' || \ dunstify --urgency=critical 'BibTeX' 'Failed' fi
pdf2png
- Convert a PDF to PNG
# Check if the input argumetn is a PDF file if [[ -f "$1" && "$1" == *.pdf ]]; then pdftoppm -png "$1" > "$(echo "$1" | cut -f 1 -d '.' | sed 's/$/.png/')" fi
convert-file
- Convert any file to another filetype
Get basic information about the file
# Get filename filename_with_extension=$(basename -- "$1") # Extract extension of the file in_ext="${filename_with_extension##*.}" # filename without extension filename_without_extension=${filename_with_extension%.*}
SVG files
List of useful programs:
inkscape
SVG to PNG
svg2png_function() { \ if command -v inkscape &> /dev/null; then inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension" fi }
SVG to PDF
svg2pdf_function() { \ if command -v inkscape &> /dev/null; then inkscape --export-type="$out_ext" "$filename_with_extension" fi }
Main function
# Convert SVG Files svg2() { \ out_ext=$(echo -e "pdf\npng" | rofi -i -dmenu -p "Convert SVG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "png") svg2png_function ;; "pdf") svg2pdf_function ;; esac }
PDF files
List of useful programs:
pdftocairo
pdftoppm
convert
inkscape
gs
pdfcrop
pdftk
PDF to PNG
pdf2png_function() { \ if command -v pdftocairo &> /dev/null; then pdftocairo -png -singlefile -cropbox "$filename_with_extension" "$filename_without_extension" elif command -v pdftoppm &> /dev/null; then pdftoppm -png "$filename_with_extension" > "$filename_without_extension.png" elif command -v convert &> /dev/null; then convert -density 100 -trim -antialias "$filename_with_extension" -quality 100 "$filename_without_extension.png" elif command -v inkscape &> /dev/null; then inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension" fi }
PDF to SVG
pdf2svg_function() { \ if command -v pdftocairo &> /dev/null; then pdftocairo -svg "$filename_with_extension" "$filename_without_extension.svg" elif command -v pdf2svg &> /dev/null; then pdf2svg "$filename_with_extension" "$filename_without_extension.svg" elif command -v inkscape &> /dev/null; then inkscape --export-type="$out_ext" "$filename_with_extension" fi }
PDF Reduce Size
pdfreduce_function() { \ if command -v gs &> /dev/null; then # Maybe ask for new filename? gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="$filename_without_extension.red.pdf" "$filename_with_extension" fi }
PDF Trim
pdftrim_function() { \ if command -v pdfcrop &> /dev/null; then pdfcrop "$filename_with_extension" "$filename_with_extension" fi }
PDF Extract Pages
pdfextract_function() { \ if command -v pdftk &> /dev/null; then pages=$(echo -e "get first\ndelete first\nextract i-j" | rofi -i -dmenu -p "Extract pages") if [ -z "$pages" ]; then exit; fi case "$pages" in "get first") if command -v pdftk &> /dev/null; then pdftk "$filename_with_extension" cat 1-1 output "$filename_without_extension.first.pdf" fi ;; "delete first") if command -v pdftk &> /dev/null; then pdftk "$filename_with_extension" cat 2-end output "$filename_with_extension" fi ;; "extract i-j") # TODO page_i=$(rofi -dmenu -p "From") page_j=$(rofi -dmenu -p "To") if command -v pdftk &> /dev/null; then pdftk "$filename_with_extension" cat "$page_i-$page_j" output "$filename_with_extension.slice.pdf" fi ;; esac fi }
Delete First Page
pdf_delete_first_page_function() { \ if command -v stapler &> /dev/null; then stapler del "$filename_with_extension" 1 /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$filename_with_extension" elif command -v pdftk &> /dev/null; then pdftk "$filename_with_extension" cat 2-end output /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$filename_with_extension" fi }
Remove Annotations
pdf_remove_annotations_function() { \ if command -v pdftk &> /dev/null; then pdftk "$filename_with_extension" output /tmp/uncompressed.pdf uncompress LANG=C sed -n '/^\/Annots/!p' /tmp/uncompressed.pdf > /tmp/stripped.pdf pdftk /tmp/stripped.pdf output "$filename_with_extension" compress fi }
Main function
# Convert PDF Files pdf2() { \ out_ext=$(echo -e "svg\npng\nreduce size\ntrim\nextract pages\ndelete first page\nremove annotations" | rofi -i -dmenu -p "Convert PDF to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "svg") pdf2svg_function ;; "png") pdf2png_function ;; "reduce size") pdfreduce_function ;; "trim") pdftrim_function ;; "extract pages") pdfextract_function ;; "delete first page") pdf_delete_first_page_function ;; "remove annotations") pdf_remove_annotations_function ;; esac }
DVI files
List of useful programs:
dvisvgm
dvipng
DVI to PNG
dvi2png_function() { \ if command -v dvipng &> /dev/null; then dvipng "$filename_with_extension" fi }
DVI to SVG
dvi2svg_function() { \ if command -v dvisvgm &> /dev/null; then dvisvgm "$filename_with_extension" -o "$filename_without_extension.svg" fi }
Main function
# Convert DVI Files dvi2() { \ out_ext=$(echo -e "svg\npng" | rofi -i -dmenu -p "Convert DVI to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "svg") dvi2svg_function ;; "png") dvi2png_function ;; esac }
DOCX/PTTX files
DOC to PDF
doc2pdf_function() { \ if command -v lowriter &> /dev/null; then lowriter --convert-to pdf "$filename_with_extension" fi }
Main function
# Convert DOCX/PPTX Files docx2() { \ out_ext=$(echo -e "pdf" | rofi -i -dmenu -p "Convert DOCX/PPTX to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") doc2pdf_function ;; esac }
GIF files
GIF to PNG
gif2png_function() { \ if command -v convert &> /dev/null; then convert -coalesce "$filename_with_extension" "$filename_without_extension.png" fi }
Main function
# Convert GIF Files gif2() { \ out_ext=$(echo -e "png" | rofi -i -dmenu -p "Convert GIF to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "png") gif2png_function ;; esac }
PNG files
PNG to PDF
png2pdf_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.pdf" fi }
PNG to JPG
png2jpg_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.jpg" fi }
PNG Trim
pngtrim_function() { \ if command -v convert &> /dev/null; then convert -trim "$filename_with_extension" "$filename_with_extension" fi }
PNG Resize
pngresize_function() { \ if command -v convert &> /dev/null; then size_type=$(echo -e "width\nheight" | rofi -i -dmenu -p "Maximum:") size_px=$(rofi -dmenu -p "Number of px:") if [ "$size_type" = "width" ]; then convert -resize "$size_px"x "$filename_with_extension" "$filename_with_extension" elif [ "$size_type" = "height" ]; then convert -resize x"$size_px" "$filename_with_extension" "$filename_with_extension" fi fi }
Main function
# Convert PNG Files png2() { \ out_ext=$(echo -e "pdf\njpg\ntrim\nresize" | rofi -i -dmenu -p "Convert PNG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") png2pdf_function ;; "jpg") png2jpg_function ;; "trim") pngtrim_function ;; "resize") pngresize_function ;; esac }
JPG files
JPG to PDF
jpg2pdf_function() { \ if command -v convert &> /dev/null; then convert "$filename_with_extension" "$filename_without_extension.pdf" fi }
JPG Resize
jpgresize_function() { \ if command -v convert &> /dev/null; then size_type=$(echo -e "width\nheight" | rofi -i -dmenu -p "Maximum:") size_px=$(rofi -dmenu -p "Number of px:") if [ "$size_type" = "width" ]; then convert -resize "$size_px"x "$filename_with_extension" "$filename_with_extension" elif [ "$size_type" = "height" ]; then convert -resize x"$size_px" "$filename_with_extension" "$filename_with_extension" fi fi }
Main function
# Convert JPG Files jpg2() { \ out_ext=$(echo -e "pdf\nresize" | rofi -i -dmenu -p "Convert JPG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") jpg2pdf_function ;; "resize") jpgresize_function ;; esac }
MP4 files
MP4 to GIF
mp42gif_function() { \ if command -v ffmpeg &> /dev/null; then palette="/tmp/palette.png" width=$(echo -e "auto" | rofi -i -dmenu -p "GIF width") if [ "$width" = "auto" ]; then filters="fps=15" else filters="fps=15,scale=$width:-1:flags=lanczos" fi # Generate optimal pallette of colors ffmpeg -v warning -i "$filename_with_extension" -vf "$filters,palettegen" -y $palette # Convert ffmpeg -v warning -i "$filename_with_extension" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$filename_without_extension.gif" fi }
Main function
# Convert MP4 Files mp42() { \ out_ext=$(echo -e "gif" | rofi -i -dmenu -p "Convert MP4 to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "gif") mp42gif_function ;; esac }
Case statement
case "$in_ext" in "svg") svg2 ;; "gif") gif2 ;; "dvi") dvi2 ;; "pdf") pdf2 ;; "mp4") mp42 ;; "png") png2 ;; "jpg") jpg2 ;; "jpeg") jpg2 ;; "docx") docx2 ;; "pttx") docx2 ;; esac
pdf-shrink
- Pdf Shrink
Simply reduces the size of a given pdf file.
shrink () { gs \ -q -dNOPAUSE -dBATCH -dSAFER \ -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.3 \ -dPDFSETTINGS=/screen \ -dEmbedAllFonts=true \ -dSubsetFonts=true \ -dAutoRotatePages=/None \ -dColorImageDownsampleType=/Bicubic \ -dColorImageResolution=$3 \ -dGrayImageDownsampleType=/Bicubic \ -dGrayImageResolution=$3 \ -dMonoImageDownsampleType=/Subsample \ -dMonoImageResolution=$3 \ -sOutputFile="$2" \ "$1" } check_smaller () { # If $1 and $2 are regular files, we can compare file sizes to # see if we succeeded in shrinking. If not, we copy $1 over $2: if [ ! -f "$1" -o ! -f "$2" ]; then return 0; fi ISIZE="$(echo $(wc -c "$1") | cut -f1 -d\ )" OSIZE="$(echo $(wc -c "$2") | cut -f1 -d\ )" if [ "$ISIZE" -lt "$OSIZE" ]; then echo "Input smaller than output, doing straight copy" >&2 cp "$1" "$2" fi } usage () { echo "Reduces PDF filesize by lossy recompressing with Ghostscript." echo "Not guaranteed to succeed, but usually works." echo " Usage: $1 infile [outfile] [resolution_in_dpi]" } IFILE="$1" # Need an input file: if [ -z "$IFILE" ]; then usage "$0" exit 1 fi # Output filename defaults to "-" (stdout) unless given: if [ ! -z "$2" ]; then OFILE="$2" else OFILE="-" fi # Output resolution defaults to 90 unless given: if [ ! -z "$3" ]; then res="$3" else res="90" fi shrink "$IFILE" "$OFILE" "$res" || exit $? check_smaller "$IFILE" "$OFILE"
pdf-delete-annotations
- Delete Annotations from PDFs
Taken from this gist.
# Check if the input argumetn is a PDF file if [[ -f "$1" && "$1" == *.pdf ]]; then pdftk $1 output /tmp/uncompressed.pdf uncompress LANG=C sed -n '/^\/Annots/!p' /tmp/uncompressed.pdf > /tmp/stripped.pdf pdftk /tmp/stripped.pdf output $1 compress fi
pdf-delete-first-page
- Delete first page of PDF
The requirement is to have pdftk
or stapler
installed.
# Check if the input argumetn is a PDF file if [[ -f $1 && $1 == *.pdf ]]; then if type stapler > /dev/null 2>&1; then stapler del "$1" 1 /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$1" elif type pdftk > /dev/null 2>&1; then pdftk "$1" cat 2-end output /tmp/pdftk_out.pdf && mv /tmp/pdftk_out.pdf "$1" else echo "Neither pdftk nor stapler are installed" fi fi
rofi-calc
- Simple Calculation using Rofi
Run some simple calculations with rofi
.
rofi -show calc -mode calc -no-show-match -no-sort
pass-gen
- Generate Random Alphanumeric Password
# Ask for the wanted number of caracters num=$(rofi -dmenu -p "Number of caracters") # Random generation of alphanumeric caracters pass=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1) re='^[0-9]+$' if [[ $num =~ $re ]] ; then pass=${pass:0:$num} fi # Send the password to the clipboard printf "$pass" | xclip -sel clip && \ dunstify 'Password' 'Generated'
sxhkd-help
- List of keybindings using Rofi
awk '/^[a-z]/ && last {print "<small>",$0,"\t",last,"</small>"} {last=""} /^#/{last=$0}' ~/.config/sxhkd/sxhkdrc{,.i3} | column -t -s $'\t' | rofi -dmenu -i -markup-rows -no-show-icons -width 1000 -lines 15 -yoffset 40