diff --git a/modules/common.nix b/modules/common.nix new file mode 100644 index 0000000..a4e65ba --- /dev/null +++ b/modules/common.nix @@ -0,0 +1,29 @@ +{ config, pkgs, ...}: +{ + #environment.variables.EDITOR = "nvim"; + environment.systemPackages = with pkgs; [ + gitAndTools.gitFull + unzip + zip + tmux + lshw + bc + #neovim + ncdu + nixos-option + bat + procs + plocate + lsd + age + lsd + htop + ]; +# Nix Garbage Collector + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 7d"; + }; + +} diff --git a/modules/configs/init.el b/modules/configs/init.el new file mode 100644 index 0000000..90f5292 --- /dev/null +++ b/modules/configs/init.el @@ -0,0 +1,216 @@ +;; Keyboard-centric user interface +(setq inhibit-startup-message t) +(scroll-bar-mode -1) +(tool-bar-mode -1) +(menu-bar-mode -1) + +(require 'package) +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) +;; Comment/uncomment this line to enable MELPA Stable if desired. See `package-archive-priorities` +;; and `package-pinned-packages`. Most users will not need or want to do this. +;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) +(package-initialize) + + +(column-number-mode 't) ; show current column in status bar +(add-hook 'text-mode-hook 'turn-on-auto-fill) +(set-fringe-mode 10) + +;; Use 4 spaces for one tab visually. +(setq tab-width 4) + +(show-paren-mode t) ; highlight matching open and close parentheses +(global-hl-line-mode) ; highlight current line +(global-visual-line-mode t) ; wrap long lines +(setq split-window-preferred-function + 'visual-fill-column-split-window-sensibly) ; wrap at window boundary + +(global-whitespace-mode) ; enable whitespace handling by default +(setq + whitespace-style ; see (apropos 'whitespace-style) + '(face ; viz via faces + trailing ; trailing blanks visualized + lines-tail ; lines beyond whitespace-line-column visualized + space-before-tab + space-after-tab + newline ; lines with only blanks visualized + indentation ; spaces used for indent when config wants tabs + empty ; empty lines at beginning or end or buffer + ) + whitespace-line-column 150) ; column at which whitespace-mode says the line is too long +;;(set-face-attribute 'default nil :font "JetBrains Mono" :height 150) + +;; themes +(use-package doom-themes + :init (load-theme 'doom-nord t) + :init (doom-themes-org-config)) +(setq disabled-command-function nil) +(setq inhibit-startup-screen t) +(setq visible-bell t) + +;; Only y/n answers +(defalias 'yes-or-no-p 'y-or-n-p) + +;; Save what you enter into minibuffer prompts +(setq history-length 25) +(savehist-mode 1) + +;; Remember and restore the last cursor location of opened files +(save-place-mode 1) + +;; Backup + +(setq version-control t ;; Use version numbers for backups. + kept-new-versions 10 ;; Number of newest versions to keep. + kept-old-versions 0 ;; Number of oldest versions to keep. + delete-old-versions t ;; Don't ask to delete excess backup versions. + backup-by-copying t) ;; Copy all files, don't rename them. +(setq vc-make-backup-files t) +(setq backup-directory-alist '(("" . "~/.emacs.d/backup"))) +(defvar emacs-autosave-directory + (concat user-emacs-directory "autosaves/") + "This variable dictates where to put auto saves. It is set to a + directory called autosaves located wherever your .emacs.d/ is + located.") + +;; Sets all files to be backed up and auto saved in a single directory. +(setq backup-directory-alist + `((".*" . ,emacs-autosave-directory)) + auto-save-file-name-transforms + `((".*" ,emacs-autosave-directory t))) + + +(setq calendar-week-start-day 1) + + +(use-package nix-mode + :mode ("\\.nix\\'" . nix-mode) + :hook (nix-mode . lsp-deferred)) + +(use-package magit) +(setq magit-fetch-modules-jobs 16); fetch 16 modules in parallel + +(use-package which-key + :init (which-key-mode) + :config (setq which-key-idle-delay 0.5)) + +(autoload 'markdown-mode "markdown-mode" + "Major mode for editing Markdown files" t) +(add-to-list 'auto-mode-alist + '("\\.\\(?:md\\|markdown\\|mkd\\|mdown\\|mkdn\\|mdwn\\)\\'" . markdown-mode)) + +(autoload 'gfm-mode "markdown-mode" + "Major mode for editing GitHub Flavored Markdown files" t) +(add-to-list 'auto-mode-alist '("README\\.md\\'" . gfm-mode)) + +;; org-mode +(require 'org) +(require 'org-mouse) +(setq org-startup-folded t + org-pretty-entities t + org-hide-emphasis-markers t + org-startup-with-inline-images t + org-agenda-include-deadlines t + org-image-actual-width '(300)) +;; files with ".org" open in org-mode +(add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) +(setq org-agenda-files '("/home/alexandre/Nextcloud/PRIVE/13_Org/backlog.org" "/home/alexandre/Nextcloud/PRIVE/13_Org/notes")) +(setq org-directory (concat (getenv "HOME") "/Nextcloud/PRIVE/13_Org/notes")) +(setq org-default-notes-file "~/Nextcloud/PRIVE/13_Org/backlog.org") +(setq org-todo-keywords '((type "TODO" "En cours" "WAIT" "CANCELED" "DONE"))) +(setf org-todo-keyword-faces '(("TODO" . (:foreground "cyan" :background "steelblue" :bold t :weight bold)) + ("En cours" . (:foreground "yellow" :background "red" :bold t :weight bold)) + ("En attente de réponse" . (:foreground "yellow" :background "magenta2" :bold t :weight bold)) + ("CANCELED" . (:foreground "gray" :background "dime grey" :bold t :weight bold)) + ("DONE" . (:foreground "gray50" :background "gray30")))) + +;; tags +(setq org-tag-alist '(("DEVIS" . ?d) ("PROJETS" . ?p) ("CLIENT" . ?c) ("PROSPECT" . ?o) ("INTERNE" . ?i) ("AO" . ?a) ("PJ" . ?z) ("AVV" . ?v) ("LEGACY" . ?l) ("ROC" . ?r))) + +(setq org-tag-faces + '( + ("DEVIS" . (:foreground "OrangeRed" :weight bold)) + ("ROC" . (:foreground "OrangeRed" :weight bold)) + ("PJ" . (:foreground "brightyellow" :weight bold)) + ("PROJET" . (:foreground "IndianRed1" :weight bold)) + ("INTERNE" . (:foreground "LimeGreen" :weight bold)) + ("LEGACY" . (:foreground "LimeGreen" :weight bold)) + ("CLIENT" . (:foreground "Orange" :weight bold)) + ("PROSPECT" . (:foreground "MediumPurple3" :weight bold)) + ("AO" . (:foreground "HotPink2" :weight bold)) + ) +) +;; org-capture use to add note to backlog file. At the end of day, use org-refile to dispatch to good note +;; https://sachachua.com/blog/2014/11/using-org-mode-keep-process-journal/ + +(setq org-capture-templates + '(("t" "TODO" entry (file+datetree "~/Nextcloud/PRIVE/13_Org/backlog.org") + "* TODO %? %^G \n %U" :empty-lines 1) + ("s" "Scheduled TODO" entry (file+datetree "~/Nextcloud/PRIVE/13_Org/backlog.org") + "* TODO %? %^G \nSCHEDULED: %^t\n %U" :empty-lines 1) + ("l" "Link" entry (file "~/Nextcloud/PRIVE/13_Org/backlog.org") + "* TODO %a %? %^G\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n") + ("j" "Journal entry" plain + (file+datetree+prompt "~/Nextcloud/PRIVE/13_Org/journal.org") + "%K ****** %a\n%i\n%?\n") + ("n" "Note dans le journal" entry (file "~/Nextcloud/PRIVE/13_Org/journal.org") + "* %? %^G\n%U" :empty-lines 1))) + +;; Org-Roam basic configuration +(use-package org-roam + :after org + :init + (setq org-roam-v2-ack t) ;; Acknowledge V2 upgrade + :custom + (org-roam-directory (file-truename org-directory)) + (org-roam-completion-everywhere t) + :bind (("C-c n l" . org-roam-buffer-toggle) + ("C-c n f" . org-roam-node-find) + ("C-c n o" . org-open-at-point) + ("C-c n j" . org-roam-dailies-capture-today) + ("C-c n i" . org-roam-node-insert)) + :config + (org-roam-setup) + (org-roam-db-autosync-mode) + ) + +;; caldav +;;(setq org-caldav-url "https://next20.produhost.net/remote.php/dav/alexandre") +;;(setq org-caldav-calendars +;; '((:calendar-id "alexandre-dri" +;; :files ("~/Nextcloud/PRIVE/13_Org/calendar/alexandre-dri.org") +;; :inbox "~/Nextcloud/PRIVE/13_Org/calendar/alexandre-dri-inbox.org"))) +;;(setq org-icalendar-include-todo 'all +;; org-caldav-sync-todo t) +;; +(use-package org-journal + :ensure t + :defer t + :init + ;; Change default prefix key; needs to be set before loading org-journal + (setq org-journal-prefix-key "C-c j ") + :config + (setq org-journal-file-type=weekly + org-journal-date-format "%A, %d %B %Y")) + +;;;; Index org file and backlog file +(defvar org-gtd-file "~/Nextcloud/PRIVE/13_Org/DRI.org") +(defvar org-backlog-file "~/Nextcloud/PRIVE/13_Org/backlog.org") + +;; Open DRI.org when I hit C-c g +(defun gtd () + "Open the GTD file." + (interactive) + (find-file org-gtd-file)) + +;; Open backlog.org when I hit file hit C-c b +(defun gtb () + "Open the backlog file." + (interactive) + (find-file org-backlog-file)) + +;; keybinding +(global-set-key "\C-cl" 'org-store-link) +(global-set-key "\C-ca" 'org-agenda) +(global-set-key "\C-cg" 'gtd) +(global-set-key "\C-cb" 'gtb) diff --git a/modules/configs/nextcloud.cfg b/modules/configs/nextcloud.cfg new file mode 100644 index 0000000..cf1972f --- /dev/null +++ b/modules/configs/nextcloud.cfg @@ -0,0 +1,44 @@ +[General] +clientVersion=3.6.4git +confirmExternalStorage=false +crashReporter=true +monoIcons=false +newBigFolderSizeLimit=500 +optionalServerNotifications=true +showCallNotifications=true +updateSegment=67 +useNewBigFolderSizeLimit=false + +[Accounts] +0\Folders\1\ignoreHiddenFiles=false +0\Folders\1\journalPath=.sync_70e356a9188d.db +0\Folders\1\localPath=/home/alexandre/Nextcloud/PRIVE/ +0\Folders\1\paused=false +0\Folders\1\targetPath=/ +0\Folders\1\version=2 +0\Folders\1\virtualFilesMode=off +0\authType=webflow +0\dav_user=alexandre +0\serverVersion=25.0.1.1 +0\url=https://next.atlanticaweb.fr +0\user=@Invalid() +0\version=1 +0\webflow_user=alexandre +1\Folders\3\ignoreHiddenFiles=false +1\Folders\3\journalPath=.sync_214037720ec4.db +1\Folders\3\localPath=/home/alexandre/Nextcloud/DRI/ +1\Folders\3\paused=false +1\Folders\3\targetPath=/ +1\Folders\3\version=2 +1\Folders\3\virtualFilesMode=off +1\authType=webflow +1\dav_user=alexandre +1\serverVersion=26.0.2.1 +1\url=https://next20.produhost.net +1\user=@Invalid() +1\version=1 +1\webflow_user=alexandre +version=2 + +[Settings] +geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x3=\0\0\0\xab\0\0\x5\xd4\0\0\x3\x1f\0\0\x3?\0\0\0\xab\0\0\x5\xd2\0\0\x3\x1d\0\0\0\0\0\0\0\0\a\x80\0\0\x3?\0\0\0\xab\0\0\x5\xd2\0\0\x3\x1d)" diff --git a/modules/emacs.nix b/modules/emacs.nix new file mode 100644 index 0000000..83fb028 --- /dev/null +++ b/modules/emacs.nix @@ -0,0 +1,50 @@ +{ pkgs, ... }: + +{ +home.packages = with pkgs; [ + multimarkdown + ]; + services.emacs.enable = true; + programs.emacs = { + enable = true; + extraPackages = (epkgs: + (with epkgs; [ + use-package + dash + doom-themes + lsp-mode + web-mode + nix-mode + rust-mode + ledger-mode + direnv + company + yasnippet + prettier-js + smartparens + org + org-journal + org-roam + org-msg + org-caldav + magit + evil + bbdb + projectile + flycheck + ivy + counsel + counsel-projectile + lsp-ivy + which-key + elpaPackages.org + markdown-mode + ])); + }; + + home.file = { + ".emacs.d/init.el" = { + source = ./configs/init.el; + }; + }; +} diff --git a/modules/gitea.nix b/modules/gitea.nix new file mode 100644 index 0000000..36a8433 --- /dev/null +++ b/modules/gitea.nix @@ -0,0 +1,22 @@ +{ config, pkgs, lib, ... }: + + { + + services.gitea = { + enable = true; # Enable Gitea + appName = "git.atlanticaweb.fr"; # Give the site a name + database = { + type = "sqlite3"; # Database type + }; + settings.server = { + ROOT_URL = "https://git.atlanticaweb.fr/"; # Root web URL + HTTP_PORT = 3001; # Provided unique port + DOMAIN = "git.atlanticaweb.fr"; # Domain name + }; + dump.enable = true; + dump.backupDir = "/srv/backup/gitea"; + lfs.enable = true; + settings.service.DISABLEREGISTRATION = true; # comment this line for the first user admin + }; + + } diff --git a/modules/grafana.nix b/modules/grafana.nix new file mode 100644 index 0000000..3695e9b --- /dev/null +++ b/modules/grafana.nix @@ -0,0 +1,142 @@ +{ config, pkgs, ...}: + let + caddyDir = "/var/lib/caddy"; + in + { + services.grafana = { + enable = true; + settings.server = { + domain = "sup.atlanticaweb.fr"; + http_port = 2342; + http_addr = "192.168.10.108"; + }; + }; + services.prometheus = { + enable = true; + port = 9001; + exporters = { + node = { + enable = true; + enabledCollectors = [ "systemd" ]; + port = 9002; + }; + }; + scrapeConfigs = [ + { + job_name = "sup"; + static_configs = [{ + targets = [ "127.0.0.1:${toString config.services.prometheus.exporters.node.port}" ]; + }]; + } + { + job_name = "nextcloud"; + static_configs = [{ + targets = [ "192.168.10.114:${toString config.services.prometheus.exporters.node.port}" ]; + }]; + } + { + job_name = "pizzajoffre"; + static_configs = [{ + targets = [ "37.187.103.8:${toString config.services.prometheus.exporters.node.port}" ]; + }]; + } + { + job_name = "pve-exporter"; + static_configs = [{ + targets = [ "192.168.10.112:9221" ]; + }]; + metrics_path = "/pve" ; + } + { + job_name = "backup"; + static_configs = [{ + targets = [ "163.172.80.106:${toString config.services.prometheus.exporters.node.port}" ]; + }]; + } + { + job_name = "dell-5590"; + static_configs = [{ + targets = [ "192.168.10.100:${toString config.services.prometheus.exporters.node.port}" ]; + }]; + } + { + job_name = "temperatures"; + static_configs = [{ + targets = [ "192.168.10.116:9521" ]; + }]; + metric_relabel_configs = [ + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "c9:5e:c5:16:23:4d" ; + replacement = "I"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "e4:9b:e7:3f:b1:24" ; + replacement = "J Perso"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "ff:a4:06:f3:18:5e" ; + replacement = "H - réserve "; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "f7:69:1d:2f:f9:6a" ; + replacement = "G - gris"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "fd:7c:46:30:5b:18" ; + replacement = "E - Table"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "e7:ef:27:89:c4:05" ; + replacement = "A CODIGEL"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "d4:1e:62:36:d0:4b" ; + replacement = "B - INFRICO"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "ec:c3:0f:ef:fe:b5" ; + replacement = "C"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "f5:fd:dd:c4:29:c1" ; + replacement = "D - HAIER"; + } + { + source_labels = [ "device" ]; + target_label = "device"; + regex = "c8:8e:34:24:2c:89" ; + replacement = "F - salle"; + } + ]; + } + + ]; + }; + users.users.caddy = { + group = "caddy"; + uid = config.ids.uids.caddy; + home = caddyDir; + createHome = true; + extraGroups = [ "users" ]; + }; + + users.groups.caddy.gid = config.ids.uids.caddy; +} diff --git a/modules/navidrome.nix b/modules/navidrome.nix new file mode 100644 index 0000000..b9c3eb9 --- /dev/null +++ b/modules/navidrome.nix @@ -0,0 +1,12 @@ +{ config, pkgs, lib, ... }: + { + services.navidrome = { + enable = true; + settings = { + MusicFolder = "/var/lib/nextcloud/data/alexandre/files/Musique/"; + Address = "0.0.0.0"; + Port = "4533"; + }; + }; + } + diff --git a/modules/neovim.nix b/modules/neovim.nix new file mode 100644 index 0000000..ce7c218 --- /dev/null +++ b/modules/neovim.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: { +programs.neovim = { + enable = true ; + viAlias = true; + vimAlias = true; + vimdiffAlias = true; + plugins = with pkgs.vimPlugins;[ + nvim-lspconfig + nvim-treesitter.withAllGrammars + plenary-nvim + gruvbox-material + mini-nvim + ]; + }; +} diff --git a/modules/prometheus-node.nix b/modules/prometheus-node.nix new file mode 100644 index 0000000..9814e32 --- /dev/null +++ b/modules/prometheus-node.nix @@ -0,0 +1,12 @@ +{ config, pkgs, lib, ... }: + { + services.prometheus = { + exporters = { + node = { + enable = true; + enabledCollectors = [ "systemd" ]; + port = 9002; + }; + }; + }; + } diff --git a/modules/rest-server.nix b/modules/rest-server.nix new file mode 100644 index 0000000..91dd9b7 --- /dev/null +++ b/modules/rest-server.nix @@ -0,0 +1,42 @@ + +{ lib, config, pkgs, ... }: +let + caddyDir = "/var/lib/caddy"; +in +{ + services.restic.server = { + enable = true; + + extraFlags = [ "--no-auth" ]; + dataDir = "/var/lib/backup"; + prometheus = true; + listenAddress = "127.0.0.1:8080"; + }; + networking = { + firewall.enable = true; + firewall.allowedTCPPorts = [ 80 443 ]; + }; + services.caddy = { + enable = true; + email = "lucazeau.alexandre@gmail.com"; + config = '' + { + storage file_system { + root ${caddyDir} + } + } + https://back.atlanticaweb.fr { + reverse_proxy http://127.0.0.1:8080 + } + ''; + }; + users.users.caddy = { + group = "caddy"; + uid = config.ids.uids.caddy; + home = caddyDir; + createHome = true; + extraGroups = [ "users" ]; + }; + + users.groups.caddy.gid = config.ids.uids.caddy; +} diff --git a/modules/rust.nix b/modules/rust.nix new file mode 100644 index 0000000..c72c0e2 --- /dev/null +++ b/modules/rust.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ...}: +with import {}; +{ + home.packages = [ + pkgs.gcc + pkgs.rustc + pkgs.cargo + pkgs.cargo-edit + ]; +} diff --git a/modules/smtp.nix b/modules/smtp.nix new file mode 100644 index 0000000..bcf890b --- /dev/null +++ b/modules/smtp.nix @@ -0,0 +1,13 @@ +{ +programs.msmtp = { + enable = true; + accounts.default = { + auth = true; + tls = true; + host = "ssl0.ovh.net"; + from = "supervision@pizzajoff.re"; + user = "supervision@pizzajoff.re"; + passwordeval = "cat /tmp/fic"; + }; +}; +} diff --git a/modules/tmux.nix b/modules/tmux.nix new file mode 100644 index 0000000..578e027 --- /dev/null +++ b/modules/tmux.nix @@ -0,0 +1,66 @@ +{ pkgs, config, ... }: +{ + programs.tmux = { + enable = true; + shortcut = "b"; + # aggressiveResize = true; -- Disabled to be iTerm-friendly + baseIndex = 1; +# newSession = true; + # Stop tmux+escape craziness. + escapeTime = 0; + secureSocket = true; + + plugins = with pkgs; [ + tmuxPlugins.better-mouse-mode + tmuxPlugins.sidebar + tmuxPlugins.nord + ]; + + extraConfig = '' + # scrollback size + set -g history-limit 50000 + # https://old.reddit.com/r/tmux/comments/mesrci/tmux_2_doesnt_seem_to_use_256_colors/ + set -g default-terminal "xterm-256color" + set -ga terminal-overrides ",*256col*:Tc" + set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' + set-environment -g COLORTERM "truecolor" + + # Mouse works as expected + set-option -g mouse on + # Redraw the client (if interrupted by wall, etc) + bind R refresh-client + # reload tmux config with ctrl + b + r + unbind r + bind r \ + source-file ~/.tmux.conf \;\ + display 'Reloaded tmux config.' + # C + control q to kill sessio + unbind q + unbind C-q + bind-key q kill-session + bind-key C-q kill-session + + # Switching panes with alt + bind -n M-Left select-pane -L + bind -n M-Right select-pane -R + bind -n M-Up select-pane -U + bind -n M-Down select-pane -D + + # Visual Activity Monitoring between windows + setw -g monitor-activity on + set -g visual-activity on + + # Show tmux positions in titles + set -g set-titles on + + # Attach to a session if runs otherwise create a new one + new-session -n DRI + ''; + }; + +# programs.tmate = { +# enable = true; + # FIXME: This causes tmate to hang. + # extraConfig = config.xdg.configFile."tmux/tmux.conf".text; +# }; +} diff --git a/modules/transmission.nix b/modules/transmission.nix new file mode 100644 index 0000000..6f536cd --- /dev/null +++ b/modules/transmission.nix @@ -0,0 +1,15 @@ +{ config, pkgs, lib, ... }: + { + services.transmission = { + enable = true; + openFirewall = true; + openRPCPort = true; + settings = { + rpc-bind-address = "0.0.0.0"; + rpc-whitelist = "192.168.10.*"; + rpc-whitelist-enable = true; + }; + }; + #networking.firewall.allowedTCPPorts = [ 9091 ]; + } + diff --git a/modules/users.nix b/modules/users.nix new file mode 100644 index 0000000..8f569d5 --- /dev/null +++ b/modules/users.nix @@ -0,0 +1,41 @@ +{ config, pkgs, ...}: +{ + users = { + groups = { + alexandre = {}; + }; + users = { + alexandre = { + isNormalUser = true; + createHome = true; + home = "/home/alexandre"; + description = "Alexandre LUCAZEAU"; + extraGroups = [ "wheel" "docker" "plocate" ]; + group = "alexandre"; + shell = pkgs.fish; + openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKUA1RW6JwZasspAp8qmFRFnlV5WXjhLfStAAkM+KYLv lucazeau.alexandre@gmail.com" ]; + }; + }; + }; + programs.git = { + enable = true; + config.user.email = "lucazeau.alexandre@gmail.com"; + config.user.name = "Alexandre LUCAZEAU"; + config.init.defaultBranch = "main"; + config.core.sshCommand = "ssh -i ~/.ssh/id_ed25519-perso"; + }; + programs.fish.enable = true; + programs.fish.shellAliases = { + ll = "ls -l"; + ls = "lsd"; +# vi = "nvim"; +# vim = "nvim"; + }; + security.sudo = { + enable = true; + execWheelOnly = true; + extraRules = [ + { users = [ "alexandre" ]; commands = [ { command = "ALL"; options = [ "NOPASSWD" ]; } ]; } + ]; + }; +}