diff --git a/dotfiles/ghostty/config b/dotfiles/ghostty/config new file mode 100644 index 0000000..49edbd0 --- /dev/null +++ b/dotfiles/ghostty/config @@ -0,0 +1,24 @@ +font-family = Monocraft Nerd Font +background-opacity = 0.8 +theme = IC Orange PPL + +mouse-hide-while-typing = true + +keybind = super+n=new_window +keybind = super+h=goto_split:left +keybind = super+j=goto_split:down +keybind = super+k=goto_split:top +keybind = super+l=goto_split:right + +keybind = super+a>h=new_split:left +keybind = super+a>j=new_split:down +keybind = super+a>k=new_split:up +keybind = super+a>l=new_split:right +keybind = super+a>f=toggle_split_zoom + +keybind = super+a>n=next_tab +keybind = super+a>p=previous_tab + +keybind = super+r=reload_config + +window-save-state = always diff --git a/dotfiles/kanata/conf.kbd b/dotfiles/kanata/conf.kbd new file mode 100755 index 0000000..856af3c --- /dev/null +++ b/dotfiles/kanata/conf.kbd @@ -0,0 +1,163 @@ +#| + Kanata Config + ○ Ergonomic (kinda?) 34-key QWERTY layout + ○ GACS home-row mods + ○ Layers for function, number, media, and symbol keys + ○ Dedicated (and non-intrusive!) standard layout toggle for reliant tasks + ○ Decently commented for beginners and seasoned veterans alike. + + FEEL FREE TO FORK!!! +|# +(defcfg + concurrent-tap-hold yes + movemouse-smooth-diagonals yes +) +#| + Trying to be minimal in order to reduce constant editing + of layer keys, not to mention how ugly having a 60% layout + is when you have mapped keys in the grid. +|# +(defsrc + caps + q w e r t y u i o p + a s d f g h j k l scln + z x c v b n m , . / + lmet spc rmet +) +;; Variables for clean code +(defvar + tap-time 200 + hold-time 250 + chord-time 50 +) +;; Bindings +(defalias + ;; Normal keyboard layer for gaming/other normie usage + normie (layer-switch norm) + ;; Key chord definitions + chw (chord ch w) + che (chord ch e) + chi (chord ch i) + cho (chord ch o) + chs (chord ch s) + chd (chord ch d) + chk (chord ch k) + chl (chord ch l) + ch_lmet (chord ch lmet) + ch_rmet (chord ch rmet) + ;; Remap Caps to Escape/Nav layer + navlayer (layer-while-held nav) + caps (tap-hold $tap-time $hold-time (tap-dance 200 (esc caps)) @navlayer) + ;; Home row mods + a (tap-hold $tap-time $hold-time a lctl) + s (tap-hold $tap-time $hold-time s lalt) + d (tap-hold $tap-time $hold-time d lmet) + f (tap-hold $tap-time $hold-time f lsft) + j (tap-hold $tap-time $hold-time j rsft) + k (tap-hold $tap-time $hold-time k lmet) + l (tap-hold $tap-time $hold-time l lalt) + scln (tap-hold $tap-time $hold-time scln rctl) + ;; Numpad layer + numpad (layer-while-held num) + g (tap-hold $tap-time $hold-time g @numpad) + ;; Function key layer + fnkeys (layer-while-held fn) + h (tap-hold $tap-time $hold-time h @fnkeys) + #| + Hyper key when V or M are held down to allow for either hand to + use hyper key for AHK/Raycast shortcuts. + |# + v (tap-hold $tap-time $hold-time v (multi lsft lctl lalt)) + m (tap-hold $tap-time $hold-time m (multi lsft lctl lalt)) + ;; Holding Spacebar activates symbol layer + symbols (layer-while-held symbol) + spc (tap-hold $tap-time $hold-time spc @symbols) + ;; Media layer when Z or / are held. + medialy (layer-while-held md) + z (tap-hold $tap-time $hold-time z @medialy) + / (tap-hold $tap-time $hold-time / @medialy) +) +;; Chord definitions. Kind of weird to read as a layperson +;; so I provided sufficient comments for general understanding. +(defchords ch $chord-time + (w ) w ;; W => W + ( e) e ;; E => E + (w e) ret ;; W + E => Enter + (i ) i ;; I => I + ( o) o ;; O => O + (i o) bspc ;; I + O => Backspace + (s ) @s ;; S => S + ( d) @d ;; D => D + (s d) tab ;; S + D => Tab + (k ) @k ;; K => K (See defalias) + ( l) @l ;; L => L (See defalias) + (k l) esc ;; K + L => Escape + (lmet ) (tap-dance $tap-time ((multi lsft lctl lalt lmet) lmet)) ;; LCmd => Hyper Key, LCmd × 2 => LCmd + ( rmet) (tap-dance $tap-time ((multi lsft lctl lalt lmet) lmet)) ;; RCmd => Hyper Key, RAlt × 2 => RCmd + #| + Put simply, the below line allows for toggling a no-bind + layer for when you may require a standard layout (such as + playing Street Fighter, Counter Strike, etc.) by pressing + both Meta keys at the same time. You can toggle back to the + base layer by holding both Meta keys at the same time, as to allow + for normal functionality when holding either key down for a shortcut. + |# + (lmet rmet) (tap-hold $tap-time $hold-time @normie (layer-switch base)) +) +;; Base layer with all binds enabled +(deflayer base + @caps + q @chw @che r t y u @chi @cho p + @a @chs @chd @f @g @h @j @chk @chl @scln + @z x c @v b n @m , . @/ + @ch_lmet @spc @ch_rmet +) +;; Navigation layer +(deflayer nav + _ + _ (movemouse-up 3 3) _ _ _ _ mlft mrgt pgup pgdn + (movemouse-left 3 3) (movemouse-down 3 3) (movemouse-right 3 3) _ home left down up right end + _ _ _ _ _ _ _ _ _ _ + _ _ _ +) +;; Numpad Layer +(deflayer num + _ + _ _ _ _ _ _ 7 8 9 _ + _ _ _ _ _ _ 4 5 6 0 _ + _ _ _ _ _ 1 2 3 _ + _ _ _ +) +;; Function key layer +(deflayer fn + _ + f1 f2 f3 f4 _ _ _ _ _ _ + f5 f6 f7 f8 _ _ _ _ _ _ _ + f9 f10 f11 f12 _ _ _ _ _ + _ _ _ +) +;; Symbol layer +(deflayer symbol + _ + S-1 S-2 S-3 S-4 S-5 S-6 S-7 S-8 S-9 S-0 + - S-= S-[ S-] [ ] S-` S-scln S-\ \ + = _ _ ` _ S-- _ _ ' S-' + _ _ _ +) +;; Aformentioned standard layer with combo binds for toggling back +;; to base layer. +(deflayer norm + esc + q w e r t y u i o p + a s d f g h j k l scln + z x c v b n m , . / + @ch_lmet spc @ch_rmet +) +;; Media layer +(deflayer md + _ + _ _ _ _ _ _ _ _ _ _ + prev pp next mute vold volu brdn brup ins del + _ _ _ _ _ _ _ _ _ _ + _ _ _ +) diff --git a/dotfiles/skhd/skhdrc b/dotfiles/skhd/skhdrc new file mode 100644 index 0000000..fb68479 --- /dev/null +++ b/dotfiles/skhd/skhdrc @@ -0,0 +1,8 @@ +# General Movement +alt - h : yabai -m window --focus west +alt - j : yabai -m window --focus south +alt - k : yabai -m window --focus north +alt - l : yabai -m window --focus east + +# Open apps +alt - t : open -n -a "ghostty" diff --git a/dotfiles/yabai/yabairc b/dotfiles/yabai/yabairc new file mode 100644 index 0000000..7fab94d --- /dev/null +++ b/dotfiles/yabai/yabairc @@ -0,0 +1,11 @@ +yabai -m config layout bsp +yabai -m config window_placement second_child + +yabai -m config top_padding 10 +yabai -m config bottom_padding 10 +yabai -m config left_padding 10 +yabai -m config right_padding 10 +yabai -m config window_gap 10 + +yabai -m config mouse_follows_focus on +yabai -m config mouse_modifier alt diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..d81b18d --- /dev/null +++ b/flake.lock @@ -0,0 +1,140 @@ +{ + "nodes": { + "brew-src": { + "flake": false, + "locked": { + "lastModified": 1756059815, + "narHash": "sha256-UALOxoXoFIHbwKzcqbqCAqw5cC0MJEehLaWSet5vxfE=", + "owner": "Homebrew", + "repo": "brew", + "rev": "02947ea4edbdef5fcce9ee57fa289547f4d096c9", + "type": "github" + }, + "original": { + "owner": "Homebrew", + "ref": "4.6.7", + "repo": "brew", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1758207369, + "narHash": "sha256-BG7GlXo5moXtrFSCqnkIb1Q00szOZXTj5Dx7NmWgves=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "b5698ed57db7ee7da5e93df2e6bbada91c88f3ce", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "homebrew-cask": { + "flake": false, + "locked": { + "lastModified": 1758245667, + "narHash": "sha256-zfbroR4KhbUBD77DlPqHO6igkT6e3hiVmJxuSEk7Aag=", + "owner": "homebrew", + "repo": "homebrew-cask", + "rev": "d8aa9aadd1b2a4342b60062c3dc88d477634cf04", + "type": "github" + }, + "original": { + "owner": "homebrew", + "repo": "homebrew-cask", + "type": "github" + } + }, + "homebrew-core": { + "flake": false, + "locked": { + "lastModified": 1758247278, + "narHash": "sha256-azIe1WP5sj4Im3JRPcF0nKDjoXqnJHKs97Mw3m7eyRM=", + "owner": "homebrew", + "repo": "homebrew-core", + "rev": "bb75886332a24590b175f70bc1191d2c4c8870b5", + "type": "github" + }, + "original": { + "owner": "homebrew", + "repo": "homebrew-core", + "type": "github" + } + }, + "nix-darwin": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1758102940, + "narHash": "sha256-wwqf3+A8EiqwWpcAaPN20QXJLlpGPpwtLTrzgnngI2o=", + "owner": "nix-darwin", + "repo": "nix-darwin", + "rev": "ebd0bfc11fc2b5cff37401e9b3703881ad5fabbd", + "type": "github" + }, + "original": { + "owner": "nix-darwin", + "ref": "master", + "repo": "nix-darwin", + "type": "github" + } + }, + "nix-homebrew": { + "inputs": { + "brew-src": "brew-src" + }, + "locked": { + "lastModified": 1756398546, + "narHash": "sha256-n4GVDLhKu65XFraJuCzap2AaZji4xhPaZMTJ8aQdD3s=", + "owner": "zhaofengli", + "repo": "nix-homebrew", + "rev": "3aa475996cb3bc1ecefa88c99c466e6f0bc17431", + "type": "github" + }, + "original": { + "owner": "zhaofengli", + "repo": "nix-homebrew", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1758029226, + "narHash": "sha256-TjqVmbpoCqWywY9xIZLTf6ANFvDCXdctCjoYuYPYdMI=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "08b8f92ac6354983f5382124fef6006cade4a1c1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "home-manager": "home-manager", + "homebrew-cask": "homebrew-cask", + "homebrew-core": "homebrew-core", + "nix-darwin": "nix-darwin", + "nix-homebrew": "nix-homebrew", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..70b468c --- /dev/null +++ b/flake.nix @@ -0,0 +1,94 @@ +{ + description = "Personal nix-darwin system flake"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + nix-darwin.url = "github:nix-darwin/nix-darwin/master"; + nix-darwin.inputs.nixpkgs.follows = "nixpkgs"; + home-manager.url = "github:nix-community/home-manager"; + home-manager.inputs.nixpkgs.follows = "nixpkgs"; + nix-homebrew.url = "github:zhaofengli/nix-homebrew"; + homebrew-core = { + url = "github:homebrew/homebrew-core"; + flake = false; + }; + homebrew-cask = { + url = "github:homebrew/homebrew-cask"; + flake = false; + }; + }; + + outputs = inputs@{ self, nix-darwin, nix-homebrew, homebrew-core, homebrew-cask, home-manager, nixpkgs }: + let + configuration = { pkgs, ... }: { + + users.users.erogers = { + name = "erogers"; + home = "/Users/erogers"; + }; + + environment.systemPackages = with pkgs; [ + neovim # Text editor of choice + btop # Resource manager + iina # Media player + yabai # Tiling window manager + skhd # Hotkey daemon + # raycast # AI chat/Application launcher/Automation tool + # kanata # Keyboard remapping tool + ]; + + services.yabai = { + enable = true; + extraConfig = builtins.readFile ./dotfiles/yabai/yabairc; + }; + services.skhd = { + enable = true; + skhdConfig = builtins.readFile ./dotfiles/skhd/skhdrc; + }; + system.primaryUser = "erogers"; + system.defaults = { + dock.autohide = true; + finder.AppleShowAllExtensions = true; + }; + + + + nix.enable =false; + # Necessary for using flakes on this system. + nix.settings.experimental-features = "nix-command flakes"; + # Allow unfree software + nixpkgs.config.allowUnfree = true; + # Allow for TouchID authentication when executing commands with sudo + security.pam.services.sudo_local.touchIdAuth = true; + # 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. + # $ darwin-rebuild changelog + system.stateVersion = 6; + # The platform the configuration will be used on. + nixpkgs.hostPlatform = "aarch64-darwin"; + }; + in + { + # Build darwin flake using: + # $ darwin-rebuild build --flake .#Angrboda + darwinConfigurations."Angrboda" = nix-darwin.lib.darwinSystem { + modules = [ + configuration + nix-homebrew.darwinModules.nix-homebrew { + nix-homebrew = { + enable = true; + enableRosetta = true; + user = "erogers"; + autoMigrate = true; + }; + } + home-manager.darwinModules.home-manager { + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.users.erogers = import ./home.nix; + } + ]; + }; + }; +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..bf2e989 --- /dev/null +++ b/home.nix @@ -0,0 +1,40 @@ +{ config, pkgs, ... }: + +{ + home.stateVersion = "25.05"; # Please read the comment before changing. + + home.packages = with pkgs; [ + irssi + ]; + + # Home Manager is pretty good at managing dotfiles. The primary way to manage + # plain files is through 'home.file'. + home.file = { + # # Building this configuration will create a copy of 'dotfiles/screenrc' in + # # the Nix store. Activating the configuration will then make '~/.screenrc' a + # # symlink to the Nix store copy. + # ".screenrc".source = dotfiles/screenrc; + + # # You can also set the file content immediately. + # ".gradle/gradle.properties".text = '' + # org.gradle.console=verbose + # org.gradle.daemon.idletimeout=3600000 + # ''; + }; + + # You can also manage environment variables but you will have to manually + # source + # + # ~/.nix-profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # /etc/profiles/per-user/davish/etc/profile.d/hm-session-vars.sh + # + # if you don't want to manage your shell through Home Manager. + home.sessionVariables = { + EDITOR = "nvim"; + }; + + programs.home-manager.enable = true; +}