Format the entire project.
This commit is contained in:
parent
1dc50ae17d
commit
6f9db5e3a4
115 changed files with 3451 additions and 2901 deletions
|
@ -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;
|
||||||
|
|
|
@ -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 doesn’t 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 window’s width.
|
|
||||||
# Pressing right will grow the window’s width.
|
|
||||||
# Pressing up will shrink the window’s height.
|
|
||||||
# Pressing down will grow the window’s 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 doesn’t 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 window’s width.
|
||||||
|
# Pressing right will grow the window’s width.
|
||||||
|
# Pressing up will shrink the window’s height.
|
||||||
|
# Pressing down will grow the window’s 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
|
||||||
'')
|
'')
|
||||||
|
|
|
@ -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"
|
||||||
'')
|
'')
|
||||||
|
|
|
@ -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
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
62
flake.nix
62
flake.nix
|
@ -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
129
fn.nix
|
@ -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"] ["" "::" ""])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{ config, lib, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
sops = {
|
sops = {
|
||||||
defaultSopsFile = ./secrets.yaml;
|
defaultSopsFile = ./secrets.yaml;
|
||||||
age = {
|
age = {
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
{ pkgs, ... }:
|
{pkgs, ...}: {
|
||||||
|
|
||||||
{
|
|
||||||
services.cron.enable = false;
|
services.cron.enable = false;
|
||||||
security.pki.certificateFiles = [
|
security.pki.certificateFiles = [
|
||||||
./certs/proxy
|
./certs/proxy
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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 = [];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{ config, lib, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
sops = {
|
sops = {
|
||||||
defaultSopsFile = ./secrets.yaml;
|
defaultSopsFile = ./secrets.yaml;
|
||||||
age = {
|
age = {
|
||||||
|
|
|
@ -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 "'';
|
||||||
|
|
||||||
|
|
|
@ -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 = [];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{ config, lib, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
sops = {
|
sops = {
|
||||||
defaultSopsFile = ./secrets.yaml;
|
defaultSopsFile = ./secrets.yaml;
|
||||||
age = {
|
age = {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 = ''
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
|
@ -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"])
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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/;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = [];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = [
|
||||||
|
|
|
@ -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];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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
|
||||||
];
|
];
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]))
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = ''
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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 ];
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)"}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)))))
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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)''}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
'';
|
||||||
'';
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
|
||||||
))
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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";
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
|
@ -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")'';
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)))'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
'';
|
||||||
'';
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)";
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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)
|
'';
|
||||||
'';
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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))))
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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")))
|
'';
|
||||||
'';
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
{
|
{
|
||||||
config.machine.pkgsets.uniProgs.pkgs = with pkgs; [ qucs ];
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
config.machine.pkgsets.uniProgs.pkgs = with pkgs; [qucs];
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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}";
|
||||||
}
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 ];
|
};
|
||||||
};
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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"
|
'';
|
||||||
'';
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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 ];
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -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 ];
|
}
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
|
@ -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;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -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
Loading…
Reference in a new issue