Format the entire project.

This commit is contained in:
Kevin Baensch 2023-09-11 20:23:04 +02:00
parent 1dc50ae17d
commit 6f9db5e3a4
Signed by: derped
GPG key ID: C0F1D326C7626543
115 changed files with 3451 additions and 2901 deletions

View file

@ -1,10 +1,12 @@
{ config, lib, pkgs, ... }:
with lib;
{ {
config,
lib,
pkgs,
...
}:
with lib; {
environment.etc = mkIf (elem "etcfiles" config.machine.conffiles) { environment.etc = mkIf (elem "etcfiles" config.machine.conffiles) {
"rofi.rasi".source = (import ./etc/rofi.rasi.nix { inherit pkgs; }); "rofi.rasi".source = import ./etc/rofi.rasi.nix {inherit pkgs;};
"i3/py3status".source = ./etc/i3/py3status; "i3/py3status".source = ./etc/i3/py3status;
"sway/config".source = mkDefault ./etc/sway/config; "sway/config".source = mkDefault ./etc/sway/config;
"mpv/input.conf".source = ./etc/mpv/input.conf; "mpv/input.conf".source = ./etc/mpv/input.conf;

View file

@ -1,286 +1,284 @@
{ pkgs, ... }: {pkgs, ...}: (pkgs.writeText "config" ''
# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
(pkgs.writeText "config" '' exec redshift-gtk -l 51.0504:13.7373
# i3 config file (v4)
#
# Please see http://i3wm.org/docs/userguide.html for a complete reference!
exec redshift-gtk -l 51.0504:13.7373 ### START USER CONFIG ###
set $mod Mod4
workspace "HDMI" output HDMI1
workspace_auto_back_and_forth yes
new_window pixel
hide_edge_borders both
### START USER CONFIG ### exec setxkbmap de
set $mod Mod4
workspace "HDMI" output HDMI1
workspace_auto_back_and_forth yes
new_window pixel
hide_edge_borders both
exec setxkbmap de #exec compton -f
exec ${pkgs.feh}/bin/feh --bg-scale $(xdg-user-dir PICTURES)/wallpaper.jpg
#exec pulseaudio -D
exec fcitx5
#exec env=LC_CTYPE=zh_CN.UTF-8 emacs --daemon
#exec conky -c $HOME/.my_little_conky/.conkyrc
#exec xsnow -nosanta -norudolf -notrees
#exec $LOCK
#exec compton -f ### END USER CONFIG ###
exec ${pkgs.feh}/bin/feh --bg-scale $(xdg-user-dir PICTURES)/wallpaper.jpg
#exec pulseaudio -D
exec fcitx5
#exec env=LC_CTYPE=zh_CN.UTF-8 emacs --daemon
#exec conky -c $HOME/.my_little_conky/.conkyrc
#exec xsnow -nosanta -norudolf -notrees
#exec $LOCK
### END USER CONFIG ### ### START USER PROGRAMMS ###
### START USER PROGRAMMS ### ### END USER PROGRAMMS ###
### END USER PROGRAMMS ### ### START MEDIA BINDSYM ###
### START MEDIA BINDSYM ### bindsym XF86AudioPlay exec ${pkgs.playerctl}/bin/playerctl play
bindsym XF86AudioPause exec ${pkgs.playerctl}/bin/playerctl pause
bindsym XF86AudioNext exec ${pkgs.playerctl}/bin/playerctl next
bindsym XF86AudioPrev exec ${pkgs.playerctl}/bin/playerctl previous
bindsym XF86AudioPlay exec ${pkgs.playerctl}/bin/playerctl play bindsym $mod+Mod1+space exec ${pkgs.playerctl}/bin/playerctl play-pause
bindsym XF86AudioPause exec ${pkgs.playerctl}/bin/playerctl pause bindsym $mod+Mod1+Left exec ${pkgs.playerctl}/bin/playerctl position 10-
bindsym XF86AudioNext exec ${pkgs.playerctl}/bin/playerctl next bindsym $mod+Mod1+Right exec ${pkgs.playerctl}/bin/playerctl position 10+
bindsym XF86AudioPrev exec ${pkgs.playerctl}/bin/playerctl previous bindsym $mod+Mod1+Down exec ${pkgs.playerctl}/bin/playerctl next
bindsym $mod+Mod1+Up exec ${pkgs.playerctl}/bin/playerctl previous
bindsym $mod+Mod1+space exec ${pkgs.playerctl}/bin/playerctl play-pause bindsym $mod+Shift+w sticky toggle
bindsym $mod+Mod1+Left exec ${pkgs.playerctl}/bin/playerctl position 10- bindsym $mod+Shift+B floating enable; border none; resize set 900 600; move position 1020 19
bindsym $mod+Mod1+Right exec ${pkgs.playerctl}/bin/playerctl position 10+
bindsym $mod+Mod1+Down exec ${pkgs.playerctl}/bin/playerctl next
bindsym $mod+Mod1+Up exec ${pkgs.playerctl}/bin/playerctl previous
bindsym $mod+Shift+w sticky toggle ### END MEDIA BINDSYM ###
bindsym $mod+Shift+B floating enable; border none; resize set 900 600; move position 1020 19
### END MEDIA BINDSYM ###
### START BINDSYM ### ### START BINDSYM ###
bindsym $mod+b border toggle bindsym $mod+b border toggle
bindsym $mod+m bar mode toggle bindsym $mod+m bar mode toggle
bindsym $mod+y move container to output left bindsym $mod+y move container to output left
bindsym $mod+x move container to output right bindsym $mod+x move container to output right
bindsym $mod+Shift+y move workspace to output left bindsym $mod+Shift+y move workspace to output left
bindsym $mod+Shift+x move workspace to output right bindsym $mod+Shift+x move workspace to output right
bindsym $mod+l exec ${pkgs.i3lock}/bin/i3lock -efc 000000 bindsym $mod+l exec ${pkgs.i3lock}/bin/i3lock -efc 000000
bindsym $mod+minus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%- bindsym $mod+minus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%-
bindsym $mod+plus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%+ bindsym $mod+plus exec ${pkgs.alsa-utils}/bin/amixer -c 0 sset Master 1%+
bindsym $mod+Mod1+minus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%- bindsym $mod+Mod1+minus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%-
bindsym $mod+Mod1+plus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%+ bindsym $mod+Mod1+plus exec ${pkgs.alsa-utils}/bin/amixer -D pulse sset Master 1%+
bindsym $mod+Shift+minus exec ${pkgs.acpilight}/bin/xbacklight -5 bindsym $mod+Shift+minus exec ${pkgs.acpilight}/bin/xbacklight -5
bindsym $mod+Shift+plus exec ${pkgs.acpilight}/bin/xbacklight +5 bindsym $mod+Shift+plus exec ${pkgs.acpilight}/bin/xbacklight +5
bindsym $mod+Ctrl+0 exec ${pkgs.acpilight}/bin/xbacklight -set 0 bindsym $mod+Ctrl+0 exec ${pkgs.acpilight}/bin/xbacklight -set 0
bindsym $mod+Ctrl+1 exec ${pkgs.acpilight}/bin/xbacklight -set 10 bindsym $mod+Ctrl+1 exec ${pkgs.acpilight}/bin/xbacklight -set 10
bindsym $mod+Ctrl+2 exec ${pkgs.acpilight}/bin/xbacklight -set 20 bindsym $mod+Ctrl+2 exec ${pkgs.acpilight}/bin/xbacklight -set 20
bindsym $mod+Ctrl+3 exec ${pkgs.acpilight}/bin/xbacklight -set 30 bindsym $mod+Ctrl+3 exec ${pkgs.acpilight}/bin/xbacklight -set 30
bindsym $mod+Ctrl+4 exec ${pkgs.acpilight}/bin/xbacklight -set 40 bindsym $mod+Ctrl+4 exec ${pkgs.acpilight}/bin/xbacklight -set 40
bindsym $mod+Ctrl+5 exec ${pkgs.acpilight}/bin/xbacklight -set 50 bindsym $mod+Ctrl+5 exec ${pkgs.acpilight}/bin/xbacklight -set 50
bindsym $mod+Ctrl+6 exec ${pkgs.acpilight}/bin/xbacklight -set 60 bindsym $mod+Ctrl+6 exec ${pkgs.acpilight}/bin/xbacklight -set 60
bindsym $mod+Ctrl+7 exec ${pkgs.acpilight}/bin/xbacklight -set 70 bindsym $mod+Ctrl+7 exec ${pkgs.acpilight}/bin/xbacklight -set 70
bindsym $mod+Ctrl+8 exec ${pkgs.acpilight}/bin/xbacklight -set 80 bindsym $mod+Ctrl+8 exec ${pkgs.acpilight}/bin/xbacklight -set 80
bindsym $mod+Ctrl+9 exec ${pkgs.acpilight}/bin/xbacklight -set 90 bindsym $mod+Ctrl+9 exec ${pkgs.acpilight}/bin/xbacklight -set 90
bindsym $mod+p move scratchpad bindsym $mod+p move scratchpad
bindsym $mod+Shift+p scratchpad show bindsym $mod+Shift+p scratchpad show
bindsym --release $mod+Ctrl+s exec scrot bindsym --release $mod+Ctrl+s exec scrot
bindsym --release $mod+Ctrl+d exec "scrot --select" bindsym --release $mod+Ctrl+d exec "scrot --select"
bindsym --release $mod+Ctrl+a exec "scrot -s '/tmp/%F_%T_$wx$h.png' -e 'xclip -selection clipboard -target image/png -i $f && rm $f'" bindsym --release $mod+Ctrl+a exec "scrot -s '/tmp/%F_%T_$wx$h.png' -e 'xclip -selection clipboard -target image/png -i $f && rm $f'"
bindsym $mod+o exec pcmanfm bindsym $mod+o exec pcmanfm
bindsym $mod+Mod1+1 exec luxa fade --speed 50 '00ff00' bindsym $mod+Mod1+1 exec luxa fade --speed 50 '00ff00'
bindsym $mod+Mod1+2 exec luxa fade --speed 50 'ffff00' bindsym $mod+Mod1+2 exec luxa fade --speed 50 'ffff00'
bindsym $mod+Mod1+3 exec luxa fade --speed 50 'ff0000' bindsym $mod+Mod1+3 exec luxa fade --speed 50 'ff0000'
bindsym $mod+Mod1+4 exec luxa fade --speed 50 '0000ff' bindsym $mod+Mod1+4 exec luxa fade --speed 50 '0000ff'
bindsym $mod+Mod1+5 exec luxa fade --speed 50 'ffffff' bindsym $mod+Mod1+5 exec luxa fade --speed 50 'ffffff'
### END BINDSYM ### ### END BINDSYM ###
### START MODES ### ### START MODES ###
mode "ACPI Events" { mode "ACPI Events" {
bindsym p exec systemctl poweroff; mode "default" bindsym p exec systemctl poweroff; mode "default"
bindsym h exec systemctl hibernate; mode "default" bindsym h exec systemctl hibernate; mode "default"
bindsym s exec systemctl suspend; mode "default" bindsym s exec systemctl suspend; mode "default"
bindsym r exec systemctl reboot; mode "default" bindsym r exec systemctl reboot; mode "default"
bindsym h exec systemctl halt; mode "default" bindsym h exec systemctl halt; mode "default"
bindsym e exec systemctl exit; mode "default" bindsym e exec systemctl exit; mode "default"
bindsym l exec $LOCK; mode "default" bindsym l exec $LOCK; mode "default"
bindsym Return mode "default" bindsym Return mode "default"
bindsym Escape mode "default" bindsym Escape mode "default"
}
mode "Power Mode"{
bindsym s exec xbacklight -set 5; exec rfkill block all ; exec xset -b +dpms; mode "default"
bindsym p exec xbacklight -set 100; exec rfkill unblock all; exec xset -dpms; mode "default"
bindsym Return mode "default"
bindsym Escape mode "default"
}
mode "No Keybinds" {
bindsym $mod+Shift+Escape mode "default"
}
bindsym $mod+F12 mode "ACPI Events"
bindsym $mod+F11 mode "No Keybinds"
bindsym $mod+F10 mode "Power Mode"
### END MODES ###
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
#font pango:monospace 8
#font pango:System San Francisco Display 8
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:DejaVu Sans Mono 8
# Before i3 v4.8, we used to recommend this one as the default:
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# The font above is very space-efficient, that is, it looks good, sharp and
# clear in small sizes. However, its unicode glyph coverage is limited, the old
# X core fonts rendering does not support right-to-left and this being a bitmap
# font, it doesnt scale on retina/hidpi displays.
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Shift+Return exec emacsclient -c
bindsym $mod+Mod1+Return exec emacsclient -c -e '(eshell t)'
bindsym $mod+Return exec alacritty
# kill focused window
bindsym $mod+Shift+q kill
# start dmenu (a program launcher)
bindsym $mod+d exec ${pkgs.rofi}/bin/rofi -config /etc/rofi.rasi -show combi
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+odiaeresis move right
#bindsym $mod+Shift+semicolon1 move right
# alternatively, you can use the cursor 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
# split in horizontal orientation
bindsym $mod+h split h
# split in vertical orientation
bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+q layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
bindsym $mod+s focus child
# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
bindsym $mod+Shift+4 move container to workspace 4
bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9
bindsym $mod+Shift+0 move container to workspace 10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym j resize shrink width 10 px or 10 ppt
bindsym k resize grow height 10 px or 10 ppt
bindsym l resize shrink height 10 px or 10 ppt
bindsym semicolon resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
position top
status_command py3status -c /etc/i3/py3status
tray_output primary
# status_command i3status
colors {
separator #586e75
background #002b36
statusline #aea79f
focused_workspace #586e75 #586e75 #ffffff
active_workspace #073642 #073642 #ffffff
inactive_workspace #002b36 #002b36 #aea79f
urgent_workspace #77216f #77216f #ffffff
} }
}
client.focused #008666 #000000 #ffffff
client.focused_inactive #000000 #222222 #ffffff
client.unfocused #002b36 #333333 #ffffff #ffffff
client.urgent #aa0000 y#990000 #ffffff
#client.focused #586e75 #586e75 #fdf6e3 #268bd2 mode "Power Mode"{
#client.focused_inactive #073642 #073642 #93a1a1 #002b36 bindsym s exec xbacklight -set 5; exec rfkill block all ; exec xset -b +dpms; mode "default"
#client.unfocused #002b36 #002b36 #586e75 #002b36 bindsym p exec xbacklight -set 100; exec rfkill unblock all; exec xset -dpms; mode "default"
#client.urgent #dc322f #dc322f #fdf6e3 #dc322f
bindsym Return mode "default"
bindsym Escape mode "default"
}
mode "No Keybinds" {
bindsym $mod+Shift+Escape mode "default"
}
bindsym $mod+F12 mode "ACPI Events"
bindsym $mod+F11 mode "No Keybinds"
bindsym $mod+F10 mode "Power Mode"
### END MODES ###
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
#font pango:monospace 8
#font pango:System San Francisco Display 8
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
font pango:DejaVu Sans Mono 8
# Before i3 v4.8, we used to recommend this one as the default:
# font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
# The font above is very space-efficient, that is, it looks good, sharp and
# clear in small sizes. However, its unicode glyph coverage is limited, the old
# X core fonts rendering does not support right-to-left and this being a bitmap
# font, it doesnt scale on retina/hidpi displays.
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Shift+Return exec emacsclient -c
bindsym $mod+Mod1+Return exec emacsclient -c -e '(eshell t)'
bindsym $mod+Return exec alacritty
# kill focused window
bindsym $mod+Shift+q kill
# start dmenu (a program launcher)
bindsym $mod+d exec ${pkgs.rofi}/bin/rofi -config /etc/rofi.rasi -show combi
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+odiaeresis move right
#bindsym $mod+Shift+semicolon1 move right
# alternatively, you can use the cursor 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
# split in horizontal orientation
bindsym $mod+h split h
# split in vertical orientation
bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+q layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
bindsym $mod+s focus child
# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
bindsym $mod+Shift+4 move container to workspace 4
bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9
bindsym $mod+Shift+0 move container to workspace 10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -b 'Yes, exit i3' 'i3-msg exit'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym j resize shrink width 10 px or 10 ppt
bindsym k resize grow height 10 px or 10 ppt
bindsym l resize shrink height 10 px or 10 ppt
bindsym semicolon resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
position top
status_command py3status -c /etc/i3/py3status
tray_output primary
# status_command i3status
colors {
separator #586e75
background #002b36
statusline #aea79f
focused_workspace #586e75 #586e75 #ffffff
active_workspace #073642 #073642 #ffffff
inactive_workspace #002b36 #002b36 #aea79f
urgent_workspace #77216f #77216f #ffffff
}
}
client.focused #008666 #000000 #ffffff
client.focused_inactive #000000 #222222 #ffffff
client.unfocused #002b36 #333333 #ffffff #ffffff
client.urgent #aa0000 y#990000 #ffffff
#client.focused #586e75 #586e75 #fdf6e3 #268bd2
#client.focused_inactive #073642 #073642 #93a1a1 #002b36
#client.unfocused #002b36 #002b36 #586e75 #002b36
#client.urgent #dc322f #dc322f #fdf6e3 #dc322f
'') '')

View file

@ -1,25 +1,23 @@
{ pkgs }: {pkgs}: let
let
tabMode = pkgs.writeScript "tab-finder.sh" (with pkgs; '' tabMode = pkgs.writeScript "tab-finder.sh" (with pkgs; ''
#!/usr/bin/env bash #!/usr/bin/env bash
if [ -z ''${1} ]; then if [ -z ''${1} ]; then
${brotab}/bin/bt list; ${brotab}/bin/bt list;
else else
TARGET_TAB=$(sed "s/\t.*$//g" <<< ''${1}); TARGET_TAB=$(sed "s/\t.*$//g" <<< ''${1});
# activate window as focused to it is easy to switch to # activate window as focused to it is easy to switch to
${brotab}/bin/bt activate --focused ''${TARGET_TAB} > /dev/null 2>&1; ${brotab}/bin/bt activate --focused ''${TARGET_TAB} > /dev/null 2>&1;
${i3}/bin/i3-msg -t run_command "[urgent=latest] focus" > /dev/null 2>&1; ${i3}/bin/i3-msg -t run_command "[urgent=latest] focus" > /dev/null 2>&1;
fi fi
exit 0; exit 0;
''); '');
in (pkgs.writeText "rofi.rasi" '' in (pkgs.writeText "rofi.rasi" ''
configuration { configuration {
modi: "combi,window,drun,ssh,tabFinder:${tabMode}"; modi: "combi,window,drun,ssh,tabFinder:${tabMode}";
font: "hack 10"; font: "hack 10";
combi-modi: "window,drun,ssh,tabFinder"; combi-modi: "window,drun,ssh,tabFinder";
icon-theme: "Papirus"; icon-theme: "Papirus";
show-icons: true; show-icons: true;
} }
@theme "solarized" @theme "solarized"
'') '')

View file

@ -1,42 +1,45 @@
{ pkgs, lib, config, ... }: {
pkgs,
lib,
config,
...
}:
with lib; with lib;
mkIf (elem "fonts" config.machine.conffiles) {
mkIf (elem "fonts" config.machine.conffiles) { fonts = {
fonts = { fontDir.enable = true;
fontDir.enable = true; enableGhostscriptFonts = true;
enableGhostscriptFonts = true; fontconfig = {
fontconfig = { enable = true;
enable = true; # deprecated (will eventually be completely removed)
# deprecated (will eventually be completely removed) # ultimate.enable = true;
# ultimate.enable = true; includeUserConf = false;
includeUserConf = false; };
packages = with pkgs; [
arphic-ukai
arphic-uming
crimson
corefonts # Microsoft free fonts
dejavu_fonts
font-awesome
inconsolata # monospaced
inter
manrope
montserrat
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
noto-fonts-extra
powerline-fonts
source-han-sans-japanese
source-han-sans-korean
source-han-sans-simplified-chinese
source-han-sans-traditional-chinese
# source-sans-pro
symbola
ubuntu_font_family
wqy_microhei
wqy_zenhei
];
}; };
packages = with pkgs; [ }
arphic-ukai
arphic-uming
crimson
corefonts # Microsoft free fonts
dejavu_fonts
font-awesome
inconsolata # monospaced
inter
manrope
montserrat
noto-fonts
noto-fonts-cjk
noto-fonts-emoji
noto-fonts-extra
powerline-fonts
source-han-sans-japanese
source-han-sans-korean
source-han-sans-simplified-chinese
source-han-sans-traditional-chinese
# source-sans-pro
symbola
ubuntu_font_family
wqy_microhei
wqy_zenhei
];
};
}

View file

@ -1,13 +1,18 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
console.keyMap = "de"; console.keyMap = "de";
i18n = { i18n = {
defaultLocale = "en_US.UTF-8"; defaultLocale = "en_US.UTF-8";
supportedLocales = [ "all" ]; supportedLocales = ["all"];
inputMethod = { inputMethod = {
enabled = if config.services.xserver.enable then "fcitx5" else null; enabled =
fcitx5.addons = with pkgs; [ fcitx5-chinese-addons fcitx5-mozc fcitx5-table-extra ]; if config.services.xserver.enable
then "fcitx5"
else null;
fcitx5.addons = with pkgs; [fcitx5-chinese-addons fcitx5-mozc fcitx5-table-extra];
}; };
}; };
} }

View file

