This commit is contained in:
altffour 2021-02-20 20:14:05 +03:00
parent 48d44e32a7
commit 8b0f5c8157
No known key found for this signature in database
GPG Key ID: 976939521A14589F
39 changed files with 1637 additions and 318 deletions

View File

@ -24,5 +24,8 @@ esac
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
#export PS1="\[\033[38;5;6m\][\[$(tput sgr0)\]\[\033[38;5;83m\]\u\[$(tput sgr0)\]\[\033[38;5;77m\]@\[$(tput sgr0)\]\[\033[38;5;112m\]\h\[$(tput sgr0)\] \[$(tput sgr0)\]\[\033[38;5;42m\]\W\[$(tput sgr0)\]\[\033[38;5;6m\]]\[$(tput sgr0)\]\[\033[38;5;81m\]\\$\[$(tput sgr0)\] \[$(tput sgr0)\]"
export PS1="[\W] \\$ "
set -o vi
source ~/.config/env
source "/home/dizzy/.local/share/cargo/env"

View File

@ -96,7 +96,7 @@ font:
# - (macOS) Menlo
# - (Linux/BSD) monospace
# - (Windows) Consolas
family: Terminus
family: iosevka
# The `style` can be specified to pick a specific face.
style: Regular
@ -107,7 +107,7 @@ font:
#
# If the bold family is not specified, it will fall back to the
# value specified for the normal font.
family: Terminus
family: iosevka
# The `style` can be specified to pick a specific face.
style: Bold
@ -118,7 +118,7 @@ font:
#
# If the italic family is not specified, it will fall back to the
# value specified for the normal font.
family: Terminus
family: iosevka
# The `style` can be specified to pick a specific face.
style: Italic
@ -129,13 +129,13 @@ font:
#
# If the bold italic family is not specified, it will fall back to the
# value specified for the normal font.
family: Terminus
family: iosevka
# The `style` can be specified to pick a specific face.
style: Bold Italic
# Point size
size: 11.0
size: 9.0
# Offset is the extra space around each character. `offset.y` can be thought of
# as modifying the line spacing, and `offset.x` as modifying the letter spacing.
@ -163,15 +163,15 @@ font:
colors:
# Default colors
primary:
background: '#1d1f21'
foreground: '#c5c8c6'
background: '#000000'
foreground: '#FFFFFF'
# Bright and dim foreground colors
#
# The dimmed foreground color is calculated automatically if it is not present.
# If the bright foreground color is not set, or `draw_bold_text_with_bright_colors`
# is `false`, the normal foreground color will be used.
dim_foreground: '#828482'
dim_foreground: '#FFFFFF'
bright_foreground: '#eaeaea'
# Cursor colors
@ -310,7 +310,7 @@ colors:
#
# Window opacity as a floating point number from `0.0` to `1.0`.
# The value `0.0` is completely transparent and `1.0` is opaque.
background_opacity: 1.00
background_opacity: 0.95
#selection:
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"

View File

