]> gitweb.ps.run Git - flake_thinkpad/blob - home.nix
877a6a98a1078b6d3935a6b1874f5895cadff808
[flake_thinkpad] / home.nix
1 { config, pkgs, lib, wallpaper, ... }:
2
3 let
4   theme = pkgs.qogir-theme.override { tweaks = [ "square" ]; };
5   markdownStyleHeader = pkgs.writeText "style.html" ''
6     <style type="text/css">
7     html{
8       margin:40px auto;
9       max-width:650px;
10       line-height:1.6;
11       font-size:18px;
12       color:#444;
13       background-color:#EEE;
14       padding:0 10px
15     }
16     @media (prefers-color-scheme: dark) {
17     html{
18       color:#CCC;
19       background-color:#333;
20     }
21     }
22     h1,h2,h3{line-height:1.2}
23     </style>
24   '';
25   markdownCaddyfile = pkgs.writeText "Caddyfile" ''
26     :8123
27
28     encode zstd gzip
29     templates
30     file_server browse {
31             root "/"
32             hide ".*"
33     }
34
35     @md <<CEL
36       {file}.endsWith(".md")
37       || {file}.endsWith(".MD")
38       CEL
39
40     header @md Content-Type "text/html; charset=UTF-8"
41     respond @md <<HTML
42             <!DOCTYPE html>
43             <html>
44                     <head>
45                             <title>{{ "{file.base}" }}</title>
46                             <link rel="stylesheet" href="https://sindresorhus.com/github-markdown-css/github-markdown.css">
47                             <style>
48                             .markdown-body {
49                                         box-sizing: border-box;
50                                         min-width: 200px;
51                                         max-width: 980px;
52                                         margin: 0 auto;
53                                         padding: 45px;
54                                 }
55                             </style>
56                     </head>
57                     <body class="markdown-body">
58                     {{
59                     markdown (include "{path}")
60                     }}
61                     </body>
62             </html>
63             HTML 200
64   '';
65 in
66 {
67   # Home Manager needs a bit of information about you and the paths it should
68   # manage.
69   home.username = "ps";
70   home.homeDirectory = "/home/ps";
71
72   services.xcape = {
73     enable = true;
74     mapExpression = {
75       Caps_Lock = "Escape";
76     };
77   };
78
79   xfconf.settings = {
80     xfce4-desktop = {
81       "backdrop/screen0/monitor0/image-path" = "${wallpaper}";
82       "backdrop/screen0/monitor0/image-show" = true;
83       "backdrop/screen0/monitor0/image-style" = 5;
84     };
85   };
86
87   systemd.user.services.markdownCaddy = {
88     Unit = {
89       Description = "Run a web server serving Markdown files.";
90       Wants = [ "network-online.target" ];
91       After = [ "network-online.target" ];
92     };
93     Install = {
94       WantedBy = [ "default.target" ];
95     };
96     Service = {
97       WorkingDirectory = "/";
98       ExecStart = "${pkgs.writeShellScript "markdown-caddy" ''
99         ${pkgs.caddy}/bin/caddy run --config ${markdownCaddyfile} --adapter caddyfile
100       ''}";
101     };
102   };
103   
104   xsession.windowManager.i3 = {
105     enable = true;
106     config = {
107       bars = [];
108       modifier = "Mod4";
109       terminal = "${pkgs.kitty}/bin/kitty";
110       gaps = { inner = 0; outer = 0; };
111       keybindings =
112         let
113           mod = config.xsession.windowManager.i3.config.modifier;
114           i3-next = pkgs.writers.writePython3 "i3-next" {} ''
115             import json
116             from subprocess import check_output
117
118             workspaces = json.loads(check_output(
119               ["${pkgs.i3}/bin/i3-msg",
120                "-t", "get_workspaces"]))
121
122             outputs = {}
123             activeOutput = ""
124             activeWorkspace = -1
125
126             for w in workspaces:
127                 output = w["output"]
128                 workspace = int(w["num"])
129                 if output not in outputs:
130                     outputs[output] = set()
131                 outputs[output].add(workspace)
132                 if w["focused"]:
133                     activeOutput = output
134                     activeWorkspace = workspace
135
136             workspacesSorted = sorted(outputs[activeOutput])
137             activeWorkspaceIndex = workspacesSorted.index(activeWorkspace)
138
139             if activeWorkspaceIndex < len(workspacesSorted) - 1:
140                 print(workspacesSorted[activeWorkspaceIndex + 1])
141             else:
142                 allWorkspaces = set()
143                 for o in outputs.values():
144                     allWorkspaces = allWorkspaces.union(o)
145                 allWorkspacesSorted = sorted(allWorkspaces)
146                 print(allWorkspacesSorted[-1]+1)
147           '';
148   
149           i3-empty = pkgs.writers.writePython3 "i3-empty" {} ''
150             import json
151             from subprocess import check_output
152
153             workspaces = json.loads(check_output(
154               ["${pkgs.i3}/bin/i3-msg",
155                "-t", "get_workspaces"]))
156
157             nextWorkspace = 1
158       
159             for w in workspaces:
160                 wNum = int(w["num"])
161                 if wNum >= nextWorkspace:
162                     nextWorkspace = wNum + 1
163
164             print(nextWorkspace)
165           '';
166           
167           i3-max = pkgs.writers.writePython3 "i3-max" {} ''
168             import json
169             from subprocess import check_output
170
171             workspaces = json.loads(check_output(
172               ["${pkgs.i3}/bin/i3-msg",
173                "-t", "get_workspaces"]))
174
175             result = "MAX"
176       
177             for w in workspaces:
178                 wName = w["name"]
179                 wFocused = w["focused"]
180                 if wName == "MAX" and wFocused:
181                     result = "back_and_forth"
182                     break
183
184             print(f"move window to workspace {result}; workspace {result}")
185           '';
186           i3-move-max = pkgs.writers.writePython3 "i3-move-max" {} ''
187             import json
188             from subprocess import check_output
189
190             workspaces = json.loads(check_output(
191               ["${pkgs.i3}/bin/i3-msg",
192                "-t", "get_workspaces"]))
193
194             result = "MAX"
195       
196             for w in workspaces:
197                 wName = w["name"]
198                 wFocused = w["focused"]
199                 if wName == "MAX" and wFocused:
200                     result = "back_and_forth"
201                     break
202
203             print(f"workspace {result}")
204           '';
205         in lib.mkOptionDefault
206           {
207             # "${mod}+d" = "exec --no-startup-id krunner";
208             # "${mod}+Shift+p" = "exec --no-startup-id set-wallpaper";
209             "${mod}+Shift+Return" = "exec --no-startup-id ${pkgs.kitty}/bin/kitty -d $(${pkgs.xcwd}/bin/xcwd)";
210             "${mod}+BackSpace" = "kill";
211             "${mod}+Prior" = "workspace prev_on_output";
212             "${mod}+Next" = "exec --no-startup-id i3-msg workspace number $(${i3-next})";
213             "${mod}+End" = "exec --no-startup-id i3-msg workspace $(${i3-empty})";
214             "${mod}+Shift+Prior" = "move container to workspace prev_on_output";
215             "${mod}+Shift+Next" = "exec --no-startup-id i3-msg move container to workspace number $(${i3-next})";
216             "${mod}+Shift+End" = "exec --no-startup-id i3-msg move container to workspace $(${i3-empty})";
217             "${mod}+Ctrl+Left" = "move workspace to output left";
218             "${mod}+Ctrl+Right" = "move workspace to output right";
219             "${mod}+y" = "exec --no-startup-id mirror-phone";
220             "${mod}+n" = "exec ${pkgs.kitty}/bin/kitty -d ~/sync/txt $EDITOR .";
221             "${mod}+m" = "exec --no-startup-id i3-msg $(${i3-max})";
222             "${mod}+b" = "split toggle; layout tabbed";
223             "${mod}+Shift+m" = "exec --no-startup-id i3-msg $(${i3-move-max})";
224             "${mod}+Shift+p" = "exec --no-startup-id ${pkgs.autorandr}/bin/autorandr --match-edid -c -f";
225           };
226     };
227     extraConfig = ''
228       # exec ${pkgs.xfce.xfce4-panel}/bin/xfce4-panel
229       for_window [window_role="pop-up"] floating enable
230       for_window [window_role="task_dialog"] floating enable
231       # for_window [workspace="0"] floating enable
232
233       for_window [class="kitty-popup"] floating enable
234       for_window [class="Xfce4-appfinder"] floating enable
235       for_window [class="yakuake"] floating enable
236       for_window [class="systemsettings"] floating enable
237       for_window [title="win7"] floating enable; border none
238       for_window [title="Arbeitsfläche.*"] kill, floating enable, border none
239
240       # class                 border  backgr. text    indicator child_border
241       client.focused          #000000bf #000000bf #e6ebef #000000bf   #000000bf
242       client.focused_inactive #00000080 #00000080 #e6ebef #00000080   #00000080
243       client.unfocused        #00000040 #00000040 #e6ebef #00000040   #00000040
244       client.urgent           #2f343a #900000 #e6ebef #900000   #2f343a
245       client.placeholder      #000000 #0c0c0c #e6ebef #000000   #0c0c0c
246
247       focus_follows_mouse no
248       mouse_warping none
249       popup_during_fullscreen all
250     '';
251   };
252
253   services.picom = {
254     enable = true;
255     vSync = true;
256     opacityRules = [
257       "0:_NET_WM_STATE@[*]:a = '_NET_WM_STATE_HIDDEN'"
258     ];
259   };
260
261   programs.git = {
262     userName = "patrick-scho";
263     userEmail = "patrick.schoenberger@posteo.de";
264     includes = [{ contents = {
265         user = {
266           email = "patrick.schoenberger@posteo.de";
267           name = "psch";
268         };
269     };}];
270   };
271
272   programs.bash = {
273     enable = true;
274     historySize = -1;
275     historyFileSize = -1;
276     shellAliases = {  
277       snrs = "sudo nixos-rebuild switch --flake /etc/nixos#default";
278       snrt = "sudo nixos-rebuild test --flake /etc/nixos#default";
279       snrb = "sudo nixos-rebuild boot --flake /etc/nixos#default";
280       senc = "sudo $EDITOR /etc/nixos/configuration.nix";
281       senh = "sudo $EDITOR /etc/nixos/home.nix";
282       senf = "sudo $EDITOR /etc/nixos/flake.nix";
283       flakerun = "nix run --override-input nixpkgs nixpkgs";
284       n = "nvim";
285     };
286   };
287
288   programs.fzf = {
289     enable = true;
290     enableBashIntegration = true;
291   };
292
293   programs.readline = {
294     enable = true;
295     bindings = {
296       "\\e[A" = "history-search-backward";
297       "\\e[B" = "history-search-forward";
298     };
299   };
300
301   programs.kitty = {
302     enable = true;
303     themeFile = "Adapta_Nokto_Maia";
304     settings = {
305       # hide_window_decorations = "yes";
306       background_opacity = "0.98";
307       background_blur = "1";
308       confirm_os_window_close = "0";
309       enable_audio_bell = "no";
310       scrollback_pager_history_size = "1024";
311     };
312   };
313
314   programs.helix = {
315     enable = true;
316     settings = {
317       theme = "base16_terminal";
318       editor.cursor-shape = {
319         insert = "bar";
320         normal = "block";
321         select = "underline";
322       };
323       editor.soft-wrap = {
324         enable = true;
325       };
326       editor.file-picker = {
327         hidden = false;
328       };
329       keys.normal."space" = {
330         "space" = "goto_word";
331       };
332     };
333     languages = {
334       language = [{
335         name = "c";
336         auto-format = true;
337         formatter = { command = "clang-format"; args = ["--style=microsoft"]; };
338       }];
339     };
340   };
341
342   home.file.".config/zls.json".text = ''
343     {
344       "enable_build_on_save": true,
345       "build_on_save_step": "check"
346     }
347   '';
348   
349   programs.neovim = {
350     enable = true;
351     defaultEditor = true;
352     plugins = with pkgs.vimPlugins; [
353       # fzfWrapper
354       # fzf-vim
355       formatter-nvim
356       goyo-vim
357       vim-visual-multi
358       nvim-lspconfig
359       blink-cmp
360       telescope-nvim
361       undotree
362       which-key-nvim
363       guess-indent-nvim
364     ];
365     extraConfig = ''
366       set number
367       set relativenumber
368       set tabstop=4
369       set shiftwidth=4
370       set expandtab
371       set foldmethod=marker
372       set autoindent
373       set smartindent
374       filetype plugin indent on
375       set signcolumn=yes
376
377       colorscheme habamax
378
379       nnoremap <Down> gj
380       nnoremap <Up> gk
381       vnoremap <Down> gj
382       vnoremap <Up> gk
383       inoremap <Down> <C-o>gj
384       inoremap <Up> <C-o>gk
385       tnoremap <Esc> <C-\><C-n>
386       map <Space> <Leader>
387       nnoremap <Esc> :noh<CR>
388       nnoremap gr :Telescope lsp_references<CR>
389       nnoremap gd :Telescope lsp_definitions<CR>
390       nnoremap <leader>u :UndotreeToggle<CR> :UndotreeFocus<CR>
391       nnoremap <leader>f :Telescope find_files<CR>
392       nnoremap <leader>b :Telescope buffers<CR>
393       nnoremap <leader>e :Telescope diagnostics<CR>
394       nnoremap <leader>g :Telescope live_grep<CR>
395       nnoremap <leader>s :Telescope lsp_document_symbols<CR>
396       nnoremap <leader>r :lua vim.lsp.buf.rename()<CR>
397       nnoremap <leader>n :bnext<CR>
398       nnoremap <leader>m :bprevious<CR>
399       noremap <leader>y "+y<CR>
400       noremap <leader>p "+p<CR>
401       noremap <leader><S-y> "+<S-y><CR>
402       noremap <leader><S-p> "+<S-p><CR>
403
404       " Format on save
405       " augroup FormatAutogroup
406       "   autocmd!
407       "   autocmd BufWritePost * FormatWrite
408       " augroup END
409
410       " enter insert mode when opening terminal
411       autocmd TermOpen * startinsert
412
413       "
414       autocmd BufReadPost *
415       \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit'
416       \ |   exe "normal! g`\""
417       \ | endif
418
419       " Use persistent history.
420       if !isdirectory("/tmp/.vim-undo-dir")
421           call mkdir("/tmp/.vim-undo-dir", "", 0700)
422       endif
423       set undodir=/tmp/.vim-undo-dir
424       set undofile
425     '';
426     extraLuaConfig = ''
427       vim.lsp.enable('zls')
428       vim.lsp.enable('clangd')
429       vim.lsp.config('zuban', {})
430       vim.lsp.enable('zuban')
431       require('guess-indent').setup {}
432       local util = require('formatter.util')
433       local telescope = require('telescope')
434       require('formatter').setup {
435         logging = true,
436         log_level = vim.log.levels.WARN,
437         filetype = {
438           c = { require("formatter.filetypes.c").clangformat },
439           cpp = { require("formatter.filetypes.cpp").clangformat },
440           zig = { require("formatter.filetypes.zig").zigfmt },
441         }
442       }
443       require('blink.cmp').setup {
444         keymap = {
445           preset = 'none',
446           
447           ['<C-space>'] = { 'show', 'show_documentation', 'hide_documentation' },
448           ['<C-e>'] = { 'hide', 'fallback' },
449           ['<CR>'] = { 'accept', 'fallback' },
450
451           ['<Tab>'] = { 'select_next', 'fallback_to_mappings' },
452           ['<S-Tab>'] = { 'select_prev', 'fallback_to_mappings' },
453
454           ['<C-p>'] = { 'scroll_documentation_up', 'fallback' },
455           ['<C-n'] = { 'scroll_documentation_down', 'fallback' },
456
457           ['<C-k>'] = { 'show_signature', 'hide_signature', 'fallback' },
458         },
459         completion = {
460           list = { selection = { preselect = false, } },
461           documentation = {
462             auto_show = true,
463             -- treesitter_highlighting = false,
464           },
465         },
466         signature = { enabled = true },
467       }
468     '';
469   };
470
471
472   home.file.".config/vis/plugins/vis-lspc" = {
473     source = builtins.fetchGit {
474       url = "https://gitlab.com/muhq/vis-lspc.git";
475       rev = "e184eb6c971abfcd0dc7f836f402aae6c33a8d13";
476     };
477     recursive = true;
478   };
479   home.file.".config/vis/plugins/vis-commentary" = {
480     source = builtins.fetchGit {
481       url = "https://github.com/lutobler/vis-commentary.git";
482       rev = "0e06ed8212c12c6651cb078b822390094b396f08";
483     };
484     recursive = true;
485   };
486   home.file.".config/vis/visrc.lua".text = ''
487       require('vis')
488       require('plugins/vis-commentary')
489       lspc = require('plugins/vis-lspc')
490
491       lspc.menu_cmd = 'vis-menu'
492       lspc.fallback_dirname_as_root = true
493       lspc.ls_map.zig = {name='zls',cmd='zls',roots={'build.zig'}}
494     
495       vis.events.subscribe(vis.events.INIT, function()
496         -- Your global configuration options
497       end)
498
499       vis.events.subscribe(vis.events.WIN_OPEN, function(win) -- luacheck: no unused args
500         -- Your per window configuration options e.g.
501         vis:command('set number on')
502         vis:command('set autoindent')
503         vis:command('set tabwidth 4')
504         vis:command('set expandtab on')
505       end)
506     '';
507
508   programs.emacs = {
509     enable = true;
510     extraConfig = ''
511       (menu-bar-mode 1)
512       (tool-bar-mode 0)
513       (scroll-bar-mode 0)
514       (global-display-line-numbers-mode)
515       (setq-default
516         display-line-numbers-type 'relative
517         make-backup-files nil
518         inhibit-startup-screen t)
519       (load-theme 'tango-dark t)
520     '';
521     extraPackages = epkgs: [
522       epkgs.zig-mode
523       epkgs.lsp-mode
524     ];
525   };
526
527   programs.tmux = {
528     enable = true;
529     escapeTime = 0;
530     extraConfig = ''
531       set-option -g default-terminal screen-256color
532       set -g history-limit 10000
533       set -g base-index 1
534       set-option -g renumber-windows on
535       bind-key -n M-n new-window -c "#{pane_current_path}"
536       bind-key -n M-1 select-window -t :1
537       bind-key -n M-2 select-window -t :2
538       bind-key -n M-3 select-window -t :3
539       bind-key -n M-4 select-window -t :4
540       bind-key -n M-5 select-window -t :5
541       bind-key -n M-6 select-window -t :6
542       bind-key -n M-7 select-window -t :7
543       bind-key -n M-8 select-window -t :8
544       bind-key -n M-9 select-window -t :9
545       bind-key -n M-0 select-window -t :0
546       bind-key -n M-. select-window -n
547       bind-key -n M-, select-window -p
548       bind-key -n M-S-. swap-window -t +1
549       bind-key -n M-S-, swap-window -t -1
550       bind-key -n M-X confirm-before "kill-window"
551       bind-key -n M-v split-window -h -c "#{pane_current_path}"
552       bind-key -n M-b split-window -v -c "#{pane_current_path}"
553       bind-key -n M-R command-prompt -I "" "rename-window '%%'"
554       bind-key -n M-f resize-pane -Z
555       bind-key -n M-h select-pane -L
556       bind-key -n M-l select-pane -R
557       bind-key -n M-k select-pane -U
558       bind-key -n M-j select-pane -D
559       bind-key -n M-Left select-pane -L
560       bind-key -n M-Right select-pane -R
561       bind-key -n M-Up select-pane -U
562       bind-key -n M-Down select-pane -D
563       bind-key -n "M-H" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -L; tmux swap-pane -t $old'
564       bind-key -n "M-J" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -D; tmux swap-pane -t $old'
565       bind-key -n "M-K" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -U; tmux swap-pane -t $old'
566       bind-key -n "M-L" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -R; tmux swap-pane -t $old'
567       bind-key -n "M-S-Left" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -L; tmux swap-pane -t $old'
568       bind-key -n "M-S-Down" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -D; tmux swap-pane -t $old'
569       bind-key -n "M-S-Up" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -U; tmux swap-pane -t $old'
570       bind-key -n "M-S-Right" run-shell 'old=`tmux display -p "#{pane_index}"`; tmux select-pane -R; tmux swap-pane -t $old'
571       bind-key -n M-x confirm-before "kill-pane"
572       bind-key -n M-/ copy-mode
573
574       # Linux system clipboard
575       bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"
576       bind-key -T copy-mode-vi MouseDragEnd1Pane send -X copy-pipe-and-cancel "xclip -in -selection clipboard"
577
578       set -g mouse on
579       # set-option -g status-keys vi
580       # set-option -g set-titles on
581       # set-option -g set-titles-string 'tmux - #W'
582       # set -g bell-action any
583       # set-option -g visual-bell off
584       # set-option -g set-clipboard off
585       # setw -g mode-keys vi
586       # setw -g monitor-activity on
587       # set -g visual-activity on
588       # set -g status-style fg=colour15
589       # set -g status-justify centre
590       # set -g status-left ""
591       # set -g status-right ""
592       # set -g status-interval 1
593       # set -g message-style fg=colour0,bg=colour3
594       # setw -g window-status-bell-style fg=colour1
595       # setw -g window-status-current-style fg=yellow,bold
596       # setw -g window-status-style fg=colour250
597       # setw -g window-status-current-format ' #{?#{==:#W,#{b:SHELL}},#{b:pane_current_path},#W} '
598       # setw -g window-status-format ' #{?#{==:#W,#{b:SHELL}},#{b:pane_current_path},#W} '
599       # # For older tmux:
600       # #setw -g window-status-format ' #W '
601       # #setw -g window-status-current-format ' #W '
602     '';
603   };
604
605   programs.nushell = {
606     enable = true;
607     # for editing directly to config.nu 
608     extraConfig = ''
609       $env.config = {
610         show_banner: false,
611         completions: {
612           case_sensitive: false # case-sensitive completions
613           quick: true           # set to false to prevent auto-selecting completions
614           partial: true         # set to false to prevent partial filling of the prompt
615           algorithm: "fuzzy"    # prefix or fuzzy
616         }
617         hooks: {
618           command_not_found: { |cmd| (command-not-found $cmd | str trim)  }
619         }
620       } 
621     '';
622     #  shellAliases = {
623     #  vi = "hx";
624     #  vim = "hx";
625     #  nano = "hx";
626     # };
627   };  
628   # programs.carapace = {
629   #   enable = true;
630   #   enableNushellIntegration = true;
631   # };
632
633   # programs.starship = {
634   #   enable = true;
635   #   settings = {
636   #     add_newline = false;
637   #     character = { 
638   #       success_symbol = "[➜](bold green)";
639   #       error_symbol = "[➜](bold red)";
640   #     };
641   #   };
642   # };
643
644   programs.firefox = {
645     enable = true;
646     profiles = {
647       default = {
648         settings = {
649           "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
650           "browser.fullscreen.autohide" = false;
651           "browser.toolbars.bookmarks.visibility" = "never";
652           "browser.tabs.inTitlebar" = 0;
653           "browser.compactmode.show" = true;
654           "browser.uidensity" = 1;
655         };
656         userChrome = ''
657         #TabsToolbar {
658           visibility: collapse !important;
659         }
660         '';
661       };
662       appmode = {
663         id = 1;
664         settings = {
665           "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
666           "browser.fullscreen.autohide" = false;
667           "browser.toolbars.bookmarks.visibility" = "never";
668           "browser.tabs.inTitlebar" = 0;
669           "browser.compactmode.show" = true;
670           "browser.uidensity" = 1;
671         };
672         userChrome = ''
673         #TabsToolbar {
674           visibility: collapse !important;
675         }
676         #nav-bar {
677           visibility: collapse !important;
678         }
679         #navigator-toolbox {
680           border-bottom: none !important;
681         }
682         '';        
683       };
684     };
685   };
686
687   xdg.desktopEntries = {
688     whatsapp = {
689       name = "WhatsApp";
690       genericName = "Messenger";
691       exec = "app web.whatsapp.com";
692       terminal = false;
693       categories = [ "Application" ];
694       icon = pkgs.fetchurl {
695         url = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/2062095_application_chat_communication_logo_whatsapp_icon.svg/1024px-2062095_application_chat_communication_logo_whatsapp_icon.svg.png";
696         sha256 = "sha256-0eE3EEGnWFlpObfraTXMIqJz0Uya/h0hDsUA528qKCY=";
697       };
698     };
699     md = {
700       name = "Markdown";
701       genericName = "Documents";
702       exec = "md-app";
703       terminal = false;
704       categories = [ "Application" ];
705       icon = pkgs.fetchurl {
706         url = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Markdown-mark.svg/1024px-Markdown-mark.svg.png";
707         sha256 = "0v161jvmcfxp9lwd86y789430w1vpvxnnm5n2hzgr1kfh03psvb2";
708       };
709     };
710   };
711
712   gtk.enable = true;
713   gtk.theme = {
714     package = theme;
715     name = "Qogir-Dark";
716   };
717   # programs.gnome-shell.theme = {
718   #   package = theme;
719   #   name = "Qogir-Dark";
720   # };
721   # gtk.iconTheme = {
722   #   package = pkgs.vimix-icon-theme;
723   #   name = "vimix-doder-dark";
724   # };
725   home.pointerCursor = {
726     gtk.enable = true;
727     x11.enable = true;
728
729     name = "volantes_light_cursors";
730     size = 24;
731     package = pkgs.volantes-cursors;
732   };
733
734   # This value determines the Home Manager release that your configuration is
735   # compatible with. This helps avoid breakage when a new Home Manager release
736   # introduces backwards incompatible changes.
737   #
738   # You should not change this value, even if you update Home Manager. If you do
739   # want to update the value, then make sure to first check the Home Manager
740   # release notes.
741   home.stateVersion = "24.05"; # Please read the comment before changing.
742
743   # The home.packages option allows you to install Nix packages into your
744   # environment.
745   home.packages = with pkgs; [
746     nixos-icons
747     spotify-player
748     prismlauncher
749     pandoc
750     ghidra
751     gnome-firmware
752     fzf bat delta silver-searcher ripgrep perl universal-ctags
753     rofi
754     # bintools
755     htop
756     unzip
757     rr wrk
758     clang-tools bear
759     linuxPackages_latest.perf
760     texliveFull
761     asciidoctor-with-extensions
762     emscripten
763     caddy
764     python3
765     qogir-icon-theme
766     volantes-cursors
767     xorg.xkill
768     lf nnn yazi
769     feh
770     xarchiver
771     tig lazygit gitui
772     thunderbird
773     aerc
774     libreoffice
775     gimp
776     guvcview
777     arandr
778     vial
779     ncdu
780     gnumake gcc
781     linux-wifi-hotspot
782     esptool picocom
783     wireshark
784     nil
785     bc
786     ffmpeg-full
787     sc-im visidata
788     localsend
789     vis
790     wineWowPackages.unstableFull winetricks
791     signal-desktop
792
793     # # It is sometimes useful to fine-tune packages, for example, by applying
794     # # overrides. You can do that directly here, just don't forget the
795     # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
796     # # fonts?
797     # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
798
799     # # You can also create simple shell scripts directly inside your
800     # # configuration. For example, this adds a command 'my-hello' to your
801     # # environment:
802     # (pkgs.writeShellScriptBin "my-hello" ''
803     #   echo "Hello, ${config.home.username}!"
804     # '')
805     # $@ - Liste aller Parameter
806     # $* - String aller Parameter
807     # $# - Anzahl aller Parameter
808     # &> - stdout und stderr pipen
809     # '' - Literal
810     # "" - Expanded
811     # 
812     (pkgs.writeShellScriptBin "app" ''
813       ${pkgs.firefox}/bin/firefox -p appmode --new-window "$@"
814     '')
815     (pkgs.writeShellScriptBin "md" ''
816       file=$(mktemp --suffix=.html) && \
817       echo $file && \
818       ${pkgs.pandoc}/bin/pandoc -o $file $1 -s -H ${markdownStyleHeader} && \
819       app $file && \
820       rm $file
821     '')
822     (pkgs.writeShellScriptBin "run" ''
823       (nohup "$@" &>/dev/null &); sleep 0
824     '')
825     (pkgs.writeShellScriptBin "popup" ''
826       ${pkgs.kitty}/bin/kitty -o hide_window_decorations=yes -o background_opacity=0.5 \
827         --class kitty-popup -o remember_window_size=no \
828         -o initial_window_width=120c -o initial_window_height=40c \
829         "$@"
830     '')
831     (pkgs.writeShellScriptBin "fzfdir" ''
832       find "$1" -name "$2" | ${pkgs.fzf}/bin/fzf --layout=reverse
833     '')
834     (pkgs.writeShellScriptBin "file-app" ''
835       app localhost:8123
836     '')
837     (pkgs.writeShellScriptBin "run-popup" ''
838       popup bash -c 'file=$(compgen -c | grep -v fzf | sort -u | fzf --layout=reverse --print-query | tail -n 1) && run $file'
839     '')
840     (pkgs.writeShellScriptBin "set-wallpaper" ''
841       ${pkgs.feh}/bin/feh --bg-fill --no-fehbg ${wallpaper}
842     '')
843     (pkgs.writeShellScriptBin "mirror-phone" "IP=$(select-ip) && sudo scrcpy --tcpip=$IP --no-audio -K --kill-adb-on-close")
844     (pkgs.writeShellScriptBin "select-ip" ''
845       FILE=$HOME/.cache/select-ip.txt
846       IP=$( ${pkgs.rofi}/bin/rofi -dmenu -input $FILE -p IP ) || exit 1
847       echo $IP >> $FILE
848       gawk -i inplace 'FNR==1{delete a} !a[$0]++' $FILE
849       echo $IP
850     '')
851     (pkgs.writeShellScriptBin "create-repo" ''
852       ssh psch.dev sudo -u git git init --bare /srv/git/$1
853     '')
854   ];
855
856   # Home Manager is pretty good at managing dotfiles. The primary way to manage
857   # plain files is through 'home.file'.
858   home.file = {
859     # # Building this configuration will create a copy of 'dotfiles/screenrc' in
860     # # the Nix store. Activating the configuration will then make '~/.screenrc' a
861     # # symlink to the Nix store copy.
862     # ".screenrc".source = dotfiles/screenrc;
863
864     # # You can also set the file content immediately.
865     # ".gradle/gradle.properties".text = ''
866     #   org.gradle.console=verbose
867     #   org.gradle.daemon.idletimeout=3600000
868     # '';
869   };
870
871   # Home Manager can also manage your environment variables through
872   # 'home.sessionVariables'. These will be explicitly sourced when using a
873   # shell provided by Home Manager. If you don't want to manage your shell
874   # through Home Manager then you have to manually source 'hm-session-vars.sh'
875   # located at either
876   #
877   #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
878   #
879   # or
880   #
881   #  ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
882   #
883   # or
884   #
885   #  /etc/profiles/per-user/ps/etc/profile.d/hm-session-vars.sh
886   #
887   home.sessionVariables = {
888     # EDITOR = "emacs";
889   };
890
891   # Let Home Manager install and manage itself.
892   programs.home-manager.enable = true;
893 }