Skip to content

higuoxing/.emacs.d

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 

Repository files navigation

@higuoxing’s Emacs configuration

Misc

(setq gc-cons-threshold 10000000)  ;; A large `gc-cons-threshold` may cause freezing and stuttering during long-term interactive use.
(setq inhibit-startup-message t)   ;; Disable the welcome message.
(scroll-bar-mode -1)               ;; Disable visible scrollbar.
(tool-bar-mode -1)                 ;; Disable tooltips.
(set-fringe-mode 0)                ;; Give some breathing room.
(setq visible-bell t)              ;; Set up the visible bell.
(set-face-attribute 'default nil :font "Fira Code" :height 110)

(setq auto-window-vscroll nil)     ;; Disable auto window scroll
;; Delete the selected text first before editing.
(delete-selection-mode 1)
;; Don’t compact font caches during GC.
(setq inhibit-compacting-font-caches t)

;; Smooth Scrolling: https://www.emacswiki.org/emacs/SmoothScrolling
;; https://github.com/MatthewZMD/.emacs.d#smooth-scrolling
(setq scroll-conservatively 10000)
;; Vertical Scroll
(setq scroll-step 1)
(setq scroll-margin 1)
(setq scroll-conservatively 101)
(setq scroll-up-aggressively 0.01)
(setq scroll-down-aggressively 0.01)
(setq auto-window-vscroll nil)
(setq fast-but-imprecise-scrolling nil)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1)))
(setq mouse-wheel-progressive-speed nil)
;; Horizontal Scroll
(setq hscroll-step 1)
(setq hscroll-margin 1)

;; Display the line numbers.
(column-number-mode)
(global-display-line-numbers-mode t)

;; Disable line numbers for some modes.
(dolist (mode '(org-mode-hook
		  term-mode-hook
		  eshell-mode-hook
		  neotree-mode-hook))
  (add-hook mode (lambda () (display-line-numbers-mode 0))))

;; Set native compiling logging level.
(setq warning-minimum-level :error)