@ -11,7 +11,7 @@
binlist=(
#'~/.config/cdm/dwm-cdm' # Launch dwm,
'startx ~/.config/cdm/dwm-xinit' # Launch dwm,
'startx ~/.config/cdm/lxde-xinit' # Launch lxde desktop,
'startx ~/.config/cdm/gnome-cdm' # Launch guh-nome desktop,
'startx ~/.config/cdm/mate-xinit' # Launch mate desktop,
'/bin/bash --login' # Execute your Shell,
'reboot' # Reboot
@ -22,7 +22,7 @@ binlist=(
# Names with whitespaces should be quoted or escaped.
#
# (Continued example:)
namelist=('dwm' 'LXDE' 'MATE' 'Console' 'Reboot' 'Shutdown')
namelist=('dwm' 'gnome' 'MATE' 'Console' 'Reboot' 'Shutdown')
# Type of the programs, one-by-one matched with $binlist.
# `C' for *C*onsole programs, which would be `exec'ed.

View File

@ -1,6 +1,5 @@
exec feh --no-fehbg --bg-fill ~/proj/sysconf/wallpapers/wallpaper &
exec rm -r ~/.cache/wal &
exec wal -i ~/proj/sysconf/wallpapers/wallpaper &
exec rm ~/.cache/wal/ &
#exec statusbar &
exec slstatus &
exec picom --config ~/.config/picom.conf &
@ -10,6 +9,7 @@ exec xrandr --auto --output HDMI1 --mode 1024x768 --right-of eDP1 &
exec /usr/lib/kdeconnectd &
#exec dunst &
exec xmodmap ~/.config/Xmodmap &
exec xrdb -merge ~/.cache/wal/colors.Xresources &
exec xrdb ~/.cache/wal/colors.Xresources &
exec source ~/.config/env &
exec xscreensaver -no-splash &
exec dbus-launch dwm

View File

@ -4,6 +4,7 @@
export XDG_CONFIG_HOME="$HOME/.config"
export XDG_CACHE_HOME="$HOME/.cache"
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_BIN_HOME="$HOME/.local/bin"
# Default Programs
export EDITOR="nvim"
@ -12,6 +13,7 @@ export TERMINAL="alacritty"
export BROWSER="firefox"
export PATH="$XDG_DATA_HOME/gem/bin:$PATH"
export PATH="$XDG_BIN_HOME:$PATH"
export GPG_TTY=$(tty)

View File

@ -0,0 +1,29 @@
# Firejail profile for Librewolf
# Description: Firefox fork based on privacy
# This file is overwritten after every install/update
# Persistent local customizations
include librewolf.local
# Persistent global definitions
include globals.local
noblacklist ${HOME}/.cache/librewolf
noblacklist ${HOME}/.librewolf
mkdir ${HOME}/.cache/librewolf
mkdir ${HOME}/.librewolf
whitelist ${HOME}/.cache/librewolf
whitelist ${HOME}/.librewolf
whitelist ${HOME}/dl
# Uncomment (or add to librewolf.local) the following lines if you want to
# use the migration wizard.
#noblacklist ${HOME}/.mozilla
#whitelist ${HOME}/.mozilla
# librewolf requires a shell to launch on Arch. We can possibly remove sh though.
#private-bin bash,dbus-launch,dbus-send,env,librewolf,python*,sh,which
# private-etc must first be enabled in firefox-common.profile
#private-etc librewolf
# Redirect
include firefox-common.profile

View File

@ -1,50 +1,72 @@
# Firejail profile for Newsboat
# Description: RSS program
# This file is overwritten after every install/update
# Persistent local customizations
include newsboat.local
# Persistent global definitions
include globals.local
noblacklist ${HOME}/.config/newsboat
#include default.profile
include disable-common.inc
include disable-devel.inc
include disable-exec.inc
include disable-interpreters.inc
include disable-passwdmgr.inc
include disable-programs.inc
include disable-xdg.inc
mkdir ${HOME}/.config/newsboat
whitelist ${HOME}/.config/newsboat
include whitelist-common.inc
include whitelist-runuser-common.inc
include whitelist-var-common.inc
caps.drop all
ipc-namespace
netfilter
no3d
nodvd
nogroups
nonewprivs
noroot
notv
nou2f
novideo
protocol inet,inet6
seccomp
shell none
disable-mnt
private-bin newsboat
private-cache
private-dev
private-etc alternatives,ca-certificates,crypto-policies,pki,resolv.conf,ssl,terminfo
private-tmp
dbus-user none
dbus-system none
memory-deny-write-execute
#include newsboat.local
## Persistent global definitions
#include globals.local
#
#noblacklist ${HOME}/.config/newsboat
#noblacklist ${HOME}/.cache/newsboat
#noblacklist ${HOME}/vimwiki/news/
#whitelist ${HOME}/.config/newsboat
#whitelist ${HOME}/.cache/newsboat
#whitelist ${HOME}/vimwiki/news/
#
### mpv
##private-bin mpv
##whitelist ${HOME}/.config/mpv
##whitelist ${HOME}/.config/youtube-dl
##whitelist ${HOME}/.netrc
##include whitelist-common.inc
##include whitelist-players.inc
##whitelist /usr/share/lua
##whitelist /usr/share/lua*
##whitelist /usr/share/vulkan
##include whitelist-usr-share-common.inc
##include whitelist-var-common.inc
##private-bin env,mpv,python*,waf,youtube-dl
#
## Lynx private-bin sh,gzip,lynx
##private-etc lynx.cfg,lynx.lss
#
#include disable-common.inc
#include disable-devel.inc
#include disable-exec.inc
#include disable-interpreters.inc
#include disable-passwdmgr.inc
#include disable-programs.inc
#include disable-xdg.inc
#
##mkdir ${HOME}/.newsboat
#whitelist ${HOME}/.newsboat
#include whitelist-common.inc
#
#apparmor
#caps.drop all
#ipc-namespace
#netfilter
#no3d
#nodvd
#nogroups
#nonewprivs
#noroot
#notv
#nou2f
#novideo
#protocol unix,inet,inet6,netlink
#seccomp
#shell none
#
#disable-mnt
#private-bin newsboat
#private-cache
#private-dev
#private-etc alternatives,ca-certificates,crypto-policies,pki,resolv.conf,ssl,terminfo
#private-tmp
#
#dbus-user none
#dbus-system none
#
#memory-deny-write-execute

View File

@ -1,56 +0,0 @@
# Firejail profile for transmission-common
# Description: Fast, easy and free BitTorrent client
# This file is overwritten after every install/update
# Persistent local customizations
include transmission-common.local
# Persistent global definitions
# added by caller profile
#include globals.local
noblacklist ${HOME}/.cache/transmission
noblacklist ${HOME}/.config/transmission
noblacklist ${HOME}/dox/torrents
include disable-common.inc
include disable-devel.inc
include disable-exec.inc
include disable-interpreters.inc
include disable-passwdmgr.inc
include disable-programs.inc
mkdir ${HOME}/.cache/transmission
mkdir ${HOME}/.config/transmission
mkdir ${HOME}/dox/torrents
whitelist ${DOWNLOADS}
whitelist ${HOME}/.cache/transmission
whitelist ${HOME}/.config/transmission
whitelist ${HOME}/dox/torrents
include whitelist-common.inc
include whitelist-usr-share-common.inc
include whitelist-var-common.inc
apparmor
caps.drop all
machine-id
netfilter
nodvd
nonewprivs
noroot
nosound
notv
nou2f
novideo
protocol unix,inet,inet6
seccomp
shell none
tracelog
private-cache
private-dev
private-lib
private-tmp
dbus-user none
dbus-system none
memory-deny-write-execute

View File

@ -1,50 +0,0 @@
# Firejail profile for virtualbox
# Description: x86 virtualization solution
# This file is overwritten after every install/update
# Persistent local customizations
include virtualbox.local
# Persistent global definitions
include globals.local
noblacklist ${HOME}/.VirtualBox
noblacklist ${HOME}/.config/VirtualBox
noblacklist ${HOME}/VirtualBox VMs
# noblacklist /usr/bin/virtualbox
noblacklist /usr/lib/virtualbox
noblacklist /usr/lib64/virtualbox
include disable-common.inc
include disable-devel.inc
include disable-exec.inc
include disable-interpreters.inc
include disable-passwdmgr.inc
include disable-programs.inc
include disable-xdg.inc
mkdir ${HOME}/.config/VirtualBox
mkdir ${HOME}/VirtualBox VMs
whitelist ${HOME}/.config/VirtualBox
whitelist ${HOME}/VirtualBox VMs
whitelist ${DOWNLOADS}
whitelist /usr/share/virtualbox
include whitelist-common.inc
include whitelist-runuser-common.inc
include whitelist-usr-share-common.inc
include whitelist-var-common.inc
# For host-only network sys_admin is needed. See https://github.com/netblue30/firejail/issues/2868#issuecomment-518647630
caps.keep net_raw,sys_nice
netfilter
nodvd
#nogroups
notv
shell none
tracelog
#disable-mnt
private-cache
private-etc alsa,asound.conf,ca-certificates,conf.d,crypto-policies,dconf,fonts,hostname,hosts,ld.so.cache,localtime,machine-id,pki,pulse,resolv.conf,ssl
dbus-user none
dbus-system none

View File

@ -1527,7 +1527,7 @@ SAVE_SPACE:~/dl/
.h2 EMACS_KEYS_ALWAYS_ON
# Vi or Emacs movement keys, i.e. familiar hjkl or ^N^P^F^B .
# These are defaults, which can be changed in the Options Menu or .lynxrc .
#VI_KEYS_ALWAYS_ON:FALSE
VI_KEYS_ALWAYS_ON:TRUE
#EMACS_KEYS_ALWAYS_ON:FALSE
.h2 DEFAULT_KEYPAD_MODE

View File

@ -1,16 +1,43 @@
# -- feeds
auto-reload yes
reload-threads 100
reload-threads 4
download-retries 4
download-timeout 10
cache-file "~/.config/newsboat/cache.db"
# unbind keys
unbind-key j
unbind-key k
unbind-key J
unbind-key K
# -- display
text-width 80
# bind keys - vim style
bind-key j down
bind-key k up
bind-key l open
bind-key h quit
# -- navigation
goto-next-feed no
browser "lynx -nocolor"
bind-key j down feedlist
bind-key k up feedlist
bind-key j next articlelist
bind-key k prev articlelist
bind-key J next-feed articlelist
bind-key K prev-feed articlelist
bind-key j down article
bind-key k up article
# -- macros
macro m set browser "mpv --ytdl %u --profile=360p > /dev/null &"; open-in-browser ; set browser "lynx -nocolor"
macro a set browser "echo %u | xclip -sel clip"; open-in-browser ; set browser "lynx -nocolor"
# -- podboat
delete-played-files no
download-path "~/dox/pod/%h/%n"
max-downloads 4
player "play"
# -- color
color listfocus white black bold
color listfocus_unread white black bold
color info white black bold
#color article white black
# -- misc
unbind-key C feedlist
confirm-exit no
cleanup-on-quit no

View File

@ -1,35 +0,0 @@
-----------------------
-------NEWSFEEDS-------
-----------------------
https://xkcd.com/atom.xml "~XKCD"
https://www.linuxjournal.com/news.rss
https://itsfoss.com/feed "~ItsFOSS"
https://archlinux.org/feeds/packages/added/x86_64 "~ArchWiki: Added Packages"
https://archlinux.org/feeds/packages/removed/x86_64 "~ArchWiki: Removed Packages"
https://opensource.org/news.xml "~Opensource News"
https://security.archlinux.org/ "~ArchLinux Security Issues"
https://www.welivesecurity.com/feed "~WeLiveSecurity RSS"
-----------------------
-------YOUTUBE---------
-----------------------
-----------------------
-------REDDIT----------
-----------------------
https://www.reddit.com/r/linux.rss "~REDDIT: r/linux"
https://www.reddit.com/r/archlinux.rss "~REDDIT: r/archlinux"
https://www.reddit.com/r/Gentoo.rss "~REDDIT: r/gentoo"
https://www.reddit.com/r/debian.rss "~REDDIT: r/debian"
https://www.reddit.com/r/freebsd.rss "~REDDIT: r/freebsd"
https://www.reddit.com/r/privacy.rss "~REDDIT: r/privacy"
https://www.reddit.com/r/privacytoolsIO.rss "~REDDIT: r/privacytoolsIO"
https://www.reddit.com/r/encryption.rss "~REDDIT: r/encryption"
https://www.reddit.com/r/GnuPG.rss "~REDDIT: r/GnuPG"
https://www.reddit.com/r/rss.rss "~REDDIT: r/rss"
https://www.reddit.com/r/tryhackme.rss "~REDDIT: r/tryhackme"
-----------------------
-------GIT-REPOS-------
-----------------------
https://lkml.org/rss.php "~Linux Kernel Mailing Lists"

View File

@ -12,6 +12,10 @@ Plug 'tpope/vim-sleuth'
Plug 'editorconfig/editorconfig'
Plug 'airblade/vim-gitgutter'
Plug 'preservim/nerdcommenter'
Plug 'Vimjas/vim-python-pep8-indent'
" Debugging plugins
Plug 'realaltffour/comprog.nvim', { 'branch': 'test' }
"Plug '~/.config/nvim/plugged/comprog.nvim'
call plug#end()
filetype plugin indent on

View File

@ -1,147 +1,96 @@
[global]
### Display ###
font = Iosevka Term 9
# Which monitor should the notifications be displayed on.
monitor = 0
markup = yes
plain_text = no
format = "<b>%s</b>\n%b"
follow = mouse
sort = no
geometry = "300x5-30+20"
indicate_hidden = yes
indicate_hidden = yes
alignment = center
shrink = no
bounce_freq = 0
transparency = 0
show_age_threshold = -1
notification_height = 0
word_wrap = yes
separator_height = 2
ignore_newline = no
padding = 8
stack_duplicates = yes
hide_duplicate_count = yes
horizontal_padding = 8
geometry = "300x20-15+20"
frame_width = 3
shrink = no
frame_color = "{color4}"
transparency = 5
separator_color = frame
idle_threshold = 0
sort = yes
monitor = 0
idle_threshold = 120
follow = none
### Text ###
sticky_history = yes
font = Monospace 8
history_length = 15
line_height = 0
show_indicators = no
markup = full
line_height = 0
format = "<b>%s</b>\n%b"
separator_height = 2
alignment = left
padding = 0
vertical_alignment = center
horizontal_padding = 0
show_age_threshold = 60
separator_color = frame
word_wrap = yes
startup_notification = false
ellipsize = middle
dmenu = /usr/bin/dmenu -p dunst:
ignore_newline = no
browser = /usr/bin/firefox -new-tab
stack_duplicates = true
icon_position = off
max_icon_size = 80
hide_duplicate_count = false
icon_path = /usr/share/icons/Paper/16x16/mimetypes/:/usr/share/icons/Paper/48x48/status/:/usr/share/icons/Paper/16x16/devices/:/usr/share/icons/Paper/48x48/notifications/:/usr/share/icons/Paper/48x48/emblems/
show_indicators = yes
icon_position = left
min_icon_size = 0
max_icon_size = 32
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
sticky_history = yes
history_length = 20
dmenu = /usr/bin/dmenu -p dunst:
browser = /usr/bin/firefox -new-tab
always_run_script = true
title = Dunst
class = Dunst
startup_notification = false
verbosity = mesg
corner_radius = 0
ignore_dbusclose = false
force_xinerama = false
mouse_left_click = close_current
mouse_middle_click = do_action, close_current
mouse_right_click = close_all
[experimental]
per_monitor_dpi = false
frame_width = 1
frame_color = "#000000"
[shortcuts]
# Shortcuts are specified as [modifier+][modifier+]...key
# Available modifiers are "ctrl", "mod1" (the alt-key), "mod2",
# "mod3" and "mod4" (windows-key).
# Xev might be helpful to find names for keys.
# Close notification.
close = ctrl+space
close = ctrl+space
# Close all notifications.
close_all = ctrl+shift+space
close_all = ctrl+shift+space
# Redisplay last message(s).
# On the US keyboard layout "grave" is normally above TAB and left
# of "1". Make sure this key actually exists on your keyboard layout,
# e.g. check output of 'xmodmap -pke'
history = ctrl+grave
history = ctrl+grave
# Context menu.
context = ctrl+shift+period
context = ctrl+shift+period
frame_color = "{color1}"
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the "#" and following would be interpreted as a comment.
background = "{background}"
foreground = "{foreground}"
timeout = 10
# Icon for notifications with low urgency, uncomment to enable
#icon = /path/to/icon
foreground = "{foreground}"
background = "{background}"
timeout = 4
[urgency_normal]
background = "{background}"
foreground = "{foreground}"
timeout = 10
# Icon for notifications with normal urgency, uncomment to enable
#icon = /path/to/icon
foreground = "{foreground}"
background = "{background}"
timeout = 6
[urgency_critical]
background = "{background}"
foreground = "{foreground}"
frame_color = "{color4}"
timeout = 0
# Icon for notifications with critical urgency, uncomment to enable
#icon = /path/to/icon
foreground = "{foreground}"
background = "{background}"
timeout = 8
# vim: ft=cfg

34
.local/bin/add_wallpaper Executable file
View File

@ -0,0 +1,34 @@
#!/bin/sh
wallpaper_link=$(xclip -o -sel clipboard)
notify-send "Downloading wallpaper..."
curl $wallpaper_link > /tmp/waly
notify-send "Finished downloading..."
wal_name=(dmenu -p "Name the wallpaper: ")
# Find wallpaper last ID
wal_ids=$(ls $HOME/pix/wallpapers/)
max=000
for i in $wal_ids
do
id=$(echo $i | awk 'BEGIN {FS="-"} ; {print $1}')
if [ $(echo "$id > $max" | bc) = "1" ]
then
max=$id
fi
done
# Gen wallpaper new ID
new_wal_id=$(echo "$max+1" | bc)
new_wal_id=$(printf %03d $new_wal_id)
# Get name of new wallpaper
title=$(echo "$wallpaper_link" | dmenu -p "Name of Wallpaper: $new_wal_id-")
[ -z $title ] && exit
# Generate final location and move
final_wal_loc=$HOME/pix/wallpapers/$new_wal_id-$title
mv /tmp/waly $final_wal_loc
notify-send "Added wallpaper to collection"

View File

@ -2,7 +2,7 @@
# -*- coding: utf-8 -*-
import re
import sys
from protonvpn_cli.cli import main
from codeforces.cf_run import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())

6
.local/bin/change_wallpaper Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
removed=$HOME/pix/wallpapers/
wal_name=$(find $HOME/pix/wallpapers/ -type f | awk 'BEGIN {FS="/"} ; {print $6}' | dmenu -i -l 25)
cp -f $removed/$wal_name ~/pix/wallpapers/wallpaper
refresh_wallpaper

20
.local/bin/dbrowsel Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env sh
# Dmenu for selecting which browser to open.
Browsers='1. AC
2. ACB
3. CB
4. O'
Chosen=$(printf '%s' "$Browsers" \
| dmenu -i -l 20 -p 'Select browser:')
[ -z "$Chosen" ] && exit 1
case $Chosen in
'1. AC') firefox -P AC "$@";;
'2. ACB') firefox -P ACB "$@";;
'3. CB') firefox -P CB "$@";;
'4. O') firefox -P O "$@";;
*) eval "$Chosen" "$@";;
esac

