https://github.com/zwpaper/paper-emacs
zwPapEr Emacs
https://github.com/zwpaper/paper-emacs
Last synced: 3 months ago
JSON representation
zwPapEr Emacs
- Host: GitHub
- URL: https://github.com/zwpaper/paper-emacs
- Owner: zwpaper
- Created: 2019-03-14T06:54:51.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-11-03T06:21:56.000Z (over 1 year ago)
- Last Synced: 2025-08-01T04:47:22.458Z (11 months ago)
- Language: Emacs Lisp
- Size: 603 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.org
Awesome Lists containing this project
README
#+TITLE: zwPapEr GNU Emacs Configuration
* About
When first using this config, there is some steps have to be done before started.
1. git submodule init
2. git submodule update
Sometimes when first start, emacs may not found some package in =Melpa=,
try to install any one package manually, and then restart emacs.
Because some packages need fully reload, It may need several restarting Emacs.
* Essentials
There are some system package dependency, should be installed, check [[https://github.com/zwpaper/dotfile][dot file]]
** Use package
#+begin_src emacs-lisp
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(eval-when-compile
(require 'use-package))
(setq use-package-always-ensure t)
#+end_src
** Startup Optimization
Optimize startup time.
#+BEGIN_SRC emacs-lisp
(defvar default-file-name-handler-alist file-name-handler-alist)
(setq file-name-handler-alist nil)
(setq gc-cons-threshold 80000000)
(add-hook 'emacs-startup-hook
(lambda ()
"Restore defalut values after init."
(setq file-name-handler-alist default-file-name-handler-alist)
(setq gc-cons-threshold 800000)
(if (boundp 'after-focus-change-function)
(add-function :after after-focus-change-function
(lambda ()
(unless (frame-focus-state)
(garbage-collect))))
(add-hook 'focus-out-hook 'garbage-collect))))
(setq confirm-kill-emacs
(lambda (prompt) (y-or-n-p-with-timeout "Whether to quit Emacs:" 10 "y")))
;; Start up dashboard
(use-package dashboard
:ensure t
:diminish dashboard-mode
:config
(setq dashboard-banner-logo-title "Welcome to Black Magic")
(setq dashboard-startup-banner "~/.emacs.d/config/ironman.png")
(setq dashboard-items '((recents . 10)
(bookmarks . 10)))
(dashboard-setup-startup-hook))
#+end_src
*** General
#+begin_src emacs-lisp
(when (eq system-type 'darwin)
;; this only need for GUI Emacs
(use-package exec-path-from-shell
:config
(exec-path-from-shell-initialize)
(exec-path-from-shell-copy-env "PATH")))
(defun draft-buffer()
(interactive)
(find-file (expand-file-name "~/OneDrive/org-mode/personal.draft.org"))
(goto-char (point-max)))
(defun draft-work-buffer()
(interactive)
(find-file (expand-file-name "~/OneDrive/org-mode/work/sensetime/draft.org"))
(goto-char (point-max)))
#+end_src
**** Thing Edit
#+begin_src emacs-lisp
;; unbind C-w and M-w first, for binding in thing edit
(global-unset-key (kbd "C-w"))
(global-unset-key (kbd "M-w"))
(use-package thing-edit
:load-path "plugin/thing-edit"
:ensure nil
:bind
(("C-w C-w" . thing-cut-word)
("M-w M-w" . thing-copy-word)
("C-w C-r" . thing-cut-region-or-line)
("M-w M-r" . thing-copy-region-or-line)
("C-w C-s" . thing-cut-sexp)
("M-w M-s" . thing-copy-sexp)
("C-w C-f" . thing-cut-filename)
("M-w M-f" . thing-copy-filename)
("C-w C-u" . thing-cut-url)
("M-w M-u" . thing-copy-url)
("C-w C-p" . thing-cut-parentheses)
("M-w M-p" . thing-copy-parentheses)
("C-w C-c" . thing-cut-comment)
("M-w M-c" . thing-copy-comment)
("C-w C-b" . thing-cut-whole-buffer)
("M-w M-b" . thing-copy-whole-buffer)))
(use-package fingertip
:load-path "~/code/el/fingertip"
:ensure nil
:config
(dolist (hook (list
'c-ts-mode-common-hook
'c-ts-mode-hook
'c++-ts-mode-hook
'java-mode-hook
'haskell-mode-hook
'maxima-mode-hook
'ielm-mode-hook
'sh-mode-hook
'makefile-gmake-mode-hook
'php-mode-hook
'python-mode-hook
'js-mode-hook
'go-ts-mode-hook
'qml-mode-hook
'jade-mode-hook
'css-mode-hook
'ruby-mode-hook
'coffee-mode-hook
'rust-ts-mode-hook
'qmake-mode-hook
'lua-mode-hook
'swift-mode-hook
'web-mode-hook
'markdown-mode-hook
'llvm-mode-hook
'conf-toml-mode-hook
'nim-mode-hook
'typescript-mode-hook
'c-ts-mode-hook
'c++-ts-mode-hook
'cmake-ts-mode-hook
'toml-ts-mode-hook
'css-ts-mode-hook
'js-ts-mode-hook
'json-ts-mode-hook
'python-ts-mode-hook
'bash-ts-mode-hook
'typescript-ts-mode-hook
))
(add-hook hook #'(lambda () (fingertip-mode 1))))
(define-key fingertip-mode-map (kbd "(") 'fingertip-open-round)
(define-key fingertip-mode-map (kbd "[") 'fingertip-open-bracket)
(define-key fingertip-mode-map (kbd "{") 'fingertip-open-curly)
(define-key fingertip-mode-map (kbd ")") 'fingertip-close-round)
(define-key fingertip-mode-map (kbd "]") 'fingertip-close-bracket)
(define-key fingertip-mode-map (kbd "}") 'fingertip-close-curly)
(define-key fingertip-mode-map (kbd "=") 'fingertip-equal)
(define-key fingertip-mode-map (kbd "%") 'fingertip-match-paren)
(define-key fingertip-mode-map (kbd "\"") 'fingertip-double-quote)
(define-key fingertip-mode-map (kbd "'") 'fingertip-single-quote)
(define-key fingertip-mode-map (kbd "SPC") 'fingertip-space)
(define-key fingertip-mode-map (kbd "RET") 'fingertip-newline)
(define-key fingertip-mode-map (kbd "M-o") 'fingertip-backward-delete)
(define-key fingertip-mode-map (kbd "C-d") 'fingertip-forward-delete)
(define-key fingertip-mode-map (kbd "C-k") 'fingertip-kill)
(define-key fingertip-mode-map (kbd "M-\"") 'fingertip-wrap-double-quote)
(define-key fingertip-mode-map (kbd "M-'") 'fingertip-wrap-single-quote)
(define-key fingertip-mode-map (kbd "M-[") 'fingertip-wrap-bracket)
(define-key fingertip-mode-map (kbd "M-{") 'fingertip-wrap-curly)
(define-key fingertip-mode-map (kbd "M-(") 'fingertip-wrap-round)
(define-key fingertip-mode-map (kbd "M-)") 'fingertip-unwrap)
(define-key fingertip-mode-map (kbd "C-j") 'fingertip-jump-up))
#+end_src
**** White spaces
#+begin_src emacs-lisp
; (use-package mind-wave
; :ensure nil
; :load-path "~/code/z/mind-wave"
; :bind
; ("M-e" . mind-wave-chat-ask))
;
(use-package jieba
:ensure nil
:load-path "~/code/z/jieba.el"
:commands jieba-mode
:config
(jieba-mode))
(defun moon-hungry-delete ()
"Smart and clean delete.
If we are at the beginning of a line, backspace
deletes all whitespace before and after point
and moves point to the previous line."
(interactive)
(if (or (region-active-p)
(<= (car (syntax-ppss)) 0))
(if (member (char-before) '(?{ ?\[ ?\())
(call-interactively #'electric-pair-delete-pair)
(call-interactively #'backward-delete-char-untabify))
;; case1: closing delimiter after point:
;; delete all excess white space and new line
;; before and after point
;; add newline and indent if is }
;; case2: other stuff after point:
;; remove empty lines and indent
(let* ((point (point))
(bolt (save-excursion
;; `beginning-of-line-text' seems to ignore comment for some reason,
(beginning-of-line)
(skip-chars-forward " \t")
(point)))
;; beginning of the region that we are to delete
(beg (save-excursion (while (member (char-before) '(?\n ?\s ?\t))
(backward-char))
(point)))
;; end of that region
(end (save-excursion (goto-char bolt)
(while (member (char-after) '(?\n ?\s ?\t))
(forward-char))
(point))))
(if (<= point bolt)
;; actually decide to delete stuff
(progn
(delete-region beg end)
(unless (eql (char-after) ?\))
(call-interactively #'newline))
;; so we did all this and ends up not changing anything
;; why? because the user doesn't want to delete excess white space,
;; but to delete back to previous line! do that.
(when (eql (point) end)
(delete-region beg end)
(insert ?\s)))
;; not at beginning of text, just do normal delete
(if (member (char-before) '(?{ ?\[ ?\())
(call-interactively #'electric-pair-delete-pair)
(call-interactively #'backward-delete-char-untabify))))))
(global-set-key (kbd "") (lambda ()
(interactive)
(moon-hungry-delete)))
;; (use-package rainbow-delimiters
;; :hook
;; (prog-mode . rainbow-delimiters-mode))
(use-package highlight-parentheses
:hook
(prog-mode . highlight-parentheses-mode))
(use-package pangu-spacing
:config
(setq pangu-spacing-real-insert-separtor t)
:hook
(org-mode . pangu-spacing-mode)
(markdown-mode . pangu-spacing-mode)
(gfm-mode . pangu-spacing-mode))
#+end_src
**** Style
Check spell for org and markdown
#+BEGIN_SRC emacs-lisp
(use-package flyspell
:defer t
:init
(progn
(add-hook 'prog-mode-hook 'flyspell-prog-mode)
(add-hook 'text-mode-hook 'flyspell-mode)))
#+END_SRC
**** Terminal
#+begin_src emacs-lisp
(use-package init-term
:ensure nil)
#+end_src
** OS Related
#+begin_src emacs-lisp
(setq ad-redefinition-action 'accept)
;; Treat clipboard input as UTF-8 string first; compound text next, etc.
(when (display-graphic-p)
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))
;; When buffer is closed, saves the cursor location
(save-place-mode 1)
;; Real emacs knights don't use shift to mark things
(setq shift-select-mode nil)
;; Garbage collect when Emacs is not in focus
(add-hook 'focus-out-hook #'garbage-collect)
;; Merge system clipboard with Emacs
(setq-default select-enable-clipboard t)
;; Prevent Extraneous Tabs
(setq-default indent-tabs-mode nil)
#+end_src
*** macOS
#+begin_src emacs-lisp
(when (display-graphic-p)
(menu-bar-mode -1)
(toggle-scroll-bar -1)
(tool-bar-mode -1)
(tooltip-mode -1)
(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark)) ;; assuming you are using a dark theme
(setq ns-pop-up-frames nil) ;; Not creating new frame when open from terminal
(setq ns-use-proxy-icon nil)
(setq frame-title-format nil))
#+end_src
-----
** Funny Skins
#+begin_src emacs-lisp
(use-package pulse
:ensure nil
:preface
(defun my-pulse-momentary-line (&rest _)
"Pulse the current line."
(pulse-momentary-highlight-one-line (point) 'next-error))
(defun my-pulse-momentary (&rest _)
"Pulse the current line."
(if (fboundp 'xref-pulse-momentarily)
(xref-pulse-momentarily)
(my-pulse-momentary-line)))
(defun my-recenter-and-pulse(&rest _)
"Recenter and pulse the current line."
(recenter)
(my-pulse-momentary))
(defun my-recenter-and-pulse-line (&rest _)
"Recenter and pulse the current line."
(recenter)
(my-pulse-momentary-line))
:hook (((dumb-jump-after-jump
imenu-after-jump) . my-recenter-and-pulse)
((bookmark-after-jump
magit-diff-visit-file
next-error) . my-recenter-and-pulse-line))
:init
(dolist (cmd '(recenter-top-bottom
other-window ace-window windmove-do-window-select
pager-page-down pager-page-up
symbol-overlay-basic-jump))
(advice-add cmd :after #'my-pulse-momentary-line))
(dolist (cmd '(pop-to-mark-command
pop-global-mark
goto-last-change))
(advice-add cmd :after #'my-recenter-and-pulse)))
(use-package emojify
:config
(add-hook 'org-mode-hook #'emojify-mode))
(use-package nyan-mode
:hook
(after-init . nyan-mode))
(defcustom centaur-icon (display-graphic-p)
"Display icons or not."
:group 'centaur
:type 'boolean)
(defun icons-displayable-p ()
"Return non-nil if `all-the-icons' is displayable."
(and centaur-icon
(display-graphic-p)
(require 'all-the-icons nil t)))
#+end_src
*** Nerd Icons
install [[https://github.com/ryanoasis/nerd-fonts][Nerd Icons]] before using this
macOS:
#+begin_quote
brew cask install font-hack-nerd-font
#+end_quote
*** Show color in buffers
+ compilation
#+begin_src emacs-lisp
(require 'ansi-color)
(defun colorize-compilation-buffer ()
(ansi-color-apply-on-region compilation-filter-start (point)))
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
#+end_src
** Kill ring
#+begin_src emacs-lisp
(setenv "LANG" "en_US.UTF-8")
(defun isolate-kill-ring()
"Isolate Emacs kill ring from OS X system pasteboard.
This function is only necessary in window system."
(interactive)
(setq interprogram-cut-function nil)
(setq interprogram-paste-function nil))
(defun pasteboard-copy()
"Copy region to OS X system pasteboard."
(interactive)
(shell-command-on-region
(region-beginning) (region-end) "pbcopy"))
(defun pasteboard-paste()
"Paste from OS X system pasteboard via `pbpaste' to point."
(interactive)
(shell-command-on-region
(point) (if mark-active (mark) (point)) "pbpaste" nil t))
(defun pasteboard-cut()
"Cut region and put on OS X system pasteboard."
(interactive)
(pasteboard-copy)
(delete-region (region-beginning) (region-end)))
(if window-system
(progn
(isolate-kill-ring)
;; bind CMD+C to pasteboard-copy
(global-set-key (kbd "s-c") 'pasteboard-copy)
;; bind CMD+V to pasteboard-paste
(global-set-key (kbd "s-v") 'pasteboard-paste)
;; bind CMD+X to pasteboard-cut
(global-set-key (kbd "s-x") 'pasteboard-cut))
)
#+end_src
** Customize
#+begin_src emacs-lisp
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
; (when (file-exists-p custom-file)
; (load custom-file))
#+end_src
** TBD
#+begin_src emacs-lisp
(use-package init-org
:ensure nil)
(use-package init-pyim
:ensure nil)
(use-package init-languages
:ensure nil)
(use-package init-tabnine
:ensure nil)
(use-package init-window
:ensure nil)
(use-package multiple-cursors)
;;; Bookmarks
(setq bookmark-save-flag 1) ; everytime bookmark is changed, automatically save it
(use-package recentf
:init
(recentf-mode 1)
:config
(setq-default recent-save-file "~/.emacs.d/recentf")
(setq recentf-max-menu-items 100))
(use-package epa-file
:ensure nil
:config
(epa-file-enable)
(setq epa-pinentry-mode 'loopback)
)
;; Global Settings:
;;; Key bindings
;; scroll one line only when past the bottom of screen
(setq scroll-conservatively 1)
;; (require 'tramp)
;; (add-to-list 'tramp-remote-path 'tramp-own-remote-path)
;; multiple cursors
(global-set-key (kbd "C-c C-l") 'mc/edit-lines)
(global-set-key (kbd "C-c C-n") 'mc/mark-next-like-this)
(global-set-key (kbd "C-c C-p") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c C-a") 'mc/mark-all-like-this)
;; magit
(use-package magit
:config
(use-package magit-delta
:config
(setq magit-delta-default-dark-theme "OneHalfDark")
(setq magit-delta-delta-args
`("--max-line-distance" "0.6"
"--24-bit-color" ,(if xterm-color--support-truecolor "always" "never")
"--color-only" "--minus-style" "normal red" "--plus-style" "normal green")))
;; :config
;; (use-package magit-todos
;; :config
;; (magit-todos-mode 1)
;; (setq magit-todos-exclude-globs "vendor"))
:bind
("C-x g" . magit-status))
;; Indent Guide
(use-package indent-guide
:config
(set-face-foreground 'indent-guide-face "dimgray")
(setq indent-guide-delay 0.2)
:hook
(prog-mode . indent-guide-mode)
(yaml-mode . indent-guide-mode))
;;(use-package yequake)
;; :custom
;; (yequake-frames
;; '(("org-capture"
;; (buffer-fns . (yequake-org-capture))
;; (width . 0.75)
;; (height . 0.5)
;; (alpha . 0.95)
;; (frame-parameters . ((undecorated . t)
;; (skip-taskbar . t)
;; (sticky . t))))))
; (setq org-latex-compiler "xelatex")
; (setq org-latex-pdf-process '("latexmk -xelatex -quiet -shell-escape -f %f"))
; (setq-default TeX-engine 'xetex)
; (setq-default TeX-PDF-mode t)
#+end_src
* Credits
This Emacs configuration was influenced and inspired by the following configurations.
- [[https://github.com/MatthewZMD/.emacs.d][MT’s GNU Emacs Configuration]]