Initial commit of nixos config

This commit is contained in:
Henrik Lissner 2019-08-06 13:56:54 -04:00
parent f067c9cd37
commit ed36644143
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
593 changed files with 1571 additions and 8312 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 584 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 805 KiB

View file

@ -1,5 +0,0 @@
! Exchange Alt and Win
clear Mod1
clear Mod4
add Mod4 = Alt_L Alt_R
add Mod1 = Super_L Super_R

View file

@ -1,111 +0,0 @@
!! 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=11
urxvt-scratch.font: xft:Fira Mono:pixelsize=16
urxvt-fuzzy.font: xft:Fira Mono:pixelsize=20

View file

@ -1,63 +0,0 @@
#!/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
elif ! _is_callable yay; then
>&2 echo "Could not find pacaur"
return 3
fi
yay --needed --noconfirm -S \
xorg-server xorg-xrandr 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 youtube-dl \
ttf-fira-{mono,sans} ttf-font-awesome tamsyn-font siji-git \
arc-gtk-theme qt5-styleplugins \
evince
xdg-mime default evince.desktop application/pdf
# install crontab
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() {}
link() {
mklink xprofile ~/.xprofile
mklink config/* $XDG_CONFIG_HOME/
mklink fonts/* $XDG_DATA_HOME/fonts/
mklink -s etc/pacman/*.hook /etc/pacman.d/hooks/
}
clean() {
rm -fv $XDG_DATA_HOME/fonts/*(@N)
sudo rm -fv /etc/pacman.d/hooks/*(@N)
}
init "$@"

View file

@ -1,3 +0,0 @@
#!/bin/bash
# A shim to make firefox believe HOME is elsewhere
HOME="$XDG_DATA_HOME/mozilla" exec /usr/bin/firefox "$@"

View file

@ -1,2 +0,0 @@
#!/usr/bin/env bash
firefox --private-window "$@"

View file

@ -1,2 +0,0 @@
#!/usr/bin/env bash
DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus /usr/bin/notify-send "$@"

View file

@ -1,12 +0,0 @@
#!/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

View file

@ -1,5 +0,0 @@
#!/usr/bin/env zsh
# 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"
ding

View file

@ -1,22 +0,0 @@
#!/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 [[ -n $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/

View file

@ -1,4 +0,0 @@
#!/usr/bin/env bash
xdotool search --onlyvisible --classname urxvt-fuzzy windowkill
xdotool search --classname urxvt-fuzzy windowmap \
|| urxvt -name urxvt-fuzzy -geometry 80x18 -e $SHELL -c sk-apps

View file

@ -1,29 +0,0 @@
#!/usr/bin/env zsh
#
# Opens sk-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 [[ -n $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 "sk-pass $@ $url"
[[ -n $win ]] && xdotool windowactivate $win

View file

@ -1,18 +0,0 @@
#!/usr/bin/env bash
SCRID=urxvt-scratch
focused=$(xdotool getactivewindow)
scratch=$(xdotool search --onlyvisible --classname $SCRID)
if [[ -n $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

View file

@ -1,25 +0,0 @@
#!/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\]')
[[ -n $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

View file

@ -1,8 +0,0 @@
#!/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

View file

@ -1,82 +0,0 @@
#!/usr/bin/env zsh
#
# Displays
#
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
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
bspc config borderless_monocle true
bspc config paddingless_monocle true
bspc config pointer_modifier mod4
bspc config pointer_action1 move
bspc config pointer_action2 resize_side
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 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
#
# Rules
#
bspc rule -r '*'
# Floating fixes
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
bspc rule -a love state=floating center=on sticky=on
bspc rule -a SimpleScreenRecorder state=floating center=on sticky=on
bspc rule -a Pinentry state=floating center=on
# Special apps
bspc rule -a URxvt:urxvt-scratch state=floating sticky=on center=on monitor=C
bspc rule -a URxvt:urxvt-fuzzy state=floating sticky=on center=on monitor=C
bspc rule -a Emacs split_ratio=0.25 border=off state=fullscreen
bspc rule -a Gimp desktop=^6
bspc rule -a feh state=fullscreen
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off
bspc rule -a Chromium monitor=L
bspc rule -a Firefox monitor=L

View file

@ -1,122 +0,0 @@
backend = "glx";
# backend = "xrender";
glx-no-stencil = true;
glx-copy-from-front = false;
glx-no-rebind-pixmap = true;
# glx-swap-method = "undefined";
# Set VSync method. VSync methods currently available:
# + none: No VSync
# + drm: VSync with DRM_IOCTL_WAIT_VBLANK. May only work on some drivers.
# + opengl: Try to VSync with SGI_video_sync OpenGL extension. Only work on some
# drivers.
# + opengl-oml: Try to VSync with OML_sync_control OpenGL extension. Only work on some
# drivers.
# + opengl-swc: Try to VSync with SGI_swap_control OpenGL extension. Only work on some
# drivers. Works only with GLX backend. Known to be most effective on many drivers.
# Does not actually control paint timing, only buffer swap is affected, so it doesnt
# have the effect of --sw-opti unlike other methods. Experimental.
# + 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 = "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
# essentially does --sw-opti's job already, unless you wish to specify a lower refresh
# rate than the actual value.
sw-opti = false;
# Painting on X Composite overlay window. Recommended.
paint-on-overlay = true;
# Enable DBE painting mode, intended to use with VSync to (hopefully) eliminate tearing.
# Reported to have no effect, though.
dbe = false;
# Unredirect all windows if a full-screen opaque window is detected, to maximize
# performance for full-screen windows, like games. Known to cause flickering when
# redirecting/unredirecting windows. paint-on-overlay may make the flickering less
# obvious.
unredir-if-possible = true;
# Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused
# at the same time.
detect-transient = false;
# Use WM_CLIENT_LEADER to group windows, and consider windows in the same group focused
# at the same time. WM_TRANSIENT_FOR has higher priority if --detect-transient is
# enabled, too.
detect-client-leader = false;
########################################
#
# Shadows
#
########################################
shadow = true;
no-dock-shadow = true;
no-dnd-shadow = true;
clear-shadow = true;
shadow-radius = 4;
shadow-offset-x = -3;
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"
];
shadow-ignore-shaped = true;
########################################
#
# Opacity
#
########################################
menu-opacity = 1;
active-opacity = 1;
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'"
];
alpha-step = 0.06
# Fading
fading = false;
fade-delta = 5;
fade-in-step = 0.04;
fade-out-step = 0.08;
# no-fading-openclose = true;
# Other
detect-rounded-corners = true;
#mark-wmwin-focused = true;
#mark-ovredir-focused = true;
refresh-rate = 0;
focus-exclude = [
"class_g = 'love'",
"class_g = 'mpv'"
];
# Window type settings
wintypes:
{
tooltip = { fade = true; shadow = false; opacity = 0.85; focus = true; };
};

View file

@ -1,58 +0,0 @@
[global]
alignment = left
markup = full
bounce_freq = 0
browser = /usr/bin/firefox -new-tab
dmenu = /usr/bin/rofi -dmenu -p dunst:
follow = none
font = UW Ttyp0 10
# font = Misc Tamsyn 12
format = "%s\n%b"
# geometry [{width}]x{height}][+/-{x}+/-{y}]
geometry = "365x15-21+21"
history_length = 20
horizontal_padding = 16
idle_threshold = 120
ignore_newline = no
indicate_hidden = yes
line_height = 0
monitor = 0
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 = 1
word_wrap = yes
max_icon_size = 64
# Align icons left/right/off
icon_position = right
# Paths to default icons.
icon_path = /usr/share/icons/hicolor/32x32/apps/:/usr/share/icons/Adwaita/32x32/actions/
frame_width = 0
frame_color = "#131416"
[shortcuts]
context = ctrl+shift+period
[urgency_low]
# IMPORTANT: colors have to be defined in quotation marks.
# Otherwise the "#" and following would be interpreted as a comment.
background = "#0a0b0c"
foreground = "#b5bd68"
timeout = 8
[urgency_normal]
background = "#b5bd68"
foreground = "#131416"
timeout = 14
[urgency_critical]
background = "#cc6666"
foreground = "#131416"
timeout = 0

View file

@ -1,8 +0,0 @@
<match target="pattern">
<test name="family" qual="any">
<string>monospace</string>
</test>
<edit binding="strong" mode="prepend" name="family">
<string>Fira Mono</string>
</edit>
</match>

View file

@ -1,11 +0,0 @@
[Filechooser Settings]
LocationMode=path-bar
ShowHidden=false
ShowSizeColumn=true
GeometryX=1975
GeometryY=450
GeometryWidth=1010
GeometryHeight=664
SortColumn=name
SortOrder=ascending
StartupMode=recent

View file

@ -1,2 +0,0 @@
# include "/usr/share/themes/Adwaita-Slim-Dark/gtk-2.0/gtkrc"
include "/usr/share/themes/Arc-Dark/gtk-2.0/gtkrc"

View file

@ -1,2 +0,0 @@
file:///home/hlissner
file:///home/hlissner/work

View file

@ -1,4 +0,0 @@
[Settings]
gtk-application-prefer-dark-theme = true
gtk-theme-name = Arc-Dark
gtk-icon-theme-name = Arc-Dark

View file

@ -1,11 +0,0 @@
#!/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..."

View file

@ -1,35 +0,0 @@
[redshift]
temp-day=6500
temp-night=3600
; Enable/Disable a smooth transition between day and night
transition=1
;brightness=0.9
;brightness-day=1.0
;brightness-night=0.85
; screen gamma for all colors...
gamma=1.0
; or each color channel individually
;gamma=0.8:0.7:0.8
;gamma-day=0.8:0.7:0.8
;gamma-night=0.6
; redshift -l list
location-provider=manual
; redshift -m list
adjustment-method=randr
; redshift -l PROVIDER:help
[manual]
;; Horsholm, DK
;lat=55.883514
;lon=12.504924
;; Toronto, ON
lat=43.7001100
lon=-79.4163000
[randr]
;screen=0

View file

@ -1,147 +0,0 @@
#
# wm independent hotkeys
#
# terminal emulator
mod4 + ctrl + Return
urxvt
mod4 + ctrl + shift + Return
urxvt -name urxvt-stream
mod4 + grave
urxvt-scratch-window
mod4 + ctrl + grave
emacsclient -e nil && bspc rule -a 'Emacs' -o state=floating && emacs-anywhere
mod4 + ctrl + shift + grave
bspc rule -a 'Emacs' -o state=floating && org-capture
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
ssclip
mod4 + Print
maim ~/screenshots/$(date +%F-%T).png && notify-send "Fullscreen screenshot saved"
mod4 + shift + Print
rec -s ~/screenshots/$(date +%F-%T).mp4
Pause
mpc -q toggle # play/pause music
mod4 + {Pause,XF86Eject}
zzz # sleep display
mod4 + shift + Pause
zzz -f # sleep computer
Scroll_Lock
vol toggle
# 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,comma,period}
bspc node -f @{parent,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

View file

@ -1,17 +0,0 @@
# field allowed values
# ----- --------------
# minute 0-59
# hour 0-23
# day of month 1-31
# month 1-12 (or names, see below)
# day of week 0-7 (0 or 7 is Sun, or use names)
#------------------------------------------------------------
# m hr d m w cmd
# 0 * * * * ...
# Polybar
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)"

View file

@ -1,16 +0,0 @@
export BROWSER=firefox
export GNUPGHOME="$XDG_CONFIG_HOME/gpg"
export GTK2_RC_FILES="${0:A:h}/config/gtk-2.0/gtkrc"
export URXVT_PERL_LIB="$XDG_CONFIG_HOME/urxvt"
export QT_QPA_PLATFORMTHEME=gtk2
_source "$XDG_RUNTIME_DIR/ssh-agent-env" >/dev/null
if [[ -z $SSH_AGENT_PID ]] || ! ps $SSH_AGENT_PID >/dev/null; then
ssh-agent -s >"$XDG_RUNTIME_DIR/ssh-agent-env"
_source "$XDG_RUNTIME_DIR/ssh-agent-env" >/dev/null
fi
_is_running gpg-agent || {
gpg-agent --pinentry-program /usr/bin/pinentry-gtk-2 --daemon >"$XDG_RUNTIME_DIR/gpg-agent-env"
}
_source "$XDG_RUNTIME_DIR/gpg-agent-env" >/dev/null

View file

@ -1,11 +0,0 @@
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = Package
Target = nvidia
[Action]
Depends = mkinitcpio
When = PostTransaction
Exec = /usr/bin/mkinitcpio -p linux

View file

@ -1,10 +0,0 @@
[Trigger]
Operation = Upgrade
Type = Package
Target = *
[Action]
Description = "Updating polybar"
When = PostTransaction
Exec = /usr/bin/polybar-msg hook pkg 1

View file

@ -1,3 +0,0 @@
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

View file

@ -1,16 +0,0 @@
#!/usr/bin/env bash
if command -v aseprite >/dev/null; then
echo "Aseprite is already installed"
exit 1
fi
set -e
yay --needed --noconfirm -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

View file

@ -1,10 +0,0 @@
#!/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

View file

@ -1,8 +0,0 @@
#!/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

View file

@ -1,43 +0,0 @@
#!/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-desktop
[[ -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
$DOTS/bin/ding startup
# 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

View file

@ -1,43 +0,0 @@
#!/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 yay (AUR helper)
if ! _is_callable yay; then
git clone https://aur.archlinux.org/yay.git /tmp/yay
pushd /tmp/yay
makepkg -si
popd
rm -rf /tmp/yay
if ! _is_callable yay; then
>&2 echo "Yay was not successfully installed"
return 3
fi
fi
yay --needed --noconfirm -S ripgrep the_silver_searcher bc cronie
sudo systemctl enable cronie
}
update() {
_is_callable yay && local pac=yay
${pac:-sudo pacman} -Syu --noconfirm
}
# link() {}
# clean() {}
init "$@"

View file

@ -1,22 +0,0 @@
alias ls="${aliases[ls]:-ls} --color=auto --group-directories-first"
alias kb=keybase
alias sc=systemctl
alias jc=journalctl
alias ssc='sudo systemctl'
alias ufw='sudo ufw'
alias yayc='yay -Sc' # clean pacman
alias yayo='yay -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

View file

@ -1,2 +0,0 @@
export GNUPGHOME="$XDG_CONFIG_HOME/gpg"
export TERMINFO="$XDG_CONFIG_HOME/terminfo"

View file

@ -1,70 +0,0 @@
#!/usr/bin/env bash
# This script bootstraps arch linux with the utmost essentials. It expects an internet
# connection, and the harddrives to be set up (and one of the mounted to /mnt).
MOUNT=/mnt
exists() { command -v "$1" >/dev/null; }
arch() { arch-chroot "$MOUNT" /bin/bash -c "$1"; }
pac() { pacstrap "$MOUNT" $@; }
if ! exists arch-chroot; then
>&2 echo "Meant to be run from the Arch Linux installer"
exit 1
elif ! grep "$MOUNT " /proc/mounts >/dev/null; then
>&2 echo "$MOUNT isn't mounted"
exit 2
elif ! ping -c1 http://google.com >/dev/null; then
>&2 echo "No internet connection detected!"
exit 3
fi
#
set -e
## Collect info
# hostname
read -rp "Hostname:\t" host
#
echo "$host" > "$MOUNT/etc/hostname"
# ensure keys are up to date
pacman-key --refresh-keys
pacman -Syy
# bootstrap
pac base base-devel intel-ucode
# device mounting drivers
pac dosfstools ntfs-3g exfat-utils hfsprogs
# networking support
WIRELESS_DEV=$(ip link | grep wlp | awk '{print $2}'| sed 's/://' | sed '1!d')
if [[ -n $WIRELESS_DEV ]]; then
echo "==> ${WIRELESS_DEV} interface detected"
pac iw wireless_tools wpa_actiond wpa_supplicant dialog netctl
fi
WIRED_DEV=$(ip link | grep "en[sop]" | awk '{print $2}'| sed 's/://' | sed '1!d')
if [[ -n $WIRED_DEV ]]; then
echo "==> ${WIRED_DEV} interface detected"
arch "systemctl enable dhcpcd@${WIRED_DEV}.service"
fi
# Speed up connections on boot
if ! grep "^noarp$" $MOUNT/etc/dhcpcd.conf; then
echo -e "\nnoarp" >> $MOUNT/etc/dhcpcd.conf
fi
# locale
sed -i '/^#en_US\.UTF-8/s/^#//' $MOUNT/etc/locale.gen
arch "locale-gen"
# datetime
pac ntp
arch "systemctl enable ntpd.service"
arch "ln -sfv /usr/share/zoneinfo/America/Toronto /etc/localtime"
# finalization
genfstab -U "$MOUNT" >> "$MOUNT/etc/fstab"
arch "bootctl --path=/boot install"
arch "mkinitcpio -p linux"

View file

@ -1,35 +0,0 @@
#!/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 gnupg2 \
the_silver_searcher ripgrep ffmpeg keybase \
neofetch youtube-dl pinentry-mac
# 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 "$@"

View file

@ -1,14 +0,0 @@
alias ls="gls --color=auto --group-directories-first"
alias date=gdate
alias y=pbcopy
alias p=pbpaste
alias br=brew
alias bru='brew update && brew upgrade && brew cleanup'
alias brc='brew cask'
# OS X has no `md5sum`, so use `md5` as a fallback
_is_callable md5sum || alias md5sum="md5"
# OS X has no `sha1sum`, so use `shasum` as a fallback
_is_callable sha1sum || alias sha1sum="shasum"

View file

@ -1,18 +0,0 @@
#!/usr/bin/env bash
# Start taking screenshots every N seconds, until this script is
# called again.
if [ ! -f ~/.ss ]; then
dir="$1"
if [ $# -eq 0 ]; then
[ ! -d ~/Desktop/ss ] && mkdir -p ~/Desktop/ss
dir=~/Desktop/ss
fi
echo "$dir" > ~/.ss
echo "Timelapse, go!"
i=1;while [ -f ~/.ss ];do screencapture -t jpg -x "$dir/$i.jpg"; let i++;sleep 5; done &
else
echo "Deactivating timelapse! Images in: $(cat ~/.ss)/"
rm ~/.ss
fi

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
ffmpeg -r 24 -i %d.jpg -b 16000k $1

View file

@ -1,18 +0,0 @@
export GNUPGHOME="$XDG_CONFIG_HOME/gpg"
export BROWSER='open'
# export CC=/usr/bin/clang
# export CXX=/usr/bin/clang++
# export CXXFLAGS="-I/usr/local/include"
export C_INCLUDE_PATH="/usr/local/include"
export CPLUS_INCLUDE_PATH="/usr/local/include"
export LIBRARY_PATH="/usr/local/lib"
# export LDFLAGS="-L/usr/local/lib"
export LESS='-g -i -M -R -S -w -z-4'
if _is_callable lesspipe; then
export LESSOPEN='| /usr/bin/env lesspipe %s 2>&-'
fi
#
path=( /usr/local/{s,}bin $path )

9
bin/autoclicker Executable file
View file

@ -0,0 +1,9 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p xdotool
while true; do
xdotool mousedown 1
sleep 0.01
xdotool mouseup 1
sleep 0.01
done

View file

@ -1,29 +0,0 @@
#!/usr/bin/env bash
# An OS-agnostic wrapper around the system clipboard (well, for MacOS and
# Linux).
if [[ -t 0 ]]; then
if command -v xclip >/dev/null; then
xclip -display :0 -selection clipboard -out
elif command -v xsel >/dev/null; then
xsel --clipboard --output
elif command -v pbpaste >/dev/null; then
pbpaste
else
>&2 echo "No clipboard detected. Aborting."
exit 1
fi
else
if command -v xclip >/dev/null; then
xclip -display :0 -selection clipboard -in
elif command -v xsel >/dev/null; then
xsel --clipboard --input
elif command -v pbcopy >/dev/null; then
pbcopy
else
>&2 echo "No clipboard detected. Aborting."
exit 1
fi
fi

View file

@ -1,23 +0,0 @@
#!/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

View file

@ -1,6 +0,0 @@
#!/usr/bin/env zsh
DEFAULT="$DOTFILES_ASSETS/sounds/${1:-ding}.ogg"
case $OSTYPE in
darwin*) afplay $DEFAULT ;;
linux*) paplay $DEFAULT ;;
esac &

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
# NOTE make sure your .curlrc doesn't set a real useragent
curl http://wttr.in/${1:-toronto}

View file

@ -1,40 +0,0 @@
#!/usr/bin/env bash
# Encrypt/decrypt and compress folders with gpg+tar.
# Usage:
# clump foldername # packs
# clump foldername.clump # unpacks
set -e
if (($# == 0)); then
>&2 echo "Usage: $0 <FILE|DIRECTORY> [DEST]"
exit 1
fi
ext='clump'
target="$1"
cmd=
if [[ -f $target ]]; then
cmd=unpack
elif [[ -d $target ]]; then
cmd=pack
else
>&2 echo "Not a valid target: '$target'"
exit 1
fi
case $cmd in
p|pack)
if [[ -f $target.$ext ]]; then
>&2 echo "Destination file already exists"
exit 2
fi
tar -pcvf - "$target" | gpg -c > "$target.$ext"
echo "Packed into $target.$ext"
;;
u|unpack)
tmpfile=$(mktemp)
gpg -d "$target" > "$tmpfile" && tar -pxvf "$tmpfile"
rm -f "$tmpfile"
;;
esac

View file

@ -1,36 +0,0 @@
#!/usr/bin/env python3
"""
Encode/decode HTML entities in stdin or given file(s).
"""
import argparse
import fileinput
import html
from html.entities import entitydefs
ENTITIES = {value: key for key, value in entitydefs.items()}
def encode(text):
t = ""
for c in text:
if c in ENTITIES:
t += "&" + ENTITIES[c] + ";"
else:
t += c
return t
def decode(text):
return html.unescape(text)
if __name__ == '__main__':
opts = argparse.ArgumentParser(description="Encodes (or decodes) HTML entities in text.")
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()
text = [line for line in fileinput.input(args.file)]
action = decode if args.decode else encode
print(action("\n".join(text).strip()))

View file

@ -1,50 +0,0 @@
#!/usr/bin/env zsh
# Sends file(s) or stdin to a ix.io
set -e
_usage() {
more <<EOL
Usage: ${0:A:t} [FILE...]
Uploads text files/stdin to ix.io.
Options:
-l LANG Specify file extension for syntax highlight
-h This information
Examples:
${0##*/} script.py
${0##*/} -l py sometext
echo "Hello world" | ${0:A:t}
echo "puts 'Hi'" | ${0:A:t} -l rb
EOL
}
#
while getopts hl: opt; do
case $opt in
l) lang="?$OPTARG"
;;
[h?]) _usage; exit; ;;
:) >&2 echo "$OPTARG requires an argument"
_usage
exit 1
;;
esac
done
shift $((OPTIND-1))
if (($# == 0)) && [[ -t 0 ]]; then
>&2 echo "Nothing in stdin and no files specified!"
>&2 _usage
exit 1
fi
url=$(cat "$@" | curl -s -F 'f:1=<-' ix.io)
# Naive lang detection from file extension
[[ $1 == *.* && -z $lang ]] && lang="${1##*.}"
# Show url
url=$(printf "%s/%s" "$url" "$lang")
echo $url | clip
echo $url

View file

@ -1,18 +0,0 @@
#!/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|\
*.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" ;;
*)
if ! grep "#\!/.+[/ ](ba|z)?sh" "$1" >/dev/null; then
exit 1
fi
pygmentize -f 256 -l sh "$1"
esac

View file

@ -1,51 +0,0 @@
#!/usr/bin/env bash
# Lists the contents of archives.
#
# Adapted from a script by Sorin Ionescu <sorin.ionescu@gmail.com>
if (($# == 0)); then
cat >&2 <<EOF
usage: $0 [-option] [file ...]
options:
-v, --verbose verbose archive listing
Report bugs to <sorin.ionescu@gmail.com>.
EOF
fi
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
shift
done

View file

@ -1,4 +1,5 @@
#!/usr/bin/env bash
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p ffmpeg gifsicle
# Uses ffmpeg to convert a video file to a gif file. Optimizes the final result
# with gifsicle.
@ -69,6 +70,4 @@ flags="fps=${fps}$scale"
ffmpeg -v warning $start $duration -i "$src" -vf "$flags,palettegen=stats_mode=full" -y "$PALETTE"
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"
fi
gifsicle -O3 "$dest" -o "$dest"

View file

@ -1,12 +0,0 @@
#!/usr/bin/env bash
case $OSTYPE in
darwin*) /usr/bin/open "$@" ;;
linux*) xdg-open "$@" ;;
esac
# OPTIONAL: requires shell/tmux
if command -v 'tmux-session-name' >/dev/null; then
# If this was used from a scratch tmux terminal, close it
[[ "$(tmux-session-name)" == scratch ]] && tmux kill-session -t scratch
fi

View file

@ -1,36 +0,0 @@
#!/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

View file

@ -1,27 +0,0 @@
#!/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
case $field in
password) printf "%s" "$(head -n1 <<<"$secrets")" ;;
otp) printf "%s" "$(pass otp "$entry")" ;;
*) printf "%s" "$(awk -v "key=$field:" '$1 == key {print $2}' <<<"$secrets")" ;;
esac | xsel -i -b -t 15000
#
echo "Copied $entry:$field to clipboard for 15s"