128
.local/bin/dbuku Executable file
View File

@ -0,0 +1,128 @@
#!/usr/bin/env sh
# Dmenu for saving the currently open website into buku.
# Instructions for saving:
# Currently works for qutebrowser and chromium based browsers.
# Press TAB to autocomplete the default so you can edit it.
# Press ENTER to accept your changes (if you did nothing it'll be the default).
# Press ESCAPE to go with the default value (in case of tags it'll accept them).
# To cancel out of adding it, just keep spamming ESCAPE until you reach the
# last prompt where you're asked to confirm or deny.
### Known problems:
### * If using this script with 'shift' as part of the hotkey the shift key
### gets stuck if you let go of it while xdotool is doing its thing.
### Can be solved by not using the shift key in the hotkey.
### * Can't figure out why xdotool fails sometimes. Fixed by sleeping a bit.
### * When you try to open a bookmark the list shows an extra line at the start
### saying "waiting for input" when the script is run with a hotkey (sxhkd).
### Can't figure out why.
### Should check if the yanked URL is in buku already before continuing.
### Though it'll simply give an error even if you try to add it.
ScriptName=${0##*/}
Version=1.0.0
# Set menu options:
MenuOpen='1. Open a bookmark.'
MenuSave='2. Create new bookmark.'
ChosenMenu=$(printf '%s\n%s' \
"$MenuOpen" "$MenuSave" \
| dmenu -i -l 10 -p "$ScriptName:")
# Open bookmark:
if [ "$ChosenMenu" = "$MenuOpen" ]; then
buku -p -f 5 \
| awk -F '\t' '{print $1, "-", $2, "#(" $3 ")"}' \
| dmenu -i -l 30 \
| awk '{print $1}' \
| xargs --no-run-if-empty buku -o
# Create bookmark:
elif [ "$ChosenMenu" = "$MenuSave" ]; then
# Get the name of the active window:
ActiveWindow=$(ps -p "$(xdotool getwindowfocus getwindowpid)" -o comm=)
# Set the name if the active window is a chromium based browser:
printf '%s' "$ActiveWindow" | grep -Eq 'chromium|chrome|brave' \
&& ActiveWindow='chromium-based'
### Haven't actually checked whether Chromium's window name is chromium.
# Get URL/title based on browser:
if [ "$ActiveWindow" = 'qutebrowser' ]; then
xdotool search --name qutebrowser key --clearmodifiers y P
sleep 0.1
URL=$(xclip -o)
sleep 0.1
xdotool search --name qutebrowser key --clearmodifiers y T
sleep 0.1
Title=$(xclip -o)
elif [ "$ActiveWindow" = 'chromium-based' ]; then
xdotool key --clearmodifiers ctrl+l
sleep 0.1
xdotool key --clearmodifiers ctrl+c
sleep 0.1
URL=$(xclip -o)
sleep 0.1
### Maybe write it to a file in the background to speed it up.
### Doesn't work for some generated sites.
Title=$(curl -s "$URL" \
| awk -F '<title>|</title>' '{for(i=2;i<=NF;i+=2){print $i}}' \
RS='' \
| recode html)
fi
# Prompt user to edit the URL:
EditedURL=$(printf "%s" "$URL" | dmenu -l 1 -p "Edit URL:")
[ "$EditedURL" ] && URL=$EditedURL
# Prompt user to edit the title:
EditedTitle=$(printf '%s' "$Title" | dmenu -l 1 -p 'Edit title:')
[ "$EditedTitle" ] && Title=$EditedTitle
# Prompt the user to pick tags for the bookmark:
BukuTags=$(buku -t)
BukuTags=$(printf '%s' "$BukuTags" \
| grep '[0-9]\..' \
| awk '{print $2}')
# awk is POSIX, but means you need to avoid spaces in tags.
#| grep -oP '(?<=[0-9]\.\s).+(?=\s\([0-9])')
# grep -oP is non-POSIX, but allows for spaces in tags.
while true; do
SelectedTag=$(printf '%s' "$BukuTags" \
| dmenu -i -l 30 \
-p "Add tags. SHIFT+ENTER to create a new tag. $Tags")
[ -z "$SelectedTag" ] && break
Tags="$Tags$SelectedTag,"
done
Tags=$(printf '%s' "${Tags%?}")
# Prompt the user to add a comment/description:
Comment=$(printf '' | dmenu -p 'Input comment:')
# Prompt the user whether they want the title and description to not update:
Immutability=$(printf 'No\nYes' | dmenu -i -p 'Enable immutability?')
[ "$Immutability" = 'Yes' ] && Immutable='--immutable 1'
[ "$Immutability" = 'No' ] && Immutable=''
# Create a preview for the user to see their input:
Lock=''
[ "$Immutability" = 'Yes' ] && Lock='(L)'
Confirmation=$(printf '%s\nIDN. %s %s\n > %s\n + %s\n # %s' \
'This is a preview. Press ENTER to confirm or ESCAPE to cancel.' \
"$Title" "$Lock" "$URL" "$Comment" "$Tags" \
| dmenu -i -l 5)
# If the user pressed ENTER, create the bookmark:
[ "$Confirmation" ] && \
buku $(printf '%s %s %s --title %s -c %s %s' \
'-a' "$URL" "$Tags" "$Title" "$Comment" "$Immutable")
elif [ -z "$ChosenMenu" ]; then
exit 1
else
printf 'ERROR: invalid selection.\n'
exit 1
fi

175
.local/bin/ddiropen Executable file
View File

@ -0,0 +1,175 @@
#!/usr/bin/env sh
# Dmenu for opening a program with a specific directory.
# MIT License
#
# Copyright (c) 2020 Alexander Chaplin Braz
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
ScriptName=${0##*/}
Version=1.0.0
# Set default bookmark if there is none:
BlankMark='---'
# Compose the help message:
HelpMessage="$ScriptName - Version: $Version
Creator: Alexander Chaplin Braz (https://alexchaplinbraz.com)
License: MIT
Usage: $ScriptName {dirpath | filepath} {programs} [mark]
This script lets the user open a directory with a program
using dmenu to select them. For this, it requires two arguments.
The first one can either be a directory from which it will find all the
subdirectories, or a file that holds a list of directories acting as bookmarks.
It's highly recommended to use absolute paths, but relative paths also work.
The second one has to be a comma separated list of programs which can be
unquoted, but quoting it gives the user the ability to specify options
for the programs.
An optional third argument lets the user change the default bookmark name
when no bookmark name was set in the bookmark file. Default: $BlankMark
The bookmark file must have a format where the path is at the start of a line.
One optional bookmark name can be set after the path by separating them with a
tab. Nothing from column 3+ is parsed. So you can use it freely to add comments
or whatever. You can also comment out lines with any character (other than \"),
thus breaking the path, so it won't show up as an option.
In the case where there's only one program and/or directory, they will be
selected automatically.
Usage examples:
$ScriptName \$HOME vifm,lf,sxiv
$ScriptName \ ranger,vifm
$ScriptName \"\$HOME/Pictures\" \"sxiv -t,sxiv -arf\"
$ScriptName \"\$HOME/Documents/dir-bookmarks.txt\" lf
$ScriptName \"\$HOME/Documents/dir-bookmarks.txt\" lf ###
Example bookmarks file (keep in mind the tab separation):
\$HOME HM
\"\$HOME/Pictures/Art References\" AR
\"\$XDG_CONFIG_HOME\" CNF
#\$COMMENT CM COMMENT: this can be whatever since it's not parsed.
/mnt MNT
/etc ETC
/backup BU
"
suggest_help_and_exit() {
printf "Try '%s --help' for more information.\n" "$ScriptName"
exit 1
}
case $1 in
'') printf '%s' "$HelpMessage"; exit 1;;
-h|--help) printf '%s' "$HelpMessage"; exit 0;;
-v|--version) printf '%s - Version: %s\n' "$ScriptName" "$Version"; exit 0;;
esac
# Set custom blank mark if it was set by the user:
[ "$3" ] && BlankMark=$3
# Set a location for the temporary file that holds the found directories:
TempFile="/tmp/$ScriptName-dirs"
# Set up a function that can be called to run in the background:
find_directories() {
find "$1" -type d 2>/dev/null > "$TempFile"
printf '%s' "$ScriptName ENDofSEARCH" >> "$TempFile"
}
# Parse the passed programs:
Parsed=$(printf '%s' "$2" | tr -s ',' '\n')
# Count the amount of programs:
ProgramAmount=$(printf '%s\n' "$Parsed" | wc -l)
# Determine whether the first argument is a directory or a file:
if [ -d "$1" ]; then
Directory=$1
elif [ "$(file -i "$1" | awk '{printf $2}')" = 'text/plain;' ]; then
cat "$1" | while IFS= read -r line; do
line=$(printf '%s' "$line" \
| awk -F '\t' -v blank=$BlankMark \
'{print match($2, /[^ ]/) ? $2 : blank, $1}' OFS='\t')
path=$(printf '%s' "$line" | awk -F '\t' '{printf $2}')
eval [ -d "$path" ] 2>/dev/null \
&& printf '%s\n' "$line" >> "$TempFile"
done
if [ ! -s "$TempFile" ]; then
printf 'ERROR: no valid directories in the specified file.\n'
suggest_help_and_exit
fi
[ $ProgramAmount = 1 ] && pn="[$Parsed] "
Directory=$(printf '%s' "$(cat "$TempFile")" \
| dmenu -i -l 30 -p "${pn}Select parent directory:" \
| awk -F '\t' '{printf $2}')
else
printf 'ERROR: invalid first argument.\n'
suggest_help_and_exit
fi
# Delete the temporary file:
rm "$TempFile" 2>/dev/null
# Exit if no directory was selected:
[ -z "$Directory" ] && exit 1
# Do the directory search in the background:
eval find_directories "$Directory" &
# If there's only one program, skip selecting it:
if [ $ProgramAmount = 1 ]; then
Program=$Parsed
# Else, select the program first to hide the time taken to find the directories:
else
Program=$(printf '%s' "$Parsed" \
| dmenu -i -l 30 -p 'Select program:')
[ -z "$Program" ] && exit 1
fi
# Wait until all directories have been found:
until [ "$(tail -n 1 "$TempFile")" = "$ScriptName ENDofSEARCH" ]; do
sleep 0.1
done
# If there's only the result of the directory itself, select it:
if [ $(wc -l "$TempFile" | awk '{printf $1}') = 1 ]; then
Chosen=$(sed '$d' "$TempFile")
# Else, choose a directory:
else
Chosen=$(sed '$d' "$TempFile" \
| dmenu -i -l 30 -p "[$Program] Select directory:")
fi
# Delete the temporary file:
rm "$TempFile" 2>/dev/null
# Exit if no directory was chosen:
[ -z "$Chosen" ] && exit 1
# Launch the selected program with the selected directory:
eval "$Program" \""$Chosen"\"

29
.local/bin/dedit Executable file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env sh
# Dmenu for quickly finding and opening files to edit.
# If '-r' is passed, it will search root relevant files and edit as root.
# Find the files to be displayed:
case $1 in
-r|--root) Files=$(sudo find '/etc' -type f)
AsRoot=' as root';;
*) Files1=$(find "$LBIN" -type l)
Files2=$(find "$HOME" "$LSHARE" -maxdepth 1 -type f)
Files3=$(find "$XDG_DOCUMENTS_DIR/notes" "$XDG_CONFIG_HOME" "$LBIN" -type f)
# Exclude some paths:
Files=$(printf "%s\n%s\n%s" "$Files1" "$Files2" "$Files3" | grep -Ev \
'.tdb|.sql|dump|eb26f4|google-chrome|VirtualBox|BraveSoftware|.config/cargo');;
esac
# Choose the file to open:
Prompt="Select a file to edit${AsRoot}:"
Chosen=$(printf '%s' "$Files" | dmenu -i -l 30 -p "$Prompt")
[ -z "$Chosen" ] && exit 1
# Open the editor with the selected file:
if [ "$1" = '-r' ]; then
### If `$EDITOR` is a GUI, permissions will likely get quite messed up.
sudo $EDITOR "$Chosen"
else
$EDITOR "$Chosen"
fi

