Compare commits
1 Commits
master
...
d9231c3a0e
| Author | SHA1 | Date | |
|---|---|---|---|
| d9231c3a0e |
54
.github/workflows/gh-pages.yml
vendored
54
.github/workflows/gh-pages.yml
vendored
@@ -1,54 +0,0 @@
|
|||||||
name: Deploy to GitHub Pages
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Setup Emacs
|
|
||||||
uses: purcell/setup-emacs@master
|
|
||||||
with:
|
|
||||||
version: 29.1
|
|
||||||
|
|
||||||
- name: Setup Cask
|
|
||||||
uses: conao3/setup-cask@master
|
|
||||||
with:
|
|
||||||
version: snapshot
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
working-directory: gen-gh-pages
|
|
||||||
run: cask install
|
|
||||||
|
|
||||||
- name: Generate HTML
|
|
||||||
working-directory: gen-gh-pages
|
|
||||||
run: |
|
|
||||||
cask exec emacs --script generate-html.el
|
|
||||||
mv ../dotfiles/emacs.d/README.html ./index.html
|
|
||||||
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
|
||||||
uses: peaceiris/actions-gh-pages@v4
|
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
publish_dir: ./gen-gh-pages
|
|
||||||
publish_branch: gh-pages
|
|
||||||
user_name: 'github-actions[bot]'
|
|
||||||
user_email: 'github-actions[bot]@users.noreply.github.com'
|
|
||||||
commit_message: 'Deploy to GitHub Pages: ${{ github.sha }}'
|
|
||||||
keep_files: false
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -25,4 +25,3 @@ gotools
|
|||||||
/dotfiles/config/gtk-3.0/colors.css
|
/dotfiles/config/gtk-3.0/colors.css
|
||||||
/dotfiles/emacs.d/.cache/
|
/dotfiles/emacs.d/.cache/
|
||||||
/dotfiles/config/fontconfig/conf.d/10-hm-fonts.conf
|
/dotfiles/config/fontconfig/conf.d/10-hm-fonts.conf
|
||||||
/dotfiles/config/fontconfig/conf.d/52-hm-default-fonts.conf
|
|
||||||
|
|||||||
8
.travis.yml
Normal file
8
.travis.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
language: generic
|
||||||
|
|
||||||
|
script: bash ./gen-gh-pages/deploy.sh
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- ENCRYPTION_LABEL: "73e6c870aa87"
|
||||||
|
- COMMIT_AUTHOR_EMAIL: "IvanMalison@gmail.com"
|
||||||
|
- COMMIT_AUTHOR_NAME: "Ivan Malison"
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
# Org-Agenda-API Consolidation Design
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Consolidate org-agenda-api container builds and fly.io deployment into the dotfiles repository. This eliminates the separate `colonelpanic-org-agenda-api` repo and provides:
|
|
||||||
|
|
||||||
- Container outputs available to NixOS machines directly
|
|
||||||
- Fly.io deployment from the same repo
|
|
||||||
- Fewer repos to maintain
|
|
||||||
- Cachix integration for faster builds
|
|
||||||
|
|
||||||
## Directory Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
/home/imalison/dotfiles/
|
|
||||||
├── nixos/
|
|
||||||
│ ├── flake.nix # Main flake, adds container output
|
|
||||||
│ ├── org-agenda-api.nix # Existing tangling module (stays here)
|
|
||||||
│ └── ...
|
|
||||||
├── org-agenda-api/
|
|
||||||
│ ├── container.nix # Container build logic (mkContainer, etc.)
|
|
||||||
│ ├── configs/
|
|
||||||
│ │ ├── colonelpanic/
|
|
||||||
│ │ │ ├── custom-config.el
|
|
||||||
│ │ │ └── overrides.el (optional)
|
|
||||||
│ │ └── kat/
|
|
||||||
│ │ └── custom-config.el
|
|
||||||
│ ├── fly/
|
|
||||||
│ │ ├── fly.toml
|
|
||||||
│ │ ├── deploy.sh
|
|
||||||
│ │ └── config-{instance}.env
|
|
||||||
│ └── secrets/
|
|
||||||
│ ├── secrets.nix # agenix declarations
|
|
||||||
│ └── *.age # encrypted secrets
|
|
||||||
└── dotfiles/emacs.d/
|
|
||||||
└── org-config.org # Source of truth for org config
|
|
||||||
```
|
|
||||||
|
|
||||||
## Flake Integration
|
|
||||||
|
|
||||||
The main dotfiles flake at `/home/imalison/dotfiles/nixos/flake.nix` exposes container outputs:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
outputs = inputs @ { self, nixpkgs, flake-utils, ... }:
|
|
||||||
{
|
|
||||||
nixosConfigurations = { ... }; # existing
|
|
||||||
} // flake-utils.lib.eachDefaultSystem (system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs { inherit system; };
|
|
||||||
containerLib = import ../org-agenda-api/container.nix {
|
|
||||||
inherit pkgs system;
|
|
||||||
tangledConfig = (import ./org-agenda-api.nix {
|
|
||||||
inherit pkgs system;
|
|
||||||
inputs = inputs;
|
|
||||||
}).org-agenda-custom-config;
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
packages = {
|
|
||||||
container-colonelpanic = containerLib.mkInstanceContainer "colonelpanic";
|
|
||||||
container-kat = containerLib.mkInstanceContainer "kat";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
Build with: `nix build .#container-colonelpanic`
|
|
||||||
|
|
||||||
## Custom Elisp & Tangling
|
|
||||||
|
|
||||||
Single source of truth: `org-config.org` tangles to elisp files loaded by containers.
|
|
||||||
|
|
||||||
**What stays in custom-config.el (container-specific glue):**
|
|
||||||
- Path overrides (`/data/org` instead of `~/org`)
|
|
||||||
- Stubs for unavailable packages (`org-bullets-mode` no-op)
|
|
||||||
- Customize-to-setq format conversion
|
|
||||||
- Template conversion for org-agenda-api format
|
|
||||||
- Instance-specific settings
|
|
||||||
|
|
||||||
**Audit:** During implementation, verify no actual org logic is duplicated in custom-config.el.
|
|
||||||
|
|
||||||
## Cachix Integration
|
|
||||||
|
|
||||||
### Phase 1: Use upstream cache as substituter
|
|
||||||
|
|
||||||
Add to dotfiles flake's `nixConfig`:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
nixConfig = {
|
|
||||||
extra-substituters = [
|
|
||||||
"https://org-agenda-api.cachix.org"
|
|
||||||
];
|
|
||||||
extra-trusted-public-keys = [
|
|
||||||
"org-agenda-api.cachix.org-1:PUBLIC_KEY_HERE"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
Benefits:
|
|
||||||
- `container-base` (~500MB+ dependencies) fetched from cache
|
|
||||||
- Rebuilds only process the small custom config layer
|
|
||||||
|
|
||||||
### Phase 2 (future): Push custom builds
|
|
||||||
|
|
||||||
Set up GitHub Action or local push for colonelpanic-specific container builds.
|
|
||||||
|
|
||||||
## Fly.io Deployment
|
|
||||||
|
|
||||||
**What moves:**
|
|
||||||
- `fly.toml` → `dotfiles/org-agenda-api/fly/fly.toml`
|
|
||||||
- `deploy.sh` → `dotfiles/org-agenda-api/fly/deploy.sh`
|
|
||||||
- `configs/*/config.env` → `dotfiles/org-agenda-api/fly/config-{instance}.env`
|
|
||||||
- Agenix secrets → `dotfiles/org-agenda-api/secrets/`
|
|
||||||
|
|
||||||
**Deploy script changes:**
|
|
||||||
- Build path: `nix build "../nixos#container-${INSTANCE}"`
|
|
||||||
- Secrets path adjusts to new location
|
|
||||||
- Otherwise same logic
|
|
||||||
|
|
||||||
## Implementation Phases
|
|
||||||
|
|
||||||
### Phase 1: Pull latest & verify current state
|
|
||||||
- Pull latest changes in org-agenda-api and colonelpanic-org-agenda-api
|
|
||||||
- Build container, verify it works
|
|
||||||
- Fix any issues before restructuring
|
|
||||||
|
|
||||||
### Phase 2: Create dotfiles structure
|
|
||||||
- Create `/home/imalison/dotfiles/org-agenda-api/` directory
|
|
||||||
- Move container.nix logic (adapted from current colonelpanic-org-agenda-api flake)
|
|
||||||
- Move instance configs (colonelpanic/, kat/)
|
|
||||||
- Move fly.io deployment files
|
|
||||||
- Move agenix secrets
|
|
||||||
|
|
||||||
### Phase 3: Integrate with dotfiles flake
|
|
||||||
- Update `/home/imalison/dotfiles/nixos/flake.nix` to expose container outputs
|
|
||||||
- Add cachix substituter configuration
|
|
||||||
- Test build from dotfiles: `nix build .#container-colonelpanic`
|
|
||||||
|
|
||||||
### Phase 4: Verify deployment
|
|
||||||
- Test deploy.sh from new location
|
|
||||||
- Verify fly.io deployment works
|
|
||||||
- Run the container locally on a NixOS machine
|
|
||||||
|
|
||||||
### Phase 5: Audit & cleanup
|
|
||||||
- Review custom-config.el for any duplicated org logic
|
|
||||||
- Archive colonelpanic-org-agenda-api repo
|
|
||||||
- Update any references/documentation
|
|
||||||
|
|
||||||
## Repos Affected
|
|
||||||
|
|
||||||
- **dotfiles** - Receives container build + fly.io deployment
|
|
||||||
- **colonelpanic-org-agenda-api** - Becomes obsolete after migration
|
|
||||||
- **org-agenda-api** (upstream) - No changes, used as flake input
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Agentic Session Preferences
|
|
||||||
|
|
||||||
## Tmux session titling
|
|
||||||
- If the TMUX environment variable is set, treat this chat as the controller for the current tmux session.
|
|
||||||
- Maintain a session/window/pane title that updates when the task focus changes substantially.
|
|
||||||
- Prefer automatic titling: infer a concise <task> from the current user request and context without asking.
|
|
||||||
- Title format: "<project> - <task>".
|
|
||||||
- <project> is the basename of the current project directory.
|
|
||||||
- Prefer git repo root basename if available; otherwise use basename of the current working directory.
|
|
||||||
- <task> is a short, user-friendly description of what we are doing.
|
|
||||||
- Ask for a short descriptive <task> only when the task is ambiguous or you are not confident in an inferred title.
|
|
||||||
- When the task changes substantially, update the <task> automatically if clear; otherwise ask for an updated <task>.
|
|
||||||
- When a title is provided or updated, immediately run this one-liner:
|
|
||||||
|
|
||||||
tmux rename-session '<project> - <task>' \; rename-window '<project> - <task>' \; select-pane -T '<project> - <task>'
|
|
||||||
|
|
||||||
- Assume you are inside tmux, so do not use -t unless the user asks to target a specific session.
|
|
||||||
- For Claude Code sessions, a UserPromptSubmit hook will also update titles automatically based on the latest prompt.
|
|
||||||
|
|
||||||
## Pane usage
|
|
||||||
- Do not create extra panes or windows unless the user asks.
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [[ -z "${TMUX:-}" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
input=$(cat)
|
|
||||||
|
|
||||||
read -r cwd prompt <<'PY' < <(python3 - <<'PY'
|
|
||||||
import json, os, sys
|
|
||||||
try:
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
except Exception:
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
cwd = data.get("cwd") or os.getcwd()
|
|
||||||
prompt = (data.get("prompt") or "").strip()
|
|
||||||
print(cwd)
|
|
||||||
print(prompt)
|
|
||||||
PY
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ -z "${cwd}" ]]; then
|
|
||||||
cwd="$PWD"
|
|
||||||
fi
|
|
||||||
|
|
||||||
project_root=$(git -C "$cwd" rev-parse --show-toplevel 2>/dev/null || true)
|
|
||||||
if [[ -n "$project_root" ]]; then
|
|
||||||
project=$(basename "$project_root")
|
|
||||||
else
|
|
||||||
project=$(basename "$cwd")
|
|
||||||
fi
|
|
||||||
|
|
||||||
prompt_first_line=$(printf '%s' "$prompt" | head -n 1 | tr '\n' ' ' | sed -e 's/[[:space:]]\+/ /g' -e 's/^ *//; s/ *$//')
|
|
||||||
|
|
||||||
lower=$(printf '%s' "$prompt_first_line" | tr '[:upper:]' '[:lower:]')
|
|
||||||
case "$lower" in
|
|
||||||
""|"ok"|"okay"|"thanks"|"thx"|"cool"|"yep"|"yes"|"no"|"sure"|"done"|"k")
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
task="$prompt_first_line"
|
|
||||||
if [[ -z "$task" ]]; then
|
|
||||||
task="work"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Trim to a reasonable length for tmux status bars.
|
|
||||||
if [[ ${#task} -gt 60 ]]; then
|
|
||||||
task="${task:0:57}..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
title="$project - $task"
|
|
||||||
|
|
||||||
state_dir="${HOME}/.agents/state"
|
|
||||||
state_file="$state_dir/tmux-title"
|
|
||||||
mkdir -p "$state_dir"
|
|
||||||
|
|
||||||
if [[ -f "$state_file" ]]; then
|
|
||||||
last_title=$(cat "$state_file" 2>/dev/null || true)
|
|
||||||
if [[ "$last_title" == "$title" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '%s' "$title" > "$state_file"
|
|
||||||
|
|
||||||
# Update session, window, and pane titles.
|
|
||||||
tmux rename-session "$title" \; rename-window "$title" \; select-pane -T "$title"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../agents/AGENTS.md
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"enabledPlugins": {
|
|
||||||
"superpowers@superpowers-marketplace": true,
|
|
||||||
"agent-browser@agent-browser": true
|
|
||||||
},
|
|
||||||
"hooks": {
|
|
||||||
"UserPromptSubmit": [
|
|
||||||
{
|
|
||||||
"hooks": [
|
|
||||||
{
|
|
||||||
"type": "command",
|
|
||||||
"command": "~/.agents/hooks/tmux-title.sh"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
{
|
|
||||||
"permissions": {
|
|
||||||
"allow": [
|
|
||||||
"Bash(find:*)",
|
|
||||||
"Bash(cat:*)"
|
|
||||||
],
|
|
||||||
"deny": []
|
|
||||||
},
|
|
||||||
"mcp": {
|
|
||||||
"servers": {
|
|
||||||
"gitea-mcp": {
|
|
||||||
"command": "docker",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"-i",
|
|
||||||
"--rm",
|
|
||||||
"-e",
|
|
||||||
"GITEA_ACCESS_TOKEN=ad1e513137d5a15b638f7b4b5f65e1bda1c70cd7",
|
|
||||||
"-e",
|
|
||||||
"GITEA_BASE_URL=https://dev.railbird.ai",
|
|
||||||
"docker.gitea.com/gitea-mcp-server"
|
|
||||||
],
|
|
||||||
"env": {
|
|
||||||
"GITEA_ACCESS_TOKEN": "ad1e513137d5a15b638f7b4b5f65e1bda1c70cd7",
|
|
||||||
"GITEA_BASE_URL": "https://dev.railbird.ai"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chrome-devtools": {
|
|
||||||
"command": "npx",
|
|
||||||
"args": [
|
|
||||||
"chrome-devtools-mcp@latest",
|
|
||||||
"--auto-connect"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"imap-email": {
|
|
||||||
"command": "npx",
|
|
||||||
"args": ["-y", "imap-email-mcp"],
|
|
||||||
"env": {
|
|
||||||
"IMAP_USER": "IvanMalison@gmail.com",
|
|
||||||
"IMAP_PASSWORD": "iiobqyuuczibsnmi",
|
|
||||||
"IMAP_HOST": "imap.gmail.com"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"enabledMcpjsonServers": [
|
|
||||||
"chrome-devtools",
|
|
||||||
"imap-email"
|
|
||||||
],
|
|
||||||
"enableAllProjectMcpServers": true
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../agents/AGENTS.md
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
model = "gpt-5.2-codex"
|
|
||||||
model_reasoning_effort = "high"
|
|
||||||
personality = "pragmatic"
|
|
||||||
[projects."/home/imalison/Projects/nixpkgs"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/dotfiles"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/Projects/railbird"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/Projects/subtr-actor"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/Projects/google-messages-api"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/Projects/scrobble-scrubber"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/temp"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/Projects/org-agenda-api"]
|
|
||||||
trust_level = "untrusted"
|
|
||||||
|
|
||||||
[projects."/home/imalison/org"]
|
|
||||||
trust_level = "trusted"
|
|
||||||
|
|
||||||
[notice]
|
|
||||||
hide_gpt5_1_migration_prompt = true
|
|
||||||
"hide_gpt-5.1-codex-max_migration_prompt" = true
|
|
||||||
|
|
||||||
[notice.model_migrations]
|
|
||||||
"gpt-5.2" = "gpt-5.2-codex"
|
|
||||||
|
|
||||||
[mcp_servers.chrome-devtools]
|
|
||||||
command = "npx"
|
|
||||||
args = ["-y", "chrome-devtools-mcp@latest", "--auto-connect"]
|
|
||||||
|
|
||||||
[mcp_servers.observability]
|
|
||||||
command = "npx"
|
|
||||||
args = ["-y", "@google-cloud/observability-mcp"]
|
|
||||||
|
|
||||||
[mcp_servers.gmail]
|
|
||||||
command = "nix"
|
|
||||||
args = ["run", "/home/imalison/Projects/gmail-mcp#gmail-mcp-server"]
|
|
||||||
|
|
||||||
[features]
|
|
||||||
unified_exec = true
|
|
||||||
apps = true
|
|
||||||
steer = true
|
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
[general]
|
import = ["/home/imalison/.config/alacritty/themes/themes/dracula.toml"]
|
||||||
import = ["~/.config/alacritty/themes/themes/dracula.toml"]
|
|
||||||
|
|
||||||
[font]
|
[font]
|
||||||
size = 12
|
size = 8
|
||||||
|
|
||||||
[scrolling]
|
[scrolling]
|
||||||
history = 10000
|
history = 10000
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
output DP-1
|
|
||||||
off
|
|
||||||
output HDMI-1
|
|
||||||
off
|
|
||||||
output DP-2
|
|
||||||
off
|
|
||||||
output HDMI-2
|
|
||||||
off
|
|
||||||
output DP-1-0
|
|
||||||
off
|
|
||||||
output DP-1-1
|
|
||||||
off
|
|
||||||
output DP-1-2
|
|
||||||
off
|
|
||||||
output DP-1-3
|
|
||||||
off
|
|
||||||
output DP-1-4
|
|
||||||
off
|
|
||||||
output DP-1-5
|
|
||||||
off
|
|
||||||
output DP-1-6
|
|
||||||
off
|
|
||||||
output eDP-1
|
|
||||||
crtc 0
|
|
||||||
mode 2560x1600
|
|
||||||
pos 0x0
|
|
||||||
primary
|
|
||||||
rate 240.00
|
|
||||||
x-prop-broadcast_rgb Automatic
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 12
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
x-prop-scaling_mode Full aspect
|
|
||||||
output HDMI-1-0
|
|
||||||
crtc 4
|
|
||||||
mode 3440x1440
|
|
||||||
pos 2560x0
|
|
||||||
rate 99.98
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
HDMI-1-0 00ffffffffffff0010ace3a1535a333016210103805123782a25a1b14d3db7250e505421080001010101010101010101010101010101e77c70a0d0a029503020350029623100001a000000ff00237442737a474441594542634e000000fd0018781e963c010a202020202020000000fc0044656c6c204157333432334457015f020337f148101f04130312013f230907018301000068030c002000383c006ad85dc401788000000278e305c000e2006ae60605018d4b004ed470a0d0a046503020350029623100001a9d6770a0d0a022503020350029623100001a565e00a0a0a029503020350029623100001a6fc200a0a0a055503020350029623100001a3c
|
|
||||||
eDP-1 00ffffffffffff0009e5580c0000000001210104b527187803bbc5ae503fb7250c515500000001010101010101010101010101010101c07200a0a040c8603020360084f21000001a000000fd0c30f0b1b176010a202020202020000000fe00424f452043510a202020202020000000fc004e4531383051444d2d4e4d310a029602030f00e3058080e606050195731000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa702079020021001d280f7409000a400680dd2a511824b249120e023554b060ec64662a1378220014ffed1185ff099f002f001f003f06c700020005002b000c27003cef00002700303b0000810015741a0000030b30f0006095107310f0000000008d00000000000000000000000000000000000000000000000000000000bc90
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
output DP-1
|
|
||||||
off
|
|
||||||
output HDMI-1
|
|
||||||
off
|
|
||||||
output DP-2
|
|
||||||
off
|
|
||||||
output HDMI-2
|
|
||||||
off
|
|
||||||
output DP-1-0
|
|
||||||
off
|
|
||||||
output DP-1-1
|
|
||||||
off
|
|
||||||
output DP-1-2
|
|
||||||
off
|
|
||||||
output DP-1-3
|
|
||||||
off
|
|
||||||
output DP-1-4
|
|
||||||
off
|
|
||||||
output DP-1-5
|
|
||||||
off
|
|
||||||
output DP-1-6
|
|
||||||
off
|
|
||||||
output eDP-1
|
|
||||||
crtc 0
|
|
||||||
mode 2560x1600
|
|
||||||
pos 0x0
|
|
||||||
primary
|
|
||||||
rate 240.00
|
|
||||||
x-prop-broadcast_rgb Automatic
|
|
||||||
x-prop-colorspace Default
|
|
||||||
x-prop-max_bpc 12
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
x-prop-scaling_mode Full aspect
|
|
||||||
output HDMI-1-0
|
|
||||||
crtc 4
|
|
||||||
mode 3440x1440
|
|
||||||
pos 2560x0
|
|
||||||
rate 99.98
|
|
||||||
x-prop-non_desktop 0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
HDMI-1-0 00ffffffffffff0010ace3a1535a333016210103805123782a25a1b14d3db7250e505421080001010101010101010101010101010101e77c70a0d0a029503020350029623100001a000000ff00237442737a474441594542634e000000fd0018781e963c010a202020202020000000fc0044656c6c204157333432334457015f020337f148101f04130312013f230907018301000068030c003000383c006ad85dc401788000000278e305c000e2006ae60605018d4b004ed470a0d0a046503020350029623100001a9d6770a0d0a022503020350029623100001a565e00a0a0a029503020350029623100001a6fc200a0a0a055503020350029623100001a2c
|
|
||||||
eDP-1 00ffffffffffff0009e5580c0000000001210104b527187803bbc5ae503fb7250c515500000001010101010101010101010101010101c07200a0a040c8603020360084f21000001a000000fd0c30f0b1b176010a202020202020000000fe00424f452043510a202020202020000000fc004e4531383051444d2d4e4d310a029602030f00e3058080e606050195731000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fa702079020021001d280f7409000a400680dd2a511824b249120e023554b060ec64662a1378220014ffed1185ff099f002f001f003f06c700020005002b000c27003cef00002700303b0000810015741a0000030b30f0006095107310f0000000008d00000000000000000000000000000000000000000000000000000000bc90
|
|
||||||
27
dotfiles/config/clipit/clipitrc
Normal file
27
dotfiles/config/clipit/clipitrc
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
[rc]
|
||||||
|
use_copy=true
|
||||||
|
use_primary=true
|
||||||
|
synchronize=false
|
||||||
|
automatic_paste=false
|
||||||
|
show_indexes=true
|
||||||
|
save_uris=true
|
||||||
|
use_rmb_menu=false
|
||||||
|
save_history=true
|
||||||
|
history_limit=1000
|
||||||
|
history_timeout_seconds=30
|
||||||
|
history_timeout=false
|
||||||
|
items_menu=50
|
||||||
|
statics_show=true
|
||||||
|
statics_items=10
|
||||||
|
hyperlinks_only=false
|
||||||
|
confirm_clear=false
|
||||||
|
single_line=false
|
||||||
|
reverse_history=false
|
||||||
|
item_length=50
|
||||||
|
ellipsize=2
|
||||||
|
history_key=
|
||||||
|
actions_key=
|
||||||
|
menu_key=
|
||||||
|
search_key=
|
||||||
|
offline_key=
|
||||||
|
offline_mode=false
|
||||||
@@ -1,573 +0,0 @@
|
|||||||
# Hyprland Configuration
|
|
||||||
# XMonad-like dynamic tiling using hy3 plugin
|
|
||||||
# Based on XMonad configuration from xmonad.hs
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# PLUGINS (Hyprland pinned to 0.53.0 to match hy3)
|
|
||||||
# =============================================================================
|
|
||||||
# Load the plugin before parsing keybinds/layouts that depend on it
|
|
||||||
plugin = /run/current-system/sw/lib/libhy3.so
|
|
||||||
plugin = /run/current-system/sw/lib/libhyprexpo.so
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# MONITORS
|
|
||||||
# =============================================================================
|
|
||||||
monitor=,preferred,auto,1
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# PROGRAMS
|
|
||||||
# =============================================================================
|
|
||||||
$terminal = alacritty
|
|
||||||
$fileManager = dolphin
|
|
||||||
$menu = rofi -show drun -show-icons
|
|
||||||
$runMenu = rofi -show run
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# ENVIRONMENT VARIABLES
|
|
||||||
# =============================================================================
|
|
||||||
env = XCURSOR_SIZE,24
|
|
||||||
env = QT_QPA_PLATFORMTHEME,qt5ct
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# INPUT CONFIGURATION
|
|
||||||
# =============================================================================
|
|
||||||
input {
|
|
||||||
kb_layout = us
|
|
||||||
kb_variant =
|
|
||||||
kb_model =
|
|
||||||
kb_options =
|
|
||||||
kb_rules =
|
|
||||||
|
|
||||||
follow_mouse = 1
|
|
||||||
|
|
||||||
touchpad {
|
|
||||||
natural_scroll = no
|
|
||||||
}
|
|
||||||
|
|
||||||
sensitivity = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Cursor warping behavior
|
|
||||||
cursor {
|
|
||||||
persistent_warps = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# GENERAL SETTINGS
|
|
||||||
# =============================================================================
|
|
||||||
general {
|
|
||||||
gaps_in = 5
|
|
||||||
gaps_out = 10
|
|
||||||
border_size = 2
|
|
||||||
col.active_border = rgba(edb443ee) rgba(33ccffee) 45deg
|
|
||||||
col.inactive_border = rgba(595959aa)
|
|
||||||
|
|
||||||
# Use hy3 layout for XMonad-like dynamic tiling
|
|
||||||
layout = hy3
|
|
||||||
|
|
||||||
allow_tearing = false
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# DECORATION
|
|
||||||
# =============================================================================
|
|
||||||
decoration {
|
|
||||||
rounding = 5
|
|
||||||
|
|
||||||
blur {
|
|
||||||
enabled = true
|
|
||||||
size = 3
|
|
||||||
passes = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fade inactive windows (like XMonad's fadeInactive)
|
|
||||||
active_opacity = 1.0
|
|
||||||
inactive_opacity = 0.9
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# ANIMATIONS
|
|
||||||
# =============================================================================
|
|
||||||
animations {
|
|
||||||
enabled = yes
|
|
||||||
|
|
||||||
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
|
|
||||||
bezier = linear, 0, 0, 1, 1
|
|
||||||
|
|
||||||
animation = windows, 1, 4, myBezier
|
|
||||||
animation = windowsOut, 1, 4, default, popin 80%
|
|
||||||
animation = border, 1, 10, default
|
|
||||||
animation = borderangle, 1, 8, default
|
|
||||||
animation = fade, 1, 4, default
|
|
||||||
animation = workspaces, 1, 4, default
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# MASTER LAYOUT CONFIGURATION
|
|
||||||
# =============================================================================
|
|
||||||
master {
|
|
||||||
new_status = slave
|
|
||||||
mfact = 0.5
|
|
||||||
orientation = left
|
|
||||||
}
|
|
||||||
|
|
||||||
# Dwindle layout (alternative - binary tree like i3)
|
|
||||||
dwindle {
|
|
||||||
pseudotile = yes
|
|
||||||
preserve_split = yes
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# WORKSPACE RULES (SMART GAPS)
|
|
||||||
# =============================================================================
|
|
||||||
# Replace no_gaps_when_only (removed in newer Hyprland)
|
|
||||||
# Remove gaps when there's only one visible tiled window (ignore special workspaces)
|
|
||||||
workspace = w[tv1]s[false], gapsout:0, gapsin:0
|
|
||||||
workspace = f[1]s[false], gapsout:0, gapsin:0
|
|
||||||
|
|
||||||
# Group/tabbed window configuration (built-in alternative to hy3 tabs)
|
|
||||||
group {
|
|
||||||
col.border_active = rgba(edb443ff)
|
|
||||||
col.border_inactive = rgba(091f2eff)
|
|
||||||
|
|
||||||
groupbar {
|
|
||||||
enabled = true
|
|
||||||
font_size = 12
|
|
||||||
height = 22
|
|
||||||
col.active = rgba(edb443ff)
|
|
||||||
col.inactive = rgba(091f2eff)
|
|
||||||
text_color = rgba(091f2eff)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# HY3/HYPREXPO PLUGIN CONFIG
|
|
||||||
# =============================================================================
|
|
||||||
plugin {
|
|
||||||
hy3 {
|
|
||||||
# Disable autotile to get XMonad-like manual control
|
|
||||||
autotile {
|
|
||||||
enable = false
|
|
||||||
}
|
|
||||||
|
|
||||||
# Tab configuration
|
|
||||||
tabs {
|
|
||||||
height = 22
|
|
||||||
padding = 6
|
|
||||||
render_text = true
|
|
||||||
text_font = "Sans"
|
|
||||||
text_height = 10
|
|
||||||
text_padding = 3
|
|
||||||
col.active = rgba(edb443ff)
|
|
||||||
col.inactive = rgba(091f2eff)
|
|
||||||
col.urgent = rgba(ff0000ff)
|
|
||||||
col.text.active = rgba(091f2eff)
|
|
||||||
col.text.inactive = rgba(ffffffff)
|
|
||||||
col.text.urgent = rgba(ffffffff)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hyprexpo {
|
|
||||||
# Always include workspace 1 in the overview grid
|
|
||||||
workspace_method = first 1
|
|
||||||
# Only show workspaces with windows
|
|
||||||
skip_empty = true
|
|
||||||
# 3 columns -> 3x3 grid when 9 workspaces are visible
|
|
||||||
columns = 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# MISC
|
|
||||||
# =============================================================================
|
|
||||||
misc {
|
|
||||||
force_default_wallpaper = 0
|
|
||||||
disable_hyprland_logo = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# BINDS OPTIONS
|
|
||||||
# =============================================================================
|
|
||||||
binds {
|
|
||||||
# Keep workspace history so "previous" can toggle back reliably.
|
|
||||||
allow_workspace_cycles = true
|
|
||||||
workspace_back_and_forth = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# WINDOW RULES
|
|
||||||
# =============================================================================
|
|
||||||
# Float dialogs
|
|
||||||
windowrulev2 = float, class:^()$,title:^()$
|
|
||||||
windowrulev2 = float, title:^(Picture-in-Picture)$
|
|
||||||
windowrulev2 = float, title:^(Open File)$
|
|
||||||
windowrulev2 = float, title:^(Save File)$
|
|
||||||
windowrulev2 = float, title:^(Confirm)$
|
|
||||||
|
|
||||||
# Scratchpad windows - float and size
|
|
||||||
windowrulev2 = workspace special:htop silent, class:^(htop-scratch)$
|
|
||||||
windowrulev2 = float, class:^(htop-scratch)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(htop-scratch)$
|
|
||||||
windowrulev2 = center, class:^(htop-scratch)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:volume silent, class:^(?i)(pavucontrol|pavucontrol-qt|org\.pulseaudio\.pavucontrol)$
|
|
||||||
windowrulev2 = float, class:^(?i)(pavucontrol|pavucontrol-qt|org\.pulseaudio\.pavucontrol)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(?i)(pavucontrol|pavucontrol-qt|org\.pulseaudio\.pavucontrol)$
|
|
||||||
windowrulev2 = center, class:^(?i)(pavucontrol|pavucontrol-qt|org\.pulseaudio\.pavucontrol)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:spotify silent, class:^(spotify)$
|
|
||||||
windowrulev2 = float, class:^(spotify)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(spotify)$
|
|
||||||
windowrulev2 = center, class:^(spotify)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:element silent, class:^(Element)$
|
|
||||||
windowrulev2 = float, class:^(Element)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(Element)$
|
|
||||||
windowrulev2 = center, class:^(Element)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:slack silent, class:^(Slack)$
|
|
||||||
windowrulev2 = float, class:^(Slack)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(Slack)$
|
|
||||||
windowrulev2 = center, class:^(Slack)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:transmission silent, class:^(transmission-gtk)$
|
|
||||||
windowrulev2 = float, class:^(transmission-gtk)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(transmission-gtk)$
|
|
||||||
windowrulev2 = center, class:^(transmission-gtk)$
|
|
||||||
|
|
||||||
# Gmail and Messages (Chrome windows)
|
|
||||||
windowrulev2 = workspace special:gmail silent, class:^(google-chrome)$,title:^(.*@gmail.com.*Gmail.*)$
|
|
||||||
windowrulev2 = float, class:^(google-chrome)$,title:^(.*@gmail.com.*Gmail.*)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(google-chrome)$,title:^(.*@gmail.com.*Gmail.*)$
|
|
||||||
windowrulev2 = center, class:^(google-chrome)$,title:^(.*@gmail.com.*Gmail.*)$
|
|
||||||
|
|
||||||
windowrulev2 = workspace special:messages silent, class:^(google-chrome)$,title:^(Messages.*)$
|
|
||||||
windowrulev2 = float, class:^(google-chrome)$,title:^(Messages.*)$
|
|
||||||
windowrulev2 = size 90% 90%, class:^(google-chrome)$,title:^(Messages.*)$
|
|
||||||
windowrulev2 = center, class:^(google-chrome)$,title:^(Messages.*)$
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# KEY BINDINGS
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# Modifier keys
|
|
||||||
$mainMod = SUPER
|
|
||||||
$modAlt = SUPER ALT
|
|
||||||
$hyper = SUPER CTRL ALT
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# Program Launching
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
bind = $mainMod, P, exec, $menu
|
|
||||||
bind = $mainMod SHIFT, P, exec, $runMenu
|
|
||||||
bind = $mainMod SHIFT, Return, exec, $terminal
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# Overview (Hyprexpo)
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
bind = $mainMod, TAB, hyprexpo:expo, toggle
|
|
||||||
bind = $mainMod, Q, killactive,
|
|
||||||
bind = $mainMod SHIFT, C, killactive,
|
|
||||||
bind = $mainMod SHIFT, Q, exit,
|
|
||||||
# Emacs-everywhere (like XMonad's emacs-everywhere)
|
|
||||||
bind = $mainMod, E, exec, emacsclient --eval '(emacs-everywhere)'
|
|
||||||
bind = $mainMod, V, exec, wl-paste | xdotool type --file -
|
|
||||||
|
|
||||||
# Chrome/Browser (raise or spawn like XMonad's bindBringAndRaise)
|
|
||||||
bind = $modAlt, C, exec, ~/.config/hypr/scripts/raise-or-run.sh google-chrome google-chrome-stable
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# SCRATCHPADS (Special Workspaces)
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# Toggle scratchpads
|
|
||||||
bind = $modAlt, E, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh element '^Element$' - element-desktop
|
|
||||||
bind = $modAlt, G, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh gmail '^google-chrome$' '.*@gmail.com.*Gmail.*' google-chrome-stable --new-window https://mail.google.com/mail/u/0/#inbox
|
|
||||||
bind = $modAlt, H, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh htop '^htop-scratch$' - alacritty --class htop-scratch --title htop -e htop
|
|
||||||
bind = $modAlt, M, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh messages '^google-chrome$' '^Messages.*' google-chrome-stable --new-window https://messages.google.com/web/conversations
|
|
||||||
bind = $modAlt, K, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh slack '^Slack$' - slack
|
|
||||||
bind = $modAlt, S, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh spotify '^spotify$' - spotify
|
|
||||||
bind = $modAlt, T, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh transmission '^transmission-gtk$' - transmission-gtk
|
|
||||||
bind = $modAlt, V, exec, ~/.config/hypr/scripts/toggle-scratchpad.sh volume '^(pavucontrol|pavucontrol-qt|org\.pulseaudio\.pavucontrol)$' - pavucontrol
|
|
||||||
|
|
||||||
# Move windows to scratchpads
|
|
||||||
bind = $modAlt SHIFT, E, movetoworkspace, special:element
|
|
||||||
bind = $modAlt SHIFT, G, movetoworkspace, special:gmail
|
|
||||||
bind = $modAlt SHIFT, H, movetoworkspace, special:htop
|
|
||||||
bind = $modAlt SHIFT, M, movetoworkspace, special:messages
|
|
||||||
bind = $modAlt SHIFT, K, movetoworkspace, special:slack
|
|
||||||
bind = $modAlt SHIFT, S, movetoworkspace, special:spotify
|
|
||||||
bind = $modAlt SHIFT, T, movetoworkspace, special:transmission
|
|
||||||
bind = $modAlt SHIFT, V, movetoworkspace, special:volume
|
|
||||||
|
|
||||||
# Hidden workspace (like XMonad's NSP)
|
|
||||||
bind = $mainMod, X, movetoworkspace, special:NSP
|
|
||||||
bind = $mainMod SHIFT, X, togglespecialworkspace, NSP
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# DIRECTIONAL NAVIGATION (WASD - like XMonad Navigation2D)
|
|
||||||
# Using hy3 dispatchers for proper tree-based navigation
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Focus movement (Mod + WASD) - hy3:movefocus navigates the tree
|
|
||||||
bind = $mainMod, W, hy3:movefocus, u
|
|
||||||
bind = $mainMod, S, hy3:movefocus, d
|
|
||||||
bind = $mainMod, A, hy3:movefocus, l
|
|
||||||
bind = $mainMod, D, hy3:movefocus, r
|
|
||||||
|
|
||||||
# Move windows (Mod + Shift + WASD) - hy3:movewindow with once=true for swapping
|
|
||||||
bind = $mainMod SHIFT, W, hy3:movewindow, u, once
|
|
||||||
bind = $mainMod SHIFT, S, hy3:movewindow, d, once
|
|
||||||
bind = $mainMod SHIFT, A, hy3:movewindow, l, once
|
|
||||||
bind = $mainMod SHIFT, D, hy3:movewindow, r, once
|
|
||||||
|
|
||||||
# Resize windows (Mod + Ctrl + WASD)
|
|
||||||
binde = $mainMod CTRL, W, resizeactive, 0 -50
|
|
||||||
binde = $mainMod CTRL, S, resizeactive, 0 50
|
|
||||||
binde = $mainMod CTRL, A, resizeactive, -50 0
|
|
||||||
binde = $mainMod CTRL, D, resizeactive, 50 0
|
|
||||||
|
|
||||||
# Screen/Monitor focus (Hyper + WASD)
|
|
||||||
bind = $hyper, W, focusmonitor, u
|
|
||||||
bind = $hyper, S, focusmonitor, d
|
|
||||||
bind = $hyper, A, focusmonitor, l
|
|
||||||
bind = $hyper, D, focusmonitor, r
|
|
||||||
|
|
||||||
# Move window to monitor and follow (Hyper + Shift + WASD)
|
|
||||||
bind = $hyper SHIFT, W, movewindow, mon:u
|
|
||||||
bind = $hyper SHIFT, S, movewindow, mon:d
|
|
||||||
bind = $hyper SHIFT, A, movewindow, mon:l
|
|
||||||
bind = $hyper SHIFT, D, movewindow, mon:r
|
|
||||||
|
|
||||||
# Shift to empty workspace on screen direction (Hyper + Ctrl + WASD)
|
|
||||||
# Like XMonad's shiftToEmptyOnScreen
|
|
||||||
bind = $hyper CTRL, W, exec, ~/.config/hypr/scripts/shift-to-empty-on-screen.sh u
|
|
||||||
bind = $hyper CTRL, S, exec, ~/.config/hypr/scripts/shift-to-empty-on-screen.sh d
|
|
||||||
bind = $hyper CTRL, A, exec, ~/.config/hypr/scripts/shift-to-empty-on-screen.sh l
|
|
||||||
bind = $hyper CTRL, D, exec, ~/.config/hypr/scripts/shift-to-empty-on-screen.sh r
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# LAYOUT CONTROL (XMonad-like with hy3)
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Create groups with different orientations (like XMonad layouts)
|
|
||||||
# hy3:makegroup creates a split/tab group from focused window
|
|
||||||
bind = $mainMod, Space, hy3:changegroup, toggletab
|
|
||||||
bind = $mainMod SHIFT, Space, hy3:changegroup, opposite
|
|
||||||
|
|
||||||
# Create specific group types
|
|
||||||
bind = $mainMod, H, hy3:makegroup, h
|
|
||||||
bind = $mainMod SHIFT, V, hy3:makegroup, v
|
|
||||||
# Mod+Ctrl+Space mirrors Mod+Space (tabs instead of fullscreen)
|
|
||||||
bind = $mainMod CTRL, Space, hy3:changegroup, toggletab
|
|
||||||
|
|
||||||
# Change group type (cycle h -> v -> tab)
|
|
||||||
bind = $mainMod, slash, hy3:changegroup, h
|
|
||||||
bind = $mainMod SHIFT, slash, hy3:changegroup, v
|
|
||||||
|
|
||||||
# Tab navigation (like XMonad's focus next/prev in tabbed)
|
|
||||||
bind = $mainMod, bracketright, hy3:focustab, r, wrap
|
|
||||||
bind = $mainMod, bracketleft, hy3:focustab, l, wrap
|
|
||||||
|
|
||||||
# Move window within tab group (hy3 has no movetab dispatcher)
|
|
||||||
bind = $mainMod SHIFT, bracketright, hy3:movewindow, r, visible
|
|
||||||
bind = $mainMod SHIFT, bracketleft, hy3:movewindow, l, visible
|
|
||||||
|
|
||||||
# Expand focus to parent group (like XMonad's focus parent)
|
|
||||||
bind = $mainMod, grave, hy3:expand, expand
|
|
||||||
bind = $mainMod SHIFT, grave, hy3:expand, base
|
|
||||||
|
|
||||||
# Fullscreen (like XMonad's NBFULL toggle)
|
|
||||||
bind = $mainMod, F, fullscreen, 0
|
|
||||||
bind = $mainMod SHIFT, F, fullscreen, 1
|
|
||||||
|
|
||||||
# Toggle floating
|
|
||||||
bind = $mainMod, T, togglefloating,
|
|
||||||
|
|
||||||
# Resize split ratio (hy3 uses resizeactive for splits)
|
|
||||||
binde = $mainMod, comma, resizeactive, -50 0
|
|
||||||
binde = $mainMod, period, resizeactive, 50 0
|
|
||||||
|
|
||||||
# Equalize window sizes on workspace (hy3)
|
|
||||||
bind = $mainMod SHIFT, equal, hy3:equalize, workspace
|
|
||||||
|
|
||||||
# Kill group - removes the focused window from its group
|
|
||||||
bind = $mainMod, N, hy3:killactive
|
|
||||||
|
|
||||||
# hy3:setswallow - set a window to swallow newly spawned windows
|
|
||||||
bind = $mainMod, M, hy3:setswallow, toggle
|
|
||||||
|
|
||||||
# Minimize to special workspace (like XMonad's minimizeWindow)
|
|
||||||
bind = $mainMod SHIFT, M, movetoworkspace, special:minimized
|
|
||||||
# Restore last minimized
|
|
||||||
bind = $modAlt, Return, togglespecialworkspace, minimized
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# WORKSPACE CONTROL
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Switch workspaces (1-9, 0=10)
|
|
||||||
bind = $mainMod, 1, workspace, 1
|
|
||||||
bind = $mainMod, 2, workspace, 2
|
|
||||||
bind = $mainMod, 3, workspace, 3
|
|
||||||
bind = $mainMod, 4, workspace, 4
|
|
||||||
bind = $mainMod, 5, workspace, 5
|
|
||||||
bind = $mainMod, 6, workspace, 6
|
|
||||||
bind = $mainMod, 7, workspace, 7
|
|
||||||
bind = $mainMod, 8, workspace, 8
|
|
||||||
bind = $mainMod, 9, workspace, 9
|
|
||||||
bind = $mainMod, 0, workspace, 10
|
|
||||||
|
|
||||||
# Move window to workspace
|
|
||||||
bind = $mainMod SHIFT, 1, movetoworkspace, 1
|
|
||||||
bind = $mainMod SHIFT, 2, movetoworkspace, 2
|
|
||||||
bind = $mainMod SHIFT, 3, movetoworkspace, 3
|
|
||||||
bind = $mainMod SHIFT, 4, movetoworkspace, 4
|
|
||||||
bind = $mainMod SHIFT, 5, movetoworkspace, 5
|
|
||||||
bind = $mainMod SHIFT, 6, movetoworkspace, 6
|
|
||||||
bind = $mainMod SHIFT, 7, movetoworkspace, 7
|
|
||||||
bind = $mainMod SHIFT, 8, movetoworkspace, 8
|
|
||||||
bind = $mainMod SHIFT, 9, movetoworkspace, 9
|
|
||||||
bind = $mainMod SHIFT, 0, movetoworkspace, 10
|
|
||||||
|
|
||||||
# Move and follow to workspace (like XMonad's shiftThenView)
|
|
||||||
bind = $mainMod CTRL, 1, movetoworkspacesilent, 1
|
|
||||||
bind = $mainMod CTRL, 1, workspace, 1
|
|
||||||
bind = $mainMod CTRL, 2, movetoworkspacesilent, 2
|
|
||||||
bind = $mainMod CTRL, 2, workspace, 2
|
|
||||||
bind = $mainMod CTRL, 3, movetoworkspacesilent, 3
|
|
||||||
bind = $mainMod CTRL, 3, workspace, 3
|
|
||||||
bind = $mainMod CTRL, 4, movetoworkspacesilent, 4
|
|
||||||
bind = $mainMod CTRL, 4, workspace, 4
|
|
||||||
bind = $mainMod CTRL, 5, movetoworkspacesilent, 5
|
|
||||||
bind = $mainMod CTRL, 5, workspace, 5
|
|
||||||
bind = $mainMod CTRL, 6, movetoworkspacesilent, 6
|
|
||||||
bind = $mainMod CTRL, 6, workspace, 6
|
|
||||||
bind = $mainMod CTRL, 7, movetoworkspacesilent, 7
|
|
||||||
bind = $mainMod CTRL, 7, workspace, 7
|
|
||||||
bind = $mainMod CTRL, 8, movetoworkspacesilent, 8
|
|
||||||
bind = $mainMod CTRL, 8, workspace, 8
|
|
||||||
bind = $mainMod CTRL, 9, movetoworkspacesilent, 9
|
|
||||||
bind = $mainMod CTRL, 9, workspace, 9
|
|
||||||
bind = $mainMod CTRL, 0, movetoworkspacesilent, 10
|
|
||||||
bind = $mainMod CTRL, 0, workspace, 10
|
|
||||||
|
|
||||||
# Workspace cycling (like XMonad's cycleWorkspaceOnCurrentScreen)
|
|
||||||
bind = $mainMod, backslash, exec, ~/.config/hypr/scripts/workspace-back.sh
|
|
||||||
|
|
||||||
# Swap current workspace with another (like XMonad's swapWithCurrent)
|
|
||||||
bind = $hyper, 5, exec, ~/.config/hypr/scripts/swap-workspaces.sh
|
|
||||||
|
|
||||||
# Go to next empty workspace (like XMonad's moveTo Next emptyWS)
|
|
||||||
bind = $hyper, E, workspace, empty
|
|
||||||
|
|
||||||
# Move to next screen (like XMonad's shiftToNextScreenX)
|
|
||||||
bind = $mainMod, Z, focusmonitor, +1
|
|
||||||
bind = $mainMod SHIFT, Z, movewindow, mon:+1
|
|
||||||
|
|
||||||
# Shift to empty workspace and view (like XMonad's shiftToEmptyAndView)
|
|
||||||
bind = $mainMod SHIFT, H, movetoworkspace, empty
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# WINDOW MANAGEMENT
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Go to window (rofi window switcher)
|
|
||||||
bind = $mainMod, G, exec, rofi -show window -show-icons
|
|
||||||
|
|
||||||
# Bring window (move to current workspace)
|
|
||||||
bind = $mainMod, B, exec, ~/.config/hypr/scripts/bring-window.sh
|
|
||||||
|
|
||||||
# Replace window (swap focused with selected - like XMonad's myReplaceWindow)
|
|
||||||
bind = $mainMod SHIFT, B, exec, ~/.config/hypr/scripts/replace-window.sh
|
|
||||||
|
|
||||||
# Gather windows of same class (like XMonad's gatherThisClass)
|
|
||||||
bind = $hyper, G, exec, ~/.config/hypr/scripts/gather-class.sh
|
|
||||||
|
|
||||||
# Focus next window of different class (like XMonad's focusNextClass)
|
|
||||||
bind = $mainMod, apostrophe, exec, ~/.config/hypr/scripts/focus-next-class.sh
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# MEDIA KEYS
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Volume control (matching XMonad: Mod+I=up, Mod+K=down, Mod+U=mute)
|
|
||||||
binde = , XF86AudioRaiseVolume, exec, set_volume --unmute --change-volume +5
|
|
||||||
binde = , XF86AudioLowerVolume, exec, set_volume --unmute --change-volume -5
|
|
||||||
bind = , XF86AudioMute, exec, set_volume --toggle-mute
|
|
||||||
binde = $mainMod, I, exec, set_volume --unmute --change-volume +5
|
|
||||||
binde = $mainMod, K, exec, set_volume --unmute --change-volume -5
|
|
||||||
bind = $mainMod, U, exec, set_volume --toggle-mute
|
|
||||||
|
|
||||||
# Media player controls (matching XMonad: Mod+;=play, Mod+L=next, Mod+J=prev)
|
|
||||||
bind = $mainMod, semicolon, exec, playerctl play-pause
|
|
||||||
bind = , XF86AudioPlay, exec, playerctl play-pause
|
|
||||||
bind = , XF86AudioPause, exec, playerctl play-pause
|
|
||||||
bind = $mainMod, L, exec, playerctl next
|
|
||||||
bind = , XF86AudioNext, exec, playerctl next
|
|
||||||
bind = $mainMod, J, exec, playerctl previous
|
|
||||||
bind = , XF86AudioPrev, exec, playerctl previous
|
|
||||||
|
|
||||||
# Mute current window (like XMonad's toggle_mute_current_window)
|
|
||||||
bind = $hyper SHIFT, Q, exec, toggle_mute_current_window.sh
|
|
||||||
bind = $hyper CTRL, Q, exec, toggle_mute_current_window.sh only
|
|
||||||
|
|
||||||
# Brightness control
|
|
||||||
binde = , XF86MonBrightnessUp, exec, brightness.sh up
|
|
||||||
binde = , XF86MonBrightnessDown, exec, brightness.sh down
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# UTILITY BINDINGS
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
bind = $hyper, V, exec, cliphist list | rofi -dmenu -p "Clipboard" | cliphist decode | wl-copy
|
|
||||||
bind = $hyper, P, exec, rofi-pass
|
|
||||||
bind = $hyper, H, exec, grim -g "$(slurp)" - | swappy -f -
|
|
||||||
bind = $hyper, C, exec, shell_command.sh
|
|
||||||
bind = $hyper, X, exec, rofi_command.sh
|
|
||||||
bind = $hyper SHIFT, L, exec, hyprlock
|
|
||||||
bind = $hyper, K, exec, rofi_kill_process.sh
|
|
||||||
bind = $hyper SHIFT, K, exec, rofi_kill_all.sh
|
|
||||||
bind = $hyper, R, exec, rofi-systemd
|
|
||||||
bind = $hyper, 9, exec, start_synergy.sh
|
|
||||||
bind = $hyper, I, exec, rofi_select_input.hs
|
|
||||||
bind = $hyper, O, exec, rofi_paswitch
|
|
||||||
|
|
||||||
# Reload config
|
|
||||||
bind = $mainMod, R, exec, hyprctl reload
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
# MOUSE BINDINGS
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
bindm = $mainMod, mouse:272, movewindow
|
|
||||||
bindm = $mainMod, mouse:273, resizewindow
|
|
||||||
|
|
||||||
# Scroll through workspaces
|
|
||||||
bind = $mainMod, mouse_down, workspace, e+1
|
|
||||||
bind = $mainMod, mouse_up, workspace, e-1
|
|
||||||
|
|
||||||
# =============================================================================
|
|
||||||
# AUTOSTART
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
# Start Hyprland session target for systemd user services (e.g., waybar)
|
|
||||||
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP HYPRLAND_INSTANCE_SIGNATURE
|
|
||||||
exec-once = systemctl --user start hyprland-session.target
|
|
||||||
exec-once = ~/.config/hypr/scripts/workspace-history.sh
|
|
||||||
|
|
||||||
# Scratchpad applications (spawn on demand via keybinds)
|
|
||||||
# exec-once = [workspace special:element silent] element-desktop
|
|
||||||
# exec-once = [workspace special:gmail silent] google-chrome-stable --new-window https://mail.google.com/mail/u/0/#inbox
|
|
||||||
# exec-once = [workspace special:htop silent] alacritty --class htop-scratch --title htop -e htop
|
|
||||||
# exec-once = [workspace special:messages silent] google-chrome-stable --new-window https://messages.google.com/web/conversations
|
|
||||||
# exec-once = [workspace special:slack silent] slack
|
|
||||||
# exec-once = [workspace special:spotify silent] spotify
|
|
||||||
# exec-once = [workspace special:transmission silent] transmission-gtk
|
|
||||||
# exec-once = [workspace special:volume silent] pavucontrol
|
|
||||||
|
|
||||||
# Clipboard history daemon
|
|
||||||
exec-once = wl-paste --type text --watch cliphist store
|
|
||||||
exec-once = wl-paste --type image --watch cliphist store
|
|
||||||
|
|
||||||
# Night light (optional - comment out if not needed)
|
|
||||||
# exec-once = wlsunset -l 37.7 -L -122.4
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Bring window to current workspace (like XMonad's bringWindow)
|
|
||||||
# Uses rofi to select a window and moves it to the current workspace
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Get current workspace
|
|
||||||
CURRENT_WS=$(hyprctl activeworkspace -j | jq -r '.id')
|
|
||||||
|
|
||||||
# Get all windows and format for rofi
|
|
||||||
WINDOWS=$(hyprctl clients -j | jq -r '.[] | select(.workspace.id >= 0 and .workspace.id != '"$CURRENT_WS"') | "\(.title) [\(.class)] - WS:\(.workspace.id) |\(.address)"')
|
|
||||||
|
|
||||||
if [ -z "$WINDOWS" ]; then
|
|
||||||
notify-send "Bring Window" "No windows on other workspaces"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Show rofi menu
|
|
||||||
SELECTION=$(echo "$WINDOWS" | rofi -dmenu -i -p "Bring window" -format 's')
|
|
||||||
|
|
||||||
if [ -n "$SELECTION" ]; then
|
|
||||||
# Extract the window address (after the last |)
|
|
||||||
ADDRESS=$(echo "$SELECTION" | sed 's/.*|//')
|
|
||||||
|
|
||||||
# Move window to current workspace
|
|
||||||
hyprctl dispatch movetoworkspace "$CURRENT_WS,address:$ADDRESS"
|
|
||||||
|
|
||||||
# Focus the window
|
|
||||||
hyprctl dispatch focuswindow "address:$ADDRESS"
|
|
||||||
fi
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Cycle between master and dwindle layouts
|
|
||||||
# Like XMonad's NextLayout
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
CURRENT=$(hyprctl getoption general:layout -j | jq -r '.str')
|
|
||||||
|
|
||||||
if [ "$CURRENT" = "master" ]; then
|
|
||||||
hyprctl keyword general:layout dwindle
|
|
||||||
notify-send "Layout" "Switched to Dwindle (binary tree)"
|
|
||||||
else
|
|
||||||
hyprctl keyword general:layout master
|
|
||||||
notify-send "Layout" "Switched to Master (XMonad-like)"
|
|
||||||
fi
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Focus next window of a different class (like XMonad's focusNextClass)
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Get focused window class
|
|
||||||
FOCUSED_CLASS=$(hyprctl activewindow -j | jq -r '.class')
|
|
||||||
FOCUSED_ADDR=$(hyprctl activewindow -j | jq -r '.address')
|
|
||||||
|
|
||||||
if [ "$FOCUSED_CLASS" = "null" ] || [ -z "$FOCUSED_CLASS" ]; then
|
|
||||||
# No focused window, just focus any window
|
|
||||||
hyprctl dispatch cyclenext
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get all unique classes
|
|
||||||
ALL_CLASSES=$(hyprctl clients -j | jq -r '[.[] | select(.workspace.id >= 0) | .class] | unique | .[]')
|
|
||||||
|
|
||||||
# Get sorted list of classes
|
|
||||||
CLASSES_ARRAY=()
|
|
||||||
while IFS= read -r class; do
|
|
||||||
CLASSES_ARRAY+=("$class")
|
|
||||||
done <<< "$ALL_CLASSES"
|
|
||||||
|
|
||||||
# Find current class index and get next class
|
|
||||||
CURRENT_INDEX=-1
|
|
||||||
for i in "${!CLASSES_ARRAY[@]}"; do
|
|
||||||
if [ "${CLASSES_ARRAY[$i]}" = "$FOCUSED_CLASS" ]; then
|
|
||||||
CURRENT_INDEX=$i
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $CURRENT_INDEX -eq -1 ] || [ ${#CLASSES_ARRAY[@]} -le 1 ]; then
|
|
||||||
# Only one class or class not found
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get next class (wrapping around)
|
|
||||||
NEXT_INDEX=$(( (CURRENT_INDEX + 1) % ${#CLASSES_ARRAY[@]} ))
|
|
||||||
NEXT_CLASS="${CLASSES_ARRAY[$NEXT_INDEX]}"
|
|
||||||
|
|
||||||
# Find first window of next class
|
|
||||||
NEXT_WINDOW=$(hyprctl clients -j | jq -r ".[] | select(.class == \"$NEXT_CLASS\" and .workspace.id >= 0) | .address" | head -1)
|
|
||||||
|
|
||||||
if [ -n "$NEXT_WINDOW" ]; then
|
|
||||||
hyprctl dispatch focuswindow "address:$NEXT_WINDOW"
|
|
||||||
fi
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Gather all windows of the same class as focused window (like XMonad's gatherThisClass)
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Get focused window class
|
|
||||||
FOCUSED_CLASS=$(hyprctl activewindow -j | jq -r '.class')
|
|
||||||
CURRENT_WS=$(hyprctl activeworkspace -j | jq -r '.id')
|
|
||||||
|
|
||||||
if [ "$FOCUSED_CLASS" = "null" ] || [ -z "$FOCUSED_CLASS" ]; then
|
|
||||||
notify-send "Gather Class" "No focused window"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Find all windows with same class on other workspaces
|
|
||||||
WINDOWS=$(hyprctl clients -j | jq -r ".[] | select(.class == \"$FOCUSED_CLASS\" and .workspace.id != $CURRENT_WS and .workspace.id >= 0) | .address")
|
|
||||||
|
|
||||||
if [ -z "$WINDOWS" ]; then
|
|
||||||
notify-send "Gather Class" "No other windows of class '$FOCUSED_CLASS'"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Move each window to current workspace
|
|
||||||
COUNT=0
|
|
||||||
for ADDR in $WINDOWS; do
|
|
||||||
hyprctl dispatch movetoworkspace "$CURRENT_WS,address:$ADDR"
|
|
||||||
((COUNT++))
|
|
||||||
done
|
|
||||||
|
|
||||||
notify-send "Gather Class" "Gathered $COUNT windows of class '$FOCUSED_CLASS'"
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Raise existing window or run command (like XMonad's raiseNextMaybe)
|
|
||||||
# Usage: raise-or-run.sh <class-pattern> <command>
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
CLASS_PATTERN="$1"
|
|
||||||
COMMAND="$2"
|
|
||||||
|
|
||||||
# Find windows matching the class pattern
|
|
||||||
MATCHING=$(hyprctl clients -j | jq -r ".[] | select(.class | test(\"$CLASS_PATTERN\"; \"i\")) | .address" | head -1)
|
|
||||||
|
|
||||||
if [ -n "$MATCHING" ]; then
|
|
||||||
# Window exists, focus it
|
|
||||||
hyprctl dispatch focuswindow "address:$MATCHING"
|
|
||||||
else
|
|
||||||
# No matching window, run the command
|
|
||||||
exec $COMMAND
|
|
||||||
fi
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Replace focused window with selected window (like XMonad's myReplaceWindow)
|
|
||||||
# Swaps the positions of focused window and selected window
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Get current workspace and focused window
|
|
||||||
CURRENT_WS=$(hyprctl activeworkspace -j | jq -r '.id')
|
|
||||||
FOCUSED=$(hyprctl activewindow -j | jq -r '.address')
|
|
||||||
|
|
||||||
if [ "$FOCUSED" = "null" ] || [ -z "$FOCUSED" ]; then
|
|
||||||
notify-send "Replace Window" "No focused window"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get all windows except focused
|
|
||||||
WINDOWS=$(hyprctl clients -j | jq -r ".[] | select(.workspace.id >= 0 and .address != \"$FOCUSED\") | \"\(.title) [\(.class)] - WS:\(.workspace.id) |\(.address)\"")
|
|
||||||
|
|
||||||
if [ -z "$WINDOWS" ]; then
|
|
||||||
notify-send "Replace Window" "No other windows available"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Show rofi menu
|
|
||||||
SELECTION=$(echo "$WINDOWS" | rofi -dmenu -i -p "Replace with" -format 's')
|
|
||||||
|
|
||||||
if [ -n "$SELECTION" ]; then
|
|
||||||
# Extract the window address
|
|
||||||
ADDRESS=$(echo "$SELECTION" | sed 's/.*|//')
|
|
||||||
|
|
||||||
# Swap windows using hy3
|
|
||||||
hyprctl dispatch hy3:movewindow "address:$ADDRESS"
|
|
||||||
fi
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Shift window to empty workspace on screen in given direction
|
|
||||||
# Like XMonad's shiftToEmptyOnScreen
|
|
||||||
# Usage: shift-to-empty-on-screen.sh <direction: u|d|l|r>
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
DIRECTION="$1"
|
|
||||||
|
|
||||||
# Track the current monitor so we can return
|
|
||||||
ORIG_MONITOR=$(hyprctl activeworkspace -j | jq -r '.monitor')
|
|
||||||
|
|
||||||
# Move focus to the screen in that direction
|
|
||||||
hyprctl dispatch focusmonitor "$DIRECTION"
|
|
||||||
|
|
||||||
# Get the monitor we're now on (target monitor)
|
|
||||||
MONITOR=$(hyprctl activeworkspace -j | jq -r '.monitor')
|
|
||||||
|
|
||||||
# If there is no monitor in that direction, bail
|
|
||||||
if [ "$MONITOR" = "$ORIG_MONITOR" ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Find an empty workspace or create one
|
|
||||||
# First check if there's an empty workspace on this monitor
|
|
||||||
EMPTY_WS=$(hyprctl workspaces -j | jq -r ".[] | select(.windows == 0 and .monitor == \"$MONITOR\") | .id" | head -1)
|
|
||||||
|
|
||||||
if [ -z "$EMPTY_WS" ]; then
|
|
||||||
# No empty workspace, find next available workspace number
|
|
||||||
MAX_WS=$(hyprctl workspaces -j | jq -r 'map(.id) | max')
|
|
||||||
EMPTY_WS=$((MAX_WS + 1))
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ensure the workspace exists on the target monitor
|
|
||||||
hyprctl dispatch workspace "$EMPTY_WS"
|
|
||||||
|
|
||||||
# Go back to original monitor and move the window (without following)
|
|
||||||
hyprctl dispatch focusmonitor "$ORIG_MONITOR"
|
|
||||||
hyprctl dispatch movetoworkspacesilent "$EMPTY_WS"
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Swap the contents of the current workspace with another workspace.
|
|
||||||
# Intended to mirror XMonad's swapWithCurrent behavior.
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
CURRENT_WS="$(hyprctl activeworkspace -j | jq -r '.id')"
|
|
||||||
if [[ -z "${CURRENT_WS}" || "${CURRENT_WS}" == "null" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
TARGET_WS="${1:-}"
|
|
||||||
|
|
||||||
if [[ -z "${TARGET_WS}" ]]; then
|
|
||||||
WS_LIST="$({
|
|
||||||
seq 1 10
|
|
||||||
hyprctl workspaces -j | jq -r '.[].id' 2>/dev/null || true
|
|
||||||
} | awk 'NF {print $1}' | awk '!seen[$0]++' | sort -n)"
|
|
||||||
|
|
||||||
TARGET_WS="$(printf "%s\n" "${WS_LIST}" | rofi -dmenu -p "Swap with workspace")"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "${TARGET_WS}" || "${TARGET_WS}" == "null" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${TARGET_WS}" == "${CURRENT_WS}" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! [[ "${TARGET_WS}" =~ ^-?[0-9]+$ ]]; then
|
|
||||||
notify-send "Swap Workspace" "Invalid workspace: ${TARGET_WS}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
WINDOWS_CURRENT="$(hyprctl clients -j | jq -r --arg ws "${CURRENT_WS}" '.[] | select((.workspace.id|tostring) == $ws) | .address')"
|
|
||||||
WINDOWS_TARGET="$(hyprctl clients -j | jq -r --arg ws "${TARGET_WS}" '.[] | select((.workspace.id|tostring) == $ws) | .address')"
|
|
||||||
|
|
||||||
for ADDR in ${WINDOWS_CURRENT}; do
|
|
||||||
hyprctl dispatch movetoworkspace "${TARGET_WS},address:${ADDR}"
|
|
||||||
done
|
|
||||||
|
|
||||||
for ADDR in ${WINDOWS_TARGET}; do
|
|
||||||
hyprctl dispatch movetoworkspace "${CURRENT_WS},address:${ADDR}"
|
|
||||||
done
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# Toggle a named Hyprland scratchpad, spawning it if needed.
|
|
||||||
# Usage: toggle-scratchpad.sh <name> <class_regex|-> <title_regex|-> <command...>
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [ "$#" -lt 4 ]; then
|
|
||||||
echo "usage: $0 <name> <class_regex|-> <title_regex|-> <command...>" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
NAME="$1"
|
|
||||||
shift
|
|
||||||
CLASS_REGEX="$1"
|
|
||||||
shift
|
|
||||||
TITLE_REGEX="$1"
|
|
||||||
shift
|
|
||||||
COMMAND=("$@")
|
|
||||||
|
|
||||||
if [ "$CLASS_REGEX" = "-" ]; then
|
|
||||||
CLASS_REGEX=""
|
|
||||||
fi
|
|
||||||
if [ "$TITLE_REGEX" = "-" ]; then
|
|
||||||
TITLE_REGEX=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$CLASS_REGEX" ] && [ -z "$TITLE_REGEX" ]; then
|
|
||||||
echo "toggle-scratchpad: provide a class or title regex" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
MATCHING=$(hyprctl clients -j | jq -r --arg cre "$CLASS_REGEX" --arg tre "$TITLE_REGEX" '
|
|
||||||
.[]
|
|
||||||
| select(
|
|
||||||
(($cre == "") or (.class | test($cre; "i")))
|
|
||||||
and
|
|
||||||
(($tre == "") or (.title | test($tre; "i")))
|
|
||||||
)
|
|
||||||
| .address
|
|
||||||
')
|
|
||||||
|
|
||||||
if [ -z "$MATCHING" ]; then
|
|
||||||
"${COMMAND[@]}" &
|
|
||||||
else
|
|
||||||
while IFS= read -r ADDR; do
|
|
||||||
[ -n "$ADDR" ] || continue
|
|
||||||
hyprctl dispatch movetoworkspacesilent "special:$NAME,address:$ADDR"
|
|
||||||
done <<< "$MATCHING"
|
|
||||||
fi
|
|
||||||
|
|
||||||
hyprctl dispatch togglespecialworkspace "$NAME"
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
runtime_dir="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
|
|
||||||
state_dir="${runtime_dir}/hypr"
|
|
||||||
prev_file="${state_dir}/prev-workspace"
|
|
||||||
|
|
||||||
prev="$(cat "${prev_file}" 2>/dev/null || true)"
|
|
||||||
if [[ -z "${prev}" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
hyprctl dispatch workspace "${prev}" >/dev/null 2>&1 || true
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
runtime_dir="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
|
|
||||||
sig="${HYPRLAND_INSTANCE_SIGNATURE:-}"
|
|
||||||
if [[ -z "$sig" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
sock="${runtime_dir}/hypr/${sig}/.socket2.sock"
|
|
||||||
state_dir="${runtime_dir}/hypr"
|
|
||||||
last_file="${state_dir}/last-workspace"
|
|
||||||
prev_file="${state_dir}/prev-workspace"
|
|
||||||
|
|
||||||
mkdir -p "${state_dir}"
|
|
||||||
|
|
||||||
# Initialize current workspace to avoid empty state.
|
|
||||||
if command -v hyprctl >/dev/null 2>&1; then
|
|
||||||
cur_id="$(hyprctl activeworkspace -j | jq -r '.id' 2>/dev/null || true)"
|
|
||||||
if [[ -n "${cur_id}" && "${cur_id}" != "null" ]]; then
|
|
||||||
echo "${cur_id}" > "${last_file}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Wait for the event socket to be ready.
|
|
||||||
while [[ ! -S "${sock}" ]]; do
|
|
||||||
sleep 0.2
|
|
||||||
done
|
|
||||||
|
|
||||||
nc -U "${sock}" | while read -r line; do
|
|
||||||
case "${line}" in
|
|
||||||
workspace*">>"*)
|
|
||||||
payload="${line#*>>}"
|
|
||||||
# Handle workspacev2 payloads: id,name
|
|
||||||
if [[ "${payload}" == *","* ]]; then
|
|
||||||
ws_id="${payload%%,*}"
|
|
||||||
ws_name="${payload#*,}"
|
|
||||||
else
|
|
||||||
ws_id="${payload}"
|
|
||||||
ws_name="${payload}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Ignore special/negative workspaces.
|
|
||||||
if [[ "${ws_id}" =~ ^- ]] || [[ "${ws_name}" == special:* ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
ws_ident="${ws_name}"
|
|
||||||
if [[ -z "${ws_ident}" ]]; then
|
|
||||||
ws_ident="${ws_id}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
prev="$(cat "${last_file}" 2>/dev/null || true)"
|
|
||||||
if [[ -n "${prev}" && "${ws_ident}" != "${prev}" ]]; then
|
|
||||||
echo "${prev}" > "${prev_file}"
|
|
||||||
fi
|
|
||||||
echo "${ws_ident}" > "${last_file}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
configuration {
|
configuration {
|
||||||
font: "Fira Code 10";
|
font: "Noto Sans 10";
|
||||||
show-icons: true;
|
show-icons: true;
|
||||||
display-drun: "";
|
display-drun: "";
|
||||||
drun-display-format: "{name}";
|
drun-display-format: "{name}";
|
||||||
@@ -25,7 +25,7 @@ window {
|
|||||||
border: 0px;
|
border: 0px;
|
||||||
border-color: @ac;
|
border-color: @ac;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
width: 40%;
|
width: 30%;
|
||||||
location: center;
|
location: center;
|
||||||
x-offset: 0;
|
x-offset: 0;
|
||||||
y-offset: 0;
|
y-offset: 0;
|
||||||
@@ -36,6 +36,7 @@ prompt {
|
|||||||
padding: 0.30% 1% 0% -0.5%;
|
padding: 0.30% 1% 0% -0.5%;
|
||||||
background-color: @al;
|
background-color: @al;
|
||||||
text-color: @fg;
|
text-color: @fg;
|
||||||
|
font: "Fira Code 12";
|
||||||
}
|
}
|
||||||
|
|
||||||
entry {
|
entry {
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ configuration {
|
|||||||
terminal: "alacritty";
|
terminal: "alacritty";
|
||||||
sidebar-mode: false;
|
sidebar-mode: false;
|
||||||
fullscreen: true;
|
fullscreen: true;
|
||||||
/* Let rofi auto-detect DPI under Wayland/Xwayland to avoid blurry scaling. */
|
dpi: 100;
|
||||||
dpi: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@theme "colorful/style_7.rasi"
|
@theme "colorful/style_7.rasi"
|
||||||
|
|||||||
521
dotfiles/config/taffybar/flake.lock
generated
521
dotfiles/config/taffybar/flake.lock
generated
@@ -3,11 +3,11 @@
|
|||||||
"flake-compat": {
|
"flake-compat": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1696426674,
|
"lastModified": 1673956053,
|
||||||
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||||
"owner": "edolstra",
|
"owner": "edolstra",
|
||||||
"repo": "flake-compat",
|
"repo": "flake-compat",
|
||||||
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -21,11 +21,11 @@
|
|||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1701680307,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -39,11 +39,11 @@
|
|||||||
"systems": "systems_2"
|
"systems": "systems_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1689068808,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -57,11 +57,11 @@
|
|||||||
"systems": "systems_3"
|
"systems": "systems_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1685518550,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -70,16 +70,80 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"git-ignore-nix": {
|
"flake-utils_4": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs_3"
|
"systems": "systems_4"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762808025,
|
"lastModified": 1701680307,
|
||||||
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
|
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fourmolu-011": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-g/yDZXeLCHq/iXoZTaTYSb8l9CMny3AKsRQgWElagZI=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/fourmolu-0.11.0.0/fourmolu-0.11.0.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/fourmolu-0.11.0.0/fourmolu-0.11.0.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fourmolu-012": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-yru8ls67DMM6WSeVU6xDmmwa48I8S9CUv9NBaxSQ29M=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/fourmolu-0.12.0.0/fourmolu-0.12.0.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/fourmolu-0.12.0.0/fourmolu-0.12.0.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-ignore-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"taffybar",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1660459072,
|
||||||
|
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
|
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-ignore-nix_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_4"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1703887061,
|
||||||
|
"narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -90,20 +154,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gitignore": {
|
"gitignore": {
|
||||||
"inputs": {
|
"flake": false,
|
||||||
"nixpkgs": [
|
|
||||||
"taffybar",
|
|
||||||
"weeder-nix",
|
|
||||||
"pre-commit-hooks",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1709087332,
|
"lastModified": 1660459072,
|
||||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -113,13 +170,30 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gtk-sni-tray": {
|
"gtk-sni-tray": {
|
||||||
"flake": false,
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"taffybar",
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"git-ignore-nix": [
|
||||||
|
"taffybar",
|
||||||
|
"git-ignore-nix"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"taffybar",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"status-notifier-item": [
|
||||||
|
"taffybar",
|
||||||
|
"status-notifier-item"
|
||||||
|
]
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1760550917,
|
"lastModified": 1663379298,
|
||||||
"narHash": "sha256-oELopLiVb7D1fzYHAiw/cbfNPHLQcOJ3Rz/I1gbk8IY=",
|
"narHash": "sha256-m18+G7V1N+g/pPeKJG9hkblGA5c8QTnUYnsU5t14sOw=",
|
||||||
"owner": "taffybar",
|
"owner": "taffybar",
|
||||||
"repo": "gtk-sni-tray",
|
"repo": "gtk-sni-tray",
|
||||||
"rev": "f6d1bf5dd64ac0f532b03ae01f5e1cc051116f09",
|
"rev": "1927d86308d34b5d21a709cf8ff5332ec5d37de4",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -130,13 +204,26 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"gtk-strut": {
|
"gtk-strut": {
|
||||||
"flake": false,
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"taffybar",
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"git-ignore-nix": [
|
||||||
|
"taffybar",
|
||||||
|
"git-ignore-nix"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"taffybar",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1760550944,
|
"lastModified": 1663377859,
|
||||||
"narHash": "sha256-S0saDsCA3aosU23jO5+jSXkbyrv7/C48o8GjsZrqF0I=",
|
"narHash": "sha256-UrBd+R3NaJIDC2lt5gMafS3KBeLs83emm2YorX2cFCo=",
|
||||||
"owner": "taffybar",
|
"owner": "taffybar",
|
||||||
"repo": "gtk-strut",
|
"repo": "gtk-strut",
|
||||||
"rev": "5e0bf7f4b93b931a9c4b4a48b5d39de3ca8f02ae",
|
"rev": "d946eb230cdccf5afc063642b3215723e555990b",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -146,39 +233,197 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"haskell-hie-bios": {
|
||||||
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764252443,
|
"lastModified": 1686930638,
|
||||||
"narHash": "sha256-U4G4dUSYWZYKtrF7/ozebD1B96at08SIhY4R9OaK1nw=",
|
"narHash": "sha256-gfcxxHtZ2jUsiKNn/O4jEkfWF/2H04aTnaIvPDbtNlQ=",
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "hie-bios",
|
||||||
|
"rev": "3d4fadfb0dc44cb287db9897ecfb503899d33513",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "haskell",
|
||||||
|
"repo": "hie-bios",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"haskell-implicit-hie-cradle": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1686495518,
|
||||||
|
"narHash": "sha256-OAe+zOkMZuoTfVEMnxnCT1cmPgRF/riAR8nVdomnwxo=",
|
||||||
|
"owner": "smunix",
|
||||||
|
"repo": "implicit-hie-cradle",
|
||||||
|
"rev": "d6aa00355898469af56cfd5e62f7fc8bd9959ded",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "smunix",
|
||||||
|
"ref": "smunix-patch-hls-0.5-1",
|
||||||
|
"repo": "implicit-hie-cradle",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"haskell-language-server": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-utils": "flake-utils_3",
|
||||||
|
"fourmolu-011": "fourmolu-011",
|
||||||
|
"fourmolu-012": "fourmolu-012",
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"haskell-hie-bios": "haskell-hie-bios",
|
||||||
|
"haskell-implicit-hie-cradle": "haskell-implicit-hie-cradle",
|
||||||
|
"hiedb": "hiedb",
|
||||||
|
"hlint-35": "hlint-35",
|
||||||
|
"hlint-36": "hlint-36",
|
||||||
|
"lsp": "lsp",
|
||||||
|
"lsp-test": "lsp-test",
|
||||||
|
"lsp-types": "lsp-types",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"ormolu-052": "ormolu-052",
|
||||||
|
"ormolu-07": "ormolu-07",
|
||||||
|
"stylish-haskell-0145": "stylish-haskell-0145"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1693851896,
|
||||||
|
"narHash": "sha256-799JUHpBd2iMRCrTYDme5RsROKnIwSKBe2xYxgVN7QI=",
|
||||||
"owner": "colonelpanic8",
|
"owner": "colonelpanic8",
|
||||||
"repo": "nixpkgs",
|
"repo": "haskell-language-server",
|
||||||
"rev": "e1fc6c25b91d3d49dd02a156237721f12dbd86b2",
|
"rev": "ea368cef0673059fff95e953ef983109b5979dbc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "colonelpanic8",
|
"owner": "colonelpanic8",
|
||||||
"ref": "remove-gi-gtk-hs-patch",
|
"ref": "goto-dependency-definition-2",
|
||||||
"repo": "nixpkgs",
|
"repo": "haskell-language-server",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"hiedb": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1691542357,
|
||||||
|
"narHash": "sha256-90ftphhoIo0CklJrjfCGQrZIUKZfdMJ2Og6tep9dmJ8=",
|
||||||
|
"owner": "nlander",
|
||||||
|
"repo": "HieDb",
|
||||||
|
"rev": "4eebfcf8fab54f24808e6301227d77ae64d2509c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nlander",
|
||||||
|
"ref": "all-new-functions",
|
||||||
|
"repo": "HieDb",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hlint-35": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-qQNUlQQnahUGEO92Lm0RwjTGBGr2Yaw0KRuFRMoc5No=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/hlint-3.5/hlint-3.5.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/hlint-3.5/hlint-3.5.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hlint-36": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-fH4RYnWeuBqJI5d3Ba+Xs0BxYr0IYFH1OWO3k2iHGlU=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/hlint-3.6.1/hlint-3.6.1.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/hlint-3.6.1/hlint-3.6.1.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lsp": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-HcEfdYUrCHufEa+10M2wESjnK41xM/msd+t6r6JwQO0=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-2.2.0.0/lsp-2.2.0.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-2.2.0.0/lsp-2.2.0.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lsp-test": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-E1D3X2+I9ZTZLpHDEDTXexQFYpyG5byOFRIvRTeBsn8=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-test-0.16.0.0/lsp-test-0.16.0.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-test-0.16.0.0/lsp-test-0.16.0.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lsp-types": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-Oa5HuKdsdTSQUKtuSt06zVAq19Qxq5IJZObrnPwlB6s=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-types-2.0.2.0/lsp-types-2.0.2.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/lsp-types-2.0.2.0/lsp-types-2.0.2.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702312524,
|
||||||
|
"narHash": "sha256-gkZJRDBUCpTPBvQk25G0B7vfbpEYM5s5OZqghkjZsnE=",
|
||||||
|
"path": "/nix/store/4fgs7yzsy2dqnjw8j42qlp9i1vgarzy0-source",
|
||||||
|
"rev": "a9bf124c46ef298113270b1f84a164865987a91c",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1730768919,
|
"lastModified": 1686874404,
|
||||||
"narHash": "sha256-8AKquNnnSaJRXZxc5YmF/WfmxiHX6MMZZasRP6RRQkE=",
|
"narHash": "sha256-u2Ss8z+sGaVlKtq7sCovQ8WvXY+OoXJmY1zmyxITiaY=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a04d33c0c3f1a59a2c1cb0c6e34cd24500e5a1dc",
|
"rev": "efc10371d5c5b8d2d58bab6c1100753efacfe550",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"ref": "nixpkgs-unstable",
|
"ref": "haskell-updates",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_3": {
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689098530,
|
||||||
|
"narHash": "sha256-fxc/9f20wRyo/5ydkmZkX/Sh/ULa7RcT8h+cUv8p/44=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "f2406198ea0e4e37d4380d0e20336c575b8f8ef9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_4": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1666603677,
|
"lastModified": 1666603677,
|
||||||
"narHash": "sha256-apAEIj+z1iwMaMJ4tB21r/VTetfGDLDzuhXRHJknIAU=",
|
"narHash": "sha256-apAEIj+z1iwMaMJ4tB21r/VTetfGDLDzuhXRHJknIAU=",
|
||||||
@@ -192,38 +437,41 @@
|
|||||||
"type": "indirect"
|
"type": "indirect"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_4": {
|
"nixpkgs_5": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764230294,
|
"lastModified": 1702312524,
|
||||||
"narHash": "sha256-Z63xl5Scj3Y/zRBPAWq1eT68n2wBWGCIEF4waZ0bQBE=",
|
"narHash": "sha256-gkZJRDBUCpTPBvQk25G0B7vfbpEYM5s5OZqghkjZsnE=",
|
||||||
"owner": "NixOS",
|
"path": "/nix/store/4fgs7yzsy2dqnjw8j42qlp9i1vgarzy0-source",
|
||||||
"repo": "nixpkgs",
|
"rev": "a9bf124c46ef298113270b1f84a164865987a91c",
|
||||||
"rev": "0d59e0290eefe0f12512043842d7096c4070f30e",
|
"type": "path"
|
||||||
"type": "github"
|
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"id": "nixpkgs",
|
"id": "nixpkgs",
|
||||||
"type": "indirect"
|
"type": "indirect"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pre-commit-hooks": {
|
"ormolu-052": {
|
||||||
"inputs": {
|
"flake": false,
|
||||||
"flake-compat": "flake-compat",
|
|
||||||
"gitignore": "gitignore",
|
|
||||||
"nixpkgs": "nixpkgs_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1747372754,
|
"narHash": "sha256-H7eqId488RBRxcf7flgJefAZmRgFJASJva+Oy7GG4q4=",
|
||||||
"narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=",
|
"type": "tarball",
|
||||||
"owner": "cachix",
|
"url": "https://hackage.haskell.org/package/ormolu-0.5.2.0/ormolu-0.5.2.0.tar.gz"
|
||||||
"repo": "pre-commit-hooks.nix",
|
|
||||||
"rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46",
|
|
||||||
"type": "github"
|
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "cachix",
|
"type": "tarball",
|
||||||
"repo": "pre-commit-hooks.nix",
|
"url": "https://hackage.haskell.org/package/ormolu-0.5.2.0/ormolu-0.5.2.0.tar.gz"
|
||||||
"type": "github"
|
}
|
||||||
|
},
|
||||||
|
"ormolu-07": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-5M5gNzSvsiQH1+0oexRByzf5EIET+0BFwR4fLIr2P7g=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/ormolu-0.7.1.0/ormolu-0.7.1.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/ormolu-0.7.1.0/ormolu-0.7.1.0.tar.gz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": {
|
"root": {
|
||||||
@@ -231,11 +479,24 @@
|
|||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": "nixpkgs",
|
"nixpkgs": "nixpkgs",
|
||||||
"taffybar": "taffybar",
|
"taffybar": "taffybar",
|
||||||
"xmonad": "xmonad"
|
"xmonad": "xmonad_2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"status-notifier-item": {
|
"status-notifier-item": {
|
||||||
"flake": false,
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"taffybar",
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"git-ignore-nix": [
|
||||||
|
"taffybar",
|
||||||
|
"git-ignore-nix"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"taffybar",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1641783528,
|
"lastModified": 1641783528,
|
||||||
"narHash": "sha256-wJymJfYPFj4/r1e4kT/wt9FEsyCXo5JkkcOoozpuhag=",
|
"narHash": "sha256-wJymJfYPFj4/r1e4kT/wt9FEsyCXo5JkkcOoozpuhag=",
|
||||||
@@ -250,6 +511,18 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"stylish-haskell-0145": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"narHash": "sha256-EE7RFQ6q4Ek8daRgOpNMGepYLa9o8cM4OLjTNUSHQf0=",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/stylish-haskell-0.14.5.0/stylish-haskell-0.14.5.0.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://hackage.haskell.org/package/stylish-haskell-0.14.5.0/stylish-haskell-0.14.5.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
"systems": {
|
"systems": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1681028828,
|
"lastModified": 1681028828,
|
||||||
@@ -295,42 +568,53 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"systems_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"taffybar": {
|
"taffybar": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-utils": "flake-utils_2",
|
||||||
|
"git-ignore-nix": "git-ignore-nix",
|
||||||
"gtk-sni-tray": "gtk-sni-tray",
|
"gtk-sni-tray": "gtk-sni-tray",
|
||||||
"gtk-strut": "gtk-strut",
|
"gtk-strut": "gtk-strut",
|
||||||
"nixpkgs": [
|
"haskell-language-server": "haskell-language-server",
|
||||||
"nixpkgs"
|
"nixpkgs": "nixpkgs_3",
|
||||||
],
|
|
||||||
"status-notifier-item": "status-notifier-item",
|
"status-notifier-item": "status-notifier-item",
|
||||||
"weeder-nix": "weeder-nix",
|
"xmonad": "xmonad"
|
||||||
"xmonad": [
|
|
||||||
"xmonad"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1760591109,
|
"lastModified": 1696612500,
|
||||||
"narHash": "sha256-O21ayp5v2eccXdcwNjTK5ZB99ruK0Zt9CUaw5Rye42g=",
|
"narHash": "sha256-Q19F91yVQviqxgY+FkvEwtX2vcw414eVtK8erim0NrU=",
|
||||||
"owner": "taffybar",
|
"owner": "taffybar",
|
||||||
"repo": "taffybar",
|
"repo": "taffybar",
|
||||||
"rev": "b256a711416036ca124fc9b3f89e7c957535e465",
|
"rev": "46eba89c2a4d4ffefe42c3ee4506d1b74c8e61fd",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "taffybar",
|
"owner": "taffybar",
|
||||||
"ref": "master",
|
|
||||||
"repo": "taffybar",
|
"repo": "taffybar",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"unstable": {
|
"unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1764242076,
|
"lastModified": 1689098530,
|
||||||
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
|
"narHash": "sha256-fxc/9f20wRyo/5ydkmZkX/Sh/ULa7RcT8h+cUv8p/44=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
|
"rev": "f2406198ea0e4e37d4380d0e20336c575b8f8ef9",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -340,41 +624,66 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"weeder-nix": {
|
"unstable_2": {
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"taffybar",
|
|
||||||
"nixpkgs"
|
|
||||||
],
|
|
||||||
"pre-commit-hooks": "pre-commit-hooks"
|
|
||||||
},
|
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1748252779,
|
"lastModified": 1704538339,
|
||||||
"narHash": "sha256-kSyD/VDUX2m9c2vcuLBT2wnpYiVSHHlP9vuDTtsAtD8=",
|
"narHash": "sha256-1734d3mQuux9ySvwf6axRWZRBhtcZA9Q8eftD6EZg6U=",
|
||||||
"owner": "NorfairKing",
|
"owner": "NixOS",
|
||||||
"repo": "weeder-nix",
|
"repo": "nixpkgs",
|
||||||
"rev": "388df7a6f00220d1960118e1ad37cd86150d2c5a",
|
"rev": "46ae0210ce163b3cba6c7da08840c1d63de9c701",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "NorfairKing",
|
"owner": "NixOS",
|
||||||
"repo": "weeder-nix",
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"xmonad": {
|
"xmonad": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_3",
|
"flake-utils": [
|
||||||
"git-ignore-nix": "git-ignore-nix",
|
"taffybar",
|
||||||
"nixpkgs": "nixpkgs_4",
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"git-ignore-nix": [
|
||||||
|
"taffybar",
|
||||||
|
"git-ignore-nix"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"taffybar",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
"unstable": "unstable"
|
"unstable": "unstable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1763949843,
|
"lastModified": 1687976934,
|
||||||
"narHash": "sha256-aJXmGPWKjXs7cagVzUE3fd2Fpc+sXnknM446AxHgvH0=",
|
"narHash": "sha256-hUZmKy3jJ1+5rTGeQzfNR+LxgzmLaaeRVnbsJMEVw0Q=",
|
||||||
"owner": "xmonad",
|
"owner": "xmonad",
|
||||||
"repo": "xmonad",
|
"repo": "xmonad",
|
||||||
"rev": "97edef37a3ae10012272d692b5e1bc9b7013fc14",
|
"rev": "1aac6611d82065c9198e5584176058a9483fcbb0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "xmonad",
|
||||||
|
"ref": "master",
|
||||||
|
"repo": "xmonad",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xmonad_2": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_4",
|
||||||
|
"git-ignore-nix": "git-ignore-nix_2",
|
||||||
|
"nixpkgs": "nixpkgs_5",
|
||||||
|
"unstable": "unstable_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702895348,
|
||||||
|
"narHash": "sha256-ADRTw4DTfDCmsSFFWZKmvdmIjnEVY7pjjUxYytKXy1E=",
|
||||||
|
"owner": "xmonad",
|
||||||
|
"repo": "xmonad",
|
||||||
|
"rev": "c4cf4715f736fed77fb2af622c0760259ac2cf43",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -1,30 +1,15 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs = {
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
flake-utils.url = github:numtide/flake-utils;
|
||||||
nixpkgs.url = "github:colonelpanic8/nixpkgs/remove-gi-gtk-hs-patch";
|
xmonad.url = github:xmonad/xmonad/master;
|
||||||
xmonad.url = "github:xmonad/xmonad/master";
|
taffybar.url = "github:taffybar/taffybar";
|
||||||
taffybar = {
|
|
||||||
url = "github:taffybar/taffybar/master";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
inputs.xmonad.follows = "xmonad";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
outputs = { self, flake-utils, taffybar, nixpkgs, xmonad }:
|
outputs = { self, flake-utils, taffybar, nixpkgs, xmonad }:
|
||||||
let
|
let
|
||||||
hoverlay = final: prev: hself: hsuper:
|
hoverlay = final: prev: hself: hsuper: {
|
||||||
{
|
taffybar = hsuper.taffybar.overrideAttrs (old: {
|
||||||
taffybar = prev.haskell.lib.overrideCabal hsuper.taffybar (oa: {
|
|
||||||
doHaddock = false;
|
doHaddock = false;
|
||||||
doCheck = false;
|
|
||||||
# Fix for GHC 9.4 where liftA2 is not in Prelude
|
|
||||||
postPatch = (oa.postPatch or "") + ''
|
|
||||||
substituteInPlace src/System/Taffybar/DBus/Client/Util.hs \
|
|
||||||
--replace-fail "import Control.Monad (forM)" \
|
|
||||||
"import Control.Monad (forM)
|
|
||||||
import Control.Applicative (liftA2)"
|
|
||||||
'';
|
|
||||||
});
|
});
|
||||||
# gi-gtk-hs patching is now handled by taffybar's fixVersionNamePackages overlay
|
|
||||||
imalison-taffybar = prev.haskell.lib.addPkgconfigDepends (
|
imalison-taffybar = prev.haskell.lib.addPkgconfigDepends (
|
||||||
hself.callCabal2nix "imalison-taffybar"
|
hself.callCabal2nix "imalison-taffybar"
|
||||||
(
|
(
|
||||||
@@ -49,12 +34,12 @@ import Control.Applicative (liftA2)"
|
|||||||
};
|
};
|
||||||
defComp = { compiler = "ghc94"; };
|
defComp = { compiler = "ghc94"; };
|
||||||
overlay = xmonad.lib.fromHOL hoverlay defComp;
|
overlay = xmonad.lib.fromHOL hoverlay defComp;
|
||||||
overlayList = [ taffybar.overlays.default overlay ];
|
overlays = [ taffybar.overlay overlay ];
|
||||||
in flake-utils.lib.eachDefaultSystem (system:
|
in flake-utils.lib.eachDefaultSystem (system:
|
||||||
let pkgs = import nixpkgs { inherit system; overlays = overlayList; config.allowBroken = true; };
|
let pkgs = import nixpkgs { inherit system overlays; config.allowBroken = true; };
|
||||||
hpkgs = pkgs.lib.attrsets.getAttrFromPath (xmonad.lib.hpath defComp) pkgs;
|
hpkgs = pkgs.lib.attrsets.getAttrFromPath (xmonad.lib.hpath defComp) pkgs;
|
||||||
in
|
in
|
||||||
{
|
rec {
|
||||||
devShell = hpkgs.shellFor {
|
devShell = hpkgs.shellFor {
|
||||||
packages = p: [ p.imalison-taffybar p.taffybar ];
|
packages = p: [ p.imalison-taffybar p.taffybar ];
|
||||||
nativeBuildInputs = with hpkgs; [
|
nativeBuildInputs = with hpkgs; [
|
||||||
@@ -63,11 +48,5 @@ import Control.Applicative (liftA2)"
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
defaultPackage = hpkgs.imalison-taffybar;
|
defaultPackage = hpkgs.imalison-taffybar;
|
||||||
}) // {
|
}) // { inherit overlay overlays; } ;
|
||||||
inherit overlay;
|
|
||||||
overlays = {
|
|
||||||
default = overlay;
|
|
||||||
taffybar = taffybar.overlays.default;
|
|
||||||
};
|
|
||||||
} ;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ executable taffybar
|
|||||||
, containers
|
, containers
|
||||||
, directory
|
, directory
|
||||||
, filepath
|
, filepath
|
||||||
, gi-gtk3
|
, gi-gtk
|
||||||
, gtk-sni-tray
|
, gtk-sni-tray
|
||||||
, gtk-strut
|
, gtk-strut
|
||||||
, haskell-gi-base
|
, haskell-gi-base
|
||||||
|
|||||||
Submodule dotfiles/config/taffybar/taffybar updated: 220cb5a34d...9c8540a564
@@ -28,6 +28,7 @@ import System.Log.Handler.Simple
|
|||||||
import System.Log.Logger
|
import System.Log.Logger
|
||||||
import System.Process
|
import System.Process
|
||||||
import System.Taffybar
|
import System.Taffybar
|
||||||
|
import System.Taffybar.Auth
|
||||||
import System.Taffybar.Context (appendHook)
|
import System.Taffybar.Context (appendHook)
|
||||||
import System.Taffybar.DBus
|
import System.Taffybar.DBus
|
||||||
import System.Taffybar.DBus.Toggle
|
import System.Taffybar.DBus.Toggle
|
||||||
@@ -39,6 +40,7 @@ import System.Taffybar.Information.X11DesktopInfo
|
|||||||
import System.Taffybar.SimpleConfig
|
import System.Taffybar.SimpleConfig
|
||||||
import System.Taffybar.Util
|
import System.Taffybar.Util
|
||||||
import System.Taffybar.Widget
|
import System.Taffybar.Widget
|
||||||
|
import System.Taffybar.Widget.Crypto
|
||||||
import System.Taffybar.Widget.Generic.Icon
|
import System.Taffybar.Widget.Generic.Icon
|
||||||
import System.Taffybar.Widget.Generic.PollingGraph
|
import System.Taffybar.Widget.Generic.PollingGraph
|
||||||
import System.Taffybar.Widget.Generic.PollingLabel
|
import System.Taffybar.Widget.Generic.PollingLabel
|
||||||
@@ -172,6 +174,9 @@ main = do
|
|||||||
{ clockUpdateStrategy = RoundedTargetInterval 60 0.0
|
{ clockUpdateStrategy = RoundedTargetInterval 60 0.0
|
||||||
, clockFormatString = "%a %b %_d, 🕑%I:%M %p"
|
, clockFormatString = "%a %b %_d, 🕑%I:%M %p"
|
||||||
}
|
}
|
||||||
|
myICP = deocrateWithSetClassAndBoxes "icp" $ cryptoPriceLabelWithIcon @"ICP-USD"
|
||||||
|
myBTC = deocrateWithSetClassAndBoxes "btc" $ cryptoPriceLabelWithIcon @"BTC-USD"
|
||||||
|
myETH = deocrateWithSetClassAndBoxes "eth" $ cryptoPriceLabelWithIcon @"ETH-USD"
|
||||||
myTray = deocrateWithSetClassAndBoxes "tray" $
|
myTray = deocrateWithSetClassAndBoxes "tray" $
|
||||||
sniTrayNewFromParams defaultTrayParams { trayLeftClickAction = PopupMenu
|
sniTrayNewFromParams defaultTrayParams { trayLeftClickAction = PopupMenu
|
||||||
, trayRightClickAction = Activate
|
, trayRightClickAction = Activate
|
||||||
@@ -189,6 +194,9 @@ main = do
|
|||||||
batteryWidgets = [myBatteryIcon, myBatteryText]
|
batteryWidgets = [myBatteryIcon, myBatteryText]
|
||||||
baseEndWidgets =
|
baseEndWidgets =
|
||||||
[ myTray
|
[ myTray
|
||||||
|
, myICP
|
||||||
|
, myBTC
|
||||||
|
, myETH
|
||||||
, myMpris
|
, myMpris
|
||||||
]
|
]
|
||||||
fullEndWidgets = baseEndWidgets ++ [ myCPU, myMem, myNet, myMpris ]
|
fullEndWidgets = baseEndWidgets ++ [ myCPU, myMem, myNet, myMpris ]
|
||||||
@@ -202,6 +210,7 @@ main = do
|
|||||||
, barPadding = 0
|
, barPadding = 0
|
||||||
, barHeight = ScreenRatio $ 1/27
|
, barHeight = ScreenRatio $ 1/27
|
||||||
, cssPaths = cssFiles
|
, cssPaths = cssFiles
|
||||||
|
, startupHook = void $ setCMCAPIKey "f9e66366-9d42-4c6e-8d40-4194a0aaa329"
|
||||||
, centerWidgets = [ myClock ]
|
, centerWidgets = [ myClock ]
|
||||||
}
|
}
|
||||||
selectedConfig =
|
selectedConfig =
|
||||||
@@ -209,7 +218,7 @@ main = do
|
|||||||
[ ( "uber-loaner"
|
[ ( "uber-loaner"
|
||||||
, baseConfig { endWidgets = laptopEndWidgets }
|
, baseConfig { endWidgets = laptopEndWidgets }
|
||||||
)
|
)
|
||||||
, ( "adell"
|
, ( "adele"
|
||||||
, baseConfig { endWidgets = laptopEndWidgets }
|
, baseConfig { endWidgets = laptopEndWidgets }
|
||||||
)
|
)
|
||||||
, ( "stevie-nixos"
|
, ( "stevie-nixos"
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
// -*- mode: jsonc -*-
|
|
||||||
{
|
|
||||||
"height": 42,
|
|
||||||
"spacing": 4,
|
|
||||||
"modules-left": [
|
|
||||||
"hyprland/workspaces",
|
|
||||||
"hyprland/submap"
|
|
||||||
],
|
|
||||||
"modules-center": [
|
|
||||||
"hyprland/window"
|
|
||||||
],
|
|
||||||
"modules-right": [
|
|
||||||
"idle_inhibitor",
|
|
||||||
"pulseaudio",
|
|
||||||
"network",
|
|
||||||
"power-profiles-daemon",
|
|
||||||
"cpu",
|
|
||||||
"memory",
|
|
||||||
"custom/diskfree",
|
|
||||||
"temperature",
|
|
||||||
"backlight",
|
|
||||||
"battery",
|
|
||||||
"clock",
|
|
||||||
"tray"
|
|
||||||
],
|
|
||||||
"idle_inhibitor": {
|
|
||||||
"format": "INHIB {icon}",
|
|
||||||
"format-icons": {
|
|
||||||
"activated": "ON",
|
|
||||||
"deactivated": "OFF"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tray": {
|
|
||||||
"spacing": 10
|
|
||||||
},
|
|
||||||
"clock": {
|
|
||||||
"format": "{:%H:%M}",
|
|
||||||
"tooltip-format": "{:%Y %B}\n{calendar}",
|
|
||||||
"format-alt": "{:%Y-%m-%d}"
|
|
||||||
},
|
|
||||||
"cpu": {
|
|
||||||
"format": "CPU {usage}%",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"memory": {
|
|
||||||
"format": "MEM {}%"
|
|
||||||
},
|
|
||||||
"custom/diskfree": {
|
|
||||||
"exec": "~/.config/waybar/scripts/diskfree",
|
|
||||||
"interval": 30,
|
|
||||||
"format": "DISK {text}",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"temperature": {
|
|
||||||
"critical-threshold": 80,
|
|
||||||
"format": "TEMP {temperatureC}C"
|
|
||||||
},
|
|
||||||
"backlight": {
|
|
||||||
"format": "BL {percent}%"
|
|
||||||
},
|
|
||||||
"battery": {
|
|
||||||
"states": {
|
|
||||||
"warning": 30,
|
|
||||||
"critical": 15
|
|
||||||
},
|
|
||||||
"format": "BAT {capacity}%",
|
|
||||||
"format-full": "BAT {capacity}%",
|
|
||||||
"format-charging": "BAT {capacity}% charging",
|
|
||||||
"format-plugged": "BAT {capacity}% plugged",
|
|
||||||
"format-alt": "BAT {time}"
|
|
||||||
},
|
|
||||||
"power-profiles-daemon": {
|
|
||||||
"format": "PWR {profile}",
|
|
||||||
"tooltip-format": "Power profile: {profile}\nDriver: {driver}",
|
|
||||||
"tooltip": true
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"format-wifi": "WIFI {essid} {signalStrength}%",
|
|
||||||
"format-ethernet": "ETH {ipaddr}/{cidr}",
|
|
||||||
"tooltip-format": "{ifname} via {gwaddr}",
|
|
||||||
"format-linked": "{ifname} (No IP)",
|
|
||||||
"format-disconnected": "NET disconnected",
|
|
||||||
"format-alt": "{ifname}: {ipaddr}/{cidr}"
|
|
||||||
},
|
|
||||||
"pulseaudio": {
|
|
||||||
"format": "VOL {volume}%",
|
|
||||||
"format-muted": "VOL muted",
|
|
||||||
"format-source": "MIC {volume}%",
|
|
||||||
"format-source-muted": "MIC muted",
|
|
||||||
"on-click": "pavucontrol"
|
|
||||||
},
|
|
||||||
"hyprland/workspaces": {
|
|
||||||
"format": "{id} {windows}",
|
|
||||||
"on-click": "activate",
|
|
||||||
"workspace-taskbar": {
|
|
||||||
"enable": true,
|
|
||||||
"update-active-window": true,
|
|
||||||
"format": "{icon}",
|
|
||||||
"icon-size": 24,
|
|
||||||
"on-click-window": "hyprctl dispatch focuswindow address:{address}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/waybar"
|
|
||||||
list_file="${config_dir}/disks"
|
|
||||||
|
|
||||||
mounts=()
|
|
||||||
|
|
||||||
if [[ -n "${WAYBAR_DISKS:-}" ]]; then
|
|
||||||
# Accept comma or space separated values.
|
|
||||||
IFS=', ' read -r -a mounts <<< "${WAYBAR_DISKS//:/,}"
|
|
||||||
elif [[ -f "$list_file" ]]; then
|
|
||||||
while IFS= read -r line; do
|
|
||||||
line="${line%%#*}"
|
|
||||||
line="${line#"${line%%[![:space:]]*}"}"
|
|
||||||
line="${line%"${line##*[![:space:]]}"}"
|
|
||||||
[[ -z "$line" ]] && continue
|
|
||||||
mounts+=("$line")
|
|
||||||
done < "$list_file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${#mounts[@]} -eq 0 ]]; then
|
|
||||||
mounts=("/")
|
|
||||||
fi
|
|
||||||
|
|
||||||
items=()
|
|
||||||
for mount in "${mounts[@]}"; do
|
|
||||||
if df_out=$(df -h --output=avail,target "$mount" 2>/dev/null | awk 'NR==2 {print $2, $1}'); then
|
|
||||||
items+=("$df_out")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${#items[@]} -eq 0 ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
output=""
|
|
||||||
for item in "${items[@]}"; do
|
|
||||||
if [[ -n "$output" ]]; then
|
|
||||||
output+=" | "
|
|
||||||
fi
|
|
||||||
output+="$item"
|
|
||||||
done
|
|
||||||
|
|
||||||
printf '%s\n' "$output"
|
|
||||||
@@ -1,361 +0,0 @@
|
|||||||
* {
|
|
||||||
/* `otf-font-awesome` is required to be installed for icons */
|
|
||||||
font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
background-color: rgba(43, 48, 59, 0.5);
|
|
||||||
border-bottom: 3px solid rgba(100, 114, 125, 0.5);
|
|
||||||
color: #ffffff;
|
|
||||||
transition-property: background-color;
|
|
||||||
transition-duration: .5s;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar.hidden {
|
|
||||||
opacity: 0.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
window#waybar.empty {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
window#waybar.solo {
|
|
||||||
background-color: #FFFFFF;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
window#waybar.termite {
|
|
||||||
background-color: #3F3F3F;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar.chromium {
|
|
||||||
background-color: #000000;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
/* Use box-shadow instead of border so the text isn't offset */
|
|
||||||
box-shadow: inset 0 -3px transparent;
|
|
||||||
/* Avoid rounded borders under each button name */
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
|
|
||||||
button:hover {
|
|
||||||
background: inherit;
|
|
||||||
box-shadow: inset 0 -3px #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* you can set a style on hover for any module like this */
|
|
||||||
#pulseaudio:hover {
|
|
||||||
background-color: #a37800;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button,
|
|
||||||
#taskbar button {
|
|
||||||
padding: 0 3px;
|
|
||||||
background-color: transparent;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button:hover,
|
|
||||||
#taskbar button:hover {
|
|
||||||
background: rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.focused,
|
|
||||||
#taskbar button.active,
|
|
||||||
#taskbar button.focused {
|
|
||||||
background-color: #64727D;
|
|
||||||
box-shadow: inset 0 -3px #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent,
|
|
||||||
#taskbar button.urgent {
|
|
||||||
background-color: #eb4d4b;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces .workspace-label {
|
|
||||||
padding: 0 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces .taskbar-window {
|
|
||||||
padding: 0 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces .taskbar-window.active {
|
|
||||||
background-color: #64727D;
|
|
||||||
box-shadow: inset 0 -3px #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces .taskbar-window label {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces .taskbar-window image {
|
|
||||||
margin: 0 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mode {
|
|
||||||
background-color: #64727D;
|
|
||||||
box-shadow: inset 0 -3px #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#clock,
|
|
||||||
#battery,
|
|
||||||
#cpu,
|
|
||||||
#memory,
|
|
||||||
#disk,
|
|
||||||
#custom-diskfree,
|
|
||||||
#temperature,
|
|
||||||
#backlight,
|
|
||||||
#network,
|
|
||||||
#pulseaudio,
|
|
||||||
#wireplumber,
|
|
||||||
#custom-media,
|
|
||||||
#tray,
|
|
||||||
#mode,
|
|
||||||
#idle_inhibitor,
|
|
||||||
#scratchpad,
|
|
||||||
#power-profiles-daemon,
|
|
||||||
#mpd {
|
|
||||||
padding: 0 8px;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#window,
|
|
||||||
#workspaces,
|
|
||||||
#taskbar {
|
|
||||||
margin: 0 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If workspaces is the leftmost module, omit left margin */
|
|
||||||
.modules-left > widget:first-child > #workspaces,
|
|
||||||
.modules-left > widget:first-child > #taskbar {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If workspaces is the rightmost module, omit right margin */
|
|
||||||
.modules-right > widget:last-child > #workspaces,
|
|
||||||
.modules-right > widget:last-child > #taskbar {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#clock {
|
|
||||||
background-color: #64727D;
|
|
||||||
}
|
|
||||||
|
|
||||||
#battery {
|
|
||||||
background-color: #ffffff;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#battery.charging, #battery.plugged {
|
|
||||||
color: #ffffff;
|
|
||||||
background-color: #26A65B;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes blink {
|
|
||||||
to {
|
|
||||||
background-color: #ffffff;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Using steps() instead of linear as a timing function to limit cpu usage */
|
|
||||||
#battery.critical:not(.charging) {
|
|
||||||
background-color: #f53c3c;
|
|
||||||
color: #ffffff;
|
|
||||||
animation-name: blink;
|
|
||||||
animation-duration: 0.5s;
|
|
||||||
animation-timing-function: steps(12);
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-direction: alternate;
|
|
||||||
}
|
|
||||||
|
|
||||||
#power-profiles-daemon {
|
|
||||||
padding-right: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#power-profiles-daemon.performance {
|
|
||||||
background-color: #f53c3c;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#power-profiles-daemon.balanced {
|
|
||||||
background-color: #2980b9;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#power-profiles-daemon.power-saver {
|
|
||||||
background-color: #2ecc71;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
label:focus {
|
|
||||||
background-color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cpu {
|
|
||||||
background-color: #2ecc71;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#memory {
|
|
||||||
background-color: #9b59b6;
|
|
||||||
}
|
|
||||||
|
|
||||||
#disk {
|
|
||||||
background-color: #964B00;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-diskfree {
|
|
||||||
background-color: #964B00;
|
|
||||||
}
|
|
||||||
|
|
||||||
#backlight {
|
|
||||||
background-color: #90b1b1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#network {
|
|
||||||
background-color: #2980b9;
|
|
||||||
}
|
|
||||||
|
|
||||||
#network.disconnected {
|
|
||||||
background-color: #f53c3c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pulseaudio {
|
|
||||||
background-color: #f1c40f;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#pulseaudio.muted {
|
|
||||||
background-color: #90b1b1;
|
|
||||||
color: #2a5c45;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber {
|
|
||||||
background-color: #fff0f5;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber.muted {
|
|
||||||
background-color: #f53c3c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-media {
|
|
||||||
background-color: #66cc99;
|
|
||||||
color: #2a5c45;
|
|
||||||
min-width: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-media.custom-spotify {
|
|
||||||
background-color: #66cc99;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-media.custom-vlc {
|
|
||||||
background-color: #ffa000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#temperature {
|
|
||||||
background-color: #f0932b;
|
|
||||||
}
|
|
||||||
|
|
||||||
#temperature.critical {
|
|
||||||
background-color: #eb4d4b;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray {
|
|
||||||
background-color: #2980b9;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray > .passive {
|
|
||||||
-gtk-icon-effect: dim;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray > .needs-attention {
|
|
||||||
-gtk-icon-effect: highlight;
|
|
||||||
background-color: #eb4d4b;
|
|
||||||
}
|
|
||||||
|
|
||||||
#idle_inhibitor {
|
|
||||||
background-color: #2d3436;
|
|
||||||
}
|
|
||||||
|
|
||||||
#idle_inhibitor.activated {
|
|
||||||
background-color: #ecf0f1;
|
|
||||||
color: #2d3436;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mpd {
|
|
||||||
background-color: #66cc99;
|
|
||||||
color: #2a5c45;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mpd.disconnected {
|
|
||||||
background-color: #f53c3c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mpd.stopped {
|
|
||||||
background-color: #90b1b1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mpd.paused {
|
|
||||||
background-color: #51a37a;
|
|
||||||
}
|
|
||||||
|
|
||||||
#language {
|
|
||||||
background: #00b093;
|
|
||||||
color: #740864;
|
|
||||||
padding: 0 5px;
|
|
||||||
margin: 0 5px;
|
|
||||||
min-width: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#keyboard-state {
|
|
||||||
background: #97e1ad;
|
|
||||||
color: #000000;
|
|
||||||
padding: 0 0px;
|
|
||||||
margin: 0 5px;
|
|
||||||
min-width: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#keyboard-state > label {
|
|
||||||
padding: 0 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#keyboard-state > label.locked {
|
|
||||||
background: rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scratchpad {
|
|
||||||
background: rgba(0, 0, 0, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
#scratchpad.empty {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#privacy {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#privacy-item {
|
|
||||||
padding: 0 5px;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#privacy-item.screenshare {
|
|
||||||
background-color: #cf5700;
|
|
||||||
}
|
|
||||||
|
|
||||||
#privacy-item.audio-in {
|
|
||||||
background-color: #1ca000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#privacy-item.audio-out {
|
|
||||||
background-color: #0069d4;
|
|
||||||
}
|
|
||||||
183
dotfiles/config/xmonad/flake.lock
generated
183
dotfiles/config/xmonad/flake.lock
generated
@@ -5,11 +5,11 @@
|
|||||||
"systems": "systems"
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1694529238,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -23,11 +23,11 @@
|
|||||||
"systems": "systems_2"
|
"systems": "systems_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1694529238,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -41,11 +41,29 @@
|
|||||||
"systems": "systems_3"
|
"systems": "systems_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1731533236,
|
"lastModified": 1694529238,
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
"owner": "numtide",
|
"owner": "numtide",
|
||||||
"repo": "flake-utils",
|
"repo": "flake-utils",
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_4": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_4"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -56,18 +74,19 @@
|
|||||||
},
|
},
|
||||||
"git-ignore-nix": {
|
"git-ignore-nix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs_2"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762808025,
|
"lastModified": 1694102001,
|
||||||
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
|
"narHash": "sha256-vky6VPK1n1od6vXbqzOXnekrQpTL4hbPAwUhT5J9c9E=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
|
"rev": "9e21c80adf67ebcb077d75bd5e7d724d21eeafd6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
|
"ref": "master",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -77,11 +96,11 @@
|
|||||||
"nixpkgs": "nixpkgs_3"
|
"nixpkgs": "nixpkgs_3"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762808025,
|
"lastModified": 1694102001,
|
||||||
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
|
"narHash": "sha256-vky6VPK1n1od6vXbqzOXnekrQpTL4hbPAwUhT5J9c9E=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
|
"rev": "9e21c80adf67ebcb077d75bd5e7d724d21eeafd6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -96,11 +115,11 @@
|
|||||||
"nixpkgs": "nixpkgs_4"
|
"nixpkgs": "nixpkgs_4"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1762808025,
|
"lastModified": 1694102001,
|
||||||
"narHash": "sha256-XmjITeZNMTQXGhhww6ed/Wacy2KzD6svioyCX7pkUu4=",
|
"narHash": "sha256-vky6VPK1n1od6vXbqzOXnekrQpTL4hbPAwUhT5J9c9E=",
|
||||||
"owner": "hercules-ci",
|
"owner": "hercules-ci",
|
||||||
"repo": "gitignore.nix",
|
"repo": "gitignore.nix",
|
||||||
"rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c",
|
"rev": "9e21c80adf67ebcb077d75bd5e7d724d21eeafd6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -112,12 +131,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1666603677,
|
"lastModified": 1693099187,
|
||||||
"narHash": "sha256-apAEIj+z1iwMaMJ4tB21r/VTetfGDLDzuhXRHJknIAU=",
|
"narHash": "sha256-FXCc6OIghv9k4xYOhSMZI6bj7o56S8BJKzKtTKzdUVQ=",
|
||||||
"owner": "NixOS",
|
"path": "/nix/store/wr9zk0l6xw1bi0zjrrsj998b5wgykyz5-source",
|
||||||
"repo": "nixpkgs",
|
"rev": "cf2004afe4d4b95a295c63c911e949e40915eedb",
|
||||||
"rev": "074da18a72269cc5a6cf444dce42daea5649b2fe",
|
"type": "path"
|
||||||
"type": "github"
|
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"id": "nixpkgs",
|
"id": "nixpkgs",
|
||||||
@@ -126,11 +144,11 @@
|
|||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs_2": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1769740369,
|
"lastModified": 1666603677,
|
||||||
"narHash": "sha256-xKPyJoMoXfXpDM5DFDZDsi9PHArf2k5BJjvReYXoFpM=",
|
"narHash": "sha256-apAEIj+z1iwMaMJ4tB21r/VTetfGDLDzuhXRHJknIAU=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "6308c3b21396534d8aaeac46179c14c439a89b8a",
|
"rev": "074da18a72269cc5a6cf444dce42daea5649b2fe",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -166,11 +184,23 @@
|
|||||||
"type": "indirect"
|
"type": "indirect"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs_5": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1693099187,
|
||||||
|
"narHash": "sha256-FXCc6OIghv9k4xYOhSMZI6bj7o56S8BJKzKtTKzdUVQ=",
|
||||||
|
"path": "/nix/store/wr9zk0l6xw1bi0zjrrsj998b5wgykyz5-source",
|
||||||
|
"rev": "cf2004afe4d4b95a295c63c911e949e40915eedb",
|
||||||
|
"type": "path"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"git-ignore-nix": "git-ignore-nix",
|
"nixpkgs": "nixpkgs",
|
||||||
"nixpkgs": "nixpkgs_2",
|
|
||||||
"xmonad": "xmonad",
|
"xmonad": "xmonad",
|
||||||
"xmonad-contrib": "xmonad-contrib"
|
"xmonad-contrib": "xmonad-contrib"
|
||||||
}
|
}
|
||||||
@@ -220,13 +250,44 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"systems_4": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"unstable": {
|
"unstable": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1769461804,
|
"lastModified": 1696019113,
|
||||||
"narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=",
|
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d",
|
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unstable_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696019113,
|
||||||
|
"narHash": "sha256-X3+DKYWJm93DRSdC5M6K5hLqzSya9BjibtBsuARoPco=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "f5892ddac112a1e9b3612c39af1b72987ee5783a",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@@ -239,49 +300,61 @@
|
|||||||
"xmonad": {
|
"xmonad": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_2",
|
"flake-utils": "flake-utils_2",
|
||||||
"git-ignore-nix": "git-ignore-nix_2",
|
"git-ignore-nix": "git-ignore-nix",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"unstable": "unstable"
|
"unstable": "unstable"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1767819257,
|
"lastModified": 1,
|
||||||
"narHash": "sha256-U7MIHr0B10wDSNgUvq4QTK22HZ4pl2oIYkdOKEMnxC4=",
|
"narHash": "sha256-dOrvPpypuNn/fAWY2XjMacpsAXEiMZ4Dll3Ot81iQL4=",
|
||||||
"owner": "xmonad",
|
"path": "./xmonad",
|
||||||
"repo": "xmonad",
|
"type": "path"
|
||||||
"rev": "bb33042d408c15d8727011b1ed4aa22b2716d73d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "xmonad",
|
"path": "./xmonad",
|
||||||
"repo": "xmonad",
|
"type": "path"
|
||||||
"type": "github"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"xmonad-contrib": {
|
"xmonad-contrib": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils_3",
|
"flake-utils": "flake-utils_3",
|
||||||
"git-ignore-nix": "git-ignore-nix_3",
|
"git-ignore-nix": "git-ignore-nix_2",
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
"nixpkgs"
|
"nixpkgs"
|
||||||
],
|
],
|
||||||
"xmonad": [
|
"xmonad": "xmonad_2"
|
||||||
"xmonad"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1755152326,
|
"lastModified": 1,
|
||||||
"narHash": "sha256-47gGXt1TxzfQx/6X895t/T8Ozj+7fmQdU1i4cwyxcSg=",
|
"narHash": "sha256-MwbeBTfcf6vE7bQvha4ueg5zLZxBiU3678ESYrXD4lw=",
|
||||||
"owner": "IvanMalison",
|
"path": "./xmonad-contrib",
|
||||||
"repo": "xmonad-contrib",
|
"type": "path"
|
||||||
"rev": "1a8da46855ca83e11cfb31cbbaed980ed7a8dfcc",
|
},
|
||||||
|
"original": {
|
||||||
|
"path": "./xmonad-contrib",
|
||||||
|
"type": "path"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xmonad_2": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_4",
|
||||||
|
"git-ignore-nix": "git-ignore-nix_3",
|
||||||
|
"nixpkgs": "nixpkgs_5",
|
||||||
|
"unstable": "unstable_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1695471545,
|
||||||
|
"narHash": "sha256-3EK3rWNuPsc4FwkY7S1sPVI4hr9O7/AXI5AqdO0gJ/A=",
|
||||||
|
"owner": "xmonad",
|
||||||
|
"repo": "xmonad",
|
||||||
|
"rev": "327c2cf0c14f8eec234ec74d1a657d3e2fd5df11",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "IvanMalison",
|
"owner": "xmonad",
|
||||||
"ref": "withMyChanges",
|
"repo": "xmonad",
|
||||||
"repo": "xmonad-contrib",
|
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,23 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs = {
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
flake-utils.url = github:numtide/flake-utils;
|
||||||
git-ignore-nix.url = "github:hercules-ci/gitignore.nix";
|
xmonad-contrib = {
|
||||||
xmonad = {
|
url = path:./xmonad-contrib;
|
||||||
url = "github:xmonad/xmonad";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
xmonad-contrib = {
|
xmonad = {
|
||||||
url = "github:IvanMalison/xmonad-contrib/withMyChanges";
|
url = path:./xmonad;
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
inputs.xmonad.follows = "xmonad";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
outputs = { self, flake-utils, nixpkgs, xmonad, xmonad-contrib, git-ignore-nix }:
|
outputs = { self, flake-utils, nixpkgs, xmonad, xmonad-contrib }:
|
||||||
let
|
let
|
||||||
overlay = import ./overlay.nix;
|
overlay = import ./overlay.nix;
|
||||||
overlays = [ overlay xmonad.overlay xmonad-contrib.overlay ];
|
overlays = [ overlay xmonad.overlay xmonad-contrib.overlay ];
|
||||||
in flake-utils.lib.eachDefaultSystem (system:
|
in flake-utils.lib.eachDefaultSystem (system:
|
||||||
let pkgs = import nixpkgs { inherit system overlays; config.allowBroken = true; };
|
let pkgs = import nixpkgs { inherit system overlays; config.allowBroken = true; };
|
||||||
in
|
in
|
||||||
{
|
rec {
|
||||||
devShell = pkgs.haskellPackages.shellFor {
|
devShell = pkgs.haskellPackages.shellFor {
|
||||||
packages = p: [ p.imalison-xmonad p.xmonad-contrib ];
|
packages = p: [ p.imalison-xmonad p.xmonad-contrib ];
|
||||||
buildInputs = with pkgs.haskellPackages; [
|
buildInputs = with pkgs.haskellPackages; [
|
||||||
|
|||||||
Submodule dotfiles/config/xmonad/xmonad updated: 8113e0fe55...5c2ba06902
Submodule dotfiles/config/xmonad/xmonad-contrib updated: 1a8da46855...229c7baf00
@@ -1019,7 +1019,7 @@ addKeys conf@XConfig { modMask = modm } =
|
|||||||
-- Non-XMonad
|
-- Non-XMonad
|
||||||
|
|
||||||
, ((modm, xK_v), spawn "xclip -o | xdotool type --file -")
|
, ((modm, xK_v), spawn "xclip -o | xdotool type --file -")
|
||||||
, ((hyper, xK_v), spawn "rofi -modi 'clipboard:greenclip print' -show clipboard")
|
, ((hyper, xK_v), spawn "rofi_clipit.sh")
|
||||||
, ((hyper, xK_p), spawn "rofi-pass")
|
, ((hyper, xK_p), spawn "rofi-pass")
|
||||||
, ((hyper, xK_h), spawn "rofi_shutter")
|
, ((hyper, xK_h), spawn "rofi_shutter")
|
||||||
, ((hyper, xK_c), spawn "shell_command.sh")
|
, ((hyper, xK_c), spawn "shell_command.sh")
|
||||||
@@ -1059,8 +1059,8 @@ addKeys conf@XConfig { modMask = modm } =
|
|||||||
, ((hyper .|. shiftMask, xK_q), spawn "toggle_mute_current_window.sh")
|
, ((hyper .|. shiftMask, xK_q), spawn "toggle_mute_current_window.sh")
|
||||||
, ((hctrl, xK_q), spawn "toggle_mute_current_window.sh only")
|
, ((hctrl, xK_q), spawn "toggle_mute_current_window.sh only")
|
||||||
|
|
||||||
, ((0, xF86XK_MonBrightnessUp), spawn "brightness.sh up")
|
, ((0, xF86XK_MonBrightnessUp), spawn "brightness.sh 5")
|
||||||
, ((0, xF86XK_MonBrightnessDown), spawn "brightness.sh down")
|
, ((0, xF86XK_MonBrightnessDown), spawn "brightness.sh -5")
|
||||||
|
|
||||||
] ++
|
] ++
|
||||||
|
|
||||||
|
|||||||
1
dotfiles/emacs.d/.gitignore
vendored
1
dotfiles/emacs.d/.gitignore
vendored
@@ -9,7 +9,6 @@
|
|||||||
.tern-port
|
.tern-port
|
||||||
.tutor
|
.tutor
|
||||||
/eln-cache
|
/eln-cache
|
||||||
/elpaca
|
|
||||||
/transient
|
/transient
|
||||||
/tree-sitter
|
/tree-sitter
|
||||||
README.el
|
README.el
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
(setq mc/cmds-to-run-for-all
|
(setq mc/cmds-to-run-for-all
|
||||||
'(
|
'(
|
||||||
TeX-insert-backslash
|
TeX-insert-backslash
|
||||||
align
|
|
||||||
backward-sexp
|
backward-sexp
|
||||||
beginning-of-buffer
|
beginning-of-buffer
|
||||||
beginning-of-visual-line
|
beginning-of-visual-line
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,10 +1,9 @@
|
|||||||
;; Elpaca Installer -*- lexical-binding: t; -*-
|
(defvar elpaca-installer-version 0.7)
|
||||||
(defvar elpaca-installer-version 0.11)
|
|
||||||
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
|
||||||
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
|
||||||
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
|
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
|
||||||
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git"
|
||||||
:ref nil :depth 1 :inherit ignore
|
:ref nil :depth 1
|
||||||
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
|
||||||
:build (:not elpaca--activate-package)))
|
:build (:not elpaca--activate-package)))
|
||||||
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
|
(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory))
|
||||||
@@ -14,26 +13,32 @@
|
|||||||
(add-to-list 'load-path (if (file-exists-p build) build repo))
|
(add-to-list 'load-path (if (file-exists-p build) build repo))
|
||||||
(unless (file-exists-p repo)
|
(unless (file-exists-p repo)
|
||||||
(make-directory repo t)
|
(make-directory repo t)
|
||||||
(when (<= emacs-major-version 28) (require 'subr-x))
|
(when (< emacs-major-version 28) (require 'subr-x))
|
||||||
(condition-case-unless-debug err
|
(condition-case-unless-debug err
|
||||||
(if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
(if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
|
||||||
((zerop (apply #'call-process `("git" nil ,buffer t "clone"
|
((zerop (apply #'call-process `("git" nil ,buffer t "clone"
|
||||||
,@(when-let* ((depth (plist-get order :depth)))
|
,@(when-let ((depth (plist-get order :depth)))
|
||||||
(list (format "--depth=%d" depth) "--no-single-branch"))
|
(list (format "--depth=%d" depth) "--no-single-branch"))
|
||||||
,(plist-get order :repo) ,repo))))
|
,(plist-get order :repo) ,repo))))
|
||||||
((zerop (call-process "git" nil buffer t "checkout"
|
((zerop (call-process "git" nil buffer t "checkout"
|
||||||
(or (plist-get order :ref) "--"))))
|
(or (plist-get order :ref) "--"))))
|
||||||
(emacs (concat invocation-directory invocation-name))
|
(emacs (concat invocation-directory invocation-name))
|
||||||
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch"
|
||||||
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
"--eval" "(byte-recompile-directory \".\" 0 'force)")))
|
||||||
((require 'elpaca))
|
((require 'elpaca))
|
||||||
((elpaca-generate-autoloads "elpaca" repo)))
|
((elpaca-generate-autoloads "elpaca" repo)))
|
||||||
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
|
||||||
(error "%s" (with-current-buffer buffer (buffer-string))))
|
(error "%s" (with-current-buffer buffer (buffer-string))))
|
||||||
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
((error) (warn "%s" err) (delete-directory repo 'recursive))))
|
||||||
(unless (require 'elpaca-autoloads nil t)
|
(unless (require 'elpaca-autoloads nil t)
|
||||||
(require 'elpaca)
|
(require 'elpaca)
|
||||||
(elpaca-generate-autoloads "elpaca" repo)
|
(elpaca-generate-autoloads "elpaca" repo)
|
||||||
(let ((load-source-file-function nil)) (load "./elpaca-autoloads"))))
|
(load "./elpaca-autoloads")))
|
||||||
|
|
||||||
(add-hook 'after-init-hook #'elpaca-process-queues)
|
(add-hook 'after-init-hook #'elpaca-process-queues)
|
||||||
|
|
||||||
(elpaca `(,@elpaca-order))
|
(elpaca `(,@elpaca-order))
|
||||||
|
|
||||||
|
(elpaca elpaca-use-package
|
||||||
|
;; Enable use-package :ensure support for Elpaca.
|
||||||
|
(elpaca-use-package-mode))
|
||||||
@@ -1,20 +1,37 @@
|
|||||||
;; -*- no-byte-compile: t; lexical-binding: t; -*-
|
;; -*- no-byte-compile: t -*-
|
||||||
|
|
||||||
(setq native-comp-deferred-compilation-deny-list '("magit"))
|
(setq native-comp-deferred-compilation-deny-list '("magit"))
|
||||||
(setq native-comp-always-compile t)
|
(setq native-comp-always-compile t)
|
||||||
(setq load-no-native t)
|
(setq load-no-native t)
|
||||||
(setq no-native-compile t)
|
(setq no-native-compile t)
|
||||||
|
(setq warning-minimum-level :emergency)
|
||||||
|
|
||||||
|
(setq package-enable-at-startup nil
|
||||||
|
straight-use-package-by-default t
|
||||||
|
straight-vc-git-default-protocol 'ssh)
|
||||||
|
|
||||||
|
(require 'use-package)
|
||||||
|
(setq use-package-enable-imenu-support t)
|
||||||
|
(setq use-package-always-ensure t)
|
||||||
|
|
||||||
(defvar imalison:do-benchmark nil)
|
(defvar imalison:do-benchmark nil)
|
||||||
|
|
||||||
(defun emacs-directory-filepath (filename)
|
(defun emacs-directory-filepath (filename)
|
||||||
(concat (file-name-directory load-file-name) filename))
|
(concat (file-name-directory load-file-name) filename))
|
||||||
|
|
||||||
(load-file (expand-file-name "elpaca-installer.el" user-emacs-directory))
|
(load (emacs-directory-filepath "elpaca.el"))
|
||||||
(elpaca elpaca-use-package (elpaca-use-package-mode))
|
|
||||||
(setq use-package-enable-imenu-support t)
|
|
||||||
(setq use-package-always-ensure t)
|
(setq use-package-always-ensure t)
|
||||||
|
|
||||||
|
(let ((bench-file (concat (file-name-directory user-init-file) "benchmark.el")))
|
||||||
|
(when (file-exists-p bench-file) (load bench-file)))
|
||||||
|
|
||||||
|
(use-package benchmark-init
|
||||||
|
:if imalison:do-benchmark
|
||||||
|
:demand t
|
||||||
|
:config
|
||||||
|
(setq max-specpdl-size 99999999))
|
||||||
|
|
||||||
(defvar imalison:kat-mode nil)
|
(defvar imalison:kat-mode nil)
|
||||||
(setq custom-file "~/.emacs.d/custom-before.el")
|
(setq custom-file "~/.emacs.d/custom-before.el")
|
||||||
(setq load-prefer-newer t)
|
(setq load-prefer-newer t)
|
||||||
@@ -25,28 +42,30 @@
|
|||||||
(setq mac-option-modifier 'meta)
|
(setq mac-option-modifier 'meta)
|
||||||
(setq mac-command-modifier 'super))
|
(setq mac-command-modifier 'super))
|
||||||
|
|
||||||
;;The packages in this section are used to as utilities in the rest of this init file.
|
(use-package transient
|
||||||
;;Ensure they are installed/activated first.
|
|
||||||
(use-package s
|
|
||||||
:ensure (:wait t)
|
|
||||||
:demand t)
|
:demand t)
|
||||||
|
|
||||||
(use-package dash
|
;; See https://github.com/magit/magit/discussions/4997 . Without this magit is broken.
|
||||||
:ensure (:wait t)
|
(use-package magit
|
||||||
:demand t
|
:demand t)
|
||||||
:config
|
|
||||||
(progn (dash-enable-font-lock)))
|
|
||||||
|
|
||||||
(use-package gh
|
;; This seems to fix issues with helm not explicitly declaring its dependency on async
|
||||||
:defer t
|
(use-package async :demand t)
|
||||||
:ensure (:host github :repo "IvanMalison/gh.el"))
|
|
||||||
|
|
||||||
(use-package shut-up
|
(use-package s :demand t)
|
||||||
:config
|
|
||||||
(defun imalison:shut-up-around (function &rest args)
|
|
||||||
(shut-up (apply function args))))
|
|
||||||
|
|
||||||
(use-package parse-csv :demand t)
|
;; Without this, org can behave very strangely
|
||||||
|
(use-package org
|
||||||
|
:ensure
|
||||||
|
(org :type git :host github :repo "colonelpanic8/org-mode" :local-repo "org"
|
||||||
|
:branch "my-main"
|
||||||
|
:depth full
|
||||||
|
:build
|
||||||
|
:wait t
|
||||||
|
(:not autoloads) :files
|
||||||
|
(:defaults "lisp/*.el" ("etc/styles/" "etc/styles/*"))))
|
||||||
|
|
||||||
|
(use-package dash :demand t)
|
||||||
|
|
||||||
(use-package emit
|
(use-package emit
|
||||||
:ensure (emit :type git :host github :repo "colonelpanic8/emit")
|
:ensure (emit :type git :host github :repo "colonelpanic8/emit")
|
||||||
@@ -69,35 +88,18 @@
|
|||||||
eval-region-or-last-sexp
|
eval-region-or-last-sexp
|
||||||
imalison:copy-eval-last-sexp)))
|
imalison:copy-eval-last-sexp)))
|
||||||
|
|
||||||
(use-package request :defer t)
|
(use-package s
|
||||||
|
:ensure (:inherit t :wait t)
|
||||||
;; Without this, org can behave very strangely
|
:config
|
||||||
(use-package org
|
(when (or (equal (s-trim (shell-command-to-string "whoami")) "kat")
|
||||||
:ensure
|
|
||||||
(org :type git :host github :repo "colonelpanic8/org-mode" :local-repo "org"
|
|
||||||
:branch "my-main-2025"
|
|
||||||
:depth full
|
|
||||||
:build (:not autoloads)
|
|
||||||
:files (:defaults "lisp/*.el" ("etc/styles/" "etc/styles/*"))
|
|
||||||
:wait t))
|
|
||||||
|
|
||||||
(elpaca-wait)
|
|
||||||
|
|
||||||
;; Install transient early to prevent built-in version from loading
|
|
||||||
(use-package transient
|
|
||||||
:ensure (:host github :repo "magit/transient" :wait t)
|
|
||||||
:demand t)
|
|
||||||
(elpaca-wait)
|
|
||||||
|
|
||||||
(when (or (equal (s-trim (shell-command-to-string "whoami")) "kat")
|
|
||||||
imalison:kat-mode)
|
imalison:kat-mode)
|
||||||
(let ((debug-on-error t))
|
(let ((debug-on-error t))
|
||||||
(org-babel-load-file
|
(org-babel-load-file
|
||||||
(concat (file-name-directory load-file-name) "kat-mode.org"))))
|
(concat (file-name-directory load-file-name) "kat-mode.org")))))
|
||||||
|
|
||||||
(let ((debug-on-error t))
|
(let ((debug-on-error t))
|
||||||
(org-babel-load-file
|
(org-babel-load-file
|
||||||
(expand-file-name "README.org" user-emacs-directory)))
|
(concat (file-name-directory load-file-name) "README.org")))
|
||||||
|
|
||||||
;; (when imalison:do-benchmark (benchmark-init/deactivate))
|
;; (when imalison:do-benchmark (benchmark-init/deactivate))
|
||||||
|
|
||||||
|
|||||||
@@ -58,11 +58,41 @@ This makes evil-mode play nice with org-fc
|
|||||||
(file+datetree "~/org/weekly_reviews.org")
|
(file+datetree "~/org/weekly_reviews.org")
|
||||||
(file "~/org/weekly_review_template.org")))))
|
(file "~/org/weekly_review_template.org")))))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Journal
|
|
||||||
|
** Daily Journal Entries
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(setq imalison:journal-template-filepath
|
(defun imalison:journal-filepath-for-date (&optional date)
|
||||||
(imalison:join-paths org-directory "templates" "daily-journal-template.org"))
|
(interactive (list (org-read-date)))
|
||||||
|
(let ((date-str (or date (format-time-string "%Y-%m-%d"))))
|
||||||
|
(imalison:join-paths
|
||||||
|
org-directory "journal" (concat date-str ".org"))))
|
||||||
|
|
||||||
|
(defun imalison:open-todays-org-journal ()
|
||||||
|
(interactive)
|
||||||
|
(imalison:open-org-journal (format-time-string "%Y-%m-%d")))
|
||||||
|
|
||||||
|
(defun imalison:get-journal-template ()
|
||||||
|
(with-temp-buffer
|
||||||
|
(insert-file-contents (imalison:join-paths org-directory "templates" "daily-journal-template.org"))
|
||||||
|
(buffer-string)))
|
||||||
|
|
||||||
|
(defun imalison:open-org-journal (&optional date)
|
||||||
|
(interactive (list (org-read-date nil nil nil "Select a date:")))
|
||||||
|
(let* ((filepath (imalison:journal-filepath-for-date date))
|
||||||
|
(file-existed (file-exists-p filepath))
|
||||||
|
(date-str (or date (format-time-string "%Y-%m-%d")))
|
||||||
|
(time-vals (append '(0 0 0) (nthcdr 3 (parse-time-string date-str))))
|
||||||
|
(original-format-time-string (symbol-function 'format-time-string)))
|
||||||
|
(find-file filepath)
|
||||||
|
(when (not file-existed)
|
||||||
|
(cl-letf (((symbol-function 'format-time-string)
|
||||||
|
(lambda (format-string &optional _time _universal)
|
||||||
|
(funcall original-format-time-string format-string (apply #'encode-time time-vals)))))
|
||||||
|
(insert (org-capture-fill-template (imalison:get-journal-template)))))))
|
||||||
|
|
||||||
|
(bind-key "C-c j" 'imalison:open-todays-org-journal)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Insert a link to a task selected from agenda
|
** Insert a link to a task selected from agenda
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(defun imalison:insert-link-to-agenda ()
|
(defun imalison:insert-link-to-agenda ()
|
||||||
@@ -90,7 +120,7 @@ This makes evil-mode play nice with org-fc
|
|||||||
*** javascript
|
*** javascript
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package ob-js
|
(use-package ob-js
|
||||||
:ensure nil
|
:straight nil
|
||||||
:after org
|
:after org
|
||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
@@ -131,10 +161,6 @@ This makes evil-mode play nice with org-fc
|
|||||||
* Packages
|
* Packages
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package org-drill)
|
(use-package org-drill)
|
||||||
(require 'package)
|
|
||||||
(add-to-list 'package-archives
|
|
||||||
'("melpa" . "https://melpa.org/packages/") t)
|
|
||||||
(package-initialize)
|
|
||||||
|
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -142,35 +168,3 @@ This makes evil-mode play nice with org-fc
|
|||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(setq org-wild-notifier-day-wide-alert-times nil)
|
(setq org-wild-notifier-day-wide-alert-times nil)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Swift
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(require 'package)
|
|
||||||
(add-to-list 'package-archives
|
|
||||||
'("melpa" . "https://melpa.org/packages/") t)
|
|
||||||
(package-initialize)
|
|
||||||
|
|
||||||
(unless (package-installed-p 'swift-mode)
|
|
||||||
(package-refresh-contents)
|
|
||||||
(package-install 'swift-mode))
|
|
||||||
|
|
||||||
(unless (package-installed-p 'lsp-mode)
|
|
||||||
(package-refresh-contents)
|
|
||||||
(package-install 'lsp-mode))
|
|
||||||
|
|
||||||
;; Swift Mode
|
|
||||||
(require 'swift-mode)
|
|
||||||
(add-to-list 'auto-mode-alist '("\\.swift\\'" . swift-mode))
|
|
||||||
|
|
||||||
;; LSP Mode
|
|
||||||
(require 'lsp-mode)
|
|
||||||
(add-hook 'swift-mode-hook #'lsp)
|
|
||||||
|
|
||||||
;; Set the path to SourceKit-LSP if it's not in your PATH
|
|
||||||
(setq lsp-sourcekit-executable "/path/to/sourcekit-lsp")
|
|
||||||
|
|
||||||
;; Optional: Set the path to your Swift toolchain if necessary
|
|
||||||
(setq lsp-sourcekit-executable-args '("-toolchain" "/path/to/swift-toolchain"))
|
|
||||||
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
;;; org-api.el --- org-agenda-api server configuration -*- lexical-binding: t; -*-
|
|
||||||
|
|
||||||
;; Load main emacs config to get org settings, custom commands, etc.
|
|
||||||
(let ((current-dir (if load-file-name (file-name-directory load-file-name) "~/.emacs.d/")))
|
|
||||||
(load (expand-file-name "init.el" current-dir)))
|
|
||||||
|
|
||||||
;; Ensure dependencies are loaded
|
|
||||||
(require 'simple-httpd)
|
|
||||||
(require 'org-agenda-api)
|
|
||||||
|
|
||||||
;; Configure capture templates for the API
|
|
||||||
;; These use the org-agenda-api format with :prompts for API parameters
|
|
||||||
(setq org-agenda-api-capture-templates
|
|
||||||
`(("gtd-todo"
|
|
||||||
:name "GTD Todo"
|
|
||||||
:template ("t" "Todo" entry (file "~/org/inbox.org")
|
|
||||||
(function (lambda ()
|
|
||||||
(imalison:make-org-todo-template :content "%^{Title}")))
|
|
||||||
:immediate-finish t)
|
|
||||||
:prompts (("Title" :type string :required t)))
|
|
||||||
("scheduled-todo"
|
|
||||||
:name "Scheduled Todo"
|
|
||||||
:template ("s" "Scheduled" entry (file "~/org/inbox.org")
|
|
||||||
"* TODO %^{Title}\nSCHEDULED: %^{When}t\n"
|
|
||||||
:immediate-finish t)
|
|
||||||
:prompts (("Title" :type string :required t)
|
|
||||||
("When" :type date :required t)))
|
|
||||||
("tagged-todo"
|
|
||||||
:name "Tagged Todo"
|
|
||||||
:template ("g" "Tagged" entry (file "~/org/inbox.org")
|
|
||||||
"* TODO %^{Title} %^{Tags}g\n"
|
|
||||||
:immediate-finish t)
|
|
||||||
:prompts (("Title" :type string :required t)
|
|
||||||
("Tags" :type tags :required nil)))))
|
|
||||||
|
|
||||||
;; Configure the server
|
|
||||||
(setq org-agenda-api-port 2025)
|
|
||||||
(setq org-agenda-api-inbox-file "~/org/inbox.org")
|
|
||||||
|
|
||||||
;; Start the server
|
|
||||||
(message "Starting org-agenda-api server on port %d" org-agenda-api-port)
|
|
||||||
(org-agenda-api-start)
|
|
||||||
(message "org-agenda-api server started")
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
* include-file-as-forms
|
* include-file-as-forms
|
||||||
We're going to use this to write separate parts of our config to different sections that will then be provided to our use package statment
|
We're going to use this to write separate parts of our config to different sections that will then be provided to our use package statment
|
||||||
#+begin_src emacs-lisp :tangle org-config.el
|
#+begin_src emacs-lisp
|
||||||
(defun imalison:include-file-as-forms (filename)
|
(defun imalison:include-file-as-forms (filename)
|
||||||
"Include the contents of FILENAME into the source as s-expressions."
|
"Include the contents of FILENAME into the source as s-expressions."
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
@@ -15,10 +15,9 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
`,@(nreverse forms))))
|
`,@(nreverse forms))))
|
||||||
#+end_src
|
#+end_src
|
||||||
* use-package
|
* use-package
|
||||||
#+begin_src emacs-lisp :tangle org-config.el
|
#+begin_src emacs-lisp
|
||||||
(defmacro imalison:org-config ()
|
(defmacro imalison:org-config ()
|
||||||
`(use-package org
|
`(use-package org
|
||||||
:ensure nil
|
|
||||||
:commands (org-mode org org-mobile-push org-mobile-pull org-agenda)
|
:commands (org-mode org org-mobile-push org-mobile-pull org-agenda)
|
||||||
:mode ("\\.org\\'" . org-mode)
|
:mode ("\\.org\\'" . org-mode)
|
||||||
:preface (progn ,@(imalison:include-file-as-forms (imalison:join-paths user-emacs-directory "org-config-preface.el")))
|
:preface (progn ,@(imalison:include-file-as-forms (imalison:join-paths user-emacs-directory "org-config-preface.el")))
|
||||||
@@ -29,25 +28,9 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
(imalison:org-config)
|
(imalison:org-config)
|
||||||
#+end_src
|
#+end_src
|
||||||
* My Customization Variables
|
* My Customization Variables
|
||||||
#+begin_src emacs-lisp :tangle org-config.el
|
|
||||||
;; Load org-config-preface when org-config.el is loaded directly.
|
|
||||||
(let ((preface (expand-file-name "org-config-preface.el" user-emacs-directory)))
|
|
||||||
(when (file-exists-p preface)
|
|
||||||
(load-file preface)))
|
|
||||||
|
|
||||||
;; Fallbacks in case preface isn't available yet.
|
|
||||||
(unless (boundp 'imalison:org-dir)
|
|
||||||
(defvar imalison:org-dir "~/org"))
|
|
||||||
(unless (boundp 'imalison:created-property-string)
|
|
||||||
(defvar imalison:created-property-string "
|
|
||||||
:PROPERTIES:
|
|
||||||
:ID: %(org-id-new)
|
|
||||||
:CREATED: %U
|
|
||||||
:END:"))
|
|
||||||
#+end_src
|
|
||||||
#+begin_src emacs-lisp :tangle org-config-preface.el
|
#+begin_src emacs-lisp :tangle org-config-preface.el
|
||||||
(defvar imalison:org-dir "~/org")
|
(defvar imalison:org-dir "~/org")
|
||||||
(defvar imalison:shared-org-dir "~/org")
|
(defvar imalison:shared-org-dir "~/katnivan")
|
||||||
(defvar imalison:org-whoami "Ivan Malison")
|
(defvar imalison:org-whoami "Ivan Malison")
|
||||||
(defvar imalison:org-people (list nil "Ivan Malison" "Kat Huang"))
|
(defvar imalison:org-people (list nil "Ivan Malison" "Kat Huang"))
|
||||||
(defvar imalison:org-people-associated-states
|
(defvar imalison:org-people-associated-states
|
||||||
@@ -79,11 +62,6 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
(imalison:join-paths imalison:shared-org-dir "ivan_orgzly.org")
|
(imalison:join-paths imalison:shared-org-dir "ivan_orgzly.org")
|
||||||
(imalison:join-paths imalison:org-dir "orgzly.org")))
|
(imalison:join-paths imalison:org-dir "orgzly.org")))
|
||||||
|
|
||||||
(defvar imalison:repeating-org-files
|
|
||||||
(list imalison:org-habits-file imalison:shared-habits-file imalison:shared-repeating-file))
|
|
||||||
|
|
||||||
(defvar imalison:include-repeating-in-agenda t)
|
|
||||||
|
|
||||||
(defun imalison:add-to-org-agenda-files (incoming-files)
|
(defun imalison:add-to-org-agenda-files (incoming-files)
|
||||||
(setq org-agenda-files
|
(setq org-agenda-files
|
||||||
(delete-dups
|
(delete-dups
|
||||||
@@ -93,7 +71,6 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
|
|
||||||
(defvar imalison:created-property-string "
|
(defvar imalison:created-property-string "
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: %(org-id-new)
|
|
||||||
:CREATED: %U
|
:CREATED: %U
|
||||||
:END:")
|
:END:")
|
||||||
#+end_src
|
#+end_src
|
||||||
@@ -114,7 +91,7 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
#+end_src
|
#+end_src
|
||||||
* Org Variable Customization
|
* Org Variable Customization
|
||||||
#+begin_src emacs-lisp :tangle org-config-custom.el
|
#+begin_src emacs-lisp :tangle org-config-custom.el
|
||||||
(org-agenda-log-mode-items '(closed state))
|
(org-agenda-log-mode-items '(closed))
|
||||||
(org-agenda-skip-deadline-if-done t)
|
(org-agenda-skip-deadline-if-done t)
|
||||||
(org-agenda-skip-scheduled-if-done t)
|
(org-agenda-skip-scheduled-if-done t)
|
||||||
(org-agenda-span 10)
|
(org-agenda-span 10)
|
||||||
@@ -222,35 +199,6 @@ We're going to use this to write separate parts of our config to different secti
|
|||||||
((current-time (&rest args) time))
|
((current-time (&rest args) time))
|
||||||
(funcall fn)))
|
(funcall fn)))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Reschedule Past Items to Today
|
|
||||||
This function finds all incomplete items in the agenda files that are scheduled
|
|
||||||
in the past and reschedules them to today. Useful for catching up on tasks that
|
|
||||||
have slipped past their original scheduled date.
|
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
|
||||||
(defun imalison:reschedule-past-to-today ()
|
|
||||||
"Reschedule all incomplete items scheduled in the past to today.
|
|
||||||
Iterates through all org-agenda files and reschedules any TODO items
|
|
||||||
that have a SCHEDULED date before today to the current date."
|
|
||||||
(interactive)
|
|
||||||
(let* ((today-time (org-time-string-to-time (format-time-string "<%Y-%m-%d>")))
|
|
||||||
(rescheduled-count 0))
|
|
||||||
(org-map-entries
|
|
||||||
(lambda ()
|
|
||||||
(let* ((scheduled (org-entry-get nil "SCHEDULED"))
|
|
||||||
(scheduled-time (when scheduled (org-time-string-to-time scheduled))))
|
|
||||||
(when (and scheduled-time
|
|
||||||
(not (org-entry-is-done-p))
|
|
||||||
(time-less-p scheduled-time today-time))
|
|
||||||
(org-schedule nil ".")
|
|
||||||
(cl-incf rescheduled-count))))
|
|
||||||
nil
|
|
||||||
'agenda)
|
|
||||||
(message "Rescheduled %d items to today" rescheduled-count)))
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
#+RESULTS:
|
|
||||||
: imalison:reschedule-past-to-today
|
|
||||||
|
|
||||||
** Miscellaneous
|
** Miscellaneous
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
#+begin_src emacs-lisp :tangle org-config-config.el
|
||||||
(add-to-list 'org-show-context-detail '(org-goto . lineage))
|
(add-to-list 'org-show-context-detail '(org-goto . lineage))
|
||||||
@@ -418,13 +366,12 @@ that have a SCHEDULED date before today to the current date."
|
|||||||
*** Agenda Files
|
*** Agenda Files
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
#+begin_src emacs-lisp :tangle org-config-config.el
|
||||||
(imalison:add-to-org-agenda-files
|
(imalison:add-to-org-agenda-files
|
||||||
(nconc (list imalison:org-gtd-file imalison:org-calendar-file
|
(nconc (list imalison:org-gtd-file imalison:org-habits-file
|
||||||
imalison:org-inbox-file imalison:shared-org-gtd-file
|
imalison:org-calendar-file imalison:org-inbox-file
|
||||||
imalison:shared-calendar-file imalison:shared-shopping-file)
|
imalison:shared-org-gtd-file imalison:shared-habits-file
|
||||||
|
imalison:shared-calendar-file imalison:shared-shopping-file
|
||||||
|
imalison:shared-repeating-file)
|
||||||
imalison:orgzly-files))
|
imalison:orgzly-files))
|
||||||
|
|
||||||
(when imalison:include-repeating-in-agenda
|
|
||||||
(imalison:add-to-org-agenda-files imalison:repeating-org-files))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Predicates
|
*** Predicates
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
#+begin_src emacs-lisp :tangle org-config-config.el
|
||||||
@@ -517,11 +464,7 @@ that have a SCHEDULED date before today to the current date."
|
|||||||
(missing-priority
|
(missing-priority
|
||||||
'(tags-todo "-PRIORITY={.}/!"
|
'(tags-todo "-PRIORITY={.}/!"
|
||||||
((org-agenda-overriding-header
|
((org-agenda-overriding-header
|
||||||
"These don't have priorities:"))))
|
"These don't have priorities:")))))
|
||||||
(high-priority-unscheduled
|
|
||||||
'(tags-todo "+PRIORITY<\"C\"-SCHEDULED={.}-DEADLINE={.}/!"
|
|
||||||
((org-agenda-overriding-header
|
|
||||||
"High priority without scheduled/deadline:")))))
|
|
||||||
|
|
||||||
(setq org-agenda-custom-commands
|
(setq org-agenda-custom-commands
|
||||||
`(("M" "Main agenda view"
|
`(("M" "Main agenda view"
|
||||||
@@ -550,12 +493,7 @@ that have a SCHEDULED date before today to the current date."
|
|||||||
((org-agenda-overriding-header "Completion History:")
|
((org-agenda-overriding-header "Completion History:")
|
||||||
(org-agenda-ndays 5)
|
(org-agenda-ndays 5)
|
||||||
(org-agenda-entry-types '(:none))
|
(org-agenda-entry-types '(:none))
|
||||||
(org-agenda-start-with-log-mode '(state)))))
|
(org-agenda-start-with-log-mode '(state))))))))
|
||||||
,(cons "i" (cons "Inbox" inbox))
|
|
||||||
,(cons "n" (cons "Next" next))
|
|
||||||
("w" "Wait" todo "WAIT"
|
|
||||||
((org-agenda-overriding-header "Waiting:")))
|
|
||||||
,(cons "u" (cons "High priority unscheduled" high-priority-unscheduled)))))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Filters
|
*** Filters
|
||||||
**** Regexp Presets
|
**** Regexp Presets
|
||||||
@@ -618,7 +556,6 @@ specific time, they should appear in the agenda at that time!
|
|||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(org-mode)
|
(org-mode)
|
||||||
(insert content)
|
(insert content)
|
||||||
(org-set-property "ID" (org-id-new))
|
|
||||||
(org-set-property "CREATED"
|
(org-set-property "CREATED"
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(org-insert-time-stamp
|
(org-insert-time-stamp
|
||||||
@@ -635,7 +572,6 @@ specific time, they should appear in the agenda at that time!
|
|||||||
(org-insert-heading)
|
(org-insert-heading)
|
||||||
(insert content)
|
(insert content)
|
||||||
(org-todo creation-state)
|
(org-todo creation-state)
|
||||||
(org-set-property "ID" (org-id-new))
|
|
||||||
(org-set-property "CREATED"
|
(org-set-property "CREATED"
|
||||||
(with-temp-buffer
|
(with-temp-buffer
|
||||||
(org-insert-time-stamp
|
(org-insert-time-stamp
|
||||||
@@ -652,47 +588,10 @@ specific time, they should appear in the agenda at that time!
|
|||||||
(defun imalison:make-org-linked-todo-template ()
|
(defun imalison:make-org-linked-todo-template ()
|
||||||
(imalison:make-org-todo-template "[#C] %? %A"))
|
(imalison:make-org-todo-template "[#C] %? %A"))
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Journal
|
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
|
||||||
(defun imalison:journal-filepath-for-date (&optional date)
|
|
||||||
(interactive (list (org-read-date)))
|
|
||||||
(let ((date-str (or date (format-time-string "%Y-%m-%d"))))
|
|
||||||
(imalison:join-paths
|
|
||||||
org-directory "journal" (concat date-str ".org"))))
|
|
||||||
|
|
||||||
(defun imalison:open-todays-org-journal ()
|
|
||||||
(interactive)
|
|
||||||
(imalison:open-org-journal (format-time-string "%Y-%m-%d")))
|
|
||||||
|
|
||||||
(defvar imalison:journal-template-filepath
|
|
||||||
(imalison:join-paths org-directory "capture-templates" "journal.org"))
|
|
||||||
|
|
||||||
(defun imalison:get-journal-template ()
|
|
||||||
(with-temp-buffer
|
|
||||||
(insert-file-contents imalison:journal-template-filepath)
|
|
||||||
(buffer-string)))
|
|
||||||
|
|
||||||
(defun imalison:open-org-journal (&optional date)
|
|
||||||
(interactive (list (org-read-date nil nil nil "Select a date:")))
|
|
||||||
(let* ((filepath (imalison:journal-filepath-for-date date))
|
|
||||||
(file-existed (file-exists-p filepath))
|
|
||||||
(date-str (or date (format-time-string "%Y-%m-%d")))
|
|
||||||
(time-vals (append '(0 0 0) (nthcdr 3 (parse-time-string date-str))))
|
|
||||||
(original-format-time-string (symbol-function 'format-time-string)))
|
|
||||||
(find-file filepath)
|
|
||||||
(when (not file-existed)
|
|
||||||
(cl-letf (((symbol-function 'format-time-string)
|
|
||||||
(lambda (format-string &optional _time _universal)
|
|
||||||
(funcall original-format-time-string format-string (apply #'encode-time time-vals)))))
|
|
||||||
(insert (org-capture-fill-template (imalison:get-journal-template)))))))
|
|
||||||
|
|
||||||
(bind-key "C-c j" 'imalison:open-todays-org-journal)
|
|
||||||
#+end_src
|
|
||||||
|
|
||||||
*** Templates
|
*** Templates
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
#+begin_src emacs-lisp :tangle org-config-config.el
|
||||||
(use-package org-capture
|
(use-package org-capture
|
||||||
:ensure nil
|
:straight nil
|
||||||
:config
|
:config
|
||||||
(add-to-list 'org-capture-templates
|
(add-to-list 'org-capture-templates
|
||||||
`("t" "GTD Todo (Linked)" entry (file ,imalison:org-gtd-file)
|
`("t" "GTD Todo (Linked)" entry (file ,imalison:org-gtd-file)
|
||||||
@@ -725,25 +624,9 @@ specific time, they should appear in the agenda at that time!
|
|||||||
"* TODO
|
"* TODO
|
||||||
SCHEDULED: %^t
|
SCHEDULED: %^t
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: %(org-id-new)
|
|
||||||
:CREATED: %U
|
:CREATED: %U
|
||||||
:STYLE: habit
|
:STYLE: habit
|
||||||
:END:"))
|
:END:")))
|
||||||
(add-to-list 'org-capture-templates
|
|
||||||
'("w" "Weekly Planning and Self Assesment"
|
|
||||||
plain
|
|
||||||
(function (lambda ()
|
|
||||||
(find-file (let ((date (format-time-string "%Y-%m-%d")))
|
|
||||||
(expand-file-name (concat date ".org")
|
|
||||||
"~/org/weekly")))))
|
|
||||||
(file "~/org/capture-templates/weekly.org")))
|
|
||||||
(add-to-list 'org-capture-templates
|
|
||||||
`("n" "Next (Scheduled Today)" entry (file ,imalison:org-gtd-file)
|
|
||||||
,(format "%s%s\n%s" "* NEXT %?" imalison:created-property-string
|
|
||||||
"SCHEDULED: %(format-time-string \"<%Y-%m-%d %a>\")")))
|
|
||||||
(add-to-list 'org-capture-templates
|
|
||||||
`("i" "Inbox" entry (file ,imalison:org-gtd-file)
|
|
||||||
(function (lambda (&rest args) (imalison:make-org-todo-template :creation-state "INBOX"))))))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
** Babel
|
** Babel
|
||||||
#+begin_src emacs-lisp :tangle org-config-config.el
|
#+begin_src emacs-lisp :tangle org-config-config.el
|
||||||
@@ -778,7 +661,6 @@ SCHEDULED: %^t
|
|||||||
Note that this does not go into org-config-config.el. This is on purpose
|
Note that this does not go into org-config-config.el. This is on purpose
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package org
|
(use-package org
|
||||||
:ensure nil
|
|
||||||
:after frame-mode
|
:after frame-mode
|
||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
@@ -792,7 +674,7 @@ Note that this does not go into org-config-config.el. This is on purpose
|
|||||||
** Disable yasnippet in org-mode
|
** Disable yasnippet in org-mode
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(use-package org
|
(use-package org
|
||||||
:ensure nil
|
:straight nil
|
||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
(defun imalison:disable-yas ()
|
(defun imalison:disable-yas ()
|
||||||
@@ -803,7 +685,6 @@ Note that this does not go into org-config-config.el. This is on purpose
|
|||||||
This was taken from [[http://emacs.stackexchange.com/questions/3374/set-the-background-of-org-exported-code-blocks-according-to-theme][here]].
|
This was taken from [[http://emacs.stackexchange.com/questions/3374/set-the-background-of-org-exported-code-blocks-according-to-theme][here]].
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(use-package org
|
(use-package org
|
||||||
:ensure nil
|
|
||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
(defun imalison:org-inline-css-hook (exporter)
|
(defun imalison:org-inline-css-hook (exporter)
|
||||||
@@ -851,7 +732,7 @@ This function replaces the default naming scheme with a call to
|
|||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(use-package ox
|
(use-package ox
|
||||||
:defer t
|
:defer t
|
||||||
:ensure nil
|
:straight nil
|
||||||
:config
|
:config
|
||||||
(defun org-export-get-reference (datum info)
|
(defun org-export-get-reference (datum info)
|
||||||
"Return a unique reference for DATUM, as a string.
|
"Return a unique reference for DATUM, as a string.
|
||||||
@@ -879,7 +760,7 @@ alphanumeric characters only."
|
|||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(use-package ox-html
|
(use-package ox-html
|
||||||
:commands (org-html-export-as-html org-html-export-as-html)
|
:commands (org-html-export-as-html org-html-export-as-html)
|
||||||
:ensure nil
|
:straight nil
|
||||||
:preface
|
:preface
|
||||||
(progn
|
(progn
|
||||||
(defvar imalison:link-svg-html
|
(defvar imalison:link-svg-html
|
||||||
@@ -911,7 +792,7 @@ alphanumeric characters only."
|
|||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(use-package ox-html
|
(use-package ox-html
|
||||||
:defer t
|
:defer t
|
||||||
:ensure nil
|
:straight nil
|
||||||
:config
|
:config
|
||||||
(setq org-html-inline-image-rules
|
(setq org-html-inline-image-rules
|
||||||
'(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\(\\?.*?\\)?\\'")
|
'(("file" . "\\.\\(jpeg\\|jpg\\|png\\|gif\\|svg\\)\\(\\?.*?\\)?\\'")
|
||||||
@@ -1020,6 +901,8 @@ alphanumeric characters only."
|
|||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
(when (version<= "29.0" emacs-version)
|
(when (version<= "29.0" emacs-version)
|
||||||
|
(use-package emacsql-sqlite-builtin
|
||||||
|
:demand t)
|
||||||
(setq org-roam-database-connector 'sqlite-builtin))
|
(setq org-roam-database-connector 'sqlite-builtin))
|
||||||
(org-roam-db-autosync-mode +1)
|
(org-roam-db-autosync-mode +1)
|
||||||
|
|
||||||
@@ -1041,23 +924,20 @@ alphanumeric characters only."
|
|||||||
((get-buffer org-roam-buffer) 'exists)
|
((get-buffer org-roam-buffer) 'exists)
|
||||||
(t 'none)))
|
(t 'none)))
|
||||||
|
|
||||||
;; org-roam-buffer-visibility-fn was removed in newer org-roam versions
|
(use-package frame-mode
|
||||||
(when (and imalison:use-frame-mode (boundp 'org-roam-buffer-visibility-fn))
|
:if imalison:use-frame-mode
|
||||||
(require 'frame-mode)
|
:demand t
|
||||||
(emit-variable-set-mode
|
:config
|
||||||
imalison:org-roam-set-frame-visibility-mode
|
(progn
|
||||||
org-roam-buffer-visibility-fn 'imalison:org-roam-frame-based-buffer-visibility-fn)
|
(emit-variable-set-mode
|
||||||
(emit-make-mode-dependent imalison:org-roam-set-frame-visibility-mode frame-mode)))
|
imalison:org-roam-set-frame-visibility-mode
|
||||||
|
org-roam-buffer-visibility-fn 'imalison:org-roam-frame-based-buffer-visibility-fn)
|
||||||
|
(emit-make-mode-dependent imalison:org-roam-set-frame-visibility-mode frame-mode))))
|
||||||
:custom
|
:custom
|
||||||
(org-roam-directory (file-truename "~/org/roam/")))
|
(org-roam-directory (file-truename "~/org/roam/")))
|
||||||
#+end_src
|
#+end_src
|
||||||
***** ui
|
***** ui
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package simple-httpd
|
|
||||||
:ensure (:host github :repo "skeeto/emacs-web-server"
|
|
||||||
:local-repo "simple-httpd"
|
|
||||||
:files ("simple-httpd.el")))
|
|
||||||
|
|
||||||
(use-package org-roam-ui
|
(use-package org-roam-ui
|
||||||
:after org-roam
|
:after org-roam
|
||||||
:custom
|
:custom
|
||||||
@@ -1121,7 +1001,7 @@ alphanumeric characters only."
|
|||||||
:config
|
:config
|
||||||
(progn
|
(progn
|
||||||
(require 'org-fc-hydra))
|
(require 'org-fc-hydra))
|
||||||
:ensure (:host github :repo "l3kn/org-fc"
|
:straight (org-fc :type git :host github :repo "l3kn/org-fc"
|
||||||
:files ("*.el" "awk" "demo.org")))
|
:files ("*.el" "awk" "demo.org")))
|
||||||
#+end_src
|
#+end_src
|
||||||
** org-ql
|
** org-ql
|
||||||
@@ -1134,10 +1014,11 @@ alphanumeric characters only."
|
|||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package org-window-habit
|
(use-package org-window-habit
|
||||||
:demand t
|
:demand t
|
||||||
:ensure
|
:straight
|
||||||
(:repo "colonelpanic8/org-window-habit"
|
(org-window-habit
|
||||||
|
:repo "colonelpanic8/org-window-habit"
|
||||||
:host github
|
:host github
|
||||||
:files (:defaults "*.el"))
|
:files ("org-window-habit.el"))
|
||||||
:custom
|
:custom
|
||||||
((org-window-habit-property-prefix nil)
|
((org-window-habit-property-prefix nil)
|
||||||
(org-window-habit-repeat-to-scheduled t)
|
(org-window-habit-repeat-to-scheduled t)
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# -*- mode: snippet -*-
|
|
||||||
# name: inp
|
|
||||||
# key: inp
|
|
||||||
# --
|
|
||||||
import numpy as np
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# -*- mode: snippet -*-
|
|
||||||
# name: isa
|
|
||||||
# key: isa
|
|
||||||
# --
|
|
||||||
import sqlalchemy as sa
|
|
||||||
@@ -24,6 +24,7 @@ pom.xml
|
|||||||
TAGS
|
TAGS
|
||||||
|
|
||||||
# Vim
|
# Vim
|
||||||
|
*.sw*
|
||||||
*.tmp*
|
*.tmp*
|
||||||
|
|
||||||
# JavaScript
|
# JavaScript
|
||||||
|
|||||||
20
dotfiles/gtkrc-2.0
Normal file
20
dotfiles/gtkrc-2.0
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
binding "gtk-emacs-text-entry"
|
||||||
|
{
|
||||||
|
bind "<alt>BackSpace" { "delete-from-cursor" (word-ends, -1) }
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk-theme-name="Paper"
|
||||||
|
gtk-icon-theme-name="Paper"
|
||||||
|
gtk-font-name="Roboto 11"
|
||||||
|
gtk-cursor-theme-name="Paper"
|
||||||
|
gtk-cursor-theme-size=0
|
||||||
|
gtk-toolbar-style=GTK_TOOLBAR_BOTH
|
||||||
|
gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
|
||||||
|
gtk-button-images=1
|
||||||
|
gtk-menu-images=1
|
||||||
|
gtk-enable-event-sounds=1
|
||||||
|
gtk-enable-input-feedback-sounds=1
|
||||||
|
gtk-xft-antialias=1
|
||||||
|
gtk-xft-hinting=1
|
||||||
|
gtk-xft-hintstyle="hintfull"
|
||||||
|
|
||||||
@@ -1,164 +0,0 @@
|
|||||||
#!/usr/bin/env runhaskell
|
|
||||||
|
|
||||||
import System.Environment (getArgs)
|
|
||||||
import System.Process
|
|
||||||
import System.Exit
|
|
||||||
import Data.List (isPrefixOf, isSuffixOf)
|
|
||||||
import Data.Maybe (mapMaybe, fromMaybe)
|
|
||||||
import Text.Read (readMaybe)
|
|
||||||
import Control.Monad (forM, when)
|
|
||||||
import Data.Time.Clock
|
|
||||||
import Data.Time.Format
|
|
||||||
import System.IO
|
|
||||||
|
|
||||||
-- Types
|
|
||||||
data Device = Device { deviceName :: String, deviceBrightness :: Int }
|
|
||||||
deriving (Show)
|
|
||||||
|
|
||||||
data BrightnessCommand = Absolute Int | Increase Int | Decrease Int | Query
|
|
||||||
deriving (Show)
|
|
||||||
|
|
||||||
-- Logging
|
|
||||||
logAction :: String -> IO ()
|
|
||||||
logAction arg = do
|
|
||||||
time <- getCurrentTime
|
|
||||||
let timeStr = formatTime defaultTimeLocale "%Y-%m-%d %H:%M:%S" time
|
|
||||||
ppid <- readProcess "sh" ["-c", "ps -p $PPID -o comm= 2>/dev/null || echo unknown"] ""
|
|
||||||
pwd <- readProcess "pwd" [] ""
|
|
||||||
let logEntry = "[" ++ timeStr ++ "] Called with: '" ++ arg ++ "' | Parent: " ++
|
|
||||||
filter (/= '\n') ppid ++ " | PWD: " ++ filter (/= '\n') pwd ++ "\n"
|
|
||||||
appendFile "/tmp/brightness.log" logEntry
|
|
||||||
|
|
||||||
-- Parse command line argument
|
|
||||||
parseArg :: String -> BrightnessCommand
|
|
||||||
parseArg "" = Query
|
|
||||||
parseArg ('+':rest) = case readMaybe rest of
|
|
||||||
Just n -> Increase n
|
|
||||||
Nothing -> Query
|
|
||||||
parseArg ('-':rest) = case readMaybe rest of
|
|
||||||
Just n -> Decrease n
|
|
||||||
Nothing -> Query
|
|
||||||
parseArg s = case readMaybe s of
|
|
||||||
Just n -> Absolute n
|
|
||||||
Nothing -> Query
|
|
||||||
|
|
||||||
-- Get list of backlight devices
|
|
||||||
getBacklightDevices :: IO [String]
|
|
||||||
getBacklightDevices = do
|
|
||||||
output <- readProcess "brightnessctl" ["--list"] ""
|
|
||||||
return $ mapMaybe extractDevice (lines output)
|
|
||||||
where
|
|
||||||
extractDevice line
|
|
||||||
| "Device '" `isInfixOf` line && "class 'backlight'" `isInfixOf` line =
|
|
||||||
let afterDevice = drop (length "Device '") line
|
|
||||||
deviceName = takeWhile (/= '\'') afterDevice
|
|
||||||
in if null deviceName then Nothing else Just deviceName
|
|
||||||
| otherwise = Nothing
|
|
||||||
|
|
||||||
-- Get brightness percentage for a device
|
|
||||||
getDeviceBrightness :: String -> IO (Maybe Int)
|
|
||||||
getDeviceBrightness device = do
|
|
||||||
output <- readProcess "brightnessctl" ["-d", device] ""
|
|
||||||
return $ extractPercentage output
|
|
||||||
where
|
|
||||||
extractPercentage s = case dropWhile (/= '(') s of
|
|
||||||
('(':rest) -> readMaybe (takeWhile (/= '%') rest)
|
|
||||||
_ -> Nothing
|
|
||||||
|
|
||||||
-- Set brightness for a device
|
|
||||||
setDeviceBrightness :: String -> String -> IO ()
|
|
||||||
setDeviceBrightness device cmd = do
|
|
||||||
_ <- readProcess "brightnessctl" ["-d", device, "set", cmd] ""
|
|
||||||
return ()
|
|
||||||
|
|
||||||
-- Build brightness command string
|
|
||||||
buildCommand :: BrightnessCommand -> String
|
|
||||||
buildCommand (Absolute n) = show n ++ "%"
|
|
||||||
buildCommand (Increase n) = show n ++ "%+"
|
|
||||||
buildCommand (Decrease n) = show n ++ "%-"
|
|
||||||
buildCommand Query = ""
|
|
||||||
|
|
||||||
-- Apply brightness change to all devices
|
|
||||||
applyBrightness :: BrightnessCommand -> IO ()
|
|
||||||
applyBrightness Query = return ()
|
|
||||||
applyBrightness cmd = do
|
|
||||||
devices <- getBacklightDevices
|
|
||||||
let cmdStr = buildCommand cmd
|
|
||||||
|
|
||||||
-- Log what we're about to do
|
|
||||||
appendFile "/tmp/brightness.log" $
|
|
||||||
" Applying: " ++ cmdStr ++ " to devices: " ++ show devices ++ "\n"
|
|
||||||
|
|
||||||
-- Apply to all devices
|
|
||||||
mapM_ (\dev -> setDeviceBrightness dev cmdStr) devices
|
|
||||||
|
|
||||||
-- Sync devices if needed
|
|
||||||
when (length devices > 1) $ do
|
|
||||||
brightnesses <- forM devices $ \dev -> do
|
|
||||||
mbBright <- getDeviceBrightness dev
|
|
||||||
return (dev, mbBright)
|
|
||||||
|
|
||||||
let validBrightnesses = [(d, b) | (d, Just b) <- brightnesses]
|
|
||||||
when (not $ null validBrightnesses) $ do
|
|
||||||
let values = map snd validBrightnesses
|
|
||||||
maxBright = maximum values
|
|
||||||
minBright = minimum values
|
|
||||||
|
|
||||||
-- If devices are out of sync
|
|
||||||
when (maxBright /= minBright) $ do
|
|
||||||
-- Use minimum when brightness is low (15% or below)
|
|
||||||
let syncValue = if maxBright <= 15 then minBright else maxBright
|
|
||||||
-- Log sync decision for debugging
|
|
||||||
appendFile "/tmp/brightness.log" $
|
|
||||||
" Syncing: max=" ++ show maxBright ++ "%, min=" ++ show minBright ++
|
|
||||||
"%, using=" ++ show syncValue ++ "%\n"
|
|
||||||
mapM_ (\dev -> setDeviceBrightness dev (show syncValue ++ "%")) devices
|
|
||||||
|
|
||||||
-- Get average brightness across all devices
|
|
||||||
getAverageBrightness :: IO Int
|
|
||||||
getAverageBrightness = do
|
|
||||||
devices <- getBacklightDevices
|
|
||||||
if null devices
|
|
||||||
then return 50 -- Default fallback
|
|
||||||
else do
|
|
||||||
brightnesses <- forM devices getDeviceBrightness
|
|
||||||
let validValues = [b | Just b <- brightnesses]
|
|
||||||
if null validValues
|
|
||||||
then return 50
|
|
||||||
else return $ sum validValues `div` length validValues
|
|
||||||
|
|
||||||
-- Send notification using rumno if available
|
|
||||||
sendNotification :: Int -> IO ()
|
|
||||||
sendNotification brightness = do
|
|
||||||
rumnoExists <- (== ExitSuccess) <$>
|
|
||||||
rawSystem "sh" ["-c", "command -v rumno >/dev/null 2>&1"]
|
|
||||||
if rumnoExists
|
|
||||||
then do
|
|
||||||
_ <- readProcess "rumno" ["notify", "-b", show brightness] ""
|
|
||||||
return ()
|
|
||||||
else putStrLn (show brightness)
|
|
||||||
|
|
||||||
-- Check if a string contains another
|
|
||||||
isInfixOf :: String -> String -> Bool
|
|
||||||
isInfixOf needle haystack = any (isPrefixOf needle) (tails haystack)
|
|
||||||
where
|
|
||||||
tails [] = [[]]
|
|
||||||
tails xs@(_:xs') = xs : tails xs'
|
|
||||||
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
args <- getArgs
|
|
||||||
let arg = case args of
|
|
||||||
[] -> ""
|
|
||||||
(x:_) -> x
|
|
||||||
|
|
||||||
-- Log the invocation
|
|
||||||
logAction arg
|
|
||||||
|
|
||||||
-- Parse and apply command
|
|
||||||
let cmd = parseArg arg
|
|
||||||
applyBrightness cmd
|
|
||||||
|
|
||||||
-- Get current brightness and notify
|
|
||||||
brightness <- getAverageBrightness
|
|
||||||
sendNotification brightness
|
|
||||||
@@ -1,92 +1,3 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
# Get the brightness argument (default to empty string to just show current)
|
volnoti-show $(sudo brightness_manager.py -c "$@" -p)
|
||||||
ARG="${1:-}"
|
|
||||||
|
|
||||||
# Log the incoming arguments for debugging
|
|
||||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] brightness.sh called with: '$ARG' (all args: $@)" >> /tmp/brightness_bash.log
|
|
||||||
|
|
||||||
# Function to get current brightness percentage
|
|
||||||
get_brightness_percentage() {
|
|
||||||
# Get list of display backlight devices only (filter by class 'backlight')
|
|
||||||
local devices=$(brightnessctl --list 2>/dev/null | grep 'class.*backlight' | cut -d' ' -f2 | cut -d"'" -f2)
|
|
||||||
local device_count=$(echo "$devices" | wc -w)
|
|
||||||
|
|
||||||
if [ "$device_count" -eq 0 ]; then
|
|
||||||
echo "50" # Default fallback
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$device_count" -eq 1 ]; then
|
|
||||||
# Single device - just output its percentage
|
|
||||||
local info=$(brightnessctl 2>/dev/null | grep -oP '\d+%' | head -1 | tr -d '%')
|
|
||||||
if [ -n "$info" ]; then
|
|
||||||
echo "$info"
|
|
||||||
else
|
|
||||||
echo "50"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Multiple devices - calculate average brightness
|
|
||||||
local total=0
|
|
||||||
local count=0
|
|
||||||
for device in $devices; do
|
|
||||||
local info=$(brightnessctl -d "$device" 2>/dev/null | grep -oP '\d+%' | head -1 | tr -d '%')
|
|
||||||
if [ -n "$info" ]; then
|
|
||||||
total=$((total + info))
|
|
||||||
count=$((count + 1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ "$count" -gt 0 ]; then
|
|
||||||
echo $((total / count))
|
|
||||||
else
|
|
||||||
echo "50"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Apply brightness change if argument provided
|
|
||||||
if [ -n "$ARG" ]; then
|
|
||||||
# Determine if it's absolute or relative
|
|
||||||
if [[ "$ARG" == "up" ]]; then
|
|
||||||
# Increase by 5%
|
|
||||||
BRIGHTNESS_CMD="5%+"
|
|
||||||
elif [[ "$ARG" == "down" ]]; then
|
|
||||||
# Decrease by 5%
|
|
||||||
BRIGHTNESS_CMD="5%-"
|
|
||||||
elif [[ "$ARG" == +* ]]; then
|
|
||||||
# Relative increase (e.g., +5)
|
|
||||||
BRIGHTNESS_CMD="${ARG:1}%+"
|
|
||||||
elif [[ "$ARG" == -* ]]; then
|
|
||||||
# Relative decrease (e.g., -5)
|
|
||||||
BRIGHTNESS_CMD="${ARG:1}%-"
|
|
||||||
else
|
|
||||||
# Absolute value (e.g., 50)
|
|
||||||
BRIGHTNESS_CMD="${ARG}%"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Try to apply to all devices
|
|
||||||
# Get list of display backlight devices only (filter by class 'backlight')
|
|
||||||
DEVICES=$(brightnessctl --list 2>/dev/null | grep 'class.*backlight' | cut -d' ' -f2 | cut -d"'" -f2)
|
|
||||||
|
|
||||||
if [ -n "$DEVICES" ]; then
|
|
||||||
# Apply to each device independently without syncing
|
|
||||||
# This allows each device to maintain its own brightness range
|
|
||||||
for device in $DEVICES; do
|
|
||||||
brightnessctl -d "$device" set "$BRIGHTNESS_CMD" >/dev/null 2>&1
|
|
||||||
done
|
|
||||||
else
|
|
||||||
# Fallback: just run brightnessctl without specifying device
|
|
||||||
brightnessctl set "$BRIGHTNESS_CMD" >/dev/null 2>&1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Get current brightness percentage for display
|
|
||||||
BRIGHTNESS=$(get_brightness_percentage)
|
|
||||||
|
|
||||||
# Show notification if rumno is available
|
|
||||||
if command -v rumno &> /dev/null; then
|
|
||||||
rumno notify -b "$BRIGHTNESS"
|
|
||||||
else
|
|
||||||
echo "$BRIGHTNESS"
|
|
||||||
fi
|
|
||||||
|
|||||||
76
dotfiles/lib/bin/brightness_manager.py
Executable file
76
dotfiles/lib/bin/brightness_manager.py
Executable file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
class BrightnessManager(object):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def find_brightness(cls):
|
||||||
|
return cls.from_path(
|
||||||
|
os.path.join("/sys/class/backlight", os.listdir("/sys/class/backlight")[0])
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_path(cls, path):
|
||||||
|
return cls(
|
||||||
|
set_brightness_filepath=os.path.join(path, "brightness"),
|
||||||
|
actual_brightness_filepath=os.path.join(path, "actual_brightness"),
|
||||||
|
max_brightness_filepath=os.path.join(path, "max_brightness"),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self, set_brightness_filepath, max_brightness_filepath, actual_brightness_filepath
|
||||||
|
):
|
||||||
|
self.set_brightness_filepath = set_brightness_filepath
|
||||||
|
self.max_brightness_filepath = max_brightness_filepath
|
||||||
|
self.actual_brightness_filepath = actual_brightness_filepath
|
||||||
|
|
||||||
|
@property
|
||||||
|
def current_brightness(self):
|
||||||
|
with open(self.actual_brightness_filepath) as fd:
|
||||||
|
return int(fd.read())
|
||||||
|
|
||||||
|
@property
|
||||||
|
def max_brightness(self):
|
||||||
|
with open(self.max_brightness_filepath) as fd:
|
||||||
|
return int(fd.read())
|
||||||
|
|
||||||
|
@current_brightness.setter
|
||||||
|
def current_brightness(self, brightness):
|
||||||
|
with open(self.set_brightness_filepath, 'w') as fd:
|
||||||
|
fd.write(str(brightness))
|
||||||
|
|
||||||
|
def increment_by_proportion(self, proportion):
|
||||||
|
new_brightness = self.current_brightness + int(self.max_brightness * proportion)
|
||||||
|
new_brightness = min(new_brightness, self.max_brightness)
|
||||||
|
self.current_brightness = new_brightness
|
||||||
|
|
||||||
|
@property
|
||||||
|
def current_proportion(self):
|
||||||
|
return float(self.current_brightness) / self.max_brightness
|
||||||
|
|
||||||
|
|
||||||
|
def build_parser():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Interact with macbook brightness',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--change", "-c",
|
||||||
|
help="Change volume by the given percentage",
|
||||||
|
default=0
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--print", "-p", dest="do_print",
|
||||||
|
action='store_true',
|
||||||
|
default=False
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
args = build_parser().parse_args()
|
||||||
|
BrightnessManager.find_brightness().increment_by_proportion(float(args.change) / 100)
|
||||||
|
if args.do_print:
|
||||||
|
print(int(IntelBrightnessManager.current_proportion * 100))
|
||||||
63
dotfiles/lib/bin/clipit_history.py
Executable file
63
dotfiles/lib/bin/clipit_history.py
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from __future__ import print_function
|
||||||
|
import appdirs
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
|
||||||
|
|
||||||
|
clipit_history_file = os.path.join(
|
||||||
|
appdirs.user_data_dir(), "clipit/history",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_clipit_history(filename):
|
||||||
|
with open(filename, 'rb') as f:
|
||||||
|
f.read(68)
|
||||||
|
size, _ = struct.unpack('2i', f.read(8))
|
||||||
|
while (size > 0):
|
||||||
|
item = f.read(size)
|
||||||
|
if item:
|
||||||
|
yield item.decode('utf-8')
|
||||||
|
_, _, _, size, _ = struct.unpack('5i', f.read(20))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='Lookup clipit history')
|
||||||
|
parser.add_argument(
|
||||||
|
'--separator', '-s',
|
||||||
|
help='the separator to use when outputting history',
|
||||||
|
type=str,
|
||||||
|
default='\n',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--begin-index', '-b',
|
||||||
|
type=int,
|
||||||
|
default=0
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--end-index', '-e',
|
||||||
|
type=int,
|
||||||
|
default=None
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--index', '-i',
|
||||||
|
type=int,
|
||||||
|
default=None
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--separator-replacement', '-r',
|
||||||
|
type=str,
|
||||||
|
default=None
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
if not args.separator_replacement:
|
||||||
|
args.separator_replacement = args.separator
|
||||||
|
history = list(get_clipit_history(clipit_history_file))
|
||||||
|
if args.index is not None:
|
||||||
|
text = history[args.index]
|
||||||
|
else:
|
||||||
|
selected = history[args.begin_index:args.end_index]
|
||||||
|
text = args.separator.join([s.replace(args.separator, args.separator_replacement)
|
||||||
|
for s in selected])
|
||||||
|
print(text, end='')
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
rofi -modi "clipboard:greenclip print" -show clipboard
|
|
||||||
9
dotfiles/lib/bin/rofi_clipit.sh
Executable file
9
dotfiles/lib/bin/rofi_clipit.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
SELECTED_INDEX="$(clipit_history.py -r '(newline)' | rofi -dmenu -format i)"
|
||||||
|
|
||||||
|
if [ "$SELECTED_INDEX" -eq "$SELECTED_INDEX" ] 2>/dev/null; then
|
||||||
|
xdotool type "$(clipit_history.py -e 5 -i $SELECTED_INDEX)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
xdotool type
|
||||||
@@ -1,40 +1,13 @@
|
|||||||
#!/usr/bin/env zsh
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
otherinputs () {
|
otherinputs () {
|
||||||
get_sink_input_info.hs | jq 'select(.application_process_id != "'"$1"'")'
|
get_sink_input_info.hs | jq 'select(.application_process_id != "'"$1"'")'
|
||||||
}
|
}
|
||||||
|
|
||||||
get_active_pid () {
|
thePID="$(xprop _NET_WM_PID -id $(xdotool getactivewindow) | grep -Eo '[0-9]*')"
|
||||||
if [[ "${XDG_SESSION_TYPE:-}" == "wayland" ]] && command -v hyprctl >/dev/null 2>&1; then
|
sinkInfo="$(pashowinputbypid $thePID)"
|
||||||
hyprctl activewindow -j | jq -r '.pid'
|
sinkID="$(echo $sinkInfo | jq -r .sink_input_id)"
|
||||||
else
|
muted="$(echo $sinkInfo | jq -r .Mute)"
|
||||||
xprop _NET_WM_PID -id "$(xdotool getactivewindow)" | grep -Eo '[0-9]*'
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_sink_info_by_pid () {
|
|
||||||
local pid="$1"
|
|
||||||
if command -v pashowinputbypid >/dev/null 2>&1; then
|
|
||||||
pashowinputbypid "$pid"
|
|
||||||
else
|
|
||||||
pactl -f json list sink-inputs | jq -c --arg pid "$pid" '
|
|
||||||
.[] | select(.properties."application.process.id" == ($pid|tonumber)) |
|
|
||||||
{ sink_input_id: .index, Mute: (if .mute then "yes" else "no" end) }
|
|
||||||
' | head -1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
thePID="$(get_active_pid)"
|
|
||||||
sinkInfo="$(get_sink_info_by_pid "$thePID")"
|
|
||||||
|
|
||||||
if [[ -z "$sinkInfo" ]]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
sinkID="$(echo "$sinkInfo" | jq -r .sink_input_id)"
|
|
||||||
muted="$(echo "$sinkInfo" | jq -r .Mute)"
|
|
||||||
if [[ $muted == *"no"* ]]; then
|
if [[ $muted == *"no"* ]]; then
|
||||||
newState="1"
|
newState="1"
|
||||||
else
|
else
|
||||||
@@ -43,7 +16,7 @@ fi
|
|||||||
|
|
||||||
echo "$sinkID"
|
echo "$sinkID"
|
||||||
|
|
||||||
if [[ "${1:-}" == *"only"* ]]; then
|
if [[ $1 == *"only"* ]]; then
|
||||||
pactl set-sink-input-mute "$sinkID" 0
|
pactl set-sink-input-mute "$sinkID" 0
|
||||||
otherinputs "$thePID" | jq -r .sink_input_id | xargs -I theid sh -c 'pactl set-sink-input-mute theid 1'
|
otherinputs "$thePID" | jq -r .sink_input_id | xargs -I theid sh -c 'pactl set-sink-input-mute theid 1'
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
function codex_tmux {
|
|
||||||
base=$(basename "$PWD")
|
|
||||||
name="$base"
|
|
||||||
|
|
||||||
if tmux has-session -t "$name" 2>/dev/null; then
|
|
||||||
i=2
|
|
||||||
while tmux has-session -t "${name}-${i}" 2>/dev/null; do
|
|
||||||
i=$((i+1))
|
|
||||||
done
|
|
||||||
name="${name}-${i}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
tmux new-session -s "$name" -c "$PWD" codex --dangerously-bypass-approvals-and-sandbox "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
codex_tmux "$@"
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
function ns {
|
|
||||||
sk --ansi -i -c 'nix-search "{}"' | get_cols 1
|
|
||||||
}
|
|
||||||
|
|
||||||
ns "$@"
|
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
function pashowvolume {
|
function pashowvolume {
|
||||||
if paismuted; then
|
if paismuted; then
|
||||||
rumno notify -m
|
volnoti-show -m
|
||||||
else
|
else
|
||||||
actual=$(pavolume)
|
actual=$(pavolume)
|
||||||
max=100
|
max=100
|
||||||
show=$(( actual < max ? actual : max ))
|
show=$(( actual < max ? actual : max ))
|
||||||
rumno notify -v "$show"
|
volnoti-show "$show"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
function passgen {
|
|
||||||
if [ -z "$1" ]; then
|
|
||||||
echo "Usage: passgen <pass-entry-name>" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
local base_pass upper symbol password
|
|
||||||
base_pass="$(xkcdpass -n 3 | tr -d ' ')"
|
|
||||||
upper="$(echo {A..Z} | tr ' ' '\n' | shuf -n1)"
|
|
||||||
symbol="$(echo '!@#$%^&*' | fold -w1 | shuf -n1)"
|
|
||||||
password="${base_pass}${upper}${symbol}"
|
|
||||||
|
|
||||||
echo "$password" | pass insert -e "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
passgen
|
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
function pavolume {
|
function pavolume {
|
||||||
pactl get-sink-volume $(pactl get-default-sink) | FS="/" get_cols 2 | grep -oE '[0-9]*'
|
pacmd list-sinks |
|
||||||
|
awk '/^\s+name: /{indefault = $2 == "<'"$(pasink)"'>"}
|
||||||
|
/^\s+volume: / && indefault {print $5; exit}' | grep -Eo "[0-9]*"
|
||||||
}
|
}
|
||||||
|
|
||||||
pavolume
|
pavolume
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
function set_volume {
|
function set_volume {
|
||||||
|
current_default=$(pahelper list | grep '*' | all_after_char ":" | xargs)
|
||||||
|
environment_variable_exists USE_ONLY_O_PASINK && pahelper "$current_default"
|
||||||
|
|
||||||
|
# XXX: this does not prevent volumes higher than 100
|
||||||
pulsemixer "$@"
|
pulsemixer "$@"
|
||||||
pashowvolume
|
pashowvolume
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,31 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
|
|
||||||
function tn {
|
|
||||||
if [ -z "$TMUX" ]; then
|
|
||||||
echo "Not in a tmux session"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
base=$(basename "$PWD")
|
|
||||||
current=$(tmux display-message -p '#{session_name}')
|
|
||||||
|
|
||||||
# Don't rename if already named correctly
|
|
||||||
if [ "$current" = "$base" ]; then
|
|
||||||
echo "Session already named '$base'"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if tmux has-session -t "$base" 2>/dev/null; then
|
|
||||||
i=2
|
|
||||||
while tmux has-session -t "${base}-${i}" 2>/dev/null; do
|
|
||||||
i=$((i+1))
|
|
||||||
done
|
|
||||||
tmux rename-session "${base}-${i}"
|
|
||||||
echo "Renamed session to '${base}-${i}'"
|
|
||||||
else
|
|
||||||
tmux rename-session "$base"
|
|
||||||
echo "Renamed session to '$base'"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
tn "$@"
|
|
||||||
@@ -13,7 +13,7 @@ section: aliases
|
|||||||
tv:
|
tv:
|
||||||
imalison-arch
|
imalison-arch
|
||||||
imalison-desktop
|
imalison-desktop
|
||||||
imalison-home justin-bieber-creek
|
imalison-home
|
||||||
controlling:
|
controlling:
|
||||||
uber-loaner
|
uber-loaner
|
||||||
imalison-mpb-arch
|
imalison-mpb-arch
|
||||||
@@ -22,5 +22,4 @@ section: aliases
|
|||||||
kat-uber-loaner
|
kat-uber-loaner
|
||||||
Dean-PC
|
Dean-PC
|
||||||
imalison-mbp
|
imalison-mbp
|
||||||
strixi-minaj
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
# Create a new Codex session from the current pane path and switch to it.
|
|
||||||
# Prefix + C starts a new session without prompting for a name.
|
|
||||||
bind-key C new-session -c '#{pane_current_path}' 'codex --dangerously-bypass-approvals-and-sandbox'
|
|
||||||
|
|||||||
@@ -1,25 +1,20 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Local compilation script for generating HTML from README.org
|
|
||||||
# Note: For CI, this is now handled by GitHub Actions (.github/workflows/gh-pages.yml)
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
|
export PATH="$HOME/.cask/bin:$HOME/.evm/bin:$PATH"
|
||||||
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
# Use system emacs or EMACS environment variable
|
TARGET=$(readlink -f "$THIS_DIR/../dotfiles/emacs.d/README.org")
|
||||||
EMACS="${EMACS:-emacs}"
|
|
||||||
|
|
||||||
cd "$THIS_DIR"
|
git clone https://github.com/rejeep/evm.git "$HOME/.evm"
|
||||||
|
evm config path /tmp
|
||||||
|
evm install emacs-25.1-travis --use --skip
|
||||||
|
export EMACS="$(evm bin)"
|
||||||
|
|
||||||
# Install cask dependencies if needed
|
git clone https://github.com/cask/cask
|
||||||
if [ ! -d ".cask" ]; then
|
export PATH=$(pwd)/cask/bin:$PATH
|
||||||
cask install
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate HTML
|
cask install
|
||||||
cask exec "$EMACS" --script generate-html.el
|
cask exec "$EMACS" --script generate-html.el
|
||||||
|
|
||||||
# Move the generated file
|
|
||||||
mv "$THIS_DIR/../dotfiles/emacs.d/README.html" .
|
mv "$THIS_DIR/../dotfiles/emacs.d/README.html" .
|
||||||
|
|
||||||
echo "Generated README.html in $THIS_DIR"
|
|
||||||
|
|||||||
@@ -1,11 +1,68 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# DEPRECATED: This script was used for Travis CI deployments.
|
# This approach was adapted from https://gist.github.com/domenic/ec8b0fc8ab45f39403dd
|
||||||
# Deployment is now handled by GitHub Actions (.github/workflows/gh-pages.yml)
|
|
||||||
#
|
|
||||||
# This script is kept for reference only.
|
|
||||||
# See: https://github.com/IvanMalison/dotfiles/blob/master/.github/workflows/gh-pages.yml
|
|
||||||
|
|
||||||
echo "ERROR: This script is deprecated."
|
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
echo "Deployment is now handled by GitHub Actions."
|
|
||||||
echo "See: .github/workflows/gh-pages.yml"
|
cd $THIS_DIR
|
||||||
exit 1
|
|
||||||
|
git config --global user.name "$COMMIT_AUTHOR_NAME"
|
||||||
|
git config --global user.email "$COMMIT_AUTHOR_EMAIL"
|
||||||
|
|
||||||
|
set -e # Exit with nonzero exit code if anything fails
|
||||||
|
|
||||||
|
SOURCE_BRANCH="master"
|
||||||
|
TARGET_BRANCH="gh-pages"
|
||||||
|
|
||||||
|
function doCompile {
|
||||||
|
./compile.sh
|
||||||
|
}
|
||||||
|
|
||||||
|
# Pull requests and commits to other branches shouldn't try to deploy, just build to verify
|
||||||
|
if [ "$TRAVIS_PULL_REQUEST" != "false" -o "$TRAVIS_BRANCH" != "$SOURCE_BRANCH" ]; then
|
||||||
|
echo "Skipping deploy; just doing a build."
|
||||||
|
doCompile
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Save some useful information
|
||||||
|
REPO=`git config remote.origin.url`
|
||||||
|
SSH_REPO=${REPO/https:\/\/github.com\//git@github.com:}
|
||||||
|
SHA=`git rev-parse --verify HEAD`
|
||||||
|
|
||||||
|
# Run our compile script
|
||||||
|
doCompile
|
||||||
|
|
||||||
|
# Get the deploy key by using Travis's stored variables to decrypt deploy_key.enc
|
||||||
|
ENCRYPTED_KEY_VAR="encrypted_${ENCRYPTION_LABEL}_key"
|
||||||
|
ENCRYPTED_IV_VAR="encrypted_${ENCRYPTION_LABEL}_iv"
|
||||||
|
ENCRYPTED_KEY=${!ENCRYPTED_KEY_VAR}
|
||||||
|
ENCRYPTED_IV=${!ENCRYPTED_IV_VAR}
|
||||||
|
|
||||||
|
openssl aes-256-cbc -K $ENCRYPTED_KEY -iv $ENCRYPTED_IV -in deploy_key.enc -out deploy_key -d
|
||||||
|
chmod 600 deploy_key
|
||||||
|
eval `ssh-agent -s`
|
||||||
|
ssh-add deploy_key
|
||||||
|
|
||||||
|
# Clone the existing gh-pages for this repo into out/
|
||||||
|
# Create a new empty branch if gh-pages doesn't exist yet (should only happen on first deply)
|
||||||
|
git clone $REPO out
|
||||||
|
cd out
|
||||||
|
git checkout $TARGET_BRANCH || git checkout --orphan $TARGET_BRANCH
|
||||||
|
|
||||||
|
# Clean out existing contents
|
||||||
|
git ls-files | xargs rm -rf
|
||||||
|
|
||||||
|
mv ../README.html ./index.html
|
||||||
|
|
||||||
|
# Commit the "changes", i.e. the new version.
|
||||||
|
# The delta will show diffs between new and old versions.
|
||||||
|
git add --all .
|
||||||
|
git commit -m "Deploy to GitHub Pages: ${SHA}"
|
||||||
|
|
||||||
|
git fetch origin master
|
||||||
|
|
||||||
|
if [ "$(git rev-parse origin/master)" == "$SHA" ]; then
|
||||||
|
git push "$SSH_REPO" "$TARGET_BRANCH"
|
||||||
|
else
|
||||||
|
echo "The commit this build was started for is not the one on master. Doing nothing."
|
||||||
|
fi
|
||||||
|
|||||||
BIN
gen-gh-pages/deploy_key.enc
Normal file
BIN
gen-gh-pages/deploy_key.enc
Normal file
Binary file not shown.
@@ -19,9 +19,12 @@
|
|||||||
(require 's)
|
(require 's)
|
||||||
(org-babel-tangle-file readme-src)
|
(org-babel-tangle-file readme-src)
|
||||||
|
|
||||||
(require 'cl-lib)
|
;; This makes it so that any dependencies specified with :straight, will
|
||||||
(load-file (concat emacs-dir "org-config-bootstrap.el"))
|
;; actually just be installed with the default melpa use-package ensure logic.
|
||||||
(org-babel-tangle-file (concat emacs-dir "org-config.org"))
|
(defalias 'use-package-handler/:straight
|
||||||
|
#'use-package-handler/:ensure)
|
||||||
|
(add-to-list 'use-package-keywords :straight)
|
||||||
|
|
||||||
(load-file (concat emacs-dir "org-config.el"))
|
(load-file (concat emacs-dir "org-config.el"))
|
||||||
|
|
||||||
(defun export-target (target)
|
(defun export-target (target)
|
||||||
|
|||||||
403
nix-darwin/flake.lock
generated
403
nix-darwin/flake.lock
generated
@@ -1,403 +0,0 @@
|
|||||||
{
|
|
||||||
"nodes": {
|
|
||||||
"agenix": {
|
|
||||||
"inputs": {
|
|
||||||
"darwin": "darwin",
|
|
||||||
"home-manager": "home-manager_2",
|
|
||||||
"nixpkgs": [
|
|
||||||
"railbird-secrets",
|
|
||||||
"nixpkgs"
|
|
||||||
],
|
|
||||||
"systems": "systems_3"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1707830867,
|
|
||||||
"narHash": "sha256-PAdwm5QqdlwIqGrfzzvzZubM+FXtilekQ/FA0cI49/o=",
|
|
||||||
"owner": "ryantm",
|
|
||||||
"repo": "agenix",
|
|
||||||
"rev": "8cb01a0e717311680e0cbca06a76cbceba6f3ed6",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "ryantm",
|
|
||||||
"repo": "agenix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"brew-src": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1763638478,
|
|
||||||
"narHash": "sha256-n/IMowE9S23ovmTkKX7KhxXC2Yq41EAVFR2FBIXPcT8=",
|
|
||||||
"owner": "Homebrew",
|
|
||||||
"repo": "brew",
|
|
||||||
"rev": "fbfdbaba008189499958a7aeb1e2c36ab10c067d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "Homebrew",
|
|
||||||
"ref": "5.0.3",
|
|
||||||
"repo": "brew",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"claude-code-nix": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-utils": "flake-utils",
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1770168651,
|
|
||||||
"narHash": "sha256-SxzTEu49iaAA/nAT28Rsr4BmjC3eCkiaM4/ZYBVhhNQ=",
|
|
||||||
"owner": "sadjow",
|
|
||||||
"repo": "claude-code-nix",
|
|
||||||
"rev": "f256f48c037a6e54afa332795328f753f2fafbaf",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "sadjow",
|
|
||||||
"repo": "claude-code-nix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"codex-cli-nix": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-utils": "flake-utils_2",
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1770232831,
|
|
||||||
"narHash": "sha256-C5e2wjd//pLJA1LqSYc/y9aZkM8wmZo/BAuzhZDuyFE=",
|
|
||||||
"owner": "sadjow",
|
|
||||||
"repo": "codex-cli-nix",
|
|
||||||
"rev": "64805eb1d1afffcbbcef0ffc053295f0065cd51d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "sadjow",
|
|
||||||
"repo": "codex-cli-nix",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"darwin": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"railbird-secrets",
|
|
||||||
"agenix",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1700795494,
|
|
||||||
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
|
|
||||||
"owner": "lnl7",
|
|
||||||
"repo": "nix-darwin",
|
|
||||||
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "lnl7",
|
|
||||||
"ref": "master",
|
|
||||||
"repo": "nix-darwin",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1731533236,
|
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils_2": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1731533236,
|
|
||||||
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flake-utils_3": {
|
|
||||||
"inputs": {
|
|
||||||
"systems": "systems_4"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1709126324,
|
|
||||||
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"home-manager": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767930051,
|
|
||||||
"narHash": "sha256-YXtqo8h5bAbqC64XAPMMsZdYk8XkwkyNj/7XOsIyVf8=",
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "home-manager",
|
|
||||||
"rev": "297a08510894822ddd93ee2cfc66d6ac65a3cebb",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "home-manager",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"home-manager_2": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"railbird-secrets",
|
|
||||||
"agenix",
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1703113217,
|
|
||||||
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "home-manager",
|
|
||||||
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-community",
|
|
||||||
"repo": "home-manager",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"homebrew-cask": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767937441,
|
|
||||||
"narHash": "sha256-hiGvxqI6npGOAnNwMXkF1628IkyKhhYsAqO5kmSAuqM=",
|
|
||||||
"owner": "homebrew",
|
|
||||||
"repo": "homebrew-cask",
|
|
||||||
"rev": "cc94d21fe7abb3cc93db50671bf5048176711be9",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "homebrew",
|
|
||||||
"repo": "homebrew-cask",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"homebrew-core": {
|
|
||||||
"flake": false,
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767948289,
|
|
||||||
"narHash": "sha256-a6s+kRHOXRq4QoA4bDLZVKpC1woi6tTRqEt8Vk0ikGo=",
|
|
||||||
"owner": "homebrew",
|
|
||||||
"repo": "homebrew-core",
|
|
||||||
"rev": "f268dcd932823c65f8feb2cfc533300ccbcc4541",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "homebrew",
|
|
||||||
"repo": "homebrew-core",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nix-darwin": {
|
|
||||||
"inputs": {
|
|
||||||
"nixpkgs": [
|
|
||||||
"nixpkgs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767718503,
|
|
||||||
"narHash": "sha256-V+VkFs0aSG0ca8p/N3gib7FAf4cq9jyr5Gm+ZBrHQpo=",
|
|
||||||
"owner": "LnL7",
|
|
||||||
"repo": "nix-darwin",
|
|
||||||
"rev": "9f48ffaca1f44b3e590976b4da8666a9e86e6eb1",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "LnL7",
|
|
||||||
"repo": "nix-darwin",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nix-homebrew": {
|
|
||||||
"inputs": {
|
|
||||||
"brew-src": "brew-src"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1764473698,
|
|
||||||
"narHash": "sha256-C91gPgv6udN5WuIZWNehp8qdLqlrzX6iF/YyboOj6XI=",
|
|
||||||
"owner": "zhaofengli-wip",
|
|
||||||
"repo": "nix-homebrew",
|
|
||||||
"rev": "6a8ab60bfd66154feeaa1021fc3b32684814a62a",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "zhaofengli-wip",
|
|
||||||
"repo": "nix-homebrew",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1767364772,
|
|
||||||
"narHash": "sha256-fFUnEYMla8b7UKjijLnMe+oVFOz6HjijGGNS1l7dYaQ=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "16c7794d0a28b5a37904d55bcca36003b9109aaa",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixpkgs-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1709703039,
|
|
||||||
"narHash": "sha256-6hqgQ8OK6gsMu1VtcGKBxKQInRLHtzulDo9Z5jxHEFY=",
|
|
||||||
"owner": "NixOS",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "9df3e30ce24fd28c7b3e2de0d986769db5d6225d",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "NixOS",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"railbird-secrets": {
|
|
||||||
"inputs": {
|
|
||||||
"agenix": "agenix",
|
|
||||||
"flake-utils": "flake-utils_3",
|
|
||||||
"nixpkgs": "nixpkgs_2"
|
|
||||||
},
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1766173571,
|
|
||||||
"narHash": "sha256-iYU5oTgXkZHqkb03IDPVMHA4Yte4AFhusTem0nf7pcc=",
|
|
||||||
"ref": "refs/heads/master",
|
|
||||||
"rev": "5b42885b7c702fb30b4678e5cb51cc8501fd7830",
|
|
||||||
"revCount": 139,
|
|
||||||
"type": "git",
|
|
||||||
"url": "ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": {
|
|
||||||
"inputs": {
|
|
||||||
"claude-code-nix": "claude-code-nix",
|
|
||||||
"codex-cli-nix": "codex-cli-nix",
|
|
||||||
"home-manager": "home-manager",
|
|
||||||
"homebrew-cask": "homebrew-cask",
|
|
||||||
"homebrew-core": "homebrew-core",
|
|
||||||
"nix-darwin": "nix-darwin",
|
|
||||||
"nix-homebrew": "nix-homebrew",
|
|
||||||
"nixpkgs": "nixpkgs",
|
|
||||||
"railbird-secrets": "railbird-secrets"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_2": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_3": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"systems_4": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1681028828,
|
|
||||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nix-systems",
|
|
||||||
"repo": "default",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "root",
|
|
||||||
"version": 7
|
|
||||||
}
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
{
|
|
||||||
description = "Example Darwin system flake";
|
|
||||||
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
|
||||||
nix-darwin.url = "github:LnL7/nix-darwin";
|
|
||||||
nix-darwin.inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
railbird-secrets = {
|
|
||||||
url = "git+ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git";
|
|
||||||
};
|
|
||||||
nix-homebrew.url = "github:zhaofengli-wip/nix-homebrew";
|
|
||||||
|
|
||||||
# Optional: Declarative tap management
|
|
||||||
homebrew-core = {
|
|
||||||
url = "github:homebrew/homebrew-core";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
homebrew-cask = {
|
|
||||||
url = "github:homebrew/homebrew-cask";
|
|
||||||
flake = false;
|
|
||||||
};
|
|
||||||
home-manager.url = "github:nix-community/home-manager";
|
|
||||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
|
|
||||||
codex-cli-nix = {
|
|
||||||
url = "github:sadjow/codex-cli-nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
claude-code-nix = {
|
|
||||||
url = "github:sadjow/claude-code-nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs = inputs@{ self, nix-darwin, nixpkgs, home-manager, ... }:
|
|
||||||
let
|
|
||||||
libDir = ../dotfiles/lib;
|
|
||||||
configuration = { pkgs, config, ... }: {
|
|
||||||
networking.hostName = "mac-demarco-mini";
|
|
||||||
imports = [ (import ./gitea-actions-runner.nix) ];
|
|
||||||
services.gitea-actions-runner = {
|
|
||||||
user = "gitea-runner";
|
|
||||||
instances.nix = {
|
|
||||||
enable = true;
|
|
||||||
name = config.networking.hostName;
|
|
||||||
url = "https://dev.railbird.ai";
|
|
||||||
token = "H0A7YXAWsKSp9QzvMymfJI12hbxwR7UerEHpCJUe";
|
|
||||||
labels = [
|
|
||||||
"nix-darwin-${pkgs.system}:host"
|
|
||||||
"macos-aarch64-darwin"
|
|
||||||
"nix:host"
|
|
||||||
];
|
|
||||||
settings = {
|
|
||||||
cache = {
|
|
||||||
enabled = true;
|
|
||||||
};
|
|
||||||
host = {
|
|
||||||
workdir_parent = "/var/lib/gitea-runner/action-cache-dir";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
hostPackages = with pkgs; [
|
|
||||||
bash
|
|
||||||
coreutils
|
|
||||||
curl
|
|
||||||
direnv
|
|
||||||
gawk
|
|
||||||
just
|
|
||||||
git-lfs
|
|
||||||
isort
|
|
||||||
gitFull
|
|
||||||
gnused
|
|
||||||
ncdu
|
|
||||||
nixVersions.stable
|
|
||||||
nodejs
|
|
||||||
openssh
|
|
||||||
wget
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
launchd.daemons.gitea-runner-nix.serviceConfig.EnvironmentVariables = {
|
|
||||||
XDG_CONFIG_HOME = "/var/lib/gitea-runner";
|
|
||||||
XDG_CACHE_HOME = "/var/lib/gitea-runner/.cache";
|
|
||||||
XDG_RUNTIME_DIR = "/var/lib/gitea-runner/tmp";
|
|
||||||
};
|
|
||||||
|
|
||||||
system.primaryUser = "kat";
|
|
||||||
|
|
||||||
# launchd.daemons.gitea-runner-restarter = {
|
|
||||||
# serviceConfig = {
|
|
||||||
# ProgramArguments = [
|
|
||||||
# "/usr/bin/env"
|
|
||||||
# "bash"
|
|
||||||
# "-c"
|
|
||||||
# ''
|
|
||||||
# SERVICE_NAME="org.nixos.gitea-runner-nix"
|
|
||||||
# while true; do
|
|
||||||
# # Check the second column of launchctl list output for our service
|
|
||||||
# EXIT_CODE=$(sudo launchctl list | grep "$SERVICE_NAME" | awk '{print $2}')
|
|
||||||
# if [ -z "$EXIT_CODE" ]; then
|
|
||||||
# echo "$(date): $SERVICE_NAME is running correctly. Terminating the restarter."
|
|
||||||
# exit 0
|
|
||||||
# else
|
|
||||||
# echo "$(date): $SERVICE_NAME is not running or in error state. Attempting to restart..."
|
|
||||||
# sudo launchctl bootout system/$SERVICE_NAME 2>/dev/null || true
|
|
||||||
# sudo launchctl load /Library/LaunchDaemons/$SERVICE_NAME.plist
|
|
||||||
# sleep 2 # Give the service some time to start
|
|
||||||
# fi
|
|
||||||
# done
|
|
||||||
# ''
|
|
||||||
# ];
|
|
||||||
# RunAtLoad = true;
|
|
||||||
# ThrottleInterval = 300;
|
|
||||||
# };
|
|
||||||
# };
|
|
||||||
|
|
||||||
launchd.daemons.does-anything-work = {
|
|
||||||
serviceConfig = {
|
|
||||||
ProgramArguments = ["/usr/bin/env" "bash" "-c" "date > /var/log/does-anything-work"];
|
|
||||||
RunAtLoad = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
nixpkgs.overlays = [
|
|
||||||
(import ../nixos/overlay.nix)
|
|
||||||
# Use codex and claude-code from dedicated flakes with cachix
|
|
||||||
(final: prev: {
|
|
||||||
codex = inputs.codex-cli-nix.packages.${prev.stdenv.hostPlatform.system}.default;
|
|
||||||
claude-code = inputs.claude-code-nix.packages.${prev.stdenv.hostPlatform.system}.default;
|
|
||||||
})
|
|
||||||
];
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
#python-with-my-packages
|
|
||||||
emacs
|
|
||||||
alejandra
|
|
||||||
cocoapods
|
|
||||||
gitFull
|
|
||||||
just
|
|
||||||
tmux
|
|
||||||
htop
|
|
||||||
nodePackages.prettier
|
|
||||||
nodejs
|
|
||||||
ripgrep
|
|
||||||
slack
|
|
||||||
claude-code
|
|
||||||
codex
|
|
||||||
typescript
|
|
||||||
vim
|
|
||||||
yarn
|
|
||||||
];
|
|
||||||
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
|
||||||
|
|
||||||
|
|
||||||
# Auto upgrade nix package and the daemon service.
|
|
||||||
launchd.user.envVariables.PATH = config.environment.systemPath;
|
|
||||||
|
|
||||||
programs.direnv.enable = true;
|
|
||||||
|
|
||||||
# Necessary for using flakes on this system.
|
|
||||||
nix.settings = {
|
|
||||||
experimental-features = "nix-command flakes";
|
|
||||||
substituters = [
|
|
||||||
"https://cache.nixos.org"
|
|
||||||
"https://codex-cli.cachix.org"
|
|
||||||
"https://claude-code.cachix.org"
|
|
||||||
];
|
|
||||||
trusted-public-keys = [
|
|
||||||
"codex-cli.cachix.org-1:1Br3H1hHoRYG22n//cGKJOk3cQXgYobUel6O8DgSing="
|
|
||||||
"claude-code.cachix.org-1:YeXf2aNu7UTX8Vwrze0za1WEDS+4DuI2kVeWEE4fsRk="
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
# Set Git commit hash for darwin-version.
|
|
||||||
system.configurationRevision = self.rev or self.dirtyRev or null;
|
|
||||||
|
|
||||||
# Used for backwards compatibility, please read the changelog before changing
|
|
||||||
system.stateVersion = 4;
|
|
||||||
|
|
||||||
# The platform the configuration will be used on.
|
|
||||||
|
|
||||||
nixpkgs.hostPlatform = "aarch64-darwin";
|
|
||||||
users.users.kat.openssh.authorizedKeys.keys = inputs.railbird-secrets.keys.kanivanKeys;
|
|
||||||
users.users.gitea-runner = {
|
|
||||||
name = "gitea-runner";
|
|
||||||
isHidden = false;
|
|
||||||
home = "/Users/gitea-runner";
|
|
||||||
createHome = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true;
|
|
||||||
|
|
||||||
users.users.kat = {
|
|
||||||
name = "kat";
|
|
||||||
home = "/Users/kat";
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.zsh = {
|
|
||||||
enable = true;
|
|
||||||
shellInit = ''
|
|
||||||
fpath+="${libDir}/functions"
|
|
||||||
for file in "${libDir}/functions/"*
|
|
||||||
do
|
|
||||||
autoload "''${file##*/}"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
interactiveShellInit = ''
|
|
||||||
# eval "$(register-python-argcomplete prb)"
|
|
||||||
# eval "$(register-python-argcomplete prod-prb)"
|
|
||||||
# eval "$(register-python-argcomplete railbird)"
|
|
||||||
# [ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/zsh"
|
|
||||||
|
|
||||||
autoload -Uz bracketed-paste-magic
|
|
||||||
zle -N bracketed-paste bracketed-paste-magic
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager.users.kat = {
|
|
||||||
programs.starship = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
programs.zsh.enable = true;
|
|
||||||
home.stateVersion = "24.05";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
darwinConfigurations."mac-demarco-mini" = nix-darwin.lib.darwinSystem {
|
|
||||||
modules = [
|
|
||||||
home-manager.darwinModules.home-manager
|
|
||||||
configuration
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# Expose the package set, including overlays, for convenience.
|
|
||||||
darwinPackages = self.darwinConfigurations."mac-demarco-mini".pkgs;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
with lib; let
|
|
||||||
cfg = config.services.gitea-actions-runner;
|
|
||||||
|
|
||||||
settingsFormat = pkgs.formats.yaml {};
|
|
||||||
|
|
||||||
hasDockerScheme = instance:
|
|
||||||
instance.labels == [] || any (label: hasInfix ":docker:" label) instance.labels;
|
|
||||||
wantsContainerRuntime = any hasDockerScheme (attrValues cfg.instances);
|
|
||||||
|
|
||||||
hasHostScheme = instance: any (label: hasSuffix ":host" label) instance.labels;
|
|
||||||
|
|
||||||
tokenXorTokenFile = instance:
|
|
||||||
(instance.token == null && instance.tokenFile != null)
|
|
||||||
|| (instance.token != null && instance.tokenFile == null);
|
|
||||||
in {
|
|
||||||
options.services.gitea-actions-runner = {
|
|
||||||
package = mkOption {
|
|
||||||
type = types.package;
|
|
||||||
default = pkgs.gitea-actions-runner;
|
|
||||||
defaultText = literalExpression "pkgs.gitea-actions-runner";
|
|
||||||
description = "The gitea-actions-runner package to use.";
|
|
||||||
};
|
|
||||||
|
|
||||||
user = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = "gitea-runner";
|
|
||||||
description = "The user account under which the Gitea Actions Runner should run.";
|
|
||||||
};
|
|
||||||
|
|
||||||
instances = mkOption {
|
|
||||||
default = {};
|
|
||||||
description = "Gitea Actions Runner instances.";
|
|
||||||
type = types.attrsOf (types.submodule {
|
|
||||||
options = {
|
|
||||||
enable = mkEnableOption "Gitea Actions Runner instance";
|
|
||||||
|
|
||||||
name = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
example = "my-runner";
|
|
||||||
description = "The name identifying the runner instance towards the Gitea/Forgejo instance.";
|
|
||||||
};
|
|
||||||
|
|
||||||
url = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
example = "https://forge.example.com";
|
|
||||||
description = "Base URL of your Gitea/Forgejo instance.";
|
|
||||||
};
|
|
||||||
|
|
||||||
token = mkOption {
|
|
||||||
type = types.nullOr types.str;
|
|
||||||
default = null;
|
|
||||||
description = "Plain token to register at the configured Gitea/Forgejo instance.";
|
|
||||||
};
|
|
||||||
|
|
||||||
tokenFile = mkOption {
|
|
||||||
type = types.nullOr (types.either types.str types.path);
|
|
||||||
default = null;
|
|
||||||
description = "Path to a file containing the token to register at the configured Gitea/Forgejo instance.";
|
|
||||||
};
|
|
||||||
|
|
||||||
labels = mkOption {
|
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [];
|
|
||||||
example = ["macos:host" "x86_64:host"];
|
|
||||||
description = "Labels used to map jobs to their runtime environment.";
|
|
||||||
};
|
|
||||||
|
|
||||||
settings = mkOption {
|
|
||||||
description = "Configuration for `act_runner daemon`.";
|
|
||||||
type = types.submodule {
|
|
||||||
freeformType = settingsFormat.type;
|
|
||||||
};
|
|
||||||
default = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
hostPackages = mkOption {
|
|
||||||
type = types.listOf types.package;
|
|
||||||
default = with pkgs; [
|
|
||||||
bash
|
|
||||||
coreutils
|
|
||||||
curl
|
|
||||||
gawk
|
|
||||||
git
|
|
||||||
gnused
|
|
||||||
nodejs
|
|
||||||
wget
|
|
||||||
openssh
|
|
||||||
];
|
|
||||||
description = "List of packages available to actions when the runner is configured with a host execution label.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf (cfg.instances != {}) {
|
|
||||||
assertions = [
|
|
||||||
{
|
|
||||||
assertion = all tokenXorTokenFile (attrValues cfg.instances);
|
|
||||||
message = "Instances of gitea-actions-runner can have `token` or `tokenFile`, not both.";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
users.users.${cfg.user} = {
|
|
||||||
name = cfg.user;
|
|
||||||
description = "Gitea Actions Runner user";
|
|
||||||
};
|
|
||||||
|
|
||||||
launchd.daemons =
|
|
||||||
(mapAttrs' (
|
|
||||||
name: instance:
|
|
||||||
nameValuePair "gitea-runner-${name}" {
|
|
||||||
serviceConfig = {
|
|
||||||
ProgramArguments = [
|
|
||||||
"/usr/bin/env"
|
|
||||||
"bash"
|
|
||||||
"-c"
|
|
||||||
''
|
|
||||||
cd /var/lib/gitea-runner/${name}
|
|
||||||
exec ${cfg.package}/bin/act_runner daemon --config ${settingsFormat.generate "config.yaml" instance.settings}
|
|
||||||
''
|
|
||||||
];
|
|
||||||
KeepAlive = true;
|
|
||||||
ThrottleInterval = 5;
|
|
||||||
SessionCreate = true;
|
|
||||||
UserName = cfg.user;
|
|
||||||
GroupName = "staff";
|
|
||||||
WorkingDirectory = "/var/lib/gitea-runner/${name}";
|
|
||||||
EnvironmentVariables = {
|
|
||||||
PATH = (lib.makeBinPath (instance.hostPackages ++ [cfg.package])) + ":/usr/local/bin:/usr/bin:/usr/sbin:/bin:/sbin";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
cfg.instances)
|
|
||||||
// (mapAttrs' (
|
|
||||||
name: instance:
|
|
||||||
nameValuePair "gitea-runner-setup-${name}"
|
|
||||||
{
|
|
||||||
serviceConfig = {
|
|
||||||
EnvironmentVariables =
|
|
||||||
{}
|
|
||||||
// optionalAttrs (instance.token != null) {
|
|
||||||
TOKEN = instance.token;
|
|
||||||
};
|
|
||||||
RunAtLoad = true;
|
|
||||||
ProgramArguments = [
|
|
||||||
"${pkgs.writeShellScript "gitea-runner-setup-${name}" ''
|
|
||||||
mkdir -p /var/lib/gitea-runner/${name}
|
|
||||||
cd /var/lib/gitea-runner/${name}
|
|
||||||
if [ ! -e "/var/lib/gitea-runner/${name}/.runner" ]; then
|
|
||||||
${cfg.package}/bin/act_runner register --no-interactive \
|
|
||||||
--instance ${escapeShellArg instance.url} \
|
|
||||||
--token "$TOKEN" \
|
|
||||||
--name ${escapeShellArg instance.name} \
|
|
||||||
--labels ${escapeShellArg (concatStringsSep "," instance.labels)} \
|
|
||||||
--config ${settingsFormat.generate "config.yaml" instance.settings}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Start the runner
|
|
||||||
chown -R ${cfg.user} /var/lib/gitea-runner
|
|
||||||
chown -R ${cfg.user} /var/log/gitea-runner
|
|
||||||
''}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
cfg.instances);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
switch:
|
|
||||||
nix run nix-darwin -- switch --flake .#
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
---
|
|
||||||
name: bump-overlay-versions
|
|
||||||
description: Use when user asks to bump, update, or upgrade claude-code or codex versions in overlay.nix, or when checking if newer versions are available
|
|
||||||
---
|
|
||||||
|
|
||||||
# Bump Overlay Versions
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Updates claude-code and/or codex to latest versions in `~/dotfiles/nixos/overlay.nix`. Nix requires correct hashes which must be discovered through failed builds.
|
|
||||||
|
|
||||||
## Quick Reference
|
|
||||||
|
|
||||||
| Package | Check Latest | Hash Fields |
|
|
||||||
|---------|--------------|-------------|
|
|
||||||
| claude-code | `npm view @anthropic-ai/claude-code version` | `hash`, `npmDepsHash` (keep empty) |
|
|
||||||
| codex | `curl -s "https://api.github.com/repos/openai/codex/releases/latest" \| jq -r '.tag_name'` | `hash`, `cargoHash` |
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
### 1. Check Current vs Latest Versions
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Current versions are in overlay.nix claudeCodeVersion and codexVersion blocks
|
|
||||||
# Check latest:
|
|
||||||
npm view @anthropic-ai/claude-code version
|
|
||||||
curl -s "https://api.github.com/repos/openai/codex/releases/latest" | jq -r '.tag_name'
|
|
||||||
# codex tag format: rust-v0.92.0 -> version is 0.92.0
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Update Version and Clear Hashes
|
|
||||||
|
|
||||||
In `~/dotfiles/nixos/overlay.nix`:
|
|
||||||
|
|
||||||
**For claude-code:**
|
|
||||||
```nix
|
|
||||||
claudeCodeVersion = {
|
|
||||||
version = "X.Y.Z"; # Update to new version
|
|
||||||
hash = ""; # Clear - will get from build error
|
|
||||||
npmDepsHash = ""; # Keep empty (no npm deps)
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
**For codex:**
|
|
||||||
```nix
|
|
||||||
codexVersion = {
|
|
||||||
version = "X.Y.Z"; # Update to new version (without rust-v prefix)
|
|
||||||
hash = ""; # Clear - will get from build error
|
|
||||||
cargoHash = ""; # Clear - will get from build error
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Build to Get Hashes
|
|
||||||
|
|
||||||
```bash
|
|
||||||
just switch
|
|
||||||
```
|
|
||||||
|
|
||||||
The build will fail with hash mismatch errors showing the correct hash. Copy the `got:` hash value.
|
|
||||||
|
|
||||||
**For codex:** You'll need to run twice - once for `hash` (source), once for `cargoHash` (cargo deps).
|
|
||||||
|
|
||||||
### 4. Update with Correct Hashes
|
|
||||||
|
|
||||||
Replace empty strings with the hashes from build errors, then run `just switch` again.
|
|
||||||
|
|
||||||
## Enable/Disable Overrides
|
|
||||||
|
|
||||||
The overlay uses boolean flags - set to `false` to use nixpkgs versions instead:
|
|
||||||
|
|
||||||
```nix
|
|
||||||
enableCodexOverride = true; # Set false to use nixpkgs codex
|
|
||||||
enableClaudeCodeOverride = true; # Set false to use nixpkgs claude-code
|
|
||||||
```
|
|
||||||
|
|
||||||
**Never delete the override code** - just toggle the flags.
|
|
||||||
|
|
||||||
## File Location
|
|
||||||
|
|
||||||
`~/dotfiles/nixos/overlay.nix`
|
|
||||||
@@ -3,7 +3,10 @@
|
|||||||
options = {
|
options = {
|
||||||
};
|
};
|
||||||
config = {
|
config = {
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
android-udev-rules
|
||||||
|
];
|
||||||
nixpkgs.config.android_sdk.accept_license = true;
|
nixpkgs.config.android_sdk.accept_license = true;
|
||||||
environment.systemPackages = [ pkgs.android-tools ];
|
programs.adb.enable = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
{ config, pkgs, makeEnable, realUsers, ... }:
|
{ config, pkgs, forEachUser, makeEnable, realUsers, ... }:
|
||||||
makeEnable config "myModules.base" true {
|
makeEnable config "modules.base" true {
|
||||||
nixpkgs.config.permittedInsecurePackages = [
|
nixpkgs.config.permittedInsecurePackages = [
|
||||||
"electron-12.2.3"
|
|
||||||
"electron-19.1.9"
|
|
||||||
"electron-32.3.3"
|
|
||||||
"etcher"
|
|
||||||
"nix-2.16.2"
|
|
||||||
"openssl-1.0.2u"
|
"openssl-1.0.2u"
|
||||||
|
"electron-12.2.3"
|
||||||
|
"etcher"
|
||||||
|
"electron-19.1.9"
|
||||||
"openssl-1.1.1w"
|
"openssl-1.1.1w"
|
||||||
|
"nix-2.16.2"
|
||||||
];
|
];
|
||||||
|
|
||||||
# Disabling these waits disables the stuck on boot up issue
|
# Disabling these waits disables the stuck on boot up issue
|
||||||
@@ -30,26 +29,15 @@ makeEnable config "myModules.base" true {
|
|||||||
'';
|
'';
|
||||||
|
|
||||||
networking.firewall.enable = false;
|
networking.firewall.enable = false;
|
||||||
networking.nameservers = [ "8.8.8.8" "8.8.4.4" ];
|
|
||||||
networking.networkmanager = {
|
networking.networkmanager = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
enableStrongSwan = true;
|
||||||
plugins = [ pkgs.networkmanager-l2tp pkgs.networkmanager-openvpn ];
|
plugins = [ pkgs.networkmanager-l2tp pkgs.networkmanager-openvpn ];
|
||||||
};
|
};
|
||||||
networking.resolvconf.enable = false;
|
|
||||||
services.mullvad-vpn.enable = true;
|
|
||||||
|
|
||||||
# Audio
|
# Audio
|
||||||
|
sound.enable = true;
|
||||||
services.pulseaudio.enable = true;
|
hardware.pulseaudio.enable = true;
|
||||||
services.pipewire = {
|
|
||||||
enable = false;
|
|
||||||
systemWide = true;
|
|
||||||
alsa.enable = true;
|
|
||||||
alsa.support32Bit = true;
|
|
||||||
jack.enable = true;
|
|
||||||
pulse.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
# Bluetooth
|
# Bluetooth
|
||||||
hardware.bluetooth.enable = true;
|
hardware.bluetooth.enable = true;
|
||||||
@@ -66,32 +54,22 @@ makeEnable config "myModules.base" true {
|
|||||||
};
|
};
|
||||||
|
|
||||||
# Update timezone automatically
|
# Update timezone automatically
|
||||||
# The tzupdate.timer handles triggering with OnStartupSec=30s delay.
|
|
||||||
# We disable the service's direct WantedBy since network-online.target
|
|
||||||
# is reached before network is actually online (because we disable
|
|
||||||
# NetworkManager-wait-online.service to avoid boot hangs).
|
|
||||||
services.tzupdate.enable = true;
|
services.tzupdate.enable = true;
|
||||||
systemd.services.tzupdate.wantedBy = pkgs.lib.mkForce [];
|
|
||||||
|
|
||||||
# TODO: Add a comment explaining what this does.
|
# TODO: Add a comment explaining what this does.
|
||||||
services.locate.enable = true;
|
services.locate.enable = true;
|
||||||
|
|
||||||
virtualisation.docker.enable = true;
|
virtualisation.docker.enable = true;
|
||||||
services.orca.enable = false;
|
|
||||||
|
|
||||||
virtualisation.podman = {
|
|
||||||
enable = true;
|
|
||||||
autoPrune = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware.keyboard.zsa.enable = true;
|
hardware.keyboard.zsa.enable = true;
|
||||||
|
|
||||||
|
services.logind.extraConfig = "RuntimeDirectorySize=5G";
|
||||||
|
|
||||||
# For supporting gnome stuff
|
# For supporting gnome stuff
|
||||||
services.dbus.packages = [ pkgs.gcr ];
|
services.dbus.packages = [ pkgs.gcr ];
|
||||||
|
|
||||||
programs.dconf.enable = true;
|
programs.dconf.enable = true;
|
||||||
|
|
||||||
nix.settings.trusted-users = realUsers ++ ["gitea-runner"];
|
home-manager.users = forEachUser (import ./home-manager.nix);
|
||||||
|
nix.settings.trusted-users = realUsers;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{ pkgs, inputs, config, makeEnable, ... }:
|
{ pkgs, inputs, config, makeEnable, ... }:
|
||||||
makeEnable config "myModules.ben" true {
|
makeEnable config "modules.ben" true {
|
||||||
home-manager.backupFileExtension = "backup"; # Add this line
|
home-manager.backupFileExtension = "backup"; # Add this line
|
||||||
home-manager.users.ben = {
|
home-manager.users.ben = {
|
||||||
programs.zsh = {
|
programs.zsh = {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ pkgs, ... }:
|
{ pkgs, config, lib, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./essential.nix
|
./essential.nix
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
enable = true;
|
enable = true;
|
||||||
layout = "us";
|
layout = "us";
|
||||||
desktopManager = {
|
desktopManager = {
|
||||||
plasma6.enable = true;
|
plasma5.enable = true;
|
||||||
};
|
};
|
||||||
displayManager = {
|
displayManager = {
|
||||||
sddm = {
|
sddm = {
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nix = {
|
nix = rec {
|
||||||
extraOptions = ''
|
extraOptions = ''
|
||||||
experimental-features = nix-command flakes
|
experimental-features = nix-command flakes
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -97,7 +97,9 @@
|
|||||||
specialArgs = rec {
|
specialArgs = rec {
|
||||||
inherit inputs machineNames;
|
inherit inputs machineNames;
|
||||||
makeEnable = (import ../make-enable.nix) nixpkgs.lib;
|
makeEnable = (import ../make-enable.nix) nixpkgs.lib;
|
||||||
|
mapValueToKeys = keys: value: builtins.listToAttrs (map (name: { inherit name value; }) keys);
|
||||||
realUsers = [ "root" "imalison" "kat" "dean" "alex" "ben"];
|
realUsers = [ "root" "imalison" "kat" "dean" "alex" "ben"];
|
||||||
|
forEachUser = mapValueToKeys realUsers;
|
||||||
} // specialArgs // (import ../keys.nix);
|
} // specialArgs // (import ../keys.nix);
|
||||||
});
|
});
|
||||||
in
|
in
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{ config, lib, ... }:
|
{ config, lib, ... }:
|
||||||
with lib;
|
with lib;
|
||||||
let cfg = config.myModules.cache-server;
|
let cfg = config.modules.cache-server;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
options = {
|
options = {
|
||||||
myModules.cache-server = {
|
modules.cache-server = {
|
||||||
enable = mkEnableOption "nix cache server";
|
enable = mkEnableOption "nix cache server";
|
||||||
port = mkOption {
|
port = mkOption {
|
||||||
type = types.int;
|
type = types.int;
|
||||||
|
|||||||
@@ -1,23 +1,11 @@
|
|||||||
{ pkgs, config, makeEnable, ... }:
|
{ pkgs, config, makeEnable, ... }:
|
||||||
makeEnable config "myModules.code" true {
|
makeEnable config "modules.code" true {
|
||||||
programs.direnv = {
|
programs.direnv = {
|
||||||
enable = true;
|
enable = true;
|
||||||
nix-direnv.enable = true;
|
nix-direnv.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
# LLM Tools
|
|
||||||
antigravity
|
|
||||||
claude-code
|
|
||||||
codex
|
|
||||||
gemini-cli
|
|
||||||
opencode
|
|
||||||
|
|
||||||
# MCP
|
|
||||||
github-mcp-server
|
|
||||||
gitea-mcp-server
|
|
||||||
playwright-mcp
|
|
||||||
|
|
||||||
# C
|
# C
|
||||||
clang
|
clang
|
||||||
|
|
||||||
@@ -36,8 +24,6 @@ makeEnable config "myModules.code" true {
|
|||||||
# Node
|
# Node
|
||||||
nodePackages.npm
|
nodePackages.npm
|
||||||
nodejs
|
nodejs
|
||||||
yarn
|
|
||||||
prettier
|
|
||||||
|
|
||||||
# Typescript
|
# Typescript
|
||||||
typescript
|
typescript
|
||||||
@@ -48,7 +34,6 @@ makeEnable config "myModules.code" true {
|
|||||||
|
|
||||||
# Rust
|
# Rust
|
||||||
rustup
|
rustup
|
||||||
cargo-sweep
|
|
||||||
|
|
||||||
# Clojure
|
# Clojure
|
||||||
boot
|
boot
|
||||||
@@ -58,13 +43,8 @@ makeEnable config "myModules.code" true {
|
|||||||
ruby
|
ruby
|
||||||
|
|
||||||
# python
|
# python
|
||||||
black
|
|
||||||
poetry
|
poetry
|
||||||
uv
|
black
|
||||||
|
|
||||||
# kotlin
|
|
||||||
kotlin
|
|
||||||
kotlin-language-server
|
|
||||||
|
|
||||||
# dhall
|
# dhall
|
||||||
haskellPackages.dhall
|
haskellPackages.dhall
|
||||||
@@ -78,7 +58,7 @@ makeEnable config "myModules.code" true {
|
|||||||
nixd
|
nixd
|
||||||
nil
|
nil
|
||||||
alejandra
|
alejandra
|
||||||
] ++ (if pkgs.stdenv.hostPlatform.system == "x86_64-linux" then with pkgs; [
|
] ++ (if pkgs.system == "x86_64-linux" then with pkgs; [
|
||||||
# purescript
|
# purescript
|
||||||
purescript
|
purescript
|
||||||
# Broken
|
# Broken
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ config, lib, ... }:
|
{ config, lib, forEachUser, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./android.nix
|
./android.nix
|
||||||
@@ -17,17 +17,12 @@
|
|||||||
./gitea-runner.nix
|
./gitea-runner.nix
|
||||||
./gitea.nix
|
./gitea.nix
|
||||||
./gnome.nix
|
./gnome.nix
|
||||||
./home-assistant.nix
|
|
||||||
./imalison.nix
|
./imalison.nix
|
||||||
./internet-computer.nix
|
./internet-computer.nix
|
||||||
./k3s.nix
|
|
||||||
./kat.nix
|
./kat.nix
|
||||||
./keybase.nix
|
./keybase.nix
|
||||||
./kubelet.nix
|
|
||||||
./laptop.nix
|
|
||||||
./nix.nix
|
./nix.nix
|
||||||
./nixified.ai.nix
|
./nixified.ai.nix
|
||||||
./nvidia.nix
|
|
||||||
./options.nix
|
./options.nix
|
||||||
./plasma.nix
|
./plasma.nix
|
||||||
./postgres.nix
|
./postgres.nix
|
||||||
@@ -35,14 +30,11 @@
|
|||||||
./secrets.nix
|
./secrets.nix
|
||||||
./ssh.nix
|
./ssh.nix
|
||||||
./syncthing.nix
|
./syncthing.nix
|
||||||
./tts.nix
|
|
||||||
./user-specific.nix
|
./user-specific.nix
|
||||||
./users.nix
|
./users.nix
|
||||||
./vscode.nix
|
./vscode.nix
|
||||||
./wsl.nix
|
./wsl.nix
|
||||||
./wyoming.nix
|
|
||||||
./xmonad.nix
|
./xmonad.nix
|
||||||
./org-agenda-api-host.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
@@ -50,16 +42,17 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf config.features.full.enable {
|
config = lib.mkIf config.features.full.enable {
|
||||||
myModules.base.enable = true;
|
modules.base.enable = true;
|
||||||
myModules.desktop.enable = true;
|
modules.desktop.enable = true;
|
||||||
myModules.plasma.enable = true;
|
modules.plasma.enable = true;
|
||||||
myModules.gnome.enable = false;
|
modules.gnome.enable = false;
|
||||||
myModules.xmonad.enable = true;
|
modules.xmonad.enable = true;
|
||||||
myModules.extra.enable = true;
|
modules.extra.enable = true;
|
||||||
myModules.electron.enable = true;
|
modules.electron.enable = true;
|
||||||
myModules.code.enable = true;
|
modules.code.enable = true;
|
||||||
myModules.games.enable = false;
|
modules.games.enable = true;
|
||||||
myModules.syncthing.enable = true;
|
modules.syncthing.enable = true;
|
||||||
myModules.fonts.enable = true;
|
modules.fonts.enable = true;
|
||||||
|
modules.nixified-ai.enable = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
{ inputs, config, pkgs, makeEnable, ... }:
|
{ config, pkgs, makeEnable, ... }:
|
||||||
makeEnable config "myModules.desktop" true {
|
makeEnable config "modules.desktop" true {
|
||||||
services.greenclip.enable = true;
|
|
||||||
imports = [
|
imports = [
|
||||||
./fonts.nix
|
./fonts.nix
|
||||||
./hyprland.nix
|
|
||||||
./keyd.nix
|
|
||||||
];
|
];
|
||||||
|
|
||||||
services.xserver = {
|
services.xserver = {
|
||||||
@@ -35,20 +32,17 @@ makeEnable config "myModules.desktop" true {
|
|||||||
|
|
||||||
services.gnome.gnome-keyring.enable = true;
|
services.gnome.gnome-keyring.enable = true;
|
||||||
|
|
||||||
# Visual notification manager
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
# Appearance
|
# Appearance
|
||||||
adwaita-icon-theme
|
gnome.adwaita-icon-theme
|
||||||
hicolor-icon-theme
|
hicolor-icon-theme
|
||||||
# libsForQt5.breeze-gtk
|
libsForQt5.breeze-gtk
|
||||||
# materia-theme
|
# materia-theme
|
||||||
numix-icon-theme-circle
|
numix-icon-theme-circle
|
||||||
papirus-icon-theme
|
papirus-icon-theme
|
||||||
|
|
||||||
# XOrg
|
# XOrg
|
||||||
autorandr
|
autorandr
|
||||||
keyd
|
|
||||||
wmctrl
|
wmctrl
|
||||||
xclip
|
xclip
|
||||||
xdotool
|
xdotool
|
||||||
@@ -59,58 +53,56 @@ makeEnable config "myModules.desktop" true {
|
|||||||
|
|
||||||
# Desktop
|
# Desktop
|
||||||
alacritty
|
alacritty
|
||||||
ghostty
|
|
||||||
blueman
|
blueman
|
||||||
# clipit
|
clipit
|
||||||
d-spy
|
d-spy
|
||||||
kdePackages.dolphin
|
dolphin
|
||||||
|
|
||||||
feh
|
feh
|
||||||
firefox
|
firefox
|
||||||
cheese
|
gnome.cheese
|
||||||
kdePackages.kleopatra
|
gnome.gpaste
|
||||||
|
kleopatra
|
||||||
libnotify
|
libnotify
|
||||||
libreoffice
|
libreoffice
|
||||||
lxappearance
|
lxappearance
|
||||||
lxqt.lxqt-powermanagement
|
lxqt.lxqt-powermanagement
|
||||||
networkmanagerapplet
|
networkmanagerapplet
|
||||||
kdePackages.okular
|
notify-osd-customizable
|
||||||
pinentry-gnome3
|
okular
|
||||||
# mission-center
|
picom
|
||||||
|
pinentry
|
||||||
|
psensor
|
||||||
quassel
|
quassel
|
||||||
remmina
|
remmina
|
||||||
rofi
|
rofi
|
||||||
wofi
|
|
||||||
rofi-pass
|
rofi-pass
|
||||||
rofi-systemd
|
rofi-systemd
|
||||||
|
shutter
|
||||||
simplescreenrecorder
|
simplescreenrecorder
|
||||||
skippy-xd
|
skippy-xd
|
||||||
synergy
|
synergy
|
||||||
# TODO: reenable
|
transmission-gtk
|
||||||
# transmission_3-gtk
|
|
||||||
vlc
|
vlc
|
||||||
thunar
|
volnoti
|
||||||
|
xfce.thunar
|
||||||
|
|
||||||
# Audio
|
# Audio
|
||||||
picard
|
picard
|
||||||
pavucontrol
|
|
||||||
playerctl
|
playerctl
|
||||||
pulsemixer
|
pulsemixer
|
||||||
espeak
|
espeak
|
||||||
|
|
||||||
#
|
|
||||||
brightnessctl
|
|
||||||
|
|
||||||
# Visualization
|
# Visualization
|
||||||
graphviz
|
graphviz
|
||||||
nodePackages.mermaid-cli
|
nodePackages.mermaid-cli
|
||||||
] ++ (if pkgs.stdenv.hostPlatform.system == "x86_64-linux" then with pkgs; [
|
] ++ (if pkgs.system == "x86_64-linux" then with pkgs; [
|
||||||
google-chrome
|
google-chrome
|
||||||
pommed_light
|
pommed_light
|
||||||
slack
|
slack
|
||||||
spicetify-cli
|
spicetify-cli
|
||||||
spotify
|
spotify
|
||||||
tor-browser
|
tor-browser-bundle-bin
|
||||||
vscode
|
vscode
|
||||||
zulip
|
zulip
|
||||||
] else []);
|
] else []);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{ pkgs, config, makeEnable, ... }:
|
{ pkgs, config, makeEnable, forEachUser, ... }:
|
||||||
makeEnable config "myModules.electron" false {
|
makeEnable config "modules.electron" false {
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
element-desktop
|
element-desktop
|
||||||
# bitwarden
|
# bitwarden
|
||||||
@@ -8,23 +8,21 @@ makeEnable config "myModules.electron" false {
|
|||||||
# keybase-gui
|
# keybase-gui
|
||||||
zoom-us
|
zoom-us
|
||||||
];
|
];
|
||||||
home-manager.sharedModules = [
|
home-manager.users = forEachUser (if pkgs.system == "x86_64-linux" then {
|
||||||
(if pkgs.stdenv.hostPlatform.system == "x86_64-linux" then {
|
# systemd.user.services.bitwarden = {
|
||||||
# systemd.user.services.bitwarden = {
|
# Unit = {
|
||||||
# Unit = {
|
# Description = "Bitwarden";
|
||||||
# Description = "Bitwarden";
|
# After = [ "graphical-session-pre.target" "tray.target" ];
|
||||||
# After = [ "graphical-session-pre.target" "tray.target" ];
|
# PartOf = [ "graphical-session.target" ];
|
||||||
# PartOf = [ "graphical-session.target" ];
|
# };
|
||||||
# };
|
|
||||||
|
|
||||||
# Install = { WantedBy = [ "graphical-session.target" ]; };
|
# Install = { WantedBy = [ "graphical-session.target" ]; };
|
||||||
|
|
||||||
# Service = {
|
# Service = {
|
||||||
# ExecStart = "${pkgs.bitwarden}/bin/bitwarden";
|
# ExecStart = "${pkgs.bitwarden}/bin/bitwarden";
|
||||||
# Restart = "always";
|
# Restart = "always";
|
||||||
# RestartSec = 3;
|
# RestartSec = 3;
|
||||||
# };
|
# };
|
||||||
# };
|
# };
|
||||||
} else {})
|
} else {});
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ with lib;
|
|||||||
eval "$(register-python-argcomplete prod-prb)"
|
eval "$(register-python-argcomplete prod-prb)"
|
||||||
eval "$(register-python-argcomplete railbird)"
|
eval "$(register-python-argcomplete railbird)"
|
||||||
[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/zsh"
|
[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/zsh"
|
||||||
|
|
||||||
# Enable bracketed paste
|
|
||||||
autoload -Uz bracketed-paste-magic
|
|
||||||
zle -N bracketed-paste bracketed-paste-magic
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
automake
|
automake
|
||||||
bazel
|
bazel
|
||||||
bento4
|
|
||||||
bind
|
bind
|
||||||
binutils
|
binutils
|
||||||
cachix
|
cachix
|
||||||
@@ -17,15 +16,16 @@
|
|||||||
emacs
|
emacs
|
||||||
fd
|
fd
|
||||||
ffmpeg
|
ffmpeg
|
||||||
|
bento4
|
||||||
file
|
file
|
||||||
gawk
|
gawk
|
||||||
gcc
|
gcc
|
||||||
gdb
|
gdb
|
||||||
gh
|
|
||||||
git-fame
|
|
||||||
git-lfs
|
git-lfs
|
||||||
|
git-fame
|
||||||
git-sync
|
git-sync
|
||||||
gitFull
|
gitFull
|
||||||
|
glxinfo
|
||||||
gnumake
|
gnumake
|
||||||
gparted
|
gparted
|
||||||
home-manager
|
home-manager
|
||||||
@@ -38,33 +38,27 @@
|
|||||||
lshw
|
lshw
|
||||||
lsof
|
lsof
|
||||||
magic-wormhole-rs
|
magic-wormhole-rs
|
||||||
mesa-demos
|
|
||||||
ncdu
|
ncdu
|
||||||
neofetch
|
neofetch
|
||||||
neovim
|
neovim
|
||||||
nix-index
|
nix-index
|
||||||
nix-search-cli
|
|
||||||
pass
|
pass
|
||||||
patchelf
|
patchelf
|
||||||
pciutils
|
pciutils
|
||||||
pstree
|
pstree
|
||||||
pulseaudio
|
|
||||||
python-with-my-packages
|
python-with-my-packages
|
||||||
rclone
|
rclone
|
||||||
rcm
|
rcm
|
||||||
ripgrep
|
ripgrep
|
||||||
runc
|
|
||||||
silver-searcher
|
silver-searcher
|
||||||
skim
|
|
||||||
sshfs
|
|
||||||
sysz
|
sysz
|
||||||
|
sshfs
|
||||||
tmux
|
tmux
|
||||||
tzupdate
|
tzupdate
|
||||||
udiskie
|
udiskie
|
||||||
unzip
|
unzip
|
||||||
usbutils
|
usbutils
|
||||||
wget
|
wget
|
||||||
xkcdpass
|
|
||||||
yubikey-manager
|
yubikey-manager
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
{ config, pkgs, makeEnable, ... }:
|
{ config, pkgs, makeEnable, ... }:
|
||||||
makeEnable config "myModules.extra" false {
|
makeEnable config "modules.extra" false {
|
||||||
|
services.expressvpn.enable = true;
|
||||||
|
programs.hyprland.enable = true;
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
android-studio
|
android-studio
|
||||||
gradle
|
gradle
|
||||||
@@ -7,6 +10,7 @@ makeEnable config "myModules.extra" false {
|
|||||||
asciidoctor
|
asciidoctor
|
||||||
roomeqwizard
|
roomeqwizard
|
||||||
razergenie
|
razergenie
|
||||||
|
expressvpn
|
||||||
signal-desktop
|
signal-desktop
|
||||||
gource
|
gource
|
||||||
gimp
|
gimp
|
||||||
|
|||||||
2093
nixos/flake.lock
generated
2093
nixos/flake.lock
generated
File diff suppressed because it is too large
Load Diff
419
nixos/flake.nix
419
nixos/flake.nix
@@ -1,68 +1,19 @@
|
|||||||
{
|
{
|
||||||
inputs = {
|
inputs = {
|
||||||
|
railbird-secrets = {
|
||||||
|
url = "git+ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git";
|
||||||
|
};
|
||||||
|
nixos-hardware = { url = "github:colonelpanic8/nixos-hardware"; };
|
||||||
|
|
||||||
nixpkgs = {
|
nixpkgs = {
|
||||||
url = "github:NixOS/nixpkgs/nixos-unstable";
|
url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
};
|
};
|
||||||
|
|
||||||
flake-utils = {
|
|
||||||
url = "github:numtide/flake-utils";
|
|
||||||
inputs.systems.follows = "systems";
|
|
||||||
};
|
|
||||||
|
|
||||||
systems = {url = "github:nix-systems/default";};
|
|
||||||
|
|
||||||
git-ignore-nix = {
|
|
||||||
url = "github:hercules-ci/gitignore.nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager/master";
|
url = "github:nix-community/home-manager";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
nixos-hardware = {url = "github:colonelpanic8/nixos-hardware/my-master";};
|
|
||||||
|
|
||||||
nixos-wsl = {url = "github:nix-community/NixOS-WSL";};
|
|
||||||
|
|
||||||
agenix = {url = "github:ryantm/agenix";};
|
|
||||||
|
|
||||||
org-agenda-api = {
|
|
||||||
url = "github:colonelpanic8/org-agenda-api";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Hyprland and plugins from official flakes for proper plugin compatibility
|
|
||||||
hyprland = {
|
|
||||||
url = "git+https://github.com/hyprwm/Hyprland?submodules=1&ref=refs/tags/v0.53.0";
|
|
||||||
};
|
|
||||||
|
|
||||||
hy3 = {
|
|
||||||
url = "github:outfoxxed/hy3?ref=hl0.53.0";
|
|
||||||
inputs.hyprland.follows = "hyprland";
|
|
||||||
};
|
|
||||||
|
|
||||||
hyprland-plugins = {
|
|
||||||
url = "github:hyprwm/hyprland-plugins?ref=v0.53.0";
|
|
||||||
inputs.hyprland.follows = "hyprland";
|
|
||||||
};
|
|
||||||
|
|
||||||
railbird-secrets = {
|
|
||||||
url = "git+ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git";
|
|
||||||
};
|
|
||||||
# railbird-secrets = {
|
|
||||||
# url = "git+ssh://gitea@dev.railbird.ai:1123/railbird/secrets-flake.git";
|
|
||||||
# };
|
|
||||||
|
|
||||||
xmonad = {
|
|
||||||
url = "github:xmonad/xmonad";
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.follows = "nixpkgs";
|
|
||||||
flake-utils.follows = "flake-utils";
|
|
||||||
git-ignore-nix.follows = "git-ignore-nix";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
xmonad-contrib = {
|
xmonad-contrib = {
|
||||||
url = "github:IvanMalison/xmonad-contrib/withMyChanges";
|
url = "github:IvanMalison/xmonad-contrib/withMyChanges";
|
||||||
inputs = {
|
inputs = {
|
||||||
@@ -73,21 +24,35 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
taffybar = {
|
xmonad = {
|
||||||
url = "github:taffybar/taffybar/old-master";
|
url = "github:xmonad/xmonad";
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.follows = "nixpkgs";
|
nixpkgs.follows = "nixpkgs";
|
||||||
|
flake-utils.follows = "flake-utils";
|
||||||
|
git-ignore-nix.follows = "git-ignore-nix";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
taffybar = {
|
||||||
|
url = "github:taffybar/taffybar";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.follows = "nixpkgs";
|
||||||
|
flake-utils.follows = "flake-utils";
|
||||||
|
git-ignore-nix.follows = "git-ignore-nix";
|
||||||
|
xmonad.follows = "xmonad";
|
||||||
|
gtk-sni-tray.follows = "gtk-sni-tray";
|
||||||
|
gtk-strut.follows = "gtk-strut";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
imalison-taffybar = {
|
imalison-taffybar = {
|
||||||
url = "path:../dotfiles/config/taffybar";
|
url = "path:../dotfiles/config/taffybar";
|
||||||
# inputs = {
|
inputs = {
|
||||||
# nixpkgs.follows = "nixpkgs";
|
nixpkgs.follows = "nixpkgs";
|
||||||
# flake-utils.follows = "flake-utils";
|
flake-utils.follows = "flake-utils";
|
||||||
# xmonad.follows = "xmonad";
|
xmonad.follows = "xmonad";
|
||||||
# taffybar.follows = "taffybar";
|
taffybar.follows = "taffybar";
|
||||||
# };
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
notifications-tray-icon = {
|
notifications-tray-icon = {
|
||||||
@@ -97,6 +62,18 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
flake-utils = {
|
||||||
|
url = "github:numtide/flake-utils";
|
||||||
|
inputs.systems.follows = "systems";
|
||||||
|
};
|
||||||
|
|
||||||
|
systems = { url = "github:nix-systems/default"; };
|
||||||
|
|
||||||
|
git-ignore-nix = {
|
||||||
|
url = "github:hercules-ci/gitignore.nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
gtk-sni-tray = {
|
gtk-sni-tray = {
|
||||||
url = "github:taffybar/gtk-sni-tray";
|
url = "github:taffybar/gtk-sni-tray";
|
||||||
inputs = {
|
inputs = {
|
||||||
@@ -127,102 +104,20 @@
|
|||||||
|
|
||||||
vscode-server.url = "github:nix-community/nixos-vscode-server";
|
vscode-server.url = "github:nix-community/nixos-vscode-server";
|
||||||
|
|
||||||
nixified-ai = {url = "github:nixified-ai/flake";};
|
nixpkgs-regression = { url = "github:NixOS/nixpkgs"; };
|
||||||
|
|
||||||
nixtheplanet.url = "github:matthewcroughan/nixtheplanet";
|
nixified-ai = { url = "github:nixified-ai/flake"; };
|
||||||
|
|
||||||
codex-cli-nix = {
|
nixos-wsl = { url = "github:nix-community/NixOS-WSL"; };
|
||||||
url = "github:sadjow/codex-cli-nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
claude-code-nix = {
|
|
||||||
url = "github:sadjow/claude-code-nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
|
agenix.url = "github:ryantm/agenix";
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs @ {
|
outputs = inputs@{
|
||||||
self,
|
self, nixpkgs, nixos-hardware, home-manager, taffybar, xmonad,
|
||||||
nixpkgs,
|
xmonad-contrib, notifications-tray-icon, nix, agenix, imalison-taffybar, ...
|
||||||
nixos-hardware,
|
}:
|
||||||
home-manager,
|
let
|
||||||
taffybar,
|
|
||||||
xmonad,
|
|
||||||
nixtheplanet,
|
|
||||||
xmonad-contrib,
|
|
||||||
notifications-tray-icon,
|
|
||||||
nix,
|
|
||||||
agenix,
|
|
||||||
imalison-taffybar,
|
|
||||||
hyprland,
|
|
||||||
hy3,
|
|
||||||
hyprland-plugins,
|
|
||||||
org-agenda-api,
|
|
||||||
flake-utils,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
# Nixpkgs PR patches - just specify PR number and hash
|
|
||||||
nixpkgsPRPatches = [
|
|
||||||
{
|
|
||||||
pr = 434160; # git-sync-rs package
|
|
||||||
hash = "sha256-0j0IcyHd7rE+MXc0SHu8UixW7Jbtzu1NnzSjEVeZmTA=";
|
|
||||||
}
|
|
||||||
# claude-code
|
|
||||||
# {
|
|
||||||
# pr = 464698;
|
|
||||||
# hash = "sha256-Pe9G6b/rI0874mM7FIOSEKiaubk95NcFhTQ7paAeLTU=";
|
|
||||||
# }
|
|
||||||
# {
|
|
||||||
# pr = 464816;
|
|
||||||
# hash = "sha256-bKEoRy4dzP5TyRBjYskwEzr7tj8/ez/Y1XHiQgu5q5I=";
|
|
||||||
# }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Custom patches that don't fit the PR template
|
|
||||||
nixpkgsCustomPatches = [
|
|
||||||
];
|
|
||||||
|
|
||||||
# Home-manager PR patches - just specify PR number and hash
|
|
||||||
homeManagerPRPatches = [
|
|
||||||
# Example:
|
|
||||||
# {
|
|
||||||
# pr = 1234;
|
|
||||||
# hash = "sha256-...";
|
|
||||||
# }
|
|
||||||
];
|
|
||||||
|
|
||||||
# Custom home-manager patches that don't fit the PR template
|
|
||||||
homeManagerCustomPatches = [
|
|
||||||
{
|
|
||||||
url = "https://github.com/colonelpanic8/home-manager/commit/92f4b7aa5254f8bcddc9ef86e04ea5314410d10b.patch";
|
|
||||||
hash = "sha256-RQl5daVpCqQi05l9QfTEz2PpQxmsv/HYnXrgXbqbwWk=";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# Convert PR patches to full patch format for nixpkgs
|
|
||||||
nixpkgsPrPatchesToPatches = prPatches:
|
|
||||||
map (p: {
|
|
||||||
url = "https://patch-diff.githubusercontent.com/raw/NixOS/nixpkgs/pull/${toString p.pr}.patch";
|
|
||||||
hash = p.hash;
|
|
||||||
})
|
|
||||||
prPatches;
|
|
||||||
|
|
||||||
# Convert PR patches to full patch format for home-manager
|
|
||||||
homeManagerPrPatchesToPatches = prPatches:
|
|
||||||
map (p: {
|
|
||||||
url = "https://patch-diff.githubusercontent.com/raw/nix-community/home-manager/pull/${toString p.pr}.patch";
|
|
||||||
hash = p.hash;
|
|
||||||
})
|
|
||||||
prPatches;
|
|
||||||
|
|
||||||
# Combine all nixpkgs patches
|
|
||||||
allNixpkgsPatches = (nixpkgsPrPatchesToPatches nixpkgsPRPatches) ++ nixpkgsCustomPatches;
|
|
||||||
|
|
||||||
# Combine all home-manager patches
|
|
||||||
allHomeManagerPatches = (homeManagerPrPatchesToPatches homeManagerPRPatches) ++ homeManagerCustomPatches;
|
|
||||||
|
|
||||||
machinesFilepath = ./machines;
|
machinesFilepath = ./machines;
|
||||||
machineFilenames = builtins.attrNames (builtins.readDir machinesFilepath);
|
machineFilenames = builtins.attrNames (builtins.readDir machinesFilepath);
|
||||||
machineNameFromFilename = filename: builtins.head (builtins.split "\\." filename);
|
machineNameFromFilename = filename: builtins.head (builtins.split "\\." filename);
|
||||||
@@ -230,33 +125,13 @@
|
|||||||
mkConfigurationParams = filename: {
|
mkConfigurationParams = filename: {
|
||||||
name = machineNameFromFilename filename;
|
name = machineNameFromFilename filename;
|
||||||
value = {
|
value = {
|
||||||
baseModules = [
|
modules = [
|
||||||
(machinesFilepath + ("/" + filename))
|
(machinesFilepath + ("/" + filename)) agenix.nixosModules.default
|
||||||
agenix.nixosModules.default
|
|
||||||
nixtheplanet.nixosModules.macos-ventura
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
defaultConfigurationParams =
|
defaultConfigurationParams =
|
||||||
builtins.listToAttrs (map mkConfigurationParams machineFilenames);
|
builtins.listToAttrs (map mkConfigurationParams machineFilenames);
|
||||||
# Build org-agenda-api container for a given system
|
|
||||||
mkOrgAgendaApiContainerInfo = system: let
|
|
||||||
pkgs = import nixpkgs { inherit system; };
|
|
||||||
orgApiRev = builtins.substring 0 7 (org-agenda-api.rev or "unknown");
|
|
||||||
dotfilesRev = builtins.substring 0 7 (self.rev or self.dirtyRev or "dirty");
|
|
||||||
dotfilesOrgApi = import ./org-agenda-api.nix {
|
|
||||||
inherit pkgs system inputs;
|
|
||||||
};
|
|
||||||
tangledConfig = dotfilesOrgApi.org-agenda-custom-config;
|
|
||||||
containerLib = import ../org-agenda-api/container.nix {
|
|
||||||
inherit pkgs system tangledConfig org-agenda-api orgApiRev dotfilesRev;
|
|
||||||
};
|
|
||||||
tag = "colonelpanic-${orgApiRev}-${dotfilesRev}";
|
|
||||||
in {
|
|
||||||
imageFile = containerLib.containers.colonelpanic;
|
|
||||||
imageName = "org-agenda-api:${tag}";
|
|
||||||
};
|
|
||||||
|
|
||||||
customParams = {
|
customParams = {
|
||||||
biskcomp = {
|
biskcomp = {
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
@@ -264,94 +139,36 @@
|
|||||||
air-gapped-pi = {
|
air-gapped-pi = {
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
};
|
};
|
||||||
railbird-sf = {
|
|
||||||
specialArgs = let
|
|
||||||
containerInfo = mkOrgAgendaApiContainerInfo "x86_64-linux";
|
|
||||||
in {
|
|
||||||
orgAgendaApiContainer = containerInfo.imageFile;
|
|
||||||
orgAgendaApiImageName = containerInfo.imageName;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
mkConfig = {
|
mkConfig =
|
||||||
system ? "x86_64-linux",
|
args@
|
||||||
baseModules ? [],
|
{ system ? "x86_64-linux"
|
||||||
modules ? [],
|
, baseModules ? []
|
||||||
specialArgs ? {},
|
, modules ? []
|
||||||
...
|
, specialArgs ? {}
|
||||||
}: let
|
, ...
|
||||||
# Bootstrap nixpkgs for this specific system
|
}:
|
||||||
bootstrapPkgs = import nixpkgs {
|
nixpkgs.lib.nixosSystem (args // {
|
||||||
inherit system;
|
inherit system;
|
||||||
config = {};
|
modules = baseModules ++ modules;
|
||||||
overlays = [];
|
specialArgs = rec {
|
||||||
};
|
inherit inputs machineNames;
|
||||||
# Apply patches to nixpkgs source
|
makeEnable = (import ./make-enable.nix) nixpkgs.lib;
|
||||||
patchedSource = bootstrapPkgs.applyPatches {
|
keys = (import ./keys.nix);
|
||||||
name = "nixpkgs-patched";
|
usersInfo = (import ./users.nix) {
|
||||||
src = nixpkgs;
|
pkgs = { zsh = "zsh"; };
|
||||||
patches = map bootstrapPkgs.fetchpatch allNixpkgsPatches;
|
inherit keys inputs system;
|
||||||
prePatch = ''
|
|
||||||
mkdir -p pkgs/by-name/an/antigravity
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
# Get eval-config from patched source
|
|
||||||
evalConfig = import "${patchedSource}/nixos/lib/eval-config.nix";
|
|
||||||
# Apply patches to home-manager source (only if there are patches)
|
|
||||||
patchedHomeManagerSource =
|
|
||||||
if allHomeManagerPatches == []
|
|
||||||
then home-manager
|
|
||||||
else
|
|
||||||
bootstrapPkgs.applyPatches {
|
|
||||||
name = "home-manager-patched";
|
|
||||||
src = home-manager;
|
|
||||||
patches = map bootstrapPkgs.fetchpatch allHomeManagerPatches;
|
|
||||||
};
|
|
||||||
# Import the patched home-manager flake
|
|
||||||
patchedHomeManager =
|
|
||||||
if allHomeManagerPatches == []
|
|
||||||
then home-manager
|
|
||||||
else import "${patchedHomeManagerSource}/flake.nix";
|
|
||||||
# Get the NixOS module from the patched source
|
|
||||||
patchedHomeManagerModule =
|
|
||||||
if allHomeManagerPatches == []
|
|
||||||
then home-manager.nixosModules.home-manager
|
|
||||||
else import "${patchedHomeManagerSource}/nixos";
|
|
||||||
# Create a modified inputs with patched home-manager
|
|
||||||
patchedInputs = inputs // {
|
|
||||||
home-manager = inputs.home-manager // {
|
|
||||||
nixosModules = inputs.home-manager.nixosModules // {
|
|
||||||
home-manager = patchedHomeManagerModule;
|
|
||||||
};
|
|
||||||
# Also provide the patched source path for any direct imports
|
|
||||||
outPath = patchedHomeManagerSource.outPath or "${patchedHomeManagerSource}";
|
|
||||||
};
|
};
|
||||||
};
|
realUsers = (builtins.attrNames
|
||||||
in
|
(nixpkgs.lib.filterAttrs
|
||||||
evalConfig {
|
(_: value: (builtins.elem "isNormalUser" (builtins.attrNames value)) && value.isNormalUser) usersInfo.users.users)
|
||||||
inherit system;
|
);
|
||||||
modules = baseModules ++ modules;
|
mapAllKeysToValue = keys: value: builtins.listToAttrs (map (name: { inherit name value; }) keys);
|
||||||
specialArgs =
|
forEachUser = mapAllKeysToValue realUsers;
|
||||||
rec {
|
} // specialArgs;
|
||||||
inputs = patchedInputs;
|
});
|
||||||
inherit machineNames;
|
in
|
||||||
makeEnable = (import ./make-enable.nix) nixpkgs.lib;
|
{
|
||||||
keys = import ./keys.nix;
|
|
||||||
usersInfo = (import ./users.nix) {
|
|
||||||
pkgs = {zsh = "zsh";};
|
|
||||||
inherit keys system;
|
|
||||||
inputs = patchedInputs;
|
|
||||||
};
|
|
||||||
realUsers = (
|
|
||||||
builtins.attrNames
|
|
||||||
(nixpkgs.lib.filterAttrs
|
|
||||||
(_: value: (builtins.elem "isNormalUser" (builtins.attrNames value)) && value.isNormalUser)
|
|
||||||
usersInfo.users.users)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// specialArgs;
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
nixConfig = {
|
nixConfig = {
|
||||||
substituters = [
|
substituters = [
|
||||||
"https://cache.nixos.org/"
|
"https://cache.nixos.org/"
|
||||||
@@ -361,79 +178,17 @@
|
|||||||
];
|
];
|
||||||
extra-substituters = [
|
extra-substituters = [
|
||||||
"http://192.168.1.26:5050"
|
"http://192.168.1.26:5050"
|
||||||
"https://cache.flox.dev"
|
|
||||||
"https://org-agenda-api.cachix.org"
|
|
||||||
"https://codex-cli.cachix.org"
|
|
||||||
"https://claude-code.cachix.org"
|
|
||||||
];
|
];
|
||||||
extra-trusted-public-keys = [
|
extra-trusted-public-keys = [
|
||||||
"1896Folsom.duckdns.org:U2FTjvP95qwAJo0oGpvmUChJCgi5zQoG1YisoI08Qoo="
|
"1896Folsom.duckdns.org:U2FTjvP95qwAJo0oGpvmUChJCgi5zQoG1YisoI08Qoo="
|
||||||
"flox-cache-public-1:7F4OyH7ZCnFhcze3fJdfyXYLQw/aV7GEed86nQ7IsOs="
|
|
||||||
"org-agenda-api.cachix.org-1:liKFemKkOLV/rJt2txDNcpDjRsqLuBneBjkSw/UVXKA="
|
|
||||||
"codex-cli.cachix.org-1:1Br3H1hHoRYG22n//cGKJOk3cQXgYobUel6O8DgSing="
|
|
||||||
"claude-code.cachix.org-1:YeXf2aNu7UTX8Vwrze0za1WEDS+4DuI2kVeWEE4fsRk="
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
nixosConfigurations =
|
nixosConfigurations = builtins.mapAttrs (machineName: params:
|
||||||
builtins.mapAttrs (
|
let machineParams =
|
||||||
machineName: params: let
|
if builtins.hasAttr machineName customParams
|
||||||
machineParams =
|
then (builtins.getAttr machineName customParams)
|
||||||
if builtins.hasAttr machineName customParams
|
else {};
|
||||||
then (builtins.getAttr machineName customParams)
|
in mkConfig (params // machineParams)
|
||||||
else {};
|
) defaultConfigurationParams;
|
||||||
in
|
};
|
||||||
mkConfig (params // machineParams)
|
|
||||||
)
|
|
||||||
defaultConfigurationParams;
|
|
||||||
} // flake-utils.lib.eachDefaultSystem (system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs { inherit system; };
|
|
||||||
|
|
||||||
# Get short revs for tagging
|
|
||||||
orgApiRev = builtins.substring 0 7 (org-agenda-api.rev or "unknown");
|
|
||||||
dotfilesRev = builtins.substring 0 7 (self.rev or self.dirtyRev or "dirty");
|
|
||||||
|
|
||||||
# Get tangled config files from org-agenda-api.nix
|
|
||||||
dotfilesOrgApi = import ./org-agenda-api.nix {
|
|
||||||
inherit pkgs system;
|
|
||||||
inherit inputs;
|
|
||||||
};
|
|
||||||
tangledConfig = dotfilesOrgApi.org-agenda-custom-config;
|
|
||||||
|
|
||||||
# Import container build logic
|
|
||||||
containerLib = import ../org-agenda-api/container.nix {
|
|
||||||
inherit pkgs system tangledConfig org-agenda-api orgApiRev dotfilesRev;
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
packages = {
|
|
||||||
colonelpanic-org-agenda-api = containerLib.containers.colonelpanic;
|
|
||||||
kat-org-agenda-api = containerLib.containers.kat;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Dev shell for org-agenda-api deployment
|
|
||||||
devShells.org-agenda-api = pkgs.mkShell {
|
|
||||||
buildInputs = [
|
|
||||||
pkgs.flyctl
|
|
||||||
agenix.packages.${system}.default
|
|
||||||
pkgs.age
|
|
||||||
pkgs.ssh-to-age
|
|
||||||
pkgs.git
|
|
||||||
pkgs.jq
|
|
||||||
pkgs.just
|
|
||||||
pkgs.curl
|
|
||||||
];
|
|
||||||
shellHook = ''
|
|
||||||
echo ""
|
|
||||||
echo "org-agenda-api deployment shell"
|
|
||||||
echo ""
|
|
||||||
echo "Commands:"
|
|
||||||
echo " just --list - Show available API commands"
|
|
||||||
echo " ./deploy.sh <instance> - Deploy to Fly.io (colonelpanic or kat)"
|
|
||||||
echo " flyctl - Fly.io CLI"
|
|
||||||
echo " agenix -e <file> - Edit encrypted secrets"
|
|
||||||
echo ""
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{ pkgs, makeEnable, config, ... }:
|
{ pkgs, makeEnable, config, ... }:
|
||||||
makeEnable config "myModules.fonts" true {
|
makeEnable config "modules.fonts" true {
|
||||||
# Enable the gtk icon cache
|
# Enable the gtk icon cache
|
||||||
gtk.iconCache.enable = true;
|
gtk.iconCache.enable = true;
|
||||||
|
|
||||||
@@ -15,16 +15,19 @@ makeEnable config "myModules.fonts" true {
|
|||||||
fira-mono
|
fira-mono
|
||||||
font-awesome
|
font-awesome
|
||||||
|
|
||||||
noto-fonts-color-emoji
|
noto-fonts-emoji
|
||||||
roboto
|
roboto
|
||||||
source-code-pro
|
source-code-pro
|
||||||
source-sans-pro
|
source-sans-pro
|
||||||
source-serif-pro
|
source-serif-pro
|
||||||
twemoji-color-font
|
twemoji-color-font
|
||||||
nerd-fonts.jetbrains-mono
|
(nerdfonts.override { fonts = [
|
||||||
nerd-fonts.fantasque-sans-mono
|
"JetBrainsMono"
|
||||||
nerd-fonts.iosevka
|
"FantasqueSansMono"
|
||||||
nerd-fonts.victor-mono
|
"Iosevka"
|
||||||
|
"VictorMono"
|
||||||
|
"SourceCodePro"
|
||||||
|
]; })
|
||||||
];
|
];
|
||||||
fontconfig = {
|
fontconfig = {
|
||||||
hinting.autohint = true;
|
hinting.autohint = true;
|
||||||
@@ -32,7 +35,7 @@ makeEnable config "myModules.fonts" true {
|
|||||||
allowBitmaps = true;
|
allowBitmaps = true;
|
||||||
useEmbeddedBitmaps = true;
|
useEmbeddedBitmaps = true;
|
||||||
defaultFonts = {
|
defaultFonts = {
|
||||||
monospace = [ "JetBrains Mono" ];
|
monospace = [ "Source Code Pro" ];
|
||||||
sansSerif = [ "Roboto" ];
|
sansSerif = [ "Roboto" ];
|
||||||
serif = [ "Source Serif Pro" ];
|
serif = [ "Source Serif Pro" ];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
{ config, pkgs, makeEnable, ... }:
|
{ config, pkgs, makeEnable, ... }:
|
||||||
makeEnable config "myModules.games" false {
|
makeEnable config "modules.games" false {
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
steam
|
steam
|
||||||
heroic
|
# heroic
|
||||||
|
];
|
||||||
|
boot.extraModulePackages = with pkgs; [
|
||||||
|
xboxdrv
|
||||||
];
|
];
|
||||||
hardware.xone.enable = true;
|
hardware.xone.enable = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
{ pkgs, ... }: {
|
{ ... }: {
|
||||||
home-manager.users.imalison = ({ config, ... }: {
|
home-manager.users.imalison = ({ config, ... }: {
|
||||||
services.git-sync = {
|
services.git-sync = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.git-sync-rs;
|
|
||||||
repositories = {
|
repositories = {
|
||||||
config = {
|
config = {
|
||||||
path = config.home.homeDirectory + "/config";
|
path = config.home.homeDirectory + "/config";
|
||||||
@@ -19,7 +18,7 @@
|
|||||||
};
|
};
|
||||||
katnivan = {
|
katnivan = {
|
||||||
path = config.home.homeDirectory + "/katnivan";
|
path = config.home.homeDirectory + "/katnivan";
|
||||||
uri = "ssh://gitea@dev.railbird.ai:1123/colonelpanic/katnivan.git";
|
uri = "ssh://gitea@1896Folsom.duckdns.org:1123/colonelpanic/katnivan.git";
|
||||||
interval = 30;
|
interval = 30;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user