diff --git a/example/websocket/websocket.el b/example/websocket/websocket.el index 04fc36a..03ab95e 100644 --- a/example/websocket/websocket.el +++ b/example/websocket/websocket.el @@ -1,5 +1,8 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "emacs-websocket") + (require 'websocket) (setq-local websocket-eldoc-callback nil) diff --git a/init.el b/init.el index 2af8723..f236b2b 100644 --- a/init.el +++ b/init.el @@ -58,45 +58,7 @@ If freezing sometimes, decrease it. If stuttering, increase it.") (expand-file-name ".cache" creature/config-dir) "Cache directory of Creature.") -(defconst creature/pkg-dir - (expand-file-name "site-lisp" creature/config-dir) - "Package directory.") - -(require 'cl-lib) -(require 'subr-x) - -(defun add-dir-and-subdirs-to-load-path (dir) - "Add directory and its subdirectoris to `load-path'. -Detect whether there are any loadable module in DIR, if so, add DIR to `load-path'. -Do this recursively for subdirectories of DIR." - (unless (file-directory-p dir) - (error "%s is not a directory" dir)) - - (let ((subdirs nil) - (files nil) - (temp-filepath nil) - ;; (loadable-suffixes (get-load-suffixes)) - (load-extension (mapcar (lambda (str) (string-remove-prefix "." str)) load-suffixes)) - (exclude-dirs '("." ".." - "dist" "node_modules" "__pycache__" - "RCS" "CVS" "rcs" "cvs" ".git" ".github"))) - - (dolist (filename (directory-files dir)) - (setq temp-filepath (file-name-concat dir filename)) - (if (file-directory-p temp-filepath) - (unless (member filename exclude-dirs) - (add-to-list 'subdirs temp-filepath t)) - (when (file-regular-p temp-filepath) - (add-to-list 'files temp-filepath t)))) - - (when (cl-some (lambda (file) - (member (file-name-extension file) load-extension)) - files) - (add-to-list 'load-path dir t)) - (mapc #'add-dir-and-subdirs-to-load-path subdirs))) - (add-to-list 'load-path (expand-file-name "lisp" creature/config-dir) t) -(add-dir-and-subdirs-to-load-path creature/pkg-dir) (require 'init-built-in) diff --git a/lisp/init-ace-window.el b/lisp/init-ace-window.el index 4663ab1..007310e 100644 --- a/lisp/init-ace-window.el +++ b/lisp/init-ace-window.el @@ -1,5 +1,11 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "ace-window") +(add-pkg-in-pkg-dir "posframe") +(add-pkg-in-pkg-dir "avy") + + (require 'lazy-load) diff --git a/lisp/init-awesome-pair.el b/lisp/init-awesome-pair.el index 1332265..b465a07 100644 --- a/lisp/init-awesome-pair.el +++ b/lisp/init-awesome-pair.el @@ -1,5 +1,8 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "awesome-pair") + (require 'lazy-load) diff --git a/lisp/init-editorconfig.el b/lisp/init-editorconfig.el index dccab1d..7716851 100644 --- a/lisp/init-editorconfig.el +++ b/lisp/init-editorconfig.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(unless (locate-library "editorconfig") + (add-pkg-in-pkg-dir "editorconfig-emacs")) + (autoload 'editorconfig-mode "editorconfig" "" t) (defun creature/editorconfig-setup () diff --git a/lisp/init-emmet.el b/lisp/init-emmet.el index aae35e8..5cde94f 100644 --- a/lisp/init-emmet.el +++ b/lisp/init-emmet.el @@ -1,5 +1,8 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "emmet-mode") + (autoload 'emmet-mode "emmet-mode" "" t) (with-eval-after-load 'emmet-mode diff --git a/lisp/init-file.el b/lisp/init-file.el index 2ed4522..478fcdd 100644 --- a/lisp/init-file.el +++ b/lisp/init-file.el @@ -1,5 +1,14 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "vimrc-mode") +(add-pkg-in-pkg-dir "yaml-mode") +(add-pkg-in-pkg-dir "lua-mode") +(add-pkg-in-pkg-dir "nginx-mode") +(add-pkg-in-pkg-dir "pdf-tools") +(add-pkg-in-pkg-dir "tablist") +(add-pkg-in-pkg-dir "saveplace-pdf-view") +(add-pkg-in-pkg-dir "graphviz-dot-mode") (autoload 'vimrc-mode "vimrc-mode" "" t) (add-to-list 'auto-mode-alist '("\\.vim\\(rc\\)?\\'" . vimrc-mode)) diff --git a/lisp/init-flymake.el b/lisp/init-flymake.el index 98dc6f8..8241bf3 100644 --- a/lisp/init-flymake.el +++ b/lisp/init-flymake.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "eslint-disable-rule") +(add-pkg-in-pkg-dir "emacs-flymake-eslint") + (defun creature/flymake-show-diagnostics-buffer-and-jump () (interactive) (flymake-show-diagnostics-buffer) diff --git a/lisp/init-git.el b/lisp/init-git.el index 303e9dc..8494081 100644 --- a/lisp/init-git.el +++ b/lisp/init-git.el @@ -1,5 +1,11 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "magit") +(add-pkg-in-pkg-dir "dash") +(add-pkg-in-pkg-dir "git-modes") +(add-pkg-in-pkg-dir "with-editor") + (require 'lazy-load) (lazy-load-global-keys diff --git a/lisp/init-keybindings.el b/lisp/init-keybindings.el index ce5778d..aee689e 100644 --- a/lisp/init-keybindings.el +++ b/lisp/init-keybindings.el @@ -1,5 +1,14 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "expand-region") +(add-pkg-in-pkg-dir "rg") +(add-pkg-in-pkg-dir "Emacs-wgrep") +(add-pkg-in-pkg-dir "avy") +(add-pkg-in-pkg-dir "mwim") +(add-pkg-in-pkg-dir "symbol-overlay") + + (defconst creature/prefix-key "M-m" "Prefix key for custom keybindings.") diff --git a/lisp/init-markdown.el b/lisp/init-markdown.el index b3ff3b8..0f2ee20 100644 --- a/lisp/init-markdown.el +++ b/lisp/init-markdown.el @@ -1,5 +1,8 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "markdown-mode") + (autoload 'markdown-mode "markdown-mode" "Major mode for editing Markdown files" t) (add-to-list 'auto-mode-alist diff --git a/lisp/init-media.el b/lisp/init-media.el index 921aeda..d19f243 100644 --- a/lisp/init-media.el +++ b/lisp/init-media.el @@ -1,5 +1,8 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "emms") + (autoload 'emms-all "emms-setup" "" t) (autoload 'emms-default-players "" t) diff --git a/lisp/init-org.el b/lisp/init-org.el index 371d2cd..2c309e0 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -1,5 +1,13 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "org-pomodoro") +(add-pkg-in-pkg-dir "alert") +(add-pkg-in-pkg-dir "gntp") +(add-pkg-in-pkg-dir "ox-hugo") +(add-pkg-in-pkg-dir "tomelr") + + ;; customize mode for src lang (defconst creature/org-src-lang-modes (if (bound-and-true-p creature/treesit-available) diff --git a/lisp/init-package.el b/lisp/init-package.el new file mode 100644 index 0000000..7b1f22c --- /dev/null +++ b/lisp/init-package.el @@ -0,0 +1,57 @@ +;; -*- coding: utf-8; lexical-binding: t; -*- + +(defconst creature/pkg-dir + (expand-file-name + "../site-lisp" + (file-name-directory(or load-file-name buffer-file-name))) + "Package directory.") + +(require 'cl-lib) +(require 'subr-x) + +(defun add-dir-and-subdirs-to-load-path (dir) + "Add directory and its subdirectoris to `load-path'. +Detect whether there are any loadable module in DIR, if so, add DIR to `load-path'. +Do this recursively for subdirectories of DIR." + (unless (file-directory-p dir) + (error "%s is not a directory" dir)) + + (let ((subdirs nil) + (files nil) + (temp-filepath nil) + ;; (loadable-suffixes (get-load-suffixes)) + (load-extension (mapcar (lambda (str) (string-remove-prefix "." str)) load-suffixes)) + (exclude-dirs '("." ".." + "dist" "node_modules" "__pycache__" "test" + "RCS" "CVS" "rcs" "cvs" ".git" ".github"))) + + (dolist (filename (directory-files dir)) + (setq temp-filepath (file-name-concat dir filename)) + (if (file-directory-p temp-filepath) + (unless (member filename exclude-dirs) + (add-to-list 'subdirs temp-filepath t)) + (when (file-regular-p temp-filepath) + (add-to-list 'files temp-filepath t)))) + + (when (cl-some (lambda (file) + (member (file-name-extension file) load-extension)) + files) + (add-to-list 'load-path dir t)) + (mapc #'add-dir-and-subdirs-to-load-path subdirs))) + +(defun add-pkg-in-pkg-dir (pkg) + "Add PKG located in `creature/pkg-dir' to `load-path'." + (add-dir-and-subdirs-to-load-path (expand-file-name pkg creature/pkg-dir))) + +(add-to-list 'load-path creature/pkg-dir t) + +;; add basic packages +(add-pkg-in-pkg-dir "lazy-load") + +;; builtin maybe exist +;; "compat" "transient" +(dolist (pkg '("compat" "transient")) + (unless (locate-library pkg) + (add-pkg-in-pkg-dir))) + +(provide 'init-package) diff --git a/lisp/init-plantuml.el b/lisp/init-plantuml.el index c7dc7ef..323a0c8 100644 --- a/lisp/init-plantuml.el +++ b/lisp/init-plantuml.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "plantuml-mode") +(add-pkg-in-pkg-dir "dash") + (autoload 'plantuml-mode "plantuml-mode" "" t) (add-to-list 'auto-mode-alist '("\\.\\(plantuml\\|pum\\|plu\\)\\'" . plantuml-mode)) diff --git a/lisp/init-prettier.el b/lisp/init-prettier.el index 28af82f..d3f9e2e 100644 --- a/lisp/init-prettier.el +++ b/lisp/init-prettier.el @@ -1,5 +1,14 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "prettier") +(add-pkg-in-pkg-dir "iter2") +(add-pkg-in-pkg-dir "nvm") +(add-pkg-in-pkg-dir "s") +(add-pkg-in-pkg-dir "dash") +(add-pkg-in-pkg-dir "f") +(require 'init-editorconfig) + (autoload 'prettier-mode "prettier" "" t) (defvar-local creature/formatter nil diff --git a/lisp/init-rime.el b/lisp/init-rime.el index f59f77c..3c3defc 100644 --- a/lisp/init-rime.el +++ b/lisp/init-rime.el @@ -1,5 +1,10 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "emacs-rime") +(add-pkg-in-pkg-dir "dash") +(add-pkg-in-pkg-dir "posframe") + (require 'lazy-load) (require 'rime) diff --git a/lisp/init-sdcv.el b/lisp/init-sdcv.el index 1240708..87e623e 100644 --- a/lisp/init-sdcv.el +++ b/lisp/init-sdcv.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "sdcv") +(add-pkg-in-pkg-dir "posframe") + (require 'lazy-load) diff --git a/lisp/init-theme.el b/lisp/init-theme.el index 294b689..1066c69 100644 --- a/lisp/init-theme.el +++ b/lisp/init-theme.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "rainbow-delimiters") +(add-pkg-in-pkg-dir "rainbow-identifiers") + ;; Pulse (defvar creature/pulse-enable t "Whether enable pulse for scroll and switch window.") diff --git a/lisp/init-vertico.el b/lisp/init-vertico.el index c380d29..35ca5aa 100644 --- a/lisp/init-vertico.el +++ b/lisp/init-vertico.el @@ -1,5 +1,19 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "marginalia") +(add-pkg-in-pkg-dir "vertico") +(add-pkg-in-pkg-dir "corfu") +(add-pkg-in-pkg-dir "orderless") +(add-pkg-in-pkg-dir "corfu-doc") +(add-pkg-in-pkg-dir "cape") +(add-pkg-in-pkg-dir "consult") +(add-pkg-in-pkg-dir "emacs-corfu-terminal") +(add-pkg-in-pkg-dir "emacs-popon") +(add-pkg-in-pkg-dir "emacs-corfu-doc-terminal") +(add-pkg-in-pkg-dir "embark") + + (require 'marginalia) (marginalia-mode 1) diff --git a/lisp/init-which-key.el b/lisp/init-which-key.el index 016a640..b8e6f47 100644 --- a/lisp/init-which-key.el +++ b/lisp/init-which-key.el @@ -1,5 +1,9 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(unless (locate-library "which-key") + (add-pkg-in-pkg-dir "emacs-which-key")) + (require 'init-keybindings) (require 'which-key) diff --git a/lisp/init-yasnippet.el b/lisp/init-yasnippet.el index c65e931..0bdd775 100644 --- a/lisp/init-yasnippet.el +++ b/lisp/init-yasnippet.el @@ -1,5 +1,10 @@ ;; -*- coding: utf-8; lexical-binding: t; -*- +(require 'init-package) +(add-pkg-in-pkg-dir "yasnippet") +(add-pkg-in-pkg-dir "yasnippet-snippets") +(add-pkg-in-pkg-dir "auto-yasnippet") + (require 'lazy-load) (require 'yasnippet) (require 'yasnippet-snippets)