diff --git a/.config/emacs/custom-default.el b/.config/emacs/custom-default.el index 09932ed..007d2de 100644 --- a/.config/emacs/custom-default.el +++ b/.config/emacs/custom-default.el @@ -1,21 +1,21 @@ (setq user-full-name "JaeYoo-Im" - user-mail-address "cpu3792@gmail.com") + user-mail-address "cpu3792@gmail.com") (setq default-input-method "korean-hangul") (defun custom-setup-fonts () "setup fonts..." (when (display-graphic-p) - ;; default font - (cl-loop for font in '("FiraCode Nerd Font Mono" "Jetbrains Mono" - "Source Code Pro" "DejaVu Sans Mono") - when (font-installed-p font) - return (set-face-attribute 'default nil - :family font - :height 130)) - ;; uni code caracter - (cl-loop for font in '("Segoe UI Symbol" "Symbola" "Symbol") - when (font-installed-p font) - return (set-fontset-font t 'symbol (font-spec :family font) nil 'prepend)) + ;; default font + (cl-loop for font in '("FiraCode Nerd Font Mono" "Jetbrains Mono" + "Source Code Pro" "DejaVu Sans Mono") + when (font-installed-p font) + return (set-face-attribute 'default nil + :family font + :height 130)) + ;; uni code caracter + (cl-loop for font in '("Segoe UI Symbol" "Symbola" "Symbol") + when (font-installed-p font) + return (set-fontset-font t 'symbol (font-spec :family font) nil 'prepend)) ;; Emoji (cl-loop for font in '("Noto Color Emoji" "Apple Color Emoji" "Segoe UI Emoji") @@ -28,16 +28,14 @@ (t (set-fontset-font t 'emoji (font-spec :family font) nil 'prepend)))) - ;; Noto font or Nanum - (cl-loop for font in '("Noto Sans CJK KR" "Nanum Gothic") - when (font-installed-p font) - return (progn - (setq face-font-rescale-alist `((,font . 1.26))) - (set-fontset-font t '(#x1100 . #xffdc) (font-spec :family font)))))) + ;; Noto font or Nanum + (cl-loop for font in '("Noto Sans CJK KR" "Nanum Gothic") + when (font-installed-p font) + return (progn + (setq face-font-rescale-alist `((,font . 1.26))) + (set-fontset-font t '(#x1100 . #xffdc) (font-spec :family font)))))) (custom-setup-fonts) (add-hook 'window-setup-hook #'custom-setup-fonts) (add-hook 'server-after-make-frame-hook #'centaur-setup-fonts) - - diff --git a/.config/emacs/init.el b/.config/emacs/init.el index c2ef8bb..f0e93c1 100644 --- a/.config/emacs/init.el +++ b/.config/emacs/init.el @@ -57,5 +57,7 @@ Otherwise the startup will be very slow. " (require 'init-base) (require 'init-ui) +(require 'init-edit) +(require 'init-evil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; init.el ends here diff --git a/.config/emacs/lisp/init-base.el b/.config/emacs/lisp/init-base.el index 234c24a..c46136c 100644 --- a/.config/emacs/lisp/init-base.el +++ b/.config/emacs/lisp/init-base.el @@ -8,16 +8,16 @@ ;; (setq ffap-machine-p-known 'reject)) -;; +;; (use-package gcmh - :diminish - :hook - (emacs-startup . gcmh-mode) - :init - (setq gcmh-idle-delay 'auto - gcmh-auto-idle-delay-factor 10 - gcmh-high-cons-threshold (* 16 1024 1024))) - + :diminish + :hook + (emacs-startup . gcmh-mode) + :init + (setq gcmh-idle-delay 'auto + gcmh-auto-idle-delay-factor 10 + gcmh-high-cons-threshold (* 16 1024 1024))) + (when (fboundp 'set-charset-priority) (set-charset-priority 'unicode)) (prefer-coding-system 'utf-8) @@ -28,7 +28,7 @@ (set-selection-coding-system 'utf-8)) (when ON-LINUX (use-package exec-path-from-shell - :init (exec-path-from-shell-initialize))) + :init (exec-path-from-shell-initialize))) ;; open file point at where last saved place. (use-package saveplace @@ -37,7 +37,7 @@ (use-package recentf :ensure nil - :bind + :bind (("C-x C-r" . recentf-open-files)) :hook (after-init . recentf-mode) @@ -50,22 +50,22 @@ "^/tmp/" "^/var/folders/.+$" "^/ssh:" "/persp-confs/" (lambda (file) (file-in-directory-p file package-user-dir)))) :config - (push (expand-file-name recentf-save-file) recentf-exclude) - (add-to-list 'recentf-filename-handlers #'abbreviate-file-name)) + (push (expand-file-name recentf-save-file) recentf-exclude) + (add-to-list 'recentf-filename-handlers #'abbreviate-file-name)) (use-package savehist - :ensure nil - :hook - (after-init . savehist-mode) - :init - (setq enable-recursive-minibuffers t ; Allow commands in minibuffers - history-length 25 - savehist-additional-variables '(mark-ring - global-mark-ring - search-ring - regexp-search-ring - extended-command-history) - savehist-autosave-interval 300)) + :ensure nil + :hook + (after-init . savehist-mode) + :init + (setq enable-recursive-minibuffers t ; Allow commands in minibuffers + history-length 25 + savehist-additional-variables '(mark-ring + global-mark-ring + search-ring + regexp-search-ring + extended-command-history) + savehist-autosave-interval 300)) (use-package simple :ensure nil diff --git a/.config/emacs/lisp/init-const.el b/.config/emacs/lisp/init-const.el index c4d13ab..e90b994 100644 --- a/.config/emacs/lisp/init-const.el +++ b/.config/emacs/lisp/init-const.el @@ -1,10 +1,10 @@ ;;; init-const.el -*- lexical-binding: t -*- (defconst ON-LINUX (eq system-type 'gnu/linux) - "Under Linux system") + "Under Linux system") (defconst ON-WINDOWS (memq system-type '(cygwin windows-nt ms-dos)) - "Under Windows System") + "Under Windows System") (defconst custom-default-file - (expand-file-name "custom-default.el" user-emacs-directory)) + (expand-file-name "custom-default.el" user-emacs-directory)) (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) (provide 'init-const) diff --git a/.config/emacs/lisp/init-edit.el b/.config/emacs/lisp/init-edit.el new file mode 100644 index 0000000..17c97f3 --- /dev/null +++ b/.config/emacs/lisp/init-edit.el @@ -0,0 +1,131 @@ +;;; init-edit.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-func) + +(use-package autorevert + :ensure nil + :diminish + :hook (after-init . global-auto-revert-mode)) +(use-package avy + :hook (after-init . avy-setup-default) + :config + (setq avy-style 'pre + avy-all-windows t + avy-all-windows-alt nil + avy-background t)) +;; Show number of matches in mode-line while searching +(use-package anzu + :diminish + ;;:bind (([remap query-replace] . anzu-query-replace) + ;; ([remap query-replace-regexp] . anzu-query-replace-regexp) + ;; :map isearch-mode-map + ;; ([remap isearch-query-replace] . anzu-isearch-query-replace) + ;; ([remap isearch-query-replace-regexp] . anzu-isearch-query-replace-regexp)) + :hook (after-init . global-anzu-mode)) +(use-package ialign) + + +(use-package undo-tree + :diminish + :hook (after-init . global-undo-tree-mode) + :custom + (undo-tree-history-directory-alist + `(("." . ,(expand-file-name (file-name-as-directory "undo-tree-hist") + user-emacs-directory)))) + :config + (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))) + +(use-package hideshow + :ensure nil + :diminish hs-minor-mode + ;;:pretty-hydra + ;;((:title (pretty-hydra-title "HideShow" 'octicon "nf-oct-fold") + ;; :color amaranth :quit-key ("q" "C-g")) + ;; ("Fold" + ;; (("t" hs-toggle-all "toggle all") + ;; ("a" hs-show-all "show all") + ;; ("i" hs-hide-all "hide all") + ;; ("g" hs-toggle-hiding "toggle hiding") + ;; ("c" hs-cycle "cycle block") + ;; ("s" hs-show-block "show block") + ;; ("h" hs-hide-block "hide block") + ;; ("l" hs-hide-level "hide level")) + ;; "Move" + ;; (("C-a" mwim-beginning-of-code-or-line "⭰") + ;; ("C-e" mwim-end-of-code-or-line "⭲") + ;; ("C-b" backward-char "←") + ;; ("C-n" next-line "↓") + ;; ("C-p" previous-line "↑") + ;; ("C-f" forward-char "→") + ;; ("C-v" pager-page-down "↘") + ;; ("M-v" pager-page-up "↖") + ;; ("M-<" beginning-of-buffer "⭶") + ;; ("M->" end-of-buffer "⭸")))) + ;;:bind (:map hs-minor-mode-map + ;; ("C-~" . hideshow-hydra/body) + ;; ("C-S-" . hideshow-hydra/body)) + :hook (prog-mode . hs-minor-mode) + :config + ;; More functions + ;; @see https://karthinks.com/software/simple-folding-with-hideshow/ + (defun hs-cycle (&optional level) + (interactive "p") + (let (message-log-max + (inhibit-message t)) + (if (= level 1) + (pcase last-command + ('hs-cycle + (hs-hide-level 1) + (setq this-command 'hs-cycle-children)) + ('hs-cycle-children + (save-excursion (hs-show-block)) + (setq this-command 'hs-cycle-subtree)) + ('hs-cycle-subtree + (hs-hide-block)) + (_ + (if (not (hs-already-hidden-p)) + (hs-hide-block) + (hs-hide-level 1) + (setq this-command 'hs-cycle-children)))) + (hs-hide-level level) + (setq this-command 'hs-hide-level)))) + + (defun hs-toggle-all () + "Toggle hide/show all." + (interactive) + (pcase last-command + ('hs-toggle-all + (save-excursion (hs-show-all)) + (setq this-command 'hs-global-show)) + (_ (hs-hide-all)))) + + ;; Display line counts + (defun hs-display-code-line-counts (ov) + "Display line counts when hiding codes." + (when (eq 'code (overlay-get ov 'hs)) + (overlay-put ov 'display + (concat + " " + (propertize + (if (char-displayable-p ?⏷) "⏷" "...") + 'face 'shadow) + (propertize + (format " (%d lines)" + (count-lines (overlay-start ov) + (overlay-end ov))) + 'face '(:inherit shadow :height 0.8)) + " ")))) + (setq hs-set-up-overlay #'hs-display-code-line-counts)) + +;; Hanlde minified code +(use-package so-long + :hook (after-init . global-so-long-mode)) + +(provide 'init-edit) +;;; init-edit.el ends here. diff --git a/.config/emacs/lisp/init-evil.el b/.config/emacs/lisp/init-evil.el new file mode 100644 index 0000000..5a6d569 --- /dev/null +++ b/.config/emacs/lisp/init-evil.el @@ -0,0 +1,53 @@ +;;; init-evil.el -*- lexical-binding: t -*- +(require 'init-const) +(require 'init-func) + +(use-package evil + :ensure nil + :diminish + :hook (after-init . evil-mode) + :init + (setq evil-want-integration t + evil-want-keybinding nil + evil-want-C-u-scroll t + evil-want-C-i-jump nil) + ;;(setq evil-respect-visual-line-mode nil) ; t : on the screen, nil : by cr characters + (require 'evil-vars) + (evil-set-undo-system 'undo-tree) + ;;(evil-set-undo-system 'undo-redo) + + ;; Make evil search more like vim (makes emacs slow) + ;;(evil-select-search-module 'evil-search-module 'evil-search) + + :config + (setq evil-want-fine-undo t) ; more granular undo with evil + (evil-set-initial-state 'messages-buffer-mode 'normal) + (evil-set-initial-state 'dashboard-mode 'normal) + ;; eshell no evil + (dolist (mode '(eshell-mode)) + (add-to-list 'evil-emacs-state-modes mode))) + +(use-package evil-collection + :after evil + :config + (evil-collection-init)) + +(use-package evil-nerd-commenter + :after evil + :config + ;; 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)) + +(use-package evil-numbers + :after evil + :config + ;; 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)) + +(provide 'init-evil) +;;; init-evil.el ends here. diff --git a/.config/emacs/lisp/init-func.el b/.config/emacs/lisp/init-func.el index c8b61c9..76291a0 100644 --- a/.config/emacs/lisp/init-func.el +++ b/.config/emacs/lisp/init-func.el @@ -4,6 +4,12 @@ (defun font-installed-p (font-name) (find-font (font-spec :name font-name))) +(defun too-long-file-p () + "Check whether the file is too long." + (if (fboundp 'buffer-line-statistics) + (> (car (buffer-line-statistics)) 10000) + (> (buffer-size) 100000))) + (provide 'init-func) ;;; init-func.el ends here diff --git a/.config/emacs/lisp/init-package.el b/.config/emacs/lisp/init-package.el index 92b8ebc..bb786b1 100644 --- a/.config/emacs/lisp/init-package.el +++ b/.config/emacs/lisp/init-package.el @@ -3,7 +3,7 @@ (require 'init-func) (when (and (file-exists-p custom-default-file) - (not (file-exists-p custom-file))) + (not (file-exists-p custom-file))) (copy-file custom-default-file custom-file)) (and (file-readable-p custom-file) (load custom-file)) @@ -22,13 +22,13 @@ (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 + '(("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 (unless (bound-and-true-p package--initialized) (setq package-enable-at-startup nil) (package-initialize)) @@ -49,38 +49,38 @@ (use-package bind-key) (use-package paradox - :custom-face - (paradox-archive-face ((t (:inherit font-lock-doc-face)))) - (paradox-description-face ((t (:inherit completions-annotations)))) - :hook - (emacs-startup . paradox-enable) - :init - (setq paradox-execute-asynchronously t - paradox-github-token nil - paradox-display-star-count nil - paradox-status-face-alist ; - '(("built-in" . font-lock-builtin-face) - ("available" . success) - ("new" . (success bold)) - ("held" . font-lock-constant-face) - ("disabled" . font-lock-warning-face) - ("avail-obso" . font-lock-comment-face) - ("installed" . font-lock-comment-face) - ("dependency" . font-lock-comment-face) - ("incompat" . font-lock-comment-face) - ("deleted" . font-lock-comment-face) - ("unsigned" . font-lock-warning-face))) - :config - (add-hook 'paradox-after-execute-functions - (lambda (_) - "Display `page-break-lines' in \"*Paradox Report*\" buffer." - (when (fboundp 'page-break-lines-mode) - (let ((buf (get-buffer "*Paradox Report*")) - (inhibit-read-only t)) - (when (buffer-live-p buf) - (with-current-buffer buf - (page-break-lines-mode 1)))))) - t)) + :custom-face + (paradox-archive-face ((t (:inherit font-lock-doc-face)))) + (paradox-description-face ((t (:inherit completions-annotations)))) + :hook + (emacs-startup . paradox-enable) + :init + (setq paradox-execute-asynchronously t + paradox-github-token nil + paradox-display-star-count nil + paradox-status-face-alist ; + '(("built-in" . font-lock-builtin-face) + ("available" . success) + ("new" . (success bold)) + ("held" . font-lock-constant-face) + ("disabled" . font-lock-warning-face) + ("avail-obso" . font-lock-comment-face) + ("installed" . font-lock-comment-face) + ("dependency" . font-lock-comment-face) + ("incompat" . font-lock-comment-face) + ("deleted" . font-lock-comment-face) + ("unsigned" . font-lock-warning-face))) + :config + (add-hook 'paradox-after-execute-functions + (lambda (_) + "Display `page-break-lines' in \"*Paradox Report*\" buffer." + (when (fboundp 'page-break-lines-mode) + (let ((buf (get-buffer "*Paradox Report*")) + (inhibit-read-only t)) + (when (buffer-live-p buf) + (with-current-buffer buf + (page-break-lines-mode 1)))))) + t)) diff --git a/.config/emacs/lisp/init-ui.el b/.config/emacs/lisp/init-ui.el index 7d60f45..b4fd5b6 100644 --- a/.config/emacs/lisp/init-ui.el +++ b/.config/emacs/lisp/init-ui.el @@ -1,4 +1,4 @@ -;; init-ui.el -*- lexical-binding: t -*- +;;; init-ui.el -*- lexical-binding: t -*- (require 'init-const) (require 'init-func) @@ -17,27 +17,109 @@ ;; Make certain buffers grossly incandescent (use-package solaire-mode - :hook (after-load-theme . solaire-global-mode)) + :hook (after-load-theme . solaire-global-mode)) (use-package doom-themes - :init - (if (display-graphic-p) - ;;(load-theme 'doom-palenight t) - (load-theme 'doom-one t) - (load-theme 'doom-gruvbox t)) - :config - (doom-themes-visual-bell-config)) + :init + (if (display-graphic-p) + ;;(load-theme 'doom-palenight t) + (load-theme 'doom-one t) + (load-theme 'doom-gruvbox t)) + :config + (doom-themes-visual-bell-config)) (use-package doom-modeline - :hook (after-init . doom-modeline-mode) - :init - (setq doom-modeline-window-width-limit 110 - doom-modeline-minor-modes t) - :config - (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)) + :hook (after-init . doom-modeline-mode) + :init + (setq doom-modeline-window-width-limit 110 + doom-modeline-minor-modes t) + :config + (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)) +(use-package hide-mode-line + :hook (((completion-list-mode + completion-in-region-mode + eshell-mode shell-mode + term-mode vterm-mode + treemacs-mode + lsp-ui-imenu-mode + pdf-annot-list-mode) . hide-mode-line-mode))) + +;; A minor-mode menu for mode-line +(use-package minions + :hook (doom-modeline-mode . minions-mode)) + +;; Icons +(use-package nerd-icons) + +(use-package display-line-numbers + :ensure nil + :hook ((prog-mode yaml-mode conf-mode) . display-line-numbers-mode) + :init (setq display-line-numbers-width-start t)) + +;; Suppress GUI features +(setq use-file-dialog nil + use-dialog-box nil + inhibit-startup-screen nil + inhibit-startup-echo-area-message user-login-name + inhibit-default-init t + initial-scratch-message nil) +(unless (daemonp) + (advice-add #'display-startup-echo-area-message :override #'ignore)) + +;; Display dividers between windows +(setq window-divider-default-places t + window-divider-default-bottom-width 1 + window-divider-default-right-width 1) +(add-hook 'window-setup-hook #'window-divider-mode) + +(use-package time + :ensure nil + :init (setq display-time-24hr-format t + display-time-day-and-date t)) + +;; Mouse & Smooth Scroll +;; Scroll one line at a time (less "jumpy" than defaults) +(when (display-graphic-p) + (setq mouse-wheel-scroll-amount '(1 ((shift) . hscroll)) + mouse-wheel-scroll-amount-horizontal 1 + mouse-wheel-progressive-speed nil)) +(setq scroll-step 1 + scroll-margin 0 + scroll-conservatively 100000 + auto-window-vscroll nil + scroll-preserve-screen-position t) + +;; Good pixel line scrolling +(if (fboundp 'pixel-scroll-precision-mode) + (pixel-scroll-precision-mode t) + (when (and emacs/>=27p (not sys/macp)) + (use-package good-scroll + :diminish + :hook (after-init . good-scroll-mode) + :bind (([remap next] . good-scroll-up-full-screen) + ([remap prior] . good-scroll-down-full-screen))))) + +;; Smooth scrolling over images +(use-package iscroll + :diminish + :hook (image-mode . iscroll-mode)) + +;; Use fixed pitch where it's sensible +(use-package mixed-pitch + :diminish) + +;; Display ugly ^L page breaks as tidy horizontal lines +(use-package page-break-lines + :diminish + :hook (after-init . global-page-break-lines-mode) + :config ;; display only half fix. + (set-fontset-font "fontset-default" + (cons page-break-lines-char page-break-lines-char) + (face-attribute 'default :family))) + diff --git a/.config/emacs/transient/history.el b/.config/emacs/transient/history.el new file mode 100644 index 0000000..90b5a84 --- /dev/null +++ b/.config/emacs/transient/history.el @@ -0,0 +1 @@ +nil \ No newline at end of file