8
.local/bin/demoji Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env sh
# Dmenu for selecting and copying an emoji.
grep -v '#' "$LSHARE/emoji" \
| dmenu -i -l 20 -fn Symbola-16 \
| awk '{printf $1}' \
| xclip -selection clipboard

28
.local/bin/dkeys Executable file
View File

@ -0,0 +1,28 @@
#!/usr/bin/env sh
# Dmenu for disabling/enabling keyboard keys.
ScriptName=${0##*/}
Version=1.0.0
SuperLDisable='Disable Super_L'
SuperLEnable='Enable Super_L'
SuperRDisable='Disable Super_R'
SuperREnable='Enable Super_R'
KeyState=$(printf '%s\n%s\n%s\n%s' \
"$SuperLDisable" \
"$SuperLEnable" \
"$SuperRDisable" \
"$SuperREnable" \
| dmenu -i -l 10 -p "$ScriptName")
case $KeyState in
"$SuperLDisable") Keycode='keycode 133 = 0x0000';;
"$SuperLEnable") Keycode='keycode 133 = 0xffeb';;
"$SuperRDisable") Keycode='keycode 134 = 0x0000';;
"$SuperREnable") Keycode='keycode 134 = 0xffec';;
*) exit 1;;
esac
xmodmap -e "$Keycode"

93
.local/bin/dlocate Executable file
View File

