diff --git a/README.org b/README.org index 04635da..feacee2 100644 --- a/README.org +++ b/README.org @@ -47,6 +47,9 @@ This guide documents methods for installing NixOS on a Proxmox virtual machine. - [[#generating-hardware-configuration][Generating Hardware Configuration]] - [[#todos][TODOs]] - [[#inspiration][Inspiration]] +- [[#fujin-install][Fujin install]] + - [[#boot-drive][Boot Drive]] + - [[#minimal][Minimal]] * Installation Methods ** Method 1: Remote Installation with nixos-anywhere @@ -269,3 +272,32 @@ nix run github:nix-community/nixos-anywhere -- \ * Inspiration The configuration and structure of this setup were inspired by the following repository: - [[https://github.com/notthebee/nix-config][notthebee/nix-config]] + +* Fujin install +** Boot Drive +1. Boot into izanami +2. git clone repo 'git clone https://github.com/LichHunter/susano-nixos' +3. Disko install fujin-minimal 'nix run github:nix-community/disko#disko-install -- --flake .#fujin-minimal --disk main /dev/nvme0n1' +4. Reboot +** Minimal +1. Mount backup drive 'mkdir /tmp/drive; sudo mount /dev/sda1 /tmp/drive' +2. Copy latest backup from drive to home folder +3. Unarchive it (you should now have ssh keys) +4. Git clone nixos repo 'git clone git@github.com:LichHunter/susano-nixos' +5. Upgrade to man configuration + #+begin_src bash +sudo nixos-rebuild boot --flake .#fujin + #+end_src +6. Install emacs + #+begin_src bash +git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs +~/.config/emacs/bin/doom install + #+end_src +7. Copy configs for emacs + #+begin_src bash +cp ~/susano-nixos/machines/fujin/main/doom-configs ~/.config/doom + #+end_src +8. Update doom-emacs + #+begin_src bash +~/.config/emacs/bin/doom sync + #+end_src diff --git a/bin/rebuild.sh b/bin/rebuild.sh new file mode 100755 index 0000000..3688ccb --- /dev/null +++ b/bin/rebuild.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +# A script to simplify nixos-rebuild commands for this flake. + +set -euo pipefail + +# --- Find Flake Root --- +# Get the directory of this script, then find the real path to its parent directory. +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +FLAKE_ROOT=$(realpath "$SCRIPT_DIR/..") + +# --- Configuration --- +# Default user to build for. +# This is used to construct the flake reference (e.g., .#fujin). +USERNAME=$(whoami) + +# --- Help Message --- +usage() { + echo "Usage: $0 [options]" + echo "" + echo "A wrapper for 'nixos-rebuild' for the flake at: $FLAKE_ROOT" + echo "" + echo "Commands:" + echo " build Build the new configuration." + echo " test Test the new configuration." + echo " switch Switch to the new configuration." + echo " boot Switch to the new configuration and make it the default for next boot." + echo "" + echo "Options:" + echo " --local-build Build on the local machine instead of the default remote builder." + echo " -h, --help Show this help message." + echo "" + echo "Any other arguments are passed directly to 'nixos-rebuild'." +} + +# --- Argument Parsing --- +COMMAND="" +BUILD_ARGS=("--build-host" "izanagi") +PASSTHROUGH_ARGS=() + +if [[ $# -eq 0 ]]; then + usage + exit 1 +fi + +while [[ $# -gt 0 ]]; do + case "$1" in + build|test|switch|boot) + if [[ -n "$COMMAND" ]]; then + echo "Error: Only one command (build, test, switch, boot) can be specified." >&2 + exit 1 + fi + COMMAND="$1" + shift + ;; + --local-build) + BUILD_ARGS=() + shift + ;; + -h|--help) + usage + exit 0 + ;; + *) + PASSTHROUGH_ARGS+=("$1") + shift + ;; + esac +done + +# --- Validation --- +if [[ -z "$COMMAND" ]]; then + echo "Error: No command (build, test, switch, boot) specified." >&2 + usage + exit 1 +fi + +# --- Sudo Check --- +SUDO_CMD="" +if [[ "$COMMAND" == "test" || "$COMMAND" == "switch" || "$COMMAND" == "boot" ]]; then + SUDO_CMD="sudo" +fi + +# --- Flake Reference --- +FLAKE_REF="$FLAKE_ROOT#$USERNAME" + +# --- Command Execution --- +# We build the command in an array to handle arguments with spaces correctly. +FULL_CMD=() +if [[ -n "$SUDO_CMD" ]]; then + FULL_CMD+=("$SUDO_CMD") +fi +FULL_CMD+=("nixos-rebuild" "$COMMAND" "--flake" "$FLAKE_REF") +if [[ ${#BUILD_ARGS[@]} -gt 0 ]]; then + FULL_CMD+=("${BUILD_ARGS[@]}") +fi +if [[ ${#PASSTHROUGH_ARGS[@]} -gt 0 ]]; then + FULL_CMD+=("${PASSTHROUGH_ARGS[@]}") +fi + + +echo "Building for user: $USERNAME on host: $(hostname)" +echo "Flake reference: $FLAKE_REF" +echo "Executing command:" +echo " ${FULL_CMD[@]}" +echo "-----------------------------------------------------" + +"${FULL_CMD[@]}" + +echo "-----------------------------------------------------" +echo "Done." diff --git a/hm-modules/bar/waybar/default.nix b/hm-modules/bar/waybar/default.nix index 2e17161..c825e86 100644 --- a/hm-modules/bar/waybar/default.nix +++ b/hm-modules/bar/waybar/default.nix @@ -13,6 +13,7 @@ in { config = mkIf cfg.enable { home.packages = with pkgs; [ wlogout + pavucontrol # gui sound manager ]; programs.waybar = { diff --git a/hm-modules/default.nix b/hm-modules/default.nix index a795434..b236448 100644 --- a/hm-modules/default.nix +++ b/hm-modules/default.nix @@ -3,7 +3,6 @@ { imports = [ ./shell - ./window-manager ./bar ./launcher ./random diff --git a/hm-modules/window-manager/hypr/default.nix b/hm-modules/window-manager/hypr/default.nix deleted file mode 100644 index 36b2ca7..0000000 --- a/hm-modules/window-manager/hypr/default.nix +++ /dev/null @@ -1,249 +0,0 @@ -{ config, lib, pkgs, inputs, ... }: - -with lib; - -let - colors = config.lib.stylix.colors; - cfg = config.dov.window-manager.hypr; -in { - options.dov.window-manager.hypr.enable = mkEnableOption "hypr configuration"; - config = mkIf cfg.enable { - home.packages = with pkgs; [ - swww - mako - pipewire - wireplumber - libnotify - kitty - jq # used in lock to get language - wayland-protocols - - #hyprland extensions - hyprlock - hypridle - ]; - - wayland.windowManager.hyprland = { - enable = true; - xwayland.enable = true; - package = inputs.hyprland.packages.${pkgs.system}.hyprland; - plugins = [ - inputs.split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces - ]; - - settings = { - monitor = ",highres,auto,1"; - source = "~/.config/hypr/colors"; - - env = [ - "LIBVA_DRIVER_NAME,nvidia" - "XDG_SESSION_TYPE,wayland" - "WLR_NO_HARDWARE_CURSORS,1" - ]; - - #Autostart - exec = [ - # Fix slow startup - "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - "dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - ]; - - exec-once = [ - "mako" - "polkit-kde-agent" - "emacs --fg-daemon" - "hypridle" - "kanshi" - "virsh net-start default" - #"thunderbird" - #"element-desktop" - "keepassxc" - "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - ] ++ lib.optionals config.dov.bar.waybar.enable [ "waybar" ]; - - "$mainMod" = "SUPER"; - - bind = [ - "$mainMod, G, fullscreen," - "$mainMod, t, togglegroup" - "$mainMod, v, togglefloating" - "$mainMod, s, togglesplit" - - #bind = $mainMod, RETURN, exec, kitty - "$mainMod, RETURN, exec, alacritty" - "$mainMod, o, exec, emacsclient -c" - "SUPER_SHIFT, RETURN, exec, thunar" - "SUPER_SHIFT, l, exec, hyprctl switchxkblayout at-translated-set-2-keyboard 0 && hyprlock" - - #bind = $mainMod, M, exit, - "SUPER_SHIFT, q, killactive," - - # Switch Keyboard Layouts - "$mainMod, SPACE, exec, hyprctl switchxkblayout teclado-gamer-husky-blizzard next" - - ", Print, exec, grim -g \"$(slurp)\" - | wl-copy" - "SHIFT, Print, exec, IMG=~/Pictures/$(date +%Y-%m-%d_%H-%m-%s).png && grim -g \"$(slurp)\" $IMG" - - # Functional keybinds - ",XF86AudioMicMute,exec,pamixer --default-source -t" - ",XF86MonBrightnessDown,exec,brightnessctl s 20-" - ",XF86MonBrightnessUp,exec,brightnessctl s 20+" - ",XF86AudioMute,exec,amixer -q sset Master toggle" - ",XF86AudioLowerVolume,exec,amixer -q sset Master 5%-" - ",XF86AudioRaiseVolume,exec,amixer -q sset Master 5%+" - ",XF86AudioPlay,exec,playerctl play-pause" - ",XF86AudioPause,exec,playerctl play-pause" - - # to switch between windows in a floating workspace - "SUPER,Tab,changegroupactive, f" - "SUPER_SHIFT,Tab,changegroupactive, b" - - # Move focus with mainMod + arrow keys - "$mainMod, h, movefocus, l" - "$mainMod, l, movefocus, r" - "$mainMod, k, movefocus, u" - "$mainMod, j, movefocus, d" - - # Switch workspaces with mainMod + [0-9] - "$mainMod, 1, split-workspace, 1" - "$mainMod, 2, split-workspace, 2" - "$mainMod, 3, split-workspace, 3" - "$mainMod, 4, split-workspace, 4" - "$mainMod, 5, split-workspace, 5" - "$mainMod, 6, split-workspace, 6" - "$mainMod, 7, split-workspace, 7" - "$mainMod, 8, split-workspace, 8" - "$mainMod, 9, split-workspace, 9" - "$mainMod, 0, split-workspace, 10" - - # Move active window to a workspace with mainMod + SHIFT + [0-9] - "$mainMod SHIFT, 1, split-movetoworkspace, 1" - "$mainMod SHIFT, 2, split-movetoworkspace, 2" - "$mainMod SHIFT, 3, split-movetoworkspace, 3" - "$mainMod SHIFT, 4, split-movetoworkspace, 4" - "$mainMod SHIFT, 5, split-movetoworkspace, 5" - "$mainMod SHIFT, 6, split-movetoworkspace, 6" - "$mainMod SHIFT, 7, split-movetoworkspace, 7" - "$mainMod SHIFT, 8, split-movetoworkspace, 8" - "$mainMod SHIFT, 9, split-movetoworkspace, 9" - "$mainMod SHIFT, 0, split-movetoworkspace, 10" - - # Scroll through existing workspaces with mainMod + scroll - "$mainMod, mouse_down, split-workspace, e+1" - "$mainMod, mouse_up, split-workspace, e-1" - "$mainMod,SPACE, exec, hyprctl switchxkblayout at-translated-set-2-keyboard next" - ] ++ lib.optionals config.dov.launcher.wofi.enable [ - "$mainMod, p, exec, wofi --show drun" - ]; - - bindm = [ - "$mainMod, mouse:272, movewindow" - "$mainMod, mouse:273, resizewindow" - "ALT, mouse:272, resizewindow" - ]; - - input = { - kb_layout = "us,ru,ua"; - kb_options = "grp:win_space_toggle"; - - follow_mouse = 1; - - touchpad = { - natural_scroll = false; - }; - - sensitivity = 0; - }; - - general = { - gaps_in = 5; - gaps_out = 20; - border_size = 2; - "col.active_border" = lib.mkForce "rgba(33ccffee) rgba(00ff99ee) 45deg"; - "col.inactive_border" = lib.mkForce "rgba(595959aa)"; - - layout = "dwindle"; - }; - - decoration = { - rounding = 10; - - shadow = { - enabled = true; - range = 4; - render_power = 3; - }; - }; - - animations = { - enabled = "yes"; - - bezier = "ease,0.4,0.02,0.21,1"; - - animation = [ - "windows, 1, 3.5, ease, slide" - "windowsOut, 1, 3.5, ease, slide" - "border, 1, 6, default" - "fade, 1, 3, ease" - "workspaces, 1, 3.5, ease" - ]; - }; - - dwindle = { - pseudotile = "yes"; - preserve_split = "yes"; - }; - - master = { - new_status = "master"; - }; - - gestures = { - workspace_swipe = false; - }; - - workspace = [ - #"0, monitor:DP-1" - "8, monitor:e-DP-1" - "9, monitor:e-DP-1" - #"9, on-created-empty:[tiled] thunderbird" - ]; - - windowrulev2 = [ - "workspace 9, class:^(.*thunderbird.*)$" - "group, class:^(.*thunderbird.*)$" - "workspace 9, class:^(.*Element.*)$" - "group, class:^(.*Element.*)$" - "workspace 8, title:^(.*KeePassXC.*)$" - "float, class:^(.*steam.*)$" - "noinitialfocus,class:(jetbrains-)(.*),title:^win(.*), initialTitle:win.*, floating:1" - ]; - }; - }; - - home.file.".config/hypr/colors".text = '' - $background = ${colors.base00} - $foreground = ${colors.base05} - - $color0 = ${colors.base00} - $color1 = ${colors.base01} - $color2 = ${colors.base02} - $color3 = ${colors.base03} - $color4 = ${colors.base04} - $color5 = ${colors.base05} - $color6 = ${colors.base06} - $color7 = ${colors.base07} - $color8 = ${colors.base08} - $color9 = ${colors.base09} - $color10 = ${colors.base0A} - $color11 = ${colors.base0B} - $color12 = ${colors.base0C} - $color13 = ${colors.base0D} - $color14 = ${colors.base0E} - $color15 = ${colors.base0F} - ''; - - xdg.configFile."hypr/hyprlock.conf".source = ./hyprlock.conf; - xdg.configFile."hypr/hypridle.conf".source = ./hypridle.conf; - }; -} diff --git a/machines/fujin/main/default.nix b/machines/fujin/main/default.nix index 20729d4..b2b68a6 100644 --- a/machines/fujin/main/default.nix +++ b/machines/fujin/main/default.nix @@ -32,6 +32,8 @@ }; }; + networking.networkmanager.enable = true; + ### # Thunar configurations ### @@ -48,6 +50,8 @@ virtualisation.docker.enable = true; window-manager.hypr.enable = true; + + display-manager.ly.enable = true; }; ### diff --git a/machines/fujin/main/doom-configs/config.el b/machines/fujin/main/doom-configs/config.el new file mode 100644 index 0000000..e04fd60 --- /dev/null +++ b/machines/fujin/main/doom-configs/config.el @@ -0,0 +1,245 @@ +;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- + +;; Place your private configuration here! Remember, you do not need to run 'doom +;; sync' after modifying this file! + + +;; Some functionality uses this to identify you, e.g. GPG configuration, email +;; clients, file templates and snippets. It is optional. +(setq user-full-name "Alexander Derevianko" + user-mail-address "alexander0derevianko@gmail.com") + +;; Doom exposes five (optional) variables for controlling fonts in Doom: +;; +;; - `doom-font' -- the primary font to use +;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) +;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for +;; presentations or streaming. +;; - `doom-unicode-font' -- for unicode glyphs +;; - `doom-serif-font' -- for the `fixed-pitch-serif' face +;; +;; See 'C-h v doom-font' for documentation and more examples of what they +;; accept. For example: +;; +(setq doom-font (font-spec :family "Fira Code" :size 18) + doom-variable-pitch-font (font-spec :family "Fira Sans" :size 18)) +;; +;; If you or Emacs can't find your font, use 'M-x describe-font' to look them +;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to +;; refresh your font settings. If Emacs still can't find your font, it likely +;; wasn't installed correctly. Font issues are rarely Doom issues! + +;; There are two ways to load a theme. Both assume the theme is installed and +;; available. You can either set `doom-theme' or manually load a theme with the +;; `load-theme' function. This is the default: +(setq doom-theme 'doom-gruvbox) + +;; This determines the style of line numbers in effect. If set to `nil', line +;; numbers are disabled. For relative line numbers, set this to `relative'. +(setq display-line-numbers-type `relative) + +;; If you use `org' and don't want your org files in the default location below, +;; change `org-directory'. It must be set before org loads! +(setq org-directory "~/org/") + + +;; Whenever you reconfigure a package, make sure to wrap your config in an +;; `after!' block, otherwise Doom's defaults may override your settings. E.g. +;; +;; (after! PACKAGE +;; (setq x y)) +;; +;; The exceptions to this rule: +;; +;; - Setting file/directory variables (like `org-directory') +;; - Setting variables which explicitly tell you to set them before their +;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). +;; - Setting doom variables (which start with 'doom-' or '+'). +;; +;; Here are some additional functions/macros that will help you configure Doom. +;; +;; - `load!' for loading external *.el files relative to this one +;; - `use-package!' for configuring packages +;; - `after!' for running code after a package has loaded +;; - `add-load-path!' for adding directories to the `load-path', relative to +;; this file. Emacs searches the `load-path' when you load packages with +;; `require' or `use-package'. +;; - `map!' for binding new keys +;; +;; To get information about any of these functions/macros, move the cursor over +;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). +;; This will open documentation for it, including demos of how they are used. +;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, +;; etc). +;; +;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how +;; they are implemented. + +(general-auto-unbind-keys) +(map! :leader + (:prefix ("m" . "my") + "c" #'comment-dwim + (:prefix ("d" . "dap") + "c" #'dap-java-run-test-class + "m" #'dap-java-run-test-method + "n" #'dap-next + "i" #'dap-step-in + "C" #'dap-continue + "k" #'dap-disconnect + "r" #'dap-debug-restart + (:prefix ("b" . "breakpoint") + "a" #'dap-breakpoint-add + "d" #'dap-breakpoint-delete + "A" #'dap-breakpoint-delete-all + ) + (:prefix ("d" . "debug") + "c" #'dap-java-debug-test-class + "m" #'dap-java-debug-test-method + ) + ) + (:prefix ("l" . "lsp") + "j" #'lsp-jt-browser + "i" #'lsp-java-organize-imports + "r" #'lsp-rename + "g d" #'lsp-goto-type-definition + ) + ) + ) + +;; (setq lsp-java-format-settings-url "https://github.com/google/styleguide/blob/gh-pages/intellij-java-google-style.xml") + +;; add map for lsp-jt-browser +;; + lsp-jt-browser +;; + dap-java-run-test-class +;; + dap-java-run-test-method + +(setq git-commit-summary-max-length 1000) + + +(after! org + (setq org-agenda-files '("~/org/agenda.org" + "~/nixos-dotfiles/todo.org")) + (setq org-default-notes-file (expand-file-name "notes.org" org-directory) + org-ellipsis " ▼ " + org-superstar-headline-bullets-list '("◉" "●" "○" "◆" "●" "○" "◆") + org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦)) ; changes +/- symbols in item lists + org-agenda-start-with-log-mode t + org-log-done 'time + org-log-into-drawer t + org-hide-emphasis-markers t + ;; ex. of org-link-abbrev-alist in action + ;; [[arch-wiki:Name_of_Page][Description]] + org-link-abbrev-alist ; This overwrites the default Doom org-link-abbrev-list + '(("google" . "http://www.google.com/search?q=") + ("arch-wiki" . "https://wiki.archlinux.org/index.php/") + ("ddg" . "https://duckduckgo.com/?q=") + ("wiki" . "https://en.wikipedia.org/wiki/")) + org-table-convert-region-max-lines 20000 + org-todo-keywords ; This overwrites the default Doom org-todo-keywords + '((sequence + "TODO(t)" ; A task that is ready to be tackled + "INPROGRESS(i)" ; A task that is in progress + "WAIT(w)" ; Something is holding up this task + "|" ; The pipe necessary to separate "active" states and "inactive" states + "DONE(d)" ; Task has been completed + "CANCELLED(c)" )))) ; Task has been cancelled + +(after! lsp-java + (require 'lsp-java-boot) + (require 'dap-java) + + ;; to enable the lenses + (add-hook 'lsp-mode-hook #'lsp-lens-mode) + (add-hook 'java-mode-hook #'lsp-java-boot-lens-mode) + (add-hook 'java-mode-hook #'lsp-java-boot-lens-mode) + (lsp-register-client + (make-lsp-client :new-connection (lsp-stdio-connection "nixd") + :major-modes '(nix-mode) + :priority 0 + :server-id 'nixd)) + ) + +(add-to-list 'safe-local-variable-values #'stringp) +(advice-add 'risky-local-variable-p :override #'ignore) + + +;; Email client seup +(use-package! mu4e + ;; pull in org helpers + ;;(require 'mu4e-org) + :config + (setq user-mail-address "alexander0derevianko@gmail.com" + user-full-name "Alexander Derevianko" + ;; I have my mbsyncrc in a different folder on my system, to keep it separate from the + ;; mbsyncrc available publicly in my dotfiles. You MUST edit the following line. + ;; Be sure that the following command is: "mbsync -c ~/.config/mu4e/mbsyncrc -a" + mu4e-get-mail-command "mbsync -c ~/.config/mu4e/mbsyncrc -a" + mu4e-update-interval 300 + ;; mu4e-compose-signature + ;; (concat + ;; "Derek Taylor\n" + ;; "http://www.youtube.com/DistroTube\n") + message-send-mail-function 'smtpmail-send-it + starttls-use-gnutls t + mu4e-root-maildir "~/Mail" + ;; Make sure plain text mails flow correctly for recipients + mu4e-compose-format-flowed t + ) + + (setq mu4e-contexts + (list + (make-mu4e-context + :name "Personal" + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/alex-derevianko" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "alexander0derevianko@gmail.com") + (user-full-name . "Alexander Derevianko") + (smtpmail-smtp-server . "smtp.gmail.com") + (smtpmail-smtp-service . 465) + (smtpmail-stream-type . ssl) + (mu4e-sent-folder . "/alex-derevianko/[Gmail]/Sent Mail") + (mu4e-drafts-folder . "/alex-derevianko/[Gmail]/Drafts") + (mu4e-trash-folder . "/alex-derevianko/[Gmail]/Trash") + (mu4e-refile-folder . "/alex-derevianko/[Gmail]/All Mail") + (mu4e-maildir-shortcuts . '(("/alex-derevianko/INBOX" . ?i) + ("/alex-derevianko/[Gmail]/Sent Mail" . ?s))) + ))) + ) +) +(use-package! org-mime + :ensure t + :config + (setq org-mime-export-options '(:section-numbers nil + :with-author nil + :with-toc nil)) + (add-hook! 'message-send-hook 'org-mime-confirm-when-no-multipart)) + +;; Music emms +(use-package! emms + :config + (require 'emms-setup) + (require 'emms-player-mpd) + (emms-all) + (setq emms-seek-seconds 5 + emms-player-list '(emms-player-mpd) + emms-info-functions '(emms-info-mpd))) + +(after! lsp-mode + ;; (lsp-register-client ; + ;; (make-lsp-client :new-connection (lsp-stdio-connection "nixd") + ;; :major-modes '(nix-mode) + ;; :priority 0 + ;; :server-id 'nixd)) +(use-package lsp-nix + :ensure lsp-mode + :after (lsp-mode) + :demand t + :custom + (lsp-nix-nil-formatter ["nixpkgs-fmt"])) + +(use-package nix-mode + :hook (nix-mode . lsp-deferred) + :ensure t) + ) diff --git a/machines/fujin/main/doom-configs/init.el b/machines/fujin/main/doom-configs/init.el new file mode 100644 index 0000000..a59574f --- /dev/null +++ b/machines/fujin/main/doom-configs/init.el @@ -0,0 +1,196 @@ + +;;; init.el -*- lexical-binding: t; -*- + +;; This file controls what Doom modules are enabled and what order they load +;; in. Remember to run 'doom sync' after modifying it! + +;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's +;; documentation. There you'll find a link to Doom's Module Index where all +;; of our modules are listed, including what flags they support. + +;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or +;; 'C-c c k' for non-vim users) to view its documentation. This works on +;; flags as well (those symbols that start with a plus). +;; +;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its +;; directory (for easy access to its source code). + +(doom! :input + ;;bidi ; (tfel ot) thgir etirw uoy gnipleh + ;;chinese + ;;japanese + ;;layout ; auie,ctsrnm is the superior home row + + :completion + company ; the ultimate code completion backend + ;;(corfu +orderless) ; complete with cap(f), cape and a flying feather! + ;;helm ; the *other* search engine for love and life + ;;ido ; the other *other* search engine... + ;;ivy ; a search engine for love and life + vertico ; the search engine of the future + + :ui + ;;deft ; notational velocity for Emacs + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + ;;doom-quit ; DOOM quit-message prompts when you quit Emacs + ;;(emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + hydra + ;;indent-guides ; highlighted indent columns + ;;ligatures ; ligatures and symbols to make your code pretty again + ;;minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + ;;nav-flash ; blink cursor line after big motions + ;;neotree ; a project drawer, like NERDTree for vim + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + ;;tabs ; a tab bar for Emacs + treemacs ; a project drawer, like neotree but cooler + ;;unicode ; extended unicode support for various languages + (vc-gutter +pretty) ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + ;;window-select ; visually switch windows + workspaces ; tab emulation, persistence & separate workspaces + ;;zen ; distraction-free coding or writing + + :editor + (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + ;;(format +onsave) ; automated prettiness + ;;god ; run Emacs commands without modifier keys + ;;lispy ; vim for lisp, for people who don't like vim + ;;multiple-cursors ; editing in many places at once + ;;objed ; text object editing for the innocent + ;;parinfer ; turn lisp into python, sort of + ;;rotate-text ; cycle region at point between text candidates + snippets ; my elves. They type so I don't have to + ;;word-wrap ; soft wrapping with language-aware indent + + :emacs + dired ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + ibuffer ; interactive buffer management + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + ;;eshell ; the elisp shell that works everywhere + ;;shell ; simple shell REPL for Emacs + ;;term ; basic terminal emulator for Emacs + vterm ; the best terminal emulation in Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + ;;(spell +flyspell) ; tasing you for misspelling mispelling + ;;grammar ; tasing grammar mistake every you make + + :tools + ;;ansible + ;;biblio ; Writes a PhD for you (citation needed) + ;;collab ; buffers with friends + debugger ; FIXME stepping through code, to help you add bugs + direnv + ;;docker + editorconfig ; let someone else argue about tabs vs spaces + ;;ein ; tame Jupyter notebooks with emacs + (eval +overlay) ; run code, run (also, repls) + lookup ; navigate your code and its documentation + lsp ; M-x vscode + (magit +forge) ; a git porcelain for Emacs + ;;make ; run make tasks from Emacs + ;;pass ; password manager for nerds + pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;rgb ; creating color strings + ;;taskrunner ; taskrunner for all your projects + ;;terraform ; infrastructure as code + ;;tmux ; an API for interacting with tmux + tree-sitter ; syntax and parsing, sitting in a tree... + ;;upload ; map local to remote projects via ssh/ftp + + :os + (:if (featurep :system 'macos) macos) ; improve compatibility with macOS + ;;tty ; improve the terminal Emacs experience + + :lang + ;;agda ; types of types of types of types... + ;;beancount ; mind the GAAP + ;;(cc +lsp) ; C > C++ == 1 + ;;clojure ; java with a lisp + common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans + data ; config/data formats + ;;(dart +flutter) ; paint ui and not much else + ;;dhall + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? + emacs-lisp ; drown in parentheses + ;;erlang ; an elegant language for a more civilized age + ;;ess ; emacs speaks statistics + ;;factor + ;;faust ; dsp, but you get to keep your soul + ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) + ;;fsharp ; ML stands for Microsoft's Language + ;;fstar ; (dependent) types and (monadic) effects and Z3 + ;;gdscript ; the language you waited for + ;;(go +lsp) ; the hipster dialect + ;;(graphql +lsp) ; Give queries a REST + ;;(haskell +lsp) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; a language you can depend on + json ; At least it ain't XML + (java +lsp) ; the poster child for carpal tunnel syndrome + (javascript +lsp +tree-sitter) ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) + ;;latex ; writing papers in Emacs has never been so fun + ;;lean ; for folks with too much to prove + ;;ledger ; be audit you can be + ;;lua ; one-based indices? one-based indices + markdown ; writing docs for people to ignore + ;;nim ; python + lisp at the speed of c + nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel + org ; organize your plain life in plain text + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;purescript ; javascript, but functional + (python +lsp) ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;raku ; the artist formerly known as perl6 + ;;rest ; Emacs as a REST client + ;;rst ; ReST in peace + (ruby +lsp) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + ;;(rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good + ;;(scheme +guile) ; a fully conniving family of lisps + sh ; she sells {ba,z,fi}sh shells on the C xor + ;;sml + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. + (web +lsp +tree-sitter) ; the tubes + yaml ; JSON, but readable + ;;zig ; C, but simpler + + :email + ;;(mu4e +org +gmail) + ;;notmuch + ;;(wanderlust +gmail) + + :app + calendar + emms + ;;everywhere ; *leave* Emacs!? You must be joking + ;;irc ; how neckbeards socialize + ;;(rss +org) ; emacs as an RSS reader + ;;twitter ; twitter client https://twitter.com/vnought + + :config + ;;literate + (default +bindings +smartparens)) diff --git a/machines/fujin/main/doom-configs/packages.el b/machines/fujin/main/doom-configs/packages.el new file mode 100644 index 0000000..b226163 --- /dev/null +++ b/machines/fujin/main/doom-configs/packages.el @@ -0,0 +1,52 @@ +;; -*- no-byte-compile: t; -*- +;;; $DOOMDIR/packages.el + +;; To install a package with Doom you must declare them here and run 'doom sync' +;; on the command line, then restart Emacs for the changes to take effect -- or +;; use 'M-x doom/reload'. + + +;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: +;(package! some-package) + +;; To install a package directly from a remote git repo, you must specify a +;; `:recipe'. You'll find documentation on what `:recipe' accepts here: +;; https://github.com/radian-software/straight.el#the-recipe-format +;(package! another-package +; :recipe (:host github :repo "username/repo")) + +;; If the package you are trying to install does not contain a PACKAGENAME.el +;; file, or is located in a subdirectory of the repo, you'll need to specify +;; `:files' in the `:recipe': +;(package! this-package +; :recipe (:host github :repo "username/repo" +; :files ("some-file.el" "src/lisp/*.el"))) + +;; If you'd like to disable a package included with Doom, you can do so here +;; with the `:disable' property: +;(package! builtin-package :disable t) + +;; You can override the recipe of a built in package without having to specify +;; all the properties for `:recipe'. These will inherit the rest of its recipe +;; from Doom or MELPA/ELPA/Emacsmirror: +;(package! builtin-package :recipe (:nonrecursive t)) +;(package! builtin-package-2 :recipe (:repo "myfork/package")) + +;; Specify a `:branch' to install a package from a particular branch or tag. +;; This is required for some packages whose default branch isn't 'master' (which +;; our package manager can't deal with; see radian-software/straight.el#279) +;(package! builtin-package :recipe (:branch "develop")) + +;; Use `:pin' to specify a particular commit to install. +;(package! builtin-package :pin "1a2b3c4d5e") + + +;; Doom's packages are pinned to a specific commit and updated from release to +;; release. The `unpin!' macro allows you to unpin single packages... +;(unpin! pinned-package) +;; ...or multiple packages +;(unpin! pinned-package another-pinned-package) +;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) +;(unpin! t) + +;;(package! mu4e :pin "b36e492") diff --git a/machines/fujin/main/home.nix b/machines/fujin/main/home.nix index 4efa87a..3936e21 100644 --- a/machines/fujin/main/home.nix +++ b/machines/fujin/main/home.nix @@ -16,6 +16,10 @@ sc = "source $HOME/.zshrc"; psax = "ps ax | grep"; cp = "rsync -ah --progress"; + nixos-build = "nixos-rebuild build --flake ~/susano-nixos/#${username}"; + nixos-test = "sudo nixos-rebuild test --flake ~/susano-nixos/#${username}"; + nixos-switch = "sudo nixos-rebuild switch --flake ~/susano-nixos/#${username}"; + nixos-boot = "sudo nixos-rebuild boot --flake ~/susano-nixos/#${username}"; }; }; diff --git a/modules/default.nix b/modules/default.nix index 866c0eb..3b462e9 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -11,5 +11,6 @@ ./auth ./development ./window-manager + ./display-manager ]; } diff --git a/hm-modules/window-manager/default.nix b/modules/display-manager/default.nix similarity index 82% rename from hm-modules/window-manager/default.nix rename to modules/display-manager/default.nix index 3149a99..e0a5529 100644 --- a/hm-modules/window-manager/default.nix +++ b/modules/display-manager/default.nix @@ -2,6 +2,6 @@ { imports = [ - ./hypr + ./ly ]; } diff --git a/modules/display-manager/ly/default.nix b/modules/display-manager/ly/default.nix new file mode 100644 index 0000000..4bc199b --- /dev/null +++ b/modules/display-manager/ly/default.nix @@ -0,0 +1,17 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.dov.display-manager.ly; +in { + + options.dov.display-manager.ly.enable = mkEnableOption "ly config"; + + config = mkIf cfg.enable { + services.displayManager.ly = { + enable = true; + }; + }; + +} diff --git a/modules/window-manager/hypr/default.nix b/modules/window-manager/hypr/default.nix index 1c0dba9..e04cc45 100644 --- a/modules/window-manager/hypr/default.nix +++ b/modules/window-manager/hypr/default.nix @@ -1,10 +1,11 @@ -{ inputs, config, lib, pkgs, ... }: +{ inputs, config, lib, pkgs, username, ... }: with lib; let colors = config.lib.stylix.colors; cfg = config.dov.window-manager.hypr; + hm-cfg = config.home-manager.users.${username}.dov; in { options.dov.window-manager.hypr.enable = mkEnableOption "hypr configuration"; config = mkIf cfg.enable { @@ -14,10 +15,7 @@ in { }; environment = { - systemPackages = with pkgs; [ - wlr-randr - wdisplays - ]; + systemPackages = with pkgs; [ wlr-randr wdisplays ]; sessionVariables = { WLR_NO_HARWARE_CURSORS = "1"; @@ -43,5 +41,241 @@ in { ]; }; }; + + home-manager.users.fujin.config = { + home.packages = with pkgs; [ + swww + mako + pipewire + wireplumber + libnotify + kitty + jq # used in lock to get language + wayland-protocols + + #hyprland extensions + hyprlock + hypridle + ]; + + wayland.windowManager.hyprland = { + enable = true; + xwayland.enable = true; + package = inputs.hyprland.packages.${pkgs.system}.hyprland; + plugins = [ + inputs.split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces + ]; + + settings = { + monitor = ",highres,auto,1"; + source = "~/.config/hypr/colors"; + + env = [ + "LIBVA_DRIVER_NAME,nvidia" + "XDG_SESSION_TYPE,wayland" + "WLR_NO_HARDWARE_CURSORS,1" + ]; + + #Autostart + exec = [ + # Fix slow startup + "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + "dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + ]; + + exec-once = [ + "mako" + "polkit-kde-agent" + "emacs --fg-daemon" + "hypridle" + "kanshi" + "virsh net-start default" + #"thunderbird" + #"element-desktop" + "keepassxc" + "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" + ] ++ lib.optionals hm-cfg.bar.waybar.enable [ "waybar" ]; + + "$mainMod" = "SUPER"; + + bind = [ + "$mainMod, G, fullscreen," + "$mainMod, t, togglegroup" + "$mainMod, v, togglefloating" + "$mainMod, s, togglesplit" + + #bind = $mainMod, RETURN, exec, kitty + "$mainMod, RETURN, exec, alacritty" + "$mainMod, o, exec, emacsclient -c" + "SUPER_SHIFT, RETURN, exec, thunar" + "SUPER_SHIFT, l, exec, hyprctl switchxkblayout at-translated-set-2-keyboard 0 && hyprlock" + + #bind = $mainMod, M, exit, + "SUPER_SHIFT, q, killactive," + + # Switch Keyboard Layouts + "$mainMod, SPACE, exec, hyprctl switchxkblayout teclado-gamer-husky-blizzard next" + + '', Print, exec, grim -g "$(slurp)" - | wl-copy'' + '' + SHIFT, Print, exec, IMG=~/Pictures/$(date +%Y-%m-%d_%H-%m-%s).png && grim -g "$(slurp)" $IMG'' + + # Functional keybinds + ",XF86AudioMicMute,exec,pamixer --default-source -t" + ",XF86MonBrightnessDown,exec,brightnessctl s 20-" + ",XF86MonBrightnessUp,exec,brightnessctl s 20+" + ",XF86AudioMute,exec,amixer -q sset Master toggle" + ",XF86AudioLowerVolume,exec,amixer -q sset Master 5%-" + ",XF86AudioRaiseVolume,exec,amixer -q sset Master 5%+" + ",XF86AudioPlay,exec,playerctl play-pause" + ",XF86AudioPause,exec,playerctl play-pause" + + # to switch between windows in a floating workspace + "SUPER,Tab,changegroupactive, f" + "SUPER_SHIFT,Tab,changegroupactive, b" + + # Move focus with mainMod + arrow keys + "$mainMod, h, movefocus, l" + "$mainMod, l, movefocus, r" + "$mainMod, k, movefocus, u" + "$mainMod, j, movefocus, d" + + # Switch workspaces with mainMod + [0-9] + "$mainMod, 1, split-workspace, 1" + "$mainMod, 2, split-workspace, 2" + "$mainMod, 3, split-workspace, 3" + "$mainMod, 4, split-workspace, 4" + "$mainMod, 5, split-workspace, 5" + "$mainMod, 6, split-workspace, 6" + "$mainMod, 7, split-workspace, 7" + "$mainMod, 8, split-workspace, 8" + "$mainMod, 9, split-workspace, 9" + "$mainMod, 0, split-workspace, 10" + + # Move active window to a workspace with mainMod + SHIFT + [0-9] + "$mainMod SHIFT, 1, split-movetoworkspace, 1" + "$mainMod SHIFT, 2, split-movetoworkspace, 2" + "$mainMod SHIFT, 3, split-movetoworkspace, 3" + "$mainMod SHIFT, 4, split-movetoworkspace, 4" + "$mainMod SHIFT, 5, split-movetoworkspace, 5" + "$mainMod SHIFT, 6, split-movetoworkspace, 6" + "$mainMod SHIFT, 7, split-movetoworkspace, 7" + "$mainMod SHIFT, 8, split-movetoworkspace, 8" + "$mainMod SHIFT, 9, split-movetoworkspace, 9" + "$mainMod SHIFT, 0, split-movetoworkspace, 10" + + # Scroll through existing workspaces with mainMod + scroll + "$mainMod, mouse_down, split-workspace, e+1" + "$mainMod, mouse_up, split-workspace, e-1" + "$mainMod,SPACE, exec, hyprctl switchxkblayout at-translated-set-2-keyboard next" + + ] ++ lib.optionals hm-cfg.launcher.wofi.enable + [ "$mainMod, p, exec, wofi --show drun" ]; + + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + "ALT, mouse:272, resizewindow" + ]; + + input = { + kb_layout = "us,ru,ua"; + kb_options = "grp:win_space_toggle"; + + follow_mouse = 1; + + touchpad = { natural_scroll = false; }; + + sensitivity = 0; + }; + + general = { + gaps_in = 5; + gaps_out = 20; + border_size = 2; + "col.active_border" = + lib.mkForce "rgba(33ccffee) rgba(00ff99ee) 45deg"; + "col.inactive_border" = lib.mkForce "rgba(595959aa)"; + + layout = "dwindle"; + }; + + decoration = { + rounding = 10; + + shadow = { + enabled = true; + range = 4; + render_power = 3; + }; + }; + + animations = { + enabled = "yes"; + + bezier = "ease,0.4,0.02,0.21,1"; + + animation = [ + "windows, 1, 3.5, ease, slide" + "windowsOut, 1, 3.5, ease, slide" + "border, 1, 6, default" + "fade, 1, 3, ease" + "workspaces, 1, 3.5, ease" + ]; + }; + + dwindle = { + pseudotile = "yes"; + preserve_split = "yes"; + }; + + master = { new_status = "master"; }; + + gestures = { workspace_swipe = false; }; + + workspace = [ + #"0, monitor:DP-1" + "8, monitor:e-DP-1" + "9, monitor:e-DP-1" + #"9, on-created-empty:[tiled] thunderbird" + ]; + + windowrulev2 = [ + "workspace 9, class:^(.*thunderbird.*)$" + "group, class:^(.*thunderbird.*)$" + "workspace 9, class:^(.*Element.*)$" + "group, class:^(.*Element.*)$" + "workspace 8, title:^(.*KeePassXC.*)$" + "float, class:^(.*steam.*)$" + "noinitialfocus,class:(jetbrains-)(.*),title:^win(.*), initialTitle:win.*, floating:1" + ]; + }; + }; + + home.file.".config/hypr/colors".text = '' + $background = ${colors.base00} + $foreground = ${colors.base05} + + $color0 = ${colors.base00} + $color1 = ${colors.base01} + $color2 = ${colors.base02} + $color3 = ${colors.base03} + $color4 = ${colors.base04} + $color5 = ${colors.base05} + $color6 = ${colors.base06} + $color7 = ${colors.base07} + $color8 = ${colors.base08} + $color9 = ${colors.base09} + $color10 = ${colors.base0A} + $color11 = ${colors.base0B} + $color12 = ${colors.base0C} + $color13 = ${colors.base0D} + $color14 = ${colors.base0E} + $color15 = ${colors.base0F} + ''; + + xdg.configFile."hypr/hyprlock.conf".source = ./hyprlock.conf; + xdg.configFile."hypr/hypridle.conf".source = ./hypridle.conf; + }; }; } diff --git a/hm-modules/window-manager/hypr/hypridle.conf b/modules/window-manager/hypr/hypridle.conf similarity index 100% rename from hm-modules/window-manager/hypr/hypridle.conf rename to modules/window-manager/hypr/hypridle.conf diff --git a/hm-modules/window-manager/hypr/hyprlock.conf b/modules/window-manager/hypr/hyprlock.conf similarity index 100% rename from hm-modules/window-manager/hypr/hyprlock.conf rename to modules/window-manager/hypr/hyprlock.conf