View file

@ -1,11 +0,0 @@
#!/usr/bin/env bash
# Interactively generates an OTP-auth url (written for pass-otp)
#
# Example: passotpuri LABEL SECRET [QUERYSTRING]
read -p "Enter the label or issuer:" label
read -p "Enter its OTP secret:" secret
read -p "Enter type (leave blank for totp):" type
echo "otpauth://${type:-totp}/$label?secret=$secret&issuer=${issuer:-$label}"

View file

@ -1,4 +0,0 @@
#!/usr/bin/env bash
# A minimalistic pomodoro timer.
# e.g. pomo 25 "Hello!"
sleep $((${1:-25} * 60)) && notify-send "($(date +%H:%M)) ${2:-Break time!}" && ding &

View file

@ -1,57 +0,0 @@
#!/usr/bin/env bash
#
# 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
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
done
shift $((OPTIND-1))
#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

View file

@ -1,16 +0,0 @@
#!/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"

View file

@ -1,46 +0,0 @@
#!/usr/bin/env bash
# A simple script for sending data to another computer's clipboard via SSH. Acts
# as a universal clipboard. This script must be available on the remote. Pipe
# through gpg if you want the contents encrypted.
#
# It helps if your ssh connection is pubkey authenticated and password-less.
#
# Requires: pb (script, in same folder)
#
# Workflow:
# host $ echo "Hello world!" | rclip guest
# guest $ rclip
# Hello world!
# OR
# host $ echo "Hello world!" | gpg -e | rclip.sh guest
# guest $ rclip | gpg -d
# Hello world!
bin="${0##*/}"
flags=
while getopts p:i:l: opt; do
case $opt in
p) flags+=" -p $OPTARG" ;;
i) flags+=" -i $OPTARG" ;;
l) flags+=" -l $OPTARG" ;;
*) >&2 echo "Invalid option $OPTARG"
exit 1
;;
esac
done
shift $((OPTIND-1))
target="$1"
if [[ -n $target ]]; then
if [[ -t 0 ]]; then
pb | $bin $target
else
ssh $flags -qt "$target" "pb" && echo "Sent to $target"
fi
else
pb
fi
# vim:set ft=sh:

