;;; .doom.d/config.el -*- lexical-binding: t; -*-

;; Place your private configuration here
;;
;; Load appearance configuration
(load! "+ui")
;; Load custom keybindings
(load! "+keybindings")
;; Set projects directories
(setq projectile-project-search-path '(("~/Projects" . 2)
                                       ("~/Documents/Work" . 1)
                                       ("~/Documents/Papers" . 0)
                                       ("~/Documents/Typesetting" . 1)
                                       ("~/Documents/Paperwork" . 1)
                                       ("~/Documents/Typesetting" . 1)
                                       ("~/Documents/Uni" . 3)
                                       ("~/Repos" . 1)
                                       "~/.dotfiles"
                                       "~/Notes"))
; Auto cleanup recentf
(setq recentf-auto-cleanup 300)
; Save backup files to ~/.cache and autosave files to ~/.cache/emacs
(setq backup-directory-alist `(("." . "~/.cache"))
      auto-save-list-file-prefix (concat "~/.cache"))
;; Load org configuration
(setq org-directory "~/Notes")
(after! org (load! "+org"))
;; Disable completion and line numbers in Markdown
(add-hook 'markdown-mode-hook (lambda () (display-line-numbers-mode -1)))
(after! markdown
  (set-company-backend! 'markdown-mode nil))
;; Reload file from disk without confirmation
(defun revert-buffer-no-confirm ()
  (interactive)
  (revert-buffer :ignore-auto :noconfirm))
;; Align columns in CSV mode
(add-hook 'csv-mode-hook 'csv-align-mode)
;; Close compilation buffer if successful
(setq compilation-finish-functions
      (lambda (buf str)
        (if (null (string-match ".*exited abnormally.*" str))
            (progn
              (run-at-time
               "0.5 sec" nil 'delete-windows-on
               (get-buffer-create "*compilation*"))
              (message "No Compilation Errors!")))))
;; Map leader key for major mode to ,
(setq doom-localleader-key ",")
;; Disable company mode in Nix
(setq-hook! 'nix-mode-hook company-idle-delay nil)
;; Trigger flycheck after save
(setq flycheck-check-syntax-automatically '(save))
;; Ignore development databases folders
(after! lsp-mode
  (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]\\.mysql\\'")
  (add-to-list 'lsp-file-watch-ignored-directories "[/\\\\]\\.pgdata\\'"))
;; Ignore empty files
(after! projectile
  (add-to-list 'projectile-globally-ignored-files ".gitkeep")
  (add-to-list 'projectile-globally-ignored-files ".envrc")
  (add-to-list 'projectile-globally-ignored-files ".project")
  (add-to-list 'projectile-globally-ignored-directories ".direnv")
  (add-to-list 'projectile-globally-ignored-directories ".ipynb_checkpoints"))
;; Associate polymode to R markdown files
(add-to-list 'auto-mode-alist '("\\.[rR]md\\'" . poly-markdown+R-mode))
;; Set clangd as C/C++ LSP
(setq lsp-clients-clangd-args '("-j=3"
                                "--background-index"
                                "--clang-tidy"
                                "--completion-style=detailed"
                                "--header-insertion=never"
                                "--header-insertion-decorators=0"))
(after! lsp-clangd (set-lsp-priority! 'clangd 2))
;; Use relative line numbers (Usage: number <j/k>)
(setq display-line-numbers-type 'relative)
;; Use pass as auth-source
(add-to-list 'auth-sources 'password-store)
;; Set up wallabag
(after! wallabag
  (setq wallabag-host "https://wallabag.coolneng.duckdns.org"
        wallabag-username "coolneng"
        wallabag-password (auth-source-pass-get 'secret "api/wallabag")
        wallabag-clientid (auth-source-pass-get "clientid" "api/wallabag")
        wallabag-secret (auth-source-pass-get "api-secret" "api/wallabag")
        wallabag-show-sidebar 't
        wallabag-show-entry-switch 'switch-to-buffer
        url-automatic-caching t)
  (add-hook 'wallabag-after-render-hook 'wallabag-search-update-and-clear-filter))
(add-hook! 'doom-real-buffer-functions
  (defun +rss-buffer-p (buf)
    (string-match-p "^\\*wallabag" (buffer-name buf))))
(defvar +wallabag-workspace-name "*wallabag*")
(defun =wallabag ()
  "Activate (or switch to) `wallabag' in its workspace."
  (interactive)
  (if (modulep! :ui workspaces)
      (progn
        (+workspace-switch +wallabag-workspace-name t)
        (doom/switch-to-scratch-buffer)
        (wallabag)
        (+workspace/display))
    (setq +wallabag--wconf (current-window-configuration))
    (delete-other-windows)
    (switch-to-buffer (doom-fallback-buffer))
    (wallabag)))
;; Set up elfeed
(after! elfeed
  (setq elfeed-use-curl t)
  (setq elfeed-feeds (list
                      (list "fever+https://coolneng@rss.coolneng.duckdns.org"
                            :api-url "https://rss.coolneng.duckdns.org/fever/"
                            :password (auth-source-pass-get 'secret "api/miniflux"))))
  (setq elfeed-sort-order 'ascending
        elfeed-search-filter "@all +unread"
        elfeed-goodies/tag-column-width 0)
  (elfeed-protocol-enable)
  (add-hook! 'elfeed-search-mode-hook 'elfeed-update))
;; Set up the mail stack
(after! mu4e (load! "+mail"))
;; HACK Enable AOT native compilation
(setq native-comp-deferred-compilation nil)
(after! (doom-packages straight)
  (setq straight--native-comp-available t))