diff --git a/system-switch.sh b/system-switch.sh index 220e123..18688a9 100755 --- a/system-switch.sh +++ b/system-switch.sh @@ -2,4 +2,5 @@ HERE="$(dirname "$0")" -sudo nixos-rebuild switch -I nixos-config="$HERE/system/configuration.nix" +# sudo nixos-rebuild switch -I nixos-config="$HERE/system/configuration.nix" +sudo nixos-rebuild switch --flake .# \ No newline at end of file diff --git a/system/configuration.nix b/system/configuration.nix index da7e385..fca08ca 100644 --- a/system/configuration.nix +++ b/system/configuration.nix @@ -3,7 +3,46 @@ # and in the NixOS manual (accessible by running ‘nixos-help’). { config, pkgs, ... }: +let + # bash script to let dbus know about important env variables and + # propogate them to relevent services run at the end of sway config + # see + # https://github.com/emersion/xdg-desktop-portal-wlr/wiki/"It-doesn't-work"-Troubleshooting-Checklist + # note: this is pretty much the same as /etc/sway/config.d/nixos.conf but also restarts + # some user services to make sure they have the correct environment variables + 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 { imports = [ # Include the results of the hardware scan. @@ -35,7 +74,7 @@ services.xserver.enable = true; # Enable the GNOME Desktop Environment. - services.xserver.displayManager.gdm.enable = true; + # services.xserver.displayManager.gdm.enable = true; services.xserver.desktopManager.gnome.enable = true; # Configure keymap in X11 @@ -88,6 +127,26 @@ vscode micro fd + + kakoune + kak-lsp + + # recomended by nixwiki + alacritty # gpu accelerated terminal + sway + dbus-sway-environment + configure-gtk + wayland + glib # gsettings + dracula-theme # gtk theme + gnome3.adwaita-icon-theme # default gnome cursors + swaylock + swayidle + grim # screenshot functionality + slurp # screenshot functionality + wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout + bemenu # wayland clone of dmenu + mako # notification system developed by swaywm maintainer ]; # Some programs need SUID wrappers, can be configured further or are diff --git a/user/home.nix b/user/home.nix index 9f6e264..603dfb5 100644 --- a/user/home.nix +++ b/user/home.nix @@ -1,6 +1,14 @@ { config, pkgs, ... }: - -{ +let + key = { + left = "n"; + down = "e"; + up = "i"; + right = "o"; + tabL = "u"; + tabR = "Y"; + }; +in { # Home Manager needs a bit of information about you and the # paths it should manage. home.username = "lelgenio"; @@ -24,6 +32,7 @@ exa fd ripgrep + yt-dlp ffmpeg imagemagick mpv @@ -51,4 +60,146 @@ # }; # }; }; + + programs.command-not-found.enable = true; + + + # home.file = { + # ".config/sway/config".source = ./sway; + # }; + +programs.waybar = { + enable = true; + settings = [{ + layer = "top"; + modules-left = [ "sway/workspaces" ]; + modules-center = [ + "clock" + ]; + modules-right = []; + }]; +}; + + + wayland.windowManager.sway = { + enable = true; + config = { + bars = [{ command = "waybar"; }]; + input."type:touchpad" = { + # Disable While Typing + dwt = "disabled"; + natural_scroll = "enabled"; + tap = "enabled"; + }; + input."*" = { + xkb_layout = "us(colemak)"; + xkb_options = "lv3:lsgt_switch,grp:shifts_toggle"; + xkb_numlock = "enabled"; + repeat_rate = "30"; + repeat_delay = "200"; + }; + keybindings = + let + mod = "Mod4"; + menu = "bemenu-run"; + terminal = "alacritty"; + in + { + "${mod}+Prior" = "workspace prev_on_output"; + "${mod}+Next" = "workspace next_on_output"; + "${mod}+${key.tabL}" = "workspace prev_on_output"; + "${mod}+${key.tabR}" = "workspace next_on_output"; + + XF86AudioRaiseVolume = "exec pactl set-sink-volume @DEFAULT_SINK@ +10%"; + XF86AudioLowerVolume = "exec pactl set-sink-volume @DEFAULT_SINK@ -10%"; + XF86AudioMute = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle"; + XF86AudioMicMute = "exec pactl set-source-mute @DEFAULT_SOURCE@ toggle"; + # Control media + XF86AudioPlay = "exec playerctl play-pause"; + XF86AudioPause = "exec playerctl play-pause"; + XF86AudioNext = "exec playerctl next"; + XF86AudioPrev = "exec playerctl previous"; + + + "${mod}+Return" = "exec ${terminal}"; + "${mod}+Shift+q" = "kill"; + "${mod}+s" = "exec ${menu}"; + + "${mod}+${key.left}" = "focus left"; + "${mod}+${key.down}" = "focus down"; + "${mod}+${key.up}" = "focus up"; + "${mod}+${key.right}" = "focus right"; + + "${mod}+Left" = "focus left"; + "${mod}+Down" = "focus down"; + "${mod}+Up" = "focus up"; + "${mod}+Right" = "focus right"; + + "${mod}+Shift+${key.left}" = "move left"; + "${mod}+Shift+${key.down}" = "move down"; + "${mod}+Shift+${key.up}" = "move up"; + "${mod}+Shift+${key.right}" = "move right"; + + "${mod}+Shift+Left" = "move left"; + "${mod}+Shift+Down" = "move down"; + "${mod}+Shift+Up" = "move up"; + "${mod}+Shift+Right" = "move right"; + + "${mod}+b" = "splith"; + "${mod}+v" = "splitv"; + "${mod}+f" = "fullscreen toggle"; + "${mod}+a" = "focus parent"; + + # "${mod}+s" = "layout stacking"; + "${mod}+w" = "layout tabbed"; + # "${mod}+e" = "layout toggle split"; + + "${mod}+Shift+space" = "floating toggle"; + "${mod}+space" = "focus mode_toggle"; + + "${mod}+1" = "workspace number 1"; + "${mod}+2" = "workspace number 2"; + "${mod}+3" = "workspace number 3"; + "${mod}+4" = "workspace number 4"; + "${mod}+5" = "workspace number 5"; + "${mod}+6" = "workspace number 6"; + "${mod}+7" = "workspace number 7"; + "${mod}+8" = "workspace number 8"; + "${mod}+9" = "workspace number 9"; + + "${mod}+Shift+1" = + "move container to workspace number 1"; + "${mod}+Shift+2" = + "move container to workspace number 2"; + "${mod}+Shift+3" = + "move container to workspace number 3"; + "${mod}+Shift+4" = + "move container to workspace number 4"; + "${mod}+Shift+5" = + "move container to workspace number 5"; + "${mod}+Shift+6" = + "move container to workspace number 6"; + "${mod}+Shift+7" = + "move container to workspace number 7"; + "${mod}+Shift+8" = + "move container to workspace number 8"; + "${mod}+Shift+9" = + "move container to workspace number 9"; + + "${mod}+Shift+minus" = "move scratchpad"; + "${mod}+minus" = "scratchpad show"; + + "${mod}+Shift+c" = "reload"; + # "${mod}+Shift+e" = + # "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'"; + + "${mod}+r" = "mode resize"; + } + # // map (key: "$mod+${key} workspace prev_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] + # // map (key: "$mod+${key} workspace next_on_output") [ key.tabL "bracketleft" "Prior" "button9" "button4" ] + ; + terminal = pkgs.alacritty.executable; + + }; + }; } diff --git a/user/sway b/user/sway new file mode 100644 index 0000000..2556e49 --- /dev/null +++ b/user/sway @@ -0,0 +1,225 @@ +# Default config for sway +# +# Copy this to ~/.config/sway/config and edit it to your liking. +# +# Read `man 5 sway` for a complete reference. + +### Variables +# +# Logo key. Use Mod1 for Alt. +set $mod Mod4 +# Home row direction keys, like vim +set $left n +set $down e +set $up i +set $right o +# Your preferred terminal emulator +set $term alacritty +# Your preferred application launcher +# Note: pass the final command to swaymsg so that the resulting window can be opened +# on the original workspace that the command was run on. +set $menu bemenu-run + +### Output configuration +# +# Default wallpaper (more resolutions are available in @datadir@/backgrounds/sway/) +#output * bg @datadir@/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill +# +# Example configuration: +# +# output HDMI-A-1 resolution 1920x1080 position 1920,0 +# +# You can get the names of your outputs by running: swaymsg -t get_outputs + +### Idle configuration +# +# Example configuration: +# +# exec swayidle -w \ +# timeout 300 'swaylock -f -c 000000' \ +# timeout 600 'swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' \ +# before-sleep 'swaylock -f -c 000000' +# +# This will lock your screen after 300 seconds of inactivity, then turn off +# your displays after another 300 seconds, and turn your screens back on when +# resumed. It will also lock your screen before your computer goes to sleep. + +### Input configuration +# +# Example configuration: +# +# input "2:14:SynPS/2_Synaptics_TouchPad" { +# dwt enabled +# tap enabled +# natural_scroll enabled +# middle_emulation enabled +# } +# +# You can get the names of your inputs by running: swaymsg -t get_inputs +# Read `man 5 sway-input` for more information about this section. + +input * { + xkb_layout "us(colemak)" +} + + + +### Key bindings +# +# Basics: +# + # Start a terminal + bindsym $mod+Return exec $term + + # Kill focused window + bindsym $mod+Shift+q kill + + # Start your launcher + bindsym $mod+s exec $menu + + # Drag floating windows by holding down $mod and left mouse button. + # Resize them with right mouse button + $mod. + # Despite the name, also works for non-floating windows. + # Change normal to inverse to use left mouse button for resizing and right + # mouse button for dragging. + floating_modifier $mod normal + + # Reload the configuration file + bindsym $mod+Shift+c reload + + # Exit sway (logs you out of your Wayland session) + #bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -B 'Yes, exit sway' 'swaymsg exit' +# +# Moving around: +# + # Move your focus around + bindsym $mod+$left focus left + bindsym $mod+$down focus down + bindsym $mod+$up focus up + bindsym $mod+$right focus right + # Or use $mod+[up|down|left|right] + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + # Move the focused window with the same, but add Shift + bindsym $mod+Shift+$left move left + bindsym $mod+Shift+$down move down + bindsym $mod+Shift+$up move up + bindsym $mod+Shift+$right move right + # Ditto, with arrow keys + bindsym $mod+Shift+Left move left + bindsym $mod+Shift+Down move down + bindsym $mod+Shift+Up move up + bindsym $mod+Shift+Right move right +# +# Workspaces: +# + # Switch to workspace + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + # Move focused container to workspace + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + # Note: workspaces can have any name you want, not just numbers. + # We just use 1-10 as the default. +# +# Layout stuff: +# + # You can "split" the current object of your focus with + # $mod+b or $mod+v, for horizontal and vertical splits + # respectively. + bindsym $mod+b splith + bindsym $mod+v splitv + + # Switch the current container between different layout styles + #bindsym $mod+s layout stacking + # bindsym $mod+w layout tabbed + #bindsym $mod+e layout toggle split + + # Make the current focus fullscreen + bindsym $mod+f fullscreen + + # Toggle the current focus between tiling and floating mode + bindsym $mod+Shift+space floating toggle + + # Swap focus between the tiling area and the floating area + bindsym $mod+space focus mode_toggle + + # Move focus to the parent container + bindsym $mod+a focus parent +# +# Scratchpad: +# + # Sway has a "scratchpad", which is a bag of holding for windows. + # You can send windows there and get them back later. + + # Move the currently focused window to the scratchpad + bindsym $mod+Shift+minus move scratchpad + + # Show the next scratchpad window or hide the focused scratchpad window. + # If there are multiple scratchpad windows, this command cycles through them. + bindsym $mod+minus scratchpad show +# +# Resizing containers: +# +mode "resize" { + # left will shrink the containers width + # right will grow the containers width + # up will shrink the containers height + # down will grow the containers height + bindsym $left resize shrink width 10px + bindsym $down resize grow height 10px + bindsym $up resize shrink height 10px + bindsym $right resize grow width 10px + + # Ditto, with arrow keys + bindsym Left resize shrink width 10px + bindsym Down resize grow height 10px + bindsym Up resize shrink height 10px + bindsym Right resize grow width 10px + + # Return to default mode + bindsym Return mode "default" + bindsym Escape mode "default" +} +bindsym $mod+r mode "resize" + +# +# Status Bar: +# +# Read `man 5 sway-bar` for more information about this section. +bar { + position top + + # When the status_command prints a new line to stdout, swaybar updates. + # The default just shows the current date and time. + status_command while date +'%Y-%m-%d %I:%M:%S %p'; do sleep 1; done + + colors { + statusline #ffffff + background #323232 + inactive_workspace #32323200 #32323200 #5c5c5c + } +} + + +include @sysconfdir@/sway/config.d/* +