View file

@ -1,10 +0,0 @@
#!/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

17
bin/scrcap Executable file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p maim slop xclip libnotify
# A script that takes a screenshot (prompts you for what region/window to
# capture) and stores it in the clipboard.
tmp=$(mktemp)
# Delay for long enough that we can refocus the targeted window
if maim --delay=${1:-0.6} -us >"$tmp"; then
xclip -selection clipboard -t image/png "$tmp" &&
notify-send "Screenshot saved"
else
notify-send -u low "Aborted screenshot"
fi
rm -f "$tmp"

View file

@ -1,4 +1,5 @@
#!/usr/bin/env bash
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p ffmpeg slop
# Select a region and record it.
#
@ -17,7 +18,7 @@ fi
if [[ -f /tmp/_stop ]]; then
echo q > /tmp/_stop
if [[ $is_script ]]; then
ding error &
>&2 echo "Nope"
else
echo "Stopped previous recording"
fi
@ -32,7 +33,7 @@ if [[ $dest == *.gif ]]; then
fi
if [[ $is_script ]]; then
ding &
echo "Starting"
touch /tmp/_stop
ffmpeg -y -f x11grab -s "$W"x"$H" -i :0.0+$X,$Y -framerate 30 "${mp4dest:-$dest}" </tmp/_stop
rm -f /tmp/_stop

