Dotfiles bankruptcy and rewrite! All hail, v2.0
This commit is contained in:
parent
d2da342f62
commit
bd9e49aa09
|
@ -1,12 +0,0 @@
|
|||
case $OSTYPE in
|
||||
darwin*)
|
||||
alias dkm='docker-machine'
|
||||
alias dki='eval $(docker-machine env)'
|
||||
;;
|
||||
linux*)
|
||||
alias docker='sudo docker'
|
||||
;;
|
||||
esac
|
||||
|
||||
alias dk='docker'
|
||||
alias dkc='docker-compose'
|
|
@ -1,12 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
case $OSTYPE in
|
||||
darwin*)
|
||||
brew cask install virtualbox
|
||||
brew install docker docker-compose docker-machine
|
||||
;;
|
||||
linux*)
|
||||
if [[ -f /etc/arch-release ]]; then
|
||||
sudo pacman --needed --noconfirm -S docker docker-compose
|
||||
fi
|
||||
esac
|
|
@ -1,28 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Pipes input to the weechat fifo (strips commented lines
|
||||
# and prepends * to commands).
|
||||
|
||||
fifos=$(echo "$HOME/.weechat/weechat_fifo_*")
|
||||
if [[ -z "$fifos" ]]; then
|
||||
>&2 echo "No FIFOs. Is weechat running?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rd() {
|
||||
if [ -t 0 ]; then
|
||||
cat $@
|
||||
else
|
||||
while read -r line; do
|
||||
echo $line
|
||||
done
|
||||
fi | sed '/^ *\(#\|$\)/ d;s/^/*/g'
|
||||
}
|
||||
|
||||
if [[ "$1" = "-d" ]]; then
|
||||
shift
|
||||
rd $@
|
||||
else
|
||||
rd $@ > $HOME/.weechat/weechat_fifo_*
|
||||
fi
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
case $OSTYPE in
|
||||
darwin*)
|
||||
brew install weechat
|
||||
;;
|
||||
linux*)
|
||||
if [[ -d /etc/arch-release ]]; then
|
||||
sudo pacman --needed --noconfirm -S weechat
|
||||
elif [[ -d /etc/debian_version ]]; then
|
||||
# TODO Untested
|
||||
sudo apt-get install -y weechat
|
||||
fi
|
||||
esac
|
||||
|
||||
# NOTE: init.sh needs to be run separately, afterward
|
||||
echo "Don't forget to run weechat/scripts/init.sh while weechat is open"
|
|
@ -1,27 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if ! pgrep weechat >/dev/null; then
|
||||
>&2 echo "Weechat isn't running, or fifo is off: /fifo enable"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ -f ~/.private/config/irc.conf ]]; then
|
||||
# ...otherwise, configure it!
|
||||
CWD=$(cd $(dirname $0) && pwd -P)
|
||||
|
||||
wee "/secure passphrase $(pass irc/master)"
|
||||
wee "/secure set username vnought"
|
||||
wee "/secure set freenode $(pass irc/freenode.net | head -n1)"
|
||||
wee "/secure set snoonet $(pass irc/snoonet.org | head -n1)"
|
||||
wee "/secure set oftc $(pass irc/oftc.net | head -n1)"
|
||||
wee "/secure set afternet $(pass irc/afternet.net | head -n1)"
|
||||
wee "/secure set pushover_key $(pass api/pushover/key)"
|
||||
wee "/secure set pushover_api $(pass api/pushover/api)"
|
||||
|
||||
wee "$CWD/../plugins.txt"
|
||||
wee "$CWD/../settings.txt"
|
||||
wee "$CWD/../servers.txt"
|
||||
else
|
||||
>&2 echo "Couldn't find secrets!"
|
||||
exit 1
|
||||
fi
|
12
.gitignore
vendored
12
.gitignore
vendored
|
@ -1,12 +0,0 @@
|
|||
.enabled.d/*
|
||||
*.log
|
||||
*.pid
|
||||
*.db
|
||||
|
||||
shell/+tmux/.tmux/plugins/
|
||||
shell/+tmux/.tmuxifier/
|
||||
|
||||
shell/+mpd/.config/mpd/mpd.*
|
||||
shell/+mpd/.config/mpd/mpdstate
|
||||
|
||||
+weechat/.weechat/*
|
105
README.md
105
README.md
|
@ -1,69 +1,72 @@
|
|||
[![MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat-square)](./LICENSE)
|
||||
# Mein dotfiles
|
||||
|
||||
# Henrik's dotfiles
|
||||
A tidy `$HOME` is a tidy mind.
|
||||
|
||||
<img src="http://i.giphy.com/ZHlGzvZb130nm.gif" align="right" />
|
||||
![Oct-2017 Screenshot of Arch Linux](assets/screenshots/OCT2017.png)
|
||||
|
||||
Fuel for my madness. Designed for Arch Linux, MacOS, and various remotes I
|
||||
frequent.
|
||||
My dotfiles are organized into 2-level topics (e.g. `shell/zsh`), and strive for
|
||||
minimum `$HOME` presence (adhering to XDG standards as much as possible).
|
||||
|
||||
It is organized into topics, some with their own READMEs. Check them out for
|
||||
more targeted information. The `./bootstrap` script is used to deploy and update
|
||||
them.
|
||||
+ Arch Linux
|
||||
+ wm: bspwm
|
||||
+ shell: zsh
|
||||
+ font: kakwafont
|
||||
+ bar: polybar
|
||||
|
||||
## Bootstrap
|
||||
## Quick start
|
||||
|
||||
`bootstrap` is my idempotent dotfile deployment script.
|
||||
`bash <(curl -s https://raw.githubusercontent.com/hlissner/dotfiles/master/bootstrap.sh)`
|
||||
|
||||
e.g. `./bootstrap os/+arch shell/+{zsh,tmux} dev/+pyenv`
|
||||
## Overview
|
||||
|
||||
```
|
||||
Usage: bootstrap [-iuldypLSU] [topic1[ topic2[ ...]]]
|
||||
```sh
|
||||
# general
|
||||
bin/ # global scripts
|
||||
assets/ # wallpapers, sounds, screenshots, etc
|
||||
|
||||
Options:
|
||||
-i Don't run install scripts
|
||||
-u Don't run update scripts
|
||||
-l Don't symlink dotfiles
|
||||
-d Do a dry run (only output commands, no changes)
|
||||
-y Overwrite conflicts (no prompts)
|
||||
-p Prompt on file conflict (to overwrite)
|
||||
-L Refresh links; the same as -ui
|
||||
-S Server mode; only install the bare minimum
|
||||
-U Update mode; run update scripts only
|
||||
# categories
|
||||
base/ # provisions my system with the bare essentials
|
||||
dev/ # relevant to software development & programming in general
|
||||
editor/ # configuration for my text editors
|
||||
misc/ # for various apps & tools
|
||||
shell/ # shell utilities, including zsh + bash
|
||||
```
|
||||
|
||||
Here's a simplified break down of what it does:
|
||||
## Dotfile management
|
||||
|
||||
```bash
|
||||
# 1. Symlinks dotfiles to $HOME
|
||||
ln -sfv $topic/.* ~/
|
||||
ln -sfv $topic/.{config,local}/* ~/.{config,local}/
|
||||
```
|
||||
Usage: deploy [-acdlLit] [TOPIC...]
|
||||
|
||||
# 2. Track enabled topics in ~/.dotfiles/.enabled.d.
|
||||
if [[ -e ~/.dotfiles/.enabled.d/$topic ]]; then
|
||||
# 3a. If topic is already enabled, run update script
|
||||
$topic/update
|
||||
-a Target all enabled topics (ignores TOPIC args)
|
||||
-c Afterwards, remove dead symlinks & empty dot-directories in $HOME.
|
||||
Can be used alone.
|
||||
-d Unlink and run `./_init clean` for topic(s)
|
||||
-l Only relink topic(s) (implies -i)
|
||||
-L List enabled topics
|
||||
-i Inhibit install/update/clean init scripts
|
||||
-t Do a test run; do not actually do anything
|
||||
```
|
||||
|
||||
e.g.
|
||||
+ `deploy base/arch shell/{zsh,tmux}`: enables base/arch, shell/zsh, & shell/tmux
|
||||
+ `deploy -d shell/zsh`: disables shell/zsh & cleans up after it
|
||||
+ `deploy -l shell/zsh`: refresh links for shell/zsh (inhibits init script)
|
||||
|
||||
Here's a breakdown of what the script does:
|
||||
|
||||
``` sh
|
||||
cd $topic
|
||||
if [[ -L $DOTFILES_DATA/${topic//\//.}.topic ]]; then
|
||||
./_init update
|
||||
else
|
||||
# 3b. Otherwise, run install script
|
||||
ln -sfv $topic ~/.dotfiles/.enabled.d/
|
||||
$topic/install
|
||||
ln -sfv $DOTFILES/$topic $DOTFILES_DATA/${topic//\//.}.topic
|
||||
|
||||
./_init install
|
||||
./_init link
|
||||
fi
|
||||
```
|
||||
|
||||
## Clean
|
||||
## Relevant projects
|
||||
|
||||
`clean` deletes broken symlinks in `$HOME`. If passed `-u`, it will remove all
|
||||
symlinks in `.enabled.d/`, marking all topics as "disabled".
|
||||
|
||||
```
|
||||
Usage: clean [-du]
|
||||
|
||||
Options:
|
||||
-d Do a dry run (only output commands, no changes)
|
||||
-u Uninstall all enabled topics
|
||||
```
|
||||
|
||||
## Other Relevant Configs
|
||||
|
||||
+ [Vim](https://github.com/hlissner/.vim) (pulled in by the `editor/vim` topic)
|
||||
+ [Emacs](https://github.com/hlissner/.emacs.d) (pulled in by the `editor/emacs` topic)
|
||||
+ [doom-emacs](https://github.com/hlissner/doom-emacs) (pulled by `editor/emacs`)
|
||||
+ [.vim](https://github.com/hlissner/.vim) (pulled by `editor/{neo,}vim`)
|
||||
|
|
BIN
assets/screenshots/OCT2017.png
Normal file
BIN
assets/screenshots/OCT2017.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 584 KiB |
BIN
assets/sounds/ding.ogg
Normal file
BIN
assets/sounds/ding.ogg
Normal file
Binary file not shown.
BIN
assets/sounds/startup.ogg
Normal file
BIN
assets/sounds/startup.ogg
Normal file
Binary file not shown.
BIN
assets/sounds/updates.ogg
Normal file
BIN
assets/sounds/updates.ogg
Normal file
Binary file not shown.
BIN
assets/wallpapers/blue-forest-landscape.2560x1440.jpg
Normal file
BIN
assets/wallpapers/blue-forest-landscape.2560x1440.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 551 KiB |
BIN
assets/wallpapers/game-systems.2560x1600.png
Normal file
BIN
assets/wallpapers/game-systems.2560x1600.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
assets/wallpapers/the-godking.2560x1600.jpg
Normal file
BIN
assets/wallpapers/the-godking.2560x1600.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 805 KiB |
111
base/arch/Xresources
Normal file
111
base/arch/Xresources
Normal file
|
@ -0,0 +1,111 @@
|
|||
!! OCT-2017
|
||||
|
||||
!! Colors
|
||||
#define blk #141517
|
||||
#define bblk #969896
|
||||
#define red #cc6666
|
||||
#define bred #de935f
|
||||
#define grn #b5bd68
|
||||
#define bgrn #757d28
|
||||
#define ylw #f0c674
|
||||
#define bylw #f9a03f
|
||||
#define blu #81a2be
|
||||
#define bblu #2a8fed
|
||||
#define mag #b294bb
|
||||
#define bmag #bc77a8
|
||||
#define cyn #8abeb7
|
||||
#define bcyn #a3685a
|
||||
#define wht #c5c8c6
|
||||
#define bwht #ffffff
|
||||
#define bg blk
|
||||
#define fg wht
|
||||
|
||||
*.foreground: fg
|
||||
*.background: bg
|
||||
*.cursorColor: mag
|
||||
|
||||
*.color0: blk
|
||||
*.color8: bblk
|
||||
*.color1: red
|
||||
*.color9: bred
|
||||
*.color2: grn
|
||||
*.color10: bgrn
|
||||
*.color3: ylw
|
||||
*.color11: bylw
|
||||
*.color4: blu
|
||||
*.color12: bblu
|
||||
*.color5: mag
|
||||
*.color13: bmag
|
||||
*.color6: cyn
|
||||
*.color14: bcyn
|
||||
*.color7: wht
|
||||
*.color15: bwht
|
||||
|
||||
! greys
|
||||
*.color234: #1d2021
|
||||
*.color235: #282828
|
||||
*.color236: #32302f
|
||||
*.color237: #3c3836
|
||||
*.color239: #504945
|
||||
*.color240: #544c49
|
||||
*.color241: #665c54
|
||||
|
||||
|
||||
!! Settings
|
||||
! font rendering
|
||||
Xft.hinting: 0
|
||||
Xft.antialias: 1
|
||||
Xft.autohint: 1
|
||||
Xft.hintstyle: hintslight
|
||||
Xft.lcdfilter: lcddefault
|
||||
Xft.rgba: rgb
|
||||
|
||||
! cursor
|
||||
Xcursor.theme: default
|
||||
Xcursor.size: 32
|
||||
|
||||
! emacs
|
||||
Emacs.toolBar: 0
|
||||
Emacs.menuBar: 0
|
||||
Emacs.verticalScrollBars: off
|
||||
|
||||
! urxvt
|
||||
URxvt*.background: [96]blk
|
||||
URxvt*.termName: xterm-256color
|
||||
URxvt*.geometry: 81x20
|
||||
URxvt*.buffered: true
|
||||
URxvt*.cursorBlink: true
|
||||
URxvt*.underlineColor: grey
|
||||
URxvt*.depth: 32
|
||||
URxvt*.borderless: 1
|
||||
URxvt*.lineSpace: 1
|
||||
URxvt*.letterSpace: 0
|
||||
URxvt.iso14755: false
|
||||
URxvt.iso14755_52: false
|
||||
URxvt*.internalBorder: 14
|
||||
URxvt*.scrollBar: false
|
||||
URxvt*.saveLines: 5000
|
||||
URxvt*.loginShell: false
|
||||
URxvt.perl-ext-common: default,matcher
|
||||
URxvt*.matcher.button: 1
|
||||
URxvt*.matcher.rend.0: Uline Bold fg5
|
||||
URxvt*.url-launcher: firefox
|
||||
!URxvt.keysym.Shift-Control-C: perl:clipboard:copy
|
||||
!URxvt.keysym.Shift-Control-V: perl:clipboard:paste
|
||||
URxvt.clipboard.autocopy: true
|
||||
|
||||
URxvt*.font: xft:kakwa kakwafont:pixelsize=12
|
||||
urxvt-scratch.font: xft:Misc Tamsyn:pixelsize=16
|
||||
urxvt-fuzzy.font: xft:Misc Tamsyn:pixelsize=18
|
||||
urxvt-fuzzy.boldFont: xft:Misc Tamsyn:pixelsize=18
|
||||
urxvt-fuzzy.lineSpace: 4
|
||||
|
||||
urxvt-stream.lineSpace: 0
|
||||
urxvt-stream.letterSpace: -1
|
||||
urxvt-stream.font: xft:Fira Mono:pixelsize=17
|
||||
|
||||
! URxvt*.lineSpace: 0
|
||||
! URxvt*.letterSpace: -1
|
||||
! URxvt*.font: xft:Fira Mono:pixelsize=14
|
||||
! urxvt-scratch.font: xft:Fira Mono:pixelsize=18
|
||||
! urxvt-fuzzy.font: xft:Fira Mono:pixelsize=20
|
84
base/arch/_init
Executable file
84
base/arch/_init
Executable file
|
@ -0,0 +1,84 @@
|
|||
#!/usr/bin/env zsh
|
||||
source ${0:A:h}/../../deploy
|
||||
|
||||
install() {
|
||||
if ! nc -z 8.8.8.8 53 >/dev/null 2>&1; then
|
||||
>&2 echo "No internet connection"
|
||||
return 1
|
||||
elif ! sudo pacman -Syu --noconfirm; then
|
||||
>&2 echo "Could not update pacman"
|
||||
return 2
|
||||
fi
|
||||
|
||||
# Core essentials
|
||||
sudo pacman --needed --noconfirm -S wget git curl tree rsync dnsutils
|
||||
|
||||
# Set up pacaur (AUR helper)
|
||||
if ! _is_callable pacaur; then
|
||||
TEMP="$(mktemp -d)"
|
||||
pushd $TEMP
|
||||
for pkg in cower pacaur; do
|
||||
if [[ ! "$(pacman -Qs $pkg)" ]]; then
|
||||
curl -o PKGBUILD https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=$pkg && \
|
||||
makepkg PKGBUILD --needed --noconfirm --skippgpcheck -sri
|
||||
fi
|
||||
done
|
||||
popd
|
||||
rm -rf $TEMP
|
||||
|
||||
if ! _is_callable pacaur; then
|
||||
>&2 echo "Pacaur was not successfully installed"
|
||||
return 3
|
||||
fi
|
||||
fi
|
||||
|
||||
pacaur --needed --noconfirm --noedit -S \
|
||||
wget curl ripgrep the_silver_searcher bc cronie youtube-dl \
|
||||
xorg-server xorg-xinit xorg-xlsfonts xorg-xfd xdotool \
|
||||
lightdm lightdm-mini-greeter \
|
||||
bspwm sxhkd compton dunst xcb-proto polybar libnotify \
|
||||
rvxt-unicode rvxt-unicode-terminfo \
|
||||
slop feh maim ffmpeg zbar \
|
||||
keybase-bin pass pass-otp \
|
||||
neofetch glances inxi dfc \
|
||||
ttf-fira-{mono,sans} ttf-font-awesome tamsym-font siji-git \
|
||||
adwaita-icon-theme adwaita-slim-gtk-theme
|
||||
|
||||
# install crontab
|
||||
sudo systemctl enable cronie
|
||||
crontab ./crontab
|
||||
|
||||
# raise inotify limit
|
||||
sudo tee -a /etc/sysctl.d/99-sysctl.conf <<<"fs.inotify.max_user_watches=524288"
|
||||
|
||||
# set up lightdm + minigreeter
|
||||
sudo systemctl enable lightdm
|
||||
sudo sed -i \
|
||||
-e "s@^#?\(greeter-session=\).+@\1lightdm-mini-greeter@" \
|
||||
-e "s@^#?\(user-session=\).+@\1bspwm@" \
|
||||
/etc/lightdm/lightdm.conf
|
||||
sudo sed -i \
|
||||
-e "s@^\(user = \).+@\1${USER}@" \
|
||||
-e "s@^\(show-password-label = \).+@\1false@" \
|
||||
-e "s@^\(background-color = \).+@\1\"#000000\"@;" \
|
||||
/etc/lightdm/lightdm-mini-greeter.conf
|
||||
}
|
||||
|
||||
update() {
|
||||
_is_callable pacaur && local pac=pacaur
|
||||
${pac:-sudo pacman} -Syu --noconfirm
|
||||
}
|
||||
|
||||
link() {
|
||||
mklink xprofile ~/.xprofile
|
||||
mklink config/* $XDG_CONFIG_HOME/
|
||||
mklink fonts/* $XDG_DATA_HOME/fonts/
|
||||
mklink -s pacman/*.hook /etc/pacman.d/hooks/
|
||||
}
|
||||
|
||||
clean() {
|
||||
rm -fv $XDG_DATA_HOME/fonts/*(@N)
|
||||
sudo rm -fv /etc/pacman.d/hooks/*(@N)
|
||||
}
|
||||
|
||||
init "$@"
|
22
base/arch/aliases.zsh
Normal file
22
base/arch/aliases.zsh
Normal file
|
@ -0,0 +1,22 @@
|
|||
alias ls="${aliases[ls]:-ls} --color=auto --group-directories-first"
|
||||
|
||||
alias kb=keybase
|
||||
alias sc=systemctl
|
||||
alias ssc='sudo systemctl'
|
||||
|
||||
alias pac=pacaur
|
||||
alias pacu='pacaur -Syu' # upgrade
|
||||
alias pacc='pacaur -Sc' # clean pacman
|
||||
alias paco='pacaur -Qtdq' # orphaned packages
|
||||
|
||||
alias reboot='sudo systemctl reboot'
|
||||
alias shutdown='sudo systemctl poweroff'
|
||||
|
||||
# Clipboard pipes
|
||||
if _is_callable xclip; then
|
||||
alias y='xclip -selection clipboard -in'
|
||||
alias p='xclip -selection clipboard -out'
|
||||
elif _is_callable xsel; then
|
||||
alias y='xsel -i --clipboard'
|
||||
alias p='xsel -o --clipboard'
|
||||
fi
|
37
base/arch/bin/bspc-focus
Executable file
37
base/arch/bin/bspc-focus
Executable file
|
@ -0,0 +1,37 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# bspc-focus
|
||||
# Jump to the next window in a direction. If -m is supplied, jump to the next
|
||||
# monitor in that direction.
|
||||
#
|
||||
# Makes switching nodes more intuitive.
|
||||
#
|
||||
# Usage: bspc-focus [-m] (west|south|north|east)
|
||||
# Example:
|
||||
# + bspc-focus south
|
||||
# + bspc-focus -m west
|
||||
|
||||
set -e
|
||||
|
||||
leap=
|
||||
if [[ $1 == -m ]]; then
|
||||
leap=1; shift
|
||||
fi
|
||||
dir=$1
|
||||
|
||||
case $dir in west|south|north|east) ;;
|
||||
*) >&2 echo "Not a valid direction: $dir"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
if [[ $leap ]]; then
|
||||
# jump to monitor in direction
|
||||
bspc monitor -f "$dir"
|
||||
else
|
||||
# jump to window in direction (unless at edge of last monitor)
|
||||
if ! bspc node -f "$dir.local"; then
|
||||
if [[ $(bspc query -M -m "$dir") ]]; then
|
||||
bspc monitor -f "$dir"
|
||||
fi
|
||||
fi
|
||||
fi
|
45
base/arch/bin/bspc-swap
Executable file
45
base/arch/bin/bspc-swap
Executable file
|
@ -0,0 +1,45 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# bspc-swap
|
||||
# swaps current window with the next window in a direction. If -m is set, moves
|
||||
# window to the next monitor in that direction.
|
||||
#
|
||||
# Makes swapping nodes more intuitive.
|
||||
#
|
||||
# Usage: bspc-swap (west|south|north|east) (1|0)
|
||||
# Example:
|
||||
# + bspc-swap south
|
||||
# + bspc-swap -m west
|
||||
|
||||
set -e
|
||||
|
||||
leap=
|
||||
if [[ $1 == -m ]]; then
|
||||
leap=1
|
||||
dir=$2
|
||||
else
|
||||
dir=$1
|
||||
fi
|
||||
|
||||
case $dir in west|south|north|east) ;;
|
||||
*) >&2 echo "Not a valid direction: $dir"
|
||||
exit 1
|
||||
esac
|
||||
|
||||
if [[ $leap ]]; then
|
||||
# move window to monitor in direction
|
||||
old_id=$(bspc query -N -n focused)
|
||||
if [[ $(bspc query -M -m "$dir") ]]; then
|
||||
bspc node -m "$dir"
|
||||
bspc node -f "$old_id"
|
||||
fi
|
||||
else
|
||||
# move window in direction
|
||||
old_id=$(bspc query -N -n focused)
|
||||
if bspc node -s "$dir.local"; then
|
||||
bspc node -f "$old_id"
|
||||
elif [[ $(bspc query -M -m "$dir") ]]; then
|
||||
bspc node -m "$dir"
|
||||
bspc node -f "$old_id"
|
||||
fi
|
||||
fi
|
3
base/arch/bin/firefox
Executable file
3
base/arch/bin/firefox
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
# A shim to make firefox believe HOME is elsewhere
|
||||
HOME="$XDG_DATA_HOME/mozilla" exec /usr/bin/firefox "$@"
|
2
base/arch/bin/headless-notify-send
Executable file
2
base/arch/bin/headless-notify-send
Executable file
|
@ -0,0 +1,2 @@
|
|||
#!/usr/bin/env bash
|
||||
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/notify-send "$@"
|
12
base/arch/bin/inject-xcolors
Executable file
12
base/arch/bin/inject-xcolors
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
xcolor() {
|
||||
xrdb -query | awk "/^\*\.$1:/ {print \$2}" | sed -E 's/^[^#]+//'
|
||||
}
|
||||
|
||||
COLOR_FG=$(xcolor foreground)
|
||||
COLOR_BG=$(xcolor background)
|
||||
for ((i=0;i<=15;i++)); do
|
||||
eval "COLOR_$i=\$(xcolor color$i)"
|
||||
done
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# A script run by devmon/udevil when a device is mounted or unmounted, notifying me.
|
||||
|
||||
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send -a "devmon" "Device change" "$2"
|
|
@ -7,4 +7,8 @@ dest=${1:-$(mktemp -t recXXX.webm)}
|
|||
|
||||
ffmpeg -f x11grab -s "$W"x"$H" -i :0.0+$X,$Y "$dest"
|
||||
|
||||
# vim:set ft=sh:
|
||||
if [[ -f $dest ]]; then
|
||||
mv $dest .
|
||||
fi
|
||||
|
||||
# vim:set ft=sh shiftwidth=2:
|
22
base/arch/bin/rsl
Executable file
22
base/arch/bin/rsl
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Run resilio (bittorrent sync) from $HOME if it isn't running. Otherwise, open
|
||||
# its gui in the browser.
|
||||
|
||||
if command -v xdg-open >/dev/null; then
|
||||
open=xdg-open
|
||||
elif command -v open >/dev/null; then
|
||||
open=open
|
||||
elif [[ $BROWSER ]]; then
|
||||
open=firefox
|
||||
else
|
||||
>&2 echo "No program to open urls with"
|
||||
fi
|
||||
|
||||
if ! pgrep rslsync >/dev/null; then
|
||||
pushd $HOME >/dev/null
|
||||
rslsync &
|
||||
popd >/dev/null
|
||||
fi
|
||||
|
||||
[[ -t 0 ]] && $open http://localhost:8888/gui/
|
4
base/arch/bin/urxvt-app-launcher
Executable file
4
base/arch/bin/urxvt-app-launcher
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
xdotool search --onlyvisible --classname urxvt-fuzzy windowkill
|
||||
xdotool search --classname urxvt-fuzzy windowmap \
|
||||
|| urxvt -name urxvt-fuzzy -geometry 100x16 -e $SHELL -c fzf-apps
|
29
base/arch/bin/urxvt-pass-manager
Executable file
29
base/arch/bin/urxvt-pass-manager
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env zsh
|
||||
|
||||
#
|
||||
# Opens fzf-pass in a transient popup window and temporary tmux session,
|
||||
# recreating this window if necessary.
|
||||
#
|
||||
|
||||
# Get firefox's current url; requires "Hostname in title" plugin for firefox
|
||||
win=$(xdotool getactivewindow)
|
||||
if [[ $win ]]; then
|
||||
winname=$(xdotool getwindowname $win)
|
||||
if [[ $winname =~ " - Mozilla Firefox$" ]]; then
|
||||
url=${winname% - Mozilla*}
|
||||
url=${url##* - }
|
||||
while (( ${#url//[^.]/} > 1 )); do
|
||||
url=${url#*.}
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
# Present the popup
|
||||
xdotool search --onlyvisible --classname urxvt-fuzzy windowkill
|
||||
bspc monitor -f primary
|
||||
urxvt -name urxvt-fuzzy \
|
||||
-geometry 100x16 \
|
||||
-e $SHELL \
|
||||
-c "fzf-pass $@ $url"
|
||||
|
||||
[[ $win ]] && xdotool windowactivate $win
|
18
base/arch/bin/urxvt-scratch-window
Executable file
18
base/arch/bin/urxvt-scratch-window
Executable file
|
@ -0,0 +1,18 @@
|
|||
#!/usr/bin/env bash
|
||||
SCRID=urxvt-scratch
|
||||
focused=$(xdotool getactivewindow)
|
||||
scratch=$(xdotool search --onlyvisible --classname $SCRID)
|
||||
|
||||
if [[ $scratch ]]; then
|
||||
if [[ $focused == $scratch ]]; then
|
||||
tmux kill-session -t scratch
|
||||
else
|
||||
xdotool windowactivate $scratch
|
||||
fi
|
||||
else
|
||||
bspc monitor -f primary
|
||||
urxvt -name $SCRID \
|
||||
-geometry 100x26 \
|
||||
-e bash \
|
||||
-c 'tmux new-session -A -s scratch -n scratch'
|
||||
fi
|
25
base/arch/bin/vol
Executable file
25
base/arch/bin/vol
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if (($# == 0)); then
|
||||
data=$(amixer get Master)
|
||||
vol=$(echo "$data" | sed -n 's/^.*\[\([0-9]\+\)%.*$/\1/p' | uniq)
|
||||
state=$(echo "$data" | grep '\[on\]')
|
||||
[[ $state ]] && echo $vol || echo 0
|
||||
exit
|
||||
fi
|
||||
|
||||
case $1 in
|
||||
[0-9]*) amixer set Master $1 ;;
|
||||
[+-]) amixer set Master 5%$1 ;;
|
||||
*mute) amixer set Master $1 ;;
|
||||
toggle) amixer set Master toggle ;;
|
||||
*) >&2 echo "Invalid command"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# community/xosd
|
||||
if command -v osd_cat >/dev/null; then
|
||||
killall -9 -q osd_cat &>/dev/null
|
||||
osd_cat --font="10x20" --delay=2 --color=white --align=center --pos=bottom --barmode=percentage --percentage $($0) &
|
||||
fi
|
8
base/arch/config/bspwm/bspwm-stream
Executable file
8
base/arch/config/bspwm/bspwm-stream
Executable file
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env zsh
|
||||
export MONITOR=$(xrandr -q | grep 'primary' | cut -d' ' -f1)
|
||||
|
||||
bspc config -m $MONITOR window_gap 4
|
||||
bspc config -m $MONITOR bottom_padding 158
|
||||
bspc config -m $MONITOR top_padding 0
|
||||
bspc config -m $MONITOR left_padding 0
|
||||
bspc config -m $MONITOR right_padding 0
|
|
@ -1,18 +1,27 @@
|
|||
#!/usr/bin/bash
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
#
|
||||
# Appearance
|
||||
# Displays
|
||||
#
|
||||
|
||||
declare -A COLOR
|
||||
END=15
|
||||
for ((i=0;i<=END;i++)); do
|
||||
COLOR[$i]=$(xrdb -query | awk "/^\*\.color$i:/ {print \$2}")
|
||||
export MONITOR=$(xrandr -q | grep 'primary' | cut -d' ' -f1)
|
||||
export MONITORS=( $(xrandr -q | grep ' connected' | cut -d' ' -f1) )
|
||||
MONITOR=${MONITOR:-${MONITORS[0]}}
|
||||
# Multiple workspaces for main monitor, but only one for others
|
||||
bspc monitor $MONITOR -d {1,2,3,4,5}
|
||||
for mon in ${MONITORS[@]/${MONITOR}}; do
|
||||
bspc monitor $mon -d $mon/1
|
||||
done
|
||||
|
||||
bspc config normal_border_color "${COLOR[0]}"
|
||||
bspc config active_border_color "${COLOR[0]}"
|
||||
bspc config focused_border_color "${COLOR[4]}"
|
||||
if ! pgrep polybar >/dev/null; then
|
||||
$XDG_CONFIG_HOME/polybar/run.sh
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# Aesthetics
|
||||
#
|
||||
|
||||
|
||||
bspc config split_ratio 0.50
|
||||
bspc config gapless_monocle true
|
||||
|
@ -28,57 +37,33 @@ bspc config pointer_action3 resize_corner
|
|||
bspc config remove_disabled_monitors false
|
||||
bspc config remove_unplugged_monitors true
|
||||
|
||||
# bspc config normal_border_color "$COLOR_0"
|
||||
# bspc config active_border_color "$COLOR_0"
|
||||
# bspc config focused_border_color "$COLOR_0"
|
||||
|
||||
bspc config border_width 0
|
||||
# bspc config window_gap 16
|
||||
# bspc config top_padding 32
|
||||
# bspc config bottom_padding 34
|
||||
# bspc config left_padding 32
|
||||
# bspc config right_padding 32
|
||||
bspc config window_gap 1
|
||||
bspc config window_gap 8
|
||||
bspc config top_padding 0
|
||||
bspc config bottom_padding 0
|
||||
bspc config left_padding 0
|
||||
bspc config right_padding 0
|
||||
|
||||
bspc config -m $MONITOR window_gap 22
|
||||
bspc config -m $MONITOR bottom_padding 36
|
||||
bspc config -m $MONITOR top_padding 0
|
||||
bspc config -m $MONITOR left_padding 0
|
||||
bspc config -m $MONITOR right_padding 0
|
||||
|
||||
#
|
||||
# Displays
|
||||
#
|
||||
|
||||
nmon=$(bspc query -M | wc -l)
|
||||
primary=$(bspc query -M -m prmary)
|
||||
host=$(hostname)
|
||||
case $host in
|
||||
triton*)
|
||||
MONITOR=DVI-I-1
|
||||
[[ $nmon > 1 ]] && bspc monitor HDMI-0 -d HDMI-0/1
|
||||
[[ $nmon > 2 ]] && bspc monitor DVI-D-0 -d DVI-D-0/1
|
||||
;;
|
||||
proteus*)
|
||||
MONITOR=LVDS-0
|
||||
;;
|
||||
halimede*)
|
||||
MONITOR=DVI-I-1
|
||||
[[ $nmon > 1 ]] && bspc monitor DVI-D-0 -d DVI-D-0/1
|
||||
;;
|
||||
esac
|
||||
if [[ $MONITOR ]]; then
|
||||
export MONITOR
|
||||
bspc config -m $MONITOR top_padding 25
|
||||
bspc monitor $MONITOR -d {1,2,3,4,5}
|
||||
. ~/.config/polybar/run.sh
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# Rules
|
||||
#
|
||||
|
||||
# Reset
|
||||
bspc rule -r '*'
|
||||
|
||||
# Floating fixes
|
||||
bspc rule -a Emacs:org* state=floating
|
||||
bspc rule -a 'Emacs:org*' state=floating
|
||||
bspc rule -a mplayer2 state=floating
|
||||
bspc rule -a mpv state=floating center=on
|
||||
bspc rule -a Vlc state=floating monitor=C center=on
|
|
@ -1,8 +1,9 @@
|
|||
backend = "xrender";
|
||||
backend = "glx";
|
||||
# backend = "xrender";
|
||||
glx-no-stencil = true;
|
||||
glx-copy-from-front = false;
|
||||
glx-no-rebind-pixmap = true;
|
||||
glx-swap-method = "undefined";
|
||||
# glx-swap-method = "undefined";
|
||||
|
||||
# Set VSync method. VSync methods currently available:
|
||||
# + none: No VSync
|
||||
|
@ -18,7 +19,8 @@ glx-swap-method = "undefined";
|
|||
# + opengl-mswc: Try to VSync with MESA_swap_control OpenGL extension. Basically the
|
||||
# same as opengl-swc above, except the extension we use.
|
||||
# (Note some VSync methods may not be enabled at compile time.)
|
||||
vsync = "none";
|
||||
vsync = "opengl-mswc";
|
||||
# vsync = "none";
|
||||
|
||||
# Limit compton to repaint at most once every 1 / refresh_rate second to boost
|
||||
# performance. This should not be used with --vsync drm/opengl/opengl-oml as they
|
||||
|
@ -55,19 +57,20 @@ detect-client-leader = false;
|
|||
#
|
||||
########################################
|
||||
|
||||
shadow = false;
|
||||
shadow = true;
|
||||
no-dock-shadow = true;
|
||||
no-dnd-shadow = true;
|
||||
clear-shadow = true;
|
||||
shadow-radius = 4;
|
||||
shadow-offset-x = -3;
|
||||
shadow-offset-y = -3;
|
||||
shadow-opacity = 0.6;
|
||||
shadow-offset-y = 0;
|
||||
shadow-opacity = 0.15;
|
||||
# shadow-red
|
||||
# shadow-green
|
||||
# shadow-blue
|
||||
shadow-exclude = [
|
||||
"n:e:Notification",
|
||||
"class_i = 'Dunst'",
|
||||
"class_i = 'presel_feedback'",
|
||||
"g:e:Conky"
|
||||
];
|
||||
|
@ -83,13 +86,12 @@ shadow-ignore-shaped = true;
|
|||
|
||||
menu-opacity = 1;
|
||||
active-opacity = 1;
|
||||
inactive-opacity = 1.0;
|
||||
inactive-opacity = 1;
|
||||
# frame-opacity = 1.0;
|
||||
inactive-dim = 0.15;
|
||||
inactive-opacity-override = false;
|
||||
opacity-rule = [
|
||||
"80:class_g = 'Bspwm' && class_i = 'presel_feedback'",
|
||||
"96:class_g = 'URxvt'"
|
||||
"80:class_g = 'Bspwm' && class_i = 'presel_feedback'"
|
||||
];
|
||||
alpha-step = 0.06
|
||||
|
|
@ -1,40 +1,39 @@
|
|||
[global]
|
||||
alignment = left
|
||||
allow_markup = yes
|
||||
markup = full
|
||||
bounce_freq = 0
|
||||
browser = /usr/bin/firefox -new-tab
|
||||
dmenu = /usr/bin/rofi -dmenu -p dunst:
|
||||
follow = none
|
||||
font = Fira Sans 12
|
||||
format = "<b>%s</b>\n%b"
|
||||
font = UW Ttyp0 10
|
||||
# font = Misc Tamsyn 12
|
||||
format = "%s\n%b"
|
||||
# geometry [{width}]x{height}][+/-{x}+/-{y}]
|
||||
geometry = "375x22-10+36"
|
||||
geometry = "345x15-21+21"
|
||||
history_length = 20
|
||||
horizontal_padding = 20
|
||||
horizontal_padding = 16
|
||||
idle_threshold = 120
|
||||
ignore_newline = no
|
||||
indicate_hidden = yes
|
||||
line_height = 0
|
||||
monitor = 0
|
||||
padding = 18
|
||||
separator_color = frame
|
||||
separator_height = 1
|
||||
padding = 12
|
||||
separator_color = "#18191b"
|
||||
separator_height = 2
|
||||
show_age_threshold = 60
|
||||
show_indicators = yes
|
||||
shrink = no
|
||||
sort = yes
|
||||
startup_notification = false
|
||||
sticky_history = yes
|
||||
transparency = 0
|
||||
transparency = 1
|
||||
word_wrap = yes
|
||||
# Align icons left/right/off
|
||||
icon_position = right
|
||||
# Paths to default icons.
|
||||
icon_folders = /usr/share/icons/hicolor/32x32/apps/:/usr/share/icons/Adwaita/32x32/actions/
|
||||
|
||||
[frame]
|
||||
width = 4
|
||||
color = "#98C379"
|
||||
frame_width = 0
|
||||
frame_color = "#131416"
|
||||
|
||||
[shortcuts]
|
||||
context = ctrl+shift+period
|
||||
|
@ -42,17 +41,17 @@
|
|||
[urgency_low]
|
||||
# IMPORTANT: colors have to be defined in quotation marks.
|
||||
# Otherwise the "#" and following would be interpreted as a comment.
|
||||
background = "#282c34"
|
||||
foreground = "#bbc2cf"
|
||||
timeout = 10
|
||||
background = "#0a0b0c"
|
||||
foreground = "#b5bd68"
|
||||
timeout = 8
|
||||
|
||||
[urgency_normal]
|
||||
background = "#282c34"
|
||||
foreground = "#bbc2cf"
|
||||
timeout = 20
|
||||
background = "#b5bd68"
|
||||
foreground = "#131416"
|
||||
timeout = 14
|
||||
|
||||
[urgency_critical]
|
||||
background = "#2B0000"
|
||||
foreground = "#bbc2cf"
|
||||
background = "#cc6666"
|
||||
foreground = "#131416"
|
||||
timeout = 0
|
||||
|
11
base/arch/config/gtk-2.0/gtkfilechooser.ini
Normal file
11
base/arch/config/gtk-2.0/gtkfilechooser.ini
Normal file
|
@ -0,0 +1,11 @@
|
|||
[Filechooser Settings]
|
||||
LocationMode=path-bar
|
||||
ShowHidden=false
|
||||
ShowSizeColumn=true
|
||||
GeometryX=1200
|
||||
GeometryY=0
|
||||
GeometryWidth=1010
|
||||
GeometryHeight=664
|
||||
SortColumn=name
|
||||
SortOrder=ascending
|
||||
StartupMode=recent
|
2
base/arch/config/gtk-2.0/gtkrc
Normal file
2
base/arch/config/gtk-2.0/gtkrc
Normal file
|
@ -0,0 +1,2 @@
|
|||
include "/usr/share/themes/Adwaita-Slim-Dark/gtk-2.0/gtkrc"
|
||||
# include "/usr/share/themes/Arc-Dark/gtk-2.0/gtkrc"
|
2
base/arch/config/gtk-3.0/bookmarks
Normal file
2
base/arch/config/gtk-3.0/bookmarks
Normal file
|
@ -0,0 +1,2 @@
|
|||
file:///home/hlissner
|
||||
file:///home/hlissner/work
|
4
base/arch/config/gtk-3.0/settings.ini
Normal file
4
base/arch/config/gtk-3.0/settings.ini
Normal file
|
@ -0,0 +1,4 @@
|
|||
[Settings]
|
||||
gtk-theme-name = Adwaita-Slim-Dark
|
||||
gtk-icon-theme-name = Adwaita-Slim-Dark
|
||||
gtk-application-prefer-dark-theme = true
|
342
base/arch/config/polybar/config
Normal file
342
base/arch/config/polybar/config
Normal file
|
@ -0,0 +1,342 @@
|
|||
;=====================================================
|
||||
;
|
||||
; To learn more about how to configure Polybar
|
||||
; go to https://github.com/jaagr/polybar
|
||||
;
|
||||
; The README contains alot of information
|
||||
;
|
||||
;=====================================================
|
||||
|
||||
[colors]
|
||||
bg = ${xrdb:background}
|
||||
fg = ${xrdb:foreground}
|
||||
black = ${xrdb:color0}
|
||||
bblack = ${xrdb:color8}
|
||||
red = ${xrdb:color1}
|
||||
bred = ${xrdb:color9}
|
||||
green = ${xrdb:color2}
|
||||
bgreen = ${xrdb:color10}
|
||||
yellow = ${xrdb:color3}
|
||||
byellow = ${xrdb:color11}
|
||||
blue = ${xrdb:color4}
|
||||
bblue = ${xrdb:color12}
|
||||
magenta = ${xrdb:color5}
|
||||
bmagenta = ${xrdb:color13}
|
||||
cyan = ${xrdb:color6}
|
||||
bcyan = ${xrdb:color14}
|
||||
white = ${xrdb:color7}
|
||||
bwhite = ${xrdb:color15}
|
||||
|
||||
bg-alt = #0F1013
|
||||
fg-alt = #25282a
|
||||
icons = #555856
|
||||
alert = ${colors.red}
|
||||
|
||||
[global/wm]
|
||||
margin-top = 0
|
||||
margin-bottom = 35
|
||||
|
||||
[bar/main]
|
||||
monitor = ${env:MONITOR}
|
||||
enable-ipc = true
|
||||
wm-restack = bspwm
|
||||
# REQUIRED to move the window with hideit.sh
|
||||
override-redirect = true
|
||||
|
||||
background =
|
||||
foreground = ${colors.fg}
|
||||
|
||||
width = 100%
|
||||
height = 24
|
||||
offset-x = 0
|
||||
offset-y = 16
|
||||
bottom = 1
|
||||
|
||||
overline-size = 0
|
||||
overline-color = #f00
|
||||
underline-size = 0
|
||||
underline-color = #00f
|
||||
|
||||
border-bottom-size = 0
|
||||
|
||||
padding-left = 4
|
||||
padding-right = 4
|
||||
module-margin-left = 0
|
||||
module-margin-right = 0
|
||||
|
||||
font-0 = "Misc Tamsyn:pixelsize=12;2"
|
||||
font-1 = "Wuncon Siji:pixelsize=12;2"
|
||||
font-2 = "siji:pixelsize=10;2"
|
||||
|
||||
modules-left = volume pad cpu memory pad pkg mail
|
||||
modules-center = bspwm
|
||||
modules-right = battery wlan app-rslsync app-redshift pad date
|
||||
|
||||
;tray-position = center
|
||||
;tray-padding = 2
|
||||
;tray-transparent = true
|
||||
;tray-background = #0063ff
|
||||
|
||||
[module/bspwm]
|
||||
type = internal/bspwm
|
||||
pin-workspaces = true
|
||||
enable-click = true
|
||||
|
||||
ws-icon-0 = 1;
|
||||
ws-icon-1 = 2;
|
||||
ws-icon-2 = 3;
|
||||
ws-icon-3 = 4;
|
||||
ws-icon-4 = 5;
|
||||
ws-icon-default = x
|
||||
|
||||
format = <label-state> <label-mode>
|
||||
label-padding = 1
|
||||
|
||||
label-focused = %icon%
|
||||
label-focused-background = #33000000
|
||||
label-focused-foreground = ${colors.green}
|
||||
; label-focused-underline = ${colors.magenta}
|
||||
; label-focused-foreground = ${xrdb:color2}
|
||||
label-focused-padding = 1
|
||||
|
||||
label-occupied = %icon%
|
||||
label-occupied-foreground = ${colors.icons}
|
||||
label-occupied-padding = 1
|
||||
|
||||
; label-urgent = %icon%
|
||||
label-urgent-foreground = ${colors.red}
|
||||
; label-urgent-background = ${colors.alert}
|
||||
label-urgent-padding = 1
|
||||
|
||||
label-empty = %icon%
|
||||
label-empty-foreground = ${colors.fg-alt}
|
||||
label-empty-padding = 1
|
||||
|
||||
[module/date]
|
||||
type = internal/date
|
||||
interval = 5
|
||||
|
||||
label = %date% %time%
|
||||
date = %A, %h %d
|
||||
date-alt = %Y-%m-%d
|
||||
time = %I:%M %p
|
||||
time-alt = %H:%M:%S
|
||||
format-prefix = ""
|
||||
format-prefix-padding = 1
|
||||
; format-prefix-background = ${colors.bg-alt}
|
||||
format-prefix-foreground = ${colors.icons}
|
||||
; format-underline = ${xrdb:color4}
|
||||
|
||||
[module/xwindow]
|
||||
type = internal/xwindow
|
||||
label = %title:0:80:...%
|
||||
label-padding-left = 2
|
||||
|
||||
; [module/mpd]
|
||||
; type = internal/mpd
|
||||
; host = /home/hlissner/.config/mpd/mpd.sock
|
||||
;
|
||||
; format-online = <label-song> <toggle>
|
||||
; format-padding = 5
|
||||
;
|
||||
; label-song-maxlen = 45
|
||||
; label-song-ellipsis = true
|
||||
;
|
||||
; icon-prev =
|
||||
; icon-seekb =
|
||||
; icon-stop =
|
||||
; icon-play =
|
||||
; icon-pause =
|
||||
; icon-next =
|
||||
; icon-seekf =
|
||||
;
|
||||
; icon-random =
|
||||
; icon-repeat =
|
||||
;
|
||||
; toggle-on-foreground = ${colors.fg}
|
||||
; toggle-off-foreground = #66
|
||||
|
||||
[module/cpu]
|
||||
type = internal/cpu
|
||||
interval = 2
|
||||
format = <bar-load>
|
||||
format-prefix = ""
|
||||
format-foreground = ${colors.icons}
|
||||
; format-underline = #f90000
|
||||
; label = %percentage%%
|
||||
format-padding = 1
|
||||
|
||||
bar-load-indicator =
|
||||
bar-load-width = 6
|
||||
bar-load-foreground-0 = ${colors.green}
|
||||
bar-load-foreground-1 = ${colors.green}
|
||||
bar-load-foreground-2 = ${colors.yellow}
|
||||
bar-load-foreground-3 = ${colors.red}
|
||||
bar-load-foreground-4 = ${colors.red}
|
||||
bar-load-fill = |
|
||||
bar-load-empty = ¦
|
||||
bar-load-empty-foreground = ${colors.fg-alt}
|
||||
|
||||
[module/memory]
|
||||
type = internal/memory
|
||||
interval = 3
|
||||
format = <bar-used>
|
||||
format-prefix = ""
|
||||
format-prefix-foreground = ${colors.icons}
|
||||
; format-underline = #4bffdc
|
||||
; label = %percentage_used%%
|
||||
format-padding-left = 1
|
||||
|
||||
; Only applies if <bar-used> is used
|
||||
bar-used-indicator =
|
||||
bar-used-width = 6
|
||||
bar-used-foreground-0 = ${colors.green}
|
||||
bar-used-foreground-1 = ${colors.green}
|
||||
bar-used-foreground-2 = ${colors.yellow}
|
||||
bar-used-foreground-3 = ${colors.red}
|
||||
bar-used-foreground-4 = ${colors.red}
|
||||
bar-used-fill = |
|
||||
bar-used-empty = ¦
|
||||
bar-used-empty-foreground = ${colors.fg-alt}
|
||||
|
||||
[module/wlan]
|
||||
type = internal/network
|
||||
interface = ${env:WLP:wlp3s0}
|
||||
interval = 3.0
|
||||
|
||||
format-connected = <ramp-signal>
|
||||
format-disconnected = !
|
||||
format-disconnected-foreground = ${colors.red}
|
||||
|
||||
; label-connected =
|
||||
; label-disconnected = !
|
||||
; label-disconnected-foreground = ${colors.red}
|
||||
|
||||
ramp-signal-0 =
|
||||
ramp-signal-0-foreground = ${colors.yellow}
|
||||
ramp-signal-1 =
|
||||
ramp-signal-1-foreground = ${colors.yellow}
|
||||
ramp-signal-2 =
|
||||
ramp-signal-2-foreground = ${colors.yellow}
|
||||
ramp-signal-3 =
|
||||
ramp-signal-3-foreground = ${colors.icons}
|
||||
ramp-signal-4 =
|
||||
ramp-signal-4-foreground = ${colors.icons}
|
||||
|
||||
; [module/eth]
|
||||
; type = internal/network
|
||||
; interface = ${env:ETH:enp2s0}
|
||||
; interval = 4.0
|
||||
;
|
||||
; ; format-connected-underline = #55aa55
|
||||
; ; format-connected-prefix = " "
|
||||
; format-connected-foreground-foreground = ${colors.fg-alt}
|
||||
; label-connected = %local_ip%
|
||||
;
|
||||
; format-disconnected-underline = ${self.format-connected-underline}
|
||||
; label-disconnected = %ifname% disconnected
|
||||
; label-disconnected-foreground = ${colors.fg-alt}
|
||||
|
||||
[module/volume]
|
||||
type = internal/volume
|
||||
|
||||
; format-volume = <label-volume> <bar-volume>
|
||||
format-volume = <ramp-volume> <bar-volume>
|
||||
; label-volume = " "
|
||||
label-volume-foreground = ${colors.fg}
|
||||
|
||||
; format-muted-prefix = " "
|
||||
format-muted-foreground = ${colors.red}
|
||||
label-muted =
|
||||
|
||||
bar-volume-width = 8
|
||||
bar-volume-foreground-0 = ${colors.blue}
|
||||
bar-volume-foreground-1 = ${colors.blue}
|
||||
bar-volume-foreground-2 = ${colors.blue}
|
||||
bar-volume-foreground-3 = ${colors.blue}
|
||||
bar-volume-foreground-4 = ${colors.blue}
|
||||
bar-volume-foreground-5 = ${colors.blue}
|
||||
bar-volume-foreground-6 = ${colors.blue}
|
||||
bar-volume-gradient = false
|
||||
bar-volume-indicator = |
|
||||
bar-volume-indicator-font = 2
|
||||
bar-volume-indicator-foreground = #ff
|
||||
bar-volume-fill = ─
|
||||
bar-volume-fill-font = 2
|
||||
bar-volume-empty = ─
|
||||
bar-volume-empty-font = 2
|
||||
bar-volume-empty-foreground = ${colors.fg-alt}
|
||||
|
||||
; Only applies if <ramp-volume> is used
|
||||
ramp-volume-0 =
|
||||
ramp-volume-1 =
|
||||
ramp-volume-2 =
|
||||
|
||||
[module/battery]
|
||||
type = internal/battery
|
||||
battery = BAT0
|
||||
adapter = ADP1
|
||||
full-at = 98
|
||||
|
||||
format-charging = <animation-charging> <label-charging>
|
||||
format-charging-underline = #ffb52a
|
||||
|
||||
format-discharging = <ramp-capacity> <label-discharging>
|
||||
format-discharging-underline = ${self.format-charging-underline}
|
||||
|
||||
format-full-prefix = " "
|
||||
format-full-prefix-foreground = ${colors.fg-alt}
|
||||
format-full-underline = ${self.format-charging-underline}
|
||||
|
||||
ramp-capacity-0 =
|
||||
ramp-capacity-1 =
|
||||
ramp-capacity-2 =
|
||||
ramp-capacity-foreground = ${colors.fg-alt}
|
||||
|
||||
animation-charging-0 =
|
||||
animation-charging-1 =
|
||||
animation-charging-2 =
|
||||
animation-charging-foreground = ${colors.fg-alt}
|
||||
animation-charging-framerate = 750
|
||||
|
||||
|
||||
;=====================================================
|
||||
; Custom scripts
|
||||
;=====================================================
|
||||
|
||||
[module/pad]
|
||||
type = custom/text
|
||||
content = " "
|
||||
content-foreground = ${colors.fg-alt}
|
||||
|
||||
[module/pkg]
|
||||
type = custom/ipc
|
||||
hook-0 = ~/.config/polybar/modules/updates
|
||||
initial = 1
|
||||
click-left = polybar-msg -p %pid% hook pkg 1
|
||||
format-padding = 1
|
||||
|
||||
[module/mail]
|
||||
type = custom/ipc
|
||||
hook-0 = ~/.config/polybar/modules/mail
|
||||
initial = 1
|
||||
click-left = polybar-msg -p %pid% hook mail 1
|
||||
format-padding-right = 1
|
||||
|
||||
[module/app-redshift]
|
||||
type = custom/script
|
||||
exec = echo 1
|
||||
exec-if = pgrep -x redshift
|
||||
format = ""
|
||||
format-foreground = ${colors.icons}
|
||||
interval = 2
|
||||
|
||||
[module/app-rslsync]
|
||||
type = custom/script
|
||||
exec = echo 1
|
||||
exec-if = pgrep -x rslsync
|
||||
format = ""
|
||||
format-foreground = ${colors.icons}
|
||||
interval = 60
|
||||
|
||||
; vim:ft=dosini
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
# Specifying the icon(s) in the script
|
||||
# This allows us to change its appearance conditionally
|
||||
icon=""
|
||||
|
||||
pgrep -x redshift &> /dev/null
|
||||
if [[ $? -eq 0 ]]; then
|
||||
temp=$(redshift -p 2>/dev/null | grep temp | cut -d' ' -f3)
|
92
base/arch/config/polybar/modules/mail
Executable file
92
base/arch/config/polybar/modules/mail
Executable file
|
@ -0,0 +1,92 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import imaplib
|
||||
import os
|
||||
import sys
|
||||
import socket
|
||||
from subprocess import Popen
|
||||
|
||||
CONFIG_FILE = os.path.expanduser("~/.secrets/email")
|
||||
CACHE_FILE = "/tmp/polybar-mail"
|
||||
ICON = ""
|
||||
|
||||
try:
|
||||
import gnupg
|
||||
from pathlib import Path
|
||||
except ImportError:
|
||||
print("%{{F{}}}*".format("#555856", ICON))
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
#
|
||||
def internet_is_on():
|
||||
try:
|
||||
host = socket.gethostbyname("www.google.com")
|
||||
socket.create_connection((host, 80), 2)
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
def unread_count(address, password):
|
||||
imap = imaplib.IMAP4_SSL('imap.gmail.com', 993)
|
||||
imap.login(address, password)
|
||||
imap.select('INBOX')
|
||||
|
||||
status, resp = imap.search(None, 'UNSEEN')
|
||||
imap.close()
|
||||
imap.logout()
|
||||
|
||||
return len(resp[0].split())
|
||||
|
||||
|
||||
def ding():
|
||||
Popen(["{}/bin/ding".format(os.getenv("DOTFILES", os.expanduser("~/.dotfiles")))])
|
||||
|
||||
#
|
||||
def main():
|
||||
try:
|
||||
if not internet_is_on():
|
||||
raise IOError("Internet is off")
|
||||
|
||||
secrets = Path(CONFIG_FILE)
|
||||
if not secrets.exists():
|
||||
raise IOError("Can't find secrets")
|
||||
|
||||
gpg = gnupg.GPG()
|
||||
gpgdata = gpg.decrypt(secrets.read_bytes())
|
||||
if not gpgdata.ok:
|
||||
raise IOError("Couldn't decrypt secrets")
|
||||
accounts = [line.split(':') for line in gpgdata.data.decode('utf-8').strip().split('\n')]
|
||||
|
||||
last_total = 0
|
||||
cache = Path(CACHE_FILE)
|
||||
if cache.exists():
|
||||
cache_text = cache.read_text()
|
||||
last_total = int(cache.read_text())
|
||||
|
||||
total = 0
|
||||
for addr, pwd in accounts:
|
||||
total += unread_count(addr, pwd)
|
||||
|
||||
if total != last_total:
|
||||
ding()
|
||||
if total != 0:
|
||||
print("%{{F{}}}{}{}".format("#f0c674", ICON, total))
|
||||
else:
|
||||
print("%{{F{}}}{}".format("#555856", ICON))
|
||||
|
||||
cache.write_text(str(total))
|
||||
except IOError as e:
|
||||
print("ERROR: {}".format(e), file=sys.stderr)
|
||||
print("%{{F{}}}{}!".format("#cc6666", ICON))
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
#
|
||||
if __name__ == '__main__':
|
||||
if sys.argv[1:]:
|
||||
print("%{{F{}}}{}".format("#555856", ICON))
|
||||
else:
|
||||
main()
|
22
base/arch/config/polybar/modules/updates
Executable file
22
base/arch/config/polybar/modules/updates
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env zsh
|
||||
icon=""
|
||||
if [[ $1 == "1" ]]; then
|
||||
echo "%{F#555856}${icon}%{F-}"
|
||||
exit
|
||||
fi
|
||||
|
||||
pac=$(checkupdates | wc -l)
|
||||
aur=$(cower -u | wc -l)
|
||||
|
||||
[[ -f /tmp/polybar-updates ]] && last=$(</tmp/polybar-updates)
|
||||
check=$((pac + aur))
|
||||
if [[ "$check" != "0" ]]; then
|
||||
echo "%{F#b5bd68}${icon}$pac+$aur%{F-}"
|
||||
if [[ $last != "$pac$aur" ]]; then
|
||||
notify-send "$((pac+aur)) updates available"
|
||||
aplay -N -q $DOTFILES_ASSETS/sounds/updates.ogg
|
||||
echo "$pac$aur" >/tmp/polybar-updates
|
||||
fi
|
||||
else
|
||||
echo "%{F#555856}${icon}%{F-}"
|
||||
fi
|
11
base/arch/config/polybar/run.sh
Executable file
11
base/arch/config/polybar/run.sh
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env zsh
|
||||
|
||||
killall -q polybar
|
||||
while _is_running polybar; do sleep 1; done
|
||||
|
||||
source "${0:A:h}/../../bin/inject-xcolors"
|
||||
pushd ~ >/dev/null
|
||||
polybar main >>$XDG_DATA_HOME/polybar.log 2>&1 &
|
||||
popd >/dev/null
|
||||
|
||||
echo "Polybar launched..."
|
141
base/arch/config/sxhkd/sxhkdrc
Normal file
141
base/arch/config/sxhkd/sxhkdrc
Normal file
|
@ -0,0 +1,141 @@
|
|||
#
|
||||
# wm independent hotkeys
|
||||
#
|
||||
|
||||
# terminal emulator
|
||||
mod4 + ctrl + Return
|
||||
urxvt
|
||||
mod4 + ctrl + shift + Return
|
||||
urxvt -name urxvt-stream
|
||||
mod4 + grave
|
||||
urxvt-scratch-window
|
||||
mod4 + space
|
||||
urxvt-app-launcher
|
||||
mod4 + backslash
|
||||
urxvt-pass-manager
|
||||
mod4 + mod1 + backslash
|
||||
firefox-current
|
||||
# urxvt-pass-manager -r
|
||||
|
||||
# reload sxhkd
|
||||
mod4 + ctrl + shift + Escape
|
||||
ding; pkill -USR1 -x sxhkd
|
||||
|
||||
|
||||
#
|
||||
# Media keys
|
||||
#
|
||||
|
||||
Print
|
||||
maim -s ~/screenshots/$(date +%F-%T).png && notify-send "Screenshot saved"
|
||||
mod4 + Print
|
||||
maim ~/screenshots/$(date +%F-%T).png && notify-send "Fullscreen screenshot saved"
|
||||
mod4 + shift + Print
|
||||
maim -d 3 ~/screenshots/$(date +%F-%T).png && notify-send "Screenshot saved"
|
||||
|
||||
Pause
|
||||
mpc -q toggle # play/pause music
|
||||
mod4 + {Pause,XF86Eject}
|
||||
zzz # sleep display
|
||||
mod4 + shift + Pause
|
||||
zzz -f # sleep computer
|
||||
|
||||
# Media Keys
|
||||
XF86Audio{Play,Pause}
|
||||
mpc -q toggle
|
||||
XF86Audio{Prev,Next}
|
||||
mpc -q {prev,next}
|
||||
XF86Audio{LowerVolume,RaiseVolume}
|
||||
vol {-,+}
|
||||
XF86AudioMute
|
||||
vol toggle
|
||||
|
||||
mod4 + {Down,Up}
|
||||
vol {-,+}
|
||||
mod4 + {Left,Right}
|
||||
mpc {prev,next}
|
||||
|
||||
|
||||
#
|
||||
# bspwm hotkeys
|
||||
#
|
||||
|
||||
# quit bspwm normally
|
||||
mod4 + alt + Escape
|
||||
bspc quit
|
||||
|
||||
# close and kill
|
||||
mod4 + {_,shift + }q
|
||||
bspc node -{c,k}
|
||||
|
||||
#
|
||||
# state/flags
|
||||
#
|
||||
|
||||
mod4 + {ctrl,shift + } f
|
||||
{bspc desktop -l next,bspc node -t \~floating}
|
||||
|
||||
mod4 + shift + p
|
||||
bspc node -t \~pseudo_tiled
|
||||
|
||||
# set the node flags
|
||||
mod4 + ctrl + {x,y,z}
|
||||
bspc node -g {locked,sticky,private}
|
||||
|
||||
#
|
||||
# focus/swap
|
||||
#
|
||||
|
||||
# focus/swap the node in the given direction
|
||||
mod4 + {_,ctrl +}{h,j,k,l}
|
||||
bspc-focus {_,-m }{west,south,north,east}
|
||||
|
||||
mod4 + shift + {_,ctrl +}{h,j,k,l}
|
||||
bspc-swap {_,-m }{west,south,north,east}
|
||||
|
||||
# focus the node for the given path jump
|
||||
mod4 + {p,b,comma,period}
|
||||
bspc node -f @{parent,brother,first,second}
|
||||
|
||||
# focus monitor or send to the given desktop
|
||||
mod4 + bracket{left,right}
|
||||
bspc desktop -f focused#{prev,next}.local
|
||||
|
||||
mod4 + ctrl + {_,shift +}{1-9,0}
|
||||
bspc {desktop -f,node -d} {1-9,10}
|
||||
|
||||
|
||||
#
|
||||
# preselect
|
||||
#
|
||||
|
||||
# preselect the direction
|
||||
mod4 + mod1 + ctrl + {h,j,k,l}
|
||||
bspc node -p {west,south,north,east}
|
||||
|
||||
# preselect the ratio
|
||||
mod4 + mod1 + ctrl + {1-9}
|
||||
bspc node -o 0.{1-9}5
|
||||
|
||||
# cancel the preselection for the focused node
|
||||
mod4 + mod1 + ctrl + space
|
||||
bspc node -p cancel
|
||||
|
||||
# cancel the preselection for the focused desktop
|
||||
#mod4 + alt + shift + space
|
||||
# bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
|
||||
|
||||
# expand the tiled space in the given direction
|
||||
#mod4 + alt + {h,j,k,l}
|
||||
# bspc node {@west -r -,@south -r +,@north -r -,@east -r +}64
|
||||
#
|
||||
## contract the tiled space in the given direction
|
||||
#mod4 + alt + ctrl + {h,j,k,l}
|
||||
# bspc node {@east -r -,@north -r +,@south -r -,@west -r +}64
|
||||
|
||||
# move a floating window
|
||||
#mod4 + alt + {Left,Down,Up,Right}
|
||||
# xdo move {-x -,-y +,-y -,-x +}40
|
||||
|
||||
#mod4 + alt + ctrl + {Left,Down,Up,Right}
|
||||
# xdo resize {-w -,-h -,-h -,-w -}40
|
|
@ -9,9 +9,9 @@
|
|||
# m hr d m w cmd
|
||||
# 0 * * * * ...
|
||||
|
||||
# Lemonbar
|
||||
# 0,30 * * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus ~/.config/panel/panel-notify :updates
|
||||
# */2 * * * * DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus ~/.config/panel/panel-notify :mail
|
||||
|
||||
# Polybar
|
||||
0,30 * * * * polybar-msg hook pkg 1
|
||||
0 * * * * polybar-msg hook pkg 1
|
||||
*/5 * * * * polybar-msg hook mail 1
|
||||
|
||||
# Personal
|
||||
0 * * * * DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "It is $(date +\%H:\%M)"
|
14
base/arch/env.zsh
Normal file
14
base/arch/env.zsh
Normal file
|
@ -0,0 +1,14 @@
|
|||
export GNUPGHOME="$XDG_CONFIG_HOME/gpg"
|
||||
export GTK2_RC_FILES="${0:A:h}/config/gtk-2.0/gtkrc"
|
||||
export TERMINFO="$XDG_CONFIG_HOME/terminfo"
|
||||
export BROWSER=firefox
|
||||
export URXVT_PERL_LIB="$XDG_CONFIG_HOME/urxvt"
|
||||
|
||||
_is_running ssh-agent || {
|
||||
ssh-agent -s >"$XDG_RUNTIME_DIR/ssh-agent-env"
|
||||
}
|
||||
_is_running gpg-agent || {
|
||||
gpg-agent --daemon >"$XDG_RUNTIME_DIR/gpg-agent-env"
|
||||
}
|
||||
_source "$XDG_RUNTIME_DIR/ssh-agent-env" >/dev/null
|
||||
_source "$XDG_RUNTIME_DIR/gpg-agent-env" >/dev/null
|
3
base/arch/fonts/fonts.dir
Normal file
3
base/arch/fonts/fonts.dir
Normal file
|
@ -0,0 +1,3 @@
|
|||
2
|
||||
kakwafont-12-b.pcf.gz -kakwa-kakwafont-medium-r-bold--12-120-72-72-c-60-iso8859-1
|
||||
kakwafont-12-n.pcf.gz -kakwa-kakwafont-medium-r-normal--12-120-72-72-c-60-iso8859-1
|
BIN
base/arch/fonts/kakwafont-12-b.pcf.gz
Normal file
BIN
base/arch/fonts/kakwafont-12-b.pcf.gz
Normal file
Binary file not shown.
BIN
base/arch/fonts/kakwafont-12-n.pcf.gz
Normal file
BIN
base/arch/fonts/kakwafont-12-n.pcf.gz
Normal file
Binary file not shown.
16
base/arch/scripts/install-aseprite.sh
Executable file
16
base/arch/scripts/install-aseprite.sh
Executable file
|
@ -0,0 +1,16 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if command -v aseprite >/dev/null; then
|
||||
echo "Aseprite is already installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -e
|
||||
pacaur --needed --noconfirm --noedit -S ninja cmake libxcursor
|
||||
rm -rf /tmp/aseprite
|
||||
if git clone --recursive https://github.com/aseprite/aseprite /tmp/aseprite; then
|
||||
mkdir /tmp/aseprite/build && cd /tmp/aseprite/build
|
||||
cmake -DCMAKE_INSTALL_PREFIX=/usr -G Ninja ..
|
||||
ninja aseprite
|
||||
ninja install
|
||||
fi
|
10
base/arch/scripts/install-steam.sh
Executable file
10
base/arch/scripts/install-steam.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if ! grep -e '^[multilib]' /etc/pacman.conf >/dev/null; then
|
||||
echo "[multilib]\nInclude = /etc/pacman.d/mirrorlist" | \
|
||||
sudo tee -a /etc/pacman.conf
|
||||
sudo pacman -Sy
|
||||
fi
|
||||
|
||||
sudo pacman --needed -S steam
|
||||
|
8
base/arch/scripts/install-udevil.sh
Executable file
8
base/arch/scripts/install-udevil.sh
Executable file
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env zsh
|
||||
|
||||
sudo pacman --noconfirm --needed -S udevil devmon
|
||||
sudo systemctl enable devmon@$USER
|
||||
sudo systemctl start devmon@$USER
|
||||
|
||||
ARCH=$(cd "${0:A:h}/.." && pwd)
|
||||
sudo sed -i "s@^# \(success_exec =\)@\1 $ARCH/bin/notify-mount@" /etc/udevil/udevil.conf
|
43
base/arch/xprofile
Normal file
43
base/arch/xprofile
Normal file
|
@ -0,0 +1,43 @@
|
|||
#!/bin/bash
|
||||
DOTS=~/.dotfiles
|
||||
source $DOTS/env
|
||||
|
||||
# A tidy $HOME is a tidy mind
|
||||
export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority"
|
||||
[[ -e ~/.Xauthority ]] && mv -f ~/.Xauthority "$XAUTHORITY"
|
||||
|
||||
#
|
||||
ARCH=$DOTS/base/arch
|
||||
[[ -f $ARCH/Xresources ]] && xrdb $ARCH/Xresources
|
||||
[[ -f $ARCH/Xmodmap ]] && xmodmap $ARCH/Xmodmap
|
||||
|
||||
# set wallpaper
|
||||
[[ -e ~/wallpaper ]] && feh --no-fehbg --image-bg black --bg-center ~/wallpaper
|
||||
|
||||
# Let me know
|
||||
paplay $DOTFILES_ASSETS/sounds/startup.ogg &
|
||||
|
||||
# autostart programs
|
||||
{
|
||||
run() {
|
||||
if _is_callable "$1" && ! _is_running "$1"; then
|
||||
"$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# essentials
|
||||
run sxhkd & # keyboard daemon
|
||||
run dunst & # notifications
|
||||
|
||||
# non-essentials
|
||||
{
|
||||
sleep 2
|
||||
run mpd & # music server
|
||||
run redshift & # screen temperature based on time-of-day
|
||||
run rslsync & # resilio sync
|
||||
run compton & # perdy effects + transparency
|
||||
|
||||
# If sxhkd isn't running by now, something is wrong
|
||||
_is_running sxhkd || urxvt &
|
||||
} &
|
||||
} 2>&1 >$XDG_DATA_HOME/xsession-errors.log
|
35
base/macos/_init
Executable file
35
base/macos/_init
Executable file
|
@ -0,0 +1,35 @@
|
|||
#!/usr/bin/env zsh
|
||||
source ${0:A:h}/../../deploy
|
||||
|
||||
install() {
|
||||
# Install homebrew
|
||||
if ! _is_callable brew; then
|
||||
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||
fi
|
||||
|
||||
brew install \
|
||||
wget curl tree coreutils bash \
|
||||
the_silver_searcher ripgrep ffmpeg keybase \
|
||||
neofetch youtube-dl
|
||||
|
||||
# pass-otp
|
||||
brew install pass oath-toolkit
|
||||
if _ensure_repo tadfisher/pass-otp /tmp/pass-otp; then
|
||||
cd /tmp/pass-otp
|
||||
make install PREFIX=/usr/local
|
||||
fi
|
||||
}
|
||||
|
||||
update() {
|
||||
if _is_callable brew; then
|
||||
brew update && brew upgrade && brew cleanup
|
||||
else
|
||||
echo-fail "homebrew not detected"
|
||||
fi
|
||||
}
|
||||
|
||||
# link() {}
|
||||
|
||||
# clean() {}
|
||||
|
||||
init "$@"
|
|
@ -1,16 +1,14 @@
|
|||
alias ls="gls --color=auto --group-directories-first"
|
||||
alias date='gdate'
|
||||
alias date=gdate
|
||||
|
||||
alias y='pbcopy'
|
||||
alias p='pbpaste'
|
||||
alias y=pbcopy
|
||||
alias p=pbpaste
|
||||
|
||||
alias br='brew'
|
||||
alias br=brew
|
||||
alias bru='brew update && brew upgrade && brew cleanup'
|
||||
alias brc='brew cask'
|
||||
|
||||
alias localip="ipconfig getifaddr en1"
|
||||
|
||||
# OS X has no `md5sum`, so use `md5` as a fallback
|
||||
is-callable md5sum || alias md5sum="md5"
|
||||
is-callable md5sum || alias md5sum="md5"
|
||||
# OS X has no `sha1sum`, so use `shasum` as a fallback
|
||||
is-callable sha1sum || alias sha1sum="shasum"
|
0
os/+macos/bin/timelapse → base/macos/bin/timelapse
Executable file → Normal file
0
os/+macos/bin/timelapse → base/macos/bin/timelapse
Executable file → Normal file
0
os/+macos/bin/timelapse2mov → base/macos/bin/timelapse2mov
Executable file → Normal file
0
os/+macos/bin/timelapse2mov → base/macos/bin/timelapse2mov
Executable file → Normal file
|
@ -1,3 +1,4 @@
|
|||
export GNUPGHOME="$XDG_CONFIG_HOME/gpg"
|
||||
export BROWSER='open'
|
||||
|
||||
# export CC=/usr/bin/clang
|
8
bin/base
8
bin/base
|
@ -3,10 +3,10 @@
|
|||
# Converts a number from one base to another. DEST_RADIX is optional and
|
||||
# defaults to 10.
|
||||
#
|
||||
# Usage: base [SRC_RADIX] [NUMBER] [DEST_RADIX]
|
||||
# Usage: base SRC_RADIX NUMBER DEST_RADIX
|
||||
# Examples:
|
||||
# + base 2 110 #=> 6
|
||||
# + base 2 110 10 #=> 6
|
||||
# + base 16 FF #=> 6
|
||||
# + base 2 110 #=> 6 (110_2 => 6_10)
|
||||
# + base 10 9 8 #=> 11 (9_10 => 11_8)
|
||||
# + base 16 FF #=> 255 (FF_16 => 255_10)
|
||||
|
||||
bc <<< "obase=${3:-10};ibase=$1;$2"
|
||||
|
|
23
bin/colors
Executable file
23
bin/colors
Executable file
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Prints a bunch of color codes to the terminal to demonstrate what's available.
|
||||
# Each line is the color code of one forground color, out of 17 (default + 16
|
||||
# escapes), followed by a test use of that color on all nine background colors
|
||||
# (default + 8 escapes).
|
||||
|
||||
T=niX # The test text
|
||||
|
||||
echo -e "\n 40m 41m 42m 43m\
|
||||
44m 45m 46m 47m";
|
||||
|
||||
for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' \
|
||||
'1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' \
|
||||
' 36m' '1;36m' ' 37m' '1;37m';
|
||||
do FG=${FGs// /}
|
||||
echo -en " $FGs \033[$FG $T "
|
||||
for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
|
||||
do echo -en "$EINS \033[$FG\033[$BG $T \033[0m";
|
||||
done
|
||||
echo;
|
||||
done
|
||||
echo
|
8
bin/ding
8
bin/ding
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env bash
|
||||
DEFAULT="$HOME/.dotfiles/sounds/${1:-Titan.ogg}"
|
||||
#!/usr/bin/env zsh
|
||||
DEFAULT="$DOTFILES_ASSETS/sounds/${1:-Titan.ogg}"
|
||||
case $OSTYPE in
|
||||
darwin*) afplay "$DEFAULT" ;;
|
||||
linux*) paplay "$DEFAULT" ;;
|
||||
darwin*) afplay $DEFAULT ;;
|
||||
linux*) paplay $DEFAULT ;;
|
||||
esac
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
# make sure your .curlrc doesn't set a real useragent
|
||||
# NOTE make sure your .curlrc doesn't set a real useragent
|
||||
curl http://wttr.in/${1:-toronto}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Helper for encrypting/decrypting folders with gpg and tar.
|
||||
# Encrypt/decrypt and compress folders with gpg+tar.
|
||||
# Usage:
|
||||
# clump foldername # packs
|
||||
# clump foldername.clump # unpacks
|
||||
# clump foldername # packs
|
||||
# clump foldername.clump # unpacks
|
||||
|
||||
set -e
|
||||
if (($# == 0)); then
|
15
bin/htmlent
15
bin/htmlent
|
@ -8,7 +8,6 @@ import argparse
|
|||
import fileinput
|
||||
import html
|
||||
from html.entities import entitydefs
|
||||
from pathlib import Path
|
||||
|
||||
ENTITIES = {value: key for key, value in entitydefs.items()}
|
||||
|
||||
|
@ -28,16 +27,10 @@ def decode(text):
|
|||
|
||||
if __name__ == '__main__':
|
||||
opts = argparse.ArgumentParser(description="Encodes (or decodes) HTML entities in text.")
|
||||
opts.add_argument('file', nargs="?", help="File to encode/decode")
|
||||
opts.add_argument('file', type=str, nargs="*", help="File to encode/decode")
|
||||
opts.add_argument('-d', '--decode', action='store_true', help="Decode the given files/input")
|
||||
args = opts.parse_args()
|
||||
|
||||
if "file" in args and args.file:
|
||||
text = Path(args.file).read_text()
|
||||
else:
|
||||
text = "\n".join([line for line in fileinput.input()]).strip()
|
||||
|
||||
if args.decode:
|
||||
print(decode(text))
|
||||
else:
|
||||
print(encode(text))
|
||||
text = [line for line in fileinput.input(args.file)]
|
||||
action = decode if args.decode else encode
|
||||
print(action("\n".join(text).strip()))
|
||||
|
|
78
bin/imgoptim
78
bin/imgoptim
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
# A simple script that losslessly optimizes image files given to it.
|
||||
#
|
||||
|
@ -13,57 +13,59 @@
|
|||
# GIFs: gifsicle
|
||||
|
||||
set -e
|
||||
unset CDPATH
|
||||
|
||||
LOSSY=
|
||||
|
||||
usage() {
|
||||
cat <<EOL
|
||||
Usage: ${0##*/} [-lh] IMAGE [IMAGE2 [IMAGE3 [...]]]
|
||||
cat <<EOL
|
||||
Usage: ${0:A:t} [-lh] IMAGE [IMAGE2 [IMAGE3 [...]]]
|
||||
|
||||
-l enable lossy compression
|
||||
-h this help
|
||||
-l enable lossy compression
|
||||
-h this help
|
||||
EOL
|
||||
}
|
||||
|
||||
while getopts hl opt; do
|
||||
case $opt in
|
||||
h) usage; exit;;
|
||||
l) LOSSY=1;;
|
||||
:) >&2 echo "$OPTARG requires an argument"; usage; exit 1;;
|
||||
*) >&2 echo "Not a valid arg: $opt"; usage; exit 1;;
|
||||
esac
|
||||
case $opt in
|
||||
h) usage; exit;;
|
||||
l) LOSSY=1;;
|
||||
:) >&2 echo "$OPTARG requires an argument"; usage; exit 1;;
|
||||
*) >&2 echo "Not a valid arg: $opt"; usage; exit 1;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
_filesize() {
|
||||
case $OSTYPE in
|
||||
darwin*) stat -c%s "$1" ;;
|
||||
*) stat --printf="%s" "$1" ;;
|
||||
esac
|
||||
case $OSTYPE in
|
||||
darwin*) stat -c%s "$1" ;;
|
||||
*) stat --printf="%s" "$1" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
for file in $@; do
|
||||
if [[ -d $file ]]; then
|
||||
imgoptim $file/*
|
||||
elif [[ -f $file ]]; then
|
||||
pre_size=$(_filesize "$file")
|
||||
case ${file##*.} in
|
||||
png)
|
||||
[[ $LOSSY ]] && pngquant $file
|
||||
optipng -nc -nb -o7 $file
|
||||
;;
|
||||
gif)
|
||||
gifsicle --batch --optimize=3 "$file"
|
||||
;;
|
||||
jpg|jpeg)
|
||||
[[ $LOSSY ]] && jpegoptim --max=90 "$file"
|
||||
jpegtran -copy none -optimize -progressive -outfile "$file" "$file"
|
||||
;;
|
||||
*) printf "Unrecognized file '$file': ignored"
|
||||
;;
|
||||
esac
|
||||
post_size=$(_filesize "$file")
|
||||
perc=$(echo "((${pre_size} - ${post_size}) / ${pre_size}) * 100" | bc -l)
|
||||
printf "* %s: %d => %d (%.2f%% reduction)\n" "$file" "${pre_size}" "${post_size}" "$perc"
|
||||
fi
|
||||
if [[ -d $file ]]; then
|
||||
imgoptim $file/*
|
||||
elif [[ -f $file ]]; then
|
||||
pre_size=$(_filesize "$file")
|
||||
case ${file##*.} in
|
||||
png)
|
||||
[[ $LOSSY ]] && pngquant $file
|
||||
optipng -nc -nb -o7 $file
|
||||
;;
|
||||
gif)
|
||||
gifsicle --batch --optimize=3 "$file"
|
||||
;;
|
||||
jpg|jpeg)
|
||||
[[ $LOSSY ]] && jpegoptim --max=90 "$file"
|
||||
jpegtran -copy none -optimize -progressive -outfile "$file" "$file"
|
||||
;;
|
||||
*)
|
||||
printf "Unrecognized file '$file': ignored"
|
||||
;;
|
||||
esac
|
||||
post_size=$(_filesize "$file")
|
||||
perc=$(echo "((${pre_size} - ${post_size}) / ${pre_size}) * 100" | bc -l)
|
||||
printf "* %s: %d => %d (%.2f%% reduction)\n" "$file" "${pre_size}" "${post_size}" "$perc"
|
||||
fi
|
||||
done
|
||||
|
|
25
bin/lesspipe
25
bin/lesspipe
|
@ -1,19 +1,18 @@
|
|||
#!/bin/sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Read a file with possible syntax coloring applied
|
||||
|
||||
case "$1" in
|
||||
*.awk|*.groff|*.java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
|
||||
*.awk|*.groff|*.java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
|
||||
*.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
|
||||
*.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
|
||||
*.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
|
||||
pygmentize -f 256 "$1";;
|
||||
.bashrc|.bash_aliases|.bash_environment)
|
||||
pygmentize -f 256 -l sh "$1"
|
||||
;;
|
||||
*)
|
||||
grep "#\!/bin/bash" "$1" > /dev/null
|
||||
if [ "$?" -eq "0" ]; then
|
||||
pygmentize -f 256 -l sh "$1"
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
pygmentize -f 256 "$1" ;;
|
||||
.bashrc|.bash_aliases|.bash_environment)
|
||||
pygmentize -f 256 -l sh "$1" ;;
|
||||
*)
|
||||
if ! grep "#\!/.+[/ ](ba|z)?sh" "$1" >/dev/null; then
|
||||
exit 1
|
||||
fi
|
||||
pygmentize -f 256 -l sh "$1"
|
||||
esac
|
||||
|
|
|
@ -15,37 +15,37 @@ Report bugs to <sorin.ionescu@gmail.com>.
|
|||
EOF
|
||||
fi
|
||||
|
||||
if [[ $1 = -v || $1 = --verbose ]]; then
|
||||
verbose=0
|
||||
shift
|
||||
if [[ $1 == -v || $1 == --verbose ]]; then
|
||||
verbose=0
|
||||
shift
|
||||
fi
|
||||
|
||||
while (($# > 0)); do
|
||||
if [[ ! -s $1 ]]; then
|
||||
>&2 echo "$0: file not valid: $1"
|
||||
shift
|
||||
continue
|
||||
fi
|
||||
|
||||
case ${1:l} in
|
||||
*.tar.gz|*.tgz) tar t${verbose:+v}vzf "$1" ;;
|
||||
*.tar.bz2|*.tbz|*.tbz2) tar t${verbose:+v}jf "$1" ;;
|
||||
*.tar.xz|*.txz) tar --xz --help &> /dev/null \
|
||||
&& tar --xz -t${verbose:+v}f "$1" \
|
||||
|| xzcat "$1" | tar t${verbose:+v}f - ;;
|
||||
*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
|
||||
&& tar --lzma -t${verbose:+v}f "$1" \
|
||||
|| lzcat "$1" | tar x${verbose:+v}f - ;;
|
||||
*.tar) tar t${verbose:+v}f "$1" ;;
|
||||
*.zip) unzip -l${verbose:+v} "$1" ;;
|
||||
*.rar) unrar &> /dev/null \
|
||||
&& unrar ${${verbose:+v}:-l} "$1" \
|
||||
|| rar ${${verbose:+v}:-l} "$1" ;;
|
||||
*.7z) 7za l "$1" ;;
|
||||
*) >&2 echo "$0: cannot list: $1"
|
||||
success=1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ! -s $1 ]]; then
|
||||
>&2 echo "$0: file not valid: $1"
|
||||
shift
|
||||
continue
|
||||
fi
|
||||
|
||||
case ${1:l} in
|
||||
*.tar.gz|*.tgz) tar t${verbose:+v}vzf "$1" ;;
|
||||
*.tar.bz2|*.tbz|*.tbz2) tar t${verbose:+v}jf "$1" ;;
|
||||
*.tar.xz|*.txz) tar --xz --help &> /dev/null \
|
||||
&& tar --xz -t${verbose:+v}f "$1" \
|
||||
|| xzcat "$1" | tar t${verbose:+v}f - ;;
|
||||
*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
|
||||
&& tar --lzma -t${verbose:+v}f "$1" \
|
||||
|| lzcat "$1" | tar x${verbose:+v}f - ;;
|
||||
*.tar) tar t${verbose:+v}f "$1" ;;
|
||||
*.zip) unzip -l${verbose:+v} "$1" ;;
|
||||
*.rar) unrar &> /dev/null \
|
||||
&& unrar ${${verbose:+v}:-l} "$1" \
|
||||
|| rar ${${verbose:+v}:-l} "$1" ;;
|
||||
*.7z) 7za l "$1" ;;
|
||||
*) >&2 echo "$0: cannot list: $1"
|
||||
success=1
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
|
46
bin/mov2gif
46
bin/mov2gif
|
@ -14,7 +14,7 @@ set -e
|
|||
PALETTE="/tmp/palette.png"
|
||||
|
||||
usage() {
|
||||
cat <<EOL
|
||||
cat <<EOL
|
||||
Usage: ${0##*/} [-fsSth] SOURCE_FILE [destfile]
|
||||
|
||||
-f [FPS] set frames per second
|
||||
|
@ -31,33 +31,33 @@ trap cleanup EXIT
|
|||
#
|
||||
fps=30
|
||||
while getopts hf:s:t:S: opt; do
|
||||
case $opt in
|
||||
f) fps="$OPTARG" ;;
|
||||
s) start="-ss $OPTARG" ;;
|
||||
S) scale=",scale=$OPTARG:flags=lanczos" ;;
|
||||
t) duration="-t $OPTARG" ;;
|
||||
h) usage
|
||||
exit
|
||||
;;
|
||||
:) >&2 echo "$OPTARG requires an argument"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
*) >&2 echo "Not a valid arg: $opt"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
case $opt in
|
||||
f) fps="$OPTARG" ;;
|
||||
s) start="-ss $OPTARG" ;;
|
||||
S) scale=",scale=$OPTARG:flags=lanczos" ;;
|
||||
t) duration="-t $OPTARG" ;;
|
||||
h) usage
|
||||
exit
|
||||
;;
|
||||
:) >&2 echo "$OPTARG requires an argument"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
*) >&2 echo "Not a valid arg: $opt"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
#
|
||||
if (($# == 0)); then
|
||||
>&2 echo "No movie file specified"
|
||||
exit
|
||||
>&2 echo "No movie file specified"
|
||||
exit
|
||||
elif [[ ! -f $1 ]]; then
|
||||
>&2 echo "$1 does not exist"
|
||||
exit
|
||||
>&2 echo "$1 does not exist"
|
||||
exit
|
||||
fi
|
||||
|
||||
src="$1"
|
||||
|
@ -70,5 +70,5 @@ ffmpeg -v warning $start $duration -i "$src" -vf "$flags,palettegen=stats_mode=f
|
|||
ffmpeg -v warning $start $duration -i "$src" -i "$PALETTE" -lavfi "$flags [x]; [x][1:v] paletteuse" -y "$dest"
|
||||
|
||||
if command -v gifsicle >/dev/null; then
|
||||
gifsicle -O3 "$dest" -o "$dest"
|
||||
gifsicle -O3 "$dest" -o "$dest"
|
||||
fi
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
case $OSTYPE in
|
||||
darwin*)
|
||||
terminal-notifier -title "$1" -message "$2"
|
||||
;;
|
||||
linux*)
|
||||
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "$1" "$2"
|
||||
;;
|
||||
esac
|
36
bin/pacman-colors
Executable file
36
bin/pacman-colors
Executable file
|
@ -0,0 +1,36 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# ANSI color scheme script featuring PACMAN
|
||||
# by pfh
|
||||
#
|
||||
# Initializing procedure by lolilolicon
|
||||
|
||||
f=3 b=4
|
||||
for j in f b; do
|
||||
for i in {0..7}; do
|
||||
printf -v $j$i %b "\e[${!j}${i}m"
|
||||
done
|
||||
done
|
||||
bld=$'\e[1m'
|
||||
rst=$'\e[0m'
|
||||
inv=$'\e[7m'
|
||||
|
||||
|
||||
cat << EOF
|
||||
|
||||
$rst
|
||||
$f3 ▄███████▄ $f1 ▄██████▄ $f2 ▄██████▄ $f4 ▄██████▄ $f5 ▄██████▄ $f6 ▄██████▄
|
||||
$f3▄█████████▀▀ $f1▄$f7█▀█$f1██$f7█▀█$f1██▄ $f2▄█$f7███$f2██$f7███$f2█▄ $f4▄█$f7███$f4██$f7███$f4█▄ $f5▄█$f7███$f5██$f7███$f5█▄ $f6▄██$f7█▀█$f6██$f7█▀█$f6▄
|
||||
$f3███████▀ $f7▄▄ ▄▄ ▄▄ $f1█$f7▄▄█$f1██$f7▄▄█$f1███ $f2██$f7█ █$f2██$f7█ █$f2██ $f4██$f7█ █$f4██$f7█ █$f4██ $f5██$f7█ █$f5██$f7█ █$f5██ $f6███$f7█▄▄$f6██$f7█▄▄$f6█
|
||||
$f3███████▄ $f7▀▀ ▀▀ ▀▀ $f1████████████ $f2████████████ $f4████████████ $f5████████████ $f6████████████
|
||||
$f3▀█████████▄▄ $f1██▀██▀▀██▀██ $f2██▀██▀▀██▀██ $f4██▀██▀▀██▀██ $f5██▀██▀▀██▀██ $f6██▀██▀▀██▀██
|
||||
$f3 ▀███████▀ $f1▀ ▀ ▀ ▀ $f2▀ ▀ ▀ ▀ $f4▀ ▀ ▀ ▀ $f5▀ ▀ ▀ ▀ $f6▀ ▀ ▀ ▀
|
||||
$bld
|
||||
$f3 ▄███████▄ $f1 ▄██████▄ $f2 ▄██████▄ $f4 ▄██████▄ $f5 ▄██████▄ $f6 ▄██████▄
|
||||
$f3▄█████████▀▀ $f1▄$f7█▀█$f1██$f7█▀█$f1██▄ $f2▄█$f7█ █$f2██$f7█ █$f2█▄ $f4▄█$f7█ █$f4██$f7█ █$f4█▄ $f5▄█$f7█ █$f5██$f7█ █$f5█▄ $f6▄██$f7█▀█$f6██$f7█▀█$f6▄
|
||||
$f3███████▀ $f7▄▄ ▄▄ ▄▄ $f1█$f7▄▄█$f1██$f7▄▄█$f1███ $f2██$f7███$f2██$f7███$f2██ $f4██$f7███$f4██$f7███$f4██ $f5██$f7███$f5██$f7███$f5██ $f6███$f7█▄▄$f6██$f7█▄▄$f6█
|
||||
$f3███████▄ $f7▀▀ ▀▀ ▀▀ $f1████████████ $f2████████████ $f4████████████ $f5████████████ $f6████████████
|
||||
$f3▀█████████▄▄ $f1██▀██▀▀██▀██ $f2██▀██▀▀██▀██ $f4██▀██▀▀██▀██ $f5██▀██▀▀██▀██ $f6██▀██▀▀██▀██
|
||||
$f3 ▀███████▀ $f1▀ ▀ ▀ ▀ $f2▀ ▀ ▀ ▀ $f4▀ ▀ ▀ ▀ $f5▀ ▀ ▀ ▀ $f6▀ ▀ ▀ ▀
|
||||
$rst
|
||||
EOF
|
27
bin/pass-get
Executable file
27
bin/pass-get
Executable file
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Fetches the FIELD in ENTRY. It expects pass fields to be colon-delimited.
|
||||
|
||||
if (( $# != 2 )); then
|
||||
>&2 echo "Expected two arguments"
|
||||
>&2 echo "pass get ENTRY FIELD"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
entry=$1
|
||||
field=$2
|
||||
|
||||
secrets="$(pass show $entry)"
|
||||
if [[ ! $secrets ]]; then
|
||||
notify-send --urgency=critical "Failed to retrieve $entry"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ $field == password || -z $field ]]; then
|
||||
printf "%s" "$(head -n1 <<<"$secrets")"
|
||||
else
|
||||
printf "%s" "$(awk -v "key=$field:" '$1 == key {print $2}' <<<"$secrets")"
|
||||
fi | xsel -i -b -t 15000
|
||||
|
||||
#
|
||||
echo "Copied $entry:$field to clipboard for 15s"
|
31
bin/pass-otpuri
Executable file
31
bin/pass-otpuri
Executable file
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Generates an OTP-auth url (written for pass-otp)
|
||||
#
|
||||
# Example: passotpuri LABEL SECRET [QUERYSTRING]
|
||||
|
||||
type=totp
|
||||
issuer=
|
||||
while getopts tih opt; do
|
||||
case $opt in
|
||||
t) type="$OPTARG" ;;
|
||||
i) issuer="$OPTARG" ;;
|
||||
h) cat <<EOL
|
||||
Usage: $0 [-iuldypLSU] [topic1] [topic2] [...]
|
||||
|
||||
-t Set type (defaults to totp)
|
||||
-i Issuer
|
||||
EOL
|
||||
exit
|
||||
;;
|
||||
*) >&2 echo "Aborted."
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
label="$1"
|
||||
secret="$2"
|
||||
args="${3:+&$3}"
|
||||
|
||||
echo "otpauth://$type/$label?secret=$secret&issuer=${issuer:-$label}$args"
|
42
bin/pdfoptim
42
bin/pdfoptim
|
@ -10,27 +10,27 @@
|
|||
# Requires: ghostscript (gs)
|
||||
|
||||
optimize() {
|
||||
# Adapted from Alfred Klomp's shrinkpdf script
|
||||
# <http://alfredklomp.com/programming/shrinkpdf/>
|
||||
gs -q -dNOPAUSE -dBATCH -dSAFER \
|
||||
-sDEVICE=pdfwrite \
|
||||
-dPDFSETTINGS=/screen \
|
||||
-dCompatibilityLevel=1.3 \
|
||||
-dEmbedAllFonts=true \
|
||||
-dSubsetFonts=true \
|
||||
-dAutoRotatePages=/None \
|
||||
-dMonoImageResolution=$3 \
|
||||
-dMonoImageDownsampleType=/Bicubic \
|
||||
-dGrayImageResolution=$3 \
|
||||
-dGrayImageDownsampleType=/Bicubic \
|
||||
-dColorImageResolution=$3 \
|
||||
-dColorImageDownsampleType=/Bicubic \
|
||||
-sOutputFile="$2" \
|
||||
"$1"
|
||||
# Adapted from Alfred Klomp's shrinkpdf script
|
||||
# <http://alfredklomp.com/programming/shrinkpdf/>
|
||||
gs -q -dNOPAUSE -dBATCH -dSAFER \
|
||||
-sDEVICE=pdfwrite \
|
||||
-dPDFSETTINGS=/screen \
|
||||
-dCompatibilityLevel=1.3 \
|
||||
-dEmbedAllFonts=true \
|
||||
-dSubsetFonts=true \
|
||||
-dAutoRotatePages=/None \
|
||||
-dMonoImageResolution=$3 \
|
||||
-dMonoImageDownsampleType=/Bicubic \
|
||||
-dGrayImageResolution=$3 \
|
||||
-dGrayImageDownsampleType=/Bicubic \
|
||||
-dColorImageResolution=$3 \
|
||||
-dColorImageDownsampleType=/Bicubic \
|
||||
-sOutputFile="$2" \
|
||||
"$1"
|
||||
}
|
||||
|
||||
SRC="$1"
|
||||
DEST="${2:--}"
|
||||
DPI="${3:-72}"
|
||||
src="$1"
|
||||
dest="${2:--}"
|
||||
dpi="${3:-72}"
|
||||
|
||||
optimize "$SRC" "$DEST" "$DPI" || exit $?
|
||||
optimize "$src" "$dest" "$dpi" || exit $?
|
||||
|
|
70
bin/pushover
70
bin/pushover
|
@ -1,39 +1,57 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if [[ ! -f "$HOME/.private/config/pushover.conf" ]]; then
|
||||
>&2 echo "No pushover config file found (~/.private/config/pushover.conf)"
|
||||
exit 1
|
||||
#
|
||||
# Sends a pushover notification.
|
||||
#
|
||||
# -t [TITLE]
|
||||
# -m [MESSAGE]
|
||||
# -p [PRIORITY_LEVEL]
|
||||
# -u [URL]
|
||||
# -U [URL_TITLE]
|
||||
# -d [DEVICE]
|
||||
#
|
||||
|
||||
set -e
|
||||
unset CDPATH
|
||||
|
||||
secret_file=~/.secrets/pushover
|
||||
if [[ ! -f $secret_file ]]; then
|
||||
>&2 echo "No pushover config file found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
message=
|
||||
title=
|
||||
priority=
|
||||
title=${2:+$1}
|
||||
message=${2:-$1}
|
||||
# priority=
|
||||
url=
|
||||
url_title=
|
||||
device=
|
||||
|
||||
while getopts t:m:p:u:d: opt; do
|
||||
case $opt in
|
||||
t) title="$OPTARG" ;;
|
||||
m) message="$OPTARG" ;;
|
||||
p) priority="$OPTARG" ;;
|
||||
u) url="$OPTARG" ;;
|
||||
U) url_title="$OPTARG" ;;
|
||||
d) device="$OPTARG" ;;
|
||||
*) >&2 echo "Invalid option $OPTARG"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
case $opt in
|
||||
t) title="$OPTARG" ;;
|
||||
m) message="$OPTARG" ;;
|
||||
# p) priority="$OPTARG" ;;
|
||||
u) url="$OPTARG" ;;
|
||||
U) url_title="$OPTARG" ;;
|
||||
d) device="$OPTARG" ;;
|
||||
*) >&2 echo "Invalid option $OPTARG"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
. "$HOME/.private/config/pushover.conf"
|
||||
#USER=...
|
||||
#TOKEN=...
|
||||
eval "$(gpg --decrypt $secret_file)"
|
||||
|
||||
curl -s \
|
||||
--form-string "token=$TOKEN" \
|
||||
--form-string "user=$USER" \
|
||||
--form-string "title=$title" \
|
||||
--form-string "message=$message" \
|
||||
--form-string "url=$url" \
|
||||
--form-string "url_title=$url_title" \
|
||||
--form-string "device=$device" \
|
||||
https://api.pushover.net/1/messages.json
|
||||
--form-string "token=$TOKEN" \
|
||||
--form-string "user=$USER" \
|
||||
--form-string "title=$title" \
|
||||
--form-string "message=$message" \
|
||||
--form-string "url=$url" \
|
||||
--form-string "url_title=$url_title" \
|
||||
--form-string "device=$device" \
|
||||
https://api.pushover.net/1/messages.json
|
||||
|
|
16
bin/qrsnap
Executable file
16
bin/qrsnap
Executable file
|
@ -0,0 +1,16 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Snaps a screenshot of a QR code and decodes it.
|
||||
#
|
||||
# Requires: zbar, maim (on linux)
|
||||
|
||||
set -e
|
||||
unset CDPATH
|
||||
TMP=$(mktemp _qrXXX)
|
||||
case $OSTYPE in
|
||||
darwin*) screencapture -i -x -t png "$TMP" ;;
|
||||
linux*) maim -s "$TMP" ;;
|
||||
*) >&2 echo "Help!"; exit 1 ;;
|
||||
esac
|
||||
(( $? == 0 )) && zbarimg -q --raw "$TMP"
|
||||
rm -f "$TMP"
|
10
bin/rehash
Executable file
10
bin/rehash
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env zsh
|
||||
# Rehashes all (rb|py|nod|lua|*)env environments
|
||||
|
||||
for env in $XDG_CONFIG_HOME/*env(N); do
|
||||
local bin=${env##*/}
|
||||
if _is_callable $bin; then
|
||||
echo "Rehashing $bin"
|
||||
$bin rehash
|
||||
fi
|
||||
done
|
28
bin/replace
28
bin/replace
|
@ -1,13 +1,27 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
set -e
|
||||
unset CDPATH
|
||||
|
||||
# Find and replace by a given list of files.
|
||||
#
|
||||
# replace foo bar **/*.rb
|
||||
|
||||
find_this="$1"; shift
|
||||
replace_with="$1"; shift
|
||||
main() {
|
||||
local search="$1"
|
||||
local replace="$2"
|
||||
shift 2
|
||||
|
||||
items=( $(ag -l --nocolor "$find_this" "$@") )
|
||||
for item in ${items[@]}; do
|
||||
sed -i "s/${find_this}/${replace_with}/g" "$item"
|
||||
done
|
||||
for item in $(ag -l --nocolor "$search" "$@"); do
|
||||
sed -i "s%${search//%/\\%}%${replace//%/\\%}%g" "$item"
|
||||
done
|
||||
}
|
||||
|
||||
# Show matches
|
||||
ag "$1"
|
||||
|
||||
# Are you sure?
|
||||
read -rp "Confirm search+replace? (y/n)?" choice
|
||||
case $choice in
|
||||
y|Y) main "$@" ;;
|
||||
*) >&2 echo "Aborted"; exit ;;
|
||||
esac
|
||||
|
|
|
@ -73,10 +73,7 @@ class CurrencyCache():
|
|||
return None
|
||||
|
||||
def _set(self, key, value):
|
||||
self.cache[key] = {
|
||||
'time': datetime.now().timestamp(),
|
||||
'value': value
|
||||
}
|
||||
self.cache[key] = {'time': datetime.now().timestamp(), 'value': value}
|
||||
|
||||
|
||||
def _request_currency_rate(url=API_URL, *args):
|
||||
|
|
56
bin/since
56
bin/since
|
@ -2,54 +2,54 @@
|
|||
set -e
|
||||
(( $# > 0 )) || exit
|
||||
|
||||
# Displays the time since $1 in a human readable format (e.g. 4h 25m 55s). If given a
|
||||
# file, the modified time is used. If $1 == "--", then this script acts as a converter,
|
||||
# converting $2 into human a readable format, e.g. since -- 72 #=> 1m 12s
|
||||
# Displays the time since $1 in a human readable format (e.g. 4h 25m 55s). If
|
||||
# given a file, the modified time is used. If $1 == "--", then this script acts
|
||||
# as a converter, converting $2 into human a readable format, e.g. since -- 72
|
||||
# #=> 1m 12s
|
||||
|
||||
# TODO: A help fallback
|
||||
# TODO: Options parsing
|
||||
# TODO: Options parsing?
|
||||
|
||||
# `date` on OSX does not have the --date parameter
|
||||
date=date
|
||||
if [[ $OSTYPE == darwin* ]]; then
|
||||
date=gdate
|
||||
date=gdate
|
||||
elif ! command -v $date >/dev/null; then
|
||||
echo "Unsupported system"
|
||||
exit 1
|
||||
echo "Unsupported system"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If given a file, give time since last modification
|
||||
(( $# == 1 )) && [[ -f $@ ]] && arg=reference || arg=date
|
||||
(( $# == 1 )) && [[ -f $1 ]] && arg=reference || arg=date
|
||||
|
||||
args="$*"
|
||||
if [[ $1 == -- ]]; then
|
||||
t="$2"
|
||||
t="$2"
|
||||
else
|
||||
now=$(${date} +%s)
|
||||
then=$(${date} --$arg="$*" +%s)
|
||||
now=$($date +%s)
|
||||
then=$($date --$arg="$*" +%s)
|
||||
|
||||
t=$(( $now - $then ))
|
||||
t=$(( now - then ))
|
||||
fi
|
||||
|
||||
# Bash doesn't support floating point arithmetic like zsh does, therefore:
|
||||
bc <<EOF
|
||||
define abs(i) {
|
||||
if (i < 0) return (-i)
|
||||
return (i)
|
||||
}
|
||||
define abs(i) {
|
||||
if (i < 0) return (-i)
|
||||
return (i)
|
||||
}
|
||||
|
||||
t = abs($t)
|
||||
t = abs($t)
|
||||
|
||||
weeks = t / 60 / 60 / 24 / 7
|
||||
days = t / 60 / 60 / 24 % 7
|
||||
hours = t / 60 / 60 % 24
|
||||
minutes = t / 60 % 60
|
||||
seconds = t % 60
|
||||
weeks = t / 60 / 60 / 24 / 7
|
||||
days = t / 60 / 60 / 24 % 7
|
||||
hours = t / 60 / 60 % 24
|
||||
minutes = t / 60 % 60
|
||||
seconds = t % 60
|
||||
|
||||
if (weeks > 0) print weeks, "w "
|
||||
if (days > 0) print days, "d "
|
||||
if (hours > 0) print hours, "h "
|
||||
if (minutes > 0) print minutes, "m "
|
||||
print seconds, "s"
|
||||
if (weeks > 0) print weeks, "w "
|
||||
if (days > 0) print days, "d "
|
||||
if (hours > 0) print hours, "h "
|
||||
if (minutes > 0) print minutes, "m "
|
||||
print seconds, "s"
|
||||
EOF
|
||||
|
||||
|
|
14
bin/spell
14
bin/spell
|
@ -10,12 +10,12 @@
|
|||
|
||||
result=$(echo "$@" | aspell -a | tail -n-2)
|
||||
if [[ "$result" == '*' ]]; then
|
||||
echo "$@"
|
||||
echo "$@"
|
||||
else
|
||||
words=$(echo "$result" | sed $'s/[:,] /\\\n/g' | tail -n +2)
|
||||
if (( $(wc -l <<< "$words") > 1 )) && command -v 'fzf' >/dev/null; then
|
||||
fzf <<< "$words"
|
||||
else
|
||||
echo "$words"
|
||||
fi
|
||||
words=$(echo "$result" | sed $'s/[:,] /\\\n/g' | tail -n +2)
|
||||
if (( $(wc -l <<< "$words") > 1 )) && command -v 'fzf' >/dev/null; then
|
||||
fzf <<< "$words"
|
||||
else
|
||||
echo "$words"
|
||||
fi
|
||||
fi
|
||||
|
|
233
bin/sup
Normal file
233
bin/sup
Normal file
|
@ -0,0 +1,233 @@
|
|||
#!/usr/bin/env zsh
|
||||
# Upload to various file hosts
|
||||
|
||||
# colors
|
||||
c0=$(tput sgr0)
|
||||
c1=$(tput setaf 1)
|
||||
c2=$(tput setaf 2)
|
||||
# filename to use for screenshots
|
||||
local_temp=$(mktemp)
|
||||
|
||||
# screenshot functions
|
||||
cap_fullscreen() {
|
||||
local_file="$local_temp.png"
|
||||
mv $local_temp $local_file
|
||||
maim -u $local_file
|
||||
}
|
||||
|
||||
cap_selection() {
|
||||
local_file="$local_temp.png"
|
||||
mv $local_temp $local_file
|
||||
maim -s -u $local_file
|
||||
}
|
||||
|
||||
cap_window() {
|
||||
mv $local_temp $local_temp.png
|
||||
maim -i $(xprop -root _NET_ACTIVE_WINDOW | grep -o '0x.*') --hidecursor
|
||||
}
|
||||
|
||||
# delay
|
||||
delay_seconds='0'
|
||||
# hosts and shorteners
|
||||
host='uguu'
|
||||
shortener=
|
||||
hosts='uguu teknik 0x0 mixtape ptpb lewd'
|
||||
shorteners='waaai 0x0'
|
||||
|
||||
##
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Upload to various file hosts
|
||||
|
||||
Usage: ${0:A:t} [options]
|
||||
|
||||
Options:
|
||||
-d SECS Delay the screenshot by the specified number of seconds.
|
||||
-f Take a fullscreen screenshot.
|
||||
-h Show this help message.
|
||||
-l URL Upload the file at the provided URL.
|
||||
-o Select a host to use. Can be uguu, teknik, 0x0, ptpb, mixtape or lewd.
|
||||
-p PATH Custom path to save the image to. Saves the image as "%Y-%m-%d %H-%M-%S.png".
|
||||
-s Take a selection screenshot.
|
||||
-S Select a shortener to use. Can be waaai or 0x0.
|
||||
-u FILE Upload a file.
|
||||
-w Take a screenshot of the current window.
|
||||
-x Do not notify dbus, update the log, or modify the clipboard.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
delay() {
|
||||
for (( i=delay_seconds; i>0; --i )); do
|
||||
echo "$i..."
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
screenshot() {
|
||||
if [[ $doFullscreen ]]; then
|
||||
cap_fullscreen
|
||||
elif [[ $doSelection ]]; then
|
||||
cap_selection &>/dev/null
|
||||
if ! [[ -s $local_file ]]; then
|
||||
$(rm "$local_file" 2> /dev/null)
|
||||
exit
|
||||
fi
|
||||
elif [[ $doWindow ]]; then
|
||||
cap_window
|
||||
elif [[ $doURL ]]; then
|
||||
local urlext
|
||||
if [[ -f /usr/share/mime/globs ]]; then
|
||||
urlext=$(curl -sf --head "${remoteURL}" | grep 'Content-Type: ' | head -1 | grep -Po '(?<=\ )[^\;]*')
|
||||
urlext=$(echo "${urlext}" | sed -e "s/\\r//")
|
||||
urlext=$(cat /usr/share/mime/globs | grep "${urlext}" | sort -r | head -1 | grep -Po '(?<=\.)[^\n]*')
|
||||
else
|
||||
urlext="$(basename ${remoteURL})"
|
||||
urlext=${urlext#*.}
|
||||
fi
|
||||
local_file="${local_temp}.${urlext}"
|
||||
$(curl -sf "${remoteURL}" > "${local_file}")
|
||||
fi
|
||||
}
|
||||
|
||||
upload() {
|
||||
for (( i = 1; i <= 3; i++ )); do
|
||||
echo -n "Try #${i}... "
|
||||
|
||||
case "${host}" in
|
||||
teknik) hostURL='https://api.teknik.io/v1/Upload' ;;
|
||||
0x0) hostURL='https://0x0.st/' ;;
|
||||
uguu) hostURL='https://uguu.se/api.php?d=upload-tool' ;;
|
||||
ptpb) hostURL='https://ptpb.pw/' ;;
|
||||
mixtape) hostURL='https://mixtape.moe/upload.php' ;;
|
||||
lewd) hostURL='https://lewd.se/api.php?d=upload-tool' ;;
|
||||
esac
|
||||
|
||||
case "${shortener}" in
|
||||
waaai) shortenerURL='https://api.waa.ai/shorten' ;;
|
||||
0x0) shortenerURL='http://0x0.st/' ;;
|
||||
ptpb) shortenerURL='https://ptpb.pw/u'
|
||||
esac
|
||||
|
||||
if [ "${host}" = 'uguu' ]; then
|
||||
uploadResult="$(curl -sf -F file="@${local_file}" "${hostURL}")"
|
||||
elif [ "${host}" = '0x0' ]; then
|
||||
uploadResult="$(curl -sf -F file="@${local_file}" "${hostURL}")"
|
||||
elif [ "${host}" = 'teknik' ]; then
|
||||
uploadResult="$(curl -sf -F file="@${local_file}" "${hostURL}")"
|
||||
uploadResult="${uploadResult##*url\":\"}"
|
||||
uploadResult="${uploadResult%%\"*}"
|
||||
elif [ "${host}" = 'mixtape' ]; then
|
||||
uploadResult="$(curl -sf -F files[]="@${local_file}" "${hostURL}")"
|
||||
uploadResult="$(echo "${uploadResult}" | grep -Eo '"url":"[A-Za-z0-9]+.*",' | sed 's/"url":"//;s/",//')"
|
||||
uploadResult="$(echo "${uploadResult//\\\//\/}")"
|
||||
elif [ "${host}" = 'ptpb' ]; then
|
||||
uploadResult="$(curl -sf -F c="@${local_file}" "${hostURL}")"
|
||||
uploadResult="${uploadResult##*url: }"
|
||||
uploadResult="${uploadResult%%$'\n'*}"
|
||||
elif [ "${host}" = 'lewd' ]; then
|
||||
uploadResult="$(curl -sf -F file="@${local_file}" "${hostURL}")"
|
||||
fi
|
||||
|
||||
if [ "${shortener}" = 'waaai' ]; then
|
||||
tempResult="$(curl -sf -F url="${uploadResult}" "${shortenerURL}")"
|
||||
shortCode="${tempResult##*short_code\":\"}"
|
||||
shortCode="${shortCode%%\"*}"
|
||||
shortenerResult="https://waa.ai/${shortCode}"
|
||||
shortenerExtension="${tempResult##*extension\":}"
|
||||
shortenerExtension="${shortenerExtension%%\}*}"
|
||||
if [[ $shortenerExtension == true ]]; then
|
||||
shortenerExtension=${shortenerExtension##\"}
|
||||
shortenerExtension=${shortenerExtension%%\"}
|
||||
shortenerResult="${shortenerResult}.${shortenerExtension}"
|
||||
fi
|
||||
elif [[ $shortener == '0x0' ]]; then
|
||||
shortenerResult="$(curl -sf -F shorten="${uploadResult}" "${shortenerURL}")"
|
||||
elif [[ $shortener == 'ptpb' ]]; then
|
||||
shortenerResult="$(curl -sf -F c=@- "${shortenerURL}" <<< "${uploadResult}")"
|
||||
fi
|
||||
|
||||
if [[ $shortener ]]; then
|
||||
finalResult="$shortenerResult"
|
||||
else
|
||||
finalResult="$uploadResult"
|
||||
fi
|
||||
|
||||
if [[ $? == 0 ]]; then
|
||||
# copy to clipboard, log, and notify (unless $noComms is set)
|
||||
if [ ! "${noComms}" ]; then
|
||||
echo -n "${finalResult}" | xclip -selection primary
|
||||
echo -n "${finalResult}" | xclip -selection clipboard
|
||||
echo "$(date +"%D %R") | "${file}" | "${finalResult}"" >> ~/.uguush.log
|
||||
notify-send 'uguu~' "${finalResult}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "[${c2}OK${c0}]"
|
||||
echo "File has been uploaded: ${finalResult}"
|
||||
|
||||
# if we took a screenshot, remove the temporary file
|
||||
if [[ -z $doFile ]]; then
|
||||
rm $local_file
|
||||
fi
|
||||
|
||||
exit
|
||||
done
|
||||
}
|
||||
|
||||
path() {
|
||||
if [[ $saveToPath == true ]]; then
|
||||
cp $local_file "$pathToSave/$(basename "$local_file")"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
while getopts :d:fho:p:su:wxS:l: opt; do
|
||||
case $opt in
|
||||
d) # set delay value
|
||||
delay_seconds="$OPTARG" ;;
|
||||
f) # take fullscreen shot
|
||||
doFullscreen='true' ;;
|
||||
h) # print help
|
||||
usage
|
||||
exit 0 ;;
|
||||
o) # set host
|
||||
[[ "${hosts}" =~ "$OPTARG" ]] && host="$OPTARG" || exit 1 ;;
|
||||
s) # take shot of selection
|
||||
doSelection='true' ;;
|
||||
u) # change $file to the specified file with -u
|
||||
doFile='true'
|
||||
local_file="$OPTARG" ;;
|
||||
w) # take shot of current window
|
||||
doWindow='true' ;;
|
||||
x) # do not notify dbus, update log, or modify clipboard
|
||||
noComms='true' ;;
|
||||
S) # set shortener
|
||||
[[ $shorteners =~ "$OPTARG" ]] && shortener="$OPTARG" || exit 1 ;;
|
||||
l) # set url to upload
|
||||
doURL='true'
|
||||
remoteURL="${OPTARG}" ;;
|
||||
p) # set path to save file
|
||||
saveToPath='true'
|
||||
pathToSave="${OPTARG}" ;;
|
||||
*) # print help and EXIT_FAILURE
|
||||
usage
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# show usage if no arguments are given
|
||||
if (( $# < 1 )); then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
delay
|
||||
screenshot
|
||||
path
|
||||
upload
|
||||
|
||||
# if the program doesn't exit at the for-loop, the upload failed
|
||||
>&2 echo 'File was not uploaded, did you specify a valid filename?'
|
||||
exit 1
|
|
@ -11,6 +11,7 @@ Usage: time-in Copenhagen "Toronto, ON" Vancouver
|
|||
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
from base64 import b64encode
|
||||
from datetime import datetime
|
||||
from urllib import request
|
||||
|
@ -23,7 +24,7 @@ URL_BASE = "https://maps.googleapis.com/maps/api/"
|
|||
URL_TZ = URL_BASE + "timezone/json?location={},{}×tamp={}"
|
||||
URL_GEOCODE = URL_BASE + "geocode/json?address={}"
|
||||
|
||||
CACHE_FILE = "/tmp/time-in"
|
||||
CACHE_FILE = "{}/timein".format(os.environ.get("XDG_CACHE_HOME") or "/tmp")
|
||||
CACHE = {}
|
||||
|
||||
|
12
bin/transfer
12
bin/transfer
|
@ -1,16 +1,16 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Upload file to transfer.sh
|
||||
# Upload file/stdin to transfer.sh
|
||||
url="https://transfer.sh"
|
||||
tmpfile=$(mktemp -t transferXXX)
|
||||
if [[ -t 0 ]]; then
|
||||
basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
|
||||
curl --progress-bar --upload-file "$1" "$url/$basefile" >> $tmpfile
|
||||
basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9._-]/-/g')
|
||||
curl --progress-bar --upload-file "$1" "$url/$basefile" >>"$tmpfile"
|
||||
else
|
||||
curl --progress-bar --upload-file "-" "$url/$1" >> $tmpfile
|
||||
curl --progress-bar --upload-file "-" "$url/$1" >>"$tmpfile"
|
||||
fi
|
||||
|
||||
cat $tmpfile
|
||||
rm -f $tmpfile
|
||||
cat "$tmpfile"
|
||||
rm -f "$tmpfile"
|
||||
|
||||
# vim:set ft=sh:
|
||||
|
|
48
bin/uri
48
bin/uri
|
@ -4,46 +4,34 @@
|
|||
Encode/decode url strings in stdin or the given file(s).
|
||||
"""
|
||||
|
||||
import getopt
|
||||
import argparse
|
||||
import fileinput
|
||||
import sys
|
||||
import os
|
||||
try:
|
||||
from urllib.parse import quote_plus, quote, unquote_plus, unquote
|
||||
except ImportError:
|
||||
from urllib import quote_plus, quote, unquote_plus, unquote
|
||||
|
||||
|
||||
def usage():
|
||||
"""Print out help for this script"""
|
||||
print("Usage: {} [-edEDh] file1[ file2[ ...]]".format(os.path.basename(sys.argv[0])))
|
||||
|
||||
|
||||
def main(commands):
|
||||
try:
|
||||
optlist, args = getopt.getopt(sys.argv[1:], 'edEDh')
|
||||
sys.argv = [sys.argv[0]] + args
|
||||
except getopt.GetoptError as err:
|
||||
print(err)
|
||||
sys.exit(1)
|
||||
def main():
|
||||
opts = argparse.ArgumentParser(description="Make text URI-safe by encoding/decoding input")
|
||||
opts.add_argument('file', type=str, nargs='*', help='File(s) to encode/decode')
|
||||
opts.add_argument('-e', '--encode', action='store_true', help='Use encoder')
|
||||
opts.add_argument('-E', '--encode-plus', action='store_true', help='Use encoder, but encode spaces as pluses')
|
||||
opts.add_argument('-d', '--decode', action='store_true', help='Use decoder')
|
||||
opts.add_argument('-D', '--decode-plus', action='store_true', help='Use decoder, but decode pluses as spaces')
|
||||
args = opts.parse_args()
|
||||
|
||||
action = quote
|
||||
for flag, _ in optlist:
|
||||
if flag in commands:
|
||||
action = commands[flag]
|
||||
elif flag == '-h':
|
||||
usage()
|
||||
sys.exit()
|
||||
else:
|
||||
assert False, "unhandled option"
|
||||
if args.decode:
|
||||
action = unquote
|
||||
elif args.decode_plus:
|
||||
action = unquote_plus
|
||||
elif args.encode_plus:
|
||||
action = quote_plus
|
||||
|
||||
print(action("\n".join([line for line in fileinput.input()]).strip()))
|
||||
text = [line for line in fileinput.input(args.file)]
|
||||
print(action("\n".join(text).strip()))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main({
|
||||
"-e": quote,
|
||||
"-E": quote_plus,
|
||||
"-d": unquote,
|
||||
"-D": unquote_plus
|
||||
})
|
||||
main()
|
||||
|
|
46
bin/zzz
46
bin/zzz
|
@ -3,28 +3,28 @@
|
|||
# If -f, then put computer to sleep.
|
||||
# Otherwise, lock screen and turn off monitor.
|
||||
|
||||
if [[ $1 = -h ]]; then
|
||||
bin=${0##*/}
|
||||
echo "Usage: $bin [-f]"
|
||||
echo
|
||||
echo " $bin # put display to sleep"
|
||||
echo " $bin -f # put computer to sleep"
|
||||
elif [[ $1 = -f ]]; then
|
||||
echo "Going to sleep..."
|
||||
case $OSTYPE in
|
||||
darwin*) pmset sleepnow ;;
|
||||
linux*) systemctl suspend ;;
|
||||
esac
|
||||
if [[ $1 == -h ]]; then
|
||||
bin=${0##*/}
|
||||
echo "Usage: $bin [-f]"
|
||||
echo
|
||||
echo " $bin # put display to sleep"
|
||||
echo " $bin -f # put computer to sleep"
|
||||
elif [[ $1 == -f ]]; then
|
||||
echo "Going to sleep..."
|
||||
case $OSTYPE in
|
||||
darwin*) pmset sleepnow ;;
|
||||
linux*) systemctl suspend ;;
|
||||
esac
|
||||
else
|
||||
echo "Shutting my eyes..."
|
||||
case $OSTYPE in
|
||||
darwin*) sleep 1; pmset displaysleepnow ;;
|
||||
linux*)
|
||||
if command -v slock >/dev/null; then
|
||||
pgrep slock >/dev/null || slock &
|
||||
fi
|
||||
sleep 1
|
||||
xset dpms force off
|
||||
;;
|
||||
esac
|
||||
echo "Shutting my eyes..."
|
||||
case $OSTYPE in
|
||||
darwin*) sleep 1; pmset displaysleepnow ;;
|
||||
linux*)
|
||||
if command -v slock >/dev/null; then
|
||||
pgrep slock >/dev/null || slock &
|
||||
fi
|
||||
sleep 1
|
||||
xset dpms force off
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
|
143
bootstrap
143
bootstrap
|
@ -1,143 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# My (idempotent) dotfile deployment script.
|
||||
#
|
||||
# You pass the directories of "topics" to it to install them. It will:
|
||||
# 1. symlink $topic/.* => ~/ and $topic/.(config|local)/* => ~/.\1/
|
||||
# 2. run $topic/install the first time
|
||||
# 3. run $topic/update on consecutive runs
|
||||
|
||||
CWD="$(cd "$(dirname "$0")" && pwd)"
|
||||
pushd "$CWD" >/dev/null
|
||||
set -e
|
||||
shopt -s nullglob
|
||||
|
||||
# shellcheck source=shell/common.sh
|
||||
source "shell/common.sh"
|
||||
|
||||
#
|
||||
blue="\033[34m"
|
||||
magenta="\033[35m"
|
||||
green="\033[32m"
|
||||
orange="\033[33m"
|
||||
grey="\033[36m"
|
||||
red="\033[31m"
|
||||
nc="\033[0m"
|
||||
#
|
||||
|
||||
_run() {
|
||||
local cmd="${*//$DOTFILES\//}"
|
||||
cmd="${cmd//$HOME/~}"
|
||||
local clr=""
|
||||
case $cmd in
|
||||
*~/.bin/) clr="${magenta}" ;;
|
||||
ln*) clr="" ;;
|
||||
mkdir*) clr="${blue}" ;;
|
||||
*) clr="${orange}"
|
||||
esac
|
||||
echo -e " $PREFIX$clr$cmd$nc"
|
||||
[[ $DRYRUN ]] || { $@ 2>&1 | sed 's/^/ => /'; }
|
||||
}
|
||||
|
||||
_link() {
|
||||
if [[ -f "$2" || ( -d "$2" && -f "$2/${1##*/}" ) ]]; then
|
||||
if [[ $yes ]]; then
|
||||
[[ $yes = 1 ]] && choice=y || choice=n
|
||||
else
|
||||
read -r -n 1 -p "? ${1##*/} exists in $2 -- overwrite? [y/n] " choice
|
||||
echo
|
||||
fi
|
||||
case $choice in
|
||||
y|Y) _run rm -rf "$2"
|
||||
PREFIX="${red}OVERWRITE:${nc} " _run ln -svf "$1" "$2"
|
||||
;;
|
||||
*) PREFIX="${red}ABORTED:${nc} " DRYRUN=1 _run ln -svf "$1" "$2"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
_run ln -svf "$1" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
##
|
||||
export SERVER=
|
||||
install=1
|
||||
link=1
|
||||
update=1
|
||||
yes=0
|
||||
while getopts iuldypLSUh opt; do
|
||||
case $opt in
|
||||
d) DRYRUN=1 ;;
|
||||
i) install= ;;
|
||||
l) link= ;;
|
||||
p) yes= ;;
|
||||
u) update= ;;
|
||||
y) yes=1 ;;
|
||||
S) SERVER=1 ;;
|
||||
U) install=
|
||||
yes=0
|
||||
;;
|
||||
L) update=
|
||||
install=
|
||||
yes=0
|
||||
;;
|
||||
h) cat <<EOL
|
||||
Usage: $0 [-iuldypLSU] [topic1] [topic2] [...]
|
||||
|
||||
-i Don't run install scripts
|
||||
-u Don't run update scripts
|
||||
-l Don't symlink dotfiles
|
||||
-d Do a dry run (only output commands, no changes)
|
||||
-y Overwrite conflicts (no prompts)
|
||||
-p Prompt on file conflict (to overwrite)
|
||||
-L Refresh links; the same as -ui
|
||||
-S Server mode; only install the bare minimum
|
||||
-U Update mode; run update scripts only
|
||||
EOL
|
||||
exit
|
||||
;;
|
||||
*) >&2 echo "Aborted."
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
#
|
||||
ENABLED_DIR=".enabled.d"
|
||||
for topic in "${@:-$(ls -1 "$ENABLED_DIR" | sed 's%_%/%')}"; do
|
||||
[[ -d $topic ]] || continue
|
||||
|
||||
echo -e "${green}${topic}${nc}"
|
||||
|
||||
tpath="$CWD/$topic"
|
||||
if [[ $link ]]; then
|
||||
# Symlink dotfiles from topics (2 levels deep) + parent (1 level deep)
|
||||
for file in "$tpath"{,../}/.[a-zA-Z]*; do
|
||||
if [[ -d "$file" && "${file##*/}" == .@(config|local) ]]; then
|
||||
for subfile in "$file"/*; do
|
||||
base="$HOME/${file##*/}/"
|
||||
[[ -d $base ]] || _run mkdir -p "$base"
|
||||
_link "$subfile" "$base"
|
||||
done
|
||||
elif [[ -e $file ]]; then
|
||||
_link "$file" "$HOME/"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Link topic to .enabled.d
|
||||
linkpath="${ENABLED_DIR}/${topic//\//_}"
|
||||
if [[ -h "$linkpath" ]]; then
|
||||
[[ "$update" && -x ${linkpath}/update ]] && _run "$tpath/update"
|
||||
else
|
||||
# Register topic as 'enabled'
|
||||
_run ln -svf "$tpath" "$linkpath"
|
||||
|
||||
# Run install script
|
||||
[[ "$install" && -x ${linkpath}/install ]] && _run "$tpath/install"
|
||||
fi
|
||||
done
|
||||
popd >/dev/null
|
||||
|
||||
# vim:set ft=sh:
|
41
bootstrap.sh
Executable file
41
bootstrap.sh
Executable file
|
@ -0,0 +1,41 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# dotfiles bootstrapper
|
||||
#
|
||||
# Installs zsh & git, then clones this repo to ~/.dotfiles. This script is
|
||||
# intended to be run remotely, via curl:
|
||||
#
|
||||
# bash <(curl -s https://raw.githubusercontent.com/hlissner/dotfiles/master/bootstrap.sh)
|
||||
|
||||
export DOTFILES=~/.dotfiles
|
||||
set -e
|
||||
|
||||
_msg() { printf "\r\033[2K\033[0;32m[ .. ] %s\033[0m\n" "$*"; }
|
||||
_uncallable() { ! command -v "$1" >/dev/null; }
|
||||
|
||||
if _uncallable zsh || _uncallable git; then
|
||||
# NOTE Macos has both already
|
||||
_msg "Installing git and/or zsh"
|
||||
if [[ -f /etc/arch-release ]]; then
|
||||
sudo pacman --needed --noconfirm -S git zsh
|
||||
elif [[ -f /etc/debian_version ]]; then
|
||||
sudo apt-get update && sudo apt-get install -y git zsh
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ! -d ~/.dotfiles ]]; then
|
||||
_msg "Deploying dotfiles repository..."
|
||||
if [[ $USER == hlissner ]]; then
|
||||
dfrepo=git@github.com:hlissner/dotfiles.git
|
||||
else
|
||||
dfrepo=https://github.com/hlissner/dotfiles
|
||||
fi
|
||||
git clone --recursive "$dfrepo" "$DOTFILES"
|
||||
fi
|
||||
|
||||
#
|
||||
_msg
|
||||
_msg "And done!"
|
||||
_msg
|
||||
_msg "Use $DOTFILES/deploy to install your dotfiles, I suggest you begin"
|
||||
_msg "with 'base/arch' or 'base/macos'."
|
45
clean
45
clean
|
@ -1,45 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# A symlink cleanup script.
|
||||
#
|
||||
# Usage: clean [-du]
|
||||
#
|
||||
# Options:
|
||||
# -d Do a dry run (only output commands, no changes)
|
||||
# -u Uninstall all enabled topics
|
||||
|
||||
_run() {
|
||||
if [[ $DRYRUN ]]; then
|
||||
echo "$@"
|
||||
else
|
||||
$@
|
||||
fi
|
||||
}
|
||||
|
||||
uninstall=
|
||||
while getopts du opt; do
|
||||
case $opt in
|
||||
d) DRYRUN=1 ;;
|
||||
u) uninstall=1 ;;
|
||||
*) >&2 echo "Invalid argument: $OPTARG"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
# Remove enabled topics
|
||||
if [[ $uninstall ]]; then
|
||||
_run rm -v "$(cd "$(dirname "$0")" && pwd -P)"/.enabled.d/*
|
||||
fi
|
||||
|
||||
# Remove dead links
|
||||
shopt -s nullglob
|
||||
links=( $HOME/.* $HOME/.*/* )
|
||||
for link in "${links[@]}"; do
|
||||
if [[ -h "$link" && ! -e "$link" ]]; then
|
||||
_run rm -vf "$link"
|
||||
fi
|
||||
done
|
||||
|
||||
# vim:set ft=sh:
|
199
deploy
Executable file
199
deploy
Executable file
|
@ -0,0 +1,199 @@
|
|||
#!/usr/bin/env zsh
|
||||
|
||||
# Dotfile manager
|
||||
#
|
||||
# By Henrik Lissner <henrik@lissner.net>
|
||||
# https://github.com/hlissner/dotfiles
|
||||
#
|
||||
# Requires: git, zsh
|
||||
|
||||
source "${0:A:h}/env"
|
||||
SEP='.'
|
||||
|
||||
# helpers
|
||||
function echo-debug { echo "$@" | sed -e "s%$HOME%~%g" -e "s%$DOTFILES%.%g"; }
|
||||
function echo-info { printf "\r\033[2K\033[0;34m[ .. ]\033[0m %s\n" "$*"; }
|
||||
function echo-skip { printf "\r\033[2K\033[38;05;240m[SKIP]\033[0m %s\n" "$*"; }
|
||||
function echo-ok { printf "\r\033[2K\033[0;32m[ OK ]\033[0m %s\n" "$*"; }
|
||||
function echo-fail { printf "\r\033[2K\033[0;31m[FAIL]\033[0m %s\n" "$*"; }
|
||||
|
||||
function _exec { ${DRYRUN:+echo-debug} $@; return ${DRYRUN:+1}; }
|
||||
function _topic-do {
|
||||
if [[ -e "$1/_init" ]]; then
|
||||
if [[ ! -x "$1/_init" ]]; then
|
||||
echo-fail "$1's init script isn't executable"
|
||||
return 1
|
||||
fi
|
||||
export TOPIC=$1
|
||||
pushd -q $1
|
||||
_exec ./_init $2
|
||||
popd -q
|
||||
return $?
|
||||
fi
|
||||
}
|
||||
function _topics {
|
||||
local topics=( "$DOTFILES_DATA"/*.topic(N) )
|
||||
echo ${${${topics[@]#$DOTFILES_DATA/}%.topic}/$SEP//}
|
||||
}
|
||||
|
||||
|
||||
# For _init scripts
|
||||
function topic-enabled-p { [[ -L "$(topic-path $1)" ]] }
|
||||
function topic-path { echo "$DOTFILES_DATA/${1/\//$SEP}.topic" }
|
||||
|
||||
function mklink {
|
||||
if [[ $1 == '-s' ]]; then
|
||||
local dosudo=1
|
||||
shift
|
||||
fi
|
||||
local flags="-sv${OVERWRITE:+f}"
|
||||
local srcs=( ${@:1:-1} )
|
||||
local dest=${@[-1]}
|
||||
if [[ $dest == */ && ! -d $dest ]]; then
|
||||
mkdir -p $dest
|
||||
elif [[ ! -d ${dest%/*} ]]; then
|
||||
mkdir -p ${dest%/*}
|
||||
fi
|
||||
for lk in ${srcs[@]}; do
|
||||
local src
|
||||
case $lk in
|
||||
/*) src=$lk ;;
|
||||
.) src="$(topic-path $TOPIC)" ;;
|
||||
*) src="$(topic-path $TOPIC)/$lk" ;;
|
||||
esac
|
||||
if [[ -d $src ]]; then
|
||||
if [[ $dest != */ && -d $dest && -L $dest ]]; then
|
||||
${dosudo:+sudo} rm -fv $dest
|
||||
fi
|
||||
fi
|
||||
_exec ${dosudo:+sudo} ln $flags $src $dest
|
||||
done
|
||||
}
|
||||
|
||||
function init {
|
||||
declare -f $1 >/dev/null || return 1
|
||||
echo-info "$TOPIC.init.$1: start"
|
||||
$1
|
||||
local retval=$?
|
||||
echo-ok "$TOPIC.init.$1: done"
|
||||
return $retval
|
||||
}
|
||||
|
||||
# deploy functions
|
||||
function topic-init {
|
||||
for topic in $@; do
|
||||
if [[ ! -d $topic ]]; then
|
||||
echo-fail "$topic doesn't exist!"
|
||||
continue
|
||||
fi
|
||||
echo-ok "$topic"
|
||||
|
||||
local tpath="$DOTFILES/$topic"
|
||||
local tsympath="$(topic-path $topic)"
|
||||
if [[ -d "$topic/bin" ]]; then
|
||||
export path=( $tpath/bin $path )
|
||||
echo-ok "$topic: added $topic/bin to PATH, temporarily"
|
||||
fi
|
||||
|
||||
if [[ $LINK ]] || ! topic-enabled-p $topic; then
|
||||
local op=install
|
||||
OVERWRITE=1 mklink $tpath $tsympath
|
||||
_topic-do $topic link
|
||||
fi
|
||||
|
||||
if [[ -z $INHIBIT_INIT ]]; then
|
||||
_topic-do $topic ${FORCE_OP:-${op:-update}}
|
||||
if [[ $op == install && $? != 0 ]]; then
|
||||
topic-remove $topic
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function topic-remove {
|
||||
for topic in $@; do
|
||||
if [[ ! -d $topic ]]; then
|
||||
echo-fail "$topic doesn't exist"
|
||||
continue
|
||||
elif ! topic-enabled-p $topic; then
|
||||
echo-fail "$topic isn't enabled"
|
||||
continue
|
||||
fi
|
||||
|
||||
[[ $INHIBIT_INIT ]] || _topic-do $topic clean
|
||||
_exec rm -f "$(topic-path $topic)" && \
|
||||
echo-ok "Removed $topic" || \
|
||||
echo-fail "Couldn't remove $topic"
|
||||
done
|
||||
}
|
||||
|
||||
function clean {
|
||||
local paths=( $XDG_CACHE_HOME $XDG_CONFIG_HOME $XDG_DATA_HOME $XDG_BIN_HOME )
|
||||
local links=( ~/.*(-@DN) ${^paths}/**(-@DN))
|
||||
if [[ ${#links[@]} > 1 ]]; then
|
||||
echo-info "Removing dead dotfile symlinks..."
|
||||
for link in "${links[@]}"; do
|
||||
[[ -e $link ]] || _exec rm -fv "$link"
|
||||
done
|
||||
else
|
||||
echo-ok "No dead symlinks in HOME"
|
||||
fi
|
||||
|
||||
# Remove empty dotfile folders
|
||||
local dirs=( ${^paths}/**(N/^F) ~/.*(N/^F) )
|
||||
if [[ ${#dirs[@]} > 1 ]]; then
|
||||
echo-info "Removing empty dotfile directories..."
|
||||
for dir in "${dirs[@]}"; do
|
||||
_exec rmdir "$dir" && echo-ok "Deleted ${dir/$HOME/~}"
|
||||
done
|
||||
else
|
||||
echo-ok "No empty directories in HOME"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
## Bootstrap
|
||||
if [[ $ZSH_EVAL_CONTEXT != *:file ]]; then
|
||||
while getopts acdehlLit opt; do
|
||||
case $opt in
|
||||
a) TARGETS="$(_topics)" ;;
|
||||
c) CLEAN=1 ;;
|
||||
d) REMOVE=1 ;;
|
||||
L) LIST=1 ;;
|
||||
l) export LINK=1 ;&
|
||||
i) export INHIBIT_INIT=1 ;;
|
||||
t) export DRYRUN=1 ;;
|
||||
h) cat <<EOL
|
||||
Usage: ${0:A:t} [-acdlLit] [TOPIC...]
|
||||
|
||||
-a Target all enabled topics (ignores TOPIC args)
|
||||
-c Afterwards, remove dead symlinks & empty dot-directories in $HOME.
|
||||
Can be used alone.
|
||||
-d Disable & unlink topic(s)
|
||||
-l Only enable & relink topic(s) (implies -i)
|
||||
-L List enabled topics
|
||||
-i Do not run install/update/clean init scripts
|
||||
-t Do a test run; do not actually do anything
|
||||
EOL
|
||||
exit ;;
|
||||
*) >&2 echo-fail "Aborted."
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
if [[ $LIST ]]; then
|
||||
_topics | tr ' ' $'\n'
|
||||
else
|
||||
pushd -qL "$DOTFILES"
|
||||
if [[ $REMOVE ]]; then
|
||||
topic-remove ${TARGETS:-$@}
|
||||
else
|
||||
topic-init ${TARGETS:-$@}
|
||||
fi
|
||||
[[ $CLEAN ]] && clean
|
||||
popd -q
|
||||
fi
|
||||
fi
|
||||
|
||||
# vim:set ft=sh:
|
25
dev/go/_init
Executable file
25
dev/go/_init
Executable file
|
@ -0,0 +1,25 @@
|
|||
#!/usr/bin/env zsh
|
||||
source ${0:A:h}/../../deploy
|
||||
source env.zsh
|
||||
|
||||
install() {
|
||||
case $(_os) in
|
||||
macos) brew install go ;;
|
||||
arch) pacaur --needed --noconfirm -S go ;;
|
||||
esac
|
||||
|
||||
update
|
||||
}
|
||||
|
||||
update() {
|
||||
go get -u github.com/nsf/gocode
|
||||
go get -u github.com/motemen/gore
|
||||
go get -u golang.org/x/tools/cmd/guru
|
||||
go get -u golang.org/x/tools/cmd/gorename
|
||||
}
|
||||
|
||||
# link() {}
|
||||
|
||||
# clean() {}
|
||||
|
||||
init "$@"
|
4
dev/go/env.zsh
Normal file
4
dev/go/env.zsh
Normal file
|
@ -0,0 +1,4 @@
|
|||
export GOPATH="$XDG_DATA_HOME/go:$HOME/work/go"
|
||||
|
||||
# Adds $GOPATH/bin's to PATH
|
||||
path=( `printf '%s/bin\n' ${(@s/:/)GOPATH}` $path )
|
22
dev/haskell/_init
Executable file
22
dev/haskell/_init
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/usr/bin/env zsh
|
||||
source ${0:A:h}/../../deploy
|
||||
source env.zsh
|
||||
|
||||
install() {
|
||||
case $(_os) in
|
||||
macos) brew install stack ghc ;;
|
||||
arch) pacaur --needed --noedit --noconfirm -S ghc stack-static ;;
|
||||
esac
|
||||
stack config set system-ghc --global true
|
||||
stack setup && stack install ShellCheck ghc-mod
|
||||
}
|
||||
|
||||
update() {
|
||||
stack update
|
||||
}
|
||||
|
||||
# link() {}
|
||||
|
||||
# clean() {}
|
||||
|
||||
init "$@"
|
2
dev/haskell/env.zsh
Normal file
2
dev/haskell/env.zsh
Normal file
|
@ -0,0 +1,2 @@
|
|||
export STACK_ROOT=$XDG_DATA_HOME/stack
|
||||
path=( ~/.cabal/bin $path )
|
19
dev/java/_init
Executable file
19
dev/java/_init
Executable file
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env zsh
|
||||
source ${0:A:h}/../../deploy
|
||||
source env.zsh
|
||||
|
||||
install() {
|
||||
# TODO Install android SDK
|
||||
case $(_os) in
|
||||
macos) brew cask install java gradle ;;
|
||||
arch) pacaur --needed --noedit --noconfirm -S jdk8-openjdk gradle ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# update() {}
|
||||
|
||||
# link() {}
|
||||
|
||||
# clean() {}
|
||||
|
||||
init "$@"
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue