update
This commit is contained in:
parent
48d44e32a7
commit
8b0f5c8157
3
.bashrc
3
.bashrc
|
@ -24,5 +24,8 @@ esac
|
||||||
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
|
[ -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="\[\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 ~/.config/env
|
||||||
|
source "/home/dizzy/.local/share/cargo/env"
|
||||||
|
|
|
@ -96,7 +96,7 @@ font:
|
||||||
# - (macOS) Menlo
|
# - (macOS) Menlo
|
||||||
# - (Linux/BSD) monospace
|
# - (Linux/BSD) monospace
|
||||||
# - (Windows) Consolas
|
# - (Windows) Consolas
|
||||||
family: Terminus
|
family: iosevka
|
||||||
|
|
||||||
# The `style` can be specified to pick a specific face.
|
# The `style` can be specified to pick a specific face.
|
||||||
style: Regular
|
style: Regular
|
||||||
|
@ -107,7 +107,7 @@ font:
|
||||||
#
|
#
|
||||||
# If the bold family is not specified, it will fall back to the
|
# If the bold family is not specified, it will fall back to the
|
||||||
# value specified for the normal font.
|
# value specified for the normal font.
|
||||||
family: Terminus
|
family: iosevka
|
||||||
|
|
||||||
# The `style` can be specified to pick a specific face.
|
# The `style` can be specified to pick a specific face.
|
||||||
style: Bold
|
style: Bold
|
||||||
|
@ -118,7 +118,7 @@ font:
|
||||||
#
|
#
|
||||||
# If the italic family is not specified, it will fall back to the
|
# If the italic family is not specified, it will fall back to the
|
||||||
# value specified for the normal font.
|
# value specified for the normal font.
|
||||||
family: Terminus
|
family: iosevka
|
||||||
|
|
||||||
# The `style` can be specified to pick a specific face.
|
# The `style` can be specified to pick a specific face.
|
||||||
style: Italic
|
style: Italic
|
||||||
|
@ -129,13 +129,13 @@ font:
|
||||||
#
|
#
|
||||||
# If the bold italic family is not specified, it will fall back to the
|
# If the bold italic family is not specified, it will fall back to the
|
||||||
# value specified for the normal font.
|
# value specified for the normal font.
|
||||||
family: Terminus
|
family: iosevka
|
||||||
|
|
||||||
# The `style` can be specified to pick a specific face.
|
# The `style` can be specified to pick a specific face.
|
||||||
style: Bold Italic
|
style: Bold Italic
|
||||||
|
|
||||||
# Point size
|
# Point size
|
||||||
size: 11.0
|
size: 9.0
|
||||||
|
|
||||||
# Offset is the extra space around each character. `offset.y` can be thought of
|
# 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.
|
# as modifying the line spacing, and `offset.x` as modifying the letter spacing.
|
||||||
|
@ -163,15 +163,15 @@ font:
|
||||||
colors:
|
colors:
|
||||||
# Default colors
|
# Default colors
|
||||||
primary:
|
primary:
|
||||||
background: '#1d1f21'
|
background: '#000000'
|
||||||
foreground: '#c5c8c6'
|
foreground: '#FFFFFF'
|
||||||
|
|
||||||
# Bright and dim foreground colors
|
# Bright and dim foreground colors
|
||||||
#
|
#
|
||||||
# The dimmed foreground color is calculated automatically if it is not present.
|
# 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`
|
# If the bright foreground color is not set, or `draw_bold_text_with_bright_colors`
|
||||||
# is `false`, the normal foreground color will be used.
|
# is `false`, the normal foreground color will be used.
|
||||||
dim_foreground: '#828482'
|
dim_foreground: '#FFFFFF'
|
||||||
bright_foreground: '#eaeaea'
|
bright_foreground: '#eaeaea'
|
||||||
|
|
||||||
# Cursor colors
|
# Cursor colors
|
||||||
|
@ -310,7 +310,7 @@ colors:
|
||||||
#
|
#
|
||||||
# Window opacity as a floating point number from `0.0` to `1.0`.
|
# 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.
|
# The value `0.0` is completely transparent and `1.0` is opaque.
|
||||||
background_opacity: 1.00
|
background_opacity: 0.95
|
||||||
|
|
||||||
#selection:
|
#selection:
|
||||||
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
|
#semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
binlist=(
|
binlist=(
|
||||||
#'~/.config/cdm/dwm-cdm' # Launch dwm,
|
#'~/.config/cdm/dwm-cdm' # Launch dwm,
|
||||||
'startx ~/.config/cdm/dwm-xinit' # 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,
|
'startx ~/.config/cdm/mate-xinit' # Launch mate desktop,
|
||||||
'/bin/bash --login' # Execute your Shell,
|
'/bin/bash --login' # Execute your Shell,
|
||||||
'reboot' # Reboot
|
'reboot' # Reboot
|
||||||
|
@ -22,7 +22,7 @@ binlist=(
|
||||||
# Names with whitespaces should be quoted or escaped.
|
# Names with whitespaces should be quoted or escaped.
|
||||||
#
|
#
|
||||||
# (Continued example:)
|
# (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.
|
# Type of the programs, one-by-one matched with $binlist.
|
||||||
# `C' for *C*onsole programs, which would be `exec'ed.
|
# `C' for *C*onsole programs, which would be `exec'ed.
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
exec feh --no-fehbg --bg-fill ~/proj/sysconf/wallpapers/wallpaper &
|
exec feh --no-fehbg --bg-fill ~/proj/sysconf/wallpapers/wallpaper &
|
||||||
exec rm -r ~/.cache/wal &
|
exec rm ~/.cache/wal/ &
|
||||||
exec wal -i ~/proj/sysconf/wallpapers/wallpaper &
|
|
||||||
#exec statusbar &
|
#exec statusbar &
|
||||||
exec slstatus &
|
exec slstatus &
|
||||||
exec picom --config ~/.config/picom.conf &
|
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 /usr/lib/kdeconnectd &
|
||||||
#exec dunst &
|
#exec dunst &
|
||||||
exec xmodmap ~/.config/Xmodmap &
|
exec xmodmap ~/.config/Xmodmap &
|
||||||
exec xrdb -merge ~/.cache/wal/colors.Xresources &
|
exec xrdb ~/.cache/wal/colors.Xresources &
|
||||||
exec source ~/.config/env &
|
exec source ~/.config/env &
|
||||||
|
exec xscreensaver -no-splash &
|
||||||
exec dbus-launch dwm
|
exec dbus-launch dwm
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
export XDG_CONFIG_HOME="$HOME/.config"
|
export XDG_CONFIG_HOME="$HOME/.config"
|
||||||
export XDG_CACHE_HOME="$HOME/.cache"
|
export XDG_CACHE_HOME="$HOME/.cache"
|
||||||
export XDG_DATA_HOME="$HOME/.local/share"
|
export XDG_DATA_HOME="$HOME/.local/share"
|
||||||
|
export XDG_BIN_HOME="$HOME/.local/bin"
|
||||||
|
|
||||||
# Default Programs
|
# Default Programs
|
||||||
export EDITOR="nvim"
|
export EDITOR="nvim"
|
||||||
|
@ -12,6 +13,7 @@ export TERMINAL="alacritty"
|
||||||
export BROWSER="firefox"
|
export BROWSER="firefox"
|
||||||
|
|
||||||
export PATH="$XDG_DATA_HOME/gem/bin:$PATH"
|
export PATH="$XDG_DATA_HOME/gem/bin:$PATH"
|
||||||
|
export PATH="$XDG_BIN_HOME:$PATH"
|
||||||
|
|
||||||
export GPG_TTY=$(tty)
|
export GPG_TTY=$(tty)
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -1,50 +1,72 @@
|
||||||
# Firejail profile for Newsboat
|
# Firejail profile for Newsboat
|
||||||
# Description: RSS program
|
# 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 newsboat.local
|
||||||
include disable-devel.inc
|
## Persistent global definitions
|
||||||
include disable-exec.inc
|
#include globals.local
|
||||||
include disable-interpreters.inc
|
#
|
||||||
include disable-passwdmgr.inc
|
#noblacklist ${HOME}/.config/newsboat
|
||||||
include disable-programs.inc
|
#noblacklist ${HOME}/.cache/newsboat
|
||||||
include disable-xdg.inc
|
#noblacklist ${HOME}/vimwiki/news/
|
||||||
|
#whitelist ${HOME}/.config/newsboat
|
||||||
mkdir ${HOME}/.config/newsboat
|
#whitelist ${HOME}/.cache/newsboat
|
||||||
whitelist ${HOME}/.config/newsboat
|
#whitelist ${HOME}/vimwiki/news/
|
||||||
include whitelist-common.inc
|
#
|
||||||
include whitelist-runuser-common.inc
|
### mpv
|
||||||
include whitelist-var-common.inc
|
##private-bin mpv
|
||||||
|
##whitelist ${HOME}/.config/mpv
|
||||||
caps.drop all
|
##whitelist ${HOME}/.config/youtube-dl
|
||||||
ipc-namespace
|
##whitelist ${HOME}/.netrc
|
||||||
netfilter
|
##include whitelist-common.inc
|
||||||
no3d
|
##include whitelist-players.inc
|
||||||
nodvd
|
##whitelist /usr/share/lua
|
||||||
nogroups
|
##whitelist /usr/share/lua*
|
||||||
nonewprivs
|
##whitelist /usr/share/vulkan
|
||||||
noroot
|
##include whitelist-usr-share-common.inc
|
||||||
notv
|
##include whitelist-var-common.inc
|
||||||
nou2f
|
##private-bin env,mpv,python*,waf,youtube-dl
|
||||||
novideo
|
#
|
||||||
protocol inet,inet6
|
## Lynx private-bin sh,gzip,lynx
|
||||||
seccomp
|
##private-etc lynx.cfg,lynx.lss
|
||||||
shell none
|
#
|
||||||
|
#include disable-common.inc
|
||||||
disable-mnt
|
#include disable-devel.inc
|
||||||
private-bin newsboat
|
#include disable-exec.inc
|
||||||
private-cache
|
#include disable-interpreters.inc
|
||||||
private-dev
|
#include disable-passwdmgr.inc
|
||||||
private-etc alternatives,ca-certificates,crypto-policies,pki,resolv.conf,ssl,terminfo
|
#include disable-programs.inc
|
||||||
private-tmp
|
#include disable-xdg.inc
|
||||||
|
#
|
||||||
dbus-user none
|
##mkdir ${HOME}/.newsboat
|
||||||
dbus-system none
|
#whitelist ${HOME}/.newsboat
|
||||||
|
#include whitelist-common.inc
|
||||||
memory-deny-write-execute
|
#
|
||||||
|
#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
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -1527,7 +1527,7 @@ SAVE_SPACE:~/dl/
|
||||||
.h2 EMACS_KEYS_ALWAYS_ON
|
.h2 EMACS_KEYS_ALWAYS_ON
|
||||||
# Vi or Emacs movement keys, i.e. familiar hjkl or ^N^P^F^B .
|
# 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 .
|
# 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
|
#EMACS_KEYS_ALWAYS_ON:FALSE
|
||||||
|
|
||||||
.h2 DEFAULT_KEYPAD_MODE
|
.h2 DEFAULT_KEYPAD_MODE
|
||||||
|
|
|
@ -1,16 +1,43 @@
|
||||||
|
# -- feeds
|
||||||
auto-reload yes
|
auto-reload yes
|
||||||
reload-threads 100
|
reload-threads 4
|
||||||
|
download-retries 4
|
||||||
|
download-timeout 10
|
||||||
cache-file "~/.config/newsboat/cache.db"
|
cache-file "~/.config/newsboat/cache.db"
|
||||||
|
|
||||||
# unbind keys
|
# -- display
|
||||||
unbind-key j
|
text-width 80
|
||||||
unbind-key k
|
|
||||||
unbind-key J
|
|
||||||
unbind-key K
|
|
||||||
|
|
||||||
# bind keys - vim style
|
# -- navigation
|
||||||
bind-key j down
|
goto-next-feed no
|
||||||
bind-key k up
|
|
||||||
bind-key l open
|
browser "lynx -nocolor"
|
||||||
bind-key h quit
|
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
|
||||||
|
|
|
@ -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"
|
|
|
@ -12,6 +12,10 @@ Plug 'tpope/vim-sleuth'
|
||||||
Plug 'editorconfig/editorconfig'
|
Plug 'editorconfig/editorconfig'
|
||||||
Plug 'airblade/vim-gitgutter'
|
Plug 'airblade/vim-gitgutter'
|
||||||
Plug 'preservim/nerdcommenter'
|
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()
|
call plug#end()
|
||||||
filetype plugin indent on
|
filetype plugin indent on
|
||||||
|
|
||||||
|
|
|
@ -1,147 +1,96 @@
|
||||||
[global]
|
[global]
|
||||||
### Display ###
|
font = Iosevka Term 9
|
||||||
|
|
||||||
# Which monitor should the notifications be displayed on.
|
markup = yes
|
||||||
monitor = 0
|
plain_text = no
|
||||||
|
format = "<b>%s</b>\n%b"
|
||||||
|
|
||||||
follow = mouse
|
sort = no
|
||||||
|
|
||||||
geometry = "300x5-30+20"
|
|
||||||
|
|
||||||
indicate_hidden = yes
|
indicate_hidden = yes
|
||||||
|
|
||||||
shrink = no
|
alignment = center
|
||||||
|
|
||||||
transparency = 0
|
bounce_freq = 0
|
||||||
|
|
||||||
notification_height = 0
|
show_age_threshold = -1
|
||||||
|
|
||||||
separator_height = 2
|
|
||||||
|
|
||||||
padding = 8
|
|
||||||
|
|
||||||
horizontal_padding = 8
|
|
||||||
|
|
||||||
frame_width = 3
|
|
||||||
|
|
||||||
frame_color = "{color4}"
|
|
||||||
|
|
||||||
separator_color = frame
|
|
||||||
|
|
||||||
sort = yes
|
|
||||||
|
|
||||||
idle_threshold = 120
|
|
||||||
|
|
||||||
### Text ###
|
|
||||||
|
|
||||||
font = Monospace 8
|
|
||||||
|
|
||||||
line_height = 0
|
|
||||||
|
|
||||||
markup = full
|
|
||||||
|
|
||||||
format = "<b>%s</b>\n%b"
|
|
||||||
|
|
||||||
alignment = left
|
|
||||||
|
|
||||||
vertical_alignment = center
|
|
||||||
|
|
||||||
show_age_threshold = 60
|
|
||||||
|
|
||||||
word_wrap = yes
|
word_wrap = yes
|
||||||
|
|
||||||
ellipsize = middle
|
|
||||||
|
|
||||||
ignore_newline = no
|
ignore_newline = no
|
||||||
|
|
||||||
stack_duplicates = true
|
stack_duplicates = yes
|
||||||
|
hide_duplicate_count = yes
|
||||||
|
|
||||||
hide_duplicate_count = false
|
geometry = "300x20-15+20"
|
||||||
|
|
||||||
show_indicators = yes
|
shrink = no
|
||||||
|
|
||||||
icon_position = left
|
transparency = 5
|
||||||
|
|
||||||
min_icon_size = 0
|
idle_threshold = 0
|
||||||
|
|
||||||
max_icon_size = 32
|
monitor = 0
|
||||||
|
|
||||||
icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
|
follow = none
|
||||||
|
|
||||||
sticky_history = yes
|
sticky_history = yes
|
||||||
|
|
||||||
history_length = 20
|
history_length = 15
|
||||||
|
|
||||||
|
show_indicators = no
|
||||||
|
|
||||||
|
line_height = 0
|
||||||
|
|
||||||
|
separator_height = 2
|
||||||
|
|
||||||
|
padding = 0
|
||||||
|
|
||||||
|
horizontal_padding = 0
|
||||||
|
|
||||||
|
separator_color = frame
|
||||||
|
|
||||||
|
startup_notification = false
|
||||||
|
|
||||||
dmenu = /usr/bin/dmenu -p dunst:
|
dmenu = /usr/bin/dmenu -p dunst:
|
||||||
|
|
||||||
browser = /usr/bin/firefox -new-tab
|
browser = /usr/bin/firefox -new-tab
|
||||||
|
|
||||||
always_run_script = true
|
icon_position = off
|
||||||
|
max_icon_size = 80
|
||||||
|
|
||||||
title = Dunst
|
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/
|
||||||
|
|
||||||
class = Dunst
|
frame_width = 1
|
||||||
|
frame_color = "#000000"
|
||||||
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
|
|
||||||
|
|
||||||
[shortcuts]
|
[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]
|
[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}"
|
foreground = "{foreground}"
|
||||||
timeout = 10
|
background = "{background}"
|
||||||
# Icon for notifications with low urgency, uncomment to enable
|
timeout = 4
|
||||||
#icon = /path/to/icon
|
|
||||||
|
|
||||||
[urgency_normal]
|
[urgency_normal]
|
||||||
background = "{background}"
|
|
||||||
foreground = "{foreground}"
|
foreground = "{foreground}"
|
||||||
timeout = 10
|
background = "{background}"
|
||||||
# Icon for notifications with normal urgency, uncomment to enable
|
timeout = 6
|
||||||
#icon = /path/to/icon
|
|
||||||
|
|
||||||
[urgency_critical]
|
[urgency_critical]
|
||||||
background = "{background}"
|
|
||||||
foreground = "{foreground}"
|
foreground = "{foreground}"
|
||||||
frame_color = "{color4}"
|
background = "{background}"
|
||||||
timeout = 0
|
timeout = 8
|
||||||
# Icon for notifications with critical urgency, uncomment to enable
|
|
||||||
#icon = /path/to/icon
|
|
||||||
# vim: ft=cfg
|
# vim: ft=cfg
|
||||||
|
|
|
@ -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"
|
|
@ -2,7 +2,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from protonvpn_cli.cli import main
|
from codeforces.cf_run import main
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
|
||||||
sys.exit(main())
|
sys.exit(main())
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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"\"
|
|
@ -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
|
|
@ -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
|
|
@ -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"
|
|
@ -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"\"
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -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"
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
/home/dizzy/proj/emojenu/emojenu
|
|
@ -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
|
|
@ -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"
|
|
@ -0,0 +1 @@
|
||||||
|
/home/dizzy/proj/wal-discord/wal-discord
|
|
@ -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
|
Loading…
Reference in New Issue