This commit is contained in:
Till 2026-03-29 14:23:01 +02:00
parent d8032cc35d
commit e945735fa1
61 changed files with 344 additions and 550 deletions

View file

@ -0,0 +1,14 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
aichat
glow
];
programs.fish.shellAliases = {
vibe = "aichat -c";
clank = "aichat -e";
slop = "aichat";
};
}

View file

@ -0,0 +1,138 @@
{ config, pkgs, ... }:
let
myRemote = slug: {
passwordCommand = [ "pass" "accounts/ktiu-radicale" ];
userName = "ktiu";
type = "caldav";
url = "https://kalender.ktiu.net/ktiu/${slug}";
};
calDefaults = {
khal.type = "calendar";
local = {
type = "filesystem";
fileExt = ".ics";
};
vdirsyncer = {
enable = true;
conflictResolution = "local wins";
};
};
in
{
services.vdirsyncer.enable = true;
programs.vdirsyncer.enable = true;
programs.khal = {
enable = true;
locale = {
timeformat = "%H:%M";
dateformat = "%d %b";
longdateformat = "%d %b %Y";
datetimeformat = "%d %b %H:%M";
longdatetimeformat = "%d %b %Y %H:%M";
weeknumbers = "left";
};
settings = {
default = {
timedelta = "5d";
print_new = "event";
};
keybindings.external_edit = "ctrl e";
view = {
agenda_event_format = "{calendar-color}{cancelled}{start-end-time-style} {title}{repeat-symbol} {location} {url}{reset}";
event_format = "{calendar-color}{cancelled}{start}-{end} {title}{repeat-symbol} {location} {url}{reset}";
"blank_line_before_day" = true;
};
};
};
accounts.calendar.basePath = "${config.xdg.dataHome}/calendars";
accounts.calendar.accounts = {
till = calDefaults // {
khal.enable = true;
primary = true;
khal.color = "light blue";
remote = myRemote "personal";
};
mitlisa = calDefaults // {
khal.enable = true;
khal.color = "light magenta";
remote = myRemote "lisa-und-till";
};
family = calDefaults // {
khal.enable = true;
khal.color = "dark magenta";
remote = myRemote "family";
};
bdays = calDefaults // {
khal.enable = true;
khal.color = "yellow";
remote = myRemote "geburtstage";
};
polit = calDefaults // {
khal.enable = true;
khal.color = "dark gray";
remote = myRemote "polit";
};
ihg = calDefaults // {
khal.enable = true;
khal.color = "dark cyan";
remote = {
type = "http";
url = "https://geocom.uni-frankfurt.de/radicale/ihg/5012a739-dbaf-334b-f093-8db1860bc26e/";
};
};
"eintracht_m" = calDefaults // {
khal.enable = true;
khal.color = "light red";
remote = {
type = "http";
url = "http://i.cal.to/ical/257/eintrachtfrankfurt/spielplan/28ae0d30.f781380b-e6f28bd4.ics";
};
};
"eintracht_f" = calDefaults // {
khal.enable = true;
khal.color = "dark red";
remote = {
type = "http";
url = "http://i.cal.to/ical/5940/eintrachtfrankfurt/spielplan-frauen-profis/28ae0d30.f781380b-1763bff2.ics";
};
};
"feiertage" = calDefaults // {
khal.enable = true;
khal.color = "dark green";
remote = {
type = "http";
url = "https://ics.tools/Feiertage/hessen.ics";
};
};
"grid" = calDefaults // {
khal.enable = true;
khal.color = "light green";
remote = {
type = "caldav";
# url = "https://cloud.gridisnotajournal.de/remote.php/dav/calendars/till/grid/";
# passwordCommand = [ "pass" "uni/grid-caldav-nextcloud" ];
# userName = "till";
url = "https://kalender.humangeographie.de/grid/96dedda9-cc91-c2fe-3bd8-020296904489/";
userName = "grid";
passwordCommand = [ "pass" "uni/grid-kalender-radicale" ];
};
};
};
}

View file