@ -0,0 +1,93 @@
#!/usr/bin/env sh
# Dmenu for locating and opening paths.
# MIT License
#
# Copyright (c) 2020 Alexander Chaplin Braz
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
ScriptName=${0##*/}
Version=1.0.0
# Compose the help message:
HelpMessage="$ScriptName - Version: $Version
Creator: Alexander Chaplin Braz (https://alexchaplinbraz.com)
License: MIT
Usage: $ScriptName {'programs'}
Quickly find files and directories using 'locate', select one of the results
and then select a program to open that path with.
This script requires one argument of comma separated programs, which can be
unquoted, but quoting it gives the user the ability to specify options
for the programs.
As it depends on 'locate', the database needs to be updated frequently for
this script to be useful. It's recommended to have a cron job running
'updatedb' every 15 or 30 minutes.
At the program selection point it's also possible to simply write a
non-specified program with arguments. If one of the dmenu options is still
selected, SHIFT+ENTER will ignore it and select exactly what you typed.
Examples:
$ScriptName vim,vifm,lf,sxiv
$ScriptName 'nvim,lf,vifm,sxiv -ta,sxiv -arf'
"
# Notify user of how to use the script:
case $1 in
'') printf '%s' "$HelpMessage"; exit 1;;
-h|--help) printf '%s' "$HelpMessage"; exit 0;;
-f|--version) printf '%s' "$Version"; exit 0;;
esac
# Prompt user what to locate:
LocateTarget=$(printf '' | dmenu -p "$ScriptName:")
# Exit if nothing was selected:
[ -z "$LocateTarget" ] && exit 1
# Do the search:
Located=$(locate "$LocateTarget")
# Prompt user to select one of the results:
Path=$(printf '%s' "$Located" | dmenu -i -l 30 -p 'Select path:')
# Exit if nothing was selected:
[ -z "$Path" ] && exit 1
# Parse the passed programs:
Parsed=$(printf '%s' "$1" | tr -s ',' '\n')
# If there's only one program, skip selecting it:
if [ $(printf '%s\n' "$Parsed" | wc -l) -eq 1 ]; then
Program=$Parsed
else # Else, choose one:
Program=$(printf '%s' "$Parsed" | dmenu -i -l 10 -p 'Select program:')
fi
# Exit if nothing was selected:
[ -z "$Program" ] && exit 1
# Launch the selected program with the selected path:
eval "$Program" \""$Path"\"

30
.local/bin/dman Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env sh
# Dmenu for easily finding a manual to open from a list of all manuals.
# Set a character width for this script if needed:
#export MANWIDTH=80
man $(apropos --long . | dmenu -i -l 30 | awk '{print $2, $1}' | tr -d '()')
# Probably the most useful script ever.
# There are some manuals that have the same name but different sections denoted
# with what's inside (), one useful section to know is the POSIX version of the
# manuals which are #p or #posix, so adding that to the search shows you the
# POSIX version of the manual if it exists. For more information read the
# initial part of the man-pages manual and search 'intro' with this script.
#
# Keep in mind that newly installed programs with man pages tend not to appear
# right away because the manual database hasn't been updated yet (though you
# can simply write the name of the package if you know it). Depending on the
# system, it may be updated with a cron job, during boot, etc. If you want
# to update it manually, run:
#
# sudo mandb
#
# Ideally it would run every time a program is installed/uninstalled, but it
# seems a pain to set it up. It takes a few seconds to finish, which is a
# bummer, because I would have just put it at the start of this script. I could
# also just make a wrapper script for pacman that runs "sudo mandb" quietly if
# the un/installation was completed successfully.

238
.local/bin/dmarks Executable file
View File

@ -0,0 +1,238 @@
#!/usr/bin/env sh
# Dmenu plain text URL bookmark manager.
# MIT License
#
# Copyright (c) 2020 Alexander Chaplin Braz
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
ScriptName=${0##*/}
Version=1.0.0
# Compose the help message:
HelpMessage="$ScriptName - Version: $Version
Creator: Alexander Chaplin Braz (https://alexchaplinbraz.com)
License: MIT
Usage: $ScriptName {bookmark}
This script is a simple plain text URL bookmark manager that lets the user
copy, add, edit and delete bookmark entries. It requires one argument,
the path to the bookmark file. The URLs are opened with \$BROWSER.
The format of the bookmark file is:
One bookmark per line with three tab separated fields: URL, title and tags.
The tags are comma separated and can have spaces.
"
case $1 in
'') printf '%s' "$HelpMessage"; exit 1;;
-h|--help) printf '%s' "$HelpMessage"; exit 0;;
-v|--version) printf '%s' "$Version"; exit 0;;
esac
# Temporary file location
TempFile="/tmp/$ScriptName"
# Load and format the bookmarks:
Bookmarks=$(cat "$1" | nl -n ln)
FormattedBookmarks=$(printf '%s' "$Bookmarks" \
| sed 's/\t\t/\tBLANK\t/' \
| awk -F '\t' '{print $1, $3, "("$4")", $5, "["$2"]"}')
### For some reason setting OFS='\t' makes dmenu lag.
# Set menu options:
MenuOpen='1. Open a bookmark.'
MenuCreate='2. Create new bookmark.'
MenuEdit='3. Edit a bookmark.'
MenuDelete='4. Delete a bookmark.'
# Prompt user to choose action:
ChosenMenu=$(printf '%s\n%s\n%s\n%s' \
"$MenuOpen" "$MenuCreate" "$MenuEdit" "$MenuDelete" \
| dmenu -i -l 10 -p "$ScriptName:")
# Open bookmark:
if [ "$ChosenMenu" = "$MenuOpen" ]; then
# Prompt user for bookmark:
Chosen=$(printf '%s' "$FormattedBookmarks" \
| dmenu -i -l 30 -p 'Open:' \
| awk '{printf $1}')
Chosen=$(printf '%s' "$Bookmarks" \
| grep -w ^$Chosen \
| awk '{printf $2}')
[ -z "$Chosen" ] && exit 1
# Open browser with selected URL.
$BROWSER "$Chosen"
# Create bookmark:
elif [ "$ChosenMenu" = "$MenuCreate" ]; then
# Get the name of the active window:
ActiveWindow=$(ps -p "$(xdotool getwindowfocus getwindowpid)" -o comm=)
# Set the name if the active window is a chromium based browser:
printf '%s' "$ActiveWindow" | grep -Eq 'chromium|chrome|brave' \
&& ActiveWindow='chromium-based'
### Haven't actually checked whether Chromium's window name is chromium.
# Get URL/title based on browser:
if [ "$ActiveWindow" = 'qutebrowser' ]; then
xdotool search --name qutebrowser key --clearmodifiers y P
sleep 0.1
URL=$(xclip -o)
sleep 0.1
xdotool search --name qutebrowser key --clearmodifiers y T
sleep 0.1
Title=$(xclip -o)
elif [ "$ActiveWindow" = 'chromium-based' ]; then
xdotool key --clearmodifiers ctrl+l
sleep 0.1
xdotool key --clearmodifiers ctrl+c
sleep 0.1
URL=$(xclip -o)
sleep 0.1
### Maybe write it to a file in the background to speed it up.
### Doesn't work for some generated sites.
Title=$(curl -s "$URL" \
| awk -F '<title>|</title>' '{for(i=2;i<=NF;i+=2){print $i}}' \
RS='' \
| recode html)
fi
# Check if URL already exists.
if [ "$URL" ] && grep -q "$URL" "$1" ;then
printf '' | dmenu -p 'ERROR: URL already bookmarked.'
exit 1
fi
# Prompt user to edit the URL:
EditedURL=$(printf '%s' "$URL" | dmenu -l 1 -p 'Edit URL:')
[ "$EditedURL" ] && URL=$EditedURL
# Prompt user to edit the title:
EditedTitle=$(printf '%s' "$Title" | dmenu -l 1 -p 'Edit title:')
[ "$EditedTitle" ] && Title=$EditedTitle
# Prompt the user to pick tags for the bookmark:
AllTags=$(printf '%s' "$Bookmarks" \
| awk -F '\t' '{print $4}' \
| tr ',' '\n' \
| sort \
| uniq)
while true; do
SelectedTag=$(printf '%s' "$AllTags" \
| dmenu -i -l 30 \
-p "Add tags. SHIFT+ENTER to create a new tag. $Tags")
[ -z "$SelectedTag" ] && break
Tags="$Tags$SelectedTag,"
done
Tags=${Tags%?}
# Create a preview for the user to see their input:
Confirmation=$(printf '%s\nURL: %s\nTitle: %s\nTags: %s' \
'This is a preview. Press ENTER to confirm or ESCAPE to cancel.' \
"$URL" "$Title" "$Tags" \
| dmenu -i -l 10)
# If the user pressed ENTER, create the bookmark:
[ "$Confirmation" ] && \
printf '%s\t%s\t%s' \
"$URL" "$Title" "$Tags" >> "$1"
# Edit bookmark:
elif [ "$ChosenMenu" = "$MenuEdit" ]; then
# Prompt user for bookmark:
Chosen=$(printf '%s' "$FormattedBookmarks" \
| dmenu -i -l 30 -p "Edit:" \
| awk '{printf $1}')
Chosen=$(printf '%s' "$Bookmarks" \
| grep -w ^$Chosen \
| awk '{printf $2}')
[ -z "$Chosen" ] && exit 1
# Get the bookmark information:
Mark=$(grep "$Chosen" "$1")
OldURL=$(printf '%s' "$Mark" | awk -F '\t' '{printf $1}')
OldTitle=$(printf '%s' "$Mark" | awk -F '\t' '{printf $2}')
OldTags=$(printf '%s' "$Mark" | awk -F '\t' '{printf $3}')
# Prompt user to edit the URL:
EditedURL=$(printf '%s' "$OldURL" | dmenu -l 1 -p 'Edit URL:')
[ "$EditedURL" ] && URL=$EditedURL
# Prompt user to edit the title:
EditedTitle=$(printf '%s' "$OldTitle" | dmenu -l 1 -p 'Edit title:')
[ "$EditedTitle" ] && Title=$EditedTitle
# Prompt the user to pick tags for the bookmark:
AllTags=$(printf '%s' "$Bookmarks" \
| awk -F '\t' '{print $4}' \
| tr ',' '\n' \
| sort \
| uniq)
while true; do
SelectedTag=$(printf '%s' "$AllTags" \
| dmenu -i -l 30 \
-p "Old: $OldTags | New: $Tags")
[ -z "$SelectedTag" ] && break
Tags="$Tags$SelectedTag,"
done
Tags=${Tags%,}
# Create a preview for the user to see their input:
Confirmation=$(printf \
'%s\nNew URL: %s\nOld URL: %s\nNew title: %s\nOld title: %s\
\nNew tags: %s\nOld tags: %s' \
'This is a preview. Press ENTER to confirm or ESCAPE to cancel.' \
"$URL" "$OldURL" "$Title" "$OldTitle" "$Tags" "$OldTags" \
| dmenu -i -l 10)
# If the user pressed ENTER, edit the bookmark:
if [ "$Confirmation" ]; then
sed "\|$Chosen|d" "$1" > "$TempFile"
mv "$TempFile" "$1"
printf '%s\t%s\t%s' "$URL" "$Title" "$Tags" >> "$1"
else
exit 1
fi
# Delete bookmark:
elif [ "$ChosenMenu" = "$MenuDelete" ]; then
# Prompt user for bookmark:
Chosen=$(printf '%s' "$FormattedBookmarks" \
| dmenu -i -l 30 -p 'Delete:' \
| awk '{printf $1}')
Chosen=$(printf '%s' "$Bookmarks" \
| grep -w ^$Chosen \
| awk '{printf $2}')
[ -z "$Chosen" ] && exit 1
# Delete selected bookmark from file:
sed "\|$Chosen|d" "$1" > "$TempFile"
mv "$TempFile" "$1"
elif [ -z "$ChosenMenu" ]; then
exit 1
else
printf 'ERROR: invalid selection.\n'
exit 1
fi