@ -1,10 +1,11 @@
{ config, lib, ... }: {
config,
with lib; lib,
...
let }:
with lib; let
networkD = config.machine.networkD; networkD = config.machine.networkD;
in{ in {
networking = { networking = {
hostName = config.machine.hostName; hostName = config.machine.hostName;
useNetworkd = networkD.enable; useNetworkd = networkD.enable;
@ -20,7 +21,7 @@ in{
DHCP = "yes"; DHCP = "yes";
DNSSEC = "yes"; DNSSEC = "yes";
DNSOverTLS = "yes"; DNSOverTLS = "yes";
DNS = [ "1.1.1.1" "1.0.0.1" ]; DNS = ["1.1.1.1" "1.0.0.1"];
}; };
in { in {
"40-wired" = { "40-wired" = {
@ -58,7 +59,8 @@ in{
systemd.services."systemd-networkd-wait-online" = { systemd.services."systemd-networkd-wait-online" = {
enable = mkForce networkD.waitOnline; enable = mkForce networkD.waitOnline;
serviceConfig.ExecStart = [ serviceConfig.ExecStart = [
"" "${config.systemd.package}/lib/systemd/systemd-networkd-wait-online --any" ""
"${config.systemd.package}/lib/systemd/systemd-networkd-wait-online --any"
]; ];
}; };
} }

View file

@ -1,6 +1,12 @@
{ nixpkgs, nixpkgs-git, nixpkgs-stable, pkgs, config, lib, ... }: {
nixpkgs,
let nixpkgs-git,
nixpkgs-stable,
pkgs,
config,
lib,
...
}: let
cfg = config.machine; cfg = config.machine;
emptyGlobalRegistry = pkgs.writeText "registry.json" ''{ "flakes": [], "version": 2 }''; emptyGlobalRegistry = pkgs.writeText "registry.json" ''{ "flakes": [], "version": 2 }'';
in { in {
@ -16,15 +22,19 @@ in {
cores = 1; cores = 1;
sandbox = true; sandbox = true;
auto-optimise-store = true; auto-optimise-store = true;
trusted-substituters = [ trusted-substituters =
"https://cache.nixos.org" [
] ++ cfg.binaryCaches; "https://cache.nixos.org"
]
++ cfg.binaryCaches;
# TODO: integrate into sops # TODO: integrate into sops
# trusted-public-keys = [ (lib.fileContents "${cfg.secretPath}/hydra_cache.pub") ]; # trusted-public-keys = [ (lib.fileContents "${cfg.secretPath}/hydra_cache.pub") ];
substituters = [ substituters =
"https://cache.nixos.org" [
] ++ cfg.binaryCaches; "https://cache.nixos.org"
allowed-users = [ "root" ] ++ (map (n: n.name) cfg.administrators); ]
++ cfg.binaryCaches;
allowed-users = ["root"] ++ (map (n: n.name) cfg.administrators);
}; };
extraOptions = '' extraOptions = ''
build-timeout = 86400 # 24 hours build-timeout = 86400 # 24 hours

View file

@ -1,10 +1,12 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "security" config.machine.conffiles) {
mkIf (elem "security" config.machine.conffiles) { security = {
security = { audit.enable = true;
audit.enable = true; auditd.enable = true;
auditd.enable = true; };
}; }
}

View file

@ -1,8 +1,11 @@
{ config, lib, fn, pkgs, ... }: {
config,
with lib; lib,
fn,
let pkgs,
...
}:
with lib; let
withDocker = config.virtualisation.docker.enable; withDocker = config.virtualisation.docker.enable;
withPodman = config.virtualisation.podman.enable; withPodman = config.virtualisation.podman.enable;
administrators = user: { administrators = user: {
@ -13,16 +16,23 @@ let
in { in {
isNormalUser = true; isNormalUser = true;
name = user.name; name = user.name;
uid = user.id; uid = user.id;
subUidRanges = (optional withPodman { startUid = 100000; count = 65536; }); subUidRanges = optional withPodman {
subGidRanges = (optional withPodman { startGid = 100000; count = 65536; }); startUid = 100000;
count = 65536;
};
subGidRanges = optional withPodman {
startGid = 100000;
count = 65536;
};
home = builtins.toPath "/home/${user.name}"; home = builtins.toPath "/home/${user.name}";
createHome = true; createHome = true;
description = "Administrative user ${user.name}."; description = "Administrative user ${user.name}.";
group = user.name; group = user.name;
extraGroups = [ "audio" "wheel" "network" ] extraGroups =
["audio" "wheel" "network"]
++ (optionals cfg.xserver.enable ["input" "video"]) ++ (optionals cfg.xserver.enable ["input" "video"])
++ (optionals cfg.printing.enable [ "cups" "lp" ]) ++ (optionals cfg.printing.enable ["cups" "lp"])
++ (optional (withDocker && !withPodman) "docker") ++ (optional (withDocker && !withPodman) "docker")
++ (optional withPodman "podman"); ++ (optional withPodman "podman");
shell = "${pkgs.zsh}/bin/zsh"; shell = "${pkgs.zsh}/bin/zsh";
@ -30,19 +40,20 @@ let
}; };
}; };
mkusergroup = user: { mkusergroup = user: {
name = user.name; name = user.name;
value = { value = {
name = user.name; name = user.name;
gid = user.id; gid = user.id;
members = [ user.name ]; members = [user.name];
}; };
}; };
in { in {
sops.secrets = (fn.sopsHelper sops.secrets =
fn.sopsHelper
(user: "users/${user.name}/password") (user: "users/${user.name}/password")
config.machine.administrators config.machine.administrators
{ neededForUsers = true; }); {neededForUsers = true;};
users = { users = {
mutableUsers = false; mutableUsers = false;
users = listToAttrs (map administrators config.machine.administrators); users = listToAttrs (map administrators config.machine.administrators);

View file

@ -1,36 +1,38 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "zsh" config.machine.conffiles) {
mkIf (elem "zsh" config.machine.conffiles) { programs.zsh = {
programs.zsh = {
enable = true;
autosuggestions.enable = true;
syntaxHighlighting.enable = true;
shellAliases = {
cat = ''bat --paging=never --theme="Solarized (dark)"'';
less = ''bat --paging=always --style=changes --color=always --theme="Solarized (dark)"'';
ls = "exa";
l = "exa -abgHhl@ --git --color=always --group-directories-first";
tree = "exa --tree --color=always";
ustrip = "sed -e '/\.service\|\.timer\|\.target\|\.socket\|\.slice\|\.scope\|\.path\|\.mount\|\.device)/!d' -e 's/loaded.*$//g' -e 's/^ \|^ //g'";
lsunits = "systemctl list-units | ustrip";
};
shellInit = ''
function ll() { exa -abgHhl@ --git --color=always --group-directories-first $@ | bat --paging=always --style=changes --color=always --theme="Solarized (dark)" }
function lln() { exa -abgHhl@ --git --color=always --group-directories-first $@ | bat --paging=always --style=changes --color=always --theme="Solarized (dark)" -n }
function lszip() { unzip -l $@ 2>&1 | sed -e "1,3d" -e "s/^.*:.. *//g" | head --lines=-2 }
function rwhich() { realpath $(which $@) }
function cdf() { cd $(rwhich $@ | sed "s/$@$//") }
function sfu() { lsunits | rg -i $@ }
function map() { for f in "$\{@:2\}"; do; eval $1 \"$f\"; done }
'';
ohMyZsh = {
enable = true; enable = true;
plugins = [ "cabal" "docker" "gitfast" "python" "pip" "sudo" "systemd" "man" ]; autosuggestions.enable = true;
theme = "gentoo"; syntaxHighlighting.enable = true;
shellAliases = {
cat = ''bat --paging=never --theme="Solarized (dark)"'';
less = ''bat --paging=always --style=changes --color=always --theme="Solarized (dark)"'';
ls = "exa";
l = "exa -abgHhl@ --git --color=always --group-directories-first";
tree = "exa --tree --color=always";
ustrip = "sed -e '/\.service\|\.timer\|\.target\|\.socket\|\.slice\|\.scope\|\.path\|\.mount\|\.device)/!d' -e 's/loaded.*$//g' -e 's/^ \|^ //g'";
lsunits = "systemctl list-units | ustrip";
};
shellInit = ''
function ll() { exa -abgHhl@ --git --color=always --group-directories-first $@ | bat --paging=always --style=changes --color=always --theme="Solarized (dark)" }
function lln() { exa -abgHhl@ --git --color=always --group-directories-first $@ | bat --paging=always --style=changes --color=always --theme="Solarized (dark)" -n }
function lszip() { unzip -l $@ 2>&1 | sed -e "1,3d" -e "s/^.*:.. *//g" | head --lines=-2 }
function rwhich() { realpath $(which $@) }
function cdf() { cd $(rwhich $@ | sed "s/$@$//") }
function sfu() { lsunits | rg -i $@ }
function map() { for f in "$\{@:2\}"; do; eval $1 \"$f\"; done }
'';
ohMyZsh = {
enable = true;
plugins = ["cabal" "docker" "gitfast" "python" "pip" "sudo" "systemd" "man"];
theme = "gentoo";
};
}; };
}; }
}

View file

@ -1,33 +1,47 @@
{ lib, ... }: {lib, ...}:
with builtins; with builtins;
with lib; with lib; let
fn = import (toString ./fn.nix) {inherit lib;};
let
fn = import (toString ./fn.nix) { inherit lib; };
# Cannot use <hostName> here as those evaluations only work with existing paths >.< # Cannot use <hostName> here as those evaluations only work with existing paths >.<
# hostName and secretPtah can be set with -I hostName=$HOSTNAME and -I secretPath=$SECRETPATH respectively # hostName and secretPtah can be set with -I hostName=$HOSTNAME and -I secretPath=$SECRETPATH respectively
# , defaults to the contents of /secret/hostName # , defaults to the contents of /secret/hostName
secretPath = fn.ifelse ((tryEval (toString <secretPath>)).value != false) secretPath =
fn.ifelse ((tryEval (toString <secretPath>)).value != false)
(toString <secretPath>) (toString <secretPath>)
(toString /secret); (toString /secret);
hostName = ( hostName =
findFirst (
findFirst
(elem: elem.prefix == "hostName") (elem: elem.prefix == "hostName")
{ path = (fileContents "${secretPath}/hostName"); } {path = fileContents "${secretPath}/hostName";}
nixPath nixPath
).path; )
machinePath = (builtins.toPath (./machines + ("/" + hostName))); .path;
machineFiles = fn.lst { p = machinePath; b = true; }; machinePath = builtins.toPath (./machines + ("/" + hostName));
configFiles = fn.lst { p = (toString ./config); b = true; }; machineFiles = fn.lst {
pkgsFiles = fn.lst { p = (toString ./pkgs); b = true; }; p = machinePath;
serviceFiles = fn.lst { p = (toString ./services); b = true; }; b = true;
};
configFiles = fn.lst {
p = toString ./config;
b = true;
};
pkgsFiles = fn.lst {
p = toString ./pkgs;
b = true;
};
serviceFiles = fn.lst {
p = toString ./services;
b = true;
};
in { in {
imports = [ imports =
./options/machine.nix [
./services/mailserver/default.nix ./options/machine.nix
] ++ machineFiles ./services/mailserver/default.nix
++ configFiles ]
++ pkgsFiles ++ machineFiles
++ serviceFiles; ++ configFiles
++ pkgsFiles
++ serviceFiles;
} }

View file

@ -15,31 +15,57 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
}; };
outputs = { self, nixpkgs, alejandra, mailserver, sops-nix, ... }@attrs: let outputs = {
self,
nixpkgs,
alejandra,
mailserver,
sops-nix,
...
} @ attrs: let
lib = nixpkgs.lib; lib = nixpkgs.lib;
fn = import ./fn.nix { inherit lib; }; fn = import ./fn.nix {inherit lib;};
mappedFormatter = builtins.mapAttrs (arch: packages: packages.default) alejandra.packages; mappedFormatter = builtins.mapAttrs (arch: packages: packages.default) alejandra.packages;
system = "x86_64-linux"; system = "x86_64-linux";
machineList = fn.lst { p = (toString ./machines); t = "directory"; b = false; }; machineList = fn.lst {
configFiles = fn.lst { p = (toString ./config); b = true; }; p = toString ./machines;
pkgsFiles = fn.lst { p = (toString ./pkgs); b = true; }; t = "directory";
serviceFiles = fn.lst { p = (toString ./services); b = true; }; b = false;
};
configFiles = fn.lst {
p = toString ./config;
b = true;
};
pkgsFiles = fn.lst {
p = toString ./pkgs;
b = true;
};
serviceFiles = fn.lst {
p = toString ./services;
b = true;
};
nixosSystemFor = machine: { nixosSystemFor = machine: {
name = machine; name = machine;
value = let value = let
machinePath = lib.concatStringsSep "/" [(toString ./.) "machines" machine]; machinePath = lib.concatStringsSep "/" [(toString ./.) "machines" machine];
machineFiles = lib.filter (name: lib.strings.hasSuffix ".nix" name) (fn.lst { p = machinePath; b = true; }); machineFiles = lib.filter (name: lib.strings.hasSuffix ".nix" name) (fn.lst {
in nixpkgs.lib.nixosSystem { p = machinePath;
inherit system; b = true;
specialArgs = attrs // { fn = fn; }; });
modules = [ in
(toString ./options/machine.nix) nixpkgs.lib.nixosSystem {
sops-nix.nixosModules.sops inherit system;
] ++ machineFiles specialArgs = attrs // {fn = fn;};
++ configFiles modules =
++ pkgsFiles [
++ serviceFiles; (toString ./options/machine.nix)
}; sops-nix.nixosModules.sops
]
++ machineFiles
++ configFiles
++ pkgsFiles
++ serviceFiles;
};
}; };
in { in {
formatter = mappedFormatter; formatter = mappedFormatter;

129
fn.nix
View file

@ -1,84 +1,121 @@
{ lib }: {lib}:
with builtins; with builtins;
with lib; with lib; rec {
ifelse = a: b: c:
rec { if a
ifelse = a: b: c: if a then b else c; then b
else c;
fileContentsOr = a: b: (ifelse fileContentsOr = a: b: (ifelse
(pathIsRegularFile a) (pathIsRegularFile a)
a b); a
b);
cwd = builtins.getEnv "PWD"; cwd = builtins.getEnv "PWD";
# lst (string PATH) (string FILETYPE) (bool RETURNFULLPATH) # lst (string PATH) (string FILETYPE) (bool RETURNFULLPATH)
lst = { p ? cwd, t ? "regular", b ? false }: (lists.forEach lst = {
p ? cwd,
t ? "regular",
b ? false,
}: (lists.forEach
(attrNames (attrNames
(filterAttrs (n: v: v == t) (filterAttrs (n: v: v == t)
(readDir p))) (readDir p)))
(v: ((optionalString b "${p}/") + v))); (v: ((optionalString b "${p}/") + v)));
lsf = p: (lst { p = p; }); lsf = p: (lst {p = p;});
lsd = p: (lst { p = p; t = "directory"; b = true; }); lsd = p: (lst {
lsfRec = p: b: flatten ((map (np: lsfRec np b) (lsd p)) ++ (lst { p = p; b = b; })); p = p;
t = "directory";
b = true;
});
lsfRec = p: b:
flatten ((map (np: lsfRec np b) (lsd p))
++ (lst {
p = p;
b = b;
}));
hasAttrs = aList: d: (map hasAttrs = aList: d: (map
(a: (a: (ifelse (isList a)
(ifelse (isList a) (hasAttrByPath a d)
(hasAttrByPath a d) (hasAttr a d)))
(hasAttr a d)))
aList); aList);
# Not sure how list operations are implemented in Nix # Not sure how list operations are implemented in Nix
# This might be a tad bit inefficient. # This might be a tad bit inefficient.
# TODO: look for better implementation (map is a builtin function so checking that probably won't help) # TODO: look for better implementation (map is a builtin function so checking that probably won't help)
# Sequentially checks elements of list (l) for condition (cond) and executes do on first match. # Sequentially checks elements of list (l) for condition (cond) and executes do on first match.
meetsConDo = cond: do: l: ifelse (l == []) false meetsConDo = cond: do: l:
ifelse (l == []) false
(let (let
h = (head l); h = head l;
t = (tail l); t = tail l;
in ifelse (cond h) (do h) in
(meetsConDo (cond) (do) (t))); ifelse (cond h) (do h)
deps = p: ifelse (isAttrs p) (filter (p: isAttrs p) (meetsConDo cond do t));
(p.buildInputs ++ p.nativeBuildInputs ++ p.propagatedBuildInputs ++ p.propagatedNativeBuildInputs) deps = p:
) []; ifelse (isAttrs p) (
filter (p: isAttrs p)
(p.buildInputs ++ p.nativeBuildInputs ++ p.propagatedBuildInputs ++ p.propagatedNativeBuildInputs)
) [];
importFilter = l: p: filter (n: elem (nameFromURL (toString n) ".") l) p; importFilter = l: p: filter (n: elem (nameFromURL (toString n) ".") l) p;
depsRec = ld: ifelse (ld == []) [] ((toList ld) ++ (depsRec (lists.unique (lists.flatten (map (d: deps d) (toList ld)))))); depsRec = ld: ifelse (ld == []) [] ((toList ld) ++ (depsRec (lists.unique (lists.flatten (map (d: deps d) (toList ld))))));
isBroken = p: meetsConDo (s: ((hasAttrByPath s.path p) && (s.check (getAttrFromPath s.path p)))) (s: s.msg) isBroken = p:
[ meetsConDo (s: ((hasAttrByPath s.path p) && (s.check (getAttrFromPath s.path p)))) (s: s.msg)
{ path = ["meta" "broken"]; msg = (warn "Package ${p.name} is marked as broken." true); check = m: m; } [
{ path = ["meta" "knownVulnerabilities" ]; msg = (warn "Package ${p.name} has known Vulnerabilities.." true); check = m: m != []; } {
{ path = ["name"]; msg = (warn "${p.name}: python2 is depricated." false); check = m: (strings.hasInfix "python2" m) || (strings.hasInfix "python-2" m); } path = ["meta" "broken"];
# not sure if the following test creates false positives (AFAIK every derivation/package needs to have an outPath) msg = warn "Package ${p.name} is marked as broken." true;
# , definitely should catch all corner cases/everything that fails to evaluate. check = m: m;
{ path = [ "outPath" ]; msg = (warn "Package ${p.name} has no outPath" true); check = m: !(tryEval m).success; } }
]; {
path = ["meta" "knownVulnerabilities"];
msg = warn "Package ${p.name} has known Vulnerabilities.." true;
check = m: m != [];
}
{
path = ["name"];
msg = warn "${p.name}: python2 is depricated." false;
check = m: (strings.hasInfix "python2" m) || (strings.hasInfix "python-2" m);
}
# not sure if the following test creates false positives (AFAIK every derivation/package needs to have an outPath)
# , definitely should catch all corner cases/everything that fails to evaluate.
{
path = ["outPath"];
msg = warn "Package ${p.name} has no outPath" true;
check = m: !(tryEval m).success;
}
];
depsBroken = p: lists.any (p: (isBroken p)) (deps p); depsBroken = p: lists.any (p: (isBroken p)) (deps p);
# No more magic 🧙 here 😢 # No more magic 🧙 here 😢
# But at least it now (hopefully) checks ONLY dependencies (and all of them at that). # But at least it now (hopefully) checks ONLY dependencies (and all of them at that).
depsBrokenRec = p: (meetsConDo depsBrokenRec = p: (
meetsConDo
(p: ifelse (depsBroken p) true (depsBrokenRec (deps p))) (p: ifelse (depsBroken p) true (depsBrokenRec (deps p)))
(p: true) (deps p) (p: true) (deps p)
); );
sopsHelper = template: names: options: let sopsHelper = template: names: options: let
optionsIsFunction = (typeOf options) == "lambda"; optionsIsFunction = (typeOf options) == "lambda";
in listToAttrs (map in
(name: { listToAttrs (map
name = template name; (name: {
value = ifelse optionsIsFunction (options name) options; name = template name;
}) value = ifelse optionsIsFunction (options name) options;
names); })
names);
pkgFilter = ld: (filter pkgFilter = ld: (filter
(p: ( (p: (
ifelse (isBroken p) ifelse (isBroken p)
false false
(ifelse (depsBrokenRec p) (ifelse (depsBrokenRec p)
(warn "Dependency of ${p.name} is marked as broken." false) (warn "Dependency of ${p.name} is marked as broken." false)
true) true)
)) ))
ld); ld);
makeOptionTypeList = path: (lists.forEach makeOptionTypeList = path: (
lists.forEach
# get a list of all files ending in .nix in path # get a list of all files ending in .nix in path
(filter (filePath: hasSuffix ".nix" filePath) (filter (filePath: hasSuffix ".nix" filePath)
(lsfRec path true)) (lsfRec path true))
# remove leading path and trailing ".nix", replace every slash with "::" # remove leading path and trailing ".nix", replace every slash with "::"
(replaceStrings [ "${path}/" "/" ".nix" ] [ "" "::" "" ]) (replaceStrings ["${path}/" "/" ".nix"] ["" "::" ""])
); );
} }

View file

@ -1,6 +1,8 @@
{ pkgs, lib, ... }:
{ {
pkgs,
lib,
...
}: {
services.cron.enable = false; services.cron.enable = false;
networking.dhcpcd.extraConfig = "noarp"; networking.dhcpcd.extraConfig = "noarp";
@ -8,10 +10,30 @@
# low latency audio stuff # low latency audio stuff
security.pam.loginLimits = [ security.pam.loginLimits = [
{ domain = "@audio"; item = "memlock"; type = "-"; value = "unlimited"; } {
{ domain = "@audio"; item = "rtprio"; type = "-"; value = "99"; } domain = "@audio";
{ domain = "@audio"; item = "nofile"; type = "soft"; value = "99999"; } item = "memlock";
{ domain = "@audio"; item = "nofile"; type = "hard"; value = "99999"; } type = "-";
value = "unlimited";
}
{
domain = "@audio";
item = "rtprio";
type = "-";
value = "99";
}
{
domain = "@audio";
item = "nofile";
type = "soft";
value = "99999";
}
{
domain = "@audio";
item = "nofile";
type = "hard";
value = "99999";
}
]; ];
environment = { environment = {
etc = { etc = {
@ -20,11 +42,11 @@
''; '';
}; };
variables = { variables = {
DSSI_PATH = "$HOME/.dssi:$HOME/.nix-profile/lib/dssi:/run/current-system/sw/lib/dssi"; DSSI_PATH = "$HOME/.dssi:$HOME/.nix-profile/lib/dssi:/run/current-system/sw/lib/dssi";
LADSPA_PATH = "$HOME/.ladspa:$HOME/.nix-profile/lib/ladspa:/run/current-system/sw/lib/ladspa"; LADSPA_PATH = "$HOME/.ladspa:$HOME/.nix-profile/lib/ladspa:/run/current-system/sw/lib/ladspa";
LV2_PATH = "$HOME/.lv2:$HOME/.nix-profile/lib/lv2:/run/current-system/sw/lib/lv2"; LV2_PATH = "$HOME/.lv2:$HOME/.nix-profile/lib/lv2:/run/current-system/sw/lib/lv2";
LXVST_PATH = "$HOME/.lxvst:$HOME/.nix-profile/lib/lxvst:/run/current-system/sw/lib/lxvst"; LXVST_PATH = "$HOME/.lxvst:$HOME/.nix-profile/lib/lxvst:/run/current-system/sw/lib/lxvst";
VST_PATH = "$HOME/.vst:$HOME/.nix-profile/lib/vst:/run/current-system/sw/lib/vst"; VST_PATH = "$HOME/.vst:$HOME/.nix-profile/lib/vst:/run/current-system/sw/lib/vst";
}; };
}; };
services = { services = {
@ -38,8 +60,8 @@
}; };
}; };
boot = { boot = {
kernelModules = [ "snd-usb-audio" "snd-aloop" "snd-seq" "snd-rawmidi" ]; kernelModules = ["snd-usb-audio" "snd-aloop" "snd-seq" "snd-rawmidi"];
kernelParams = [ "threadirq" ]; kernelParams = ["threadirq"];
extraModprobeConfig = '' extraModprobeConfig = ''
options snd-usb-audio nrpacks=1 options snd-usb-audio nrpacks=1
''; '';

View file

@ -1,32 +1,35 @@
{ nixpkgs, config, pkgs, ... }: {
nixpkgs,
let config,
pkgs,
...
}: let
cfg = config.machine; cfg = config.machine;
in { in {
imports = [ "${nixpkgs}/nixos/modules/installer/scan/not-detected.nix" ]; imports = ["${nixpkgs}/nixos/modules/installer/scan/not-detected.nix"];
boot = { boot = {
loader.systemd-boot = { loader.systemd-boot = {
enable = true; enable = true;
# signed = true; # signed = true;
# signing-key = "${cfg.secretPath}/secureboot/db.key"; # signing-key = "${cfg.secretPath}/secureboot/db.key";
# signing-certificate = "${cfg.secretPath}/secureboot/db.crt"; # signing-certificate = "${cfg.secretPath}/secureboot/db.crt";
}; };
loader.efi.canTouchEfiVariables = true; loader.efi.canTouchEfiVariables = true;
tmp = { tmp = {
useTmpfs = true; useTmpfs = true;
cleanOnBoot= true; cleanOnBoot = true;
}; };
kernelPackages = pkgs.linuxPackages_latest; kernelPackages = pkgs.linuxPackages_latest;
initrd.availableKernelModules = [ "xhci_pci" "ahci" "sd_mod" "rtsx_pci_sdmmc" ]; initrd.availableKernelModules = ["xhci_pci" "ahci" "sd_mod" "rtsx_pci_sdmmc"];
kernelModules = [ "acpi_call" "i915" "kvm-intel" "uinput" ]; kernelModules = ["acpi_call" "i915" "kvm-intel" "uinput"];
# 5_10 breaks my touchpad/mouse buttons # 5_10 breaks my touchpad/mouse buttons
# https://bbs.archlinux.org/viewtopic.php?id=254885 # https://bbs.archlinux.org/viewtopic.php?id=254885
# maybe modprobe hid_rmi or i2c_i801 # maybe modprobe hid_rmi or i2c_i801
# blacklistedKernelModules = [ "i2c_i801" ]; # blacklistedKernelModules = [ "i2c_i801" ];
extraModulePackages = with config.boot.kernelPackages; [ acpi_call ]; #pkgs.gitpkgs.linuxPackages_latest.hid-nintendo ]; extraModulePackages = with config.boot.kernelPackages; [acpi_call]; #pkgs.gitpkgs.linuxPackages_latest.hid-nintendo ];
kernelParams = [ "intel_iommu=on" ]; kernelParams = ["intel_iommu=on"];
extraModprobeConfig = '' extraModprobeConfig = ''
options i915 enable_fbc=1 enable_guc=3 options i915 enable_fbc=1 enable_guc=3
''; '';
@ -37,26 +40,26 @@ in {
}; };
}; };
fileSystems."/" = fileSystems."/" = {
{ device = "/dev/disk/by-uuid/b37b48a8-5dcb-4f4d-ad71-1b26500b3e5f"; device = "/dev/disk/by-uuid/b37b48a8-5dcb-4f4d-ad71-1b26500b3e5f";
fsType = "ext4"; fsType = "ext4";
}; };
fileSystems."/boot" = fileSystems."/boot" = {
{ device = "/dev/disk/by-uuid/546A-A3D1"; device = "/dev/disk/by-uuid/546A-A3D1";
fsType = "vfat"; fsType = "vfat";
}; };
hardware = { hardware = {
firmware = with pkgs; [ firmwareLinuxNonfree ]; firmware = with pkgs; [firmwareLinuxNonfree];
cpu.intel.updateMicrocode = true; cpu.intel.updateMicrocode = true;
enableAllFirmware = false; enableAllFirmware = false;
ksm.enable = true; ksm.enable = true;
opengl = { opengl = {
driSupport = true; driSupport = true;
extraPackages = with pkgs; [ intel-media-driver libvdpau-va-gl libva (vaapiIntel.override {enableHybridCodec = true;}) vaapiVdpau intel-media-driver ]; extraPackages = with pkgs; [intel-media-driver libvdpau-va-gl libva (vaapiIntel.override {enableHybridCodec = true;}) vaapiVdpau intel-media-driver];
driSupport32Bit = true; driSupport32Bit = true;
extraPackages32 = with pkgs.pkgsi686Linux; [ libvdpau-va-gl libva (vaapiIntel.override {enableHybridCodec = true;}) vaapiVdpau ]; extraPackages32 = with pkgs.pkgsi686Linux; [libvdpau-va-gl libva (vaapiIntel.override {enableHybridCodec = true;}) vaapiVdpau];
}; };
pulseaudio = { pulseaudio = {
@ -81,7 +84,7 @@ in {
}; };
services = { services = {
upower.enable = true; upower.enable = true;
xserver.videoDrivers = [ "intel" ]; xserver.videoDrivers = ["intel"];
}; };
time.timeZone = "Europe/Berlin"; time.timeZone = "Europe/Berlin";

View file

@ -1,8 +1,9 @@
{ pkgs, lib, ... }:
with lib;
{ {
pkgs,
lib,
...
}:
with lib; {
imports = [ imports = [
../../options/copySysConf.nix ../../options/copySysConf.nix
]; ];
@ -13,7 +14,12 @@ with lib;
enable = true; enable = true;
waitOnline = false; waitOnline = false;
}; };
administrators = [ { name = "derped"; id = 1337; } ]; administrators = [
{
name = "derped";
id = 1337;
}
];
conffiles = [ conffiles = [
"etcfiles" "etcfiles"
"etcvars" "etcvars"
@ -59,15 +65,26 @@ with lib;
"cups" "cups"
"mullvad" "mullvad"
"mariaDB" "mariaDB"
"docker" "podman" "docker"
"podman"
]; ];
firewall = { firewall = {
enable = true; enable = true;
allowPing = true; allowPing = true;
allowedUDPPorts = [ 24642 ]; allowedUDPPorts = [24642];
allowedTCPPorts = [ 24642 ]; allowedTCPPorts = [24642];
allowedUDPPortRanges = [ { from = 1714; to = 1764; } ]; allowedUDPPortRanges = [
allowedTCPPortRanges = [ { from = 1714; to = 1764; } ]; {
from = 1714;
to = 1764;
}
];
allowedTCPPortRanges = [
{
from = 1714;
to = 1764;
}
];
}; };
}; };

View file

@ -1,6 +1,8 @@
{ config, lib, ... }:
{ {
config,
lib,
...
}: {
sops = { sops = {
defaultSopsFile = ./secrets.yaml; defaultSopsFile = ./secrets.yaml;
age = { age = {

View file

@ -1,6 +1,4 @@
{ pkgs, ... }: {pkgs, ...}: {
{
services.cron.enable = false; services.cron.enable = false;
security.pki.certificateFiles = [ security.pki.certificateFiles = [
./certs/proxy ./certs/proxy

View file

@ -1,9 +1,12 @@
{ config, pkgs, modulesPath, ... }: {
config,
let pkgs,
modulesPath,
...
}: let
cfg = config.machine; cfg = config.machine;
in { in {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; imports = [(modulesPath + "/installer/scan/not-detected.nix")];
boot = { boot = {
loader.systemd-boot = { loader.systemd-boot = {
@ -12,12 +15,12 @@ in {
loader.efi.canTouchEfiVariables = true; loader.efi.canTouchEfiVariables = true;
tmp = { tmp = {
useTmpfs = true; useTmpfs = true;
cleanOnBoot= true; cleanOnBoot = true;
}; };
kernelPackages = pkgs.linuxPackages_latest; kernelPackages = pkgs.linuxPackages_latest;
initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; initrd.availableKernelModules = ["nvme" "xhci_pci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc"];
kernelModules = [ "kvm-amd" ]; kernelModules = ["kvm-amd"];
kernelParams = [ kernelParams = [
# get backlight service to work part one (fixes systemd backlight service) # get backlight service to work part one (fixes systemd backlight service)
"acpi_backlight=native" "acpi_backlight=native"
@ -29,18 +32,18 @@ in {
}; };
}; };
fileSystems."/" = fileSystems."/" = {
{ device = "/dev/disk/by-uuid/cf8db7d5-5da7-4fb9-818d-ed5dd2815f0d"; device = "/dev/disk/by-uuid/cf8db7d5-5da7-4fb9-818d-ed5dd2815f0d";
fsType = "ext4"; fsType = "ext4";
}; };
fileSystems."/boot" = fileSystems."/boot" = {
{ device = "/dev/disk/by-uuid/96E4-9DF3"; device = "/dev/disk/by-uuid/96E4-9DF3";
fsType = "vfat"; fsType = "vfat";
}; };
hardware = { hardware = {
firmware = with pkgs; [ firmwareLinuxNonfree ]; firmware = with pkgs; [firmwareLinuxNonfree];
enableAllFirmware = true; enableAllFirmware = true;
ksm.enable = true; ksm.enable = true;
opengl = { opengl = {

View file

@ -1,15 +1,21 @@
{ pkgs, lib, ... }:
with lib;
{ {
pkgs,
lib,
...
}:
with lib; {
imports = [ imports = [
../../options/copySysConf.nix ../../options/copySysConf.nix
]; ];
config.machine = { config.machine = {
allowUnfree = true; allowUnfree = true;
hostName = "Marid"; hostName = "Marid";
administrators = [ { name = "derped"; id = 1337; } ]; administrators = [
{
name = "derped";
id = 1337;
}
];
conffiles = [ conffiles = [
"etcfiles" "etcfiles"
"etcvars" "etcvars"
@ -37,7 +43,7 @@ with lib;
"emacs::org" "emacs::org"
"emacs::php-mode" "emacs::php-mode"
"emacs::web-mode" "emacs::web-mode"
"emacs::yasnippet" "emacs::yasnippet"
"extra" "extra"
"mail_utils" "mail_utils"
"python3" "python3"
@ -53,10 +59,10 @@ with lib;
firewall = { firewall = {
enable = true; enable = true;
allowPing = true; allowPing = true;
allowedUDPPorts = [ ]; allowedUDPPorts = [];
allowedTCPPorts = [ ]; allowedTCPPorts = [];
allowedUDPPortRanges = [ ]; allowedUDPPortRanges = [];
allowedTCPPortRanges = [ ]; allowedTCPPortRanges = [];
}; };
}; };

View file

@ -1,6 +1,8 @@
{ config, lib, ... }:
{ {
config,
lib,
...
}: {
sops = { sops = {
defaultSopsFile = ./secrets.yaml; defaultSopsFile = ./secrets.yaml;
age = { age = {

View file

@ -1,17 +1,16 @@
# Edit this configuration file to define what should be installed on # Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page # your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help). # and in the NixOS manual (accessible by running nixos-help).
{ {
system.autoUpgrade.enable = false; system.autoUpgrade.enable = false;
# services.vsftp = { # services.vsftp = {
# enable = true; # enable = true;
# ssl_sslv3 = true; # ssl_sslv3 = true;
# forceLocalDataSSL = true; # forceLocalDataSSL = true;
# writeEnable = false; # writeEnable = false;
# userlist = []; # userlist = [];
# }; # };
services.haveged.enable = true; services.haveged.enable = true;
programs.zsh.promptInit = ''PROMPT="%(!.%B%F{magenta}.%B%F{cyan}%n@)%m %F{blue}%(!.%1~.%~) ''${vcs_info_msg_0_}%F{blue}%(!.#.$)%k%b%f "''; programs.zsh.promptInit = ''PROMPT="%(!.%B%F{magenta}.%B%F{cyan}%n@)%m %F{blue}%(!.%1~.%~) ''${vcs_info_msg_0_}%F{blue}%(!.#.$)%k%b%f "'';

View file

@ -1,15 +1,17 @@
{ nixpkgs, pkgs, ... }:
{ {
imports = nixpkgs,
[ "${nixpkgs}/nixos/modules/profiles/qemu-guest.nix" pkgs,
]; ...
}: {
imports = [
"${nixpkgs}/nixos/modules/profiles/qemu-guest.nix"
];
boot = { boot = {
initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod" ]; initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "sd_mod" "sr_mod"];
kernelPackages = pkgs.linuxPackages_latest; kernelPackages = pkgs.linuxPackages_latest;
kernelModules = [ ]; kernelModules = [];
extraModulePackages = [ ]; extraModulePackages = [];
loader.grub = { loader.grub = {
enable = true; enable = true;
device = "/dev/sda"; # or "nodev" for efi only device = "/dev/sda"; # or "nodev" for efi only
@ -18,10 +20,10 @@
time.timeZone = "Europe/Berlin"; time.timeZone = "Europe/Berlin";
fileSystems."/" = fileSystems."/" = {
{ device = "/dev/disk/by-uuid/fa0c2ff3-59f9-4c00-8153-c2c2ef0f0e84"; device = "/dev/disk/by-uuid/fa0c2ff3-59f9-4c00-8153-c2c2ef0f0e84";
fsType = "ext4"; fsType = "ext4";
}; };
swapDevices = [ ]; swapDevices = [];
} }

View file

@ -1,15 +1,26 @@
{ config, lib, ... }: {
config,
with lib; lib,
...
let }:
with lib; let
cfg = config.machine; cfg = config.machine;
in { in {
config.machine = rec { config.machine = rec {
hostName = "Ophanim"; hostName = "Ophanim";
domain = "ophanim.de"; domain = "ophanim.de";
administrators = [ { name = "derped"; id = 1337; } ]; administrators = [
mailAccounts = [ { name = "derped"; aliases = [ "postmaster" "baensch" ]; } ]; {
name = "derped";
id = 1337;
}
];
mailAccounts = [
{
name = "derped";
aliases = ["postmaster" "baensch"];
}
];
allowUnfree = true; allowUnfree = true;
conffiles = [ conffiles = [
"etcvars" "etcvars"
@ -23,26 +34,40 @@ in {
services = [ services = [
"acme" "acme"
"gitea" "gitea"
# "hydra" # "hydra"
"mailserver" "mailserver"
"mariaDB" "mariaDB"
"nextcloud" "nextcloud"
"nginx" "nginx"
"openssh" "openssh"
]; ];
vHosts = (let base = domain; in [ vHosts = let
{ domain = base; service = "simple"; } base = domain;
# { domain = "builder.${base}"; service = "hydra"; } in [
# { domain = "cache.${base}"; service = "cache"; } {
{ domain = "storage.${base}"; service = "nextcloud"; } domain = base;
{ domain = "mail.${base}"; service = "mail"; } service = "simple";
{ domain = "git.${base}"; service = "gitea"; } }
]); # { domain = "builder.${base}"; service = "hydra"; }
# { domain = "cache.${base}"; service = "cache"; }
{
domain = "storage.${base}";
service = "nextcloud";
}
{
domain = "mail.${base}";
service = "mail";
}
{
domain = "git.${base}";
service = "gitea";
}
];
firewall = { firewall = {
enable = true; enable = true;
allowPing = false; allowPing = false;
allowedUDPPorts = [ 22 80 443 7776 ]; allowedUDPPorts = [22 80 443 7776];
allowedTCPPorts = [ 80 443 7776 ]; allowedTCPPorts = [80 443 7776];
}; };
}; };
} }

View file

@ -1,6 +1,8 @@
{ config, lib, ... }:
{ {
config,
lib,
...
}: {
sops = { sops = {
defaultSopsFile = ./secrets.yaml; defaultSopsFile = ./secrets.yaml;
age = { age = {

View file

@ -1,21 +1,26 @@
{ config, pkgs, lib, ... }: {
config,
with lib; pkgs,
lib,
let ...
}:
with lib; let
cfg = config.system.copySysConf; cfg = config.system.copySysConf;
cfgPath = ../.; cfgPath = ../.;
copySysConf = if !(isStorePath cfgPath) then pkgs.stdenv.mkDerivation rec { copySysConf =
name = "NixOS_Configuration-${version}"; if !(isStorePath cfgPath)
version = commitIdFromGitRepo (cfgPath + "/.git"); then
pkgs.stdenv.mkDerivation rec {
name = "NixOS_Configuration-${version}";
version = commitIdFromGitRepo (cfgPath + "/.git");
src = cleanSource cfgPath; src = cleanSource cfgPath;
installPhase = ''
cp -R ./. $out
'';
} else (builtins.toPath ../.);
installPhase = ''
cp -R ./. $out
'';
}
else (builtins.toPath ../.);
in { in {
options.system.copySysConf = { options.system.copySysConf = {
enable = mkOption { enable = mkOption {

View file

@ -1,20 +1,15 @@
# Original Source: # Original Source:
# https://gitlab.com/rycee/nur-expressions/raw/master/hm-modules/emacs-init-defaults.nix (49ff2d63e867c09e658c959c0d8a73d641061c30) # https://gitlab.com/rycee/nur-expressions/raw/master/hm-modules/emacs-init-defaults.nix (49ff2d63e867c09e658c959c0d8a73d641061c30)
# MIT License # MIT License
# Copyright (c) 2019 Robert Helgesson # Copyright (c) 2019 Robert Helgesson
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights # in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is # copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions: # furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all # The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software. # copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -22,11 +17,7 @@
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
{pkgs, ...}: {
{ pkgs, ... }:
{
programs.emacs.init.usePackage = { programs.emacs.init.usePackage = {
deadgrep = { deadgrep = {
config = '' config = ''

View file

@ -1,20 +1,15 @@
# Original Source: # Original Source:
# https://gitlab.com/rycee/nur-expressions/raw/master/hm-modules/emacs-init.nix (d27525db3358b9463fab1b4a7739cb77e27b768c) # https://gitlab.com/rycee/nur-expressions/raw/master/hm-modules/emacs-init.nix (d27525db3358b9463fab1b4a7739cb77e27b768c)
# MIT License # MIT License
# Copyright (c) 2019 Robert Helgesson # Copyright (c) 2019 Robert Helgesson
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights # in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is # copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions: # furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all # The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software. # copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -22,14 +17,13 @@
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE. # SOFTWARE.
{
config,
{ config, lib, pkgs, ... }: lib,
pkgs,
with lib; ...
}:
let with lib; let
cfg = config.programs.emacs.init; cfg = config.programs.emacs.init;
packageFunctionType = mkOptionType { packageFunctionType = mkOptionType {
@ -39,15 +33,19 @@ let
merge = mergeOneOption; merge = mergeOneOption;
}; };
usePackageType = types.submodule ({ name, config, ... }: { usePackageType = types.submodule ({
name,
config,
...
}: {
options = { options = {
enable = mkEnableOption "Emacs package ${name}"; enable = mkEnableOption "Emacs package ${name}";
package = mkOption { package = mkOption {
type = type =
types.either types.either
(types.str // { description = "name of package"; }) (types.str // {description = "name of package";})
packageFunctionType; packageFunctionType;
default = name; default = name;
description = '' description = ''
The package to use for this module. Either the package name The package to use for this module. Either the package name
@ -83,7 +81,10 @@ let
chords = mkOption { chords = mkOption {
type = types.attrsOf types.str; type = types.attrsOf types.str;
default = {}; default = {};
example = { "jj" = "ace-jump-char-mode"; "jk" = "ace-jump-word-mode"; }; example = {
"jj" = "ace-jump-char-mode";
"jk" = "ace-jump-word-mode";
};
description = '' description = ''
The entries to use for <option>:chords</option>. The entries to use for <option>:chords</option>.
''; '';
@ -108,7 +109,10 @@ let
bind = mkOption { bind = mkOption {
type = types.attrsOf types.str; type = types.attrsOf types.str;
default = {}; default = {};
example = { "M-<up>" = "drag-stuff-up"; "M-<down>" = "drag-stuff-down"; }; example = {
"M-<up>" = "drag-stuff-up";
"M-<down>" = "drag-stuff-down";
};
description = '' description = ''
The entries to use for <option>:bind</option>. The entries to use for <option>:bind</option>.
''; '';
@ -117,7 +121,7 @@ let
bindLocal = mkOption { bindLocal = mkOption {
type = types.attrsOf (types.attrsOf types.str); type = types.attrsOf (types.attrsOf types.str);
default = {}; default = {};
example = { helm-command-map = { "C-c h" = "helm-execute-persistent-action"; }; }; example = {helm-command-map = {"C-c h" = "helm-execute-persistent-action";};};
description = '' description = ''
The entries to use for local keymaps in <option>:bind</option>. The entries to use for local keymaps in <option>:bind</option>.
''; '';
@ -126,7 +130,7 @@ let
bindKeyMap = mkOption { bindKeyMap = mkOption {
type = types.attrsOf types.str; type = types.attrsOf types.str;
default = {}; default = {};
example = { "C-c p" = "projectile-command-map"; }; example = {"C-c p" = "projectile-command-map";};
description = '' description = ''
The entries to use for <option>:bind-keymap</option>. The entries to use for <option>:bind-keymap</option>.
''; '';
@ -181,51 +185,51 @@ let
}; };
config = mkIf config.enable { config = mkIf config.enable {
assembly = assembly = let
let quoted = v: ''"${escape ["\""] v}"'';
quoted = v: ''"${escape ["\""] v}"''; mkBindHelper = cmd: prefix: bs:
mkBindHelper = cmd: prefix: bs: optionals (bs != {}) (
optionals (bs != {}) ( [":${cmd} (${prefix}"]
[ ":${cmd} (${prefix}" ] ++ mapAttrsToList (n: v: " (${quoted n} . ${v})") bs
++ mapAttrsToList (n: v: " (${quoted n} . ${v})") bs ++ [")"]
++ [ ")" ]
); );
mkAfter = vs: optional (vs != []) ":after (${toString vs})"; mkAfter = vs: optional (vs != []) ":after (${toString vs})";
mkCommand = vs: optional (vs != []) ":commands (${toString vs})"; mkCommand = vs: optional (vs != []) ":commands (${toString vs})";
mkDiminish = vs: optional (vs != []) ":diminish (${toString vs})"; mkDiminish = vs: optional (vs != []) ":diminish (${toString vs})";
mkMode = map (v: ":mode ${v}"); mkMode = map (v: ":mode ${v}");
mkBind = mkBindHelper "bind" ""; mkBind = mkBindHelper "bind" "";
mkBindLocal = bs: mkBindLocal = bs: let
let mkMap = n: v: mkBindHelper "bind" ":map ${n}" v;
mkMap = n: v: mkBindHelper "bind" ":map ${n}" v;
in
flatten (mapAttrsToList mkMap bs);
mkBindKeyMap = mkBindHelper "bind-keymap" "";
mkChords = mkBindHelper "chords" "";
mkHook = map (v: ":hook ${v}");
mkDefer = v:
if isBool v then optional v ":defer t"
else [ ":defer ${toString v}" ];
mkDemand = v: optional v ":demand t";
in in
concatStringsSep "\n " ( flatten (mapAttrsToList mkMap bs);
[ "(use-package ${name}" ] mkBindKeyMap = mkBindHelper "bind-keymap" "";
++ mkAfter config.after mkChords = mkBindHelper "chords" "";
++ mkBind config.bind mkHook = map (v: ":hook ${v}");
++ mkBindKeyMap config.bindKeyMap mkDefer = v:
++ mkBindLocal config.bindLocal if isBool v
++ mkChords config.chords then optional v ":defer t"
++ mkCommand config.command else [":defer ${toString v}"];
++ mkDefer config.defer mkDemand = v: optional v ":demand t";
++ mkDemand config.demand in
++ mkDiminish config.diminish concatStringsSep "\n " (
++ mkHook config.hook ["(use-package ${name}"]
++ mkMode config.mode ++ mkAfter config.after
++ optionals (config.init != "") [ ":init" config.init ] ++ mkBind config.bind
++ optionals (config.config != "") [ ":config" config.config ] ++ mkBindKeyMap config.bindKeyMap
++ optional (config.extraConfig != "") config.extraConfig ++ mkBindLocal config.bindLocal
) + ")"; ++ mkChords config.chords
++ mkCommand config.command
++ mkDefer config.defer
++ mkDemand config.demand
++ mkDiminish config.diminish
++ mkHook config.hook
++ mkMode config.mode
++ optionals (config.init != "") [":init" config.init]
++ optionals (config.config != "") [":config" config.config]
++ optional (config.extraConfig != "") config.extraConfig
)
+ ")";
}; };
}); });
@ -234,17 +238,20 @@ let
${pkgConfStr}) ${pkgConfStr})
''; '';
mkRecommendedOption = type: extraDescription: mkOption { mkRecommendedOption = type: extraDescription:
type = types.bool; mkOption {
default = false; type = types.bool;
example = true; default = false;
description = '' example = true;
Whether to enable recommended ${type} settings. description =
'' + optionalString (extraDescription != "") '' ''
</para><para> Whether to enable recommended ${type} settings.
${extraDescription} ''
''; + optionalString (extraDescription != "") ''
}; </para><para>
${extraDescription}
'';
};
# Recommended GC settings. # Recommended GC settings.
gcSettings = '' gcSettings = ''
@ -285,7 +292,7 @@ let
hasBind = any (p: p.bind != {}) (attrValues cfg.usePackage); hasBind = any (p: p.bind != {}) (attrValues cfg.usePackage);
# Whether the configuration makes use of `:chords`. # Whether the configuration makes use of `:chords`.
hasChords = any ( p: p.chords != {}) (attrValues cfg.usePackage); hasChords = any (p: p.chords != {}) (attrValues cfg.usePackage);
usePackageSetup = usePackageSetup =
'' ''
@ -300,8 +307,10 @@ let
;; To help fixing issues during startup. ;; To help fixing issues during startup.
(setq use-package-verbose ${ (setq use-package-verbose ${
if cfg.usePackageVerbose then "t" else "nil" if cfg.usePackageVerbose
})) then "t"
else "nil"
}))
'' ''
+ optionalString hasDiminish '' + optionalString hasDiminish ''
;; For :diminish in (use-package). ;; For :diminish in (use-package).
@ -317,53 +326,51 @@ let
:config (key-chord-mode 1)) :config (key-chord-mode 1))
''; '';
initFile = '' initFile =
;;; hm-init.el --- Emacs configuration à la Home Manager. ''
;; ;;; hm-init.el --- Emacs configuration à la Home Manager.
;; -*- lexical-binding: t; -*- ;;
;; ;; -*- lexical-binding: t; -*-
;;; Commentary: ;;
;; ;;; Commentary:
;; A configuration generated from a Nix based configuration by ;;
;; Home Manager. ;; A configuration generated from a Nix based configuration by
;; ;; Home Manager.
;;; Code: ;;
;;; Code:
${optionalString cfg.startupTimer '' ${optionalString cfg.startupTimer ''
;; Remember when configuration started. See bottom for rest of this. ;; Remember when configuration started. See bottom for rest of this.
;; Idea taken from http://writequit.org/org/settings.html. ;; Idea taken from http://writequit.org/org/settings.html.
(defconst emacs-start-time (current-time)) (defconst emacs-start-time (current-time))
''} ''}
${optionalString cfg.recommendedGcSettings gcSettings} ${optionalString cfg.recommendedGcSettings gcSettings}
${cfg.prelude} ${cfg.prelude}
${usePackageSetup} ${usePackageSetup}
'' ''
+ concatStringsSep "\n\n" + concatStringsSep "\n\n"
(map (getAttr "assembly") (map (getAttr "assembly")
(filter (getAttr "enable") (filter (getAttr "enable")
(attrValues cfg.usePackage))) (attrValues cfg.usePackage)))
+ '' + ''
${cfg.postlude} ${cfg.postlude}
${optionalString cfg.startupTimer '' ${optionalString cfg.startupTimer ''
;; Make a note of how long the configuration part of the start took. ;; Make a note of how long the configuration part of the start took.
(let ((elapsed (float-time (time-subtract (current-time) (let ((elapsed (float-time (time-subtract (current-time)
emacs-start-time)))) emacs-start-time))))
(message "Loading settings...done (%.3fs)" elapsed)) (message "Loading settings...done (%.3fs)" elapsed))
''} ''}
(provide 'hm-init) (provide 'hm-init)
;; hm-init.el ends here ;; hm-init.el ends here
''; '';
in {
in imports = [./emacs-init-defaults.nix];
{
imports = [ ./emacs-init-defaults.nix ];
options.programs.emacs.init = { options.programs.emacs.init = {
enable = mkEnableOption "Emacs configuration"; enable = mkEnableOption "Emacs configuration";
@ -412,29 +419,31 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
machine.pkgsets.emacs.pkgs = epkgs: machine.pkgsets.emacs.pkgs = epkgs: let
let getPkg = v:
getPkg = v: if isFunction v
if isFunction v then [ (v epkgs) ] then [(v epkgs)]
else optional (isString v && hasAttr v epkgs) epkgs.${v}; else optional (isString v && hasAttr v epkgs) epkgs.${v};
in in
[ epkgs.use-package ] [epkgs.use-package]
++ optional hasBind epkgs.bind-key ++ optional hasBind epkgs.bind-key
++ optional hasDiminish epkgs.diminish ++ optional hasDiminish epkgs.diminish
++ optional hasChords epkgs.use-package-chords ++ optional hasChords epkgs.use-package-chords
++ ( ++ (
concatMap (v: getPkg (v.package)) concatMap (v: getPkg (v.package))
(builtins.attrValues cfg.usePackage) (builtins.attrValues cfg.usePackage)
); );
# use lucid as toolkit; emacs will otherwise crash quite frequently when run in daemon mode # use lucid as toolkit; emacs will otherwise crash quite frequently when run in daemon mode
# https://gitlab.gnome.org/GNOME/gtk/issues/221 # https://gitlab.gnome.org/GNOME/gtk/issues/221
machine.pkgsets.emacs.pkgwrap = let machine.pkgsets.emacs.pkgwrap = let
emacsWithPackages = (pkgs.emacsPackagesFor emacsWithPackages =
(pkgs.emacs.override { (pkgs.emacsPackagesFor
withGTK2 = false; (pkgs.emacs.override {
withGTK3 = false; withGTK2 = false;
})).emacsWithPackages; withGTK3 = false;
}))
.emacsWithPackages;
in (emacsWithPackages config.machine.pkgsets.emacs.pkgs); in (emacsWithPackages config.machine.pkgsets.emacs.pkgs);
environment.systemPackages = [ environment.systemPackages = [

View file

@ -1,9 +1,11 @@
{ config, lib, fn, ... }: {
config,
lib,
fn,
...
}:
with builtins; with builtins;
with lib; with lib; let
let
cfg = config.machine; cfg = config.machine;
pkgsetList = fn.makeOptionTypeList (toString ../pkgsets); pkgsetList = fn.makeOptionTypeList (toString ../pkgsets);
serviceList = fn.makeOptionTypeList (toString ../services); serviceList = fn.makeOptionTypeList (toString ../services);
@ -11,8 +13,8 @@ let
name = pname; name = pname;
value = rec { value = rec {
pkgwrap = mkOption { pkgwrap = mkOption {
type = with types; oneOf [ package (listOf package) ]; type = with types; oneOf [package (listOf package)];
default = (fn.pkgFilter cfg.pkgsets."${pname}".pkgs); default = fn.pkgFilter cfg.pkgsets."${pname}".pkgs;
description = '' description = ''
Package Wrapper for packages using a wrapper function (like python, emacs, haskell, ...) Package Wrapper for packages using a wrapper function (like python, emacs, haskell, ...)
''; '';
@ -29,8 +31,8 @@ let
in { in {
options.machine = { options.machine = {
pkgs = mkOption { pkgs = mkOption {
type = (types.listOf (types.enum pkgsetList)); type = types.listOf (types.enum pkgsetList);
default = [ "base" ]; default = ["base"];
description = '' description = ''
The list of metapackages to be installed. The list of metapackages to be installed.
''; '';
@ -38,7 +40,7 @@ in {
# Package names containing '::' are sub packages and should not have their own pkgset. # Package names containing '::' are sub packages and should not have their own pkgset.
pkgsets = listToAttrs (map pkgOption (lists.filter (v: !(strings.hasInfix "::" v)) pkgsetList)); pkgsets = listToAttrs (map pkgOption (lists.filter (v: !(strings.hasInfix "::" v)) pkgsetList));
services = mkOption { services = mkOption {
type = (types.listOf (types.enum serviceList)); type = types.listOf (types.enum serviceList);
default = []; default = [];
description = '' description = ''
List of services to be enabled. List of services to be enabled.
@ -46,7 +48,7 @@ in {
}; };
conffiles = mkOption { conffiles = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ "zsh" ]; default = ["zsh"];
description = '' description = ''
List of configuration files to be enabled. List of configuration files to be enabled.
''; '';
@ -116,7 +118,7 @@ in {
}; };
}; };
imports = [ imports = [
(mkAliasOptionModule [ "machine" "firewall" ] [ "networking" "firewall" ]) (mkAliasOptionModule ["machine" "firewall"] ["networking" "firewall"])
(mkAliasOptionModule [ "machine" "allowUnfree" ] [ "nixpkgs" "config" "allowUnfree" ]) (mkAliasOptionModule ["machine" "allowUnfree"] ["nixpkgs" "config" "allowUnfree"])
]; ];
} }

View file

@ -1,10 +1,29 @@
{ stdenv, buildPythonPackage, fetchgit {
, aiosmtpd, alembic, atpublic, click, dnspython, falcon, flufl_bounce, flufl_i18n, flufl_lock stdenv,
, importlib-resources, lazr_config, passlib, requests, sqlalchemy buildPythonPackage,
, zope_component, zope_configuration, zope_event, zope_interface fetchgit,
# optional database dependencies aiosmtpd,
, pymysql, psycopg2 }: alembic,
atpublic,
click,
dnspython,
falcon,
flufl_bounce,
flufl_i18n,
flufl_lock,
importlib-resources,
lazr_config,
passlib,
requests,
sqlalchemy,
zope_component,
zope_configuration,
zope_event,
zope_interface,
# optional database dependencies
pymysql,
psycopg2,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "mailman3_core-${version}"; name = "mailman3_core-${version}";
version = "3.2.2"; version = "3.2.2";
@ -33,7 +52,8 @@ buildPythonPackage rec {
zope_configuration zope_configuration
zope_event zope_event
zope_interface zope_interface
pymysql psycopg2 pymysql
psycopg2
]; ];
doCheck = false; doCheck = false;
@ -48,7 +68,7 @@ buildPythonPackage rec {
meta = with stdenv.lib; { meta = with stdenv.lib; {
description = "GNU Mailman, a mailing list management system"; description = "GNU Mailman, a mailing list management system";
license = licenses.gpl3; license = licenses.gpl3;
maintainers = with maintainers; [ ]; maintainers = with maintainers; [];
homepage = http://list.org/; homepage = http://list.org/;
}; };
} }

View file

@ -1,14 +1,18 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, atpublic }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
atpublic,
}:
buildPythonPackage rec { buildPythonPackage rec {
pname = "aiosmtpd"; pname = "aiosmtpd";
version = "1.2"; version = "1.2";
src = fetchPypi { src = fetchPypi {
inherit pname version; inherit pname version;
sha256 = "1xdfk741pjmz1cm8dsi4n5vq4517i175rm94696m3f7kcgk7xsmp"; sha256 = "1xdfk741pjmz1cm8dsi4n5vq4517i175rm94696m3f7kcgk7xsmp";
}; };
doCheck = false; doCheck = false;
propagatedBuildInputs = [ atpublic ]; propagatedBuildInputs = [atpublic];
} }

View file

@ -1,13 +1,17 @@
{ stdenv, lib, fetchPypi, buildPythonPackage }: {
stdenv,
lib,
fetchPypi,
buildPythonPackage,
}:
buildPythonPackage rec { buildPythonPackage rec {
pname = "atpublic"; pname = "atpublic";
version = "1.0"; version = "1.0";
src = fetchPypi { src = fetchPypi {
inherit pname version; inherit pname version;
sha256 = "0i3sbxkdlbb4560rrlmwwd5y4ps7k73lp4d8wnmd7ag9k426gjkx"; sha256 = "0i3sbxkdlbb4560rrlmwwd5y4ps7k73lp4d8wnmd7ag9k426gjkx";
}; };
doCheck = false; doCheck = false;
# propagatedBuildInputs = []; # propagatedBuildInputs = [];
} }

View file

@ -1,6 +1,11 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, atpublic, zope_interface }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
atpublic,
zope_interface,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "${pname}-${version}"; name = "${pname}-${version}";
pname = "flufl.bounce"; pname = "flufl.bounce";
@ -11,7 +16,7 @@ buildPythonPackage rec {
sha256 = "0k5kjqa3x6gvwwxyzb2vwi1g1i6asm1zw5fivylxz3d583y4kid2"; sha256 = "0k5kjqa3x6gvwwxyzb2vwi1g1i6asm1zw5fivylxz3d583y4kid2";
}; };
propagatedBuildInputs = [ atpublic zope_interface ]; propagatedBuildInputs = [atpublic zope_interface];
doCheck = false; doCheck = false;
} }

View file

@ -1,6 +1,10 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, atpublic }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
atpublic,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "${pname}-${version}"; name = "${pname}-${version}";
pname = "flufl.i18n"; pname = "flufl.i18n";
@ -11,7 +15,7 @@ buildPythonPackage rec {
sha256 = "1csgds59nx0ann9v2alqr69lakp1cnc1ikmbgn96l6n23js7c2ah"; sha256 = "1csgds59nx0ann9v2alqr69lakp1cnc1ikmbgn96l6n23js7c2ah";
}; };
propagatedBuildInputs = [ atpublic ]; propagatedBuildInputs = [atpublic];
doCheck = false; doCheck = false;
} }

View file

@ -1,6 +1,10 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, atpublic }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
atpublic,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "${pname}-${version}"; name = "${pname}-${version}";
pname = "flufl.lock"; pname = "flufl.lock";
@ -11,7 +15,7 @@ buildPythonPackage rec {
sha256 = "0nzzd6l30ff6cwsrlrb94xzfja4wkyrqv3ydc6cz0hdbr766mmm8"; sha256 = "0nzzd6l30ff6cwsrlrb94xzfja4wkyrqv3ydc6cz0hdbr766mmm8";
}; };
propagatedBuildInputs = [ atpublic ]; propagatedBuildInputs = [atpublic];
doCheck = false; doCheck = false;
} }

View file

@ -1,6 +1,10 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, lazr_delegates }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
lazr_delegates,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "${pname}-${version}"; name = "${pname}-${version}";
pname = "lazr.config"; pname = "lazr.config";
@ -11,7 +15,7 @@ buildPythonPackage rec {
sha256 = "1s7pyvlq06qjrkaw9r6nc290lb095n25ybzgavvy51ygpxkgqxwn"; sha256 = "1s7pyvlq06qjrkaw9r6nc290lb095n25ybzgavvy51ygpxkgqxwn";
}; };
propagatedBuildInputs = [ lazr_delegates ]; propagatedBuildInputs = [lazr_delegates];
doCheck = false; doCheck = false;
} }

View file

@ -1,6 +1,11 @@
{ stdenv, lib, fetchPypi, buildPythonPackage {
, nose, zope_interface }: stdenv,
lib,
fetchPypi,
buildPythonPackage,
nose,
zope_interface,
}:
buildPythonPackage rec { buildPythonPackage rec {
name = "${pname}-${version}"; name = "${pname}-${version}";
pname = "lazr.delegates"; pname = "lazr.delegates";
@ -11,7 +16,7 @@ buildPythonPackage rec {
sha256 = "1rdnl85j9ayp8n85l0ciip621j9dcziz5qnmv2m7krgwgcn31vfx"; sha256 = "1rdnl85j9ayp8n85l0ciip621j9dcziz5qnmv2m7krgwgcn31vfx";
}; };
propagatedBuildInputs = [ nose zope_interface ]; propagatedBuildInputs = [nose zope_interface];
doCheck = false; doCheck = false;
} }

View file

@ -1,9 +1,11 @@
{ pkgs, lib, config, ... }: {
pkgs,
with lib; lib,
config,
let ...
mailman3 = import ./release.nix { }; }:
with lib; let
mailman3 = import ./release.nix {};
cfg = config.services.mailman3; cfg = config.services.mailman3;
usePostgresql = cfg.database.type == "postgresql"; usePostgresql = cfg.database.type == "postgresql";
useSqlite = cfg.database.type == "sqlite3"; useSqlite = cfg.database.type == "sqlite3";
@ -102,7 +104,7 @@ in {
database = { database = {
type = mkOption { type = mkOption {
type = types.enum [ "sqlite3" "mysql" "postgres" ]; type = types.enum ["sqlite3" "mysql" "postgres"];
default = "sqlite3"; default = "sqlite3";
example = "mysql"; example = "mysql";
description = '' description = ''
@ -271,7 +273,7 @@ in {
mta = { mta = {
# TODO: add Sentmail and qmail # TODO: add Sentmail and qmail
type = mkOption { type = mkOption {
type = types.enum [ "postfix" "exim4" ]; type = types.enum ["postfix" "exim4"];
default = "postfix"; default = "postfix";
example = "exim4"; example = "exim4";
description = '' description = ''
@ -357,7 +359,6 @@ in {
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
users = mkIf (cfg.user == "mailman3") { users = mkIf (cfg.user == "mailman3") {
users.mailman3 = { users.mailman3 = {
@ -365,7 +366,7 @@ in {
home = cfg.paths.var_dir; home = cfg.paths.var_dir;
createHome = true; createHome = true;
useDefaultShell = true; useDefaultShell = true;
packages = [ mailman3.core ]; packages = [mailman3.core];
}; };
}; };
@ -374,25 +375,25 @@ in {
services.postfix.mapFiles."local_recipient_maps" = mkIf usePostfix (mkDefault "${cfg.paths.data_dir}/postfix_lmtp"); services.postfix.mapFiles."local_recipient_maps" = mkIf usePostfix (mkDefault "${cfg.paths.data_dir}/postfix_lmtp");
services.postfix.mapFiles."relay_domains" = mkIf usePostfix (mkDefault "${cfg.paths.data_dir}/postfix_domains"); services.postfix.mapFiles."relay_domains" = mkIf usePostfix (mkDefault "${cfg.paths.data_dir}/postfix_domains");
warnings = optional (cfg.database.password != "") warnings =
''config.services.mailman3.database.password will be stored as plaintext optional (cfg.database.password != "")
in the Nix store. Use database.passwordFile instead.''; '' config.services.mailman3.database.password will be stored as plaintext
in the Nix store. Use database.passwordFile instead.'';
# Create database passwordFile default when password is configured. # Create database passwordFile default when password is configured.
services.mailman3.database.passwordFile = services.mailman3.database.passwordFile = mkDefault (toString (pkgs.writeTextFile {
(mkDefault (toString (pkgs.writeTextFile { name = "mailman3-database-password";
name = "mailman3-database-password"; text = cfg.database.password;
text = cfg.database.password; }));
})));
systemd.services.mailman3 = { systemd.services.mailman3 = {
description = "GNU Mailing List Manager"; description = "GNU Mailing List Manager";
after = [ "network.target" ] ++ lib.optional usePostgresql "postgresql.service" ++ lib.optional useMysql "mysql.service"; after = ["network.target"] ++ lib.optional usePostgresql "postgresql.service" ++ lib.optional useMysql "mysql.service";
wantedBy = [ "multi-user.target" ]; wantedBy = ["multi-user.target"];
preStart = let preStart = let
dbpass = (fileContents cfg.database.passwordFile); dbpass = fileContents cfg.database.passwordFile;
smtppass = (fileContents cfg.mta.smtp_passFile); smtppass = fileContents cfg.mta.smtp_passFile;
in '' in ''
mkdir -p ${cfg.paths.etc_dir} mkdir -p ${cfg.paths.etc_dir}
cp ${configFile} ${cfg.paths.etc_dir}/mailman.cfg cp ${configFile} ${cfg.paths.etc_dir}/mailman.cfg

View file

@ -1,8 +1,9 @@
{ pkgs ? import <nixpkgs> {}, python3Packages ? pkgs.python3Packages }: {
pkgs ? import <nixpkgs> {},
let python3Packages ? pkgs.python3Packages,
}: let
mailman3 = { mailman3 = {
core = python3Packages.callPackage ./core.nix ( with deps; { core = python3Packages.callPackage ./core.nix (with deps; {
inherit aiosmtpd atpublic flufl_bounce flufl_i18n flufl_lock lazr_config; inherit aiosmtpd atpublic flufl_bounce flufl_i18n flufl_lock lazr_config;
}); });
}; };
@ -10,7 +11,7 @@ let
aiosmtpd = python3Packages.callPackage ./extraPackages/aiosmtpd.nix { aiosmtpd = python3Packages.callPackage ./extraPackages/aiosmtpd.nix {
inherit atpublic; inherit atpublic;
}; };
atpublic = python3Packages.callPackage ./extraPackages/atpublic.nix { }; atpublic = python3Packages.callPackage ./extraPackages/atpublic.nix {};
flufl_bounce = python3Packages.callPackage ./extraPackages/flufl_bounce.nix { flufl_bounce = python3Packages.callPackage ./extraPackages/flufl_bounce.nix {
inherit atpublic; inherit atpublic;
}; };
@ -23,6 +24,7 @@ let
lazr_config = python3Packages.callPackage ./extraPackages/lazr_config.nix { lazr_config = python3Packages.callPackage ./extraPackages/lazr_config.nix {
inherit lazr_delegates; inherit lazr_delegates;
}; };
lazr_delegates = python3Packages.callPackage ./extraPackages/lazr_delegates.nix { }; lazr_delegates = python3Packages.callPackage ./extraPackages/lazr_delegates.nix {};
}; };
in mailman3 in
mailman3

View file

@ -1,5 +1,8 @@
{ stdenv, fetchFromGitHub, gtk-engine-murrine }: {
stdenv,
fetchFromGitHub,
gtk-engine-murrine,
}:
stdenv.mkDerivation { stdenv.mkDerivation {
version = "1.0"; version = "1.0";
name = "Flat-Remix-GTK"; name = "Flat-Remix-GTK";
@ -10,6 +13,6 @@ stdenv.mkDerivation {
sha256 = "0rfv75w9yr8drc3x9g4iz2cb88ixy1lqbflvmb7farw4dz74fk5f"; sha256 = "0rfv75w9yr8drc3x9g4iz2cb88ixy1lqbflvmb7farw4dz74fk5f";
fetchSubmodules = true; fetchSubmodules = true;
}; };
makeFlags = [ "PREFIX=$(out)" ]; makeFlags = ["PREFIX=$(out)"];
propagatedUserEnvPkgs = [ gtk-engine-murrine ]; propagatedUserEnvPkgs = [gtk-engine-murrine];
} }

View file

@ -1,20 +1,24 @@
{ config, lib, pkgs, {
nixpkgs-unstable, nixpkgs-stable, nixpkgs-git, config,
... }: lib,
pkgs,
let nixpkgs-unstable,
nixpkgs-stable,
nixpkgs-git,
...
}: let
callPackage = pkgs.callPackage; callPackage = pkgs.callPackage;
in { in {
nixpkgs = { nixpkgs = {
config = { config = {
allowUnfree = true; allowUnfree = true;
mpv.vaapiSupport = (lib.elem "xserver" config.machine.services); mpv.vaapiSupport = lib.elem "xserver" config.machine.services;
packageOverrides = { packageOverrides = {
pyluxafor = pkgs.python3Packages.callPackage ./pyluxafor {}; pyluxafor = pkgs.python3Packages.callPackage ./pyluxafor {};
theme_flat-remix = callPackage ./flat-remix { }; theme_flat-remix = callPackage ./flat-remix {};
theme_sddm_midnight = callPackage ./sddm_midnight { }; theme_sddm_midnight = callPackage ./sddm_midnight {};
xdiskusage = callPackage ./xdiskusage { }; xdiskusage = callPackage ./xdiskusage {};
}; };
}; };
overlays = [ overlays = [

View file

@ -1,5 +1,9 @@
{ fetchFromGitHub, buildPythonApplication, click, pyusb }: {
fetchFromGitHub,
buildPythonApplication,
click,
pyusb,
}:
buildPythonApplication rec { buildPythonApplication rec {
pname = "pyluxafor"; pname = "pyluxafor";
version = "0.1.0"; version = "0.1.0";
@ -14,5 +18,5 @@ buildPythonApplication rec {
substituteInPlace setup.py --replace '"click>=6.0,<=6.7.99",' "" substituteInPlace setup.py --replace '"click>=6.0,<=6.7.99",' ""
substituteInPlace setup.py --replace '"pyusb==1.0.0",' "" substituteInPlace setup.py --replace '"pyusb==1.0.0",' ""
''; '';
propagatedBuildInputs = [ click pyusb ]; propagatedBuildInputs = [click pyusb];
} }

View file

@ -1,17 +1,20 @@
{ stdenv, fetchFromGitHub, qtstyleplugin-kvantum-qt4 }: {
stdenv,
fetchFromGitHub,
qtstyleplugin-kvantum-qt4,
}:
stdenv.mkDerivation { stdenv.mkDerivation {
name = "sddm_midnight"; name = "sddm_midnight";
version = 1.0; version = 1.0;
src = fetchFromGitHub { src = fetchFromGitHub {
owner = "Rokin05"; owner = "Rokin05";
repo = "midnight-kde"; repo = "midnight-kde";
rev = "1a4771146a8d6f3b45b1da32877495c9e562d193"; rev = "1a4771146a8d6f3b45b1da32877495c9e562d193";
sha256 = "10br96pf4dppk9nk7yvf7h9zja40k4c6rhwmqcaxxcjlhpvjmhkj"; sha256 = "10br96pf4dppk9nk7yvf7h9zja40k4c6rhwmqcaxxcjlhpvjmhkj";
}; };
buildInputs = [ qtstyleplugin-kvantum-qt4 ]; buildInputs = [qtstyleplugin-kvantum-qt4];
patchPhase = '' patchPhase = ''
substituteInPlace sddm/themes/Midnight/Main.qml --replace /usr $out substituteInPlace sddm/themes/Midnight/Main.qml --replace /usr $out

View file

@ -1,18 +1,26 @@
{ config, lib, fn, pkgs, ... }: {
config,
with lib; lib,
fn,
let pkgs,
...
}:
with lib; let
cfg = config.machine; cfg = config.machine;
pkgsets = fn.lst { p = (toString ../pkgsets); b = true;}; pkgsets = fn.lst {
p = toString ../pkgsets;
b = true;
};
in { in {
imports = pkgsets; imports = pkgsets;
environment.systemPackages = flatten environment.systemPackages =
flatten
(lists.forEach (lists.forEach
(attrVals (attrVals
(filter (filter
(v: !(strings.hasInfix "::" v)) cfg.pkgs) (v: !(strings.hasInfix "::" v))
cfg.pkgs)
cfg.pkgsets) cfg.pkgsets)
(v: v.pkgwrap)); (v: v.pkgwrap));

View file

@ -1,10 +1,13 @@
{ stdenv, fetchurl, fltk }: {
stdenv,
fetchurl,
fltk,
}:
stdenv.mkDerivation rec { stdenv.mkDerivation rec {
name = "xdiskusage"; name = "xdiskusage";
version = "1.51"; version = "1.51";
buildInputs = [ fltk ]; buildInputs = [fltk];
src = fetchurl { src = fetchurl {
url = "http://xdiskusage.sourceforge.net/${name}-${version}.tgz"; url = "http://xdiskusage.sourceforge.net/${name}-${version}.tgz";

View file

@ -1,9 +1,12 @@
# Programms I'm likely to want on every machine and/or may execute as root # Programms I'm likely to want on every machine and/or may execute as root
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.base.pkgs = with pkgs; [ config.machine.pkgsets.base.pkgs = with pkgs; [
age sops age
sops
bat bat
ccze ccze
cryptsetup cryptsetup
@ -54,7 +57,8 @@
whois whois
wirelesstools wirelesstools
wpa_supplicant wpa_supplicant
zip unzipNLS zip
unzipNLS
zlib zlib
zsh zsh
]; ];

View file

@ -1,6 +1,8 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.cpp.pkgs = with pkgs; [ config.machine.pkgsets.cpp.pkgs = with pkgs; [
clang clang
cmake cmake

View file

@ -1,9 +1,11 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.dict.pkgs = with pkgs; [ config.machine.pkgsets.dict.pkgs = with pkgs; [
translate-shell translate-shell
( hunspellWithDicts (with pkgs.hunspellDicts; [ de-de en-us ] )) (hunspellWithDicts (with pkgs.hunspellDicts; [de-de en-us]))
( aspellWithDicts (d: with d; [ de en en-computers en-science ] )) (aspellWithDicts (d: with d; [de en en-computers en-science]))
]; ];
} }

View file

@ -1,16 +1,24 @@
{ config, lib, fn, pkgs, ... }: {
config,
with lib; lib,
fn,
let pkgs,
modefiles = fn.lst { p = (toString ./emacs); b = true; }; ...
}:
with lib; let
modefiles = fn.lst {
p = toString ./emacs;
b = true;
};
in rec { in rec {
imports = [ imports =
../options/emacs-init.nix [
] ++ modefiles; ../options/emacs-init.nix
]
++ modefiles;
programs.emacs.init = { programs.emacs.init = {
enable = (elem "emacs" config.machine.pkgs); enable = elem "emacs" config.machine.pkgs;
recommendedGcSettings = true; recommendedGcSettings = true;
prelude = '' prelude = ''

View file

@ -1,8 +1,10 @@
{ config, lib, pkgs, ... }: {
config,
with lib; lib,
pkgs,
let ...
}:
with lib; let
# Source: https://github.com/Henry/dot-emacs/blob/master/my-lisp/company-pcomplete.el # Source: https://github.com/Henry/dot-emacs/blob/master/my-lisp/company-pcomplete.el
company-pcomplete = pkgs.writeText "company-pcomplete.el" '' company-pcomplete = pkgs.writeText "company-pcomplete.el" ''
;;; company-pcomplete.el --- company-mode pcomplete backend -*- lexical-binding: t -*- ;;; company-pcomplete.el --- company-mode pcomplete backend -*- lexical-binding: t -*-
@ -95,77 +97,80 @@ let
(provide 'company-pcomplete) (provide 'company-pcomplete)
''; '';
in mkIf (elem "emacs::company" config.machine.pkgs) { in
programs.emacs.init.usePackage = { mkIf (elem "emacs::company" config.machine.pkgs) {
company = { programs.emacs.init.usePackage = {
enable = true; company = {
package = epkgs: [ epkgs.company epkgs.company-web ]; enable = true;
diminish = [ "company-mode" ]; package = epkgs: [epkgs.company epkgs.company-web];
hook = [ "(after-init . global-company-mode)" ] diminish = ["company-mode"];
++ optional (elem "emacs::rust" config.machine.pkgs) hook =
''(rust-mode . (lambda () (setq company-backends '((company-capf :with company-yasnippet)))))'' ["(after-init . global-company-mode)"]
++ optional (elem "emacs::web-mode" config.machine.pkgs) ++ optional (elem "emacs::rust" config.machine.pkgs)
''(web-mode . (lambda () (set (make-local-variable 'company-backends) '(company-web-html company-css)) ''(rust-mode . (lambda () (setq company-backends '((company-capf :with company-yasnippet)))))''
(company-mode t)))''; ++ optional (elem "emacs::web-mode" config.machine.pkgs)
bind = { "\t" = "'company-complete-common"; }; '' (web-mode . (lambda () (set (make-local-variable 'company-backends) '(company-web-html company-css))
init = ''(require 'ffap)''; (company-mode t)))'';
config = '' bind = {"\t" = "'company-complete-common";};
;; (setq company-tooltip-align-annotations t) init = ''(require 'ffap)'';
(setq company-idle-delay 0.3 config = ''
company-show-numbers t) ;; (setq company-tooltip-align-annotations t)
(setq company-idle-delay 0.3
company-show-numbers t)
${optionalString ${
(elem "emacs::org" config.machine.pkgs) '' optionalString
(load-file "${company-pcomplete}")'' (elem "emacs::org" config.machine.pkgs) ''
} (load-file "${company-pcomplete}")''
''; }
extraConfig = '' '';
:bind (:map company-mode-map extraConfig = ''
([remap completion-at-point] . company-complete-common) :bind (:map company-mode-map
([remap complete-symbol] . company-complete-common)) ([remap completion-at-point] . company-complete-common)
''; ([remap complete-symbol] . company-complete-common))
'';
};
company-box = {
enable = true;
hook = ["(company-mode . (lambda () (company-box-mode)))"];
config = ''
(setq company-box-icons-alist 'company-box-icons-all-the-icons)
(setq company-box-icons-lsp
`(( 1 . ,(all-the-icons-faicon "file-text-o" :v-adjust -0.0575)) ; Text
( 2 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Method
( 3 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Function
( 4 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Constructor
( 5 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Field
( 6 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Variable
( 7 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Class
( 8 . ,(all-the-icons-faicon "cogs" :v-adjust -0.0575)) ; Interface
( 9 . ,(all-the-icons-alltheicon "less")) ; Module
(10 . ,(all-the-icons-faicon "wrench" :v-adjust -0.0575)) ; Property
(11 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Unit
(12 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Value
(13 . ,(all-the-icons-material "content_copy" :v-adjust -0.2)) ; Enum
(14 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Keyword
(15 . ,(all-the-icons-material "content_paste" :v-adjust -0.2)) ; Snippet
(16 . ,(all-the-icons-material "palette" :v-adjust -0.2)) ; Color
(17 . ,(all-the-icons-faicon "file" :v-adjust -0.0575)) ; File
(18 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Reference
(19 . ,(all-the-icons-faicon "folder" :v-adjust -0.0575)) ; Folder
(20 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; EnumMember
(21 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Constant
(22 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Struct
(23 . ,(all-the-icons-faicon "bolt" :v-adjust -0.0575)) ; Event
(24 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Operator
(25 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; TypeParameter
))
'';
};
all-the-icons = {enable = true;};
company-jedi = {
enable = elem "emacs::elpy" config.machine.pkgs;
};
}; };
fonts.packages = pkgs.emacs-all-the-icons-fonts.all;
company-box = { }
enable = true;
hook = [ "(company-mode . (lambda () (company-box-mode)))" ];
config = ''
(setq company-box-icons-alist 'company-box-icons-all-the-icons)
(setq company-box-icons-lsp
`(( 1 . ,(all-the-icons-faicon "file-text-o" :v-adjust -0.0575)) ; Text
( 2 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Method
( 3 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Function
( 4 . ,(all-the-icons-faicon "cube" :v-adjust -0.0575)) ; Constructor
( 5 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Field
( 6 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Variable
( 7 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Class
( 8 . ,(all-the-icons-faicon "cogs" :v-adjust -0.0575)) ; Interface
( 9 . ,(all-the-icons-alltheicon "less")) ; Module
(10 . ,(all-the-icons-faicon "wrench" :v-adjust -0.0575)) ; Property
(11 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Unit
(12 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Value
(13 . ,(all-the-icons-material "content_copy" :v-adjust -0.2)) ; Enum
(14 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Keyword
(15 . ,(all-the-icons-material "content_paste" :v-adjust -0.2)) ; Snippet
(16 . ,(all-the-icons-material "palette" :v-adjust -0.2)) ; Color
(17 . ,(all-the-icons-faicon "file" :v-adjust -0.0575)) ; File
(18 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Reference
(19 . ,(all-the-icons-faicon "folder" :v-adjust -0.0575)) ; Folder
(20 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; EnumMember
(21 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Constant
(22 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; Struct
(23 . ,(all-the-icons-faicon "bolt" :v-adjust -0.0575)) ; Event
(24 . ,(all-the-icons-faicon "tag" :v-adjust -0.0575)) ; Operator
(25 . ,(all-the-icons-faicon "cog" :v-adjust -0.0575)) ; TypeParameter
))
'';
};
all-the-icons = { enable = true; };
company-jedi = {
enable = (elem "emacs::elpy" config.machine.pkgs);
};
};
fonts.packages = pkgs.emacs-all-the-icons-fonts.all;
}

View file

@ -1,12 +1,15 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::direnv" config.machine.pkgs) {
mkIf (elem "emacs::direnv" config.machine.pkgs) { programs.emacs.init.usePackage.direnv = {
programs.emacs.init.usePackage.direnv = { enable = true;
enable = true; config = ''(direnv-mode)'';
config = ''(direnv-mode)''; };
}; services.lorri.enable = true;
services.lorri.enable = true; environment.systemPackages = with pkgs; [lorri direnv];
environment.systemPackages = with pkgs; [ lorri direnv ]; }
}

View file

@ -1,20 +1,22 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::docker" config.machine.pkgs) {
mkIf (elem "emacs::docker" config.machine.pkgs) { programs.emacs.init.usePackage = {
programs.emacs.init.usePackage = { dockerfile-mode = {
dockerfile-mode = { enable = true;
enable = true; };
docker = {
enable = true;
};
docker-compose-mode = {
enable = true;
};
docker-tramp = {
enable = true;
};
}; };
docker = { }
enable = true;
};
docker-compose-mode = {
enable = true;
};
docker-tramp = {
enable = true;
};
};
}

View file

@ -1,9 +1,11 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::dockerfile" config.machine.pkgs) {
mkIf (elem "emacs::dockerfile" config.machine.pkgs) { programs.emacs.init.usePackage.dockerfile-mode = {
programs.emacs.init.usePackage.dockerfile-mode = { enable = true;
enable = true; };
}; }
}

View file

@ -1,21 +1,24 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::doom-modeline" config.machine.pkgs) {
programs.emacs.init.usePackage.doom-modeline = {
enable = true;
hook = ["(after-init . doom-modeline-mode)"];
config = ''
(setq doom-modeline-icon t)
(setq doom-modeline-height 25)
(setq doom-modeline-bar-width 3)
;; The default priority of detection is `ffip' > `projectile' > `project'.
(setq doom-modeline-project-detection 'project)
(setq doom-modeline-buffer-file-name-style 'truncate-upto-project)
(setq doom-modeline-unicode-fallback nil)
mkIf (elem "emacs::doom-modeline" config.machine.pkgs) { (setq doom-modeline--battery-status t)
programs.emacs.init.usePackage.doom-modeline = { '';
enable = true; };
hook = [ "(after-init . doom-modeline-mode)" ]; }
config = ''
(setq doom-modeline-icon t)
(setq doom-modeline-height 25)
(setq doom-modeline-bar-width 3)
;; The default priority of detection is `ffip' > `projectile' > `project'.
(setq doom-modeline-project-detection 'project)
(setq doom-modeline-buffer-file-name-style 'truncate-upto-project)
(setq doom-modeline-unicode-fallback nil)
(setq doom-modeline--battery-status t)
'';
};
}

View file

@ -1,16 +1,19 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::doom-themes" config.machine.pkgs) {
programs.emacs.init.usePackage.doom-themes = {
enable = true;
config = ''
;; Load the theme (doom-one, doom-molokai, etc); keep in mind that each theme
;; may have their own settings.
(load-theme 'doom-solarized-dark t)
mkIf (elem "emacs::doom-themes" config.machine.pkgs) { ;; ${optionalString (elem "emacs::org" config.machine.pkgs) "(doom-themes-org-config)"}
programs.emacs.init.usePackage.doom-themes = { '';
enable = true; };
config = '' }
;; Load the theme (doom-one, doom-molokai, etc); keep in mind that each theme
;; may have their own settings.
(load-theme 'doom-solarized-dark t)
;; ${optionalString (elem "emacs::org" config.machine.pkgs) "(doom-themes-org-config)"}
'';
};
}

View file

@ -1,148 +1,151 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::elfeed" config.machine.pkgs) {
programs.emacs.init.usePackage = {
elfeed = let
pyEnv = pkgs.python3.withPackages (ps: with ps; [beautifulsoup4 lxml requests]);
pyScript = pkgs.writeScript "elfeedFetcher.py" ''
#!${pyEnv}/bin/python3
import sys
from requests import get
from bs4 import BeautifulSoup
mkIf (elem "emacs::elfeed" config.machine.pkgs) { header_agent = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0'}
programs.emacs.init.usePackage = { with get(sys.argv[1], headers=header_agent) as r:
elfeed = let soup = BeautifulSoup(r.text, 'lxml')
pyEnv = pkgs.python3.withPackages (ps: with ps; [ beautifulsoup4 lxml requests ]); abstract = soup.find('dd', {"id": "abstract"}).text.replace('"', '\\"')
pyScript = pkgs.writeScript "elfeedFetcher.py" '' article = '\n\n'.join(
#!${pyEnv}/bin/python3 [soup.find('p', {"id": "first"}, class_="lead").text] +
import sys [
from requests import get p.text for p in
from bs4 import BeautifulSoup soup.find('div', {"id": "text"}).findAll('p')
]).replace('"', '\\"')
print(f"(setq abstract \"{abstract}\") (setq article \"{article}\")")
'';
in {
enable = true;
hook = [''(elfeed-new-entry . elfeed-content-fetcher)''];
config = ''
(load-file "~/.emacs.d/elfeed.el")
header_agent = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0'} (defun elfeed-play-with-mpv (entry)
with get(sys.argv[1], headers=header_agent) as r: "Play entry link with mpv."
soup = BeautifulSoup(r.text, 'lxml') (interactive (elfeed-search-selected :single))
abstract = soup.find('dd', {"id": "abstract"}).text.replace('"', '\\"') (start-process "elfeed-mpv" nil "mpv" "--ytdl-format=[height<=1080]" (elfeed-entry-link entry)))
article = '\n\n'.join(
[soup.find('p', {"id": "first"}, class_="lead").text] +
[
p.text for p in
soup.find('div', {"id": "text"}).findAll('p')
]).replace('"', '\\"')
print(f"(setq abstract \"{abstract}\") (setq article \"{article}\")")
'';
in {
enable = true;
hook = [ ''(elfeed-new-entry . elfeed-content-fetcher)'' ];
config = ''
(load-file "~/.emacs.d/elfeed.el")
(defun elfeed-play-with-mpv (entry) (defun elfeed-search-show-entry-custom (entry)
"Play entry link with mpv." "Custom actions for various sources."
(interactive (elfeed-search-selected :single)) (interactive (list (elfeed-search-selected :ignore-region)))
(start-process "elfeed-mpv" nil "mpv" "--ytdl-format=[height<=1080]" (elfeed-entry-link entry))) (if (equal (car (elfeed-entry-id entry)) "www.youtube.com") (elfeed-play-with-mpv entry)
(elfeed-show-entry entry)))
(define-key elfeed-search-mode-map [remap elfeed-search-show-entry] 'elfeed-search-show-entry-custom)
(defun elfeed-search-show-entry-custom (entry) (defun elfeed-get-yt-description (url)
"Custom actions for various sources." (shell-command-to-string (format "${pkgs.youtube-dl}/bin/youtube-dl --get-description \"%s\" 2> /dev/null" url)))
(interactive (list (elfeed-search-selected :ignore-region)))
(if (equal (car (elfeed-entry-id entry)) "www.youtube.com") (elfeed-play-with-mpv entry)
(elfeed-show-entry entry)))
(define-key elfeed-search-mode-map [remap elfeed-search-show-entry] 'elfeed-search-show-entry-custom)
(defun elfeed-get-yt-description (url) (defun elfeed-get-sd-article (url)
(shell-command-to-string (format "${pkgs.youtube-dl}/bin/youtube-dl --get-description \"%s\" 2> /dev/null" url))) (eval-string (shell-command-to-string (format "${pyEnv}/bin/python3 ${pyScript} \"%s\" 2> /dev/null" url))))
(defun elfeed-get-sd-article (url) (defun eval-string (string)
(eval-string (shell-command-to-string (format "${pyEnv}/bin/python3 ${pyScript} \"%s\" 2> /dev/null" url)))) (eval (car (read-from-string (format "(progn %s)" string)))))
(defun eval-string (string) (defun elfeed-content-fetcher (entry)
(eval (car (read-from-string (format "(progn %s)" string))))) "Fetches content for various entries (currently only sciencedaily)."
(interactive (list (elfeed-search-selected :ignore-region)))
(defun elfeed-content-fetcher (entry) (let ((url (elfeed-entry-link entry))
"Fetches content for various entries (currently only sciencedaily)." (feed-id (elfeed-deref (elfeed-entry-feed-id entry)))
(interactive (list (elfeed-search-selected :ignore-region))) )
(when (equal (car (elfeed-entry-id entry)) "www.sciencedaily.com")
(elfeed-get-sd-article (cdr (elfeed-entry-id entry)))
;; (setf (elfeed-entry-content entry) (elfeed-ref article))
(setf (elfeed-meta entry :content) (elfeed-ref article))
(setf (elfeed-meta entry :abstract) abstract)
(makunbound 'abstract)
(makunbound 'article))))
(let ((url (elfeed-entry-link entry)) (defun elfeed-show-refresh--mail-style ()
(feed-id (elfeed-deref (elfeed-entry-feed-id entry))) "Update the buffer to match the selected entry, using a mail-style."
) (interactive)
(when (equal (car (elfeed-entry-id entry)) "www.sciencedaily.com") (let* ((inhibit-read-only t)
(elfeed-get-sd-article (cdr (elfeed-entry-id entry))) (title (elfeed-entry-title elfeed-show-entry))
;; (setf (elfeed-entry-content entry) (elfeed-ref article)) (date (seconds-to-time (elfeed-entry-date elfeed-show-entry)))
(setf (elfeed-meta entry :content) (elfeed-ref article)) (authors (elfeed-meta elfeed-show-entry :authors))
(setf (elfeed-meta entry :abstract) abstract) (link (elfeed-entry-link elfeed-show-entry))
(makunbound 'abstract) (tags (elfeed-entry-tags elfeed-show-entry))
(makunbound 'article)))) (tagsstr (mapconcat #'symbol-name tags ", "))
(nicedate (format-time-string "%a, %e %b %Y %T %Z" date))
(defun elfeed-show-refresh--mail-style () (content (if (elfeed-meta elfeed-show-entry :content) (elfeed-deref (elfeed-meta elfeed-show-entry :content)) (elfeed-deref (elfeed-entry-content elfeed-show-entry))))
"Update the buffer to match the selected entry, using a mail-style." (type (elfeed-entry-content-type elfeed-show-entry))
(interactive) (feed (elfeed-entry-feed elfeed-show-entry))
(let* ((inhibit-read-only t) (feed-title (elfeed-feed-title feed))
(title (elfeed-entry-title elfeed-show-entry)) (base (and feed (elfeed-compute-base (elfeed-feed-url feed)))))
(date (seconds-to-time (elfeed-entry-date elfeed-show-entry))) (erase-buffer)
(authors (elfeed-meta elfeed-show-entry :authors)) (insert (format (propertize "Title: %s\n" 'face 'message-header-name)
(link (elfeed-entry-link elfeed-show-entry)) (propertize title 'face 'message-header-subject)))
(tags (elfeed-entry-tags elfeed-show-entry)) (when elfeed-show-entry-author
(tagsstr (mapconcat #'symbol-name tags ", ")) (dolist (author authors)
(nicedate (format-time-string "%a, %e %b %Y %T %Z" date)) (let ((formatted (elfeed--show-format-author author)))
(content (if (elfeed-meta elfeed-show-entry :content) (elfeed-deref (elfeed-meta elfeed-show-entry :content)) (elfeed-deref (elfeed-entry-content elfeed-show-entry)))) (insert
(type (elfeed-entry-content-type elfeed-show-entry)) (format (propertize "Author: %s\n" 'face 'message-header-name)
(feed (elfeed-entry-feed elfeed-show-entry)) (propertize formatted 'face 'message-header-to))))))
(feed-title (elfeed-feed-title feed)) (insert (format (propertize "Date: %s\n" 'face 'message-header-name)
(base (and feed (elfeed-compute-base (elfeed-feed-url feed))))) (propertize nicedate 'face 'message-header-other)))
(erase-buffer) (insert (format (propertize "Feed: %s\n" 'face 'message-header-name)
(insert (format (propertize "Title: %s\n" 'face 'message-header-name) (propertize feed-title 'face 'message-header-other)))
(propertize title 'face 'message-header-subject))) (when tags
(when elfeed-show-entry-author (insert (format (propertize "Tags: %s\n" 'face 'message-header-name)
(dolist (author authors) (propertize tagsstr 'face 'message-header-other))))
(let ((formatted (elfeed--show-format-author author))) (insert (propertize "Link: " 'face 'message-header-name))
(insert (elfeed-insert-link link link)
(format (propertize "Author: %s\n" 'face 'message-header-name) (insert "\n")
(propertize formatted 'face 'message-header-to)))))) (cl-loop for enclosure in (elfeed-entry-enclosures elfeed-show-entry)
(insert (format (propertize "Date: %s\n" 'face 'message-header-name) do (insert (propertize "Enclosure: " 'face 'message-header-name))
(propertize nicedate 'face 'message-header-other))) do (elfeed-insert-link (car enclosure))
(insert (format (propertize "Feed: %s\n" 'face 'message-header-name) do (insert "\n"))
(propertize feed-title 'face 'message-header-other))) (insert "\n")
(when tags (if content
(insert (format (propertize "Tags: %s\n" 'face 'message-header-name) (if (eq type 'html)
(propertize tagsstr 'face 'message-header-other)))) (elfeed-insert-html content base)
(insert (propertize "Link: " 'face 'message-header-name)) (insert content))
(elfeed-insert-link link link) (insert (propertize "(empty)\n" 'face 'italic)))
(insert "\n") (goto-char (point-min))))
(cl-loop for enclosure in (elfeed-entry-enclosures elfeed-show-entry)
do (insert (propertize "Enclosure: " 'face 'message-header-name))
do (elfeed-insert-link (car enclosure))
do (insert "\n"))
(insert "\n")
(if content
(if (eq type 'html)
(elfeed-insert-html content base)
(insert content))
(insert (propertize "(empty)\n" 'face 'italic)))
(goto-char (point-min))))
(defun elfeed-db-gc (&optional stats-p) (defun elfeed-db-gc (&optional stats-p)
"Clean up unused content from the content database. "Clean up unused content from the content database.
If STATS is true, return the space cleared in bytes." If STATS is true, return the space cleared in bytes."
(elfeed-db-gc-empty-feeds) (elfeed-db-gc-empty-feeds)
(let* ((data (expand-file-name "data" elfeed-db-directory)) (let* ((data (expand-file-name "data" elfeed-db-directory))
(dirs (directory-files data t "^[0-9a-z]\\{2\\}$")) (dirs (directory-files data t "^[0-9a-z]\\{2\\}$"))
(ids (cl-mapcan (lambda (d) (directory-files d nil nil t)) dirs)) (ids (cl-mapcan (lambda (d) (directory-files d nil nil t)) dirs))
(table (make-hash-table :test 'equal))) (table (make-hash-table :test 'equal)))
(dolist (id ids) (dolist (id ids)
(setf (gethash id table) nil)) (setf (gethash id table) nil))
(with-elfeed-db-visit (entry _) (with-elfeed-db-visit (entry _)
(let ((content (elfeed-entry-content entry)) (let ((content (elfeed-entry-content entry))
(meta-content (elfeed-meta entry :content))) (meta-content (elfeed-meta entry :content)))
(when (elfeed-ref-p content) (when (elfeed-ref-p content)
(setf (gethash (elfeed-ref-id content) table) t)) (setf (gethash (elfeed-ref-id content) table) t))
(when (elfeed-ref-p (meta-content)) (when (elfeed-ref-p (meta-content))
(setf (gethash (elfeed-ref-id meta-content) table) t)))) (setf (gethash (elfeed-ref-id meta-content) table) t))))
(cl-loop for id hash-keys of table using (hash-value used) (cl-loop for id hash-keys of table using (hash-value used)
for used-p = (or used (member id '("." ".."))) for used-p = (or used (member id '("." "..")))
when (and (not used-p) stats-p) when (and (not used-p) stats-p)
sum (let* ((ref (elfeed-ref--create :id id)) sum (let* ((ref (elfeed-ref--create :id id))
(file (elfeed-ref--file ref))) (file (elfeed-ref--file ref)))
(* 1.0 (nth 7 (file-attributes file)))) (* 1.0 (nth 7 (file-attributes file))))
unless used-p unless used-p
do (elfeed-ref-delete (elfeed-ref--create :id id)) do (elfeed-ref-delete (elfeed-ref--create :id id))
finally (cl-loop for dir in dirs finally (cl-loop for dir in dirs
when (elfeed-directory-empty-p dir) when (elfeed-directory-empty-p dir)
do (delete-directory dir))))) do (delete-directory dir)))))
''; '';
};
}; };
}; }
}

View file

@ -1,36 +1,43 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::elpy" config.machine.pkgs) {
programs.emacs.init.usePackage.elpy = {
enable = true;
after = ["python"];
command = ["elpy-enable"];
hook =
[
''
(elpy-mode
. (lambda ()
(set (make-local-variable 'company-backends)
'((company-dabbrev-code company-yasnippet elpy-company-backend)))))
''
]
++ (optional (elem "emacs::flyspell" config.machine.pkgs) "(elpy-mode . (lambda () (flyspell-prog-mode)))")
++ (optional (elem "emacs::flycheck" config.machine.pkgs) "(elpy-mode . (lambda () (flycheck-mode)))");
bindLocal = {
elpy-mode-map = {
"<tab>" = "company-indent-or-complete-common";
};
};
init = ''(with-eval-after-load 'python (elpy-enable))'';
config = ''
(setq elpy-project-root-finder-functions '(elpy-project-find-git-root elpy-project-find-python-root elpy-project-find-hg-root elpy-project-find-svn-root))
(setq elpy-rpc-backend "jedi")
(setq python-shell-interpreter "ipython"
python-shell-interpreter-args "-i --simple-prompt")
mkIf (elem "emacs::elpy" config.machine.pkgs) { ${optionalString (elem "emacs::flycheck" config.machine.pkgs) ''
programs.emacs.init.usePackage.elpy = { ;; manually set what python-mypy is and configure it to ignore 3rd party imports
enable = true; (setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
after = [ "python" ]; (setq-default flycheck-checker 'python-pylint)
command = [ "elpy-enable" ]; (flycheck-add-next-checker 'python-pylint 'python-flake8 t)
hook = [ '' ;; (flycheck-add-next-checker 'python-mypy 'python-flake8 t)''}
(elpy-mode '';
. (lambda () };
(set (make-local-variable 'company-backends) }
'((company-dabbrev-code company-yasnippet elpy-company-backend)))))
'' ]
++ (optional (elem "emacs::flyspell" config.machine.pkgs) "(elpy-mode . (lambda () (flyspell-prog-mode)))")
++ (optional (elem "emacs::flycheck" config.machine.pkgs) "(elpy-mode . (lambda () (flycheck-mode)))");
bindLocal = { elpy-mode-map = {
"<tab>" = "company-indent-or-complete-common";
};};
init = ''(with-eval-after-load 'python (elpy-enable))'';
config = ''
(setq elpy-project-root-finder-functions '(elpy-project-find-git-root elpy-project-find-python-root elpy-project-find-hg-root elpy-project-find-svn-root))
(setq elpy-rpc-backend "jedi")
(setq python-shell-interpreter "ipython"
python-shell-interpreter-args "-i --simple-prompt")
${optionalString (elem "emacs::flycheck" config.machine.pkgs) ''
;; manually set what python-mypy is and configure it to ignore 3rd party imports
(setq elpy-modules (delq 'elpy-module-flymake elpy-modules))
(setq-default flycheck-checker 'python-pylint)
(flycheck-add-next-checker 'python-pylint 'python-flake8 t)
;; (flycheck-add-next-checker 'python-mypy 'python-flake8 t)''}
'';
};
}

View file

@ -1,16 +1,18 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::fcitx" config.machine.pkgs) {
mkIf (elem "emacs::fcitx" config.machine.pkgs) { programs.emacs.init.usePackage = {
programs.emacs.init.usePackage = { fcitx = {
fcitx = { enable = true;
enable = true; demand = true;
demand = true; config = ''
config = '' ;; (setq fcitx-use-dbus t)
;; (setq fcitx-use-dbus t) (fcitx-default-setup)
(fcitx-default-setup) '';
''; };
}; };
}; }
}

View file

@ -1,35 +1,37 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::flycheck" config.machine.pkgs) {
programs.emacs.init.usePackage.flycheck = {
enable = true;
command = ["global-flycheck-mode"];
defer = 1;
bind = {};
config = ''
mkIf (elem "emacs::flycheck" config.machine.pkgs) { '';
programs.emacs.init.usePackage.flycheck = { };
enable = true;
command = [ "global-flycheck-mode" ];
defer = 1;
bind = {};
config = ''
''; programs.emacs.init.usePackage.flycheck-haskell = {
}; enable = elem "emacs::haskell" config.machine.pkgs;
};
programs.emacs.init.usePackage.flycheck-haskell = { programs.emacs.init.usePackage.flycheck-irony = {
enable = (elem "emacs::haskell" config.machine.pkgs); enable = elem "emacs::irony" config.machine.pkgs;
}; };
programs.emacs.init.usePackage.flycheck-irony = { programs.emacs.init.usePackage.flycheck-mypy = {
enable = (elem "emacs::irony" config.machine.pkgs); enable = elem "emacs::elpy" config.machine.pkgs;
}; };
programs.emacs.init.usePackage.flycheck-mypy = { programs.emacs.init.usePackage.pylint = {
enable = (elem "emacs::elpy" config.machine.pkgs); enable = elem "emacs::elpy" config.machine.pkgs;
}; };
programs.emacs.init.usePackage.pylint = { programs.emacs.init.usePackage.flycheck-rust = {
enable = (elem "emacs::elpy" config.machine.pkgs); enable = elem "emacs::rust" config.machine.pkgs;
}; };
}
programs.emacs.init.usePackage.flycheck-rust = {
enable = (elem "emacs::rust" config.machine.pkgs);
};
}

View file

@ -1,31 +1,33 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::flyspell" config.machine.pkgs) {
programs.emacs.init.usePackage.flyspell = {
enable = true;
package = epkgs: null;
diminish = ["flyspell-mode"];
command = ["flyspell-mode" "flyspell-prog-mode"];
hook = [];
bind = {
"C-M-<tab>" = "flyspell-switch-dictionary";
"C-c f" = "ispell-word";
};
config = ''
;; Make flyspell less verbose and disable annoying keybind
(setq flyspell-issue-message-flag nil
flyspell-issue-welcome-flag nil
flyspell-use-meta-tab nil)
mkIf (elem "emacs::flyspell" config.machine.pkgs) { (defun flyspell-switch-dictionary ()
programs.emacs.init.usePackage.flyspell = { (interactive)
enable = true; (let* ((dic ispell-current-dictionary)
package = epkgs: null; (change (if (string= dic "deutsch8") "english" "deutsch8")))
diminish = [ "flyspell-mode" ]; (ispell-change-dictionary change)
command = [ "flyspell-mode" "flyspell-prog-mode" ]; (message "Dictionary switched to %s" change)
hook = []; ))
bind = { '';
"C-M-<tab>" = "flyspell-switch-dictionary";
"C-c f" = "ispell-word";
}; };
config = '' }
;; Make flyspell less verbose and disable annoying keybind
(setq flyspell-issue-message-flag nil
flyspell-issue-welcome-flag nil
flyspell-use-meta-tab nil)
(defun flyspell-switch-dictionary ()
(interactive)
(let* ((dic ispell-current-dictionary)
(change (if (string= dic "deutsch8") "english" "deutsch8")))
(ispell-change-dictionary change)
(message "Dictionary switched to %s" change)
))
'';
};
}

View file

@ -1,27 +1,30 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::latex" config.machine.pkgs) {
programs.emacs.init.usePackage = {
latex-mode = {
enable = true;
package = epkgs: null;
defer = true;
};
mkIf (elem "emacs::latex" config.machine.pkgs) { tex-site = {
programs.emacs.init.usePackage = { enable = true;
latex-mode = { defer = true;
enable = true; package = epkgs: epkgs.auctex;
package = epkgs: null; hook = [];
defer = true; mode = [''("\\.tex\\'" . TeX-latex-mode)''];
}; };
tex-site = { preview = {
enable = true; enable = true;
defer = true; defer = true;
package = epkgs: epkgs.auctex; package = epkgs: epkgs.auctex;
hook = []; };
mode = [ ''("\\.tex\\'" . TeX-latex-mode)'' ];
}; };
}
preview = {
enable = true;
defer = true;
package = epkgs: epkgs.auctex;
};
};
}

View file

@ -1,56 +1,60 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::lsp" config.machine.pkgs) {
programs.emacs.init.usePackage = {
lsp-mode = {
enable = true;
command = ["lsp-mode"];
config = ''
(setq lsp-keymap-prefix "C-c")
(setq lsp-eldoc-render-all nil)
mkIf (elem "emacs::lsp" config.machine.pkgs) { (defvar lsp-language-id-configuration '(
programs.emacs.init.usePackage = { ${optionalString (elem "emacs::rust" config.machine.pkgs)
lsp-mode = {
enable = true;
command = [ "lsp-mode" ];
config = ''
(setq lsp-keymap-prefix "C-c")
(setq lsp-eldoc-render-all nil)
(defvar lsp-language-id-configuration '(
${optionalString (elem "emacs::rust" config.machine.pkgs)
''(rust-mode . "rust")''} ''(rust-mode . "rust")''}
)) ))
${optionalString (elem "emacs::rust" config.machine.pkgs) '' ${optionalString (elem "emacs::rust" config.machine.pkgs) ''
(setq lsp-rust-clippy-preference "on") (setq lsp-rust-clippy-preference "on")
''} ''}
${optionalString (elem "emacs::web-mode" config.machine.pkgs) '' ${optionalString (elem "emacs::web-mode" config.machine.pkgs) ''
(setq lsp-clients-deno-enable-unstable 't) (setq lsp-clients-deno-enable-unstable 't)
(setq lsp-clients-deno-import-map "./import_map.json") (setq lsp-clients-deno-import-map "./import_map.json")
(setq lsp-clients-deno-config "./deno.json") (setq lsp-clients-deno-config "./deno.json")
''} ''}
${optionalString (elem "emacs::php-mode" config.machine.pkgs) '' ${optionalString (elem "emacs::php-mode" config.machine.pkgs) ''
(setq lsp-intelephense-php-version "8.2") (setq lsp-intelephense-php-version "8.2")
(setq lsp-intelephense-server-command `("${pkgs.nodePackages.intelephense}/bin/intelephense" "--stdio")) (setq lsp-intelephense-server-command `("${pkgs.nodePackages.intelephense}/bin/intelephense" "--stdio"))
''} ''}
''; '';
}; };
lsp-ui = { lsp-ui = {
enable = true; enable = true;
after = [ "lsp-mode" ]; after = ["lsp-mode"];
config = '' config = ''
(setq lsp-ui-sideline-enable 't) (setq lsp-ui-sideline-enable 't)
(setq lsp-ui-sideline-show-symbol nil) (setq lsp-ui-sideline-show-symbol nil)
(setq lsp-ui-sideline-show-hover nil) (setq lsp-ui-sideline-show-hover nil)
(setq lsp-ui-doc-show-with-cursor 't) (setq lsp-ui-doc-show-with-cursor 't)
(setq lsp-ui-doc-delay 1) (setq lsp-ui-doc-delay 1)
(setq lsp-ui-sideline-show-code-actions 't) (setq lsp-ui-sideline-show-code-actions 't)
(setq lsp-ui-sideline-update-mode 'point) (setq lsp-ui-sideline-update-mode 'point)
(define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions) (define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions)
(define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references) (define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references)
''; '';
}; };
lsp-ui-flycheck = { lsp-ui-flycheck = {
enable = true; enable = true;
package = epkgs: [ epkgs.lsp-ui ]; package = epkgs: [epkgs.lsp-ui];
after = [ "lsp-ui" ] after =
++ optional (elem "emacs::flycheck" config.machine.pkgs) "flycheck"; ["lsp-ui"]
++ optional (elem "emacs::flycheck" config.machine.pkgs) "flycheck";
};
}; };
}; }
}

View file

@ -1,12 +1,14 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::magit" config.machine.pkgs) {
mkIf (elem "emacs::magit" config.machine.pkgs) { programs.emacs.init.usePackage.magit = {
programs.emacs.init.usePackage.magit = { enable = true;
enable = true; bind = {
bind = { "C-c m" = "magit-status";
"C-c m" = "magit-status"; };
}; };
}; }
}

View file

@ -1,8 +1,10 @@
{ config, lib, pkgs, ... }: {
config,
with lib; lib,
pkgs,
let ...
}:
with lib; let
defaultEncrypt = pkgs.emacsPackages.trivialBuild rec { defaultEncrypt = pkgs.emacsPackages.trivialBuild rec {
pname = "defaultencrypt"; pname = "defaultencrypt";
version = "ba07acc8e9fd692534c39c7cdad0a19dc0d897d9"; version = "ba07acc8e9fd692534c39c7cdad0a19dc0d897d9";
@ -14,106 +16,107 @@ let
sha256 = "1ln7h1syx7yi7bqvirv90mk4rvwxg4zm1wvfcvhfh64s3hqrbfgl"; sha256 = "1ln7h1syx7yi7bqvirv90mk4rvwxg4zm1wvfcvhfh64s3hqrbfgl";
}; };
}; };
in mkIf (elem "emacs::mu4e" config.machine.pkgs) { in
programs.emacs.init.usePackage.pinentry = { mkIf (elem "emacs::mu4e" config.machine.pkgs) {
enable = true; programs.emacs.init.usePackage.pinentry = {
command = [ "pinentry-start" ]; enable = true;
hook = [ "(after-init . pinentry-start)" ]; command = ["pinentry-start"];
}; hook = ["(after-init . pinentry-start)"];
programs.emacs.init.usePackage.mu4e = {
enable = true;
package = epkgs: null;
command = [ "mu4e" ];
diminish = [ "mu4e-mode" ];
hook = [
"(mu4e-view-mode . visual-line-mode)"
"(mu4e-compose-mode . flyspell-mode)"
''(message-send . (lambda ()
(unless (yes-or-no-p "Send this message?")
(signal 'quit nil))))''
];
bind = { "\t" = "'company-complete-common"; };
bindLocal = rec {
mu4e-headers-mode-map = {
"C-+" = "nil";
"C--" = "nil";
};
mu4e-view-mode-map = mu4e-headers-mode-map;
}; };
init = ''
;; (add-to-list 'load-path "${defaultEncrypt}/share/emacs/site-lisp")
;; (require 'jl-encrypt)
'';
config = ''
(setq mail-user-agent 'mu4e-user-agent)
(setq org-mu4e-link-query-in-headers-mode t)
(setq mu4e-maildir "~/.mail/Mail")
(setq mu4e-get-mail-command "${pkgs.isync}/bin/mbsync -a")
(setq mu4e-context-policy 'pick-first)
(setq mu4e-change-filenames-when-moving t)
(setq starttls-use-gnutls t)
(setq message-send-mail-function 'smtpmail-send-it)
(setq mu4e-update-interval 300)
(setq mu4e-use-fancy-chars t)
(setq mu4e-view-show-addresses t)
(setq mu4e-headers-show-threads t)
(setq mu4e-headers-skip-duplicates t)
(setq mail-user-agent 'mu4e-user-agent)
(defvaralias 'mu4e-compose-signature 'message-signature)
(setq-default mu4e-save-multiple-attachments-without-asking t)
(setq-default mu4e-view-show-addresses t)
(setq-default mu4e-confirm-quit nil)
(setq-default mu4e-hide-index-messages t)
(setq-default mu4e-index-update-in-background t)
(setq mu4e-compose-in-new-frame nil)
;;rename files when moving programs.emacs.init.usePackage.mu4e = {
;;NEEDED FOR MBSYNC enable = true;
(setq mu4e-change-filenames-when-moving t) package = epkgs: null;
command = ["mu4e"];
diminish = ["mu4e-mode"];
hook = [
"(mu4e-view-mode . visual-line-mode)"
"(mu4e-compose-mode . flyspell-mode)"
'' (message-send . (lambda ()
(unless (yes-or-no-p "Send this message?")
(signal 'quit nil))))''
];
bind = {"\t" = "'company-complete-common";};
bindLocal = rec {
mu4e-headers-mode-map = {
"C-+" = "nil";
"C--" = "nil";
};
mu4e-view-mode-map = mu4e-headers-mode-map;
};
init = ''
;; (add-to-list 'load-path "${defaultEncrypt}/share/emacs/site-lisp")
;; (require 'jl-encrypt)
'';
config = ''
(setq mail-user-agent 'mu4e-user-agent)
(setq org-mu4e-link-query-in-headers-mode t)
(setq mu4e-maildir "~/.mail/Mail")
(setq mu4e-get-mail-command "${pkgs.isync}/bin/mbsync -a")
(setq mu4e-context-policy 'pick-first)
(setq mu4e-change-filenames-when-moving t)
(setq starttls-use-gnutls t)
(setq message-send-mail-function 'smtpmail-send-it)
(setq mu4e-update-interval 300)
(setq mu4e-use-fancy-chars t)
(setq mu4e-view-show-addresses t)
(setq mu4e-headers-show-threads t)
(setq mu4e-headers-skip-duplicates t)
(setq mail-user-agent 'mu4e-user-agent)
(defvaralias 'mu4e-compose-signature 'message-signature)
(setq-default mu4e-save-multiple-attachments-without-asking t)
(setq-default mu4e-view-show-addresses t)
(setq-default mu4e-confirm-quit nil)
(setq-default mu4e-hide-index-messages t)
(setq-default mu4e-index-update-in-background t)
(setq mu4e-compose-in-new-frame nil)
(setq mu4e-html2text-command "iconv -c -t utf-8 | ${pkgs.pandoc}/bin/pandoc -f html -t plain") ;;rename files when moving
(setq mu4e-view-show-images t) ;;NEEDED FOR MBSYNC
(when (fboundp 'imagemagick-register-types) (setq mu4e-change-filenames-when-moving t)
(imagemagick-register-types))
(setq message-kill-buffer-on-exit t)
;; Encryption Stuff (setq mu4e-html2text-command "iconv -c -t utf-8 | ${pkgs.pandoc}/bin/pandoc -f html -t plain")
;; (setq mml-secure-openpgp-sign-with-sender t) (setq mu4e-view-show-images t)
;; ;; (setq mm-sign-option guided) (when (fboundp 'imagemagick-register-types)
;; (setq epa-pinentry-mode 'loopback) (imagemagick-register-types))
;; mailAcc config goes here (setq message-kill-buffer-on-exit t)
(load-file "~/.emacs.d/mu4e.el")
(defun my-browse-url-firefox-privately (url &optional new-window) ;; Encryption Stuff
"Make firefox open URL in private-browsing window." ;; (setq mml-secure-openpgp-sign-with-sender t)
(interactive (browse-url-interactive-arg "URL: ")) ;; ;; (setq mm-sign-option guided)
(let ((process-environment (browse-url-process-environment))) ;; (setq epa-pinentry-mode 'loopback)
(apply 'start-process ;; mailAcc config goes here
(concat "firefox " url) (load-file "~/.emacs.d/mu4e.el")
nil
browse-url-firefox-program
(list "-private-window" url))))
(setq browse-url-browser-function 'my-browse-url-firefox-privately)
(add-to-list 'mu4e-view-actions
'("ViewInBrowser" . mu4e-action-view-in-browser) t)
'';
extraConfig = ''
:load-path "${pkgs.mu}/share/emacs/site-lisp/mu4e"
'';
};
programs.emacs.init.usePackage.mu4e-alert = { (defun my-browse-url-firefox-privately (url &optional new-window)
enable = true; "Make firefox open URL in private-browsing window."
# hook = [ "after-init . mu4e-alert-enable-mode-line-display" ]; (interactive (browse-url-interactive-arg "URL: "))
}; (let ((process-environment (browse-url-process-environment)))
(apply 'start-process
(concat "firefox " url)
nil
browse-url-firefox-program
(list "-private-window" url))))
(setq browse-url-browser-function 'my-browse-url-firefox-privately)
(add-to-list 'mu4e-view-actions
'("ViewInBrowser" . mu4e-action-view-in-browser) t)
'';
extraConfig = ''
:load-path "${pkgs.mu}/share/emacs/site-lisp/mu4e"
'';
};
# programs.emacs.init.usePackage.org-mu4e = { programs.emacs.init.usePackage.mu4e-alert = {
# enable = (elem "emacs::org" config.machine.pkgs); enable = true;
# }; # hook = [ "after-init . mu4e-alert-enable-mode-line-display" ];
};
environment.systemPackages = with pkgs; [ # programs.emacs.init.usePackage.org-mu4e = {
mu # enable = (elem "emacs::org" config.machine.pkgs);
isync # };
];
} environment.systemPackages = with pkgs; [
mu
isync
];
}

View file

@ -1,11 +1,13 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::nix-mode" config.machine.pkgs) {
mkIf (elem "emacs::nix-mode" config.machine.pkgs) { programs.emacs.init.usePackage.nix-mode = {
programs.emacs.init.usePackage.nix-mode = { enable = true;
enable = true; mode = [''"\\.nix\\'"''];
mode = [ ''"\\.nix\\'"'' ]; config = ''(setq nix-nixfmt-bin "nixfmt -w 150")'';
config = ''(setq nix-nixfmt-bin "nixfmt -w 150")''; };
}; }
}

View file

@ -1,426 +1,440 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::org" config.machine.pkgs) {
programs.emacs.init.usePackage.org = {
enable = true;
package = epkgs: [epkgs.org];
mode = [''("\\.org\\'" . org-mode)''];
command = ["org-mode"];
hook =
[
"(org-mode . (lambda () (org-indent-mode)))"
''
(org-mode
. (lambda ()
;; Automatic line-wrapping in org-mode
;;(auto-fill-mode 1)
mkIf (elem "emacs::org" config.machine.pkgs) { (setq completion-at-point-functions
programs.emacs.init.usePackage.org = { '(org-completion-symbols
enable = true; ora-cap-filesystem))))
package = epkgs: [ epkgs.org ]; ''
mode = [ ''("\\.org\\'" . org-mode)'' ]; ''
command = [ "org-mode" ]; (org-mode
hook = [ "(org-mode . (lambda () (org-indent-mode)))" '' . (lambda ()
(org-mode "Beautify Org Checkbox Symbol"
. (lambda () (push '("[ ]" . "" ) prettify-symbols-alist)
;; Automatic line-wrapping in org-mode (push '("[X]" . "" ) prettify-symbols-alist)
;;(auto-fill-mode 1) (push '("[-]" . "" ) prettify-symbols-alist)
(prettify-symbols-mode)))
''
]
++ optional (elem "emacs::flyspell" config.machine.pkgs) "(org-mode . (lambda () (flyspell-mode)))";
bind = {
"C-c a" = "org-agenda";
};
bindLocal = {
org-mode-map =
{
"M-<up>" = "org-metaup";
"M-<down>" = "org-metadown";
"M-." = "org-open-at-point";
"M-," = "org-mark-ring-goto";
"M-S-<return>" = "org-insert-todo-heading-respect-content";
"M-<return>" = "org-meta-return";
"M-p" = "org-previous-visible-heading";
"M-n" = "org-next-visible-heading";
}
// (optionalAttrs (elem "emacs::company" config.machine.pkgs) {
"<M-tab>" = "company-pcomplete";
});
};
config = ''
;; Insead of "..." show "" when there's hidden folded content
(setq completion-at-point-functions ;; org-prettify
'(org-completion-symbols (defface org-checkbox-done-text
ora-cap-filesystem)))) '((t (:foreground "#71696A" :strike-through t)))
'' '' "Face for the text part of a checked org-mode checkbox.")
(org-mode
. (lambda () (font-lock-add-keywords
"Beautify Org Checkbox Symbol" 'org-mode
(push '("[ ]" . "" ) prettify-symbols-alist) `(("^[ \t]*\\(?:[-+*]\\|[0-9]+[).]\\)[ \t]+\\(\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\(?:X\\|\\([0-9]+\\)/\\2\\)\\][^\n]*\n\\)"
(push '("[X]" . "" ) prettify-symbols-alist) 1 'org-checkbox-done-text prepend))
(push '("[-]" . "" ) prettify-symbols-alist) 'append)
(prettify-symbols-mode)))
'' ;; Some characters to choose from: , , , , , , and
] ++ optional (elem "emacs::flyspell" config.machine.pkgs) "(org-mode . (lambda () (flyspell-mode)))"; (setq org-ellipsis " ")
bind = { ;; get nice looking tables (only for non org-tables; rarely used)
"C-c a" = "org-agenda"; (setq table-cell-horizontal-chars "\u2501")
(setq table-cell-vertical-char ?\u2503)
(setq table-cell-intersection-char ?\u254B)
(setq org-directory "~/Documents/org/")
;; Show headings up to level 2 by default when opening an org files
(setq org-startup-folded 'content)
;; Show inline images by default
(setq org-startup-with-inline-images t)
;; Add more levels to headlines that get displayed with imenu
(setq org-imenu-depth 5)
;; Enter key follows links (= C-c C-o)
(setq org-return-follows-link t)
;; Don't remove links after inserting
(setq org-keep-stored-link-after-insertion t)
(setq org-tag-alist (quote ((:startgroup)
("WAITING" . ?w)
("HOLD" . ?h)
("CANCELLED" . ?c)
("NOTE" . ?n)
(:endgroup)
("PERSONAL" . ?P)
("WORK" . ?W)
("ATOMX" . ?A)
("E5" . ?E)
("HOGASO" . ?H)
("ORG" . ?o)
("crypt" . ?C)
("FLAGGED" . ??))))
;; Allow setting single tags without the menu
(setq org-fast-tag-selection-single-key (quote expert))
(setq org-archive-mark-done nil)
(setq org-archive-location "%s_archive::* Archived Tasks")
;; C-RET, C-S-RET insert new heading after current task content
(setq org-insert-heading-respect-content nil)
;; Show a little bit more when using sparse-trees
(setq org-show-following-heading t)
(setq org-show-hierarchy-above t)
(setq org-show-siblings (quote ((default))))
;; don't show * / = etc
(setq org-hide-emphasis-markers t)
;; leave highlights in sparse tree after edit. C-c C-c removes highlights
(setq org-remove-highlights-with-change nil)
;; M-RET should not split the lines
(setq org-M-RET-may-split-line '((default . nil)))
(setq org-special-ctrl-a/e t)
(setq org-special-ctrl-k t)
(setq org-yank-adjusted-subtrees t)
;; Show org entities as UTF-8 characters (e.g. \sum as )
(setq org-pretty-entities t)
;; But Don't print "bar" as subscript in "foo_bar"
(setq org-pretty-entities-include-sub-superscripts nil)
;; And also don't display ^ or _ as super/subscripts
(setq org-use-sub-superscripts nil)
;; undone TODO entries will block switching the parent to DONE
(setq org-enforce-todo-dependencies t)
(setq org-use-fast-todo-selection t)
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
(sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
(setq org-todo-keyword-faces
(quote (("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "blue" :weight bold)
("DONE" :foreground "forest green" :weight bold)
("WAITING" :foreground "orange" :weight bold)
("HOLD" :foreground "magenta" :weight bold)
("CANCELLED" :foreground "forest green" :weight bold)
("MEETING" :foreground "forest green" :weight bold)
("PHONE" :foreground "forest green" :weight bold))))
;; Auto completion for symbols in org-mode
;; https://oremacs.com/2017/10/04/completion-at-point/
(defun org-completion-symbols ()
(when (looking-back "[`~=][a-zA-Z]+" nil)
(let (cands)
(save-match-data
(save-excursion
(goto-char (point-min))
(while (re-search-forward "[`~=]\\([a-zA-Z.\\-_]+\\)[`~=]" nil t)
(cl-pushnew
(match-string-no-properties 0) cands :test 'equal))
cands))
(when cands
(list (match-beginning 0) (match-end 0) cands)))))
(defun ora-cap-filesystem ()
(let (path)
(when (setq path (ffap-string-at-point))
(when (string-match "\\`file:\\(.*\\)\\'" path)
(setq path (match-string 1 path)))
(let ((compl (all-completions path #'read-file-name-internal)))
(when compl
(let* ((str (car compl))
(offset
(let ((i 0)
(len (length str)))
(while (and (< i len)
(equal (get-text-property i 'face str)
'completions-common-part))
(cl-incf i))
i)))
(list (- (point) offset) (point) compl)))))))
'';
}; };
bindLocal = { org-mode-map = {
"M-<up>" = "org-metaup";
"M-<down>" = "org-metadown";
"M-." = "org-open-at-point";
"M-," = "org-mark-ring-goto";
"M-S-<return>" = "org-insert-todo-heading-respect-content";
"M-<return>" = "org-meta-return";
"M-p" = "org-previous-visible-heading";
"M-n" = "org-next-visible-heading";
} // (optionalAttrs (elem "emacs::company" config.machine.pkgs) {
"<M-tab>" = "company-pcomplete";
}); };
config = ''
;; Insead of "..." show "" when there's hidden folded content
;; org-prettify programs.emacs.init.usePackage.ob = {
(defface org-checkbox-done-text enable = true;
'((t (:foreground "#71696A" :strike-through t))) package = epkgs: [epkgs.ob-ipython epkgs.ob-rust epkgs.ob-diagrams];
"Face for the text part of a checked org-mode checkbox.") defer = true;
init = ''
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images 'append)
'';
config = ''
(setq org-confirm-babel-evaluate nil) ; don't prompt me to confirm everytime I want to evaluate a block
(font-lock-add-keywords (defun org-babel-restart-session-to-point (&optional arg)
'org-mode "Restart session up to the src-block in the current point.
`(("^[ \t]*\\(?:[-+*]\\|[0-9]+[).]\\)[ \t]+\\(\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\(?:X\\|\\([0-9]+\\)/\\2\\)\\][^\n]*\n\\)" Goes to beginning of buffer and executes each code block with
1 'org-checkbox-done-text prepend)) `org-babel-execute-src-block' that has the same language and
'append) session as the current block. ARG has same meaning as in
`org-babel-execute-src-block'."
(interactive "P")
(unless (org-in-src-block-p)
(error "You must be in a src-block to run this command"))
(let* ((current-point (point-marker))
(info (org-babel-get-src-block-info))
(lang (nth 0 info))
(params (nth 2 info))
(session (cdr (assoc :session params))))
(save-excursion
(goto-char (point-min))
(while (re-search-forward org-babel-src-block-regexp nil t)
;; goto start of block
(goto-char (match-beginning 0))
(let* ((this-info (org-babel-get-src-block-info))
(this-lang (nth 0 this-info))
(this-params (nth 2 this-info))
(this-session (cdr (assoc :session this-params))))
(when
(and
(< (point) (marker-position current-point))
(string= lang this-lang)
(src-block-in-session-p session))
(org-babel-execute-src-block arg)))
;; move forward so we can find the next block
(forward-line)))))
;; Some characters to choose from: , , , , , , and (defun org-babel-kill-session ()
(setq org-ellipsis " ") "Kill session for current code block."
;; get nice looking tables (only for non org-tables; rarely used) (interactive)
(setq table-cell-horizontal-chars "\u2501") (unless (org-in-src-block-p)
(setq table-cell-vertical-char ?\u2503) (error "You must be in a src-block to run this command"))
(setq table-cell-intersection-char ?\u254B) (save-window-excursion
(org-babel-switch-to-session)
(kill-buffer)))
(setq org-directory "~/Documents/org/") (defun org-babel-remove-result-buffer ()
"Remove results from every code block in buffer."
;; Show headings up to level 2 by default when opening an org files (interactive)
(setq org-startup-folded 'content)
;; Show inline images by default
(setq org-startup-with-inline-images t)
;; Add more levels to headlines that get displayed with imenu
(setq org-imenu-depth 5)
;; Enter key follows links (= C-c C-o)
(setq org-return-follows-link t)
;; Don't remove links after inserting
(setq org-keep-stored-link-after-insertion t)
(setq org-tag-alist (quote ((:startgroup)
("WAITING" . ?w)
("HOLD" . ?h)
("CANCELLED" . ?c)
("NOTE" . ?n)
(:endgroup)
("PERSONAL" . ?P)
("WORK" . ?W)
("ATOMX" . ?A)
("E5" . ?E)
("HOGASO" . ?H)
("ORG" . ?o)
("crypt" . ?C)
("FLAGGED" . ??))))
;; Allow setting single tags without the menu
(setq org-fast-tag-selection-single-key (quote expert))
(setq org-archive-mark-done nil)
(setq org-archive-location "%s_archive::* Archived Tasks")
;; C-RET, C-S-RET insert new heading after current task content
(setq org-insert-heading-respect-content nil)
;; Show a little bit more when using sparse-trees
(setq org-show-following-heading t)
(setq org-show-hierarchy-above t)
(setq org-show-siblings (quote ((default))))
;; don't show * / = etc
(setq org-hide-emphasis-markers t)
;; leave highlights in sparse tree after edit. C-c C-c removes highlights
(setq org-remove-highlights-with-change nil)
;; M-RET should not split the lines
(setq org-M-RET-may-split-line '((default . nil)))
(setq org-special-ctrl-a/e t)
(setq org-special-ctrl-k t)
(setq org-yank-adjusted-subtrees t)
;; Show org entities as UTF-8 characters (e.g. \sum as )
(setq org-pretty-entities t)
;; But Don't print "bar" as subscript in "foo_bar"
(setq org-pretty-entities-include-sub-superscripts nil)
;; And also don't display ^ or _ as super/subscripts
(setq org-use-sub-superscripts nil)
;; undone TODO entries will block switching the parent to DONE
(setq org-enforce-todo-dependencies t)
(setq org-use-fast-todo-selection t)
(setq org-todo-keywords
(quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
(sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
(setq org-todo-keyword-faces
(quote (("TODO" :foreground "red" :weight bold)
("NEXT" :foreground "blue" :weight bold)
("DONE" :foreground "forest green" :weight bold)
("WAITING" :foreground "orange" :weight bold)
("HOLD" :foreground "magenta" :weight bold)
("CANCELLED" :foreground "forest green" :weight bold)
("MEETING" :foreground "forest green" :weight bold)
("PHONE" :foreground "forest green" :weight bold))))
;; Auto completion for symbols in org-mode
;; https://oremacs.com/2017/10/04/completion-at-point/
(defun org-completion-symbols ()
(when (looking-back "[`~=][a-zA-Z]+" nil)
(let (cands)
(save-match-data
(save-excursion (save-excursion
(goto-char (point-min)) (goto-char (point-min))
(while (re-search-forward "[`~=]\\([a-zA-Z.\\-_]+\\)[`~=]" nil t) (while (re-search-forward org-babel-src-block-regexp nil t)
(cl-pushnew (org-babel-remove-result))))
(match-string-no-properties 0) cands :test 'equal))
cands))
(when cands
(list (match-beginning 0) (match-end 0) cands)))))
(defun ora-cap-filesystem ()
(let (path)
(when (setq path (ffap-string-at-point))
(when (string-match "\\`file:\\(.*\\)\\'" path)
(setq path (match-string 1 path)))
(let ((compl (all-completions path #'read-file-name-internal)))
(when compl
(let* ((str (car compl))
(offset
(let ((i 0)
(len (length str)))
(while (and (< i len)
(equal (get-text-property i 'face str)
'completions-common-part))
(cl-incf i))
i)))
(list (- (point) offset) (point) compl)))))))
'';
};
programs.emacs.init.usePackage.ob = {
enable = true;
package = epkgs: [ epkgs.ob-ipython epkgs.ob-rust epkgs.ob-diagrams ];
defer = true;
init = ''
(add-hook 'org-babel-after-execute-hook 'org-display-inline-images 'append)
'';
config = ''
(setq org-confirm-babel-evaluate nil) ; don't prompt me to confirm everytime I want to evaluate a block
(defun org-babel-restart-session-to-point (&optional arg)
"Restart session up to the src-block in the current point.
Goes to beginning of buffer and executes each code block with
`org-babel-execute-src-block' that has the same language and
session as the current block. ARG has same meaning as in
`org-babel-execute-src-block'."
(interactive "P")
(unless (org-in-src-block-p)
(error "You must be in a src-block to run this command"))
(let* ((current-point (point-marker))
(info (org-babel-get-src-block-info))
(lang (nth 0 info))
(params (nth 2 info))
(session (cdr (assoc :session params))))
(save-excursion
(goto-char (point-min))
(while (re-search-forward org-babel-src-block-regexp nil t)
;; goto start of block
(goto-char (match-beginning 0))
(let* ((this-info (org-babel-get-src-block-info))
(this-lang (nth 0 this-info))
(this-params (nth 2 this-info))
(this-session (cdr (assoc :session this-params))))
(when
(and
(< (point) (marker-position current-point))
(string= lang this-lang)
(src-block-in-session-p session))
(org-babel-execute-src-block arg)))
;; move forward so we can find the next block
(forward-line)))))
(defun org-babel-kill-session ()
"Kill session for current code block."
(interactive)
(unless (org-in-src-block-p)
(error "You must be in a src-block to run this command"))
(save-window-excursion
(org-babel-switch-to-session)
(kill-buffer)))
(defun org-babel-remove-result-buffer ()
"Remove results from every code block in buffer."
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward org-babel-src-block-regexp nil t)
(org-babel-remove-result))))
;; this adds a "new language" in babel that gets exported as js in html ;; this adds a "new language" in babel that gets exported as js in html
;; https://www.reddit.com/r/orgmode/comments/5bi6ku/tip_for_exporting_javascript_source_block_to/ ;; https://www.reddit.com/r/orgmode/comments/5bi6ku/tip_for_exporting_javascript_source_block_to/
(add-to-list 'org-src-lang-modes '("inline-js" . javascript)) (add-to-list 'org-src-lang-modes '("inline-js" . javascript))
(defvar org-babel-default-header-args:inline-js (defvar org-babel-default-header-args:inline-js
'((:results . "html") '((:results . "html")
(:exports . "results"))) (:exports . "results")))
(defun org-babel-execute:inline-js (body _params) (defun org-babel-execute:inline-js (body _params)
(format "<script type=\"text/javascript\">\n%s\n</script>" body)) (format "<script type=\"text/javascript\">\n%s\n</script>" body))
;; Path when plantuml is installed from AUR (package `plantuml') ;; Path when plantuml is installed from AUR (package `plantuml')
(setq org-plantuml-jar-path "/opt/plantuml/plantuml.jar") (setq org-plantuml-jar-path "/opt/plantuml/plantuml.jar")
;; add all languages to org mode ;; add all languages to org mode
(org-babel-do-load-languages (org-babel-do-load-languages
'org-babel-load-languages 'org-babel-load-languages
'((C . t) '((C . t)
;;(R . t) ;;(R . t)
(asymptote) (asymptote)
(awk) (awk)
(calc . t) (calc . t)
(clojure . t) (clojure . t)
(comint) (comint)
(css) (css)
(ditaa . t) (ditaa . t)
(dot . t) (dot . t)
(emacs-lisp . t) (emacs-lisp . t)
(fortran) (fortran)
(gnuplot . t) (gnuplot . t)
(haskell) (haskell)
(io) (io)
(java) (java)
(js . t) (js . t)
(latex) (latex)
(lilypond) (lilypond)
(lisp) (lisp)
(lua . t) (lua . t)
(matlab) (matlab)
(maxima) (maxima)
(mscgen) (mscgen)
(ocaml) (ocaml)
(octave . t) (octave . t)
(org . t) (org . t)
(perl) (perl)
(picolisp) (picolisp)
(plantuml . t) (plantuml . t)
(python . t) (python . t)
;; (ipython . t) ;; (ipython . t)
;; (restclient . t) ;; (restclient . t)
(ref) (ref)
(ruby) (ruby)
(sass) (sass)
(scala) (scala)
(scheme) (scheme)
(screen) (screen)
(shell . t) (shell . t)
(shen) (shen)
(snippet) (snippet)
(sql . t) (sql . t)
(sqlite . t))) (sqlite . t)))
''; '';
}; };
programs.emacs.init.usePackage.org-src = { programs.emacs.init.usePackage.org-src = {
enable = true; enable = true;
package = epkgs: null; package = epkgs: null;
defer = true; defer = true;
init = ''(put 'org-src-preserve-indentation 'safe-local-variable 'booleanp)''; init = ''(put 'org-src-preserve-indentation 'safe-local-variable 'booleanp)'';
config = '' config = ''
(setq org-src-window-setup 'current-window) (setq org-src-window-setup 'current-window)
(setq org-src-fontify-natively t) ; syntax highlighting for source code blocks (setq org-src-fontify-natively t) ; syntax highlighting for source code blocks
;; Tab should do indent in code blocks ;; Tab should do indent in code blocks
;; I think I hate this function (causes scroll on TAB ;; I think I hate this function (causes scroll on TAB
(setq org-src-tab-acts-natively t) (setq org-src-tab-acts-natively t)
;; ?Fix weird scrolling ;; ?Fix weird scrolling
;; Don't remove (or add) any extra whitespace ;; Don't remove (or add) any extra whitespace
(setq org-src-preserve-indentation nil) (setq org-src-preserve-indentation nil)
(setq org-edit-src-content-indentation 0) (setq org-edit-src-content-indentation 0)
;;; Some helper function to manage org-babel sessions ;;; Some helper function to manage org-babel sessions
(defun src-block-in-session-p (&optional name) (defun src-block-in-session-p (&optional name)
"Return if src-block is in a session of NAME. "Return if src-block is in a session of NAME.
NAME may be nil for unnamed sessions." NAME may be nil for unnamed sessions."
(let* ((info (org-babel-get-src-block-info)) (let* ((info (org-babel-get-src-block-info))
;;(lang (nth 0 info)) ;;(lang (nth 0 info))
;;(body (nth 1 info)) ;;(body (nth 1 info))
(params (nth 2 info)) (params (nth 2 info))
(session (cdr (assoc :session params)))) (session (cdr (assoc :session params))))
(cond (cond
;; unnamed session, both name and session are nil ;; unnamed session, both name and session are nil
((and (null session) ((and (null session)
(null name)) (null name))
t) t)
;; Matching name and session ;; Matching name and session
((and ((and
(stringp name) (stringp name)
(stringp session) (stringp session)
(string= name session)) (string= name session))
t) t)
;; no match ;; no match
(t nil)))) (t nil))))
;; dot == graphviz-dot ;; dot == graphviz-dot
(add-to-list 'org-src-lang-modes '("dot" . graphviz-dot)) (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
;; Add 'conf-mode' to org-babel ;; Add 'conf-mode' to org-babel
(add-to-list 'org-src-lang-modes '("ini" . conf)) (add-to-list 'org-src-lang-modes '("ini" . conf))
(add-to-list 'org-src-lang-modes '("conf" . conf)) (add-to-list 'org-src-lang-modes '("conf" . conf))
''; '';
}; };
programs.emacs.init.usePackage.org-tempo = { programs.emacs.init.usePackage.org-tempo = {
enable = true; enable = true;
package = epkgs: null; package = epkgs: null;
}; };
programs.emacs.init.usePackage.ox = { programs.emacs.init.usePackage.ox = {
enable = true; enable = true;
package = epkgs: null; package = epkgs: null;
defer = true; defer = true;
command = []; command = [];
config = '' config = ''
;; Use html5 as org export and use new tags ;; Use html5 as org export and use new tags
(setq org-html-doctype "html5") (setq org-html-doctype "html5")
(setq org-html-html5-fancy t) (setq org-html-html5-fancy t)
;; Don't add html footer to export ;; Don't add html footer to export
(setq org-html-postamble nil) (setq org-html-postamble nil)
;; Don't export ^ or _ as super/subscripts ;; Don't export ^ or _ as super/subscripts
(setq org-export-with-sub-superscripts nil) (setq org-export-with-sub-superscripts nil)
''; '';
}; };
programs.emacs.init.usePackage.ox-gfm = { programs.emacs.init.usePackage.ox-gfm = {
enable = true; enable = true;
after = [ "ox" ]; after = ["ox"];
}; };
programs.emacs.init.usePackage.ox-rst = { programs.emacs.init.usePackage.ox-rst = {
enable = true; enable = true;
after = [ "ox" ]; after = ["ox"];
}; };
programs.emacs.init.usePackage.ox-md = { programs.emacs.init.usePackage.ox-md = {
enable = true; enable = true;
package = epkgs: null; package = epkgs: null;
after = [ "ox" ]; after = ["ox"];
}; };
programs.emacs.init.usePackage.org-bullets = { programs.emacs.init.usePackage.org-bullets = {
enable = true; enable = true;
hook = [ "(org-mode . org-bullets-mode)" ]; hook = ["(org-mode . org-bullets-mode)"];
}; };
programs.emacs.init.usePackage.org-crypt = { programs.emacs.init.usePackage.org-crypt = {
enable = true; enable = true;
package = epkgs: null; package = epkgs: null;
after = [ "org" ]; after = ["org"];
hook = [ "(org-mode . (lambda () (add-hook 'before-save-hook 'org-encrypt-entries nil t)))" ]; hook = ["(org-mode . (lambda () (add-hook 'before-save-hook 'org-encrypt-entries nil t)))"];
command = [ "org-decrypt-entry" "org-encrypt-entry" ]; command = ["org-decrypt-entry" "org-encrypt-entry"];
bindLocal = { org-mode-map = { bindLocal = {
"C-c d" = "org-decrypt-entry"; org-mode-map = {
"C-c e" = "org-encrypt-entry"; "C-c d" = "org-decrypt-entry";
};}; "C-c e" = "org-encrypt-entry";
config = '' };
(setq org-tags-exclude-from-inheritance (quote ("crypt"))) };
;; GPG key to use for encryption config = ''
(load-file "~/.emacs.d/org-crypt-key.el") (setq org-tags-exclude-from-inheritance (quote ("crypt")))
;; GPG key to use for encryption
(load-file "~/.emacs.d/org-crypt-key.el")
;; don't ask to disable auto-save ;; don't ask to disable auto-save
(setq org-crypt-disable-auto-save "encrypt") (setq org-crypt-disable-auto-save "encrypt")
''; '';
}; };
programs.emacs.init.usePackage.org-drill = { programs.emacs.init.usePackage.org-drill = {
enable = true; enable = true;
}; };
} }

View file

@ -1,13 +1,16 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::php-mode" config.machine.pkgs) {
mkIf (elem "emacs::php-mode" config.machine.pkgs) { programs.emacs.init.usePackage = {
programs.emacs.init.usePackage = { php-mode = {
php-mode = { enable = true;
enable = true; hook =
hook = lib.optional (elem "emacs::lsp" config.machine.pkgs) lib.optional (elem "emacs::lsp" config.machine.pkgs)
''(typescript-mode . (lambda () (lsp)))''; ''(typescript-mode . (lambda () (lsp)))'';
};
}; };
}; }
}

View file

@ -1,16 +1,18 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::powerline" config.machine.pkgs) {
mkIf (elem "emacs::powerline" config.machine.pkgs) { programs.emacs.init.usePackage.powerline = {
programs.emacs.init.usePackage.powerline = { enable = true;
enable = true; config = ''
config = '' ;; color palette from https://github.com/kuanyui/moe-theme.el/blob/master/moe-theme.el#L283
;; color palette from https://github.com/kuanyui/moe-theme.el/blob/master/moe-theme.el#L283 (set-face-attribute 'mode-line nil :background "#afd7ff" :foreground "#005f87")
(set-face-attribute 'mode-line nil :background "#afd7ff" :foreground "#005f87") (set-face-attribute 'mode-line-buffer-id nil :background "#afd7ff" :foreground "#080808")
(set-face-attribute 'mode-line-buffer-id nil :background "#afd7ff" :foreground "#080808") (set-face-attribute 'minibuffer-prompt nil :foreground "#5fafd7" :background "#3a3a3a")
(set-face-attribute 'minibuffer-prompt nil :foreground "#5fafd7" :background "#3a3a3a") (powerline-default-theme)
(powerline-default-theme) '';
''; };
}; }
}

View file

@ -1,45 +1,55 @@
{ config, lib, pkgs, ... }: {
config,
with lib; lib,
pkgs,
let ...
}:
with lib; let
rustEnv = pkgs.symlinkJoin { rustEnv = pkgs.symlinkJoin {
name = "rustEnv"; name = "rustEnv";
paths = config.machine.pkgsets.rustpkgs.pkgwrap; paths = config.machine.pkgsets.rustpkgs.pkgwrap;
}; };
in mkIf (elem "emacs::rust" config.machine.pkgs) { in
programs.emacs.init.usePackage.rust-mode = { mkIf (elem "emacs::rust" config.machine.pkgs) {
enable = true; programs.emacs.init.usePackage.rust-mode = {
hook = [ ''(rust-mode . (lambda () (cargo-minor-mode)))'' ] enable = true;
++ (if (elem "emacs::lsp" config.machine.pkgs) hook =
then [''(rust-mode . (lambda () (lsp)))''] [''(rust-mode . (lambda () (cargo-minor-mode)))'']
else [''(rust-mode . (lambda () (racer-mode)))'']); ++ (
mode = [ ''("\\.rs\\'" . rust-mode)'' ]; if (elem "emacs::lsp" config.machine.pkgs)
command = [ "rust-mode" ]; then [''(rust-mode . (lambda () (lsp)))'']
bindLocal = optionalAttrs (elem "emacs::company" config.machine.pkgs) { rust-mode-map = { else [''(rust-mode . (lambda () (racer-mode)))'']
"<tab>" = "company-indent-or-complete-common"; );
};}; mode = [''("\\.rs\\'" . rust-mode)''];
config = '' command = ["rust-mode"];
(setq rust-rustfmt-bin "${rustEnv}/bin/rustfmt") bindLocal = optionalAttrs (elem "emacs::company" config.machine.pkgs) {
(setq rust-format-on-save t) rust-mode-map = {
''; "<tab>" = "company-indent-or-complete-common";
}; };
};
config = ''
(setq rust-rustfmt-bin "${rustEnv}/bin/rustfmt")
(setq rust-format-on-save t)
'';
};
programs.emacs.init.usePackage.cargo = { programs.emacs.init.usePackage.cargo = {
enable = true; enable = true;
defer = true; defer = true;
}; };
programs.emacs.init.usePackage.racer = { programs.emacs.init.usePackage.racer = {
enable = true; enable = true;
defer = true; defer = true;
hook = [ hook =
''(racer-mode . (lambda () (eldoc-mode)))'' [
] ++ optional (elem "emacs::company" config.machine.pkgs) ''(racer-mode . (lambda () (company-mode)))''; ''(racer-mode . (lambda () (eldoc-mode)))''
]
++ optional (elem "emacs::company" config.machine.pkgs) ''(racer-mode . (lambda () (company-mode)))'';
config = '' config = ''
(setq racer-rust-src-path "${rustEnv}/lib/rustlib/src/rust/src") (setq racer-rust-src-path "${rustEnv}/lib/rustlib/src/rust/src")
(setq racer-cmd "${rustEnv}/bin/racer") (setq racer-cmd "${rustEnv}/bin/racer")
''; '';
}; };
} }

View file

@ -1,10 +1,12 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::solarized-theme" config.machine.pkgs) {
mkIf (elem "emacs::solarized-theme" config.machine.pkgs) { programs.emacs.init.usePackage.solarized-theme = {
programs.emacs.init.usePackage.solarized-theme = { enable = true;
enable = true; config = "(load-theme 'solarized-dark t)";
config = "(load-theme 'solarized-dark t)"; };
}; }
}

View file

@ -1,15 +1,17 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::telega" config.machine.pkgs) {
mkIf (elem "emacs::telega" config.machine.pkgs) { programs.emacs.init.usePackage.telegram = {
programs.emacs.init.usePackage.telegram = { enable = true;
enable = true; defer = true;
defer = true; package = epkgs: [epkgs.telega epkgs.visual-fill-column];
package = epkgs: [ epkgs.telega epkgs.visual-fill-column ]; command = ["telega"];
command = [ "telega" ]; config = ''
config = '' (telega-alert-mode 1)
(telega-alert-mode 1) '';
''; };
}; }
}

View file

@ -1,47 +1,50 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::transmission" config.machine.pkgs) {
mkIf (elem "emacs::transmission" config.machine.pkgs) { programs.emacs.init.usePackage = {
programs.emacs.init.usePackage = { transmission = {
transmission = { enable = true;
enable = true; defer = true;
defer = true; command = ["transmission"];
command = [ "transmission" ]; bindLocal = {
bindLocal = { transmission-mode-map = {
transmission-mode-map = { "A" = '' (lambda ()
"A" = ''(lambda () (interactive)
(interactive) (transmission-add (read-string "Magnet URI: ")))'';
(transmission-add (read-string "Magnet URI: ")))''; };
}; };
}; config = ''
config = '' ;; Auto refresh for all transmission buffers
;; Auto refresh for all transmission buffers (setq transmission-refresh-modes '(transmission-mode
(setq transmission-refresh-modes '(transmission-mode transmission-files-mode
transmission-files-mode transmission-info-mode
transmission-info-mode transmission-peers-mode))
transmission-peers-mode))
(defun transmission () (defun transmission ()
"Open a `transmission-mode' buffer." "Open a `transmission-mode' buffer."
(interactive) (interactive)
(let* ((name "*transmission*") (let* ((name "*transmission*")
(buffer (or (get-buffer name) (buffer (or (get-buffer name)
(generate-new-buffer name)))) (generate-new-buffer name))))
(transmission-turtle-poll) (transmission-turtle-poll)
(unless (eq buffer (current-buffer)) (unless (eq buffer (current-buffer))
(with-current-buffer buffer (with-current-buffer buffer
(unless (eq major-mode 'transmission-mode) (unless (eq major-mode 'transmission-mode)
(condition-case e (condition-case e
(progn (progn
(transmission-mode) (transmission-mode)
(revert-buffer) (revert-buffer)
(goto-char (point-min))) (goto-char (point-min)))
(error (error
(kill-buffer buffer) (kill-buffer buffer)
(signal (car e) (cdr e)))))) (signal (car e) (cdr e))))))
(switch-to-buffer buffer)))) (switch-to-buffer buffer))))
''; '';
};
}; };
}; }
}

View file

@ -1,16 +1,18 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::undo-tree" config.machine.pkgs) {
mkIf (elem "emacs::undo-tree" config.machine.pkgs) { programs.emacs.init.usePackage.undo-tree = {
programs.emacs.init.usePackage.undo-tree = { enable = true;
enable = true; hook = ["(after-init . global-undo-tree-mode)"];
hook = [ "(after-init . global-undo-tree-mode)" ]; config = ''
config = '' (setq undo-tree-visualizer-diff 't)
(setq undo-tree-visualizer-diff 't) (setq undo-tree-auto-save-history 't)
(setq undo-tree-auto-save-history 't) (setq undo-tree-enable-undo-in-region 't)
(setq undo-tree-enable-undo-in-region 't) (setq undo-tree-history-directory-alist '(("." . "~/.emacs_undo")))
(setq undo-tree-history-directory-alist '(("." . "~/.emacs_undo"))) '';
''; };
}; }
}

View file

@ -1,98 +1,100 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "emacs::web-mode" config.machine.pkgs) {
programs.emacs.init.usePackage = {
web-mode = {
enable = true;
init = "(require 'sgml-mode)";
hook = [
"(web-mode . (lambda () (sgml-electric-tag-pair-mode)))"
''
(web-mode . (lambda ()
(when (and (buffer-file-name)
(equal (file-name-extension (buffer-file-name)) "svelte"))
(lsp))))
''
];
# bind = {};
mode = [
''("\\.html\\'" . web-mode)''
''("\\.css\\'" . web-mode)''
''("\\.html?\\'" . web-mode)''
''("\\.svelte\\'" . web-mode)''
''("\\.phtml\\'" . web-mode)''
''("\\.tpl\\.php\\'" . web-mode)''
''("\\.[agj]sp\\'" . web-mode)''
''("\\.as[cp]x\\'" . web-mode)''
''("\\.erb\\'" . web-mode)''
''("\\.mustache\\'" . web-mode)''
''("\\.djhtml\\'" . web-mode)''
];
config = ''
(setq web-mode-markup-indent-offset 2)
(setq web-mode-css-indent-offset 2)
(setq web-mode-code-indent-offset 2)
(setq web-mode-sql-indent-offset 2)
(setq web-mode-script-padding 2)
(setq web-mode-style-padding 2)
(setq web-mode-part-padding 2)
(setq web-mode-block-padding 2)
(setq web-mode-enable-comment-annotation 't)
mkIf (elem "emacs::web-mode" config.machine.pkgs) { (setq web-mode-enable-current-element-highlight 't)
programs.emacs.init.usePackage = {
web-mode = {
enable = true;
init = "(require 'sgml-mode)";
hook = [
"(web-mode . (lambda () (sgml-electric-tag-pair-mode)))"
''
(web-mode . (lambda ()
(when (and (buffer-file-name)
(equal (file-name-extension (buffer-file-name)) "svelte"))
(lsp))))
''
];
# bind = {};
mode = [
''("\\.html\\'" . web-mode)''
''("\\.css\\'" . web-mode)''
''("\\.html?\\'" . web-mode)''
''("\\.svelte\\'" . web-mode)''
''("\\.phtml\\'" . web-mode)''
''("\\.tpl\\.php\\'" . web-mode)''
''("\\.[agj]sp\\'" . web-mode)''
''("\\.as[cp]x\\'" . web-mode)''
''("\\.erb\\'" . web-mode)''
''("\\.mustache\\'" . web-mode)''
''("\\.djhtml\\'" . web-mode)''
];
config = ''
(setq web-mode-markup-indent-offset 2)
(setq web-mode-css-indent-offset 2)
(setq web-mode-code-indent-offset 2)
(setq web-mode-sql-indent-offset 2)
(setq web-mode-script-padding 2)
(setq web-mode-style-padding 2)
(setq web-mode-part-padding 2)
(setq web-mode-block-padding 2)
(setq web-mode-enable-comment-annotation 't)
(setq web-mode-enable-current-element-highlight 't) (setq web-mode-enable-sql-detection 't)
(setq web-mode-auto-close-style 2)
(setq web-mode-enable-sql-detection 't) (setq web-mode-engines-alist
(setq web-mode-auto-close-style 2) '(("php" . "\\.phtml\\'")
("blade" . "\\.blade\\."))
(setq web-mode-engines-alist )
'(("php" . "\\.phtml\\'") '';
("blade" . "\\.blade\\.")) };
) js2-mode = {
''; enable = true;
mode = [
''("\\.js\\'" . js2-mode)''
];
};
typescript-mode = {
enable = true;
hook =
["(typescript-mode . (lambda () (subword-mode)))"]
++ lib.optional (elem "emacs::lsp" config.machine.pkgs)
''(typescript-mode . (lambda () (lsp)))'';
mode = [
''("\\.ts\\'" . typescript-mode)''
''("\\.tsx?\\'" . typescript-tsx-mode)''
];
init = ''
(define-derived-mode typescript-tsx-mode typescript-mode "tsx")
'';
config = ''
(setq typescript-indent-level 2)
'';
};
# https://github.com/NixOS/nixpkgs/pull/150239
tree-sitter = {
enable = true;
package = epkgs: [epkgs.tree-sitter (epkgs.tree-sitter-langs.withPlugins (p: epkgs.tree-sitter-langs.plugins ++ [p.tree-sitter-markdown p.tree-sitter-tsx]))];
hook = [
"(typescript-mode . tree-sitter-hl-mode)"
"(typescript-tsx-mode . tree-sitter-hl-mode)"
];
config = ''
(tree-sitter-require 'tsx)
(add-to-list 'tree-sitter-major-mode-language-alist '(typescript-tsx-mode . tsx))
'';
};
impatient-mode = {
enable = true;
};
simple-httpd = {
enable = true;
};
}; };
js2-mode = { }
enable = true;
mode = [
''("\\.js\\'" . js2-mode)''
];
};
typescript-mode = {
enable = true;
hook = [ "(typescript-mode . (lambda () (subword-mode)))" ]
++ lib.optional (elem "emacs::lsp" config.machine.pkgs)
''(typescript-mode . (lambda () (lsp)))'';
mode = [
''("\\.ts\\'" . typescript-mode)''
''("\\.tsx?\\'" . typescript-tsx-mode)''
];
init = ''
(define-derived-mode typescript-tsx-mode typescript-mode "tsx")
'';
config = ''
(setq typescript-indent-level 2)
'';
};
# https://github.com/NixOS/nixpkgs/pull/150239
tree-sitter = {
enable = true;
package = (epkgs: [ epkgs.tree-sitter (epkgs.tree-sitter-langs.withPlugins(p: epkgs.tree-sitter-langs.plugins ++ [ p.tree-sitter-markdown p.tree-sitter-tsx ]))]);
hook = [
"(typescript-mode . tree-sitter-hl-mode)"
"(typescript-tsx-mode . tree-sitter-hl-mode)"
];
config = ''
(tree-sitter-require 'tsx)
(add-to-list 'tree-sitter-major-mode-language-alist '(typescript-tsx-mode . tsx))
'';
};
impatient-mode = {
enable = true;
};
simple-httpd = {
enable = true;
};
};
}

View file

@ -1,11 +1,14 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::yaml-mode" config.machine.pkgs) {
mkIf (elem "emacs::yaml-mode" config.machine.pkgs) { programs.emacs.init.usePackage = {
programs.emacs.init.usePackage = { yaml-mode = {
yaml-mode = { enable = true;
enable = true; };
}; };
}; }
}

View file

@ -1,18 +1,21 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "emacs::yasnippet" config.machine.pkgs) {
programs.emacs.init.usePackage = {
yasnippet = {
enable = true;
hook = ["(after-init . yas-global-mode)"];
# config = ''
mkIf (elem "emacs::yasnippet" config.machine.pkgs) { # '';
programs.emacs.init.usePackage = { };
yasnippet = { yasnippet-snippets = {
enable = true; enable = true;
hook = [ "(after-init . yas-global-mode)" ]; };
# config = ''
# '';
}; };
yasnippet-snippets = { }
enable = true;
};
};
}

View file

@ -1,6 +1,8 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.extra.pkgs = with pkgs; [ config.machine.pkgsets.extra.pkgs = with pkgs; [
alsaUtils alsaUtils
binutils-unwrapped binutils-unwrapped

View file

@ -1,5 +1,7 @@
{ config, pkgs, ... }:
{ {
config.machine.pkgsets.haskell-tools.pkgs = with pkgs; [ cabal-install hlint ]; # ghcid config,
pkgs,
...
}: {
config.machine.pkgsets.haskell-tools.pkgs = with pkgs; [cabal-install hlint]; # ghcid
} }

View file

@ -1,7 +1,11 @@
{ config, lib, fn, pkgs, ... }:
{ {
config.machine.pkgsets.haskell.pkgwrap = (pkgs.haskellPackages.ghcWithPackages (pkgs: (fn.pkgFilter config.machine.pkgsets.haskell.pkgs))); config,
lib,
fn,
pkgs,
...
}: {
config.machine.pkgsets.haskell.pkgwrap = pkgs.haskellPackages.ghcWithPackages (pkgs: (fn.pkgFilter config.machine.pkgsets.haskell.pkgs));
config.machine.pkgsets.haskell.pkgs = with pkgs.haskellPackages; [ config.machine.pkgsets.haskell.pkgs = with pkgs.haskellPackages; [
hindent hindent
mtl mtl

View file

@ -1,8 +1,10 @@
{ config, lib, pkgs, ... }:
with lib;
{ {
config,
lib,
pkgs,
...
}:
with lib; {
config.machine.pkgsets.latex.pkgs = with pkgs; [ config.machine.pkgsets.latex.pkgs = with pkgs; [
texlive.combined.scheme-full texlive.combined.scheme-full
texlab texlab

View file

@ -1,6 +1,8 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.mail_utils.pkgs = with pkgs; [ config.machine.pkgsets.mail_utils.pkgs = with pkgs; [
fetchmail fetchmail
isync isync

View file

@ -1,25 +1,28 @@
{ config, pkgs, ... }:
{ {
config.machine.pkgsets.nodejs.pkgs = (with pkgs; [ nodejs yarn deno esbuild ]) ++ config,
(with pkgs.nodePackages; [ pkgs,
autoprefixer ...
browserify }: {
create-react-app config.machine.pkgsets.nodejs.pkgs =
degit (with pkgs; [nodejs yarn deno esbuild])
mermaid-cli ++ (with pkgs.nodePackages; [
parcel-bundler autoprefixer
prettier browserify
prisma create-react-app
rollup degit
serve mermaid-cli
svelte-check parcel-bundler
svelte-language-server prettier
tailwindcss prisma
ts-node rollup
typescript serve
typescript-language-server svelte-check
webpack svelte-language-server
webpack-cli tailwindcss
]); ts-node
typescript
typescript-language-server
webpack
webpack-cli
]);
} }

View file

@ -1,8 +1,14 @@
{ config, lib, fn, pkgs, ... }:
{ {
config.machine.pkgsets.php.pkgwrap = (fn.pkgFilter config.machine.pkgsets.php.pkgs); config,
config.machine.pkgsets.php.pkgs = (with pkgs.php82Packages; [ lib,
composer fn,
]) ++ (with pkgs; [ php82 ]); pkgs,
...
}: {
config.machine.pkgsets.php.pkgwrap = fn.pkgFilter config.machine.pkgsets.php.pkgs;
config.machine.pkgsets.php.pkgs =
(with pkgs.php82Packages; [
composer
])
++ (with pkgs; [php82]);
} }

View file

@ -1,9 +1,12 @@
{ config, lib, fn, pkgs, ... }:
with lib;
{ {
config.machine.pkgsets.python3.pkgwrap = (pkgs.python310.withPackages (ps: (fn.pkgFilter config.machine.pkgsets.python3.pkgs))); config,
lib,
fn,
pkgs,
...
}:
with lib; {
config.machine.pkgsets.python3.pkgwrap = pkgs.python310.withPackages (ps: (fn.pkgFilter config.machine.pkgsets.python3.pkgs));
config.machine.pkgsets.python3.pkgs = with pkgs.python310Packages; [ config.machine.pkgsets.python3.pkgs = with pkgs.python310Packages; [
GitPython GitPython
bpython bpython
@ -13,7 +16,8 @@ with lib;
epc epc
flake8 flake8
genanki genanki
matplotlib ipywidgets matplotlib
ipywidgets
python-docx python-docx
mypy mypy
numpy numpy
@ -29,7 +33,8 @@ with lib;
pypdf2 pypdf2
# pygame pygame_sdl2 # pygame pygame_sdl2
pylama pylama
pylint toml pylint
toml
pyopengl pyopengl
pyproj pyproj
pytest pytest

View file

@ -1,14 +1,15 @@
{ config, ... }: {config, ...}: let
mozRust = with builtins;
let (map (p:
mozRust = with builtins; (map (p: import ((fetchTarball { import ((fetchTarball {
url = "https://github.com/mozilla/nixpkgs-mozilla/archive/e912ed4.tar.gz"; url = "https://github.com/mozilla/nixpkgs-mozilla/archive/e912ed4.tar.gz";
sha256 = "08fvzb8w80bkkabc1iyhzd15f4sm7ra10jn32kfch5klgl0gj3j3"; sha256 = "08fvzb8w80bkkabc1iyhzd15f4sm7ra10jn32kfch5klgl0gj3j3";
}) + p))) [ })
(toPath "/lib-overlay.nix") + p))) [
(toPath "/rust-overlay.nix") (toPath "/lib-overlay.nix")
]; (toPath "/rust-overlay.nix")
stablepkgs = import <nixos-stable> { overlays = mozRust;}; ];
stablepkgs = import <nixos-stable> {overlays = mozRust;};
# https://rust-lang.github.io/rustup-components-history # https://rust-lang.github.io/rustup-components-history
nightly = stablepkgs.rustChannelOf { nightly = stablepkgs.rustChannelOf {
@ -16,24 +17,28 @@ let
channel = "nightly"; channel = "nightly";
}; };
rustNightly = { rustNightly = {
rustc = nightly.rust.override { rustc =
extensions = [ nightly.rust.override {
"clippy-preview" extensions = [
"rls-preview" "clippy-preview"
"rust-analysis" "rls-preview"
"rust-src" "rust-analysis"
"rustfmt-preview" "rust-src"
]; } // { src = nightly.rust-src; }; "rustfmt-preview"
];
}
// {src = nightly.rust-src;};
cargo = nightly.cargo; cargo = nightly.cargo;
}; };
rustPNightly = stablepkgs.recurseIntoAttrs (stablepkgs.makeRustPlatform { rustPNightly = stablepkgs.recurseIntoAttrs (stablepkgs.makeRustPlatform {
inherit (rustNightly) rustc cargo; inherit (rustNightly) rustc cargo;
}); });
in { in {
config.machine.pkgsets.rustpkgs.pkgs = (with stablepkgs; [ config.machine.pkgsets.rustpkgs.pkgs =
diesel-cli (with stablepkgs; [
carnix diesel-cli
rustracer carnix
]) ++ (with rustNightly; [ rustc cargo]); rustracer
])
++ (with rustNightly; [rustc cargo]);
} }

View file

@ -1,6 +1,8 @@
{ config, pkgs, ... }:
{ {
config,
pkgs,
...
}: {
config.machine.pkgsets.server.pkgs = with pkgs; [ config.machine.pkgsets.server.pkgs = with pkgs; [
audit audit
certbot certbot

View file

@ -1,8 +1,10 @@
{ config, lib, pkgs, ... }:
with lib;
{ {
config,
lib,
pkgs,
...
}:
with lib; {
config.machine.pkgsets.tracking.pkgs = with pkgs; [ config.machine.pkgsets.tracking.pkgs = with pkgs; [
aw-qt aw-qt
aw-server-rust aw-server-rust

View file

@ -1,5 +1,7 @@
{ config, pkgs, ... }:
{ {
config.machine.pkgsets.uniProgs.pkgs = with pkgs; [ qucs ]; config,
pkgs,
...
}: {
config.machine.pkgsets.uniProgs.pkgs = with pkgs; [qucs];
} }

View file

@ -1,7 +1,9 @@
{ config, pkgs, ... }: {
config,
let pkgs,
cfg = config.machine; ...
}: let
cfg = config.machine;
in { in {
config.machine.pkgsets.xpkgs.pkgs = with pkgs; [ config.machine.pkgsets.xpkgs.pkgs = with pkgs; [
acpilight acpilight
@ -13,7 +15,9 @@ in {
gnome3.gvfs gnome3.gvfs
gvfs gvfs
oneko oneko
pcmanfm lxmenu-data shared-mime-info pcmanfm
lxmenu-data
shared-mime-info
pavucontrol pavucontrol
xclip xclip
xorg.xkill xorg.xkill

View file

@ -1,14 +1,19 @@
{ options, config, lib, fn, pkgs, ... }: {
options,
config,
lib,
fn,
pkgs,
...
}:
with builtins; with builtins;
with lib; with lib; let
let
cfg = config.machine; cfg = config.machine;
in mkIf (elem "acme" cfg.services) { in
security.acme = { mkIf (elem "acme" cfg.services) {
# see https://letsencrypt.org/repository/ security.acme = {
acceptTerms = true; # see https://letsencrypt.org/repository/
defaults.email = "${(elemAt cfg.mailAccounts 0).name}@${cfg.domain}"; acceptTerms = true;
}; defaults.email = "${(elemAt cfg.mailAccounts 0).name}@${cfg.domain}";
} };
}

View file

@ -1,28 +1,36 @@
# This Configuration is meant for local DNS setups only! # This Configuration is meant for local DNS setups only!
{ options, config, lib, fn, pkgs, ... }: {
options,
config,
lib,
fn,
pkgs,
...
}:
with builtins; with builtins;
with lib; with lib; let
let
cfg = config.machine; cfg = config.machine;
in mkIf (elem "bind" cfg.services) { in
services.bind = { mkIf (elem "bind" cfg.services) {
enable = true; services.bind = {
listenOn = [ "127.0.0.1" ]; enable = true;
forwarders = [ listenOn = ["127.0.0.1"];
# Cloudflare CDN forwarders = [
"1.1.1.1" "1.0.0.1" # Cloudflare CDN
#CCC DNS "1.1.1.1"
"204.152.184.76" "159.203.38.175" "207.148.83.241" "1.0.0.1"
]; #CCC DNS
# TODO: add DNSSEC "204.152.184.76"
extraOptions = '' "159.203.38.175"
dnssec-validation auto; "207.148.83.241"
];
# TODO: add DNSSEC
extraOptions = ''
dnssec-validation auto;
recursion yes; recursion yes;
allow-recursion { 127.0.0.1; }; allow-recursion { 127.0.0.1; };
version none; version none;
''; '';
}; };
} }

View file

@ -1,14 +1,15 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "containers" config.machine.services) {
mkIf (elem "containers" config.machine.services) { containers.CDServer = {
containers.CDServer = { privateNetwork = true;
privateNetwork = true; hostAddress = "192.168.100.10";
hostAddress = "192.168.100.10"; localAddress = "192.168.100.11";
localAddress = "192.168.100.11"; config = {
config =
{
imports = [ imports = [
../machines/CDServer/options.nix ../machines/CDServer/options.nix
./default.nix ./default.nix
@ -16,8 +17,8 @@ mkIf (elem "containers" config.machine.services) {
../pkgs/nixpkgs.nix ../pkgs/nixpkgs.nix
../pkgs/pkgsets.nix ../pkgs/pkgsets.nix
]; ];
services.nixosManual.showManual = false; services.nixosManual.showManual = false;
services.ntp.enable = false; services.ntp.enable = false;
}; };
}; };
} }

View file

@ -1,11 +1,14 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "cups" config.machine.services) {
mkIf (elem "cups" config.machine.services) { services.printing = {
services.printing = { enable = true;
enable = true; startWhenNeeded = true;
startWhenNeeded = true; drivers = with pkgs; [gutenprint hplip splix samsung-unified-linux-driver];
drivers = with pkgs; [ gutenprint hplip splix samsung-unified-linux-driver ]; };
}; }
}

View file

@ -1,28 +1,36 @@
{ config, lib, fn, pkgs, ... }: {
config,
with lib; lib,
fn,
let pkgs,
...
}:
with lib; let
cfg = config.machine; cfg = config.machine;
desktopFiles = fn.lst { p = (toString ./desktop); b = true; }; desktopFiles = fn.lst {
in { p = toString ./desktop;
imports = desktopFiles; b = true;
} // mkIf (elem "desktop" cfg.services) { };
services.gvfs.enable = true; in
services.xserver = { {
layout = "de"; imports = desktopFiles;
libinput = { }
enable = true; // mkIf (elem "desktop" cfg.services) {
touchpad = { services.gvfs.enable = true;
tapping = true; services.xserver = {
disableWhileTyping = false; layout = "de";
naturalScrolling = false; libinput = {
horizontalScrolling = true; enable = true;
touchpad = {
tapping = true;
disableWhileTyping = false;
naturalScrolling = false;
horizontalScrolling = true;
};
}; };
}; };
}; services.udev.extraRules = ''
services.udev.extraRules = '' ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chgrp video /sys/class/backlight/%k/brightness"
ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chgrp video /sys/class/backlight/%k/brightness" ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chmod 664 /sys/class/backlight/%k/brightness"
ACTION=="add", SUBSYSTEM=="backlight", RUN+="${pkgs.coreutils}/bin/chmod 664 /sys/class/backlight/%k/brightness" '';
''; }
}

View file

@ -1,21 +1,24 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "desktop::i3" config.machine.services) {
mkIf (elem "desktop::i3" config.machine.services) { services.xserver = {
services.xserver = {
enable = true;
windowManager.i3 = {
enable = true; enable = true;
configFile = (import ../../config/etc/i3/config.nix { inherit pkgs; }); windowManager.i3 = {
extraPackages = with pkgs; [ enable = true;
dmenu configFile = import ../../config/etc/i3/config.nix {inherit pkgs;};
file extraPackages = with pkgs; [
i3lock dmenu
i3status file
xdg-user-dirs i3lock
]; i3status
xdg-user-dirs
];
};
}; };
}; machine.pkgsets.python3.pkgs = with pkgs.python310Packages; [py3status pytz tzlocal];
machine.pkgsets.python3.pkgs = with pkgs.python310Packages; [ py3status pytz tzlocal ]; }
}

View file

@ -1,33 +1,39 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
with lib; with lib;
mkIf (elem "desktop::sway" config.machine.services) {
mkIf (elem "desktop::sway" config.machine.services) { programs.sway = {
programs.sway = { enable = true;
enable = true; extraPackages = with pkgs; [
extraPackages = with pkgs; [ xwayland
xwayland file
file i3status dmenu i3status
qt5.qtwayland dmenu
grim slurp qt5.qtwayland
swaylock grim
swayidle slurp
light swaylock
mako swayidle
wl-clipboard light
wf-recorder mako
]; wl-clipboard
extraSessionCommands = '' wf-recorder
export GDK_BACKEND=wayland ];
export CLUTTER_BACKEND=wayland extraSessionCommands = ''
export SDL_VIDEODRIVER=wayland export GDK_BACKEND=wayland
# needs qt5.qtwayland in systemPackages export CLUTTER_BACKEND=wayland
export QT_QPA_PLATFORM=wayland-egl export SDL_VIDEODRIVER=wayland
export QT_WAYLAND_FORCE_DPI=physical # needs qt5.qtwayland in systemPackages
export QT_WAYLAND_DISABLE_WINDOWDECORATION="1" export QT_QPA_PLATFORM=wayland-egl
# Fix for some Java AWT applications (e.g. Android Studio), export QT_WAYLAND_FORCE_DPI=physical
# use this if they aren't displayed properly: export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
export _JAVA_AWT_WM_NONREPARENTING=1 # Fix for some Java AWT applications (e.g. Android Studio),
''; # use this if they aren't displayed properly:
}; export _JAVA_AWT_WM_NONREPARENTING=1
} '';
};
}

View file

@ -1,13 +1,16 @@
{ config, lib, pkgs, ... }: {
config,
lib,
pkgs,
...
}:
# Note: add privileged users to docker group for access # Note: add privileged users to docker group for access
with lib; with lib;
mkIf ((elem "docker" config.machine.services) && !(elem "podman" config.machine.services)) {
mkIf ((elem "docker" config.machine.services) && !(elem "podman" config.machine.services)) { virtualisation.docker = {
virtualisation.docker= { enable = true;
enable = true; # Disable live restore as it tends to delay/block system shutdown
# Disable live restore as it tends to delay/block system shutdown liveRestore = false;
liveRestore = false; };
}; environment.systemPackages = with pkgs; [docker-compose docker-machine cntr];
environment.systemPackages = with pkgs; [ docker-compose docker-machine cntr ]; }
}

View file

@ -1,102 +1,104 @@
{ config, lib, ... }: {
config,
with lib; lib,
...
let }:
with lib; let
cfg = config.machine; cfg = config.machine;
active = name: (elem name cfg.services); active = name: (elem name cfg.services);
in mkIf (elem "fail2ban" cfg.services) { in
services.fail2ban = { mkIf (elem "fail2ban" cfg.services) {
enable = true; services.fail2ban = {
jails = { enable = true;
DEFAULT = '' jails = {
bantime = 3600 DEFAULT = ''
blocktype = DROP bantime = 3600
logpath = /var/log/auth.log blocktype = DROP
''; logpath = /var/log/auth.log
'';
ssh = '' ssh = ''
enabled = ${boolToString (active "openssh")} enabled = ${boolToString (active "openssh")}
filter = sshd filter = sshd
maxretry = 4 maxretry = 4
action = iptables[name=SSH, port=ssh, protocol=tcp] action = iptables[name=SSH, port=ssh, protocol=tcp]
''; '';
sshd-ddos = '' sshd-ddos = ''
enabled = ${boolToString (active "openssh")} enabled = ${boolToString (active "openssh")}
filter = sshd-ddos filter = sshd-ddos
maxretry = 4 maxretry = 4
action = iptables[name=ssh, port=ssh, protocol=tcp] action = iptables[name=ssh, port=ssh, protocol=tcp]
''; '';
postfix = '' postfix = ''
enabled = ${boolToString (active "mailserver")} enabled = ${boolToString (active "mailserver")}
filter = postfix filter = postfix
maxretry = 3 maxretry = 3
action = iptables[name=postfix, port=smtp, protocol=tcp] action = iptables[name=postfix, port=smtp, protocol=tcp]
''; '';
postfix-sasl = '' postfix-sasl = ''
enabled = ${boolToString (active "mailserver")} enabled = ${boolToString (active "mailserver")}
filter = postfix-sasl filter = postfix-sasl
port = postfix,imap3,imaps,pop3,pop3s port = postfix,imap3,imaps,pop3,pop3s
maxretry = 3 maxretry = 3
action = iptables[name=postfix, port=smtp, protocol=tcp] action = iptables[name=postfix, port=smtp, protocol=tcp]
''; '';
postfix-ddos = '' postfix-ddos = ''
enabled = ${boolToString (active "mailserver")} enabled = ${boolToString (active "mailserver")}
filter = postfix-ddos filter = postfix-ddos
maxretry = 3 maxretry = 3
action = iptables[name=postfix, port=submission, protocol=tcp] action = iptables[name=postfix, port=submission, protocol=tcp]
bantime = 7200 bantime = 7200
''; '';
nginx-req-limit = '' nginx-req-limit = ''
enabled = ${boolToString (active "nginx")} enabled = ${boolToString (active "nginx")}
filter = nginx-req-limit filter = nginx-req-limit
maxretry = 10 maxretry = 10
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp] action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
findtime = 600 findtime = 600
bantime = 7200 bantime = 7200
'';
};
};
environment.etc."fail2ban/filter.d/sshd-ddos.conf" = {
enable = active "openssh";
text = ''
[Definition]
failregex = sshd(?:\[\d+\])?: Did not receive identification string from <HOST>$
ignoreregex =
''; '';
}; };
};
environment.etc."fail2ban/filter.d/sshd-ddos.conf" = { environment.etc."fail2ban/filter.d/postfix-sasl.conf" = {
enable = (active "openssh"); enable = active "mailserver";
text = '' text = ''
[Definition] # Fail2Ban filter for postfix authentication failures
failregex = sshd(?:\[\d+\])?: Did not receive identification string from <HOST>$ [INCLUDES]
ignoreregex = before = common.conf
''; [Definition]
}; daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
'';
};
environment.etc."fail2ban/filter.d/postfix-sasl.conf" = { environment.etc."fail2ban/filter.d/postfix-ddos.conf" = {
enable = (active "mailserver"); enable = active "mailserver";
text = '' text = ''
# Fail2Ban filter for postfix authentication failures [Definition]
[INCLUDES] failregex = lost connection after EHLO from \S+\[<HOST>\]
before = common.conf '';
[Definition] };
daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$
'';
};
environment.etc."fail2ban/filter.d/postfix-ddos.conf" = { environment.etc."fail2ban/filter.d/nginx-req-limit.conf" = {
enable = (active "mailserver"); enable = active "nginx";
text = '' text = ''
[Definition] [Definition]
failregex = lost connection after EHLO from \S+\[<HOST>\] failregex = limiting requests, excess:.* by zone.*client: <HOST>
''; '';
}; };
environment.etc."fail2ban/filter.d/nginx-req-limit.conf" = { # Limit stack size to reduce memory usage
enable = (active "nginx"); systemd.services.fail2ban.serviceConfig.LimitSTACK = 256 * 1024;
text = '' }
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
'';
};
# Limit stack size to reduce memory usage
systemd.services.fail2ban.serviceConfig.LimitSTACK = 256 * 1024;
}

View file

@ -1,18 +1,24 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "fprintd" config.machine.services) {
security.pam.services = let
unlock = [
"sudo"
"i3lock"
"login"
"lightdm"
];
in
listToAttrs (forEach unlock (n: {
name = n;
value = {fprintAuth = true;};
}));
mkIf (elem "fprintd" config.machine.services) { services.fprintd = {
security.pam.services = let enable = true;
unlock = [ };
"sudo" }
"i3lock"
"login"
"lightdm"
];
in listToAttrs (forEach unlock (n: {name = n; value = { fprintAuth = true; }; }));
services.fprintd = {
enable = true;
};
}

View file

@ -1,54 +1,56 @@
{ config, lib, ... }: {
config,
lib,
...
}:
with lib; with lib;
mkIf (elem "gitea" config.machine.services) {
mkIf (elem "gitea" config.machine.services) { services = {
services = { gitea = let
gitea = let cfg = config.machine;
cfg = config.machine; domain = (findFirst (s: s.service == "gitea") cfg cfg.vHosts).domain;
domain = (findFirst (s: s.service == "gitea") cfg cfg.vHosts).domain; in {
in { enable = true;
enable = true;
user = "git";
database = {
type = "mysql";
user = "git"; user = "git";
name = "gitea"; database = {
passwordFile = config.sops.secrets."services/gitea/dbPass".path; type = "mysql";
}; user = "git";
settings = { name = "gitea";
repository = { passwordFile = config.sops.secrets."services/gitea/dbPass".path;
DISABLE_HTTP_GIT = false;
USE_COMPAT_SSH_URI = true;
}; };
settings = {
repository = {
DISABLE_HTTP_GIT = false;
USE_COMPAT_SSH_URI = true;
};
security = { security = {
INSTALL_LOCK = true; INSTALL_LOCK = true;
COOKIE_USERNAME = "gitea_username"; COOKIE_USERNAME = "gitea_username";
COOKIE_REMEMBER_NAME = "gitea_userauth"; COOKIE_REMEMBER_NAME = "gitea_userauth";
}; };
server = { server = {
DOMAIN = domain; DOMAIN = domain;
ROOT_URL = "https://${domain}/"; ROOT_URL = "https://${domain}/";
}; };
service = { service = {
DISABLE_REGISTRATION = (lib.mkForce true); DISABLE_REGISTRATION = lib.mkForce true;
}; };
session = { session = {
cookieSecure = true; cookieSecure = true;
};
}; };
}; };
}; };
}; sops.secrets."services/gitea/dbPass" = {};
sops.secrets."services/gitea/dbPass" = {}; users.users.git = {
users.users.git = { description = "Gitea Service";
description = "Gitea Service"; isNormalUser = true;
isNormalUser = true; home = config.services.gitea.stateDir;
home = config.services.gitea.stateDir; createHome = true;
createHome = true; useDefaultShell = true;
useDefaultShell = true; };
}; }
}

Some files were not shown because too many files have changed in this diff Show more