View file

@ -1,27 +0,0 @@
#!/usr/bin/env bash
set -e
unset CDPATH
# Find and replace by a given list of files.
#
# replace foo bar **/*.rb
main() {
local search="$1"
local replace="$2"
shift 2
for item in $(ag -l --nocolor "$search" "$@"); do
sed -ir "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

View file

@ -1,143 +0,0 @@
#!/usr/bin/env python3
"""
A shell script that converts one currency to another.
Usage: shekel [-rh] AMOUNT FROM TO [TO ...]
FROM and TO are currency codes.
Examples:
shekel 200 USD CAD
"""
import argparse
import sys
import json
from urllib import request
from datetime import datetime
from pathlib import Path
API_KEY = "92a7ccb3b6038a7151fc15e99f2de83d" # please use your own!
API_URL = "http://apilayer.net/api/live?access_key={}&currencies={},{}"
DEFAULT_CODES = ('CAD', 'USD')
CACHE_FILE = "/tmp/shekel-hist"
CACHE_TTL = 3600
class CurrencyCache():
def __init__(self, path=CACHE_FILE, ttl=CACHE_TTL):
self.path = Path(path)
self.ttl = ttl
cache = {}
if self.path.exists():
cache = json.loads(self.path.read_text())
self.cache = cache
def __enter__(self):
return self
def __exit__(self, *args):
self.path.write_text(json.dumps(self.cache))
def clear(self):
db = self.cache['_DB']
self.cache.clear()
self.cache['_DB'] = db
def store(self, from_code, to_code, rate):
self._set("-".join([from_code, to_code]), rate)
self._set("-".join([to_code, from_code]), 1 / rate)
def get(self, from_code, to_code):
key = "-".join([from_code, to_code])
if key in self.cache:
return self.cache[key]['value']
return None
def _set(self, key, value):
self.cache[key] = {'time': datetime.now().timestamp(), 'value': value}
def _request_currency_rate(url=API_URL, *args):
"""Fetch currency rates from remote API."""
real_url = url.format(*map(request.quote, map(str, args)))
data = json.loads(request.urlopen(real_url).read().decode('utf-8'))
if not data['success']:
raise Exception(data['error']['info'])
return data["quotes"]
def format_currency(curr):
"""Format a currency entry for the FZF prompt."""
return "{} {}".format(curr['id'], curr['currencyName'])
def currency_rate(from_code, to_code):
"""
Retrieves the exchange rate between two currencies.
:param from_code: an ISO 4217 currency code of the source currency
:param to_code: an ISO 4217 currency code of the destination currency
:returns: an exchange rate (a float)
"""
if from_code == to_code:
return 1.0
elif not from_code or not to_code:
return None
rates = _request_currency_rate(API_URL, API_KEY, from_code, to_code)
try:
return (1 / rates["USD" + from_code]) * rates["USD" + to_code]
except KeyError as e:
print("Could not find currency named {}".format(from_code))
return None
def each_currency_rate(from_code, to_codes, refresh=False):
"""
Returns a cached generator for each exchange rate.
:param from_code: the ISO 4217 currency code of the source currency
:param to_codes: a list of ISO 4217 currency codes to convert to
:yields: a tuple containg (TO_CODE, EXCHANGE_RATE)
"""
with CurrencyCache(path=CACHE_FILE, ttl=CACHE_TTL) as cache:
if refresh:
cache.clear()
for code in to_codes:
rate = cache.get(from_code, code)
if not rate:
rate = currency_rate(from_code, code)
if rate:
cache.store(from_code, code, rate)
if not rate:
yield (None, None)
else:
yield (code, rate)
def main():
opts = argparse.ArgumentParser(
description="Convert one amount of currency into another, or multiple.")
opts.add_argument('amount', type=float, help="The amount to convert")
opts.add_argument('src', metavar='from', type=str,
help="Currency to convert from")
opts.add_argument('dest', metavar='to', type=str, nargs='+',
help="Currency(ies) to convert to")
opts.add_argument('-r', '--refresh', action='store_true',
help="Refresh the cache")
args = opts.parse_args()
try:
for code, rate in each_currency_rate(args.src, args.dest, refresh=args.refresh):
if code:
print("{:.4f} {}".format(rate * args.amount, code))
except KeyboardInterrupt:
print("Aborted!")
sys.exit(1)
if __name__ == '__main__':
main()

View file

@ -1,12 +0,0 @@
#!/usr/bin/env bash
# A script that takes a screenshot and stores it in the clipboard
tmp=$(mktemp)
if maim -us >"$tmp"; then
xclip -selection clipboard -t image/png "$tmp" && \
ding && \
notify-send "Screenshot saved"
else
notify-send -u low "Screenshot aborted"
ding error
fi
rm -f "$tmp"

34
bin/sup
View file

@ -1,34 +0,0 @@
#!/usr/bin/env zsh
# Performs an online search. Uses the last used provider, otherwise prompts for
# one with skim.
provider="$1"; shift
query="$*"
typeset -A providers
providers+=('DuckDuckGo' 'https://duckduckgo.com/?q=%s')
providers+=('DevDocs.io' 'http://devdocs.io/#q=%s')
providers+=('Google search' 'https://google.com/search?q=%s')
providers+=('Google images' 'https://google.com/images?q=%s')
providers+=('Google maps' 'https://maps.google.com/maps?q=%s')
providers+=('Project Gutenberg' 'http://www.gutenberg.org/ebooks/search/?query=%s')
providers+=('StackOverflow' 'https://stackoverflow.com/search?q=%s')
providers+=('Github' 'https://github.com/search?ref=simplesearch&q=%s')
providers+=('Youtube' 'https://youtube.com/results?aq=f&oq=&search_query=%s')
providers+=('Wolfram alpha' 'https://wolframalpha.com/input/?i=%s')
providers+=('Wikipedia' 'https://wikipedia.org/search-redirect.php?language=en&go=Go&search=%s')
pick=$(printf "%s\n" "${(@k)providers}" | sk --query="$provider" --prompt='provider > ' -1 -0)
if [[ -z $pick ]]; then
>&2 echo 'No provider selected. Aborting.'
exit 1
elif [[ -z ${providers[$pick]} ]]; then
>&2 echo 'No provider matched that query. Aborting.'
exit 2
fi
url=$(printf "${providers[$pick]}\n" $(uri<<<"$query"))
echo "Opening $url"
open $url

View file

@ -1 +0,0 @@
since

View file

@ -1,120 +1,6 @@
#!/usr/bin/env python3
#!/usr/bin/env bash
"""
Retrieves the time (and time difference) at a location (can be an address,
postal code, country name, etc). Uses Google Maps APIs to map locations to
coordinates, and coordinates to timezones.
open=open
[[ $OSTYPE == linux* ]] && open=xdg-open
Requires: pytz, tzlocal
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
from pathlib import Path
from pytz import timezone
from tzlocal import get_localzone
URL_BASE = "https://maps.googleapis.com/maps/api/"
URL_TZ = URL_BASE + "timezone/json?location={},{}&timestamp={}"
URL_GEOCODE = URL_BASE + "geocode/json?address={}"
CACHE_FILE = "{}/timein".format(os.environ.get("XDG_CACHE_HOME") or "/tmp")
CACHE = {}
#
def _generate_url(url, *args):
return url.format(*map(request.quote, map(str, args)))
def _request(url, *args):
real_url = url.format(*map(request.quote, map(str, args)))
resp = request.urlopen(real_url).read()
result = json.loads(resp.decode('utf-8'))
if result['status'] == 'OK':
return result
elif result['status'] != 'UNKNOWN_ERROR':
raise Exception(result['error_message'])
def get_timezone(coords, timestamp):
return _request(URL_TZ, coords['lat'], coords['lng'], timestamp)['timeZoneId']
def get_coords(desc):
result = _request(URL_GEOCODE, desc)
if 'results' in result:
return {"lat": result['results'][0]['geometry']['location']['lat'],
"lng": result['results'][0]['geometry']['location']['lng'],
"name": result['results'][0]['formatted_address']}
def cache(key, fn, ttl):
if key in CACHE and CACHE[key]['time'] < CACHE[key]['time'] + ttl:
return CACHE[key]['value']
value = fn()
if value is not None:
CACHE[key] = {
'time': datetime.now().timestamp(),
'value': value
}
return value
def diff(a, b, absolute=False):
"""Returns a timedelta object"""
a = a.replace(tzinfo=None)
b = b.replace(tzinfo=None)
return (max(a, b) - min(a, b), b > a)
def encode(s):
return str(b64encode(s.encode('ascii')))
#
def each_location(locations):
"""
Enumerates over and maps a list of location strings to time difference data.
"""
here = get_localzone().localize(datetime.now())
for location in locations:
coords = cache("coords-" + encode(location),
lambda l=location: get_coords(l),
86400)
if coords:
tzname = cache("tz-" + encode(location),
lambda c=coords: get_timezone(c, here.timestamp()),
1800)
then = here.astimezone(timezone(tzname))
tdiff, direction = diff(here, then)
if tdiff.seconds == 0:
suffix = "(same timezone)"
elif direction:
suffix = "ahead"
else:
suffix = "behind"
yield {
"name": coords['name'],
"then": then.strftime("%b %d, %H:%M:%S %Z%z"),
"diff": int(tdiff.seconds / 60 / 60),
"suffix": suffix,
}
else:
yield None
if __name__ == '__main__':
assert sys.argv[1:], "Usage: {} [LOCATION]".format(sys.argv[0])
cachefp = Path(CACHE_FILE)
CACHE = json.loads(cachefp.read_text()) if cachefp.exists() else {}
for data in each_location(sys.argv[1:]):
if data:
print("{name:24} {then}\t{diff}h {suffix}".format(**data))
else:
print("Couldn't find {name} or something went wrong".format(**data), file=sys.stderr)
cachefp.write_text(json.dumps(CACHE))
$open https://time.is/$1 2>/dev/null &

View file

@ -1,22 +0,0 @@
#!/usr/bin/env bash
if (( $# == 0 )); then
>&2 echo "Forgot to specify a destination filename. Aborting."
exit 1
fi
# Upload file/stdin to transfer.sh
url="https://transfer.sh"
tmpfile=$(mktemp -t transferXXX)
cleanup() { rm -f "$tmpfile"; }
trap cleanup EXIT
if tty -s; then
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"
fi
cat "$tmpfile" | clip
cat "$tmpfile"

37
bin/uri
View file

@ -1,37 +0,0 @@
#!/usr/bin/env python
"""
Encode/decode url strings in stdin or the given file(s).
"""
import argparse
import fileinput
try:
from urllib.parse import quote_plus, quote, unquote_plus, unquote
except ImportError:
from urllib import quote_plus, quote, unquote_plus, unquote
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
if args.decode:
action = unquote
elif args.decode_plus:
action = unquote_plus
elif args.encode_plus:
action = quote_plus
text = [line for line in fileinput.input(args.file)]
print(action("\n".join(text).strip()))
if __name__ == '__main__':
main()

View file

@ -1,41 +0,0 @@
#!/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'."

29
config/bspwm/bspwmrc Executable file
View file

@ -0,0 +1,29 @@
#!/bin/sh
export MONITOR=$(xrandr -q | grep primary | cut -d' ' -f1)
export MONITORS=( $(xrandr -q | grep ' connected' | cut -d' ' -f1) )
MONITOR=${MONITOR:-${MONITORS[0]}}
# Only have workspaces for primary monitor
bspc monitor $MONITOR -d {1,2,3,4,5}
bspc config remove_disabled_monitors true
bspc config remove_unplugged_monitors true
# Rules
bspc rule -r '*'
bspc rule -a 'Emacs:org*' state=floating
bspc rule -a mpv state=floating center=on
bspc rule -a Pinentry state=floating center=on
bspc rule -a Emacs split_ratio=0.32 border=off state=fullscreen
bspc rule -a Firefox split_ratio=0.32
bspc rule -a feh state=fullscreen
bspc rule -a st-scratch state=floating sticky=on center=on
#
for file in $XDG_CONFIG_HOME/bspwm/rc.d/*; do
source "$file"
done

17
config/emacs/aliases.zsh Normal file
View file

@ -0,0 +1,17 @@
#!/usr/bin/env zsh
if [[ $OSTYPE == darwin* ]]; then
alias emacs='emacs -nw'
e() { # Emacs version of v
if pgrep Emacs 2>&1 >/dev/null; then
emacsclient -n $@
else
/Applications/Emacs.app/Contents/MacOS/Emacs $@ &
fi
}
else
alias e='emacsclient -n'
fi
ediff() { e --eval "(ediff-files \"$1\" \"$2\")"; }

3
config/emacs/env.zsh Normal file
View file

@ -0,0 +1,3 @@
#!/usr/bin/env zsh
export PATH="$HOME/.emacs.d/bin:$PATH"

File diff suppressed because one or more lines are too long

30
config/git/aliases.zsh Normal file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env zsh
g() { [[ $# = 0 ]] && git status --short . || git $*; }
compdef g=hub
alias git='noglob hub'
alias ga='git add'
alias gap='git add --patch'
alias gb='git branch'
alias gbr='git browse'
alias gbl='git blame'
alias gc='git commit'
alias gcm='git commit -m'
alias gca='git commit --amend'
alias gcf='git commit --fixup'
alias gcl='git clone'
alias gco='git checkout'
alias gcoo='git checkout --'
alias gf='git fetch'
alias gi='git init'
alias gl='git log --graph --pretty="format:%C(yellow)%h%Creset %C(red)%G?%Creset%C(green)%d%Creset %s %Cblue(%cr) %C(bold blue)<%aN>%Creset"'
alias gll='git log --pretty="format:%C(yellow)%h%Creset %C(red)%G?%Creset%C(green)%d%Creset %s %Cblue(%cr) %C(bold blue)<%aN>%Creset"'
alias gL='gl --stat'
alias gp='git push'
alias gpl='git pull --rebase --autostash'
alias gs='git status --short .'
alias gss='git status'
alias gst='git stash'
alias gr='git reset HEAD'
alias grv='git rev-parse'

View file

@ -1,22 +1,17 @@
[user]
name = Henrik Lissner
email = henrik@lissner.net
signingkey = 5F6C0EA160557395
[commit]
gpgsign = true
[core]
pager = diff-so-fancy | less --tabs=4 -RFX
whitespace = trailing-space
[color]
ui = auto
[github]
user = hlissner
[rebase]
autosquash = true
[push]
default = current
[merge]
ff = onlt
log = true
[alias]
amend = commit --amend
exec = "!exec "
@ -30,7 +25,7 @@
emails = !git log --format="%aE" | sort -u
email-domains = !git log --format="%aE" | awk -F'@' '{print $2}' | sort -u
[filter "lfs"]
required = true
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
clean = git-lfs clean -- %f

Some files were not shown because too many files have changed in this diff Show more