68
.local/bin/dmnt Executable file
View File

@ -0,0 +1,68 @@
#!/usr/bin/env sh
# Dmenu to mount/unmount partitions.
ScriptName=${0##*/}
Version=1.0.0
# Set menu options:
MenuMount='1. Mount a partition.'
MenuUnmount='2. Unmount a partition.'
ChosenMenu=$(printf '%s\n%s' \
"$MenuMount" "$MenuUnmount" \
| dmenu -i -l 10 -p "$ScriptName:")
# Mount a partition:
if [ "$ChosenMenu" = "$MenuMount" ]; then
Mountable=$(lsblk -lp \
| grep "part $" \
| awk '{print $1, "(" $4 ")"}')
[ -z "$Mountable" ] && exit 1
Chosen=$(printf '%s' "$Mountable" \
| dmenu -i -l 10 -p 'Mount which drive?' \
| awk '{print $1}')
[ -z "$Chosen" ] && exit 1
# Try to mount directly based on fstab:
sudo mount "$Chosen" && exit 0
# Otherwise ask for directory.
### Implement a way to exclude already mounted locations.
Directories=$(find /mnt -maxdepth 1 -type d 2>/dev/null)
MountPoint=$(printf '%s' "$Directories" \
| dmenu -i -l 10 -p 'Type in mount point:')
[ -z "$MountPoint" ] && exit 1
if [ ! -d "$MountPoint" ]; then
mkdirprompt=$(printf 'No\\nYes' \
| dmenu -i -p "$MountPoint does not exist. Create it?")
[ "$mkdirprompt" = 'Yes' ] && sudo mkdir -p "$MountPoint"
fi
sudo mount "$Chosen" "$MountPoint"
# Unmount a partition:
elif [ "$ChosenMenu" = "$MenuUnmount" ]; then
ExclusionRegex='\(/boot\|/home\|/\|/backup\|/backup/extra\)$'
Drives=$(lsblk -lp \
| grep "part /" \
| grep -v "$ExclusionRegex" \
| awk '{print $1, "(" $4 ")", "on", $7}')
[ -z "$Drives" ] && exit 1
Chosen=$(printf '%s' "$Drives" \
| dmenu -i -l 10 -p 'Unmount which drive?' \
| awk '{print $1}')
[ -z "$Chosen" ] && exit 1
sudo umount "$Chosen"
elif [ -z "$ChosenMenu" ]; then
exit 1
else
printf 'ERROR: invalid selection.\n'
exit 1
fi

18
.local/bin/dnewsh Executable file
View File

@ -0,0 +1,18 @@
#!/usr/bin/env sh
# Quickly start creating a new script.
Directory=$(find "$HOME/proj" -maxdepth 2 -type d \
| dmenu -i -l 30 -p 'Select directory for new script:')
[ -z "$Directory" ] && exit 1
Name=$(printf '' | dmenu -p 'Name the script:')
[ -z "$Name" ] && exit 1
Script="$Directory/$Name"
touch "$Script"
chmod +x "$Script"
ln -sf "$Script" "$LBIN"
printf '%s\n\n# ' '#!/usr/bin/env sh' > "$Script"
$EDITOR "$Script"

201
.local/bin/dpass Executable file
View File

@ -0,0 +1,201 @@
#!/usr/bin/env sh
# Dmenu for managing passwords.
# MIT License
#
# Copyright (c) 2020 Alexander Chaplin Braz
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
ScriptName=${0##*/}
Version=1.1.0
HelpMessage="$ScriptName - Version: $Version
Creator: Alexander Chaplin Braz (https://alexchaplinbraz.com)
License: MIT
Usage: $ScriptName ['genrepass arguments']
This script lets the user copy, add, edit and delete pass entries through a
series of dmenu prompts.
The script itself requires no arguments, but does require the user to have the
complimentary genrepass utility by the same creator for password generation.
In the case of its absense, the password generation simply won't work and the
user will have to input them manually.
The default argument for genrepass is just to look for text files in the XGD
environment variable for documents \$XDG_DOCUMENTS_DIR without any options,
but the user can override that by passing them as the first argument. Do make
sure to quote the whole block of options and arguments that you would normally
pass to genrepass with single quotes.
Another way to set the options is to export an environment variable named
DPASS_OPTS, which takes the same format. This way you can simply run
$ScriptName without any options. Directly passed arguments still take
preference though.
IMPORTANT: avoid using the '-c' for copying to clipboard because this script
is set up in a way that pipes the stdout of genrepass into dmenu for
you to see.
Keep in mind the pinentry program used for entering your passphrase to decrypt
your .gpg files. If it's set to a terminal one, this script won't work properly.
I personally recommend pinentry-dmenu to keep with the dmenu theme.
The editor is taken from \$EDITOR as used by pass.
Examples:
$ScriptName '-C \"\$HOME/Documents/Journal-2020.md\"'
$ScriptName '-L30-50 -n10 \"\$HOME/Documents/notes/\"'
export DPASS_OPTS='-C \"\$HOME/Documents/notes\"'
"
error() { printf 'ERROR: %s\n' "$1" 1>&2; }
suggest_help_and_exit() {
printf "Try '%s --help' for more information.\n" "$ScriptName";
exit 1
}
case $1 in
-h|--help) printf '%s' "$HelpMessage"; exit 0;;
-v|--version) printf '%s - Version: %s\n' "$ScriptName" "$Version"; exit 0;;
esac
# Get the location of the password store:
PWStore=$PASSWORD_STORE_DIR
[ -z "$PWStore" ] && PWStore="$HOME/.password-store"
# Get a list of all entries:
PassList=$(find $PWStore -name '*.gpg' | sed "s/\.gpg$//; s|$PWStore/||g")
# Set menu options:
MenuCopy='1. Copy entry to clipboard.'
MenuCreate='2. Create new entry/Edit existing entry.'
MenuEdit="3. Edit entry with $EDITOR."
MenuDelete='4. Delete an entry.'
FullMenu="$MenuCopy\n$MenuCreate\n$MenuEdit\n$MenuDelete"
# Prompt user to choose action:
ChosenMenu=$(printf '%b' "$FullMenu" | dmenu -i -l 10 -p "$ScriptName:")
# Copy selected entry to clipboard:
if [ "$ChosenMenu" = "$MenuCopy" ]; then
ChosenPass=$(
printf '%s' "$PassList" | dmenu -i -l 30 -p 'Select entry to copy:'
)
pass show -c "$ChosenPass"
# Create new entry/Edit existing entry:
elif [ "$ChosenMenu" = "$MenuCreate" ]; then
ChosenName=$(
printf '%s' "$PassList" | dmenu -i -l 30 -p 'Input entry name:'
)
[ -z "$ChosenName" ] && exit 1
if ! command -v genrepass 1> /dev/null 2>&1; then
GenrepassNotFound="ERROR: 'genrepass' not found in PATH."
fi
# Set menu options:
TypeSingleLine='1. Write a single line of content.'
TypeGenrepass="2. Generate password with genrepass. $GenrepassNotFound"
# Prompt user to choose content type:
ChosenType=$(
printf '%s\n%s' "$TypeSingleLine" "$TypeGenrepass" \
| dmenu -i -l 10 -p 'Select content type:'
)
# Generate password with genrepass:
if [ "$ChosenType" = "$TypeGenrepass" ];then
# Set genrepass options:
if [ -z "$1" ]; then
if [ -n "$DPASS_OPTS" ]; then
GRPargs=$DPASS_OPTS
else
GRPargs=$XDG_DOCUMENTS_DIR
fi
else
GRPargs=$1
fi
if [ -z "$GenrepassNotFound" ]; then
# Keep generating passwords until one is selected:
while [ -z "$Content" ]; do
Content=$(
eval genrepass "$GRPargs" | dmenu -l 10 \
-p 'ENTER to select, ESCAPE to generate new password:'
)
done
else
Content=$(printf '' | dmenu -p 'Input content:')
fi
# Input custom single line content:
elif [ "$ChosenType" = "$TypeSingleLine" ];then
Content=$(printf '' | dmenu -p 'Input content:')
elif [ -z "$ChosenType" ];then
exit 1
else
error 'Invalid selection.'
suggest_help_and_exit
fi
# Create a preview for the user to see their input:
Confirmation=$(
printf '%s\nEntry: %s\nContent: %s' \
'This is a preview. Press ENTER to confirm or ESCAPE to cancel.' \
"$ChosenName" "$Content" | dmenu -i -l 10
)
# If the user pressed ENTER, create/edit the entry:
if [ "$Confirmation" ]; then
printf '%s' "$Content" | pass add --echo --force "$ChosenName"
fi
# Open entry with $EDITOR:
elif [ "$ChosenMenu" = "$MenuEdit" ]; then
ChosenPass=$(
printf '%s' "$PassList" | dmenu -i -l 30 -p "Select entry to edit:"
)
$TERMINAL -e pass edit "$ChosenPass"
# Delete an entry:
elif [ "$ChosenMenu" = "$MenuDelete" ]; then
ChosenPass=$(
printf '%s' "$PassList" | dmenu -i -l 30 -p 'Select entry to delete:'
)
pass delete --force "$ChosenPass"
elif [ -z "$ChosenMenu" ]; then
exit 1
else
error 'Invalid selection.'
suggest_help_and_exit
fi

26
.local/bin/dpower Executable file
View File

@ -0,0 +1,26 @@
#!/usr/bin/env sh
# Dmenu power menu.
# Uses dprompt for confirmation.
Menu='Hybrid-sleep
Power Off
Reboot
Suspend
Hibernate'
Chosen=$(printf "$Menu" | dmenu -i -l 10 -p 'dpower')
if [ "$Chosen" = 'Hybrid-sleep' ]; then
dprompt "Confirm $Chosen?" 'systemctl hybrid-sleep'
elif [ "$Chosen" = 'Power Off' ]; then
dprompt "Confirm $Chosen?" 'poweroff'
elif [ "$Chosen" = 'Restart' ]; then
dprompt "Confirm $Chosen?" 'reboot'
elif [ "$Chosen" = 'Suspend' ]; then
dprompt "Confirm $Chosen?" 'systemctl suspend'
elif [ "$Chosen" = 'Hibernate' ]; then
dprompt "Confirm $Chosen?" 'systemctl hibernate'
else
exit 1
fi

9
.local/bin/dprompt Executable file
View File

@ -0,0 +1,9 @@
#!/usr/bin/env sh
# Dmenu binary prompt.
# Gives a dmenu prompt labled with $1 to perform command $2.
# Example: dprompt "Suspend?" "sudo systemctl suspend"
[ "$(printf 'No\nYes' \
| dmenu -p "$1" \
-i -nb darkred -sb red -sf black -nf gray)" = 'Yes' ] && $2

37
.local/bin/dtimer Executable file
View File

@ -0,0 +1,37 @@
#!/usr/bin/env sh
# Dmenu for starting a timer.
# Takes one optional argument for a WAV file sound alert.
# Requires a monospace font for dmenu to display the TIME'S UP text correctly.
Duration=$(printf '' | dmenu -i -l 30 -p "Current time: $(date +"%H:%M - %A %Y/%m/%d") | Timer duration:")
[ -z "$Duration" ] && exit 1
Name=$(printf '' | dmenu -p 'Name your timer:')
TimesUpMessage="Name: $Name Duration: $Duration
''''''
TTTTTTTTTTTTTTTTTTTTTTTIIIIIIIIIIMMMMMMMM MMMMMMMMEEEEEEEEEEEEEEEEEEEEEE '::::' SSSSSSSSSSSSSSS UUUUUUUU UUUUUUUUPPPPPPPPPPPPPPPPP
T:::::::::::::::::::::TI::::::::IM:::::::M M:::::::ME::::::::::::::::::::E '::::' SS:::::::::::::::S U::::::U U::::::UP::::::::::::::::P
T:::::::::::::::::::::TI::::::::IM::::::::M M::::::::ME::::::::::::::::::::E ':::''S:::::SSSSSS::::::S U::::::U U::::::UP::::::PPPPPP:::::P
T:::::TT:::::::TT:::::TII::::::IIM:::::::::M M:::::::::MEE::::::EEEEEEEEE::::E':::' S:::::S SSSSSSS UU:::::U U:::::UUPP:::::P P:::::P
TTTTTT T:::::T TTTTTT I::::I M::::::::::M M::::::::::M E:::::E EEEEEE'''' S:::::S U:::::U U:::::U P::::P P:::::P
T:::::T I::::I M:::::::::::M M:::::::::::M E:::::E S:::::S U:::::D D:::::U P::::P P:::::P
T:::::T I::::I M:::::::M::::M M::::M:::::::M E::::::EEEEEEEEEE S::::SSSS U:::::D D:::::U P::::PPPPPP:::::P
T:::::T I::::I M::::::M M::::M M::::M M::::::M E:::::::::::::::E SS::::::SSSSS U:::::D D:::::U P:::::::::::::PP
T:::::T I::::I M::::::M M::::M::::M M::::::M E:::::::::::::::E SSS::::::::SS U:::::D D:::::U P::::PPPPPPPPP
T:::::T I::::I M::::::M M:::::::M M::::::M E::::::EEEEEEEEEE SSSSSS::::S U:::::D D:::::U P::::P
T:::::T I::::I M::::::M M:::::M M::::::M E:::::E S:::::S U:::::D D:::::U P::::P
T:::::T I::::I M::::::M MMMMM M::::::M E:::::E EEEEEE S:::::S U::::::U U::::::U P::::P
TT:::::::TT II::::::IIM::::::M M::::::MEE::::::EEEEEEEE:::::E SSSSSSS S:::::S U:::::::UUU:::::::U PP::::::PP
T:::::::::T I::::::::IM::::::M M::::::ME::::::::::::::::::::E S::::::SSSSSS:::::S UU:::::::::::::UU P::::::::P
T:::::::::T I::::::::IM::::::M M::::::ME::::::::::::::::::::E S:::::::::::::::SS UU:::::::::UU P::::::::P
TTTTTTTTTTT IIIIIIIIIIMMMMMMMM MMMMMMMMEEEEEEEEEEEEEEEEEEEEEE SSSSSSSSSSSSSSS UUUUUUUUU PPPPPPPPPP
"
if Error=$(sleep $Duration 2>&1); then
[ "${1##*.}" = 'wav' ] && aplay "$1" &
printf '%s' "$TimesUpMessage" | dmenu -l 30
else
printf '%s' "$Error" | dmenu -l 30 -p 'ERROR:'
fi

41
.local/bin/dwine Executable file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env sh
# Dmenu for choosing which wine bottle to open a program with.
if [ "$2" = 'wg32' ]; then
export WINEARCH='win32'
export WINEPREFIX='/home/alex/.local/wine/wg32'
exec wine "$1"
exit 0
fi
Chosen=$(printf '1. Run with WG32\n2. Run with WG64\n3. winetricks WG32\n4. winetricks WG64\n5. winecfg WG32\n6. winecfg WG64' \
| dmenu -i -l 10 -p 'dwine:')
if [ "$Chosen" = '1. Run with WG32' ]; then
export WINEARCH='win32'
export WINEPREFIX='/home/alex/.local/wine/wg32'
exec wine "$1"
elif [ "$Chosen" = '2. Run with WG64' ]; then
export WINEARCH='win64'
export WINEPREFIX='/home/alex/.local/wine/wg64'
exec wine "$1"
elif [ "$Chosen" = '3. winetricks WG32' ]; then
export WINEARCH='win32'
export WINEPREFIX='/home/alex/.local/wine/wg32'
exec winetricks
elif [ "$Chosen" = '4. winetricks WG64' ]; then
export WINEARCH='win64'
export WINEPREFIX='/home/alex/.local/wine/wg64'
exec winetricks
elif [ "$Chosen" = '5. winecfg WG32' ]; then
export WINEARCH='win32'
export WINEPREFIX='/home/alex/.local/wine/wg32'
exec winecfg
elif [ "$Chosen" = '6. winecfg WG64' ]; then
export WINEARCH='win64'
export WINEPREFIX='/home/alex/.local/wine/wg64'
exec winecfg
else
exit 1
fi

149
.local/bin/dyt Executable file
View File

@ -0,0 +1,149 @@
#!/usr/bin/env sh
# Dmenu for opening videos with youtube-viewer.
# MUST HAVE the *ID* at the end of custom_layout_format in youtube-viewer.conf.
# Example:
# custom_layout_format => "*TITLE* (*AUTHOR*) [*TIME*] *ID*"
# MIT License
#
# Copyright (c) 2020 Alexander Chaplin Braz
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
### Add subscription system with sxiv for looking through video thumbnails
### and managing the videos.
### Set youtube-viewer arguments as variables to be able to select them like
### tags for a custom search.
### Implement search history for quickly searching again.
ScriptName=${0##*/}
Version=0.0.1
# Compose the help message:
HelpMessage="$ScriptName - Version: $Version
Creator: Alexander Chaplin Braz (https://alexchaplinbraz.com)
License: MIT
Usage: $ScriptName
MUST HAVE the *ID* at the end of custom_layout_format in youtube-viewer.conf.
Example:
custom_layout_format => \"*TITLE* (*AUTHOR*) [*TIME*] *ID*\"
"
case $1 in
-h|--help) printf '%s' "$HelpMessage"; exit 0;;
-v|--version) printf '%s - Version: %s\n' "$ScriptName" "$Version"; exit 0;;
esac
error() { printf 'ERROR: %s\n' "$1" 1>&2; }
suggest_help_and_exit() {
printf "Try '%s --help' for more information.\n" "$ScriptName" 1>&2
exit 1
}
YTURL='https://www.youtube.com/watch?v='
MenuSimple='1. Simple search.'
MenuHistory='2. History.'
MenuPlaylist='3. Playlist search.'
MenuChannel='4. Channel search.'
ChosenMenu=$(printf '%s\n%s\n%s\n%s' \
"$MenuSimple" \
"$MenuHistory" \
"$MenuPlaylist" \
"$MenuChannel" \
| dmenu -i -l 10 -p "$ScriptName:")
if [ "$ChosenMenu" = "$MenuSimple" ]; then
Search=$(printf '' | dmenu -p 'Simple search:')
[ -z "$Search" ] && exit 1
printf '%s\n' "$Search" >> "$LSHARE/dytsearchhistory"
YTID=$(youtube-viewer --no-interactive "$Search" \
| sed '/^$/d' \
| nl -n ln \
| dmenu -i -l 30 -p 'Select video:')
[ -z "$YTID" ] && exit 1
printf '%s\n' "$YTID" >> "$LSHARE/dytvideohistory"
mpv "$YTURL${YTID##* }"
elif [ "$ChosenMenu" = "$MenuHistory" ]; then
HistoryMenu=$(printf '1. Search history.\n2. Video history.' \
| dmenu -i -l 10 -p 'Which history?')
if [ "$HistoryMenu" = '1. Search history.' ]; then
Search=$(cat "$LSHARE/dytsearchhistory" \
| awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' \
| dmenu -i -l 30 -p 'Select previous search:')
[ -z "$Search" ] && exit 1
printf '%s\n' "$Search" >> "$LSHARE/dytsearchhistory"
YTID=$(youtube-viewer --no-interactive "$Search" \
| sed '/^$/d' \
| nl -n ln \
| dmenu -i -l 30 -p 'Select video:')
printf '%s\n' "$YTID" >> "$LSHARE/dytvideohistory"
elif [ "$HistoryMenu" = '2. Video history.' ]; then
YTID=$(cat "$LSHARE/dytvideohistory" \
| awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' \
| dmenu -i -l 30 -p 'Select previous video:')
else
exit 1
fi
[ -z "$YTID" ] && exit 1
mpv "$YTURL${YTID##* }"
elif [ "$ChosenMenu" = "$MenuPlaylist" ]; then
### Can't find how to change the format for anything other than video list
### so it's broken. Can parse it in another way, but it's ugly.
### Can also just open youtube-viewer as intended.
exit 1
Search=$(printf '' | dmenu -p 'Playlist search:')
[ -z "$Search" ] && exit 1
YTID=$(youtube-viewer --no-interactive -sp "$Search" \
| sed '/^$/d' \
| dmenu -i -l 30 -p 'Select playlist:')
[ -z "$YTID" ] && exit 1
mpv "$YTURL${YTID##* }"
elif [ "$ChosenMenu" = "$MenuChannel" ]; then
exit 1
elif [ -z "$ChosenMenu" ]; then
exit 1
else
error 'invalid selection.'
suggest_help_and_exit
fi
nn

1
.local/bin/emojenu Symbolic link
View File

@ -0,0 +1 @@
/home/dizzy/proj/emojenu/emojenu

10
.local/bin/refresh_wallpaper Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
pkill -9 feh
feh --no-fehbg --bg-fill ~/proj/sysconf/wallpapers/wallpaper
rm -r ~/.cache/wal/
wal -i ~/proj/sysconf/wallpapers/wallpaper
xrdb ~/.cache/wal/colors.Xresources
cp ~/.cache/wal/dunstrc ~/.config/dunst/dunstrc
pkill -9 dunst

5
.local/bin/upload_file Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
file=$(find $HOME -type f | dmenu -i -l 25)
curl -F "file=@$file" 0x0.st | xclip -selection c
notify-send "Your file link is in clipboard"

1
.local/bin/wal-discord Symbolic link
View File

@ -0,0 +1 @@
/home/dizzy/proj/wal-discord/wal-discord

69
.local/bin/yt Executable file
View File

@ -0,0 +1,69 @@
#!/bin/bash
# dependencies: mpv youtube-dl fzf rofi/dmenu
# search videos and playlists on youtube and play them in mpv, without an API
# usage:
# yt asks for input in stdin, prompts using fzf
# yt search query takes input from the passed arg, prompts using fzf
# yt -r takes input and prompts using rofi ($guicmd)
defcmd="fzf"
#guicmd="rofi -dmenu -i" #uncomment next line for dmenu
guicmd="dmenu -i -l 15"
promptcmd="$defcmd"
if [ -z "$*" ]; then
echo -n "Search YouTube: "
read -r query
else
case "$1" in
-r) query=$(echo | $guicmd -p "Search YouTube: ")
promptcmd="$guicmd -p Video:";;
*) query="$*";;
esac
fi
if [ -z "$query" ]; then exit; fi
# sanitise the query
query=$(sed \
-e 's|+|%2B|g'\
-e 's|#|%23|g'\
-e 's|&|%26|g'\
-e 's| |+|g'\
<<< "$query")
# fetch the results with the $query and
# delete all escaped characters
response="$(curl -s "https://www.youtube.com/results?search_query=$query" |\
sed 's|\\.||g')"
# if unable to fetch the youtube results page, inform and exit
if ! grep -q "script" <<< "$response"; then echo "unable to fetch yt"; exit 1; fi
# regex expression to match video and playlist entries from yt result page
vgrep='"videoRenderer":{"videoId":"\K.{11}".+?"text":".+?[^\\](?=")'
pgrep='"playlistRenderer":{"playlistId":"\K.{34}?","title":{"simpleText":".+?[^\"](?=")'
# grep the id and title
# return them in format id (type) title
getresults() {
grep -oP "$1" <<< "$response" |\
awk -F\" -v p="$2" '{ print $1 "\t" p " " $NF}'
}
# get the list of videos/playlists and their ids in videoids and playlistids
videoids=$(getresults "$vgrep")
playlistids=$(getresults "$pgrep" "(playlist)")
# if there are playlists or videos, append them to list
[ -n "$playlistids" ] && ids="$playlistids\n"
[ -n "$videoids" ] && ids="$ids$videoids"
# url prefix for videos and playlists
videolink="https://youtu.be/"
playlink="https://youtube.com/playlist?list="
# prompt the results to user infinitely until they exit (escape)
while true; do
echo "Choose Video/Playlist to play: "
choice=$(echo -e "$ids" | cut -d' ' -f2 | $promptcmd) # dont show id
if [ -z "$choice" ]; then exit; fi # if esc-ed then exit
id=$(echo -e "$ids" | grep -Fwm1 "$choice" | cut -d' ' -f1) # get id of choice
echo -e "$choice\t($id)"
case $id in
# 11 digit id = video
???????????) mpv "$videolink$id";;
# 34 digit id = playlist
??????????????????????????????????) mpv "$playlink$id";;
*) exit ;;
esac
done