#+TITLE: Simponic's Settings
#+AUTHOR: Simponic
#+STARTUP: fold

* image-types hack (thanks macos)
#+BEGIN_SRC emacs-lisp
  (setq image-types '(svg png gif tiff jpeg xpm xbm pbg))
#+END_SRC
* Packages
** Melpa
#+BEGIN_SRC emacs-lisp
  (require 'package)
  (add-to-list 'package-archives
               '("melpa" . "https://melpa.org/packages/") t)
#+END_SRC
* General emacs
** Tab bar mode
#+BEGIN_SRC emacs-lisp
  (defun my-tabbar-buffer-groups () ;; customize to show all normal files in one group
    (list (cond ((string-equal "*" (substring (buffer-name) 0 1)) "emacs")
                 ((eq major-mode 'dired-mode) "emacs")
                 (t "user"))))
  (setq tabbar-buffer-groups-function 'my-tabbar-buffer-groups)
  (tab-bar-mode)
#+END_SRC
** Indentation
#+BEGIN_SRC emacs-lisp
  (setq default-tab-width 2
        tab-width 2
        indent-tabs-mode nil)
#+END_SRC
** Line numbers
#+BEGIN_SRC emacs-lisp
  (setq display-line-numbers-type 'relative)
  (global-display-line-numbers-mode)
#+END_SRC
** Filesystem stuff
#+BEGIN_SRC emacs-lisp
  (setq auto-save-default nil
        make-backup-files nil
        create-lockfiles nil)
  (global-auto-revert-mode t) ;; Change files on disk as they are updated
#+END_SRC
** GUI stuff
#+BEGIN_SRC emacs-lisp
  (menu-bar-mode -1)
  (setq inhibit-startup-screen t ;; Startup screen
        frame-resize-pixelwise t) ;; Use 100% of window space
  (defun do-frame-config ()
    (tool-bar-mode -1) ;; System bar
    (set-fringe-mode '(1 . 1)) ;; Minimize arrows before and after wrapped lines by setting fringe to 1px
    (toggle-scroll-bar -1))

  (defun disable-scroll-bars (frame)
    (modify-frame-parameters frame
                             '((vertical-scroll-bars . nil)
                               (horizontal-scroll-bars . nil))))
  (when (display-graphic-p)
    (do-frame-config)
    (add-hook 'after-make-frame-functions 'disable-scroll-bars))
#+END_SRC
*** submlimity
#+BEGIN_SRC emacs-lisp
  (use-package sublimity
    :ensure t
    :straight '(sublimity
                :type git
                :host github
                :repo "zk-phi/sublimity"))

  (require 'sublimity-scroll)
  ;;(require 'sublimity-map) ;; experimental
  (require 'sublimity-attractive)

  (sublimity-mode 1)
#+END_SRC
** System path (macos)
#+BEGIN_SRC emacs-lisp
  (use-package exec-path-from-shell
    :ensure t
    :init
    (when (memq window-system '(mac ns x))
      (exec-path-from-shell-initialize)))
#+END_SRC

* Theming
** Line spacing
#+BEGIN_SRC emacs-lisp
  (setq line-spacing 0.24)
#+END_SRC
** Highlight current line
#+BEGIN_SRC emacs-lisp
  (global-hl-line-mode)
#+END_SRC
** Font
#+BEGIN_SRC emacs-lisp
  (let ((font "JetBrains Mono-12:style=Regular"))
    (set-face-attribute 'default nil :font font)
    (set-frame-font font nil t))
#+END_SRC
** Doom-themes
#+BEGIN_SRC emacs-lisp
  (use-package doom-themes
    :ensure t
    :config
    ;; Global settings (defaults)
    (setq doom-themes-enable-bold t    ; if nil, bold is universally disabled
          doom-themes-enable-italic t) ; if nil, italics is universally disabled
    ;; Enable flashing mode-line on errors
    (doom-themes-visual-bell-config)
    ;; Enable custom neotree theme (all-the-icons must be installed!)
    (doom-themes-neotree-config)
    ;; or for treemacs users
    (setq doom-themes-treemacs-theme "doom-atom") ; use "doom-colors" for less minimal icon theme
    (doom-themes-treemacs-config)
    ;; Corrects (and improves) org-mode's native fontification.
    (doom-themes-org-config))
#+END_SRC
** Catpuccin
#+BEGIN_SRC emacs-lisp
  (use-package catppuccin-theme
    :ensure t)
#+END_SRC

** Set theme according to DARK_MODE env var
#+BEGIN_SRC emacs-lisp
  (cond
   ((getenv "DARK_MODE")
    (load-theme 'catppuccin :no-confirm))
   (t (load-theme 'doom-gruvbox-light t)))
#+END_SRC

** Doom-modeline
#+BEGIN_SRC emacs-lisp
  (use-package doom-modeline
    :ensure t
    :config
    (doom-modeline-mode 1))
#+END_SRC
** Icons
must run ~(all-the-icons-install-fonts)~ and ~(nerd-fonts-install-fonts)~
#+BEGIN_SRC emacs-lisp
  (use-package all-the-icons
    :ensure t)

  (use-package nerd-icons
    :ensure t)
#+END_SRC

* Projectile
#+BEGIN_SRC emacs-lisp
  (use-package projectile
    :bind ("C-c p" . 'projectile-command-map)
    :init (projectile-mode +1) (setq projectile-enable-caching t)
    :ensure t)
#+END_SRC

* Swiper, Ivy
#+BEGIN_SRC emacs-lisp
  (use-package counsel
    :ensure t
    :bind
    ("C-s" . 'swiper-isearch)
    ("M-x" . 'counsel-M-x)
    :init
    (setq ivy-use-virtual-buffers t)
    (setq enable-recursive-minibuffers t)
    (ivy-mode 1))
#+END_SRC

* Neotree
#+BEGIN_SRC emacs-lisp
  (use-package neotree
    :ensure t
    :bind ("C-c j" . 'neotree-toggle)
    :init
    ;; slow rendering
    (setq inhibit-compacting-font-caches t)

    ;; set icons theme
    (setq neo-theme (if (display-graphic-p) 'icons 'arrow))

    ;; Every time when the neotree window is opened, let it find current file and jump to node
    (setq neo-smart-open t)

    ;; When running ‘projectile-switch-project’ (C-c p p), ‘neotree’ will change root automatically
    (setq projectile-switch-project-action 'neotree-projectile-action)

    (setq neo-window-width 35)

    ;; show hidden files
    (setq-default neo-show-hidden-files t))
#+END_SRC

* Org mode
** General
#+BEGIN_SRC emacs-lisp
  (setq org-startup-indented t
        org-html-postamble nil
        org-html-preamble t)
#+END_SRC
** Babel
*** Elixir
#+BEGIN_SRC emacs-lisp
  (use-package ob-elixir
     :ensure t)
#+END_SRC
*** JS
#+BEGIN_SRC emacs-lisp
  (require 'ob-js)
#+END_SRC
*** Load Languages
#+BEGIN_SRC emacs-lisp
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((lisp . t)
     (elixir . t)
     (emacs-lisp . t)
     (js . t)
     (python . t)))
#+END_SRC
** org-bullets
#+BEGIN_SRC emacs-lisp
  (use-package org-bullets
    :ensure t
    :init
    (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))
#+END_SRC
** org-appear
#+BEGIN_SRC emacs-lisp
  (use-package org-appear
    :ensure t
    :init
    (add-hook 'org-mode-hook 'org-appear-mode))  
#+END_SRC
** Presentations
#+BEGIN_SRC emacs-lisp
  (use-package org-present
    :ensure t
    :straight '(org-present
                :type git
                :host github
                :repo "rlister/org-present"))
#+END_SRC

* Development
** Git
#+BEGIN_SRC emacs-lisp
  (use-package magit :ensure t)
#+END_SRC


** Autocomplete
#+BEGIN_SRC emacs-lisp
  (use-package auto-complete :ensure t)
  (ac-config-default)
#+END_SRC
*** Copilot
#+BEGIN_SRC emacs-lisp
  (use-package copilot
    :straight (:host github :repo "copilot-emacs/copilot.el" :files ("dist" "*.el"))
    :ensure t)
  (define-key copilot-completion-map (kbd "C-c c") 'copilot-accept-completion)
  (define-key copilot-completion-map (kbd "C-c c") 'copilot-accept-completion)
  (add-hook 'prog-mode-hook 'copilot-mode)
#+END_SRC

** Company mode
#+BEGIN_SRC emacs-lisp
  (use-package company
    :ensure t
    :init
    (global-company-mode t)
    :bind (:map company-active-map
                ("C-n" . company-select-next)
                ("C-p" . company-select-previous))
    :config
    (setq company-idle-delay 0.3))
#+END_SRC
** LSP Mode
#+BEGIN_SRC emacs-lisp
  (use-package lsp-mode
    :ensure t
    :init
    (setq lsp-keymap-prefix "C-c l")
    :hook ((python-ts-mode . lsp) ;; pip install python-lsp-server pyls-black pyls-isort pyls-mypy
           (elixir-mode . lsp)
           (rust-mode . lsp)
           (java-mode . lsp)
           (php-mode . lsp)
           (c-mode . lsp)
  	       (typescript-ts-mode . lsp)
  	       (tsx-ts-mode . lsp)
           (lsp-mode . lsp-enable-which-key-integration))
    :config (progn
  	    (lsp-register-custom-settings
               '(("pyls.plugins.pyls_mypy.enabled" t t)
                 ("pyls.plugins.pyls_mypy.live_mode" nil t)
                 ("pyls.plugins.pyls_black.enabled" t t)
                 ("pyls.plugins.pyls_isort.enabled" t t))))
    :commands lsp)
#+END_SRC
** Tree-Sitter
#+BEGIN_SRC emacs-lisp
  (use-package treesit-auto
    :ensure t
    :custom (treesit-auto-install 'prompt)
    :config
      (treesit-auto-add-to-auto-mode-alist 'all)
      (global-treesit-auto-mode))
#+END_SRC
** Languages
*** Common Lisp
**** Rainbow Parentheses
#+BEGIN_SRC emacs-lisp
  (use-package rainbow-delimiters :ensure t)
  (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)
#+END_SRC
**** Slime
#+BEGIN_SRC emacs-lisp
  (use-package slime
    :ensure t
    :init
    (setq inferior-lisp-program "sbcl"))
#+END_SRC
**** AC-Slime
#+BEGIN_SRC emacs-lisp
  (use-package ac-slime
    :ensure t
    :straight '(ac-slime
                :type git
                :host github
                :repo "purcell/ac-slime"))
  (add-hook 'slime-mode-hook 'set-up-slime-ac)
  (add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
  (eval-after-load "auto-complete"
    '(add-to-list 'ac-modes 'slime-repl-mode))
#+END_SRC
**** cl-indentify
#+BEGIN_SRC emacs-lisp
  ;; roswell is in the AUR
  ;; ros install cl-indentify
  (defun on-lisp-save-cl-indentify ()
    (when (eq major-mode 'lisp-mode)
      (shell-command
       (format "~/.roswell/bin/cl-indentify -r %s" (buffer-file-name)))))
  (add-hook 'after-save-hook
            #'on-lisp-save-cl-indentify)
#+END_SRC
*** Elixir
#+BEGIN_SRC emacs-lisp
  (use-package elixir-mode
    :ensure t
    :hook ((before-save .
                        (lambda ()
                          (when (eq major-mode 'elixir-mode)
                            (elixir-format))))))
#+END_SRC
*** Rust
After installing the ~rust-analyzer~, the following can be used:
#+BEGIN_SRC emacs-lisp
  (use-package rust-mode
    :ensure t)
  (setq lsp-rust-server 'rust-analyzer)
#+END_SRC
*** Web Stuff
**** astro
#+BEGIN_SRC emacs-lisp
  (use-package astro-ts-mode
    :ensure t)
  ;; note - do treesit-install-language-grammar astro @ https://github.com/virchau13/tree-sitter-astro
#+END_SR
**** Web Mode
#+BEGIN_SRC emacs-lisp
  (setq web-mode-markup-indent-offset 2)
  (setq web-mode-code-indent-offset 2)
  (setq web-mode-css-indent-offset 2)
  (use-package web-mode
    :ensure t
    :mode (("\\.scss\\'" . web-mode)
           ("\\.css\\'" . web-mode)
           ("\\.jsx\\'" .  web-mode)
           ("\\.tsx\\'" . web-mode)
           ("\\.html\\'" . web-mode))
    :commands web-mode)
#+END_SRC
**** Prisma
#+BEGIN_SRC emacs-lisp
  (use-package prisma-mode
    :ensure t
    :straight '(prisma-mode
                :type git
                :host github
                :repo "pimeys/emacs-prisma-mode"))
#+END_SRC
**** Svelte
#+BEGIN_SRC emacs-lisp
  (use-package svelte-mode
    :ensure t
    :straight '(svelte-mode
                :type git
                :host github
                :repo "leafOfTree/svelte-mode"))
#+END_SRC
**** Prettier
#+BEGIN_SRC emacs-lisp
  (use-package prettier-js
    :ensure t)
  (add-hook 'astro-ts-mode-hook 'prettier-js-mode)
  (add-hook 'js2-mode-hook 'prettier-js-mode)
  (add-hook 'typescript-mode 'prettier-js-mode)
  (add-hook 'web-mode-hook 'prettier-js-mode)
#+END_SRC
*** Kotlin
#+BEGIN_SRC emacs-lisp
  (use-package kotlin-mode
    :ensure t)
#+END_SRC
*** Java
#+BEGIN_SRC emacs-lisp
  (use-package lsp-java
    :config (add-hook 'java-mode-hook 'lsp)
    :ensure t)
#+END_SRC

*** PHP
#+BEGIN_SRC emacs-lisp
  (use-package php-mode
    :ensure t)
#+END_SRC

** Format All The Buffers
#+BEGIN_SRC emacs-lisp
  (use-package format-all
    :ensure t)
  (add-hook 'prog-mode-hook 'format-all-mode)
  (add-hook 'astro-ts-mode-hook 'format-all-mode)
  (add-hook 'format-all-mode-hook 'format-all-ensure-formatter)
#+END_SRC

* Multiple Cursors
#+BEGIN_SRC emacs-lisp
  (use-package multiple-cursors
    :straight t
    :ensure t
    :bind (("H-SPC" . set-rectangular-region-anchor)
           ("C-M-SPC" . set-rectangular-region-anchor)
           ("C->" . mc/mark-next-like-this)
           ("C-<" . mc/mark-previous-like-this)
           ("C-c C->" . mc/mark-all-like-this)
           ("C-c C-SPC" . mc/edit-lines)))
#+END_SRC
* Elcord
#+BEGIN_SRC emacs-lisp
  (use-package elcord
    :config
    (setq elcord-idle-message "Idling..."
          elcord-idle-timer 300
          elcord-refresh-rate 3)
    :ensure t)
  (elcord-mode)
#+END_SRC
