{ config, lib, pkgs, systemd, inputs, services, ... }: let # Via https://nixos.wiki/wiki/Sway dbus-sway-environment = pkgs.writeTextFile { name = "dbus-sway-environment"; destination = "/bin/dbus-sway-environment"; executable = true; text = '' dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr systemctl --user start pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr ''; }; # # currently, there is some friction between sway and gtk: # https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland # the suggested way to set gtk settings is with gsettings # for gsettings to work, we need to tell it where the schemas are # using the XDG_DATA_DIR environment variable # run at the end of sway config configure-gtk = pkgs.writeTextFile { name = "configure-gtk"; destination = "/bin/configure-gtk"; executable = true; text = let schema = pkgs.gsettings-desktop-schemas; datadir = "${schema}/share/gsettings-schemas/${schema.name}"; in '' export XDG_DATA_DIRS=${datadir}:$XDG_DATA_DIRS gnome_schema=org.gnome.desktop.interface gsettings set $gnome_schema gtk-theme 'Dracula' ''; }; in { programs.home-manager.enable = true; services.gpg-agent = { enable = true; defaultCacheTtl = 1800; enableSshSupport = true; enableExtraSocket = true; extraConfig = '' allow-emacs-pinentry keep-display extra-socket /run/user/1000/gnupg/S.gpg-agent.extra no-grab allow-preset-passphrase ''; }; home.username = "bascht"; home.homeDirectory = "/home/bascht"; home.sessionPath = [ "$HOME/.local/bin" "$HOME/bin" "$HOME/bin/go/bin" "$HOME/.cargo/bin" "$HOME/.emacs.d/bin" ]; home.sessionVariables = { LC_TIME = "en_GB.UTF-8"; IBUS_SOCK = "$XDG_RUNTIME_DIR/ibus.socket"; XDG_CURRENT_DESKTOP = "sway"; XDG_SESSION_TYPE = "wayland"; MOZ_ENABLE_WAYLAND = 1; MOZ_USE_XINPUT2 = 1; EDITOR = "vim"; XKB_DEFAULT_LAYOUT = "de"; XKB_DEFAULT_OPTIONS = "caps:escape"; QT_SCALE_FACTOR = 1; QT_AUTO_SCREEN_SCALE_FACTOR = 1; QT_WAYLAND_DISABLE_WINDOWDECORATION = 1; _JAVA_AWT_WM_NONREPARENTING = 1; GNOME_KEYRING_CONTROL = "/run/user/1000/keyring"; VAGRANT_DEFAULT_PROVIDER = "libvirt"; VAGRANT_DOTFILE_PATH = ".vagrant-\${HOSTNAME}"; QT_QPA_PLATFORMTHEME = "qt5ct"; SWAYSOCK = "/run/user/1000/sway-ipc.sock"; SDL_VIDEODRIVER = "wayland"; QT_QPA_PLATFORM = "wayland-egl"; #SSH_AUTH_SOCK="/run/user/1000/gnupg/S.gpg-agent.ssh"; LF_ICONS = "tw=:st=:ow=:dt=:di=:fi=:ln=:or=:ex=:*.c=:*.cc=:*.clj=:*.coffee=:*.cpp=:*.css=:*.go=:*.h=:*.hh=:*.hpp=:*.html=:*.js=:*.json=:*.md=:*.php=:*.py=:*.rb=:*.rs=:*.ts=:*.vim=:*.cmd=:*.ps1=:*.sh=:*.bash=:*.zsh=:*.fish=:*.tar=:*.tgz=:*.arc=:*.arj=:*.taz=:*.lha=:*.lz4=:*.lzh=:*.lzma=:*.tlz=:*.txz=:*.tzo=:*.t7z=:*.zip=:*.z=:*.dz=:*.gz=:*.lrz=:*.lz=:*.lzo=:*.xz=:*.zst=:*.tzst=:*.bz2=:*.bz=:*.tbz=:*.tbz2=:*.tz=:*.deb=:*.rpm=:*.jar=:*.war=:*.ear=:*.sar=:*.rar=:*.alz=:*.ace=:*.zoo=:*.cpio=:*.7z=:*.rz=:*.cab=:*.wim=:*.swm=:*.dwm=:*.esd=:*.jpg=:*.jpeg=:*.mjpg=:*.mjpeg=:*.gif=:*.bmp=:*.pbm=:*.pgm=:*.ppm=:*.tga=:*.xbm=:*.xpm=:*.tif=:*.tiff=:*.png=:*.svg=:*.svgz=:*.mng=:*.pcx=:*.mov=:*.mpg=:*.mpeg=:*.m2v=:*.mkv=:*.webm=:*.ogm=:*.mp4=:*.m4v=:*.mp4v=:*.vob=:*.qt=:*.nuv=:*.wmv=:*.asf=:*.rm=:*.rmvb=:*.flc=:*.avi=:*.fli=:*.flv=:*.gl=:*.dl=:*.xcf=:*.xwd=:*.yuv=:*.cgm=:*.emf=:*.ogv=:*.ogx=:*.aac=:*.au=:*.flac=:*.m4a=:*.mid=:*.midi=:*.mka=:*.mp3=:*.mpc=:*.ogg=:*.ra=:*.wav=:*.oga=:*.opus=:*.spx=:*.xspf=:*.pdf=:*.nix=:"; FZF_DEFAULT_OPTS = " --prompt=' ' --border --height='40%' --layout=reverse --color=bg+:#f0f0f1,bg:#fafafa,spinner:#0184bc,hl:#4078f2 --color=fg:#696c77,header:#4078f2,info:#c18401,pointer:#0184bc --color=marker:#0184bc,fg+:#202227,prompt:#c18401,hl+:#4078f2"; }; home.packages = [ dbus-sway-environment configure-gtk (pkgs.aspellWithDicts (dicts: with dicts; [ de en en-computers en-science ])) pkgs.adementary-theme pkgs.adwaita-qt pkgs.age pkgs.ansi2html pkgs.any-nix-shell pkgs.appimage-run pkgs.awscli2 pkgs.nodePackages.bash-language-server pkgs.terraform-ls pkgs.terraform-lsp pkgs.clojure-lsp pkgs.marksman pkgs.nixd pkgs.bat pkgs.bfs pkgs.binutils pkgs.borgbackup pkgs.borgmatic pkgs.brightnessctl pkgs.btop pkgs.calcurse pkgs.capitaine-cursors pkgs.chezmoi pkgs.chromium pkgs.clipman pkgs.cloc pkgs.cmake pkgs.delta pkgs.dict pkgs.dive pkgs.dmenu pkgs.dnsutils pkgs.docker-compose pkgs.dockfmt pkgs.cljfmt pkgs.clj-kondo pkgs.editorconfig-core-c pkgs.enchant pkgs.entr pkgs.envsubst pkgs.eza pkgs.fd pkgs.feh pkgs.ffmpeg-full pkgs.ffmpegthumbnailer pkgs.firefox-wayland pkgs.font-awesome pkgs.foot pkgs.freecad pkgs.fzf pkgs.gcc pkgs.ghostscript pkgs.gimp pkgs.gitAndTools.lab pkgs.gitAndTools.tig pkgs.glab pkgs.glib pkgs.gnome-icon-theme pkgs.gnome-themes-extra pkgs.gnome3.adwaita-icon-theme pkgs.gnome3.file-roller pkgs.gnome3.gnome-keyring pkgs.gnome3.libgnome-keyring pkgs.gnome3.seahorse pkgs.gnome3.zenity pkgs.gnumake pkgs.gnupg pkgs.gnupg-pkcs11-scd pkgs.gnuplot pkgs.go pkgs.godef pkgs.gomodifytags pkgs.gopass pkgs.gopls pkgs.gore pkgs.gotests pkgs.graphviz pkgs.grim pkgs.grpcurl pkgs.gsettings-desktop-schemas pkgs.gst_all_1.gst-plugins-bad pkgs.gst_all_1.gst-plugins-good pkgs.gst_all_1.gst-plugins-ugly pkgs.gst_all_1.gst-vaapi pkgs.gthumb pkgs.gtk-engine-murrine pkgs.gtk_engines pkgs.hicolor-icon-theme pkgs.hledger pkgs.hledger-web pkgs.httpie pkgs.hunspell pkgs.hunspellDicts.de_DE pkgs.hunspellDicts.en_GB-large pkgs.hunspellDicts.en_US pkgs.i3status-rust pkgs.imagemagick pkgs.imv pkgs.inotify-tools pkgs.ispell pkgs.isync pkgs.j4-dmenu-desktop pkgs.jless pkgs.jq pkgs.k9s pkgs.kanshi pkgs.khal pkgs.kind pkgs.ledger pkgs.libnotify pkgs.liboping pkgs.libqalculate pkgs.libreoffice pkgs.libtool pkgs.libvterm pkgs.lsof pkgs.lxappearance pkgs.mako pkgs.material-design-icons pkgs.mediainfo pkgs.mesa pkgs.mesa_drivers pkgs.mpc_cli pkgs.mpv pkgs.msmtp pkgs.mtr pkgs.mu pkgs.multimarkdown pkgs.ncmpcpp pkgs.ncspot pkgs.nextcloud-client pkgs.nixfmt pkgs.ntfy-sh pkgs.obs-studio pkgs.obsidian pkgs.pandoc pkgs.patchelf pkgs.pavucontrol pkgs.pcmanfm pkgs.pinentry-gtk2 pkgs.playerctl pkgs.pngquant pkgs.poppler pkgs.pwgen pkgs.python311Packages.pip pkgs.python311Packages.setuptools pkgs.python38Packages.pdftotext pkgs.python3Minimal pkgs.qalculate-gtk pkgs.qrencode pkgs.qutebrowser pkgs.ripgrep pkgs.rocm-opencl-icd pkgs.rocm-opencl-runtime pkgs.rpm pkgs.ruby pkgs.rubyPackages.net-scp pkgs.rubyPackages.net-ssh pkgs.rubyPackages.pry pkgs.scrot pkgs.shfmt pkgs.bitwarden pkgs.bitwarden-cli pkgs.rofi-rbw-wayland pkgs.signal-desktop pkgs.slurp pkgs.socat pkgs.somafm-cli pkgs.spotify-player pkgs.sqlite pkgs.starship pkgs.super-slicer-latest pkgs.swappy pkgs.sway pkgs.swayidle pkgs.swaylock pkgs.tdns-cli pkgs.tmux pkgs.tmux-cssh pkgs.tmuxinator pkgs.todoman pkgs.toilet pkgs.tree pkgs.unzip pkgs.upower pkgs.vale pkgs.vdirsyncer pkgs.viu pkgs.vulkan-loader pkgs.vulkan-validation-layers pkgs.w3m pkgs.wally-cli pkgs.wayvnc pkgs.weather-icons pkgs.wf-recorder pkgs.wl-clipboard pkgs.wlroots pkgs.wofi pkgs.wol pkgs.wordnet pkgs.wpa_supplicant_gui pkgs.wtype pkgs.xdragon pkgs.xplr pkgs.xwayland pkgs.yaml-language-server pkgs.ydotool pkgs.yq-go pkgs.yt-dlp pkgs.yubikey-manager pkgs.yubikey-personalization pkgs.zathura ]; home.pointerCursor = { gtk.enable = true; package = pkgs.capitaine-cursors; name = "capitaine-cursors"; size = 22; }; programs.starship.enable = true; programs.starship.enableBashIntegration = true; programs.direnv.enable = true; programs.direnv.nix-direnv.enable = true; programs.atuin = { enable = true; package = pkgs.atuin; enableBashIntegration = true; flags = [ "--disable-up-arrow" ]; settings = { style = "compact"; word_jump_mode = "emacs"; search_mode = "fuzzy"; inline_height = 30; }; }; programs.bash = { enable = true; enableCompletion = true; historyFileSize = 80000; historyControl = [ "ignoredups" "ignorespace" ]; sessionVariables = { HISTTIMEFORMAT = "%Y-%m-%d-%H%M%S "; }; profileExtra = '' if [[ $(/run/current-system/sw/bin/tty) == "/dev/tty1" ]]; then exec sway-run fi; ''; initExtra = '' for f in ~/.config/bash/*.sh; do source $f; done ''; }; programs.readline = { enable = true; extraConfig = '' set completion-ignore-case On set colored-stats On set mark-symlinked-directories On set colored-completion-prefix On set menu-complete-display-prefix On ''; }; programs.fzf = { enable = true; enableBashIntegration = true; }; programs.fish.package = pkgs.fish; programs.fish.enable = true; programs.fish.loginShellInit = '' if [ (/run/current-system/sw/bin/tty) = "/dev/tty1" ] exec sway-run end ''; programs.fish.shellInit = '' set -U fish_greeting fzf_configure_bindings starship init fish | source any-nix-shell fish --info-right | source ''; programs.fish.plugins = [ { name = "fzf.fish"; src = pkgs.fetchFromGitHub { owner = "PatrickF1"; repo = "fzf.fish"; rev = "17fcc74029bbd88445712752a5a71bc64aa3994c"; sha256 = "12fyg3ycj3fqqms9b5ncnyyjs0gl54yc5qcbp5yp4p5fy5vwy6jr"; }; } { name = "autopair.fish"; src = pkgs.fetchFromGitHub { owner = "jorgebucaran"; repo = "autopair.fish"; rev = "1222311994a0730e53d8e922a759eeda815fcb62"; sha256 = "0lxfy17r087q1lhaz5rivnklb74ky448llniagkz8fy393d8k9cp"; }; } ]; programs.broot = { enable = true; enableBashIntegration = true; settings = { verbs = [ { key = "ctrl-j"; execution = ":line_down"; } { key = "ctrl-k"; execution = ":line_up"; } { key = "ctrl-l"; execution = ":panel_right"; } { key = "ctrl-h"; execution = ":back"; } { key = "ctrl-d"; execution = ":page_down"; } { key = "ctrl-u"; execution = ":page_up"; } { invocation = "drop"; external = "drop {file}"; apply_to = "file"; leave_broot = false; switch_terminal = false; } { invocation = "drag"; external = "drag {file}"; apply_to = "file"; leave_broot = false; switch_terminal = false; } ]; skin = { default = "gray(1) None"; tree = "gray(7) None / gray(18) None"; file = "gray(3) None / gray(8) None"; directory = "ansi(25) None Bold / ansi(25) None"; exe = "ansi(130) None"; link = "Magenta None"; pruning = "gray(12) None Italic"; perm__ = "gray(5) None"; perm_r = "ansi(94) None"; perm_w = "ansi(132) None"; perm_x = "ansi(65) None"; owner = "ansi(138) None"; group = "ansi(131) None"; dates = "ansi(66) None"; sparse = "ansi(214) None"; git_branch = "ansi(229) None"; git_insertions = "ansi(28) None"; git_deletions = "ansi(160) None"; git_status_current = "gray(5) None"; git_status_modified = "ansi(28) None"; git_status_new = "ansi(94) None Bold"; git_status_ignored = "gray(17) None"; git_status_conflicted = "ansi(88) None"; git_status_other = "ansi(88) None"; selected_line = "None gray(19) / None gray(21)"; char_match = "ansi(22) None"; file_error = "Red None"; flag_label = "gray(9) None"; flag_value = "ansi(166) None Bold"; input = "gray(1) None / gray(4) gray(20)"; status_error = "gray(22) ansi(124)"; status_normal = "gray(2) gray(20)"; status_job = "ansi(220) gray(5)"; status_italic = "ansi(166) gray(20)"; status_bold = "ansi(166) gray(20)"; status_code = "ansi(17) gray(20)"; status_ellipsis = "gray(19) gray(15)"; purpose_normal = "gray(20) gray(2)"; purpose_italic = "ansi(178) gray(2)"; purpose_bold = "ansi(178) gray(2) Bold"; purpose_ellipsis = "gray(20) gray(2)"; scrollbar_track = "gray(20) none"; scrollbar_thumb = "ansi(238) none"; help_paragraph = "gray(2) none"; help_bold = "ansi(202) none bold"; help_italic = "ansi(202) none italic"; help_code = "gray(5) gray(22)"; help_headers = "ansi(202) none"; help_table_border = "ansi(239) None"; preview_title = "gray(3) None / gray(5) None"; preview = "gray(5) gray(23) / gray(7) gray(23)"; preview_line_number = "gray(6) gray(20)"; preview_match = "None ansi(29) Underlined"; hex_null = "gray(15) None"; hex_ascii_graphic = "gray(2) None"; hex_ascii_whitespace = "ansi(143) None"; hex_ascii_other = "ansi(215) None"; hex_non_ascii = "ansi(167) None"; staging_area_title = "gray(8) None / gray(13) None"; mode_command_mark = "gray(15) ansi(204) Bold "; }; }; }; programs.zoxide = { enable = true; enableFishIntegration = true; }; #nixpkgs.config.allowUnfree = true; #nixpkgs.config.chromium.commandLineArgs = "--enable-features=UseOzonePlatform --ozone-platform=wayland"; programs.vscode = { enable = true; package = pkgs.vscode; extensions = with pkgs.vscode-extensions; [ vscodevim.vim redhat.vscode-yaml #bbenoist.Nix ]; userSettings = { "workbench.colorTheme" = "Visual Studio Light"; "terminal.integrated.fontFamily" = "JetBrains Mono"; "editor.fontFamily" = "JetBrains Mono"; "editor.renderControlCharacters" = true; "yaml.format.printWidth" = 250; "spellright.language" = [ "de_DE" "en_GB" "en_US" ]; }; }; systemd.user.targets.sway-session = { Unit = { Description = "Sway graphical session target"; BindsTo = "graphical-session.target"; Wants = "graphical-session-pre.target"; After = "graphical-session-pre.target"; }; }; systemd.user.services.comacs = { Unit = { Description = "Emacs Coding daemon"; X-RestartIfChanged = "false"; }; Service = { ExecStart = "${pkgs.bash}/bin/bash -l -c '${config.services.emacs.package}/bin/emacs --profile comacs --fg-daemon=comacs'"; Restart = "on-failure"; SuccessExitStatus = 15; Type = "notify"; Environment = "EMACS_SERVER_NAME=comacs"; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.services.workmacs = { Unit = { Description = "Emacs Worklog daemon"; X-RestartIfChanged = "false"; }; Service = { ExecStart = "${pkgs.bash}/bin/bash -l -c '${config.services.emacs.package}/bin/emacs --profile workmacs --name Worklog --fg-daemon=workmacs'"; Restart = "on-failure"; SuccessExitStatus = 15; Type = "notify"; Environment = "EMACS_SERVER_NAME=workmacs"; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.services.mako = { Unit = { Description = "Mako notifications"; After = "graphical-session-pre.target"; PartOf = "graphical-session.target"; }; Service = { ExecStart = "${pkgs.mako}/bin/mako"; Restart = "on-failure"; RestartSec = 5; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.services.clipboard-manager = { Unit = { Description = "Clipboard manager"; After = "graphical-session-pre.target"; PartOf = "graphical-session.target"; }; Service = { ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste -t text --watch clipman store --no-persist --max-items=1000 --histpath=~/.local/share/clipman-primary.json"; Restart = "on-failure"; RestartSec = 5; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.sockets.dbus = { Unit = { Description = "D-Bus User Message Bus Socket"; }; Socket = { ListenStream = "%t/bus"; ExecStartPost = "${pkgs.systemd}/bin/systemctl --user set-environment DBUS_SESSION_BUS_ADDRESS=unix:path=%t/bus"; }; Install = { WantedBy = [ "sockets.target" ]; Also = [ "dbus.service" ]; }; }; systemd.user.services.dbus = { Unit = { Description = "D-Bus User Message Bus"; Requires = [ "dbus.socket" ]; }; Service = { ExecStart = "${pkgs.dbus}/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation"; ExecReload = "${pkgs.dbus}/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig"; }; Install = { Also = [ "dbus.socket" ]; }; }; systemd.user.services.swayidle = { Unit = { Description = "Idle Manager for Wayland"; After = "graphical-session-pre.target"; PartOf = "graphical-session.target"; }; Service = { ExecStart = '' ${pkgs.swayidle}/bin/swayidle -w -d \ before-sleep '${config.home.homeDirectory}/bin/blur-lock' \ unlock '${config.home.homeDirectory}/bin/thinkpad-dock' \ after-resume '${config.home.homeDirectory}/bin/thinkpad-dock' \ timeout 300 '${config.home.homeDirectory}/bin/blur-lock' \ timeout 600 '${pkgs.sway}/bin/swaymsg "output * dpms off"' resume '${pkgs.sway}/bin/swaymsg "output * dpms on" && /home/bascht/bin/thinkpad-dock' \ timeout 900 '${config.home.homeDirectory}/bin/suspend-if-docked' resume '${pkgs.sway}/bin/swaymsg "output * dpms on" && /home/bascht/bin/thinkpad-dock' ''; Restart = "on-failure"; RestartSec = 5; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; systemd.user.services.alfaview-sway-event-bus = { Unit = { Description = "alfaview sway event bus"; X-RestartIfChanged = "false"; }; Service = { ExecStart = "/home/bascht/bin/alfaview-sway-event-bus"; Restart = "on-failure"; RestartSec = 5; }; Install = { WantedBy = [ "graphical-session.target" ]; }; }; services.wlsunset = { enable = true; latitude = "48.15"; longitude = "11.64"; temperature = { day = 6500; night = 3000; }; }; services.mopidy = { enable = true; extensionPackages = with pkgs; [ mopidy-iris mopidy-local mopidy-mpd mopidy-somafm mopidy-tunein mopidy-youtube mopidy-mpris mopidy-bandcamp mopidy-jellyfin yt-dlp ]; settings = { file = { media_dirs = [ "~/Musik" ]; }; youtube = { youtube_dl_package = "yt_dlp"; }; }; }; services.syncthing = { enable = true; }; services.mbsync.enable = true; services.mbsync.verbose = false; services.gnome-keyring.enable = true; services.nextcloud-client.enable = true; services.emacs.enable = true; programs.emacs = { enable = true; package = pkgs.emacs29-pgtk; extraPackages = epkgs: [ epkgs.apropospriate-theme epkgs.zoxide epkgs.vterm epkgs.pdf-tools epkgs.vscode-icon epkgs.mingus epkgs.benchmark-init epkgs.mu4e epkgs.hass epkgs.spacious-padding epkgs.org-pdftools epkgs.org-super-agenda epkgs.org-mru-clock epkgs.org-journal epkgs.org-alert epkgs.org-caldav epkgs.csv-mode epkgs.ef-themes epkgs.literate-calc-mode epkgs.dwim-shell-command epkgs.obsidian epkgs.nerd-icons-dired epkgs.dirvish epkgs.zoxide epkgs.dictcc epkgs.toml-mode ]; }; programs.neovim = { enable = true; viAlias = true; vimAlias = true; extraConfig = '' set number ''; plugins = with pkgs.vimPlugins; [ vim-which-key vim-nix vim-fish vim-surround vim-plug nvim-ale-diagnostic ale neorg vim-go deoplete-nvim deoplete-go #cmp-nvim-lsp nvim-lspconfig ]; }; # This value determines the Home Manager release that your # configuration is compatible with. This helps avoid breakage # when a new Home Manager release introduces backwards # incompatible changes. # # You can update Home Manager without changing this value. See # the Home Manager release notes for a list of state version # changes in each release. home.stateVersion = "22.11"; }