/emacs.d_configuration

emacs configuration

Primary LanguageEmacs LispGNU General Public License v2.0GPL-2.0

Table of Contents

Intro

This configuration file contains setup my config of emacs

Package Manager

ELPA Setup

(require 'package)
(if (boundp 'package-archives-spec)
    (setq package-archives package-archives-spec)
  (setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
                           ("melpa" . "https://melpa.org/packages/")
                           ("gnu-devel" . "https://elpa.gnu.org/devel/")
                           ;;  ("org" . "https://orgmode.org/elpa/")
                           ;;  ("melpa-stable" . "https://stable.melpa.org/packages/")
                           ))
  )
(unless (bound-and-true-p package--initialized)
  (package-initialize))

(unless package-archive-contents
  (package-refresh-contents))

Use-Package Setup

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(setq use-package-always-ensure t)
  • vc-use-package

    (unless (package-installed-p 'vc-use-package)
      (package-vc-install "https://github.com/slotThe/vc-use-package"))
    (require 'vc-use-package)
    

Custom Need Constant

Font Constant

(defconst ctm-font-name-en "DejaVu Sans Mono")
(defconst ctm-font-name-zh "Microsoft YaHei")
(defconst ctm-font-size "22")

Org Agenda Constant

(defconst ctm-org-agenda-dir (expand-file-name "~/Desktop/gtd/"))
(defconst ctm-org-agenda-filename-input "inbox.org")
(defconst ctm-org-agenda-filename-task "task.org")

Org Roam Constant

(defconst ctm-org-roam-directory (file-truename "~/Desktop/note/"))
(defconst ctm-org-roam-dailies-directory "daily")

Lsp Constant

  • Groovy Constant

    (defconst ctm-lsp-groovy-server-file (expand-file-name "lsp-server/groovy-language-server/groovy-language-server-all.jar" user-emacs-directory))
    (defconst ctm-lsp-groovy-classpath "/opt/homebrew/Cellar/groovy/4.0.15/libexec/lib/")
    
  • Java Constant

    (defconst ctm-java-home-path (getenv "JAVA_HOME"))
    (defconst ctm-lsp-java-server-install-dir (expand-file-name "lsp-server/jdtls/" user-emacs-directory))
    (defconst ctm-dap-java-test-runner (expand-file-name "eclipse.jdt.ls/test-runner/junit-platform-console-standalone.jar" ctm-lsp-java-server-install-dir))
    (defconst ctm-lombok-jar-path (expand-file-name "~/.m2/repository/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar"))
    (defconst ctm-lsp-java-configuration-maven-user-settings (expand-file-name "~/.m2/settings.xml"))
    (defconst ctm-lsp-java-import-gradle-user-home "~/.m2/repository/")
    

General Settings Setup

GC settings

Look at early-init.el

Show Startup Message

(setq inhibit-startup-message t)

Character Settings

(set-language-environment "UTF-8")
;; (setq locale-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)

(set-buffer-file-coding-system 'utf-8)
(set-default buffer-file-coding-system 'utf8)
(set-default-coding-systems 'utf-8)

(set-clipboard-coding-system 'utf-8)

(set-terminal-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
(modify-coding-system-alist 'process "*" 'utf-8)

(setq-default pathname-coding-system 'utf-8)
(set-file-name-coding-system 'utf-8)

BackUp Settings

donot backup file

(setq auto-save-default nil)
;;(setq make-backup-files nil)
(setq backup-directory-alist (quote (("." . "~/.emacs.d/.backups"))))
;;(setq backup-directory-alist (expand-file-name ".backups" user-emacs-directory))

Env Settings

(use-package exec-path-from-shell 
  :ensure t
  ;;  :config (setq exec-path (append exec-path '("/usr/local/bin")))
  )
(dolist (var '("JAVA_HOME" "GRADLE_USER_HOME"))
  (add-to-list 'exec-path-from-shell-variables var))
(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))
(setq exec-path-from-shell-check-startup-files nil)

Custom File Settings

Look at early-init.el

Yes/No Shorthand Settings

(fset 'yes-or-no-p 'y-or-n-p)

Tabs Indentation Settings

(setq tab-width 4)
(setq-default tab-width 4)
(setq-default indent-line-function 4)
;;(setq-default lisp-indent-offset 4)
;;(setq-default sgml-basic-offset 2)
(setq c-basic-offset 4)
;; (setq tab-always-indent)
(setq-default indent-tabs-mode nil)

(setq-default electric-indent-inhibit t)

;; nxml-mode
(setq nxml-child-indent 4
      nxml-attribute-indent 4
      nxml-slash-auto-complete-flag t)

;; js ts indent-tab 2 spaces
(setq js-indent-level 2)

Undo Settings

(use-package undo-tree
  :init
  (global-undo-tree-mode)
  :ensure t
  :init (setq undo-tree-auto-save-history nil)
  )

Recentf Settings

(setq recentf-max-menu-items 50)
(setq-default
 recentf-max-saved-items 1000
 recentf-exclude `("/tmp/" "/ssh:" ,(concat package-user-dir "/.*-autoloads\\.el\\'")))
(recentf-mode t)

Window Settings

  • Window Maximized

    (add-to-list 'default-frame-alist '(fullscreen . maximized))
    
  • Zoom

    window auto Zoom,current window Larger display

    (use-package zoom
      :ensure t
      :init
      (setq zoom-size '(0.718 . 0.718))
      :bind ("C-c z" . zoom)
      )
    

UI Setup

Menu-bar Hide

Look at early-init.el

Tool-bar Hide

Look at early-init.el

Scroll-bar Hide

Look at early-init-el

Theme

(use-package dracula-theme
  :ensure t
  )
(load-theme 'dracula t)

Cursor

(setq-default cursor-type 'bar)
(set-cursor-color "green")
(show-paren-mode t)
(setq show-paren-style 'expression)
(set-face-background 'show-paren-match (face-background 'default))
(set-face-attribute 'show-paren-match nil :weight 'extra-bold)
(add-hook 'minibuffer-setup-hook 'subword-mode)

FillColumn

(setq-default fill-column 150)

HighLight Line

(global-hl-line-mode t)

Font

;;  (set-face-attribute 'default nil :font "Microsoft Yahei-22")  
;;  (set-face-attribute 'default nil :font "PingFang SC-22")
;; english font use Dejavu sans mono; chinese font use microsoft yahei
(progn
  (set-face-attribute 'default nil :font (concat ctm-font-name-en "-" ctm-font-size))
  (setq face-font-rescale-alist `((,ctm-font-name-zh . 0.9)))
  (dolist (charset '(kana han symbol cjk-misc bopomofo))
    (set-fontset-font (frame-parameter nil 'font)
                      charset
                      (font-spec :family ctm-font-name-zh)
                      )))
(global-font-lock-mode t)
(setq font-lock-maximum-size 5000000)

Mode Line

(use-package nyan-mode
  :ensure t
  :init
  (setq nyan-animate-nyancat t)
  (setq nyan-wavy-trail t)
  (setq nyan-minimum-window-width 80)
  (setq nyan-bar-length 20)
  (nyan-mode))

(use-package doom-modeline
  :vc (:fetcher github :repo seagle0128/doom-modeline)
  :init
  (doom-modeline-mode t)
  :config
  (setq doom-modeline-height 5)
  (custom-set-faces
   `(mode-line ((t (:family ,ctm-font-name-en :height:50))))
   `(mode-line-inactive ((t (:family ,ctm-font-name-en :height:50))))
   )
  (doom-modeline-def-modeline 'ownml
    '(bar matches buffer-info remote-host buffer-position misc-info major-mode)
    '(buffer-encoding process vcs check))
  ;; Add to `doom-modeline-mode-hook` or other hooks
  (defun setup-custom-doom-modeline ()
    (doom-modeline-set-modeline 'ownml 'default))
  (add-hook 'doom-modeline-mode-hook 'setup-custom-doom-modeline)
  )

Icons

(use-package all-the-icons)
(use-package all-the-icons-dired
  :hook (dired-mode . all-the-icons-dired-mode)
  )

DashBoard Setup

(use-package dashboard
  :config
  (dashboard-setup-startup-hook)
  (dashboard-modify-heading-icons '((recents . "file-text")
                                    (boomarks . "book")
                                    ))
  (setq dashboard-banner-logo-title "Life is happy")
  (setq dashboard-startup-banner (expand-file-name "banner.png" user-emacs-directory))
  (setq dashboard-image-banner-max-height 100)
  (setq dashboard-center-content t)
  (setq dashboard-set-heading-icons t)
  (setq dashboard-set-file-icons t)
  (setq dashboard-set-navigator t)
  (setq dashboard-items '((recents  . 5)
                          (bookmarks . 5)
                          (projects . 5)
                          (agenda . 5)
                          ))
  (setq dashboard-projects-switch-function 'projectile-switch-project-by-name)
  (setq dashboard-page-separator "\n\f\n")
  )

(use-package page-break-lines)

Tabs Setup

  • Centaur-Tabs

    (use-package centaur-tabs
      :demand
      :hook
      ;;  (dired-mode . centaur-tabs-local-mode)
      (dashboard-mode . centaur-tabs-local-mode)
      (term-mode . centaur-tabs-local-mode)
      (calendar-mode . centaur-tabs-local-mode)
      (org-agenda-mode . centaur-tabs-local-mode)
      (helpful-mode . centaur-tabs-local-mode)
      :config
      (setq
       centaur-tabs-style "bar"
       centaur-tabs-height 32
       centaur-tabs-set-icons t
       centaur-tabs-set-bar 'under
       x-underline-at-descent-line t
       centaur-tabs-show-count t
       centaur-tabs-set-close-button nil
       centaur-tabs-set-modified-marker t
       centaur-tabs-show-navigation-buttons t)
      (centaur-tabs-headline-match)
      (centaur-tabs-group-by-projectile-project)
      (centaur-tabs-mode t)
    
      :bind(
            ("s-1" . centaur-tabs-select-visible-tab)
            ("s-2" . centaur-tabs-select-visible-tab)
            ("s-3" . centaur-tabs-select-visible-tab)
            ("s-4" . centaur-tabs-select-visible-tab)
            ("s-5" . centaur-tabs-select-visible-tab)
            ("s-6" . centaur-tabs-select-visible-tab)
            ("s-7" . centaur-tabs-select-visible-tab)
            ("s-8" . centaur-tabs-select-visible-tab)
            ("s-9" . centaur-tabs-select-visible-tab)
            ("s-0" . centaur-tabs-select-visible-tab)
            ("C-c t s" . centaur-tabs-counsel-switch-group)
            ("C-c t p" . centaur-tabs-group-by-projectile-project)
            ("C-c t g" . centaur-tabs-group-buffer-groups)
            )
      )
    

Delimiters Highlights Setup

replaced by treesit

(use-package rainbow-delimiters
  :hook
  (prog-mode . rainbow-delimiters-mode)
  )

Org Setup

OrgFile AutoFormat

;; let source code block can be `indent-region` format
(setq org-src-tab-acts-natively t)
(setq org-src-fontify-natively t)
(setq org-src-preserve-indentation t)
(setq org-src--preserve-indentation t)
(setq org-edit-src-content-indentation 0)
(setq org-src--content-indentation 0)
;; org file before save invoke indent-region
(add-hook 'org-mode-hook
          (lambda()
            (add-hook 'before-save-hook 'org-format-buffer nil t)))

(defun org-format-buffer()
  (interactive)
  (save-excursion
    (indent-region (point-min) (point-max) nil)))

Org Table Tidy Settings

;;org-table align  todo hook in package
(use-package valign
  :init
  (add-hook 'org-mode-hook #'valign-mode)
  )  

org-superstar

(use-package org-superstar
  :ensure t
  :after org
  :hook ((org-mode . org-superstar-mode)
         (org-mode . org-indent-mode))
  :config
  (setq org-superstar-special-todo-items t))

(set-face-attribute 'org-block nil :background
                    (color-darken-name
                     (face-attribute 'default :background) 3))

org ref

(use-package org-ref)

Org-babel support language

(require 'ob-js)
;; (org-babel-do-load-languages 'org-babel-load-languages
;;     '((js . t)
;;          (restclient . t))
;;     )
(add-to-list 'org-babel-tangle-lang-exts '("js" . "js"))
(defun ob-js-insert-session-header-arg (session)
  "Insert ob-js `SESSION' header argument.
 - `js-comint'
 - `skewer-mode'
 - `Indium'
 "
  (interactive (list (completing-read "ob-js session: "
                                      '("js-comint" "skewer-mode" "indium"))))
  (org-babel-insert-header-arg
   "session"
   (pcase session
     ("js-comint" "\"*Javascript REPL*\"")
     ("skewer-mode" "\"*skewer-repl*\"")
     ("indium" "\"*JS REPL*\""))))
(define-key org-babel-map (kbd "J") 'ob-js-insert-session-header-arg)

Org Agenda Setup

  • Config

    (global-set-key (kbd "C-c a") 'org-agenda)
    (global-set-key (kbd "C-c c") 'org-capture)
    
    (setq org-default-notes-file (concat ctm-org-agenda-dir ctm-org-agenda-filename-input))
    (setq org-agenda-file-inbox (concat ctm-org-agenda-dir ctm-org-agenda-filename-input))
    (setq org-agenda-file-gtd (concat ctm-org-agenda-dir ctm-org-agenda-filename-task))
    ;;  (setq org-agenda-file-journal (concat org-agenda-dir "journal.org"))
    (setq org-agenda-files (list ctm-org-agenda-dir))
    (setq org-refile-targets '((org-agenda-files :maxlevel . 3)))
    (setq org-agenda-include-diary t)
    (setq org-capture-templates `(
                                  ("i" "input [inbox]" entry (file ,org-agenda-file-inbox) "* %i%?")
                                  ("c" "calendar [task]" entry (file+headline ,org-agenda-file-gtd "Calendar") "* TODO %i%? \nSCHEDULED: %^t")
                                  ("h" "Habit [task]" entry (file+headline ,org-agenda-file-gtd "Habits") "* HABI %i%? \nDEADLINE: %^t")
                                  ("p" "Projects [task]" entry (file+headline ,org-agenda-file-gtd "Projects") "* %i%?")
                                  ("I" "Incubate [task]" entry (file+headline ,org-agenda-file-gtd "Incubate") "* %i%?")
                                  ;;("j" "Journal [journal]" entry (file+datetree ,org-agenda-file-journal) "* %i%? \n%a")
                                  ))
    (setq org-todo-keywords
          '((sequence "TODO(t)" "STED(s)" "|" "DONE(d!/!)")
            (sequence "WAIT(w@/!)" "INCU(i)" "HABI(h)" "|" "CNCL(c@/!)")
            (sequence "BUGT(b!)" "|" "FIXT(f@/!)")))
    (setq org-todo-keyword-faces
          '(("TODO" . org-warning) ("STED" . "yellow")
            ("WAIT" . "white") ("INCU" . "blue") ("HABI" . "green") ("CNCL" . (:foreground "blue" :weight bold))
            ("BUGT" . "red") ("FIXT" . "orange")
            ))
    (setq org-enforce-todo-dependencies t)
    (setq org-modules
          '(ol-bbdb ol-bibtex ol-docview ol-doi ol-eww ol-gnus org-habit ol-info ol-irc ol-mhe ol-rmail ol-w3m))
    
    (setq org-highest-priority 1) 
    (setq org-default-priority 5)
    (setq org-lowest-priority 9)
    
    (use-package org-super-agenda
      :ensure t
      :after org
      )
    ;;  (org-super-agenda-mode t)
    
    (defun add-property-with-date-captured ()
      "Add DATE_CAPTURED property to the current item."
      (interactive)
      (org-set-property "CREATE_DATE" (format-time-string "[%F %a %R]"))
      )
    (add-hook 'org-capture-before-finalize-hook 'add-property-with-date-captured)
    
    (defun process-gtd-action()
      (interactive)
      (find-file org-agenda-file-gtd)
      )
    (defun process-gtd-inbox()
      (interactive)
      (find-file org-agenda-file-inbox)
      )
    
    (defun process-gtd-journal()
      (interactive)
      (find-file org-agenda-file-journal)
      )
    
    (global-set-key (kbd "C-c d p") 'process-gtd-inbox)
    (global-set-key (kbd "C-c d a") 'process-gtd-action)
    (global-set-key (kbd "C-c d j") 'process-gtd-journal)
    
    ;; Change task state to STARTED when clocking in
    (setq org-clock-in-switch-to-state "STED")
    ;; Save clock data and notes in the LOGBOOK drawer
    (setq org-clock-into-drawer t)
    (setq org-clock-out-remove-zero-time-clocks t)
    (use-package org-pomodoro)
    (setq org-log-done 'time)
    (setq org-log-into-drawer t)
    (setq org-clock-persist 'history)
    (org-clock-persistence-insinuate)
    
  • Tag

    (setq org-tag-alist '(("@work" . ?w) ("@home" . ?h)
                          ("@study" . ?s) ("@habit" . ?b)))
    
    ;; automatically DONE when all children are DONE
    (defun org-summary-todo (n-done n-not-done)
      "Switch entry to DONE when all subentries are done, to TODO otherwise."
      (let (org-log-done org-log-states)   ; turn off logging
        (org-todo (if (= n-not-done 0) "DONE" "TODO"))))
    (add-hook 'org-after-todo-statistics-hook #'org-summary-todo)
    

Org Roam Setup

(use-package org-roam
  :custom
  (org-roam-directory ctm-org-roam-directory)
  (org-roam-dailies-directory ctm-org-roam-dailies-directory)
  :bind (("C-c n l" . org-roam-buffer-toggle)
         ("C-c n f" . org-roam-node-find)
         ("C-c n g" . org-roam-graph)
         ("C-c n i" . org-roam-node-insert)
         ("C-c n c" . org-roam-capture)
         ("C-c n t" . org-roam-tag-add)
         ("C-c M-s" . org-store-link)
         ;; Dailies
         ("C-c n j" . org-roam-dailies-capture-today)
         )
  :bind-keymap
  ("C-c n d" . org-roam-dailies-map)
  :config
  ;; If you're using a vertical completion framework, you might want a more informative completion interface
  (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:20}" 'face 'org-tag)))
  (setq org-roam-completion-everywhere t)
  (org-roam-db-autosync-mode)
  (require 'org-roam-dailies)
  ;; If using org-roam-protocol
  (require 'org-roam-protocol)
  )
  • Org Roam UI SetUp

    (use-package org-roam-ui
      :vc (:fetcher "github" :repo "org-roam/org-roam-ui")
      :after org-roam
      :custom
      (org-roam-ui-sync-theme nil)
      (org-roam-ui-follow t)
      (org-roam-ui-update-on-save t)
      (org-roam-ui-open-on-start t)
      )
    

Org Common Setup

(setq org-startup-folded 'show2levels)

Which-Key Setup

(use-package which-key
  :ensure t
  :init (which-key-mode)
  :bind ("M-m" . which-key-show-top-level)
  )

Delete Setup

Hungry-delete

delete all whitespace until have character

(use-package hungry-delete
  :ensure t
  :bind (("C-c DEL" . hungry-delete-backward)
         ("C-c d d" . hungry-delete-forward))
  )

Delete Slection

(delete-selection-mode t)

SmartParens

auto Symbol of completion

(use-package smartparens
  :init
  (smartparens-global-mode)
  :config
  (require 'smartparens-config)
  (sp-local-pair 'elisp-mode "'" nil :actions nil)
  (sp-local-pair 'elisp-mode "`" nil :actions nil)
  :bind(("C-c 9" . sp-beginning-of-sexp)
        ("C-c 0" . sp-end-of-sexp))
  )

Undo-Tree Setup

(use-package undo-tree
  :init (global-undo-tree-mode t)
  )

Switch-Window

easy to jump windows

(use-package switch-window
  :ensure t
  :bind ("C-x o" . switch-window)
  :config
  (setq switch-window-shortcut-style 'qwerty)
  )

Selected Setup

(use-package expand-region
  :bind (("C-=" . er/expand-region)
         ("C--" . er/contract-region))
  :config
  (defun er/add-html-mode-expansions ()
    (make-variable-buffer-local 'er/try-expand-list)
    "Adds HTML-specific expansions for buffers in html-mode"
    (setq er/try-expand-list (append
                              er/try-expand-list
                              '(er/mark-html-attribute
                                er/mark-inner-tag
                                er/mark-outer-tag))))
  ;;  (add-hook 'web-mode-hook 'er/add-html-mode-expansions)
  (er/enable-mode-expansions 'web-mode 'er/add-html-mode-expansions)
  (er/enable-mode-expansions 'rjsx-mode 'er/add-html-mode-expansions)
  :commands (er/expand-region er/enable-mode-expansions)
  )

Undo Tree Setup

(use-package undo-tree)
(global-undo-tree-mode t)

Command Completion

Command Interactive Completion For Minibuffer,eg : M-x

Ivy/Counsel/Swiper Setup

  • Ivy Setup

    generic completion mechanism

    • Ivy

      (use-package ivy
        :ensure t
        :config
        (setq ivy-use-virtual-buffers t
              enable-recursive-minibuffers t)
        :bind(("C-c C-r" . ivy-resume))
        )
      
  • Counsel Setup

    command completion use ivy

    (use-package counsel
      :bind(
            ("M-x" . counsel-M-x)
            ("C-."   . 'counsel-imenu)
            ("C-c o"   . 'counsel-outline)
            ("C-x C-f" . counsel-find-file)
            ("C-c g" . counsel-rg)
            ("C-h f" . 'counsel-describe-function)
            ("C-h v" . 'counsel-describe-variable)
            ("C-x b" . 'counsel-switch-buffer)
            ("C-c h" . 'counsel-recentf)
            )
      :hook (after-init . ivy-mode)
      )
    (define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
    
    (use-package counsel-projectile
      :bind
      ("C-c p f" . 'counsel-projectile-find-file)
      ("C-c p g" . 'counsel-projectile-rg)
      ("C-c p p" . 'counsel-projectile-switch-project)
      ("C-c p b" . 'counsel-projectile-switch-to-buffer)
      )
    ;; counsel-locate find system file quicky
    
    • Show History Command in Counsel-M-x Minibuffer

      show history command need amx package

      (use-package amx)
      
  • Swiper Setup

    text search use ivy

    ;; bind-key conflict, unbind
    (define-key org-mode-map (kbd "C-'") nil)
    (use-package swiper
      :bind(("C-s" . swiper)
            ("C-'" . swiper-isearch-thing-at-point)
            )
      )
    

orderless

Unordered search in ivy search

;; add disorder search
(use-package orderless
  :ensure t
  :config
  (setq ivy-re-builders-alist '((t . orderless-ivy-re-builder)))
  :ensure t
  :custom
  (completion-styles '(orderless basic))
  (completion-category-overrides '((file (styles basic partial-completion)))))
(add-to-list 'ivy-highlight-functions-alist '(orderless-ivy-re-builder . orderless-ivy-highlight))

Helm Setup

(use-package helm
  ;;  :config (helm-mode t)
  ;;  :bind("M-x" . helm-M-x)
  )

Format Setup

(setq +format-with-lsp nil)
(use-package format-all
  :ensure t
  :hook
  (prog-mode . (lambda() (unless (derived-mode-p 'emacs-lisp-mode) (format-all-mode))))
  :config
  (add-hook 'format-all-mode-hook 'format-all-ensure-formatter)
  ;;        (add-hook 'before-save-hook 'format-all-buffer)
  )

(add-hook 'prog-mode-hook
          (lambda ()
            (unless (derived-mode-p 'lsp-mode)
              (add-hook 'before-save-hook 'format-all-buffer t t)
              )
            ))

Iedit Setup

(use-package iedit
  :bind("C-c e" . iedit-mode)
  )

Avy SetUp

jumping to visible text using a char-based decision tree

(use-package avy
  :bind("C-;" . avy-goto-char)
  )

Projectile Setup

(use-package projectile
  :init
  (projectile-global-mode)
  ;; :bind(
  ;;        ("C-x p f" . projectile-find-file)
  ;;        ("C-x p p" . projectile-switch-project)
  ;;        )
  :config
  (setq projectile-indexing-method 'hybrid
        ;;hybird, load .projectile and .gitignore ignorefile,Priority load .projectile
        ;;indexing default 'alien ,only load .gitignore
        ;;indexing 'native only load .projectile
        ;;.projectile rule: ignore: -/xxx ; exclude ignore: !/xxx ;

        ;;   projectile-sort-order 'recentf-active
        projectile-enable-caching t)
  (setq projectile-globally-ignored-directories
        (append (list
                 ".pytest_cache"
                 "__pycache__"
                 "build"
                 "elpa"
                 "node_modules"
                 "output"
                 "reveal.js"
                 "semanticdb"
                 "target"
                 "venv"
                 )
                projectile-globally-ignored-directories))
  )

(use-package treemacs-projectile
  :after (treemacs projectile)
  )

(use-package treemacs
  :config
  (setq treemacs-deferred-git-apply-delay 0.5
        treemacs-file-follow-delay 0.2
        treemacs-indentation 2
        treemacs-indentation-string " "
        treemacs-show-hidden-files  nil
        treemacs-hide-gitignored-files-mode t
        treemacs-hide-dot-git-directory t
        treemacs-follow-mode t
        treemacs-filewatch-mode t
        treemacs-fringe-indicator-mode 'always)
  )

(use-package treemacs-icons-dired
  :hook (dired-mode . treemacs-icons-dired-enable-once)
  :ensure t)

(use-package treemacs-magit
  :after (treemacs magit)
  :ensure t)

(use-package treemacs-persp ;;treemacs-perspective if you use perspective.el vs. persp-mode
  :after (treemacs persp-mode) ;;or perspective vs. persp-mode
  :ensure t
  :config (treemacs-set-scope-type 'Perspectives))

(use-package treemacs-tab-bar ;;treemacs-tab-bar if you use tab-bar-mode
  :after (treemacs)
  :ensure t
  :config (treemacs-set-scope-type 'Tabs))

Code Completion Setup

Corfu

;; Auto completion example
(use-package corfu
  :custom
  (corfu-auto t)          ;; Enable auto completion
  ;; (corfu-separator ?_) ;; Set to orderless separator, if not using space
  :bind
  ;; Another key binding can be used, such as S-SPC.
  ;; (:map corfu-map ("M-SPC" . corfu-insert-separator))
  :init
  (global-corfu-mode))

Cape

(use-package cape
  :init
  ;; Add to the global default value of `completion-at-point-functions' which is
  ;; used by `completion-at-point'.  The order of the functions matters, the
  ;; first function returning a result wins.  Note that the list of buffer-local
  ;; completion functions takes precedence over the global list.
  (add-to-list 'completion-at-point-functions #'cape-dabbrev)
  (add-to-list 'completion-at-point-functions #'cape-file)
  (add-to-list 'completion-at-point-functions #'cape-elisp-block)
  ;;(add-to-list 'completion-at-point-functions #'cape-history)
  ;;(add-to-list 'completion-at-point-functions #'cape-keyword)
  ;;(add-to-list 'completion-at-point-functions #'cape-tex)
  ;;(add-to-list 'completion-at-point-functions #'cape-sgml)
  ;;(add-to-list 'completion-at-point-functions #'cape-rfc1345)
  ;;(add-to-list 'completion-at-point-functions #'cape-abbrev)
  ;;(add-to-list 'completion-at-point-functions #'cape-dict)
  ;;(add-to-list 'completion-at-point-functions #'cape-elisp-symbol)
  ;;(add-to-list 'completion-at-point-functions #'cape-line)
  :config
  (setq dabbrev-check-other-buffers nil
        dabbrev-check-all-buffers nil
        cape-dabbrev-min-length 3)
  (cape-wrap-prefix-length #'cape-dabbrev 3)
  )

Corfu English Helper

(use-package corfu-english-helper
  :vc (:fetcher github :repo manateelazycat/corfu-english-helper)
  )

Treesit

(use-package treesit-auto
  :init
  (setq tressit-font-lock-level 4)
  :config
  (global-treesit-auto-mode)
  )

Eldoc Setup

(use-package eldoc
  :config
  (setq eldoc-idle-delay 0.1)
  (setq eldoc-echo-area-prefer-doc-buffer t)
  (setq max-mini-window-height 1) 
  (setq eldoc-echo-area-use-multiline-p nil)
  (global-set-key (kbd "M-`")
                  (
                   lambda()
                   (interactive)
                   (if (get-buffer-window "*eldoc*")
                       (delete-window (get-buffer-window "*eldoc*"))
                     (display-buffer "*eldoc*")))))

(use-package eldoc-box
  :after
  (eglot eldoc)
  :bind (:map eglot-mode-map
              ("C-M-k" . my/eldoc-box-scroll-up)
              ("C-M-j" . my/eldoc-box-scroll-down)
              ("M-h" . eldoc-box-eglot-help-at-point))
  :config
  (setq eldoc-box-max-pixel-height 600)
  (defun my/eldoc-box-scroll-up ()
    "Scroll up in `eldoc-box--frame'"
    (interactive)
    (with-current-buffer eldoc-box--buffer
      (with-selected-frame eldoc-box--frame
        (scroll-down 3))))
  (defun my/eldoc-box-scroll-down ()
    "Scroll down in `eldoc-box--frame'"
    (interactive)
    (with-current-buffer eldoc-box--buffer
      (with-selected-frame eldoc-box--frame
        (scroll-up 3))))
  (add-hook 'eglot-managed-mode-hook #'eldoc-box-hover-mode t)
  )

Language Setup

Eglot Setup

(use-package eglot
  :ensure nil
  :hook
  (prog-mode . (lambda() (unless (derived-mode-p '(emacs-lisp-mode web-mode)) (eglot-ensure))))
  (eglot-managed-mode . my/eglot-eldoc)
  :preface
  (defun my/eglot-eldoc ()
    (setq completion-category-defaults nil)
    (setq eldoc-documentation-functions
          (cons #'flymake-eldoc-function
                (remove #'flymake-eldoc-function eldoc-documentation-functions)))
    )
  :bind
  (:map eglot-mode-map
        ("M-RET" . eglot-code-actions)
        ("C-c C-d" . eldoc)
        ("C-c C-p" . eldoc-box-help-at-point)
        ("C-c C-f" . eglot-format-buffer)
        ("C-c C-r" . eglot-rename))
  :custom
  (eglot-autoshutdown t)
  (eglot-events-buffer-size 0)
  (eglot-extend-to-xref nil)
  (eglot -ignored-server-capabilities
         '(:hoverProvider
           :documentHighlightProvider
           :documentFormattingProvider
           :documentRangeFormattingProvider
           :documentOnTypeFormattingProvider
           :colorProvider
           :foldingRangeProvider))
  )

JAVA Setup

  • Eglot-java

    (with-eval-after-load 'eglot
      (add-to-list 'eglot-server-programs
                   `((java-mode java-ts-mode) ,(concat ctm-lsp-java-server-install-dir "bin/jdtls")
                     "-configuration" ,(concat ctm-lsp-java-server-install-dir "config_mac")
                     "-data" ,(expand-file-name ".cache/workspace" user-emacs-directory)
                     ,(concat "--jvm-arg=-javaagent:" ctm-lombok-jar-path)))
      )
    
    (use-package jarchive
      :ensure t
      :after eglot
      :config
      (jarchive-setup))
    
  • Hot Deployment

    use spring-devtools , gradle no autocompile classes, so command: `gradle bootJar -t` or `gradle -t classes processResources` when `gradle bootRun`;

Groovy Setup

(use-package groovy-mode
  )

Maven Setup

(use-package mvn
  :ensure t
  )

(defun mvn-install ()
  (interactive)
  (mvn "install"))

Web-Mode Setup

(use-package web-mode
  :config
  (setq web-mode-markup-indent-offset 2
        web-mode-css-indent-offset 2
        web-mode-code-indent-offset 2
        web-mode-comment-style 2
        web-mode-enable-auto-pairing t
        web-mode-enable-css-colorization t
        web-mode-enable-current-element-highlight t
        web-mode-enable-current-column-highlight t
        )
  )

(defadvice web-mode-highlight-part (around tweak-jsx activate)
  (if (equal web-mode-content-type "jsx")
      (let ((web-mode-enable-part-face nil)) ad-do-it)
    ad-do-it))

(add-to-list 'auto-mode-alist '("\\.phtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.tpl\\.php\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.[agj]sp\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.as[cp]x\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.erb\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.mustache\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.djhtml\\'" . web-mode))
(add-to-list 'auto-mode-alist '("\\.html?\\'" . web-mode))
;;(add-to-list 'auto-mode-alist '("\\.js[x]\\'" . web-mode))
;;(add-to-list 'auto-mode-alist '("\\.ts[x]\\'" . web-mode))

(use-package json-mode)
(use-package prettier-js
  ;; :config
  ;; (setq prettier-js-args '(
  ;;                          "--print-width" "200"  
  ;;                          "--trailing-comma" "all" 
  ;;                          "--bracket-spacing" "false"
  ;;                          ))
  )
(add-hook 'js2-mode-hook 'prettier-js-mode)
(add-hook 'web-mode-hook 'prettier-js-mode)

react configuration reference: configurationreactjsx

Css Setup

(use-package css-mode
  :ensure nil
  :mode (("\\.css\\'" . css-mode))
  :init
  (setq css-indent-offset 2)
  )

React JSX

  • jtsx

    (use-package jtsx
      :ensure t
      :mode (("\\.jsx?\\'" . jtsx-jsx-mode)
             ("\\.tsx\\'" . jtsx-tsx-mode)
             ("\\.ts\\'" . jtsx-typescript-mode))
      :commands jtsx-install-treesit-language
      :hook ((jtsx-jsx-mode . hs-minor-mode)
             (jtsx-tsx-mode . hs-minor-mode)
             (jtsx-typescript-mode . hs-minor-mode))
      ;; :custom
      ;; Optional customizations
      ;; (js-indent-level 2)
      ;; (typescript-ts-mode-indent-offset 2)
      ;; (jtsx-switch-indent-offset 0)
      ;; (jtsx-indent-statement-block-regarding-standalone-parent nil)
      ;; (jtsx-jsx-element-move-allow-step-out t)
      ;; (jtsx-enable-jsx-electric-closing-element t)
      ;; (jtsx-enable-electric-open-newline-between-jsx-element-tags t)
      ;; (jtsx-enable-jsx-element-tags-auto-sync nil)
      ;; (jtsx-enable-all-syntax-highlighting-features t)
      :config
      (defun jtsx-bind-keys-to-mode-map (mode-map)
        "Bind keys to MODE-MAP."
        (define-key mode-map (kbd "C-c C-j") 'jtsx-jump-jsx-element-tag-dwim)
        (define-key mode-map (kbd "C-c j o") 'jtsx-jump-jsx-opening-tag)
        (define-key mode-map (kbd "C-c j c") 'jtsx-jump-jsx-closing-tag)
        (define-key mode-map (kbd "C-c j r") 'jtsx-rename-jsx-element)
        (define-key mode-map (kbd "C-c <down>") 'jtsx-move-jsx-element-tag-forward)
        (define-key mode-map (kbd "C-c <up>") 'jtsx-move-jsx-element-tag-backward)
        (define-key mode-map (kbd "C-c C-<down>") 'jtsx-move-jsx-element-forward)
        (define-key mode-map (kbd "C-c C-<up>") 'jtsx-move-jsx-element-backward)
        (define-key mode-map (kbd "C-c C-S-<down>") 'jtsx-move-jsx-element-step-in-forward)
        (define-key mode-map (kbd "C-c C-S-<up>") 'jtsx-move-jsx-element-step-in-backward)
        (define-key mode-map (kbd "C-c j w") 'jtsx-wrap-in-jsx-element)
        (define-key mode-map (kbd "C-c j u") 'jtsx-unwrap-jsx)
        (define-key mode-map (kbd "C-c j d") 'jtsx-delete-jsx-node))
      
      (defun jtsx-bind-keys-to-jtsx-jsx-mode-map ()
        (jtsx-bind-keys-to-mode-map jtsx-jsx-mode-map))
    
      (defun jtsx-bind-keys-to-jtsx-tsx-mode-map ()
        (jtsx-bind-keys-to-mode-map jtsx-tsx-mode-map))
    
      (add-hook 'jtsx-jsx-mode-hook 'jtsx-bind-keys-to-jtsx-jsx-mode-map)
      (add-hook 'jtsx-tsx-mode-hook 'jtsx-bind-keys-to-jtsx-tsx-mode-map))
    

Javascript REPL

  • js-comint

    javascript REPL

    (use-package js-comint)
    

Yasnippet Setup

(use-package yasnippet
  :config (yas-global-mode)
  )
(use-package yasnippet-snippets
  :vc (:fetcher github :repo AndreaCrotti/yasnippet-snippets)
  )
;; (use-package yasnippet-snippets :ensure t)

Magit Setup

git tools

(use-package magit)

HideShow Setup

(add-hook 'prog-mode-hook 'hs-minor-mode)

MarkDown Setup

(use-package markdown-mode
  :ensure t
  :mode (("\\.md\\'" . gfm-mode)
         ("README" . gfm-mode)
         )
  :init (setq markdown-command "multimarkdown"))

Nginx Setup

(use-package nginx-mode)
;;  (use-package company-nginx)

HttpClient Setup

(use-package restclient)
(use-package ob-restclient)
;;  (use-package company-restclient
;;      :after(restclient-mode)
;;      )

;;  (add-to-list 'auto-mode-alist '("\\.hpct\\'" . restclient-mode))

Ediff Setup

(use-package ediff
  :config
  (setq ediff-keep-variants nil)
  (setq ediff-split-window-function 'split-window-horizontally)
  (setq ediff-window-setup-function #'ediff-setup-windows-plain))

Installation

git clone <this repo url> ~/.emacs.d

Customize Your Configuration

write your configuration to ~/.emacs.d/configuration\self.org , emacs autoload the file when emacs startup.