@ -0,0 +1,42 @@
{ pkgs, ... }:
{
imports = [
../desktop-slim
./aichat.nix
./calendars.nix
./khard-dump.nix
./mail.nix
./messaging.nix
./office-gui.nix
./r.nix
./tasks.nix
./tex.nix
];
home.packages = with pkgs; [
bat
ghostscript
hunspell
hunspellDicts.de_DE
hunspellDicts.en_US
hunspellDicts.th_TH
hyphen
hyphenDicts.de_DE
hyphenDicts.en_US
imagemagick
khal
khard
msmtp
notmuch
openssl
pandoc
pdftk
quarto
ripmime
urlscan
visidata
w3m
];
}

View file

@ -0,0 +1,29 @@
{ config, pkgs, ... }:
{
systemd.user.timers = {
khard-dump = {
Unit = {
Description = "Timer to run khard-dump service";
};
Timer = {
OnCalendar = "*:00/10";
Unit = "khard-dump.service";
};
};
};
systemd.user.services = {
khard-dump = {
Unit = {
Description = "Dumps contact info to custom cache file";
};
Service = {
ExecStart = "${pkgs.writeScript "khard-dump" ''
#! ${pkgs.stdenv.shell}
${pkgs.khard.outPath}/bin/khard email --parsable --remove-first-line | awk 'BEGIN{FS=OFS="\t"}{print $2, $1}\' > ${config.xdg.cacheHome}/khard-dump
''}";
};
};
};
}

283
home/desktop-full/mail.nix Normal file
View file

@ -0,0 +1,283 @@
{ config, pkgs, lib, ... }:
let
makeConfig = accountName:
''
unset reverse_name
unset smime_is_default
set my_account='${ accountName }'
macro index,pager / "<vfolder-from-query>tag:${ accountName } "
unalternates *
set nm_record_tags = "+sent -inbox -unread +${ accountName }";
set my_signature = ${ pkgs.writeText "signature.txt" config.accounts.email.accounts.${accountName}.signature.text }
set status_format = " [ %r ] $my_account %f (%lB) %> %m messages%?n? [ %n new ]?%?d? [ %d to delete ]?%?t? [ %t tagged ]? "
source colors.neomuttrc
'';
makeAccount = accountName: {
signature.showSignature = "append";
smtp.tls.useStartTls = true;
msmtp.enable = true;
mbsync = {
enable = true;
create = "maildir";
expunge = "both";
};
neomutt = {
enable = true;
sendMailCommand = "${lib.getExe pkgs.msmtp} -a ${ accountName }";
};
notmuch = {
enable = true;
neomutt = {
virtualMailboxes = [
{ name = "Inbox"; query = "tag:${ accountName } and tag:inbox"; }
{ name = "Archive"; query = "tag:${ accountName } and not tag:sent and not tag:draft"; }
{ name = "Sent"; query = "tag:${ accountName } and tag:sent"; }
{ name = "Drafts"; query = "tag:${ accountName } and tag:draft"; }
{ name = "Spam"; query = "tag:${ accountName } and tag:spam"; }
{ name = "Trash"; query = "tag:${ accountName } and tag:trash"; }
];
};
};
};
mailcap_path = pkgs.writeText "neomutt_mailcap" ''
application/pdf; zathura %s
multipart; xdg-open %s
text/html; firefox %s; description=HTML Text; nametemplate=%s.html; needsterminal
text/html; w3m -v -F -T text/html -dump %s; copiousoutput
text/calendar; khal import %s
text; neomutt %s
application; xdg-open %s
image; xdg-open %s
video; xdg-open %s
audio; xdg-open %s
message; xdg-open %s
model; xdg-open %s
'';
in
{
programs.mu.enable = true;
accounts.email = {
maildirBasePath = "${config.xdg.dataHome}/mail";
accounts = {
gu = { name, ... }: lib.attrsets.recursiveUpdate (makeAccount name) {
primary = true;
address = "straube@geo.uni-frankfurt.de";
realName = "Till Straube";
imap.host = "imap.server.uni-frankfurt.de";
smtp.host = "smtpauth.rz.uni-frankfurt.de";
userName = "tstraube";
passwordCommand = "pass uni/hrz";
signature = {
text = ''
Dr. Till Straube (he/him)
Dept. of Human Geography
Goethe University Frankfurt
'';
};
neomutt = {
extraConfig = ''
color status blue default
color index blue default '~N'
alternates ^tstraube@(em|rz)?.uni-frankfurt.de$
set smime_is_default
'' + makeConfig name;
};
};
t9e = { name, ... }: lib.attrsets.recursiveUpdate (makeAccount name) {
address = "till.straube@t9e.me";
realName = "Till Straube";
imap.host = "arielle.ktiu.net";
smtp.host = "arielle.ktiu.net";
userName = "till.straube@t9e.me";
signature.text = ''
Till Straube (he/him)
PGP key: https://keys.openpgp.org/search?q=till.straube@t9e.me
'';
neomutt = {
extraConfig = makeConfig name + ''
color status green default
color index green default '~N'
alternates @t9e.me$ @ktiu.net$ ^(tillkowski|till.straube)@gmail.com$
set reverse_name
'';
};
msmtp.extraConfig.port = "587";
passwordCommand = "pass accounts/ktiu-imap";
};
ksh = { name, ... }: lib.attrsets.recursiveUpdate (makeAccount name) {
address = "kein_schlussstrich_hessen@systemli.org";
realName = "Kein Schlussstrich Hessen";
imap.host = "mail.systemli.org";
smtp.host = "mail.systemli.org";
userName = "kein_schlussstrich_hessen@systemli.org";
signature.text = ''
Kein Schlussstrich Hessen
PGP Key: https://keys.openpgp.org/search?q=kein_schlussstrich_hessen@systemli.org
'';
neomutt = {
extraConfig = makeConfig name + ''
color status red default
color index red default '~N'
'';
};
passwordCommand = "pass ksh/systemli";
};
};
};
programs.msmtp.enable = true;
programs.mbsync.enable = true;
programs.notmuch = {
enable = true;
search.excludeTags = [ "trash" "spam" ];
new.tags = [ "new" "unread" ];
hooks = {
preNew = ''
notmuch tag +draft -- 'folder:"/\/Drafts$/"'
mbsync --all
'';
postNew = ''
notmuch tag +gu -- tag:new path:gu/**
notmuch tag +t9e -- tag:new path:t9e/**
notmuch tag +ksh -- tag:new path:ksh/**
notmuch tag +inbox -- tag:new 'folder:"/\/Inbox$/"'
notmuch tag +sent -unread -- tag:new 'folder:"/\/Sent$/"'
notmuch tag +trash -unread -- tag:new 'folder:"/\/Trash$/"'
notmuch tag +draft -unread -- tag:new 'folder:"/\/Drafts$/"'
notmuch tag +spam -- tag:new 'folder:"/\/Spam$/"'
notmuch tag +spam -- tag:new 'folder:"/\/Junk$/"'
notmuch tag -new -- tag:new
'';
};
};
programs.neomutt = {
enable = true;
vimKeys = true;
changeFolderWhenSourcingAccount = true;
editor = "nvim -c 'call woof#init#Init()'";
sort = "reverse-date-received";
unmailboxes = true;
settings = {
abort_noattach = "ask-yes";
abort_noattach_regex = "\"(attach|enclosed|anbei|anhängen|angehängt|anhang|anhänge|hängt an)\"";
auto_edit = "no";
beep = "no";
confirm_append = "no";
crypt_auto_sign = "yes";
crypt_replyencrypt = "yes";
crypt_replysign = "yes";
crypt_replysignencrypted = "yes";
crypt_verify_sig = "yes";
edit_headers = "yes";
forward_attachments = "yes";
forward_format = "\"Fwd: %s\"";
forward_quote = "yes";
help = "no";
include = "yes";
mail_check_stats = "yes";
mailcap_path = "${ mailcap_path }";
mark_old = "no";
markers = "no";
mbox_type = "Maildir";
menu_scroll = "yes";
mime_type_query_command = "\"file -b --mime-type %s\"";
nm_record = "yes";
pager_context = "3";
pager_index_lines = "5";
pager_stop = "yes";
query_command= "\"khard email --parsable '%s'\"";
recall = "no";
resume_draft_files = "yes";
reverse_real_name = "no";
shell = "/bin/sh";
sleep_time = "0";
smart_wrap = "yes";
status_chars = "٪A";
tilde = "yes";
use_envelope_from = "yes";
virtual_spool_file = "yes";
wait_key = "no";
};
binds = [
{ key = "m"; map = [ "index" "pager" ]; action = "noop"; }
{ key = "k"; map = [ "pager" ]; action = "previous-entry"; }
{ key = "j"; map = [ "pager" ]; action = "next-entry"; }
{ key = "<return>"; map = [ "index" ]; action = "display-message"; }
{ key = "<space>"; map = [ "index" ]; action = "entire-thread"; }
{ key = "gf"; map = [ "index" "pager" ]; action = "change-folder"; }
{ key = "<Tab>"; map = [ "editor" ]; action = "complete-query"; }
{ key = "P"; map = [ "compose" ]; action = "pgp-menu"; }
{ key = "p"; map = [ "compose" ]; action = "postpone-message"; }
];
macros = [
{ key = "gu"; map = [ "index" "pager" ]; action = "<vfolder-from-query>tag:dummy<enter>:source ${config.xdg.configHome}/neomutt/gu<enter>g!"; }
{ key = "gm"; map = [ "index" "pager" ]; action = "<vfolder-from-query>tag:dummy<enter>:source ${config.xdg.configHome}/neomutt/t9e<enter>g!"; }
{ key = "gk"; map = [ "index" "pager" ]; action = "<vfolder-from-query>tag:dummy<enter>:source ${config.xdg.configHome}/neomutt/ksh<enter>g!"; }
{ key = "Y"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>"; }
{ key = "y"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>-inbox -unread -spam -trash<enter><sync-mailbox>"; }
{ key = "J"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>+spam -inbox -unread -trash<enter><sync-mailbox>"; }
{ key = "I"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>+inbox -old -spam -trash<enter><sync-mailbox>"; }
{ key = "Y"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>"; }
{ key = "dd"; map = [ "index" "pager" ]; action = "<modify-labels-then-hide>+trash -inbox -unread -spam<enter><sync-mailbox>"; }
{ key = "g!"; map = [ "index" "pager" ]; action = "<change-vfolder>Inbox<enter>"; }
{ key = "g<"; map = [ "index" "pager" ]; action = "<change-vfolder>Sent<enter>"; }
{ key = "g>"; map = [ "index" "pager" ]; action = "<change-vfolder>Archive<enter>"; }
{ key = "gj"; map = [ "index" "pager" ]; action = "<change-vfolder>Spam<enter>"; }
{ key = "gd"; map = [ "index" "pager" ]; action = "<change-vfolder>Drafts<enter>"; }
{ key = "gt"; map = [ "index" "pager" ]; action = "<change-vfolder>Trash<enter>"; }
{ key = "go"; map = [ "index" "pager" ]; action = "<shell-escape>notmuch new<enter>"; }
{ key = "V"; map = ["index" "pager"]; action = "<view-attachments><search>html<enter><view-mailcap><exit>"; }
{ key = "mar"; map = [ "index" "pager" ]; action = "<tag-pattern>new<enter><tag-prefix-cond><clear-flag>n<enter><tag-prefix-cond><clear-flag>*<enter>"; }
{ key = "A"; map = [ "index" "pager" ]; action = "<pipe-message>khard add-email --vcard-version=4.0<return>"; }
{ key = "S"; map = [ "index" "pager" ]; action = "<pipe-message>ripmime -i - -d ~/tmp && rm ~/tmp/textfile*"; }
{ key = "gb"; map = [ "index" "pager" ]; action = "<pipe-message>urlscan<enter>"; }
{ key = "I"; map = [ "compose" ]; action = "<attach-file>`tmpfile=$(mktemp -u --suffix .png -t XXXXXXXXXXXX -p ~/tmp) && wl-paste -t image/png > \"$tmpfile\" && echo \"$tmpfile\"`<enter>"; }
{ key = "p"; map = [ "compose" ]; action = "<postpone-message>"; }
{ key = "c"; map = [ "index" "pager" ]; action = "<enter-command>set signature=$my_signature<enter><mail>"; }
{ key = "r"; map = [ "index" "pager" ]; action = "<enter-command>unset signature<enter><reply>"; }
{ key = "a"; map = [ "index" "pager" ]; action = "<enter-command>unset signature<enter><group-reply>"; }
{ key = "f"; map = [ "index" "pager" ]; action = "<enter-command>unset signature<enter><forward-message>"; }
{ key = "l"; map = [ "index" "pager" ]; action = "<enter-command>unset signature<enter><list-reply>"; }
];
extraConfig = builtins.readFile ../dotfiles/neomutt/config.neomuttrc;
};
xdg.configFile."neomutt/colors.neomuttrc".source = config.lib.file.mkOutOfStoreSymlink "/etc/nixos/home/dotfiles/neomutt/colors.neomuttrc";
xdg.configFile."neomutt/bindings.neomuttrc".source = config.lib.file.mkOutOfStoreSymlink "/etc/nixos/home/dotfiles/neomutt/bindings.neomuttrc";
programs.neovim.plugins = with pkgs.vimPlugins; [
{
plugin = vim-pathogen;
config = "execute pathogen#infect()";
}
];
xdg.configFile."nvim/bundle/woof-vim" = {
source = config.lib.file.mkOutOfStoreSymlink "/home/till/devel/woof-vim";
recursive = true;
};
}

View file

@ -0,0 +1,9 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
signal-desktop
# telegram-desktop
simplex-chat-desktop
];
}

View file

@ -0,0 +1,4 @@
{ pkgs, ... }:
{
}

View file

@ -0,0 +1,20 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
chromium
eduvpn-client
gimp
gnome-solanum
inkscape
libreoffice
lorem
pdfpc
poppler-utils
typst
xournalpp
zotero
];
programs.obs-studio.enable = true;
}

63
home/desktop-full/r.nix Normal file
View file

@ -0,0 +1,63 @@
{ pkgs, ... }:
let
customPackages = with pkgs.rPackages; [
bookdown
catmaply
clipr
DAAG
devtools
dplyr
eurostat
extrafont
ggplot2
ggridges
jsonlite
kableExtra
knitr
languageserver
magrittr
mapproj
openxlsx
osmdata
plotly
progress
purrr
qrcode
quarto
RColorBrewer
readODS
revealjs
rlist
rmarkdown
rnaturalearth
rnaturalearthdata
roxygen2
rvest
sf
stringr
testthat
tidyr
tidyverse
tmap
tufte
xlsx
yaml
];
R-packed = pkgs.rWrapper.override { packages = customPackages; };
RStudio-packed = pkgs.rstudioWrapper.override { packages = customPackages; };
in
{
home.packages = with pkgs; [
R-packed
RStudio-packed
];
home.shellAliases = {
r = "R --no-save --no-restore";
R = "R --no-save --no-restore";
};
}

View file

@ -0,0 +1,22 @@
{ config, pkgs, lib, ... }:
{
home.packages = with pkgs; [
taskopen
];
programs.taskwarrior = {
enable = true;
package = pkgs.taskwarrior3;
dataLocation = "${config.xdg.dataHome}/taskwarrior/tasks";
colorTheme = "no-color";
config = {
report.list.columns = ["id" "depends.indicator" "priority" "project" "recur.indicator" "scheduled.countdown" "due" "until.age" "status.short" "description.count" "tags"];
report.list.labels= ["ID" "D" "Prio" "Proj" "R" "Scheduled" "Due" "Until" "S" "Description" "Tags"];
};
extraConfig = "
hooks.location=${config.xdg.dataHome}/taskwarrior/hooks
verbose=affected,context,edit,label,header,new-id,project,special,sync,recur
";
};
}

69
home/desktop-full/tex.nix Normal file
View file

@ -0,0 +1,69 @@
{ config, pkgs, ... }:
let
tex = (pkgs.texlive.combine {
inherit (pkgs.texlive)
adjustbox
arydshln
bbding
blindtext
changepage
csquotes
currfile
dashrule
enotez
enumitem
environ
footmisc
framed
gensymb
graphbox
hanging
idxlayout
ifmtarg
imakeidx
lastpage
lipsum
ltablex
ly1
makecell
multirow
needspace
nowidow
pdfcol
pdfpages
pdfx
pgf
qrcode
scheme-medium
sourcesanspro
stringstrings
svg
tabu
tabulary
tcolorbox
threeparttable
threeparttablex
tikzfill
titlesec
titling
tocloft
translations
transparent
was
wrapfig
xmpincl
xpatch
xstring
xtab
xurl
zref
;
});
in
{ # home-manager
home.packages = with pkgs; [
texlab
tex
];
}