dotfiles/.config/emacs/emacs.org
2023-01-14 11:05:53 +09:00

36 KiB
Executable File
Raw Blame History

Emacs Configuration

Basic Configuration

Emacs Configuration for emacs 29.50

Early Init

    ;;; early-init.el -*- lexical-binding: t; -*-
    ;; garbage collection
    (setq gc-cons-threshold (* 50 1024 1024)) ;; 50MB
    ;; prefers newest version of a file
    (customize-set-variable 'load-prefer-newer t)

  ;;; Native compilation settings
  (when (featurep 'native-compile)
    ;; Silence compiler warnings as they can be pretty disruptive
    (setq native-comp-async-report-warnings-errors nil)

    ;; Make native compilation happens asynchronously
    (setq native-comp-deferred-compilation t))

    (setq inhibit-startup-message t)
    (setq frame-resize-pixelwise t)
    (scroll-bar-mode -1)
    (tool-bar-mode -1)
    (tooltip-mode -1)
    (set-fringe-mode 10)
    (menu-bar-mode -1)
    ;;(blink-cursor-mode 0)

    ;; initial load with blue theme
    (load-theme 'deeper-blue)

    (customize-set-variable 'initial-major-mode 'fundamental-mode)

Init

Startup hook

;;; init.el -*- lexical-binding: t; -*-
(add-hook 'emacs-startup-hook
          (lambda ()
            (message "Emacs loaded in %s"
                     (emacs-init-time))))

Package Function

      (require 'package)
    (add-to-list 'package-archives '("stable" . "https://stable.melpa.org/packages/"))
    (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
    (customize-set-variable 'package-archive-priorities
                            '(("gnu"    . 99)   ; prefer GNU packages
                              ("nongnu" . 80)   ; use non-gnu packages if
                                                ; not found in GNU elpa
                              ("stable" . 70)   ; prefer "released" versions
                                                ; from melpa
                              ("melpa"  . 0)))  ; if all else fails, get it
                                                ; from melpa
    ;; make sure the elpa/ folder exists after setting it above.
    (unless (file-exists-p package-user-dir)
      (mkdir package-user-dir t))

  (defmacro usr-package-install (package)
    `(unless (package-installed-p ,package) (package-install ,package)))
  (package-initialize)

    ;;; init.el ends here

Add other modules

(add-to-list 'load-path (expand-file-name "modules/" user-emacs-directory))

Edit options

Whitespace clean
(add-hook 'before-save-hook #'whitespace-cleanup)
Tabs
(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)

협업에 있어서 코드에 tabs 크기를 명시하는 것도 방법일듯.

Modeline Indentation example
  • Emacs

    /* -*- Mode: rust; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
  • Vim

    # Embeded VIM Configurations
    # vim: filetype=sh noet sw=4 ts=4 fdm=marker
  • Visual Studio Code install extension modeline.

    // vim: set ft=js ts=4 sw=4 et:
    // vim: ts=4:sw=4:et:ft=js
    // -*- mode: js; indent-tabs-mode: nil; tab-width: 4 -*-
    // code: language=rust insertSpaces=false tabSize=4
    

Backup options

(setq backup-directory-alist `(("." . ,(expand-file-name "backups/" user-emacs-directory))))
(setq-default custom-file (expand-file-name ".custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))
(setq delete-by-moving-to-trash t
      trash-directory "~/.local/share/Trash/files/")
(setq undo-limit 100000000
      auto-save-default t)
;;(require 'no-littering)
;;(setq auto-save-file-name-transforms
;;      `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))

Other options

  (set-default-coding-systems 'utf-8)
  (set-language-environment "utf-8")
  (customize-set-variable 'large-file-warning-threshold 100000000) ;; 100MB

  (defconst ON-LINUX (eq system-type 'gnu/linux))
  (defconst ON-MAC (eq system-type 'darwin))
  (defconst ON-WINDOWS (memq system-type '(cygwin windows-nt ms-dos)))

  (setq gc-cons-threshold (* 2 1024 1024)) ; decreasing the threshold to 2MB

  (defvar my-config-file (expand-file-name "config.el" user-emacs-directory))
  (load my-config-file nil 'nomessage)

  (setq use-short-answer t)
  (global-auto-revert-mode t)

Modules Selection module

  ;;; config.el -*- lexical-binding: t; -*-
  (setq user-full-name "JaeYoo-Im"
        user-mail-address "cpu3792@gmail.com")

  (setq default-input-method "korean-hangul")

  (add-hook 'emacs-startup-hook
            (lambda ()
              (custom-set-faces
               `(default ((t (:font "Fira Code 14"))))
               `(fixed-pitch ((t (:inherit (default)))))
               `(fixed-pitch-serif ((t (:inherit (default)))))
               `(variable-pitch ((t (:font "Ubuntu 14")))))))

  (require 'custom-ui)
  (require 'custom-keybindings)
  (require 'custom-default)
  (require 'custom-completion)
  (require 'custom-projects)
  (require 'custom-org)
  ;;(require 'custom-workspaces)
  (require 'custom-latex)
  (require 'custom-extra)

  ;;; config.el ends here

Module Lists

Default

emacs built-in package config

Eshell
  (setq eshell-prompt-function
        (lambda ()
          (concat (abbreviate-file-name (eshell/pwd))
                  (if (= (user-uid) 0) " # " " λ ")))
        eshell-prompt-regexp "^[^#λ\n]* [#λ] ")
Dired
  (usr-package-install 'dired-single)
  (usr-package-install 'diredfl) ;; colorful dired
  (usr-package-install 'dired-git-info)
  (usr-package-install 'diff-hl)  ;; diff highlight
  (usr-package-install 'dired-rsync)
  (usr-package-install 'all-the-icons-dired)
  (usr-package-install 'dired-hide-dotfiles)
  ;; dired default
  (setq dired-listing-switches "-agho --group-directories-first")
  (evil-collection-define-key 'normal 'dired-mode-map
    "h" 'dired-single-up-directory
    "l" 'dired-single-buffer)
  (require 'dired-single)
  ;;(use-package dired-single
  ;;  :commands (dired dired-jump))
  ;; colorful
  (add-hook 'dired-mode-hook #'diredfl-mode)
  ;; git info
  (evil-collection-define-key 'normal 'dired-mode-map
    ")" 'dired-git-info-mode)
  ;; diff highlight
  (add-hook 'dired-mode-hook #'diff-hl-dired-mode-unless-remote)
  (add-hook 'magit-post-refresh-hook #'diff-hl-dired-mode-unless-remote)
  (diff-hl-margin-mode)
  ;; rsync
  (bind-key "C-c C-r" 'dired-rsync dired-mode-map)
  ;; all-the icons
  (add-hook 'dired-mode-hook #'all-the-icons-dired-mode)
  ;; HACK:Fixes #1929: icons break file renaming in Emacs 27+, because the icon
  ;;      is considered part of the filename, so we disable icons while we're in
  ;;      wdired-mode.
  ;;(when EMACS27+
  (defvar +wdired-icons-enabled -1)

  ;; hide dotfiles
  (add-hook 'dired-mode-hook #'dired-hide-dotfiles-mode)
  (evil-collection-define-key 'normal 'dired-mode-map
    "H" 'dired-hide-dotfiles-mode)

  ;; TODO: check emacs29 updates
  ;;(csetq dired-mouse-drag-files                   t
  ;;       mouse-drag-and-drop-region-cross-program t)
Provide Modules
  (provide 'custom-default)
  ;;; custom-default.el ends here

UI

Install Packages
  (usr-package-install 'all-the-icons)
  (usr-package-install 'doom-themes)
  (usr-package-install 'rainbow-delimiters)
  (usr-package-install 'doom-modeline)
  (usr-package-install 'visual-fill-column)
  (usr-package-install 'dashboard)
Line number
  (column-number-mode)
  (global-display-line-numbers-mode t)
  ;; Disable line numbers for some modes
  (dolist (mode '(org-mode-hook
                  nov-mode-hook
                  dashboard-mode-hook
                  dired-mode-hook
                  eshell-mode-hook))
    (add-hook mode (lambda () (display-line-numbers-mode 0))))
Doom themes
  (require 'doom-themes)
  (disable-theme 'deeper-blue)
  (if (display-graphic-p)
      (load-theme 'doom-palenight t)
    (load-theme 'doom-gruvbox t))
Rainbow Delimiters
  (require 'rainbow-delimiters)
  (add-hook 'prog-mode-hook #'rainbow-delimiters-mode)
Setting Transparency
  (set-frame-parameter nil 'alpha-background 0.9)
  (add-to-list 'default-frame-alist '(alpha-background . 0.9))
  (defun toggle-transparency ()
    "toggle transparency."
    (interactive)
    (let ((alpha-transparency 1.0))
      (if (eq (frame-parameter nil 'alpha-background) alpha-transparency)
          (set-frame-parameter nil 'alpha-background 0.9)
        (set-frame-parameter nil 'alpha-background alpha-transparency))))
  (defun my/transparency-round (val)
    "Round VAL to the nearest tenth of an integer."
    (/ (round (* 10 val)) 10.0))

  (defun my/increase-frame-alpha-background ()
    "Increase current frames alpha background."
    (interactive)
    (set-frame-parameter nil
                         'alpha-background
                         (my/transparency-round
                          (min 1.0
                               (+ (frame-parameter nil 'alpha-background) 0.1))))
    (message "%s" (frame-parameter nil 'alpha-background)))

  (defun my/decrease-frame-alpha-background ()
    "Decrease current frames alpha background."
    (interactive)
    (set-frame-parameter nil
                         'alpha-background
                         (my/transparency-round
                          (max 0.0
                               (- (frame-parameter nil 'alpha-background) 0.1))))
    (message "%s" (frame-parameter nil 'alpha-background)))
  (global-set-key (kbd "C-c t") 'toggle-transparency)
Modeline
  (require 'doom-modeline)
  (setq doom-modeline-height 15
        doom-modeline-env-version t
        doom-modeline-persp-name t
        doom-modeline-persp-icon t
        doom-modeline-display-default-persp-name t
        doom-modeline-indent-info t)
  (doom-modeline-mode 1)
Whiteroom
  ;;(use-package writeroom-mode
  ;;  :defer t
  ;;  :straight (:build t)
  ;;  :init (global-writeroom-mode 1)
  ;;  :config
  ;;  (setq writeroom-width             100
  ;;        writeroom-fullscreen-effect nil
  ;;        writeroom-maximize-window   nil
  ;;        writeroom-mode-line         t
  ;;        writeroom-major-modes       '(text-mode org-mode markdown-mode nov-mode Info-mode)))
Visual Fill Column
  (require 'visual-fill-column)
  (defun write-room-enable ()
    (setq visual-fill-column-width 100
         visual-fill-column-center-text t)
    (visual-fill-column-mode 1))
    (add-hook 'org-mode-hook #'write-room-enable)
    (add-hook 'markdown-mode-hook #'write-room-enable)
    (add-hook 'nov-mode-hook #'write-room-enable)
Dashboard
  (require 'linum) ;; for dashboard seperator
  ;;(add-hook 'dashboard-mode page-break-lines-mode)
  (require 'dashboard)

  (setq dashboard-set-heading-icons t)
  (setq dashboard-set-file-icons t)
  ;;(setq dashboard-banner-logo-title "Emacs is more than a text editor!")
  ;;(setq dashboard-startup-banner 'logo)
  (setq dashboard-center-content t)
  (setq dashboard-week-agenda t)
  (setq dashboard-agenda-time-string-format "%d/%m/%Y %A %H:%M")
  (setq dashboard-items '((recents . 10)
                          (agenda . 5)
                          (bookmarks . 5)
                          ;;(projects . 5)
                          (registers . 5)))
  (setq dashboard-set-navigator t)

  (setq dashboard-navigator-buttons
        `(;; line1
          ((,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust 0.0)
            "Github"
            "Browse my Github"
            (lambda (&rest _) (browse-url "https://github.com/JaeUs3792/")))
           (,(all-the-icons-octicon "home" :height 1.1 :v-adjust 0.0)
            "Homepage"
            "Browse my Homepage"
            (lambda (&rest _) (browse-url "https://jaeus.net"))))))

  (dashboard-setup-startup-hook)
  (dashboard-modify-heading-icons '((recents . "file-text")
                                    (bookmarks . "book")))
  (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")))
Others
  (setq visible-bell t)
  (defun self-screenshot (&optional type)
    "Save a screenshot of type TYPE of the current Emacs frame.
  As shown by the function `', type can weild the value `svg',
  `png', `pdf'.

  This function will output in /tmp a file beginning with \"Emacs\"
  and ending with the extension of the requested TYPE."
    (interactive)
    (let* ((type (if type type
                   (intern (completing-read "Screenshot Type: "
                                            '(png svg pdf postscript)))))
           (extension (pcase type
                        ('png        ".png")
                        ('svg        ".svg")
                        ('pdf        ".pdf")
                        ('postscript ".ps")
                        (otherwise (error "Cannot export screenshot of type %s" otherwise))))
           (filename (make-temp-file "Emacs-" nil extension))
           (data     (x-export-frames nil type)))
      (with-temp-file filename
        (insert data))
      (kill-new filename)
      (rename-file filename (expand-file-name (file-name-nondirectory filename) "~"))
      (message filename)))
Provide Modules
(provide 'custom-ui)
;;; custom-ui.el ends here

Key Bindings

Install Packages
  (usr-package-install 'which-key)
  (usr-package-install 'general)
  (usr-package-install 'evil)
  (usr-package-install 'evil-collection)
  (usr-package-install 'evil-nerd-commenter)
  (usr-package-install 'evil-numbers)
  ;;(usr-package-install 'undo-tree)
  (usr-package-install 'hydra)
Global Key
  ;; Make ESC quit prompts
  (global-set-key (kbd "<escape>") 'keyboard-escape-quit)
  ;; this annoying binding.
  (global-unset-key (kbd "C-j"))
  (global-unset-key (kbd "C-k"))
  (global-unset-key (kbd "S-SPC"))    ;; use only S-\
Which keys

When you begin a keybind, whichkey will show you all keybinds you can follow the first one with in order to form a full keywords.

  (require 'which-key)
  (setq which-key-idle-delay 0.5)
General

for managing keybindings.

  (require 'general)
  (general-auto-unbind-keys)
  (general-evil-setup t)
  (general-create-definer ju/leader-key-def
    :keymaps '(normal insert visual emacs)
    :prefix "SPC"
    :global-prefix "C-SPC")
  (ju/leader-key-def
    "." 'find-file
    ;; Buffer
    "b" '(:ignore t :which-key "buffer handling")
    "b i" '(ibuffer :which-key "IBuffer")
    "b r" '(revert-buffer :which-key "Revert Buffer")
    "b k" '(kill-current-buffer :which-key "Kill current buffer")
    "b n" '(next-buffer :which-key "Next buffer")
    "b p" '(previous-buffer :which-key "Previous buffer")
    "b B" '(ibuffer-list-buffers :which-key "IBuffer List Buffers")
    "b K" '(kill-buffer :which-key "IBuffer Kill Buffers")
    ;; Eshell
    "e" '(:ignore t :which-key "eshell")
    "e h" '(counsel-esh-history :which "Kill history")
    "e s" '(eshell :which "run eshell")
    ;; Workspace
    ;; Counsel
    "f" '(:ignore t :which-key "file op.")
    "f r" '(consult-recent-file :which-key "Recent files")
    "t t" '(toggle-truncate-lines :which-key "Toggle truncate lines")
    ;; Shortcut
    "f o d" '((lambda () (interactive) (find-file (expand-file-name "~/.config/emacs/desktop.org"))) :which-key "open exwm config")
    "f o p" '((lambda () (interactive) (find-file (expand-file-name "~/org/example/emacs_my_previous.org"))) :which-key "open exwm config")
    "f o e" '((lambda () (interactive) (find-file (expand-file-name "~/org/example/emacs_another.org"))) :which-key "open exwm config")
    "f o c" '((lambda () (interactive) (find-file (expand-file-name "~/.config/emacs/emacs.org"))) :which-key "open emacs config")
    ;; Hydra
    "h" '(:ignore t :which-key "hydra")
    "h t" '(hydra-text-scale/body :which-key "scale text")
    "h w" '(hydra-writeroom-scale/body :which-key "scale whiteroom")
    "h a" '(hydra-modify-alpha/body :which-key "modify alpha background")
    ;; Magit
    "g" '(:ignore t :which-key "magit")
    "g g" '(magit :which-key "magit")
    ;; Project-el
    "p" '(:ignore t :which-key "project")
    "p ." '(project-switch-project :which-key "switch project")
    "p p" '(project-switch-project :which-key "switch project")
    "p c" '(project-compile :which-key "compile")
    "p f" '(project-find-file :which-key "find-file")
    "p k" '(project-kill-buffers :which-key "kill buffers")
    "p s" '(project-shell :which-key "shell")
    "p e" '(project-eshell :which-key "eshell")
    "p d" '(project-dired :which-key "dired")
    "p g" '(project-find-regexp :which-key "find-regexp"))
Evil Mode
  (customize-set-variable 'evil-want-integration t)
  (customize-set-variable 'evil-want-keybinding nil)
  (customize-set-variable 'evil-want-C-u-scroll t)
  (customize-set-variable 'evil-want-C-i-jump nil)
  (customize-set-variable 'evil-respect-visual-line-mode nil) ; t : on the screen, nil : by cr characters

  (customize-set-variable 'evil-set-fine-undo t); more granular undo with evil

  (require 'evil)
  (evil-mode 1)
  ;; Make evil search more like vim
  ;;(evil-select-search-module 'evil-search-module 'evil-search)

  (evil-set-undo-system 'undo-redo)
  (evil-set-initial-state 'messages-buffer-mode 'normal)
  (evil-set-initial-state 'dashboard-mode 'normal)

  ;; evil nerd commenter
  (define-key evil-normal-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines)
  (define-key evil-visual-state-map (kbd "g c") 'evilnc-comment-or-uncomment-lines)

  ;; evil collection
  (evil-collection-init)

  ;; evil numbers
  ;; unfortunately C-x is emacs common key binding.
  (define-key evil-normal-state-map (kbd "g =") 'evil-numbers/inc-at-pt)
  (define-key evil-normal-state-map (kbd "g -") 'evil-numbers/dec-at-pt)
  (define-key evil-visual-state-map (kbd "g =") 'evil-numbers/inc-at-pt)
  (define-key evil-visual-state-map (kbd "g -") 'evil-numbers/dec-at-pt)

  ;; eshell no evil
  (dolist (mode '(eshell-mode))
    (add-to-list 'evil-emacs-state-modes mode))

  ;; when programming _
  (modify-syntax-entry ?_ "w")
Undo Tree
  ;;(require 'undo-tree)
  ;;(setq undo-tree-visualizer-diff       t
  ;;      undo-tree-visualizer-timestamps t
  ;;      undo-tree-auto-save-history     t
  ;;      undo-tree-enable-undo-in-region t
  ;;      undo-limit        (* 800 1024)
  ;;      undo-strong-limit (* 12 1024 1024)
  ;;      undo-outer-limit  (* 128 1024 1024))
  ;;(global-undo-tree-mode)
Hydra
  (require 'hydra)
  (defhydra hydra-text-scale (:timeout 4)
    "scale text"
    ("t" text-scale-increase "in")
    ("s" text-scale-decrease "out")
    ("q" nil "finished" :exit t))
  (defhydra hydra-writeroom-scale (:timeout 4)
    "scale whiteroom"
    ("t" writeroom-increase-width "enlarge")
    ("S" writeroom-decrease-width "shrink")
    ("r" writeroom-adjust-width "adjust")
    ("q" nil "finished" :exit t))
  (defhydra hydra-modify-alpha ()
    ("s" my/decrease-frame-alpha-background "decrease alpha")
    ("t" my/increase-frame-alpha-background "increase alpha")
    ("q" nil "finished" :exit t))
Provide Modules
(provide 'custom-keybindings)
;;; custom-keybindings.el ends here

Completion

config from crafted-emacs https://github.com/SystemCrafter/crafted-emacs

Install Packages
  (usr-package-install 'vertico)
  (usr-package-install 'marginalia)
  (usr-package-install 'consult)
  (usr-package-install 'orderless)
  (usr-package-install 'embark)
  (usr-package-install 'embark-consult)
  (usr-package-install 'corfu)
  (usr-package-install 'corfu-terminal)
  (usr-package-install 'cape)
Vertico
  (require 'vertico)
  (require 'vertico-directory)
  (with-eval-after-load 'evil
    (define-key vertico-map (kbd "C-j") 'vertico-next)
    (define-key vertico-map (kbd "C-k") 'vertico-previous)
    (define-key vertico-map (kbd "M-h") 'vertico-directory-up))
  (customize-set-variable 'vertico-cycle t)
  (vertico-mode 1)
Marginalia

annotations placed at the margin of the minibuffer

  (require 'marginalia)
  (customize-set-variable 'marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil))
  (marginalia-mode 1)
Consult
  (global-set-key (kbd "C-s") 'consult-line)
  (define-key minibuffer-local-map (kbd "C-r") 'consult-history)
  (global-set-key (kbd "C-M-j") 'consult-buffer)
  (setq completion-in-region-function #'consult-completion-in-region)
Orderless

orderless completion

  (require 'orderless)
  (customize-set-variable 'completion-styles '(orderless basic))
  (customize-set-variable 'completion-category-overrides '((file (style basic partial-completion))))
Embark / Embark Consult

Quick Action in minibuffer

  (require 'embark)
  (require 'embark-consult)
  (global-set-key [remap describe-bindings] #'embark-bindings)
  (global-set-key (kbd "C-.") 'embark-act)
  ;; Use Embark to show bindings in a key prefix with `C-h`
  (setq prefix-help-command #'embark-prefix-help-command)
  (with-eval-after-load 'embark-consult
  (add-hook 'embark-collect-mode-hook #'consult-preview-at-point-mode))
Corfu / Cape
  ;;; Corfu
  (require 'corfu-popupinfo)
  (require 'corfu)

  (unless (display-graphic-p)
    (require 'corfu-terminal)
    (corfu-terminal-mode +1))

  ;; Setup corfu for popup like completion
  (customize-set-variable 'corfu-cycle t) ; Allows cycling through candidates
  (customize-set-variable 'corfu-auto t)  ; Enable auto completion
  (customize-set-variable 'corfu-auto-prefix 2) ; Complete with less prefix keys
  (customize-set-variable 'corfu-auto-delay 0.0) ; No delay for completion
  (customize-set-variable 'corfu-echo-documentation 0.25) ; Echo docs for current completion option

  (global-corfu-mode 1)
  (corfu-popupinfo-mode 1)
  (eldoc-add-command #'corfu-insert)
  (define-key corfu-map (kbd "M-p") #'corfu-popupinfo-scroll-down)
  (define-key corfu-map (kbd "M-n") #'corfu-popupinfo-scroll-up)
  (define-key corfu-map (kbd "M-d") #'corfu-popupinfo-toggle)

  ;;; Cape

  ;; Setup Cape for better completion-at-point support and more
  (require 'cape)

  ;; Add useful defaults completion sources from cape
  (add-to-list 'completion-at-point-functions #'cape-file)
  (add-to-list 'completion-at-point-functions #'cape-dabbrev)

  ;; Silence the pcomplete capf, no errors or messages!
  ;; Important for corfu
  (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-silent)

  ;; Ensure that pcomplete does not write to the buffer
  ;; and behaves as a pure `completion-at-point-function'.
  (advice-add 'pcomplete-completions-at-point :around #'cape-wrap-purify)
  (add-hook 'eshell-mode-hook
            (lambda () (setq-local corfu-quit-at-boundary t
                              corfu-quit-no-match t
                              corfu-auto nil)
              (corfu-mode)))
Provide Modules
(provide 'custom-completion)
;;; custom-completion.el ends here

Org Mode

Install Packages
  (usr-package-install 'valign)
  (usr-package-install 'org-pdftools)
Valign
12345678
일이삼사
  (customize-set-variable 'valign-fancy-bar t)
Org PDF tools

get link from pdf,

  (add-hook 'org-mode-hook #'org-pdftools-setup-link)
Provide Modules
  (provide 'custom-org)
  ;;; custom-org.el ends here

Projects

Install Packages
  (usr-package-install 'magit)
  (usr-package-install 'magit-todos)
  ;;(usr-package-install 'forge)
  (usr-package-install 'hl-todo)
MAGIT
  ;;(use-package magit)
  (require 'magit)
  ;;(magit-status magit-get-current-branch)
  ;;  ;;:custom
  (setq magit-clone-default-directory "~/Project/"
         magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)
  ;;(use-package magit-todos
  ;;  :after (magit todo)
  ;;  :config
  ;;  (setq magit-todos-ignore-case t))
  ;;(use-package forge
  ;;  :after magit)
Highlight TODOs
TODO: test
  (require 'hl-todo)
  (setq hl-todo-keyword-faces
        `(;; For things that need to be done, just not today.
          ("TODO" warning bold)
          ;; For problems that will become bigger problems later if not
          ;; fixed ASAP.
          ("FIXME" error bold)
          ;; For tidbits that are unconventional and not intended uses of the
          ;; constituent parts, and may break in a future update.
          ("HACK" font-lock-constant-face bold)
          ;; For things that were done hastily and/or hasn't been thoroughly
          ;; tested. It may not even be necessary!
          ("REVIEW" font-lock-keyword-face bold)
          ;; For especially important gotchas with a given implementation,
          ;; directed at another user other than the author.
          ("NOTE" success bold)
          ;; For things that just gotta go and will soon be gone.
          ("DEPRECATED" font-lock-doc-face bold)
          ;; For a known bug that needs a workaround
          ("BUG" error bold)
          ;; For warning about a problematic or misguiding code
          ("XXX" font-lock-constant-face bold)))
  (global-hl-todo-mode 1)
Magit TODOs
  (require 'magit-todos)
  (add-hook 'magit-mode-hook #'magit-todos-mode)
Provide Modules
  (provide 'custom-projects)
  ;;; custom-projects.el ends here

Workspaces

Tabspace
  ;;(use-package tabspaces
  ;;  :disabled
  ;;  ;; use this next line only if you also use straight, otherwise ignore it.
  ;;  :straight (:type git :host github :repo "mclear-tools/tabspaces")
  ;;  :hook (after-init . tabspaces-mode) ;; use this only if you want the minor-mode loaded at startup.
  ;;  :commands (tabspaces-switch-or-create-workspace
  ;;             tabspaces-open-or-create-project-and-workspace)
  ;;  :custom
  ;;  (tabspaces-use-filtered-buffers-as-default t)
  ;;  (tabspaces-default-tab "Default")
  ;;  (tabspaces-remove-to-default t)
  ;;  (tabspaces-include-buffers '("*scratch*"))
  ;;  ;; sessions
  ;;  (tabspaces-session t)
  ;;  (tabspaces-session-auto-restore t)
  ;;  :config
  ;;  (ju/leader-key-def
  ;;    "TAB" '(tabspaces-command-map :which-key "tabspaces-command-map")))
Perspective
  ;;(use-package perspective
  ;;  :disabled
  ;;  :demand t
  ;;  :bind (("C-M-j" . consult-buffer)
  ;;         ("C-M-k" . persp-switch)
  ;;         ("C-M-n" . persp-next)
  ;;         ("C-x k" . persp-kill-buffer*))
  ;;  :custom
  ;;  (persp-initial-frame-name "Main")
  ;;  (persp-mode-prefix-key (kbd "C-c p"))
  ;;  :config
  ;;  (ju/leader-key-def
  ;;    "TAB" '(perspective-map :which-key "perspective"))
  ;;  ;; Running `persp-mode' multiple times resets the perspective list...
  ;;  (unless (equal persp-mode t)
  ;;    (persp-mode)))
  ;;(provide 'custom-workspaces)
    ;;; custom-workspaces.el ends here

Latex

Install Packages
  (usr-package-install 'auctex)
  (usr-package-install 'cdlatex)
  (usr-package-install 'latex-preview-pane)
AUCTEX

writing and formatting tex file in Emacs.

  (with-eval-after-load 'latex
    (customize-set-variable 'TeX-auto-save t)
    (customize-set-variable 'TeX-parse-self t)
    (setq-default TeX-master nil)

    ;; compile to pdf
    (tex-pdf-mode)

    ;; correlate the source and the output
    (TeX-source-correlate-mode)

    ;; set a correct indentation in a few additional environments
    (add-to-list 'LaTeX-indent-environment-list '("lstlisting" current-indentation))
    (add-to-list 'LaTeX-indent-environment-list '("tikzcd" LaTeX-indent-tabular))
    (add-to-list 'LaTeX-indent-environment-list '("tikzpicture" current-indentation))

    ;; add a few macros and environment as verbatim
    (add-to-list 'LaTeX-verbatim-environments "lstlisting")
    (add-to-list 'LaTeX-verbatim-environments "Verbatim")
    (add-to-list 'LaTeX-verbatim-macros-with-braces "lstinline")
    (add-to-list 'LaTeX-verbatim-macros-with-delims "lstinline")

    ;; to use pdfview with auctex
    (customize-set-variable 'TeX-view-program-selection '((output-pdf "PDF Tools")))
    (customize-set-variable 'TeX-view-program-list '(("PDF Tools" TeX-pdf-tools-sync-view)))
    (customize-set-variable 'TeX-source-correlate-start-server t)

    ;; electric pairs in auctex
    (customize-set-variable 'TeX-electric-sub-and-superscript t)
    (customize-set-variable 'LaTeX-electric-left-right-brace t)
    (customize-set-variable 'TeX-electric-math (cons "$" "$"))

    ;; open all buffers with the math mode and auto-fill mode
    (add-hook 'LaTeX-mode-hook #'auto-fill-mode)
    (add-hook 'LaTeX-mode-hook #'LaTeX-math-mode)

    ;; add support for references
    (add-hook 'LaTeX-mode-hook 'turn-on-reftex)
    (customize-set-variable 'reftex-plug-into-AUCTeX t)

    ;; to have the buffer refresh after compilation
    (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))
Cdlatex

speed-up insertion of environments and math templates.

  (add-hook 'org-mode-hook #'org-cdlatex-mode)
  (add-hook 'LaTeX-mode-hook #'cdlatex-mode)
  (setq cdlatex-use-dollar-to-ensure-math nil)
Preview pane
  (require 'latex-preview-pane)
  ;;(use-package latex-preview-pane)
Provide Modules
  (provide 'custom-latex)
  ;;; custom-latex.el ends here

Extra

Install Packages
  (usr-package-install 'helpful)
  (usr-package-install 'pdf-tools)
  (usr-package-install 'pdf-view-restore)
  (usr-package-install 'nov)
Helpful
  (customize-set-variable 'counsel-describe-function-function #'helpful-callable)
  (customize-set-variable 'counsel-describe-variable-function #'helpful-variable)
  (require 'helpful)
  ;;:commands (helpful-callable helpful-variable helpful-command helpful-key)
  (global-set-key [remap describe-function] #'describe-function)
  (global-set-key [remap describe-command] #'helpful-command)
  (global-set-key [remap describe-variable] #'describe-variable)
  (global-set-key [remap describe-key] #'helpful-key)
PDF Tool

enhanced PDF viewer on emacs

  (require 'pdf-tools)
  (pdf-tools-install)
  (setq-default pdf-view-display-size 'fit-width)
PDF view restore
  (add-hook 'pdf-view-mode-hook #'pdf-view-restore-mode)
  (setq pdf-view-restore-filename (expand-file-name ".tmp/pdf-view-restore"
                                                    user-emacs-directory))
Nov
  (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
Provide Modules
  (provide 'custom-extra)
  ;;; custom-extra.el ends here