Package Manager Configuration

 ;; Initialize package sources
 (require 'package)
 (setq package-archives
	'(;; ("gnu" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
	  ;; ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")
	  ;; ("org" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/org/")))
	  ("gnu" . "https://elpa.gnu.org/packages/")
	  ("melpa" . "https://melpa.org/packages/")
	  ("org" . "http://orgmode.org/elpa/")))

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

 ;; Initialize use-package on non-linux platforms
 (unless (package-installed-p 'use-package)
   (package-install 'use-package))

 (require 'use-package)
 (setq use-package-always-ensure t)
 ;; Keep init.el clean.
 (setq custom-file (concat user-emacs-directory "/custom.el"))

Keep Directory Clean

 ;; NOTE: If you want to move everything out of the ~/.emacs.d folder
 ;; reliably, set `user-emacs-directory` before loading `no-littering`.
 ;; (setq user-emacs-directory "~/.cache/emacs")
 (use-package no-littering)
 ;; Store all backup and autosave files in the tmp dir
 ;; (setq backup-directory-alist
 ;;  `((".*" . ,temporary-file-directory)))
 ;; no-littering doesn't set this by default so we must place
 ;; auto save files in the same path as it uses for sessions.
 (setq auto-save-file-name-transforms
	`((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))

Basic UI Configuration

(use-package all-the-icons
  :if (display-graphic-p)) ;; Required by doom-modeline
(use-package nyan-mode
  :init
  (nyan-mode)
  :config
  (setq nyan-wavy-trail t)
  (nyan-start-animation)
  :hook
  ;; Only enable it in prog mode.
  prog-mode)

(use-package doom-modeline
  :hook
  (after-init . doom-modeline-mode)
  :custom
  ((setq doom-modeline-lsp t)
   ;; Don't compact font caches during GC. Windows Laggy issue.
   (setq inhibit-compacting-font-caches t)
   ;; Whether display icons for buffer states. It respects `doom-modeline-icon'.
   (setq doom-modeline-buffer-state-icon t)
   (setq doom-modeline-persp-name t)
   (setq doom-modeline-display-default-persp-name t)
   (setq doom-modeline-env-version t)
   (setq doom-modeline-bar-width 5)
   (setq doom-modeline-icon t)
   (setq doom-modeline-major-mode-icon t)
   (setq doom-modeline-major-mode-color-icon t)
   (setq doom-modeline-buffer-file-name-style 'truncate-upto-project)
   (setq doom-modeline-buffer-state-icon t)
   (setq doom-modeline-buffer-modification-icon t)
   (setq doom-modeline-minor-modes nil)
   (setq doom-modeline-enable-word-count nil)
   (setq doom-modeline-buffer-encoding t)
   (setq doom-modeline-indent-info t)
   (setq doom-modeline-checker-simple-format t)
   (setq doom-modeline-vcs-max-length 12)
   (setq doom-modeline-env-version t)))

;; If it doesn't work, please evaluate (fira-code-mode-install-fonts)
(use-package fira-code-mode
  :if (display-graphic-p)
  :custom
  (fira-code-mode-disabled-ligatures '("[]" "#{" "#(" "#_" "#_(" "x" ":" "<>"))
  :hook
  prog-mode)

;; (use-package doom-themes
;;   :config
;;   (setq doom-themes-enable-bold t)
;;   (setq doom-themes-enable-italic t)
;;   (load-theme 'doom-dracula t))
(use-package kaolin-themes
  :config
  (load-theme 'kaolin-galaxy t)
  (kaolin-treemacs-theme))

(use-package page-break-lines)
(use-package dashboard
  :config
  (dashboard-setup-startup-hook)
  (setq dashboard-startup-banner 'logo)
  (setq dashboard-set-file-icons t)
  (setq dashboard-center-content t)
  (setq dashboard-set-heading-icons t)
  (setq dashboard-items '((recents  . 5)
			    (projects . 3)
			    (agenda . 4)))
  (setq inhibit-startup-message t))

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

Key Bindings

;; Make ESC quit prompts.
(global-set-key (kbd "<esc>") 'keyboard-escape-quit)
;; Magic key.
(define-prefix-command 'magic-key)
(global-set-key (kbd "M-m") 'magic-key)

;; Disabe and remap some Emacs's default keybinding.
(global-unset-key (kbd "C-v"))  ;; scroll-up-command
(global-unset-key (kbd "M-v"))  ;; scroll-down-command
(global-unset-key (kbd "C-t"))  ;; switch char
(global-unset-key (kbd "C-j"))  ;; (electric-newline-and-maybe-indent)
(global-set-key (kbd "M-n") 'scroll-up)
(global-set-key (kbd "M-p") 'scroll-down)

;; Use general to manage key bindings.
(use-package general
  :config
  (general-create-definer my/leader-key
    :prefix "M-m"))

;; Split window, keep consistent with my tmux configuration.
(my/leader-key
  "|" 'split-window-right
  "-" 'split-window-below)

(my/leader-key
  "t" '(:ignore t :which-key "Text")
  "b" '(:ignore b :which-key "Buffer")
  "p" '(:ignore p :which-key "Project"))

Perfect Emacs

helm, swiper, ivy, which-key, helpful, windmove, neotree

 (use-package all-the-icons-ivy-rich
   :ensure t
   :init (all-the-icons-ivy-rich-mode 1))

 (use-package ivy-rich
   :ensure t
   :init (ivy-rich-mode 1))
 (use-package counsel
   :diminish
   :bind (("M-x" . counsel-M-x)
	   ("C-c f" . counsel-fzf)
	   ("C-x C-f" . counsel-find-file)
	   :map counsel-find-file-map
	   ("C-h" . counsel-up-directory)
	   :map minibuffer-local-map
	   ("C-r" . counsel-minibuffer-history))
   :config
   (setq ivy-initial-inputs-alist nil) ;; Don't start search with '^'
   (my/leader-key
     "bb" '(counsel-switch-buffer :which-key "Switch Buffer")))

 (use-package swiper)
 (use-package ivy
   :after swiper
   :diminish
   :bind (("C-s" . swiper-isearch)
	   ("C-r" . swiper-isearch-backward)
	   :map ivy-minibuffer-map
	   ("TAB" . ivy-alt-done)
	   ("C-l" . ivy-alt-done)
	   ;; I don't need these two lines since I love emacs key-bindings.
	   ;; ("C-j" . ivy-next-line)
	   ;; ("C-k" . ivy-previous-line)
	   :map ivy-switch-buffer-map
	   ("C-k" . ivy-previous-line)
	   ("C-l" . ivy-done)
	   ("C-d" . ivy-switch-buffer-kill)
	   :map ivy-reverse-i-search-map
	   ("C-k" . ivy-previous-line)
	   ("C-d" . ivy-reverse-i-search-kill))
   :config (ivy-mode 1))

 (use-package ivy-xref
   :init
   ;; xref initialization is different in Emacs 27 - there are two different
   ;; variables which can be set rather than just one
   (when (>= emacs-major-version 27)
     (setq xref-show-definitions-function #'ivy-xref-show-defs))
   ;; Necessary in Emacs <27. In Emacs 27 it will affect all xref-based
   ;; commands other than xref-find-definitions (e.g. project-find-regexp)
   ;; as well
   (setq xref-show-xrefs-function #'ivy-xref-show-xrefs))

 (use-package which-key
   :init (which-key-mode)
   :diminish which-key-mode
   :config (setq which-key-idle-delay 0.05))

 (use-package ivy-rich
   :after ivy
   :init (ivy-rich-mode 1))

 (use-package helpful
   :commands (helpful-callable helpful-variable helpful-command helpful-key)
   :custom
   (counsel-describe-function-function #'helpful-callable)
   (counsel-describe-variable-function #'helpful-variable)
   :bind
   ([remap describe-function] . counsel-describe-function)
   ([remap describe-command] . helpful-command)
   ([remap describe-variable] . counsel-describe-variable)
   ([remap describe-key] . helpful-key))

 ;; I don't need to load hydra ASAP.
 (use-package hydra
   :config
   (defhydra hydra-text-scale (:timeout 3) "Scale text"
     ("k" text-scale-increase "in")
     ("j" text-scale-decrease "out")
     ("f" nil "finish" :exit t))
   (my/leader-key
     "ts" '(hydra-text-scale/body :which-key "Scale text")))

 ;; Navigate between window.
 (use-package windmove
   :config
   (my/leader-key
     "h" '(windmove-left  :which-key "Window move left")
     "j" '(windmove-down  :which-key "Window move down")
     "k" '(windmove-up    :which-key "Window move up")
     "l" '(windmove-right :which-key "Window move right")))


 (defun my/neotree-project-dir ()
   "Open NeoTree using the git root."
   (interactive)
   (let ((project-dir (projectile-project-root))
	  (file-name (buffer-file-name)))
     (neotree-toggle)
     (if project-dir
	  (if (neo-global--window-exists-p)
	      (progn
		(neotree-dir project-dir)
		(neotree-find file-name)))
	(message "Could not find git project root."))))
 (use-package neotree
   :config
   (setq neo-theme (if (display-graphic-p) 'icons 'arrow))
   (my/leader-key
     "n" '(my/neotree-project-dir :which-key "Neotree toggle")))

sudo-edit

(use-package sudo-edit
  :commands
  (sudo-edit))

Development

projectile, fzf, ag, magit

(use-package magit
  :commands
  magit-status)
(use-package fzf)
(use-package rg)
(use-package projectile)

(use-package counsel-projectile
  :after (rg)
  :init (counsel-projectile-mode)
  :config
  (my/leader-key
    "pd" '(counsel-projectile-find-dir :which-key "Find dir")
    "pf" '(projectile-find-file :which-key "Find file")
    "pg" '(magit :which-key "Git")
    "ps" '(counsel-projectile-rg :which-key "Ripgrep")
    "pp" '(counsel-projectile-switch-project :which-key "Switch project")
    "pe" '(projectile-run-eshell :which-key "Run eshell")
    "pc" '(projectile-compile-project :which-key "Compile project")
    "pt" '(projectile-test-project :which-key "Test project")))

yasnippet

(use-package yasnippet
  :init
  (yas-global-mode 1)
  :config
  (setq yas-snippet-dirs
	  '("~/.emacs.d/snippets/")))

Indention

;; Disable hightlight indent.
;; (use-package highlight-indent-guides
;;   :if (display-graphic-p)
;;   :diminish
;;   ;; Enable manually if needed, it a severe bug which potentially core-dumps Emacs
;;   ;; https://github.com/DarthFennec/highlight-indent-guides/issues/76
;;   :commands (highlight-indent-guides-mode)
;;   :hook
;;   (prog-mode . highlight-indent-guides-mode)
;;   :custom
;;   (highlight-indent-guides-method 'character)
;;   (highlight-indent-guides-responsive 'top)
;;   (highlight-indent-guides-delay 0)
;;   (highlight-indent-guides-auto-character-face-perc 7))

Languages’ Modes

LSP Support

(use-package company)
(use-package lsp-mode
  :init
  ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
  (setq lsp-keymap-prefix "M-m g")
  :hook
  ((python-mode . lsp) ;; pip install python-lsp-server --user
   (c-mode . lsp)
   (c++-mode . lsp)
   (go-mode . lsp)
   (rust-mode . lsp)
   (tuareg-mode . lsp) ;; opam install ocaml-lsp-server
   (lsp-mode . lsp-enable-which-key-integration))
  :commands
  lsp
  :config
  ;; "M-m g g b": Jump back in lsp-mode.
  (define-key lsp-command-map "gb" 'xref-pop-marker-stack))

;; optionally
(use-package lsp-ui
  :commands
  lsp-ui-mode)

(use-package lsp-ivy
  :commands
  lsp-ivy-workspace-symbol)

;; (use-package lsp-treemacs
;;  :commands
;;  lsp-treemacs-errors-list)

;; optionally if you want to use debugger
;; (use-package dap-mode)
;; (use-package dap-LANGUAGE) to load the dap adapter for your language

Rust

(use-package rust-mode
  :config
  (setq rust-format-on-save t)
  (add-hook 'rust-mode-hook
	      (lambda () (prettify-symbols-mode))))

Go

(use-package go-mode)

Yaml

(use-package yaml-mode)

OCaml

(use-package tuareg
  :config
  (setq tuareg-match-patterns-aligned t))
(use-package ocamlformat) ;; opam install ocamlformat
;; Have a nice camel as the mode name
;; (add-hook 'before-save-hook 'ocamlformat-before-save)
(add-hook 'tuareg-mode-hook
	    (lambda() (setq tuareg-mode-name "🐫")))
;; Pretty symbols.
(add-hook 'tuareg-mode-hook
	    (lambda()
	      (when (functionp 'prettify-symbols-mode)
		(prettify-symbols-mode))))

Org Mode

Automatically tangle my configuration files

(use-package org-auto-tangle
  :hook
  (org-mode . org-auto-tangle-mode))
(with-eval-after-load 'org
  (org-babel-do-load-languages
   'org-babel-load-languages '((emacs-lisp . t)
				 (python . t)))
  (setq org-confirm-babel-evaluate nil)
  (setq org-startup-with-beamer-mode t)

  (setq org-latex-pdf-process '("xelatex -interaction nonstopmode %f"
				  "xelatex -interaction nonstopmode %f"))

  (require 'org-tempo)
  (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
  (add-to-list 'org-structure-template-alist '("py" . "src python"))
  (add-to-list 'org-structure-template-alist '("cpp" . "src cpp"))
  (add-to-list 'org-structure-template-alist '("go" . "src go")))

Debugging

;; See: https://github.com/jschaf/esup/issues/54#issuecomment-651247749
(use-package esup
  :commands
  esup
  :config
  (setq esup-depth 0))

About

My emacs configurations.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published