;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-

;; Some functionality uses this to identify you, e.g. GPG configuration, email
;; clients, file templates and snippets.
(setq user-full-name "Marc Sastre Rienitz"
      user-mail-address "marc@sastre.cat")

;; This determines the style of line numbers in effect. If set to `nil', line
;; numbers are disabled. For relative line numbers, set this to `relative'.
(setq display-line-numbers-type t)

;; Fonts
(setq doom-font (font-spec :family "Iosevka Nerd Font" :size 18))
(setq doom-symbol-font (font-spec :family "Iosevka Nerd Font" :size 18))
(setq doom-emoji-font (font-spec :family "Noto Color Emoji" :size 18))

;; Themeing
(use-package base16-theme
  :init (add-to-list 'custom-theme-load-path "~/.config/doom/themes")
  :ensure t
  :config
  (load-theme 'base16-samfelag t))
;; (after! doom-themes
;;   (load-theme 'doom-nano-dark t))

;; (use-package! doom-nano-modeline
;;   :config
;;   (doom-nano-modeline-mode 1)
;;   (global-hide-mode-line-mode 1))

;; Here are some additional functions/macros that could help you configure Doom:
;;
;; - `load!' for loading external *.el files relative to this one
;; - `use-package!' for configuring packages
;; - `after!' for running code after a package has loaded
;; - `add-load-path!' for adding directories to the `load-path', relative to
;;   this file. Emacs searches the `load-path' when you load packages with
;;   `require' or `use-package'.
;; - `map!' for binding new keys
;;
;; To get information about any of these functions/macros, move the cursor over
;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k').
;; This will open documentation for it, including demos of how they are used.
;;
;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how
;; they are implemented.

;; -----------------------------------------------------------------------------

(setq-default tab-width 4)

;; -----------------------------------------------------------------------------
;; Emojify
;; -----------------------------------------------------------------------------
(use-package! emojify
  :config
  (when (member "Noto Color Emoji" (font-family-list))
    (set-fontset-font
     t 'emoji (font-spec :family "Noto Color Emoji") nil 'prepend))
  (setq emojify-display-style 'image)
  (setq emojify-emoji-styles '(unicode)))


;; -----------------------------------------------------------------------------
;; Projectile
;; -----------------------------------------------------------------------------
(use-package projectile
  :config
  (setq projectile-project-search-path '("~/projects")))


;; -----------------------------------------------------------------------------
;; vterm
;; -----------------------------------------------------------------------------
(use-package vterm
  :config
  (setq vterm-shell "zsh"))


;; -----------------------------------------------------------------------------
;; elisp
;; -----------------------------------------------------------------------------
(use-package parinfer
  :defer t)


;; -----------------------------------------------------------------------------
;; LSP
;; -----------------------------------------------------------------------------
;; (use-package lsp-mode
;;   :init
;;   :hook (;;
;;          (clojure-mode . lsp-deferred)
;;          (python-mode . lsp-deferred)
;;          ;; if you want which-key integration
;;          (lsp-mode . lsp-enable-which-key-integration))
;;   :commands (lsp lsp-deferred))


;; -----------------------------------------------------------------------------
;; Python
;; -----------------------------------------------------------------------------
(defun my-python-mode-hook ()
  "Do everything I need when entering python mode"
  (setq fill-column 120)
  (add-hook! 'before-save-hook :local #'py-autopep8-buffer #'py-isort-buffer)
  ;; accept underscore as part of a word
  (superword-mode 1)
  (modify-syntax-entry ?_ "w" python-mode-syntax-table))

(add-hook 'python-mode-hook 'my-python-mode-hook)

(use-package py-autopep8
  :config
  (setq py-autopep8-options '("--max-line-length=120")))

(use-package pipenv
  :config
  (setq pipenv-with-projectile t)
  (setenv "PIPENV_MAX_DEPTH" "10"))

;; (with-eval-after-load 'eglot
;;   (add-to-list 'eglot-server-programs
;;                '(python-mode . ("ty" "server"))))

;; -----------------------------------------------------------------------------
;; Web (HTML + CSS)
;; -----------------------------------------------------------------------------
;; (use-package! lsp-tailwindcss)

;; -----------------------------------------------------------------------------
;; Org
;; -----------------------------------------------------------------------------
(setq org-directory "~/org")
(setq org-agenda-files (directory-files-recursively "~/org/agenda" "\\.org$"))


;; -----------------------------------------------------------------------------
;; Agenix
;; -----------------------------------------------------------------------------
(load! "modules/agenix.el")
(setq agenix-age-program "age")
(setq agenix-agenix-program "agenix")


;; -----------------------------------------------------------------------------
;; Appearance - Prettify
;; -----------------------------------------------------------------------------
(load! "modules/prettify-utils.el")

(pretty-hook python-mode
  ("def" " 󰊕 ")
  ("class" "𝙘")
  ("None" "∅")
  ("lambda" "λ")
  ("not in" "∉")
  ("in" "∈"))



(pretty-hook emacs-lisp-mode)
  ;; ("defun" "𝙛")

;; (pretty-hook org-mode
;;   ("[ ]" "☐")
;;   ("[X]" "☑"))


;; -----------------------------------------------------------------------------
;; BK理 (BeKaRi)
;; -----------------------------------------------------------------------------
(add-load-path! "bkri")
(require 'bkri)

(map! :leader
      (:prefix-map ("a" . "AI")
                   (:prefix ("b". "BKri")
                    ;; Edit queries
                    :desc "Insert"                    "i" #'bkri-insert-quick
                    :desc "Insert (big prompt)"       "I" #'bkri-insert
                    :desc "Replace"                   "r" #'bkri-replace-region-quick
                    :desc "Replace (big prompt)"      "R" #'bkri-replace-region
                    :desc "Edit file"                 "f" #'bkri-edit-file-quick
                    :desc "Edit file (big prompt)"    "F" #'bkri-edit-file
                    ;; Search queries
                    :desc "Search"                    "s" #'bkri-search
                    :desc "Open last search"          "S" #'bkri-search-reopen
                    ;; Plan queries
                    :desc "Plan"                      "p" #'bkri-plan-quick
                    :desc "Plan (big prompt)"         "P" #'bkri-plan
                    ;; Query management
                    :desc "Cancel query at point"     "k" #'bkri-cancel-query-at-point
                    :desc "Goto query"                "q" #'bkri-goto-query)))
