From 37830b579abf82ac1668b27a48ff10ee93170ae7 Mon Sep 17 00:00:00 2001 From: Phuntsok Drak-pa Date: Wed, 23 Oct 2019 12:00:28 +0200 Subject: [PATCH] More literary programming \o/ --- .local/bin/README.org | 536 ++++++++++++++++++++++++++++++++++++++++- .local/bin/dmenu | 2 + .local/bin/dmount | 105 -------- .local/bin/dumount | 61 ----- .local/bin/rofi-emoji | 6 + .local/bin/rofi-mount | 146 +++++++++++ .local/bin/rofi-umount | 92 +++++++ 7 files changed, 772 insertions(+), 176 deletions(-) create mode 100755 .local/bin/dmenu delete mode 100755 .local/bin/dmount delete mode 100755 .local/bin/dumount create mode 100755 .local/bin/rofi-emoji create mode 100755 .local/bin/rofi-mount create mode 100755 .local/bin/rofi-umount diff --git a/.local/bin/README.org b/.local/bin/README.org index f683bef..fde6a78 100644 --- a/.local/bin/README.org +++ b/.local/bin/README.org @@ -44,11 +44,24 @@ - [[#presentation][Presentation]] - [[#askpass][Askpass]] +- [[#dmenu][Dmenu]] - [[#emoji-picker][Emoji picker]] - [[#rofimount][Rofimount]] - [[#get-the-mountable-elements][Get the mountable elements]] - [[#get-the-drive-to-mount][Get the drive to mount]] - [[#mount-a-usb-drive-hard-drive-or-partition][Mount a USB drive, hard drive or partition]] + - [[#mount-an-android-device][Mount an Android device]] + - [[#mount-a-cd-drive][Mount a CD drive]] + - [[#ask-what-type-of-drive-we-want-to-mount][Ask what type of drive we want to mount]] + - [[#launch-the-mounting-functions][Launch the mounting functions]] +- [[#rofiumount][Rofiumount]] + - [[#get-the-unmountable-drives][Get the unmountable drives]] + - [[#unmount-disk-partitions][Unmount disk partitions]] + - [[#unmount-android-device][Unmount Android device]] + - [[#unmount-cd-drive][Unmount CD drive]] + - [[#ask-what-type-of-drive-to-unmount][Ask what type of drive to unmount]] + - [[#launch-the-unmounting-functions][Launch the unmounting functions]] +- [[#starwars][Starwars]] * Presentation :PROPERTIES: @@ -66,9 +79,6 @@ (add-hook 'org-babel-post-tangle-hook 'phundrak/make-tangled-files-executable) #+end_src - #+RESULTS: - | phundrak/make-tangled-files-executable | - * Askpass :PROPERTIES: :CUSTOM_ID: h-b2bef089-69e3-4efb-ac2f-a5eb6a3a80e8 @@ -84,10 +94,23 @@ -p (printf $argv[1] | sed s/://) #+END_SRC +* Dmenu + :PROPERTIES: + :CUSTOM_ID: h-50623ecd-b633-4af7-9cc4-5a032f01d1ee + :HEADER-ARGS: :tangle dmenu :exports code + :END: + I wrote this very simple script in order to replace =dmenu= with rofi’s + emulation of dmenu, since I prefer rofi’s appearance. It basically calls + rofi’s dmenu emulation with the arguments initially passed to dmenu. + #+BEGIN_SRC fish + #!/usr/bin/fish + /usr/bin/rofi -dmenu $argv + #+END_SRC + * Emoji picker :PROPERTIES: :CUSTOM_ID: h-477cd486-c9a6-4d59-bd9d-62d8f08ee62d - :HEADER-ARGS: :tangle rofiemoji :exports code + :HEADER-ARGS: :tangle rofi-emoji :exports code :END: The emoji picker is a simple fish script that uses rofi and [[file:~/.config/emoji.txt][~/.config/emoji.txt]] to provide a small, local search for emojis. Once the @@ -108,13 +131,17 @@ * Rofimount :PROPERTIES: - :HEADER-ARGS: :tangle rofimount :exports code + :HEADER-ARGS: :tangle rofi-mount :exports code :CUSTOM_ID: h-32ee4a66-e7fb-4abf-a168-fa259efdb1f4 :END: =rofimount= is a script inspired by [[https://github.com/ihebchagra/dotfiles/blob/master/.local/bin/dmount][this one]], based on dmenu, which interactively asks the user what to mount, and where to mount it. What I did was replace dmenu with rofi, and fix a couple of bugs I encountered in the - original script. + original script. For the record, this is a fish script. Let’s declare our + shebang. + #+BEGIN_SRC fish + #!/usr/bin/fish + #+END_SRC ** Get the mountable elements :PROPERTIES: @@ -167,9 +194,9 @@ Now, let’s write what type of drives we can mount in this temporary file. #+BEGIN_SRC fish - test -n "$usbdrives" && echo "USB" >> /tmp/drives - test -n "$cddrives" && echo "CD" >> /tmp/drives - test -n "$anddrives" && echo "Android" >> /tmp/drives + test -n "$usbdrives" && echo "USB" >> $TMPDRIVES + test -n "$cddrives" && echo "CD" >> $TMPDRIVES + test -n "$anddrives" && echo "Android" >> $TMPDRIVES #+END_SRC Now, we want to declare where to look for mount directories. For now, we’ll @@ -241,7 +268,9 @@ Remember, we stored those in =$usbdrives= earlier, so let’s pipe them into rofi so we can chose from it. Also, =awk= will get their path in =/dev=. #+BEGIN_SRC fish - set -g chosen (echo $usbdrives | rofi -dmenu -i -p "Mount which drive?" | awk '{print $1}') + set -g chosen (echo $usbdrives | \ + rofi -dmenu -i -p "Mount which drive?" | \ + awk '{print $1}') #+END_SRC As usual after a user selection, let’s verify something has actually been @@ -250,7 +279,494 @@ test -z $chosen && return 1 #+END_SRC + Now, let’s select the mount point of our partition. We’ll call the function + =getmount= described in [[#get-the-drive-to-mount][Get the drive to mount]] to select it. + #+BEGIN_SRC fish + getmount + #+END_SRC + + Let’s verify the variable =mp= set in =getmount= is not empty, otherwise + abort the script. + #+BEGIN_SRC fish + test -z $mp && return 1 + #+END_SRC + + Now, let’s mount it! We’ll use a switch which will detect the filesystem used + so we know how to mount the partition. + #+BEGIN_SRC fish + switch (lsblk -no "fstype" $chosen) + #+END_SRC + + We have two named case: =vfat= filesystems. + #+BEGIN_SRC fish + case "vfat" + sudo -A mount -t vfat $chosen $mp -o rw,umask=0000 + #+END_SRC + + And =ntfs= filesystems. + #+BEGIN_SRC fish + case "ntfs" + sudo -A mount -t ntfs $chosen $mp -o rw,umask=0000 + #+END_SRC + + Else, we’ll let =mount= determine which filesystem is used by the partition + (generally =ext4=). + #+BEGIN_SRC fish + case '*' + sudo -A mount $chosen $mp + #+END_SRC + + We’ll also run a =chown= on this newly mounted filesystem so the user can + access it without any issues. + #+BEGIN_SRC fish + sudo -A chown -R $USER:(id -g $USER) $mp + #+END_SRC + + Let’s close the switch block and send a notification the partition has been + mounted. + #+BEGIN_SRC fish + end && notify-send -a "dmount" "💻 USB mounting" "$chosen mounted to $mp." + #+END_SRC + + And let’s close the function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Mount an Android device + :PROPERTIES: + :CUSTOM_ID: h-af36260f-2c00-43b7-9383-5235ebac9b51 + :END: + The function that manages to mount Android filesystems is =mountandroid=. + Let’s declare it. + #+BEGIN_SRC fish + function mountandroid -d "Mount an Android device" + #+END_SRC + + We’ll select which Android we want to mount. We will be asked through rofi. + #+BEGIN_SRC fish + set chosen (echo $anddrives | rofi -dmenu -i -p "Which Android device?" | awk '{print $1 $2}' | sed 's/,$//') + #+END_SRC + + Now, we need to get the bus of the Android device we want to mount. It will + be useful later, after we authorized mounting from our device, to get the + path to our partition. + #+BEGIN_SRC fish + set bus (echo $chosen | sed 's/,.*//') + #+END_SRC + + Let’s temporarily mount our device. + #+BEGIN_SRC fish + jmtpfs -device=$chosen $mp + #+END_SRC + + Now, we need to allow our computer to mount our Android device. Depending on + the Android version it is running on, we either need to specify our device is + USB connected in order to exchange files, or Android will explicitely ask us + if it is OK for our computer to access it. Let’s inform the user of that. + #+BEGIN_SRC fish + echo "OK" | \ + rofi -dmenu -i -p "Press (Allow) on your phone screen, or set your USB settings to allow file transfert" + #+END_SRC + + Now, let’s get the actual path of our Android filesystem we wish to mount, + and let’s unmount the previous temporary filesystem. + #+BEGIN_SRC fish + set newchosen (jmtpfs -l | grep $bus | awk '{print $1 $2}' | sed 's/,$//') + sudo -A umount $mp + #+END_SRC + + Now we cam mount the new filesystem and send a notification if everything + went well. + #+BEGIN_SRC fish + jmtpfs -device=$newchosen $mp && \ + notify-send -a "dmount" "🤖 Android Mounting" "Android device mounted to $mp." + #+END_SRC + + And now, we can close our function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Mount a CD drive + :PROPERTIES: + :CUSTOM_ID: h-73ff10ea-10aa-4044-9315-2321fff73c3f + :END: + This part is way easier than the previous functions. As we will see, the + function =mountcd='s body is only three lines long. First, let’s declare the + function. + #+BEGIN_SRC fish + function mountcd + #+END_SRC + + Now, let’s chose the CD drive we want to mount using =rofi=. + #+BEGIN_SRC fish + set chosen (echo $cddrives | rofi -dmenu -i -p "Which CD drive?") + #+END_SRC + + We’ll also get the mountpoint thanks to the =getmount= function described + earlier. + #+BEGIN_SRC fish + getmount + #+END_SRC + + And finally, let’s mount it and send the notification everything went well. + #+BEGIN_SRC fish + sudo -A mount $chosen $mp && \ + notify-send -a "dmount" "💿 CD mounting" "$chosen mounted." + #+END_SRC + + Finally, let’s close our function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Ask what type of drive we want to mount + :PROPERTIES: + :CUSTOM_ID: h-0bc6ffba-5c45-44e5-a3d3-039a8ea43905 + :END: + The first thing we will be asked if different types of drives are detected is + which of these types the user wishes to mount. This is done with the function + =asktype= which is declared below. + #+BEGIN_SRC fish + function asktype + #+END_SRC + + We will use a switch statement which will use our anwser to rofi about what + we wish to mount. + #+BEGIN_SRC fish + switch (cat $TMPDRIVES | rofi -dmenu -i -p "Mount which drive?") + #+END_SRC + + If we chose the option "USB", we’ll mount a hard drive, partition or USB + drive. In which case we’ll call the =mountusb= function. + #+BEGIN_SRC fish + case "USB" + mountusb + #+END_SRC + + If we chose the "Android" option, the =mountandroid= function is called. + #+BEGIN_SRC fish + case "Android" + mountandroid + #+END_SRC + + Else if we chose the "CD" option, we’ll call the =mountcd= function. + #+BEGIN_SRC fish + case "CD" + mountcd + #+END_SRC + If nothing is selected, the function will naturally exit. Now, let’s close + our switch statement and our function. + #+BEGIN_SRC fish + end + end + #+END_SRC + +** Launch the mounting functions + :PROPERTIES: + :CUSTOM_ID: h-646dc678-4d87-4fec-8130-5d7d0fc16756 + :END: + Now that we have declared our functions and set our variables, we’ll read the + temporary file described in [[#get-the-mountable-elements][Get the mountable elements]]. The amount of lines + is passed in a switch statement. + #+BEGIN_SRC fish + switch (wc -l < $TMPDRIVES) + #+END_SRC + + If the file has no lines, i.e. it is empty, we have no mountable media. Let’s + inform our user this is the case. + #+BEGIN_SRC fish + case 0 + notify-send "No USB drive or Android device or CD detected" -a "dmount" + #+END_SRC + + If we only have one line, we have only one type of mountable media. We’ll + pass this line to a second switch statement. + #+BEGIN_SRC fish + case 1 + switch (cat $TMPDRIVES) + #+END_SRC + This will allow the script to automatically detect what type of media it is, + and mount the corresponding function. + #+BEGIN_SRC fish + case "USB" + mountusb + case "Android" + mountandroid + case "CD" + mountCD + #+END_SRC + Let’s close this nested switch case. + #+BEGIN_SRC fish + end + #+END_SRC + + If we have more than one line, we’ll have to ask the user what type of media + they want to mount. + #+BEGIN_SRC fish + case '*' + asktype + #+END_SRC + + Now, let’s end our switch statement! + #+BEGIN_SRC fish + end + #+END_SRC + + Finally, we’ll delete our temporary file. + #+BEGIN_SRC fish + rm -f $TMPDRIVES + #+END_SRC + + And with that, this is the end of our script! + +* Rofiumount + :PROPERTIES: + :CUSTOM_ID: h-68a1f671-5dc6-4120-81c8-c94fffa7d7a3 + :HEADER-ARGS: :tangle rofi-umount :exports code + :END: + =rofiumount= is the counterpart of =rofimount= for unmounting our mounted + partitions. It is a fish script, so let’s declare it as that with its shebang. + #+BEGIN_SRC fish + #!/usr/bin/fish + #+END_SRC + +** Get the unmountable drives + :PROPERTIES: + :CUSTOM_ID: h-dab41471-4f69-4be8-8d77-58ccc604e4e2 + :END: + First, we will need to list all the drives that can be safely unmounted. + Let’s run this. + #+BEGIN_SRC fish + set -g drives (lsblk -nrpo "name,type,size,mountpoint" | \ + awk '$2=="part"&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}') + #+END_SRC + + Now, let’s get the android devices that are mounted. + #+BEGIN_SRC fish + set -g androids (awk '/jmtpfs/ {print $2}' /etc/mtab) + #+END_SRC + + And let’s get the CD drives that are mounted. + #+BEGIN_SRC fish + set -g cds (awk '/sr0/ {print $2}' /etc/mtab) + #+END_SRC + + We’ll store all of our information in a temporary file, =/tmp/undrives=. + #+BEGIN_SRC fish + set -g undrivefile /tmp/undrives + #+END_SRC + + Let’s make sure we begin with a clean, empty file. + #+BEGIN_SRC fish + rm -f $undrivefile + touch $undrivefile + #+END_SRC + + Depending on if the related variables are set, write the different types of + mounted drives in the temporary file. + #+BEGIN_SRC fish + test -n "$drives" && echo "USB" >> $undrivefile + test -n "$cds" && echo "CD" >> $undrivefile + test -n "$androids" && echo "Android" >> $undrivefile + #+END_SRC + +** Unmount disk partitions + :PROPERTIES: + :CUSTOM_ID: h-01c37335-5ae8-484f-911a-a08cc4679398 + :END: + The function =unmountusb= will take care of unmounting any drive we can + safely unmount. First, let’s declare the function. + #+BEGIN_SRC fish + function unmountusb + #+END_SRC + + Let’s chose the drive to unmount with rofi. + #+BEGIN_SRC fish + set chosen (echo $drives | \ + rofi -dmenu -i -p "Unmount which drive?" | \ + awk '{print $1}') + #+END_SRC + + Let’s verify if the user actually selected any drive. If no, let’s abort the + script. + #+BEGIN_SRC fish + test -z "$chosen" && exit 0 + #+END_SRC + + Now, let’s unmount the chosen drive and send a notification if it has been + done. Otherwise, a notification will be sent, saying the operation failed. + #+BEGIN_SRC fish + sudo -A umount $chosen && \ + notify-send "💻 USB unmounting" "$chosen unmounted." -a "dumount" || \ + notify-send "💻 USB unmounting" "$chosen unmounting failed." -a "dumount" + #+END_SRC + + Now, let’s close the function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Unmount Android device + :PROPERTIES: + :CUSTOM_ID: h-d7d2a12e-c759-4dbe-a17b-bb90c514dca2 + :END: + The function =unmountandroid= will take care of unmounting any mounted + Android device. First, let’s declare our function. + #+BEGIN_SRC fish + function unmountandroid + #+END_SRC + + Let the user choose which Android device to unmount. + #+BEGIN_SRC fish + set chosen (echo $androids | rofi -dmenu -i -p "Unmount which device?") + #+END_SRC + + We’ll verify the user chose any device. + #+BEGIN_SRC fish + test -z "$chosen" && exit 0 + #+END_SRC + + If a device has been chosen, let’s unmount it and send a notification whether + it has been successfuly unmounted. + #+BEGIN_SRC fish + sudo -A umount -l $chosen && | + notify-send "🤖 Android unmounting" "$chosen unmounted." -a "dumount" || \ + notify-send "🤖 Android unmounting" "$chosen failed to unmount." -a "dumount" + #+END_SRC + Finally, let’s close the function. #+BEGIN_SRC fish end #+END_SRC + +** Unmount CD drive + :PROPERTIES: + :CUSTOM_ID: h-ae7a8a83-f022-493c-8410-ad99abf42b89 + :END: + =unmountcd= will take care of unmounting any mounted CD drive. Let’s declare + this function. + #+BEGIN_SRC fish + function unmountcd + #+END_SRC + + As before, let the user chose which CD drive to unmount. + #+BEGIN_SRC fish + set chosen (echo "$cds" | rofi -dmenu -i -p "Unmount which CD?") + #+END_SRC + + We’ll verify the user chose any device. + #+BEGIN_SRC fish + test -z "$chosen" && exit 0 + #+END_SRC + + If a drive has been chosen, let’s unmount it and send a notification whether + it has been successfuly unmounted. + #+BEGIN_SRC fish + sudo -A umount -l $chosen && \ + notify-send "💿 CD unmounting" "$chosen unmounted." -a "dumount" || \ + notify-send "💿 CD unmounting" "$chosen failed to unmount." -a "dumount" + #+END_SRC + + Now, let’s close the function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Ask what type of drive to unmount + :PROPERTIES: + :CUSTOM_ID: h-4320a68b-8369-4ac5-a049-cfb12435e45e + :END: + If several types of unmountable drives are available, let’s ask the user + which type to unmount based on the content of the temporary file declared in + [[#get-the-unmountable-drives][Get the unmountable drives]]. First, let’s declare the function. + #+BEGIN_SRC fish + function asktype + #+END_SRC + + Let’s create a switch statement to which will be passed the selection of the + user from rofi. + #+BEGIN_SRC fish + switch (cat $undrivefile | rofi -dmenu -i -p "Unmount which type of device?") + #+END_SRC + + Three types of values can be returned: "USB", "CD", or "Android". These + values will be used to launch their corresponding function. + #+BEGIN_SRC fish + case 'USB' + unmountusb + case 'CD' + unmountcd + case 'Android' + unmountandroid + #+END_SRC + + Let’s close the switch statement. + #+BEGIN_SRC fish + end + #+END_SRC + + Let’s now close the function. + #+BEGIN_SRC fish + end + #+END_SRC + +** Launch the unmounting functions + :PROPERTIES: + :CUSTOM_ID: h-5880963f-1403-41dc-ae7a-3958e2013fa9 + :END: + Now back to the body of our script, let’s input in a switch case the number + of lines contained in our temporary file. + #+BEGIN_SRC fish + switch (wc -l < $undrivefile) + #+END_SRC + + If the file containes no lines. i.e. it is empty, nothing is to be unmounted. + Let’s inform the user of that. + #+BEGIN_SRC fish + case 0 + notify-send "No USB drive or Android device or CD to unmount" -a "dumount" + #+END_SRC + + Else, if there is only one type of drive, we’ll automatically let our script + choose based on the content of this sole line. + #+BEGIN_SRC fish + case 1 + switch (cat $undrivefile) + case 'USB' + unmountusb + case 'CD' + unmountcd + case 'Android' + unmountandroid + end + #+END_SRC + + And if there are more types than one, let’s ask the user. + #+BEGIN_SRC fish + case '*' + asktype + #+END_SRC + + Let’s close our main switch statement. + #+BEGIN_SRC fish + end + #+END_SRC + + And finally, let’s delete our temporary file. + #+BEGIN_SRC fish + rm -f $undrivefile + #+END_SRC + +* Starwars + :PROPERTIES: + :CUSTOM_ID: h-127de2b2-d84b-4508-89d2-b4577e8dbece + :HEADER-ARGS: :tangle starwars :exports code + :END: + This is a one-liner that allows you to watch Star Wars episode 4 in ASCII art + in your terminal. Here is the code: + #+BEGIN_SRC fish + #!/usr/bin/fish + telnet towel.blinkenlights.nl + #+END_SRC diff --git a/.local/bin/dmenu b/.local/bin/dmenu new file mode 100755 index 0000000..38ad158 --- /dev/null +++ b/.local/bin/dmenu @@ -0,0 +1,2 @@ +#!/usr/bin/fish +/usr/bin/rofi -dmenu $argv diff --git a/.local/bin/dmount b/.local/bin/dmount deleted file mode 100755 index 27db7a7..0000000 --- a/.local/bin/dmount +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/fish -# -*- mode: fish -*- -# Gives a dmenu prompt to mount unmounted drives. -# If they’re in /etc/fstab, they’ll be mounted automatically. -# Otherwise, you’ll be prompted to give a mountpoint from already existing directories. -# If you input a novel directory, it will prompt you to create that directory. - -# Inspired from https://github.com/ihebchagra/dotfiles/blob/master/.local/bin/dmount - -begin - set -l LFS - set a (math (jmtpfs -l | wc -l) - 2) # test if any android device is connected - test $a -ge 0 && jmtpfs -l 2> /dev/null | tail -n $a | read -z anddrives - lsblk -rpo "name,type,size,mountpoint" | awk '$2=="part"&&$4==""{printf "%s (%s)\n",$1,$3}' | read -z usbdrives - blkid /dev/sr0 | awk '{print $1}' | sed 's/://' | read -z cddrives -end -set -g basemount /mnt -rm -f /tmp/drives -touch /tmp/drives -test -n "$usbdrives" && echo "USB" >> /tmp/drives -test -n "$cddrives" && echo "CD" >> /tmp/drives -test -n "$anddrives" && echo "Android" >> /tmp/drives - -function getmount -d "Get the directory in which the device will be mounted" - set -g mp (for d in $basemount - find $d -maxdepth 5 -type d - end | rofi -dmenu -i -p 'Type in mount point.') - if test -z $mp || test $mp = "" - return 1 - end - if test ! -d $mp - switch (printf "No\\nYes" | rofi -dmenu -i -p "$mp does not exist. Create it?") - case 'Yes' - mkdir -p $mp || sudo -A mkdir -p $mp - case '*' - return 1 - end - end -end - -function mountusb -d "Mount a USB device" - set -g chosen (echo $usbdrives | rofi -dmenu -i -p "Mount which drive?" | awk '{print $1}') - test -z $chosen && return 1 - set -g alreadymounted (lsblk -nrpo "name,type,mountpoint" | awk '$2=="part"&&$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) \n",$3}') - getmount - test -z $mp && return 1 - switch (lsblk -no "fstype" $chosen) - case "vfat" - sudo -A mount -t vfat $chosen $mp -o rw,umask=0000 - case "ntfs" - sudo -A mount -t ntfs $chosen $mp -o rw,umask=0000 - case '*' - sudo -A mount $chosen $mp - set user (whoami) - sudo -A chown -R $user:users $mp - end && notify-send -a "dmount" "💻 USB mounting" "$chosen mounted to $mp." -end - -function mountandroid -d "Mount an Android device" - set chosen (echo $anddrives | rofi -dmenu -i -p "Which Android device?" | awk '{print $1 $2}' | sed 's/,$//') - set bus (echo $chosen | sed 's/,.*//') - getmount "$HOME -maxdepth 3 -type d" - jmtpfs -device=$chosen $mp - echo "OK" | rofi -dmenu -i -p "Press (Allow) on your phone screen" - set newchosen (jmtpfs -l | grep $bus | awk '{print $1 $2}' | sed 's/,$//') - echo $newchosen - sudo -A umount $mp - jmtpfs -device=$newchosen $mp - notify-send -a "dmount" "🤖 Android Mounting" "Android device mounted to $mp." -end - -function mountcd - set chosen (echo $cddrives) - getmount "$HOME -maxdepth 3 -type d" - sudo -A mount $chosen $mp && notify-send -a "dmount" "💿 CD mounting" "$chosen mounted." && exit 0 -end - -function asktype - cat /tmp/drives - switch (cat /tmp/drives | rofi -dmenu -i -p "Mount which drive?") - case "USB" - mountusb - case "Android" - mountandroid - case "CD" - mountcd - end -end - -switch (wc -l < /tmp/drives) - case 0 - notify-send "No USB drive or Android device or CD detected" -a "dmount" - case 1 - switch (cat /tmp/drives) - case "USB" - mountusb - case "Android" - mountandroid - case CD - mountCD - end - case '*' - asktype -end -rm /tmp/drives diff --git a/.local/bin/dumount b/.local/bin/dumount deleted file mode 100755 index 4a09d41..0000000 --- a/.local/bin/dumount +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/fish -# -*- mode: fish -*- -# A dmenu prompt to unmount drives. -# Provides you with mounted partitions, select one to unmount. -# Drives mounted at /, /boot and /home will not be options to unmount. - -# From https://github.com/ihebchagra/dotfiles/blob/master/.local/bin/dumount - -set -g drives (lsblk -nrpo "name,type,size,mountpoint" | awk '$2=="part"&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}') -set -g androids (awk '/jmtpfs/ {print $2}' /etc/mtab) -set -g cds (awk '/sr0/ {print $2}' /etc/mtab) -set -g undrivefile /tmp/undrives -rm -f $undrivefile -touch $undrivefile -test -n "$drives" && echo "USB" >> $undrivefile -test -n "$cds" && echo "CD" >> $undrivefile -test -n "$androids" && echo "Android" >> $undrivefile - -function unmountusb - test -z "$drives" && rm $undrivefile && return 0 - set chosen (echo $drives | rofi -dmenu -i -p "Unmount which drive?" | awk '{print $1}') - test -z "$chosen" && rm $undrivefile && return 0 - sudo -A umount $chosen && notify-send "💻 USB unmounting" "$chosen unmounted." -a "dumount" -end - -function unmountandroid - set chosen (echo $androids | rofi -dmenu -i -p "Unmount which device?") - test -z "$chosen" && rm $undrivefile && return 0 - sudo -A umount -l $chosen && notify-send "🤖 Android unmounting" "$chosen unmounted." -a "dumount" -end - -function unmountcd - set chosen (echo "$cds" | rofi -dmenu -i -p "Unmount which CD?") - test -z "$chosen" && rm $undrivefile && return 0 - sudo -A umount -l $chosen && notify-send "💿 CD unmounting" "$chosen unmounted." -a "dumount" -end - -function asktype - switch (cat $undrivefile | rofi -dmenu -i -p "Unmount which type of device?") - case 'USB' - unmountusb - case 'CD' - unmountcd - case 'Android' - unmountandroid - end -end - -switch (wc -l < $undrivefile) - case 0 - notify-send "No USB drive or Android device or CD to unmount" -a "dumount" - case 1 - switch (cat $undrivefile) - case 'USB' - unmountusb - case 'CD' - unmountcd - case 'Android' - unmountandroid - end -end diff --git a/.local/bin/rofi-emoji b/.local/bin/rofi-emoji new file mode 100755 index 0000000..453c7f5 --- /dev/null +++ b/.local/bin/rofi-emoji @@ -0,0 +1,6 @@ +#!/usr/bin/fish +grep -v "#" ~/.config/emoji.txt | rofi -dmenu -i | awk '{print $1}' | tr -d '\n' | xclip -selection clipboard + +set emoji (xclip -o -selection clipboard | tr -d '\n') +set -a emoji "copied to clipboard" +pgrep -x dunst >/dev/null && notify-send $emoji diff --git a/.local/bin/rofi-mount b/.local/bin/rofi-mount new file mode 100755 index 0000000..4d4c929 --- /dev/null +++ b/.local/bin/rofi-mount @@ -0,0 +1,146 @@ +#!/usr/bin/fish + +begin + +set -l LFS + +set -l a (math (jmtpfs -l | wc -l) - 2) +test $a -ge 0 && jmtpfs -l 2> /dev/null | tail -n $a | read -zg anddrives + +lsblk -rpo "name,type,size,mountpoint" | \ +awk '$2=="part"&&$4==""{printf "%s (%s)\n",$1,$3}' | \ +read -zg usbdrives + +blkid /dev/sr0 | awk '{print $1}' | sed 's/://' | read -z cddrives + +end + +set -g TMPDRIVES /tmp/drives +rm -f $TMPDRIVES +touch $TMPDRIVES + +test -n "$usbdrives" && echo "USB" >> $TMPDRIVES +test -n "$cddrives" && echo "CD" >> $TMPDRIVES +test -n "$anddrives" && echo "Android" >> $TMPDRIVES + +set -g basemount /mnt + +function getmount + +set -g mp (for d in $basemount + find $d -maxdepth 5 -type d +end | rofi -dmenu -i -p 'Type in mount point.') + +if test -z $mp || test $mp = "" + return 1 +end + +if test ! -d $mp + switch (printf "No\\nYes" | rofi -dmenu -i -p "$mp does not exist. Create it?") + case 'Yes' + mkdir -p $mp || sudo -A mkdir -p $mp + case '*' + return 1 + end +end + +end + +function mountusb + +set -g chosen (echo $usbdrives | \ +rofi -dmenu -i -p "Mount which drive?" | \ +awk '{print $1}') + +test -z $chosen && return 1 + +getmount + +test -z $mp && return 1 + +switch (lsblk -no "fstype" $chosen) + +case "vfat" + sudo -A mount -t vfat $chosen $mp -o rw,umask=0000 + +case "ntfs" + sudo -A mount -t ntfs $chosen $mp -o rw,umask=0000 + +case '*' + sudo -A mount $chosen $mp + +sudo -A chown -R $USER:(id -g $USER) $mp + +end && notify-send -a "dmount" "💻 USB mounting" "$chosen mounted to $mp." + +end + +function mountandroid -d "Mount an Android device" + +set chosen (echo $anddrives | rofi -dmenu -i -p "Which Android device?" | awk '{print $1 $2}' | sed 's/,$//') + +set bus (echo $chosen | sed 's/,.*//') + +jmtpfs -device=$chosen $mp + +echo "OK" | \ +rofi -dmenu -i -p "Press (Allow) on your phone screen, or set your USB settings to allow file transfert" + +set newchosen (jmtpfs -l | grep $bus | awk '{print $1 $2}' | sed 's/,$//') +sudo -A umount $mp + +jmtpfs -device=$newchosen $mp && \ +notify-send -a "dmount" "🤖 Android Mounting" "Android device mounted to $mp." + +end + +function mountcd + +set chosen (echo $cddrives | rofi -dmenu -i -p "Which CD drive?") + +getmount + +sudo -A mount $chosen $mp && \ +notify-send -a "dmount" "💿 CD mounting" "$chosen mounted." + +end + +function asktype + +switch (cat $TMPDRIVES | rofi -dmenu -i -p "Mount which drive?") + +case "USB" + mountusb + +case "Android" + mountandroid + +case "CD" + mountcd + +end +end + +switch (wc -l < $TMPDRIVES) + +case 0 + notify-send "No USB drive or Android device or CD detected" -a "dmount" + +case 1 + switch (cat $TMPDRIVES) + +case "USB" + mountusb +case "Android" + mountandroid +case "CD" + mountCD + +end + +case '*' + asktype + +end + +rm -f $TMPDRIVES diff --git a/.local/bin/rofi-umount b/.local/bin/rofi-umount new file mode 100755 index 0000000..89da6ef --- /dev/null +++ b/.local/bin/rofi-umount @@ -0,0 +1,92 @@ +#!/usr/bin/fish + +set -g drives (lsblk -nrpo "name,type,size,mountpoint" | \ +awk '$2=="part"&&$4!~/\/boot|\/home$|SWAP/&&length($4)>1{printf "%s (%s)\n",$4,$3}') + +set -g androids (awk '/jmtpfs/ {print $2}' /etc/mtab) + +set -g cds (awk '/sr0/ {print $2}' /etc/mtab) + +set -g undrivefile /tmp/undrives + +rm -f $undrivefile +touch $undrivefile + +test -n "$drives" && echo "USB" >> $undrivefile +test -n "$cds" && echo "CD" >> $undrivefile +test -n "$androids" && echo "Android" >> $undrivefile + +function unmountusb + +set chosen (echo $drives | \ +rofi -dmenu -i -p "Unmount which drive?" | \ +awk '{print $1}') + +test -z "$chosen" && exit 0 + +sudo -A umount $chosen && \ +notify-send "💻 USB unmounting" "$chosen unmounted." -a "dumount" || \ +notify-send "💻 USB unmounting" "$chosen unmounting failed." -a "dumount" + +end + +function unmountandroid + +set chosen (echo $androids | rofi -dmenu -i -p "Unmount which device?") + +test -z "$chosen" && exit 0 + +sudo -A umount -l $chosen && | +notify-send "🤖 Android unmounting" "$chosen unmounted." -a "dumount" || \ +notify-send "🤖 Android unmounting" "$chosen failed to unmount." -a "dumount" + +end + +function unmountcd + +set chosen (echo "$cds" | rofi -dmenu -i -p "Unmount which CD?") + +test -z "$chosen" && exit 0 + +sudo -A umount -l $chosen && \ +notify-send "💿 CD unmounting" "$chosen unmounted." -a "dumount" || \ +notify-send "💿 CD unmounting" "$chosen failed to unmount." -a "dumount" + +end + +function asktype + +switch (cat $undrivefile | rofi -dmenu -i -p "Unmount which type of device?") + +case 'USB' + unmountusb +case 'CD' + unmountcd +case 'Android' + unmountandroid + +end + +end + +switch (wc -l < $undrivefile) + +case 0 + notify-send "No USB drive or Android device or CD to unmount" -a "dumount" + +case 1 + switch (cat $undrivefile) + case 'USB' + unmountusb + case 'CD' + unmountcd + case 'Android' + unmountandroid + end + +case '*' + asktype + +end + +rm -f $undrivefile