Compare commits

..
3 Commits
Author SHA1 Message Date
hektor f394df154a chore: drop placeholder directories
check / lint (push) Successful in 13s
2026-09-28 20:43:36 +02:00
hektor 50cece0533 chore(dots): drop redundant '.env.example' 2026-09-28 20:43:36 +02:00
hektor 093a60a261 refactor(shell): nixify remaining shell config
check / lint (push) Successful in 14s
2026-09-28 20:43:36 +02:00
302 changed files with 7875 additions and 3661 deletions

No files matched your search

-2
View File
@@ -19,8 +19,6 @@ home-manager switch --flake .#work
### virtual machines ### virtual machines
With a Niri desktop (requires host OpenGL support):
``` ```
nix build -L '.#nixosConfigurations.vm.config.system.build.vmWithDisko' nix build -L '.#nixosConfigurations.vm.config.system.build.vmWithDisko'
./result/bin/disko-vm ./result/bin/disko-vm
+7 -5
View File
@@ -5,20 +5,20 @@
let let
inherit (inputs.nixpkgs) lib; inherit (inputs.nixpkgs) lib;
lib' = import ../lib { inherit lib; }; utils = import ../utils { inherit lib; };
# exclude hosts that need auto rollback (until `colmena` supports it) for # exclude hosts that need auto rollback (until `colmena` supports it) for
# now, we use `deploy-rs` (which has magic rollback) for those (also see ./deploy-rs.nix) # now, we use `deploy-rs` (which has magic rollback) for those (also see ./deploy-rs.nix)
# #
# see <https://github.com/nix-community/colmena/issues/38> # see <https://github.com/nix-community/colmena/issues/38>
# <https://github.com/nix-community/colmena/issues/344> # <https://github.com/nix-community/colmena/issues/344>
hostnames = lib.filter ( hostnames = lib.filter (
hostname: !((lib'.hostMeta hostname).deploy.autoRollback or false) hostname: !((utils.hostMeta ../hosts/${hostname}).deploy.autoRollback or false)
) lib'.nixosHosts; ) (utils.dirNames ../hosts);
mkNode = mkNode =
hostname: hostname:
let let
meta = lib'.hostMeta hostname; meta = utils.hostMeta ../hosts/${hostname};
isArm = meta.system == "aarch64-linux"; isArm = meta.system == "aarch64-linux";
in in
{ {
@@ -40,8 +40,10 @@ inputs.colmena.lib.makeHive (
meta = { meta = {
nixpkgs = import inputs.nixpkgs { localSystem = "x86_64-linux"; }; nixpkgs = import inputs.nixpkgs { localSystem = "x86_64-linux"; };
specialArgs = { specialArgs = {
inherit inputs lib'; inherit inputs;
outputs = self; outputs = self;
dotsPath = ../dots;
myUtils = utils;
}; };
}; };
} }
+4 -4
View File
@@ -5,18 +5,18 @@
let let
inherit (inputs.nixpkgs) lib; inherit (inputs.nixpkgs) lib;
lib' = import ../lib { inherit lib; }; utils = import ../utils { inherit lib; };
# only include hosts that need auto rollback (until `colmena` supports it) # only include hosts that need auto rollback (until `colmena` supports it)
# `colmena` is used for other hosts (see ./colmena.nix) # `colmena` is used for other hosts (see ./colmena.nix)
hostnames = lib.filter ( hostnames = lib.filter (
hostname: (lib'.hostMeta hostname).deploy.autoRollback or false hostname: (utils.hostMeta ../hosts/${hostname}).deploy.autoRollback or false
) lib'.nixosHosts; ) (utils.dirNames ../hosts);
mkNode = mkNode =
hostname: hostname:
let let
meta = lib'.hostMeta hostname; meta = utils.hostMeta ../hosts/${hostname};
in in
{ {
inherit hostname; inherit hostname;
+26
View File
@@ -0,0 +1,26 @@
# Scripts
Mostly tiny helper scripts \& experiments, some more useful than others.
## Setup
Make sure the scripts are in your `$PATH` and executable.
To add the complete directory of scripts to your `$PATH`:
```bash
export PATH=~/.bin:$PATH
```
To make a any script `<script>` executable:
```bash
chmod +x <script>
```
## Notes
Statusbar scripts are prefixed with `sb` under the assumption you're using
`polybar` (scripts my need changes to be used with different statusbars).
Some scripts have dependencies (e.g. `fzf`, `jq`, `xclip`, ...), make sure you
have them installed.
+6
View File
@@ -0,0 +1,6 @@
#!/usr/bin/env bash
# Tiny AUR clone helper
# aurpac <package-name>
git clone "https://aur.archlinux.org/$1.git"
@@ -1,3 +1,5 @@
#!/usr/bin/env bash
# back up a file by copying it to a new file with a .bak extension # back up a file by copying it to a new file with a .bak extension
# reference: https://askubuntu.com/questions/962489/is-there-any-way-to-create-backup-copy-of-a-file-without-type-its-name-twice # reference: https://askubuntu.com/questions/962489/is-there-any-way-to-create-backup-copy-of-a-file-without-type-its-name-twice
Executable
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
ipython -i /home/h/.bin/calc.py
Executable
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
# Open webcam window
ffplay -f v4l2 -x 640 -y 480 -i /dev/video0 >/dev/null 2>&1 & disown
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env node
const fs = require('fs')
const objLength = obj => Object.keys(obj).length
fs.readFile(process.argv[2], (err, data) => (err ? console.error(err) : console.log(objLength(JSON.parse(data)))))
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
xdg-open https://devdocs.io/offline
+10
View File
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
options="Mouse\nHeadphones"
selected="$(echo -e "$options" | fzf)"
case "$selected" in
"Mouse") toggle-bt-device E4:19:21:56:C8:70;;
"Headphones") toggle-bt-device 38:18:4C:D4:74:42;;
esac
@@ -1,8 +1,10 @@
#!/usr/bin/env bash
# Generate menu of book filenames and save paths # Generate menu of book filenames and save paths
# Preview window contains metadata # Preview window contains metadata
function get_book_paths { function get_book_paths {
find "$HOME/doc/books/" -regex '.*\.\(pdf\|epub\|djvu\)' -type f | sort find /home/h/doc/books/ -regex '.*\.\(pdf\|epub\|djvu\)' -type f | sort
} }
function select_file { function select_file {
@@ -19,8 +21,10 @@ function open {
fi fi
} }
case "${1:-}" in case "$1" in
--open) open "$(select_file)" ;; --open) open "$(select_file)" ;;
--help) printf "open \n" >&2 ;; --help) printf "open \n" >&2 ;;
*) open "$(select_file)" ;; *) open "$(select_file)" ;;
esac esac
[[ -n "$selected" ]] && xdg-open "$selected" &> /dev/null & disown
@@ -1,3 +1,5 @@
#!/usr/bin/env bash
fn="/tmp/fontnames.txt" fn="/tmp/fontnames.txt"
contains_dash() { contains_dash() {
@@ -5,16 +7,16 @@ contains_dash() {
} }
update() { update() {
: > "$fn" echo "" > "$fn"
font_list=$(fc-list -f "%{fullname}\n") font_list=$(fc-list -f "%{fullname}\n")
echo "$font_list" | while read -r line ; do echo "$font_list" | while read line ; do
first="$(echo "$line" | cut -d',' -f1)" first="$(echo "$line" | cut -d',' -f1)"
last="$(echo "$line" | cut -d',' -f2)" last="$(echo "$line" | cut -d',' -f2)"
if contains_dash "$first"; then if $(contains_dash "$first"); then
echo "$last" >> "$fn" echo "$last" >> "$fn"
else else
echo "$first" >> "$fn" echo "$first" >> "$fn"
@@ -22,7 +24,7 @@ update() {
done done
} }
case "${1:-}" in case "$1" in
--update) update;; --update) update;;
*) sort -u "$fn" | awk 'NF' | fzf;; *) cat "$fn" | sort | uniq | awk 'NF' | fzf;;
esac esac
@@ -1 +1,3 @@
#!/usr/bin/env bash
ssh "$(ssh-hosts | fzf)" ssh "$(ssh-hosts | fzf)"
@@ -1 +1,3 @@
#!/usr/bin/env bash
curl 127.0.0.1:8765 -X POST -d '{"action": "deckNames", "version": 6}' | jq '.result[]' -r curl 127.0.0.1:8765 -X POST -d '{"action": "deckNames", "version": 6}' | jq '.result[]' -r
@@ -1,6 +1,8 @@
#!/usr/bin/env bash
# Get Anki review status from exit code # Get Anki review status from exit code
num_reviews="$(cat "$ANKI_REVIEWS")" num_reviews="$(cat /tmp/anki-reviews)"
if [ "$num_reviews" -ge "400" ] if [ "$num_reviews" -ge "400" ]
then then
+2
View File
@@ -0,0 +1,2 @@
pactl load-module module-jack-source connect=0
pactl load-module module-loopback source=jack_in
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env python
import yaml, json, sys
print(yaml.dump(json.load(open(sys.argv[1])), allow_unicode=True), end='')
@@ -1,6 +1,8 @@
#!/usr/bin/env bash
# Pipe into notify-send # Pipe into notify-send
# #
# e.g. `echo "Hello world" | notify` # e.g. `echo "Hello world" | notify`
read -r msg || true read -r msg
notify-send "$msg" "$@" notify-send "$msg" "$@"
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sudo pacman -Qtdq | sudo pacman -Rns -
@@ -1 +1,3 @@
#!/usr/bin/env bash
pdfinfo "$1" | head -n 1 | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}' pdfinfo "$1" | head -n 1 | awk '{for (i=2; i<NF; i++) printf $i " "; print $NF}'
@@ -10,11 +10,11 @@ Pomodoro timer
import atexit import atexit
import os import os
import signal
import subprocess
from argparse import ArgumentParser from argparse import ArgumentParser
from time import sleep from time import sleep
from plyer import notification
POMO_PATH = os.path.join( POMO_PATH = os.path.join(
os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share")), "pomo" os.getenv("XDG_DATA_HOME", os.path.expanduser("~/.local/share")), "pomo"
) )
@@ -30,14 +30,17 @@ def format_mins_secs(mins, secs):
return f"{mins:02d}:{secs:02d}" return f"{mins:02d}:{secs:02d}"
def countdown(duration): def make_countdown():
while duration != 0: def countdown(duration):
mins = duration // 60 while duration != 0:
secs = duration % 60 mins = duration // 60
with open(POMO_PATH, "w") as f: secs = duration % 60
f.write(format_mins_secs(mins, secs)) time_str = format_mins_secs(mins, secs)
sleep(1) os.system(f'echo -n "{time_str}" > {POMO_PATH}')
duration -= 1 sleep(1)
duration -= 1
return countdown
def main(args): def main(args):
@@ -45,13 +48,16 @@ def main(args):
break_duration = args.break_duration * 60 break_duration = args.break_duration * 60
repeats = args.repeats repeats = args.repeats
work_countdown = make_countdown()
break_countdown = make_countdown()
while repeats != 0: while repeats != 0:
subprocess.run(["notify-send", "Get started"]) notification.notify(title="Get started")
countdown(work_duration) work_countdown(work_duration)
if break_duration != 0: if break_duration != 0:
subprocess.run(["notify-send", "Time for a break"]) notification.notify(title="Time for a break")
countdown(break_duration) break_countdown(break_duration)
subprocess.run(["notify-send", "Break is over, back to work"]) notification.notify(title="Break is over, back to work")
repeats -= 1 repeats -= 1
@@ -78,10 +84,4 @@ if __name__ == "__main__":
args = parser.parse_args() args = parser.parse_args()
signal.signal(signal.SIGINT, handle_signal) main(args)
signal.signal(signal.SIGTERM, handle_signal)
if args.clear:
clear()
else:
main(args)
Executable
+9
View File
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
session="r5rs"
tmux attach-session -t "$session" || tmux new-session -s "$session" \; \
split-window -h -t $session \; \
send-keys -t 1 "nvim -c \"set ft=scheme\"" C-m \; \
send-keys -t 2 "plt-r5rs --no-prim" C-m \; \
select-pane -t 1
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sed -i -r 's/\[*\]\(\.\/([A-z-]*.md)/\]\(\1/g' *.md
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
# Backup existing password databases and
# database keys (using date in filename date -u
# +%Y-%m-%d_%H-%M-%S)
RCLONE_REMOTE="proton-drive"
for f in "$HOME/doc"/*.{kdbx,kdbx.key}; do
[ -e "$f" ] || continue
echo "Backing up $f to $f-$(date -u +%Y-%m-%d_%H-%M-%S)"
cp "$f" "$f-$(date -u +%Y-%m-%d_%H-%M-%S)"
done
echo "Restoring KeePassXC databases and database keys"
rclone copyto \
"$RCLONE_REMOTE:doc"/ "$HOME/doc/" \
--progress \
--include "/*.{kdbx,kdbx.key}"
+23
View File
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
function start() {
adb start-server
nohup gnirehtet autorun &> /dev/null &
printf "Started reverse tethering \n"
}
function stop() {
adb kill-server
gnirehtet stop
pkill gnirehtet
printf "Stopped reverse tethering \n"
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; start ;;
*) printf "start | stop | restart \n" >&2
exit 1
;;
esac
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
options="nl:en\nen:nl\nnl:fr\nfr:nl\nen:fr\nfr:en\nnl:de\nde:nl"
selected=$(echo -en "$options" | rofi -dmenu -p "source?:target?" -i)
# notify-send --app-name= -t 3000 "$(trans "$selected" -b "$(rofi -dmenu -p "$selected" &)" \
# | tr -d '\n' \
# | xclip -sel clip -f)"
translation="$(trans "$selected" -b "$(rofi -dmenu -p "$selected" &)" | tr -d '\n')"
echo -e "Copy" | rofi -p "translation" -dmenu -i -mesg "$translation" | xargs -I{} echo -n "$translation" | xclip -selection clipboard
+75
View File
@@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Save (encrypted) password database to cloud storage
#
# Usage:
# save-passwddb - Save databases to cloud
# save-passwddb init - Restore databases from cloud (with single backup archive)
RCLONE_REMOTE="proton"
SOURCE_DIR="$HOME/doc"
TARGET_DIR="$RCLONE_REMOTE:doc"
BACKUP_DIR="$HOME/doc/bak"
function save_databases() {
if [ 0 -lt "$(ls $SOURCE_DIR/*.kdbx 2>/dev/null | wc -w)" ]; then
echo "[save] Saving KeePassXC databases and database keys"
rclone copy "$SOURCE_DIR" "$TARGET_DIR" \
--include "/*.{kdbx,kdbx.key}" \
--progress
echo "[save] Done"
else
echo "[save] No password database found, restore with:"
echo ""
echo " $0 init"
exit 1
fi
}
function backup_existing() {
mkdir -p "$BACKUP_DIR"
local timestamp=$(date +%Y%m%d-%H%M%S)
local backup_file="$BACKUP_DIR/passwddb_backup_${timestamp}.tar.gz"
echo "[backup] Creating backup archive: ${backup_file}"
tar -czf "$backup_file" -C "$SOURCE_DIR" $(find "$SOURCE_DIR" -maxdepth 1 -type f \( -name "*.kdbx" -o -name "*.kdbx.key" \) -printf "%f ")
echo "[backup] Backup complete"
}
function restore_databases() {
echo "[init] Checking for existing files..."
local existing_files=$(find "$SOURCE_DIR" -maxdepth 1 -type f \( -name "*.kdbx" -o -name "*.kdbx.key" \) -print)
if [ -n "$existing_files" ]; then
echo "[init] Found existing database files:"
echo "$existing_files" | while read -r file; do
echo " - $file"
done
read -p "[init] Create backup archive of existing files? [y/N] " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
backup_existing
fi
fi
echo "[init] Restoring KeePassXC databases and database keys"
mkdir -p "$SOURCE_DIR"
rclone copy "$TARGET_DIR" "$SOURCE_DIR" \
--include "*.{kdbx,kdbx.key}" \
--progress
echo "[init] Done"
}
case "$1" in
""|save)
save_databases
;;
init)
restore_databases
;;
*)
echo "Usage: $0 [init|save]"
exit 1
;;
esac
@@ -1,3 +1,5 @@
#!/usr/bin/env bash
selected_hosts="$(ssh-hosts | fzf -m)" selected_hosts="$(ssh-hosts | fzf -m)"
for host in $selected_hosts; do for host in $selected_hosts; do
+22
View File
@@ -0,0 +1,22 @@
#!/usr/bin/env bash
# Anki review percentage for statusbar
num_to_review=200
# Get current card count from Anki
count=$(curl -s 127.0.0.1:8765 -X POST -d '{"action": "getNumCardsReviewedToday", "version": 6}' | jq '.result')
if [ -z "$count" ]
then
if [ -s /tmp/anki-reviews ]; then
true
else
echo "-1" > /tmp/anki-reviews
fi
else
echo "$count" > /tmp/anki-reviews
fi
num_reviews=$(cat /tmp/anki-reviews)
echo -n -e " Reviews: $(python3 -c "print('{:.2%}'.format($num_reviews/$num_to_review))") "
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
cap="$(cat /sys/class/power_supply/BAT0/capacity)"
if [ "$cap" -ge 33 ];then
color="\x01"
elif [ "$cap" -ge 10 ]; then
color="\x03"
else
color="\x04"
fi
echo -n -e "$color $cap% \x01"
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
echo -n -e "Week $(date '+%V') $(date '+%a %d %b %H:%M') "
+7
View File
@@ -0,0 +1,7 @@
#!/bin/sh
if grep -xq 'up' /sys/class/net/w*/operstate 2>/dev/null ; then
wifiicon="$(awk '/^\s*w/ { print "WiFi", int($3 * 100 / 70) "% " }' /proc/net/wireless)"
fi
printf " %s%s%s" "$wifiicon" "$(sed "s/down//;s/up/Ethernet/" /sys/class/net/e*/operstate 2>/dev/null)"
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
[ -f "/home/h/.local/share/pomo" ] && cat /home/h/.local/share/pomo || echo ""
+4
View File
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Render contents of $HOME/.project if present
[ -f "$HOME/.project" ] && cat "$HOME/.project" || echo ""
+7
View File
@@ -0,0 +1,7 @@
#!/usr/bin/env bash
num_done="$(task end.after:today status:completed count)"
num_pending="$(($(task count status:pending) + $num_done))"
num_waiting="$(($(task count status:waiting)))"
echo -e "Tasks: $num_done/$num_pending+$num_waiting"
+12
View File
@@ -0,0 +1,12 @@
#!/usr/bin/env sh
# Reference: https://github.com/mil-ad/polybar-wireguard
connected_interfaces=$(networkctl | grep -P "\d+ .* wireguard routable" -o | cut -d" " -f2)
if [ -n "$connected_interfaces" ];
then
for interface in $connected_interfaces; do echo "$interface"; done
else
exit 1
fi
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env python
import subprocess
import sys
DEFAULT_TEMPERATURE = 3500
try:
with open("/tmp/temperature", "r") as temp_file:
current_temperature = int(temp_file.read())
except FileNotFoundError:
current_temperature = DEFAULT_TEMPERATURE
# If no argument is given print the current temperature
if len(sys.argv) == 1:
print(current_temperature)
sys.exit(0)
elif len(sys.argv) != 2:
print(
"""
Usage:
screen-temperature
print current temperature
screen-temperature <temperature>
set screen temperature to <temperature>
screen-temperature <+|-><temperature>
increase or decrease screen temperature by <temperature>
"""
)
sys.exit(1)
temperature_change = sys.argv[1]
if temperature_change.startswith("+"):
new_temperature = current_temperature + int(temperature_change[1:])
elif temperature_change.startswith("-"):
new_temperature = current_temperature - int(temperature_change[1:])
else:
new_temperature = int(temperature_change)
try:
subprocess.run(["redshift", "-O", str(new_temperature), "-P"], check=True)
with open("/tmp/temperature", "w") as temp_file:
temp_file.write(str(new_temperature) + "\n")
# Send notification
subprocess.run(["notify-send", str(new_temperature) + "K"])
except subprocess.CalledProcessError:
print("Error: could not set screen temperature.")
sys.exit(1)
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Script to create script
if [ -z "$1" ]; then
echo "Usage: script <scriptname>"
exit
fi
path="$HOME/.bin/$1"
# Prevent overwriting existing script
set -o noclobber
# Create script
cat > "$path" << EOF
#!/usr/bin/env bash
EOF
chmod +x "$path"
# Open script in editor on line 3
"$EDITOR" +3 "$path"
+208
View File
@@ -0,0 +1,208 @@
#!/bin/bash
pac_list=(
at
automake
autopep8
base
base-devel
bash-completion
bash-language-server
bc
brightnessctl
chromium
dmidecode
entr
eslint_d
feh
firefox-developer-edition
firefox-tridactyl
firefox-tridactyl-native
firefox-tridactyl-native-debug
fzf
gcc
git
haskell-language-server
haskell-ormolu
hsetroot
htop
httpie
jq
keepassxc
kitty
lua-language-server
make
man-db
man-pages
neovim
nmap
nodejs-lts-jod
pacman-contrib
pandoc-cli
pandoc-crossref
parallel
pass
pkgbuild-language-server
pnpm
ripgrep
sshfs
stylelint
svelte-language-server
tailwindcss-language-server
task
tldr
tmux
tmuxp
tree
tree-sitter-cli
ts-node
typescript-language-server
unzip
vim-language-server
wget
xclip
yaml-language-server
)
aurpac_list=(
hadolint-bin
nvm
nvimpager
paru
tmux-bash-completion-git
ttf-iosevka-term-ss08
vim-plug
vtsls
xbanish
)
install() {
local package="$1"
if pacman -Qi "$package" &> /dev/null; then
echo "$package is already installed"
else
echo "Installing " "$package"
sudo pacman -S --noconfirm --needed "$package"
fi
}
aurpac() {
git clone "https://aur.archlinux.org/$1.git" "$HOME/.build/$1"
}
install_packages() {
announce "Installing packages"
local count
for pac in "${pac_list[@]}" ; do
count=$((count+1))
install "$pac";
done
echo "$count packages installed"
}
install_dotfiles() {
announce "Installing dotfiles"
origin="https://git.hektormisplon.xyz/hektor/dots"
git clone "$origin" "$HOME/dots"
cp -r "$HOME/dots/.git" "$HOME/.git"
git --git-dir="$HOME/.git" config --local status.showUntrackedFiles no
git --git-dir="$HOME/.git" stash -m "[dots]"
git --git-dir="$HOME/.git" stash apply
git --git-dir="$HOME/.git" restore "$HOME"
}
install_aur_packages() {
announce "Installing AUR packages"
local count
for package in "${aurpac_list[@]}" ; do
if pacman -Qi "$1" &> /dev/null; then
echo "$1 is already installed"
else
count=$((count+1))
aurpac "$package" && makepkg -si -D "$HOME/.build/$package"
fi
done
echo "$count AUR packages installed"
}
setup_neovim() {
announce "Setting up NeoVim"
git clone --depth=1 https://github.com/savq/paq-nvim.git \
"${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/paqs/start/paq-nvim
}
setup_keyboard() {
announce "Setting up keyboard"
install "interception-tools"
install "interception-caps2esc"
udevmon_config_contents="\
- JOB: intercept -g \$DEVNODE | caps2esc -m 1 | uinput -d \$DEVNODE
DEVICE:
EVENTS:
EV_KEY: [KEY_CAPSLOCK]"
if [ -f /etc/interception/udevmon.yaml ] && diff -q <(echo "$udevmon_config_contents") /etc/interception/udevmon.yaml; then
echo "udevmon config already exists"
echo "$udevmon_config_contents"
elif [ -f /etc/interception/udevmon.yaml ]; then
echo "interception udevmon.yaml already exists"
cat /etc/interception/udevmon.yaml
echo "verify if this config matches the one below"
echo "$udevmon_config_contents"
else
echo "interception udevmon.yaml does not exist, creating one"
sudo bash -c "echo '$udevmon_config_contents' > /etc/interception/udevmon.yaml"
fi
sudo systemctl enable --now udevmon.service
if pgrep -x caps2esc > /dev/null; then
echo "caps2esc is already running"
else
caps2esc -m 1
fi
}
configure_gnome() {
announce "Configuring Gnome"; setup-gnome
}
setup_firewall() {
announce "Configuring firewalld"
install firewalld
sudo systemctl enable --now firewalld
}
setup_docker() {
announce "Setting up Docker"
install docker
install docker-compose
sudo systemctl enable --now docker.socket
sudo usermod -aG docker "$USER"
echo "User added to docker group, please restart your session"
}
announce() {
local message="$1"
echo " "
echo "[dots] $message"
echo " "
}
confirm() {
local question="$1"
read -r -p "[dots] $question? [y/N]" -n 1
case "$REPLY" in y|Y ) "$2";; * ) echo "Skipping"; esac
}
printf '%s\n' "${pac_list[@]}"
confirm "Install these packages? " install_packages
printf '%s\n' "${aurpac_list[@]}"
confirm "Install these AUR packages? " install_aur_packages
confirm "Setup NeoVim? " setup_neovim
confirm "Install dotfiles? " install_dotfiles
confirm "Setup keyboard? " setup_keyboard
if pacman -Qi "gdm" &> /dev/null; then
confirm "Configure Gnome? " configure_gnome
fi
confirm "Setup firewall? " setup_firewall
confirm "Setup Docker? " setup_docker
+5
View File
@@ -0,0 +1,5 @@
#!/usr/bin/env bash
ssh_hosts="$(grep -E 'Host [a-z0-9\-]*$' ~/.ssh/config | awk '{print $2}')"
echo "$ssh_hosts"
@@ -7,8 +7,12 @@ from collections import defaultdict
def get_task_data(): def get_task_data():
command = ["task", "+PENDING", "or", "+WAITING", "-COMPLETED", "-DELETED", "export"] command = (
return json.loads(subprocess.check_output(command)) "task +PENDING or +WAITING -COMPLETED -DELETED export | "
"jq '[.[] | {uuid: .uuid, id, depends: .depends, description: .description, status: .status }]'"
)
output = subprocess.check_output(command, shell=True)
return json.loads(output)
def parse_task_data(data): def parse_task_data(data):
@@ -23,14 +27,61 @@ def parse_task_data(data):
"description": task.get("description", "No description"), "description": task.get("description", "No description"),
"status": task.get("status", "Unknown status"), "status": task.get("status", "Unknown status"),
} }
for dependency in task.get("depends", []): if task["depends"]:
dependency_graph[dependency].append(task_id) for dependency in task["depends"]:
dependent_tasks.add(task_id) dependency_graph[dependency].append(task_id)
dependent_tasks.add(task_id)
root_tasks = set(task_details.keys()) - dependent_tasks root_tasks = set(task_details.keys()) - dependent_tasks
return task_details, dependency_graph, root_tasks return task_details, dependency_graph, root_tasks
def get_all_parents(task_id, dependency_graph):
return [
parent for parent, children in dependency_graph.items() if task_id in children
]
def build_ascii_dag(
task_id,
task_details,
dependency_graph,
prefix="",
is_last=True,
show_id=True,
visited=None,
):
if visited is None:
visited = set()
if task_id in visited:
return [f"{prefix}{'└── ' if is_last else '├── '}... (cycle detected)"]
visited.add(task_id)
task_info = task_details[task_id]
task_line = f"{prefix}{'└── ' if is_last else '├── '}{task_info['id'] + ': ' if show_id else ''}{task_info['description']} ({task_info['status']})"
lines = [task_line]
children = dependency_graph.get(task_id, [])
for idx, child in enumerate(children):
child_is_last = idx == len(children) - 1
child_prefix = prefix + (" " if is_last else "│ ")
lines.extend(
build_ascii_dag(
child,
task_details,
dependency_graph,
child_prefix,
child_is_last,
show_id,
visited.copy(),
)
)
return lines
def render_dependency_dag(task_details, dependency_graph, root_tasks, show_id): def render_dependency_dag(task_details, dependency_graph, root_tasks, show_id):
dag_lines = [] dag_lines = []
global_visited = set() global_visited = set()
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -euf -o pipefail
VIM=${VIM:-"vim"}
TMUX=${TMUX:-"tmux"}
FILE=${FILE:-"$(date +%F).tidal"}
SESSION=${SESSION:-"tidal"}
TIDAL_BOOT_PATH=${TIDAL_BOOT_PATH:-""}
GHCI=${GHCI:-""}
args=${*:-$FILE}
# attach if session else create
$TMUX attach-session -t "$SESSION" || $TMUX new-session -s "$SESSION" \; \
split-window -h -t "$SESSION" \; \
send-keys -t 0 "$VIM $args" C-m \; \
send-keys -t 1 "TIDAL_BOOT_PATH=$TIDAL_BOOT_PATH GHCI=$GHCI tidal" C-m \; \
new-window -t "$SESSION":2 -n SuperDirt \; \
send-keys -t 0 "jack_control start && sclang ~/dev/live/scripts/start.scd" C-m \; \
select-window -t 1 \; \
resize-pane -t 1 -x 100 \; \
resize-pane -t 0 -x 125 \; \
select-pane -t 0
+13
View File
@@ -0,0 +1,13 @@
#!/usr/bin/env bash
session="main"
tmux attach-session -t $session || tmux new-session -s $session \; \
rename-window task \; \
send-keys -t 1 "task" C-m \; \
new-window -n zk \; \
send-keys -t 2 "nvim $ZK_PATH/index.md" C-m \; \
new-window -n term \; \
new-window -n music \; \
send-keys -t 4 "echo 'TODO: open music player'" C-m \; \
select-window -t 1 \;
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
status="$(bluetoothctl info "$1" | grep Connected | cut -f 2 -d ':' | cut -f 2 -d ' ')"
if [ "$status" == "yes" ]
then
bluetoothctl disconnect "$1"
else
trust "$1"
bluetoothctl connect "$1"
fi
+3
View File
@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sudo pacman -Syu
+1
View File
@@ -0,0 +1 @@
[{ "key": "ctrl+b", "command": "workbench.action.toggleSidebarVisibility" }]
+114
View File
@@ -0,0 +1,114 @@
{
/* view */
"workbench.statusBar.visible": true,
"workbench.activityBar.visible": false,
"breadcrumbs.enabled": false,
"editor.minimap.enabled": false,
"window.menuBarVisibility": "hidden",
"workbench.editor.showTabs": false,
"workbench.editor.showIcons": false,
/* font */
"editor.fontSize": 20,
"editor.fontLigatures": true,
"editor.fontFamily": "Iosevka",
"terminal.integrated.fontSize": 20,
/* editor */
"editor.lineNumbers": "relative",
"editor.glyphMargin": false,
"terminal.integrated.allowMnemonics": false,
"workbench.colorCustomizations": {
"editorGroup.emptyBackground": "#0c0c0c",
"scrollbar.shadow": "#000",
"widget.shadow": "#000",
"editorWidget.background": "#0c0c0c",
"editor.background": "#0c0c0c",
"sideBar.background": "#0c0c0c",
"editorGroupHeader.noTabsBackground": "#0c0c0c",
"scrollbarSlider.background": "#222",
"scrollbarSlider.activeBackground": "#222",
"scrollbarSlider.hoverBackground": "#333",
"statusBar.noFolderBackground": "#0c0c0c",
"statusBar.border": "#0c0c0c",
"statusBar.background": "#0c0c0c",
"statusBar.foreground": "#555"
},
"editor.tokenColorCustomizations": {
"comments": "#555",
"functions": "#aaa",
"numbers": "#fff",
"strings": "#fff",
"types": "#aaa",
"variables": "#aaa",
"keywords": "#aaa"
},
/* vim keybindings */
"vim.incsearch": true,
"vim.hlsearch": true,
"vim.leader": "<space>",
"vim.normalModeKeyBindingsNonRecursive": [
/* quick quit */
{
"before": ["<leader>", "q"],
"commands": [":q"]
},
{
"before": ["<leader>", "w"],
"commands": [":w"]
},
{
"before": ["<leader>", "Q"],
"commands": [":q!"]
},
{
"before": ["<leader>", "W"],
"commands": [":w!"]
},
/* split */
{
"before": ["<leader>", "s", "s"],
"commands": [":sp"]
},
{
"before": ["<leader>", "s", "v"],
"commands": [":vs"]
},
/* clear search highlight */
{
"before": ["<leader>", "<leader>"],
"commands": [":nohl"]
}
],
"vim.insertModeKeyBindings": [
/* quick exit insert */
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
],
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false
},
/* eslint & prettier */
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"workbench.colorTheme": "Absolute Black",
"window.zoomLevel": 1,
"javascript.updateImportsOnFileMove.enabled": "always"
}
+1
View File
@@ -0,0 +1 @@
Xcursor.size: 16
+57
View File
@@ -0,0 +1,57 @@
#!/bin/sh
userresources=$HOME/.config/X11/Xresources
usermodmap=$HOME/.config/X11/Xmodmap
sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap
if [ -f $sysresources ]; then xrdb -merge $sysresources; fi
if [ -f $sysmodmap ]; then xmodmap $sysmodmap; fi
if [ -f "$userresources" ]; then xrdb -merge "$userresources"; fi
if [ -f "$usermodmap" ]; then xmodmap "$usermodmap"; fi
# start some nice programs
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
[ -x "$f" ] && . "$f"
done
unset f
fi
# ______________________________
xset -b # disable bell
xset r rate 200 30 # adjust typematic delay & rate
# Shared
xbindkeys -f "$HOME"/.config/xbindkeys/config
xbanish &
redshift -o -O "$(cat /tmp/temperature)" & # Run redshift in one shot mode
# DWM
# dwmblocks &
# udiskie &
# # No compositor
# # xsetroot -solid "#0a0a0a"
# # With compositor
# # hsetroot -solid "#0a0a0a"
# # picom &
# # execute dwm in a loop
# while true; do
# dwm 2> ~/.dwm.log
# done
# Openbox
# # udiskie --tray &
# # plank &
# # picom &
# # hsetroot -solid "#555555"
# # openbox
# Xmonad
xsetroot -solid "#0a0a0a"
xsetroot -cursor_name left_ptr
picom &
trayer --edge top --align right --SetDockType true --SetPartialStrut true \
--expand true --width 10 --transparent true --tint 0x111111 --height 25 &
exec xmonad
+34
View File
@@ -0,0 +1,34 @@
[global]
geometry="0-0+24"
monitor=0
follow=keyboard
indicate_hidden=yes
notification_height=0
padding=8
horizontal_padding=8
frame_width=1
frame_color="#333"
separator_height=1
idle_threshold=120
font=Iosevka Term SS08 12
markup=full
format="%s\n%b"
dmenu=/usr/bin/dmenu -p dunst:
browser=/usr/bin/brave -new-tab
verbosity=info
[urgency_low]
background="#111"
foreground="#aaa"
timeout=10
[urgency_normal]
background="#111"
foreground="#aaa"
timeout=10
[urgency_critical]
background="#111"
foreground="#fff"
frame_color="#f00"
timeout=0
+12
View File
@@ -0,0 +1,12 @@
prev_img h
next_img l
scroll_left L
scroll_right H
scroll_up J
scroll_down K
zoom_in j
zoom_out k
zoom_fit z
zoom_default =
mirror bar
close q Q
+3
View File
@@ -0,0 +1,3 @@
feh \
-B black \
--auto-zoom
+36
View File
@@ -0,0 +1,36 @@
[General]
checkForUpdates=false
disabledTrayIcon=true
uiColor=#cccccc
fontFamily=Inter
drawColor=#ffffff
savePath=/home/h/doc/clips
copyPathAfterSave=true
saveLastRegion=true
saveAsFileExtension=png
userColors=picker, #800000, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ffffff, #000000
[Shortcuts]
TYPE_ARROW=a
TYPE_CIRCLE=o
TYPE_CIRCLECOUNT=Shift+o
TYPE_COMMIT_CURRENT_TOOL=Ctrl+Return
TYPE_COPY=y
TYPE_DELETE_CURRENT_TOOL=
TYPE_DRAWER=l
TYPE_EXIT=q
TYPE_IMAGEUPLOADER=
TYPE_MARKER=m
TYPE_MOVESELECTION=Ctrl+M
TYPE_MOVE_DOWN=j
TYPE_MOVE_LEFT=h
TYPE_MOVE_RIGHT=l
TYPE_MOVE_UP=k
TYPE_OPEN_APP=o
TYPE_PENCIL=d
TYPE_PIN=Enter
TYPE_PIXELATE=p
TYPE_RECTANGLE=r
TYPE_REDO=Ctrl+r
TYPE_RESIZE_DOWN=Shift+j
TYPE_RESIZE_LEFT=Shift+h
+16
View File
@@ -0,0 +1,16 @@
git_protocol: ssh
prompt: enabled
aliases:
co: pr checkout
c: repo clone
f: repo fork
rc: repo create
rv: repo view
re: repo edit
rm: repo remove
rn: repo rename
lr: repo list
li: issue list
al: alias
al-: alias delete
version: "1"
+5
View File
@@ -0,0 +1,5 @@
[Settings]
gtk-font-name=Inter 12
gtk-application-prefer-dark-theme=true
gtk-icon-theme-name=Adwaita
gtk-theme-name=Adwaita
File diff suppressed because it is too large. Load diff
+32
View File
@@ -0,0 +1,32 @@
[General]
ConfigVersion=2
[Browser]
CustomProxyLocation=
Enabled=true
[GUI]
ApplicationTheme=dark
CompactMode=false
HidePreviewPanel=false
HideToolbar=false
MinimizeOnClose=true
MinimizeToTray=true
ShowTrayIcon=true
TrayIconAppearance=colorful
[KeeShare]
Active="<?xml version=\"1.0\"?><KeeShare><Active/></KeeShare>\n"
Foreign="<?xml version=\"1.0\"?>\n<KeeShare xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n <Foreign/>\n</KeeShare>\n"
Own="<?xml version=\"1.0\"?><KeeShare><PrivateKey>MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9Ji74dnjo0qzbUFKEoNnMHsdX7mBXuJcu8zsl7vfkKLiAGIQiP9BQc/JnFr28W92fQz8uXVtm7NgnKJQkT7wzFyBdspmNDzosS58EIQVKe5p+uMaaGZ5z6j1DtLCFo7PLCnhasBluC0W1+37s7NtRD6bFo1r6QHupY63mBsSvJhAcmS+6bM7xS7PcK0WTVTsK1MWYZLOkYMWQ0AW/t4PZfqeKvalqheiR8oUIDeY7+7fqvQr5SAhL0yinbtaqWmPqcd5QWyPqVkbKclw4Uecw+JW+yR9uEOP9butP74r36LUUfsTJHE2/sB2KJFRN/aUm2ZEYhzexMYSfgnrq0KCLAgMBAAECggEACV8N7rN39BkUBV2qaPXLNKjFuZ6O2WnE28ejQ5LeZ0h5M6eDTGsa+BF2jhL7XYyzo0NiqvpnH+dWIkKJbG8i5OkdamcB4pJBkJZCj6LPL0yGcAbZmCLyzc1qMaOPJ1/f9YxUQDH/YItgbc7DEBwAFbkPyzT3ufRd7BuLLx1gu0iypHhBok9kXA4WgkUihLNXXVvSIGcVy+q9wpgOiw5jLC79qwqIp39Tlt6PKryODulqWIeoeSIgAu5tgUy4O3He6AZwqBprIfJSiJOwfdBd8FchQJQDgl0fyDR10VIUNbjgm+kxWssq4oNJ7+2n14Gdfwpy2K7oO9DYeqjBrv2p4QKBgQDqY8/5ufsJ9hKhQRX3vju+FEDLKvjjKH7/6puDwcvC1GgvshQSvCo9ZVIajwSmEoWq2LTDiPlUPFINKnALQiHCbRfNeS1Tws4cK4AAZnR+CGKkox9J5MWCDVzI2/82R9/9ZX4OO+As5+Od503Grmy+Zi0Redm+r4aK04gm3LfqGwKBgQDOlpOXFyYbb473TFkf9ZfyETZGkjlCzf4uPwPuJ3njWZfwPE2Gb+quZDLSmYp9JhzIFoapnQrjSFCVyzBYIIuz3jipb5MbQxc6FPSjw0pPowWdPkEL1CT5mpZFojop+I/TnEEG+Lv039O3cGlL2zagiBHRw0ediD6z0vnoOBeKUQKBgQDjlJBuKC9gp6XFHp4G05XMZHvZCNtqLHrLX28qSjPe80BJ9z1YR4032bYThYP9AAT7MripFskICh2dHPR3afm/fw9aeWsSZhab8XyyZsh7SwcEVkJeDBvdv720ZS9y8+y/bBkuFuL+lxVBz0GMRPXfFPRzgH10kZcwGl2bZjnIuwKBgQCVabQu95AZEbM9yps/ERom+ineGo2Ncnyep/bIvQZb1wWbu5F6ZOE/5boYNPJDl1gDor8cVzdzsG6QGBfL9SX1HgivCsJDWl+nI1bYRjsto8NAubDDxFhFqnd6v1z/1AT50C37w9P0xBlUt9mAAnjc2+y/YFQgbFSlLDaQrFjiMQKBgFJrLF21Uk6ALZa4R0eOyLKhuagw3uxmNvccNG8VL5DwYVCUS7/8SkPhO5yvbcA87Y1VnM20tUr047K4U83uFNxBnPMmxlhMsxtqjw+VV6Us6uh2ASaLZ9iP9iwkn5e37WLWX+XsewoGrW/YsONwIT0dnZDPRbxhPdJn8azSJqQr</PrivateKey><PublicKey><Signer>h</Signer><Key>MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC9Ji74dnjo0qzbUFKEoNnMHsdX7mBXuJcu8zsl7vfkKLiAGIQiP9BQc/JnFr28W92fQz8uXVtm7NgnKJQkT7wzFyBdspmNDzosS58EIQVKe5p+uMaaGZ5z6j1DtLCFo7PLCnhasBluC0W1+37s7NtRD6bFo1r6QHupY63mBsSvJhAcmS+6bM7xS7PcK0WTVTsK1MWYZLOkYMWQ0AW/t4PZfqeKvalqheiR8oUIDeY7+7fqvQr5SAhL0yinbtaqWmPqcd5QWyPqVkbKclw4Uecw+JW+yR9uEOP9butP74r36LUUfsTJHE2/sB2KJFRN/aUm2ZEYhzexMYSfgnrq0KCLAgMBAAECggEACV8N7rN39BkUBV2qaPXLNKjFuZ6O2WnE28ejQ5LeZ0h5M6eDTGsa+BF2jhL7XYyzo0NiqvpnH+dWIkKJbG8i5OkdamcB4pJBkJZCj6LPL0yGcAbZmCLyzc1qMaOPJ1/f9YxUQDH/YItgbc7DEBwAFbkPyzT3ufRd7BuLLx1gu0iypHhBok9kXA4WgkUihLNXXVvSIGcVy+q9wpgOiw5jLC79qwqIp39Tlt6PKryODulqWIeoeSIgAu5tgUy4O3He6AZwqBprIfJSiJOwfdBd8FchQJQDgl0fyDR10VIUNbjgm+kxWssq4oNJ7+2n14Gdfwpy2K7oO9DYeqjBrv2p4QKBgQDqY8/5ufsJ9hKhQRX3vju+FEDLKvjjKH7/6puDwcvC1GgvshQSvCo9ZVIajwSmEoWq2LTDiPlUPFINKnALQiHCbRfNeS1Tws4cK4AAZnR+CGKkox9J5MWCDVzI2/82R9/9ZX4OO+As5+Od503Grmy+Zi0Redm+r4aK04gm3LfqGwKBgQDOlpOXFyYbb473TFkf9ZfyETZGkjlCzf4uPwPuJ3njWZfwPE2Gb+quZDLSmYp9JhzIFoapnQrjSFCVyzBYIIuz3jipb5MbQxc6FPSjw0pPowWdPkEL1CT5mpZFojop+I/TnEEG+Lv039O3cGlL2zagiBHRw0ediD6z0vnoOBeKUQKBgQDjlJBuKC9gp6XFHp4G05XMZHvZCNtqLHrLX28qSjPe80BJ9z1YR4032bYThYP9AAT7MripFskICh2dHPR3afm/fw9aeWsSZhab8XyyZsh7SwcEVkJeDBvdv720ZS9y8+y/bBkuFuL+lxVBz0GMRPXfFPRzgH10kZcwGl2bZjnIuwKBgQCVabQu95AZEbM9yps/ERom+ineGo2Ncnyep/bIvQZb1wWbu5F6ZOE/5boYNPJDl1gDor8cVzdzsG6QGBfL9SX1HgivCsJDWl+nI1bYRjsto8NAubDDxFhFqnd6v1z/1AT50C37w9P0xBlUt9mAAnjc2+y/YFQgbFSlLDaQrFjiMQKBgFJrLF21Uk6ALZa4R0eOyLKhuagw3uxmNvccNG8VL5DwYVCUS7/8SkPhO5yvbcA87Y1VnM20tUr047K4U83uFNxBnPMmxlhMsxtqjw+VV6Us6uh2ASaLZ9iP9iwkn5e37WLWX+XsewoGrW/YsONwIT0dnZDPRbxhPdJn8azSJqQr</Key></PublicKey></KeeShare>\n"
QuietSuccess=true
[PasswordGenerator]
AdditionalChars=
ExcludedChars=
Length=40
Logograms=true
WordCount=9
[SSHAgent]
Enabled=true
+147
View File
@@ -0,0 +1,147 @@
#: Fonts {{{
font_family Iosevka Term SS08
bold_font auto
italic_font auto
bold_italic_font auto
font_size 12.0
disable_ligatures never
# }}}
#: Cursor {{{
cursor_shape block
cursor_blink_interval 0
#: }}}
#: Scrollback {{{
scrollback_lines 8192
scrollbar scrolled
scrollback_pager_history_size 1024
#: }}}
#: Mouse {{{
mouse_hide_wait 0.0
paste_actions quote-urls-at-prompt
#: }}}
#: Performance tuning {{{
repaint_delay 8
input_delay 2
#: }}}
#: Terminal bell {{{
enable_audio_bell yes
window_alert_on_bell yes
#: }}}
#: Window layout {{{
remember_window_size no
remember_window_position no
enabled_layouts *
hide_window_decorations yes
#: }}}
#: Advanced {{{
notify_on_cmd_finish unfocused
#: }}}
#: OS specific tweaks {{{
linux_display_server auto
wayland_enable_ime no
#: }}}
#: Keyboard shortcuts {{{
kitty_mod ctrl+shift
map kitty_mod+c copy_to_clipboard
map kitty_mod+v paste_from_clipboard
map cmd+v
# map kitty_mod+o pass_selection_to_program
# map kitty_mod+o pass_selection_to_program firefox
# map kitty_mod+y new_window less @selection
map kitty_mod+z scroll_to_prompt -1
map kitty_mod+x scroll_to_prompt 1
map kitty_mod+h show_scrollback
# map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R
#:: For more details on piping screen and buffer contents to external
#:: programs, see launch <https://sw.kovidgoyal.net/kitty/launch/>.
# map kitty_mod+g show_last_command_output
# map kitty_mod+enter launch --cwd=current
# map cmd+enter
# map ctrl+n launch --location=neighbor
# map ctrl+f launch --location=first
map kitty_mod+n
map cmd+n
map kitty_mod+w
map shift+cmd+d
map kitty_mod+]
map kitty_mod+[
map kitty_mod+f
map kitty_mod+b
map kitty_mod+`
map kitty_mod+r
map cmd+r
map kitty_mod+1
map cmd+1
map kitty_mod+2
map cmd+2
map kitty_mod+3
map cmd+3
map kitty_mod+4
map cmd+4
map kitty_mod+5
map cmd+5
map kitty_mod+6
map cmd+6
map kitty_mod+7
map cmd+7
map kitty_mod+8
map cmd+8
map kitty_mod+9
map cmd+9
map kitty_mod+0
# map kitty_mod+c new_tab # FIXME: conflict with 'copy'
map cmd+t
map kitty_mod+q
map cmd+w
map kitty_mod+.
map kitty_mod+,
map kitty_mod+alt+t
map shift+cmd+i
map kitty_mod+f1
map kitty_mod+f11
map ctrl+cmd+f
map kitty_mod+f10
map opt+cmd+s
map kitty_mod+u kitten unicode_input
map ctrl+cmd+space
map kitty_mod+/ kitty_shell window
map kitty_mod+f5
map kitty_mod+r load_config_file
map shift+cmd+/
map cmd+h
map opt+cmd+
map cmd+m
map cmd+q
#: }}}
include ./nvim.conf
+8
View File
@@ -0,0 +1,8 @@
allow_remote_control socket-only
listen_on unix:/tmp/kitty
shell_integration enabled
action_alias kitty_scrollback_nvim kitten ~/.local/share/kitty-scrollback.nvim/python/kitty_scrollback_nvim.py
map kitty_mod+h kitty_scrollback_nvim
map kitty_mod+g kitty_scrollback_nvim --config ksb_builtin_last_cmd_output
mouse_map ctrl+shift+right press ungrabbed combine : mouse_select_command_output : kitty_scrollback_nvim --config ksb_builtin_last_visited_cmd_output
+20
View File
@@ -0,0 +1,20 @@
[Default Applications]
inode/x-empty=nvim.desktop
inode/directory=nvim.desktop
text/plain=nvim.desktop
text/html=firefoxdeveloperedition.desktop
image/gif=feh.desktop
image/jpeg=feh.desktop
image/png=feh.desktop
video/mp4=mpv.desktop
video/webm=mpv.desktop
model/stl=com.ultimaker.cura.desktop
application/pdf=org.pwmt.zathura.desktop
x-scheme-handler/msteams=teams-for-linux.desktop
x-scheme-handler/web+stremio=firefox.desktop
x-scheme-handler/http=firefoxdeveloperedition.desktop
x-scheme-handler/https=firefoxdeveloperedition.desktop
x-scheme-handler/chrome=firefoxdeveloperedition.desktop
x-scheme-handler/sidequest=SideQuest.desktop
x-scheme-handler/mailto=firefox.desktop
x-scheme-handler/webcal=firefox.desktop
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
l seek +5
h seek -5
k seek +30
j seek -30
+ add video-zoom 0.1
- add video-zoom -0.1
= set video-zoom 0; set video-pan-x 0; set video-pan-y 0
H add video-pan-x 0.01
L add video-pan-x -0.01
K add video-pan-y 0.01
J add video-pan-y -0.01
m cycle mute
+16
View File
@@ -0,0 +1,16 @@
vo=gpu
profile=gpu-hq
hwdec=auto
msg-color=yes
cursor-autohide=300
cursor-autohide-fs-only=yes
save-position-on-quit=yes
keep-open=yes
# Custom osc
osc=no
cursor-autohide=3500
osd-bar=no
osc-vidscale=no
File diff suppressed because it is too large. Load diff
+45
View File
@@ -0,0 +1,45 @@
default_keybindings = false
flip_status_indicators = true
library_tabs = ["tracks", "albums", "artists", "playlists", "browse"] # remove podcasts tab
[keybindings]
"Enter" = "play"
" " = "playpause"
"S" = "stop"
"<" = "seek -10000"
">" = "seek +10000"
"H" = "previous"
"L" = "next"
"r" = "repeat"
"z" = "shuffle"
"d" = "delete"
"s" = "save"
"O" = "open current"
"o" = "open selected"
"Backspace" = "back"
"A" = "goto artist"
"a" = "goto album"
"q" = "queue"
"J" = "shift down 1"
"K" = "shift up 1"
"c" = "clear"
"=" = "volup 1"
"-" = "voldown 1"
"1" = "focus queue"
"2" = "focus search"
"3" = "focus library"
"4" = "focus cover"
"h" = "move left 1"
"j" = "move down 1"
"k" = "move up 1"
"l" = "move right 1"
"g" = "move top"
"G" = "move bottom"
"t" = "sort added d"
"T" = "sort title a"
"y" = "share current"
"Y" = "share selected"
"U" = "update"
backend="pipe"
notify="false"
+39
View File
@@ -0,0 +1,39 @@
auto-reload yes
reload-threads 100
# color background color240 black
# color listnormal color238 black
# color listfocus white black
# color listnormal_unread color240 black bold
# color listfocus_unread default black bold
# color info default black
# color article default black
bind-key h quit articlelist
bind-key h quit article
bind-key h quit tagselection
bind-key h quit feedlist
bind-key j down feedlist
bind-key j down tagselection
bind-key j next articlelist
bind-key j down article
bind-key J next-feed articlelist
bind-key k up feedlist
bind-key k prev articlelist
bind-key k up tagselection
bind-key K prev-feed articlelist
bind-key k up article
bind-key l open articlelist
bind-key l open feedlist
bind-key l open tagselection
bind-key G end
bind-key g home
text-width 80
browser "brave"
macro m set browser "mpv %u"; open-in-browser ; set browser "brave"
show-title-bar false
show-keymap-hint false
+1
View File
@@ -0,0 +1 @@
experimental-features = nix-command flakes
File renamed without changes.
@@ -0,0 +1,3 @@
require("auto-session").setup({
auto_session_enabled = vim.env.KITTY_SCROLLBACK_NVIM ~= "true", -- See kitty-scrollback.nvim
})
@@ -0,0 +1,30 @@
require("conform").setup({
format_after_save = {
lsp_fallback = false,
async = false,
timeout_ms = 500,
},
formatters_by_ft = {
awk = { "awk" },
bash = { "shellcheck" },
c = { "clang-format" },
cpp = { "clang-format" },
css = { "prettierd", "prettier", stop_after_first = true },
gdscript = { "gdformat" },
haskell = { "ormolu" },
html = { "prettierd", "prettier", stop_after_first = true },
javascript = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
javascriptreact = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
json = { "prettierd", "prettier", stop_after_first = true },
jsonc = { "prettierd", "prettier", stop_after_first = true },
lua = { "stylua" }, -- configured in stylua.toml
markdown = { "prettierd", "prettier", stop_after_first = true },
nix = { "nixfmt" },
python = { "isort", "black" },
rust = { "rustfmt", lsp_fallback = "fallback" },
svelte = { "eslint_d", "prettierd", "prettier", stop_after_first = true },
typescript = { "eslint_d", "prettierd", "prettier", stop_after_first = true },
typescriptreact = { "eslint_d", "eslint", "prettierd", "prettier", stop_after_first = true },
-- yaml = { "prettierd", "prettier", stop_after_first = true },
},
})
@@ -0,0 +1,7 @@
require("lsp_lines").setup()
vim.diagnostic.config({
virtual_text = false,
})
vim.keymap.set("", "<leader>dd", require("lsp_lines").toggle, { desc = "Toggle lsp_lines" })
@@ -0,0 +1,196 @@
require("neodev").setup() -- should setup before lspconfig
local cmp_nvim_lsp = require("cmp_nvim_lsp")
local capabilities = cmp_nvim_lsp.default_capabilities()
local servers = {
bashls = {},
eslint = {
settings = {
--Assuming prettier/prettierd will handle formatting, we don't need to see these errors
rulesCustomizations = {
{ rule = "prettier/prettier", severity = "off" },
},
format = false,
},
},
emmet_language_server = {},
gdscript = {},
helm_ls = {
filetypes = { "yaml", "helm", "yaml.helm-values" },
},
hls = { filetypes = { "haskell", "lhaskell", "cabal" } },
html = {},
jsonls = {
settings = {
json = {
schemas = require("schemastore").json.schemas(),
validate = { enable = true },
},
},
},
lua_ls = {
on_init = function(client)
if client.workspace_folders then
local path = client.workspace_folders[1].name
if
path ~= vim.fn.stdpath("config")
and (vim.uv.fs_stat(path .. "/.luarc.json") or vim.uv.fs_stat(path .. "/.luarc.jsonc"))
then
return
end
end
client.config.settings.Lua = vim.tbl_deep_extend("force", client.config.settings.Lua, {
runtime = {
version = "LuaJIT",
path = {
"lua/?.lua",
"lua/?/init.lua",
},
},
workspace = {
checkThirdParty = false,
library = {
vim.env.VIMRUNTIME,
},
},
})
end,
settings = {
Lua = {},
},
},
nixd = {
settings = {
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
expr = 'import (builtins.getFlake ("git+file://" + toString ../../../../../.)).inputs.nixpkgs { }',
},
},
options = {
nixos = {
expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).nixosConfigurations."'
.. vim.fn.hostname()
.. '".options',
},
home_manager = {
expr = '(builtins.getFlake ("git+file://" + toString ../../../../../.)).homeConfigurations."'
.. vim.fn.expand("$USER")
.. "@"
.. vim.fn.hostname()
.. '".options',
},
},
},
},
openscad_ls = {},
pyright = {},
svelte = {
plugin = {
svelte = {
defaultScriptLanguage = "ts",
},
},
},
tailwindcss = {},
ts_ls = {},
-- vtsls = {
-- maxTsServerMemory = 16384,
-- filetypes = {
-- "javascript",
-- "javascriptreact",
-- "javascript.jsx",
-- "typescript",
-- "typescriptreact",
-- "typescript.tsx",
-- },
-- settings = {
-- complete_function_calls = true,
-- vtsls = {
-- enableMoveToFileCodeAction = true,
-- autoUseWorkspaceTsdk = true,
-- experimental = {
-- completion = {
-- enableServerSideFuzzyMatch = true,
-- },
-- },
-- },
-- typescript = {
-- updateImportsOnFileMove = { enabled = "always" },
-- suggest = {
-- completeFunctionCalls = true,
-- },
-- inlayHints = {
-- enumMemberValues = { enabled = true },
-- functionLikeReturnTypes = { enabled = true },
-- parameterNames = { enabled = "literals" },
-- parameterTypes = { enabled = true },
-- propertyDeclarationTypes = { enabled = true },
-- variableTypes = { enabled = false },
-- },
-- },
-- },
-- },
yamlls = {
settings = {
yaml = {
schemaStore = {
-- You must disable built-in schemaStore support if you want to use
-- this plugin and its advanced options like `ignore`.
enable = false,
-- Avoid TypeError: Cannot read properties of undefined (reading 'length')
url = "",
},
schemas = require("schemastore").yaml.schemas(),
},
},
},
}
for server, config in pairs(servers) do
config.capabilities = capabilities
vim.lsp.config(server, config)
end
vim.lsp.enable(vim.tbl_keys(servers))
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(e)
local opts = { buffer = e.bufnr }
local set = vim.keymap.set
local lsp_buf = vim.lsp.buf
set("n", "gD", lsp_buf.declaration, opts)
set("n", "gd", lsp_buf.definition, opts)
set("n", "K", lsp_buf.hover, opts)
set("n", "gi", lsp_buf.implementation, opts)
set("n", "<C-k>", lsp_buf.signature_help, opts)
set("n", "<space>wa", lsp_buf.add_workspace_folder, opts)
set("n", "<space>wr", lsp_buf.remove_workspace_folder, opts)
set("n", "<space>wl", function()
print(vim.inspect(lsp_buf.list_workspace_folders()))
end, opts)
set("n", "<space>D", lsp_buf.type_definition, opts)
set("n", "<space>rn", lsp_buf.rename, opts)
set({ "n", "v" }, "<space>ca", lsp_buf.code_action, opts)
set("n", "gr", lsp_buf.references, opts)
-- Taken from https://blog.viktomas.com/graph/neovim-lsp-rename-normal-mode-keymaps/
set("n", "<leader>r", vim.lsp.buf.rename)
-- function()
-- -- Automatically switch to `cmdwin` for normal mode renaming
-- -- (normally you would have to press <C-f> to open the `cmdwin`)
-- vim.api.nvim_create_autocmd({ "CmdlineEnter" }, {
-- callback = function()
-- local key = vim.api.nvim_replace_termcodes("<C-f>", true, false, true)
-- vim.api.nvim_feedkeys(key, "c", false)
-- vim.api.nvim_feedkeys("0", "n", false)
-- return true
-- end,
-- })
-- vim.lsp.buf.rename()
-- end, bufoptsWithDesc("Rename symbol")
-- )
end,
})
@@ -9,4 +9,5 @@ ls.config.set_config({
store_selection_keys = "<Tab>", store_selection_keys = "<Tab>",
}) })
require("luasnip.loaders.from_lua").lazy_load({ paths = { require("nixCats").configDir .. "/snips" } }) require("luasnip.loaders.from_lua").lazy_load({ paths = { "~/.config/nvim/snips" } })
require("luasnip.loaders.from_vscode").lazy_load({ paths = { "~/.config/Code - Insiders/User/snippets" } })
@@ -0,0 +1,35 @@
vim.env.ESLINT_D_PPID = vim.fn.getpid()
local eslint_linter = "eslint_d"
require("lint").linters_by_ft = {
bash = { "shellcheck" },
c = { "clangtidy", "flawfinder" },
cmake = { "cmakelint" },
cpp = { "clangtidy", "flawfinder" }, -- "cpplint", "cppcheck", "flawfinder"
css = { "stylelint" },
dockerfile = { "hadolint" },
editorconfig = { "editorconfig-checker" },
haskell = { "hlint" },
-- html = { "htmlhint" },
-- javascript = { eslint_linter },
-- javascriptreact = { eslint_linter },
gdscript = { "gdlint" },
latex = { "chktex" },
-- lua = { "luacheck", "selene" },
make = { "checkmake" },
-- pandoc = { "proselint", "woke" },
-- python = { "pylint" },
sh = { "shellcheck" },
svelte = { eslint_linter },
systemd = { "systemdlint" },
-- typescript = { eslint_linter },
-- typescriptreact = { eslint_linter },
yaml = { "yamllint" },
}
vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, {
callback = function()
require("lint").try_lint()
end,
})
@@ -0,0 +1 @@
require("tailwind-fold").setup({ ft = { "html", "svelte", "tsx" } })
@@ -92,6 +92,7 @@ api.nvim_create_autocmd("FileType", {
vim.treesitter.start(buf, language) vim.treesitter.start(buf, language)
-- indent -- indent
vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
vim.bo[buf].indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end, end,
}) })
Loaded 100 of 302 files, more files were not shown because too many files have changed in this diff. Show more