Binaries
Table of Contents
dmenumount- Mount USB and Androiddmenuumount- Unmount USB and Android devicesnordvpn-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 anMP4video toGIFyt-audio- Download-Audio from youtubeyt-video- Download-Video from youtubesetbg- Set Backgroundinsert-unicode- Insert Unicode Iconinsert-nerd-fonts- Insert Nerd Font Iconlinkhandler- Open with Default applicationlockscreen- Lock Screenmopidy-restart- Restart Mopidyupload- Upload Scriptweather- Display Weather in terminalreadbib- Open Bibliography Filepdf2bib- 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 with Default application
Inspired from linkhandler script (github).
This is used to open any type of file with the wanted program.
It can be used in newsboat, neomutt and ranger for instance.
[ -z "$1" ] && { "$BROWSER"; exit; } case "$1" in *mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*) setsid mpv --input-ipc-server=/tmp/mpvsoc$(date +%s) -quiet "$1" >/dev/null 2>&1 & ;; *png|*jpg|*jpe|*jpeg|*gif) curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///")" && sxiv -a "/tmp/$(echo "$1" | sed "s/.*\///")" >/dev/null 2>&1 & ;; *mp3|*flac|*opus|*mp3?source*) setsid curl -LO "$1" >/dev/null 2>&1 & ;; *) if [ -f "$1" ]; then "$TERMINAL" -e "$EDITOR $1" else setsid $BROWSER "$1" >/dev/null 2>&1 & fi ;; esac
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
readbib - Open Bibliography File
List all pdf files and open selected one with zathura.
cd ~/Cloud/pdfs/ && ls | rofi -dmenu -lines 20 | xargs -I {} zathura {}
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 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%.*} # 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") inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension" ;; "pdf") inkscape --export-type="$out_ext" "$filename_with_extension" # pdf2svg file.pdf file.svg ;; esac } # Convert PDF Files pdf2() { \ out_ext=$(echo -e "svg\npng" | rofi -i -dmenu -p "Convert PDF to") # Ask if crop? if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "png") inkscape --export-type="$out_ext" --export-dpi=200 --export-area-drawing "$filename_with_extension" ;; "svg") inkscape --export-type="$out_ext" "$filename_with_extension" ;; esac } # 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") lowriter --convert-to pdf "$filename_with_extension" ;; esac } # Convert PNG Files png2() { \ out_ext=$(echo -e "pdf" | rofi -i -dmenu -p "Convert PNG to") if [ -z "$out_ext" ]; then exit; fi case "$out_ext" in "pdf") convert "$filename_with_extension" "$filename_without_extension.pdf" ;; esac } # 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") make-gif "$filename_with_extension" "$filename_without_extension.gif" ;; esac } case "$in_ext" in "svg") svg2 ;; "pdf") pdf2 ;; "mp4") mp42 ;; "png") png2 ;; "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