From 469e94192059f2d37ecf19701ae3cd1c2b9f8ea2 Mon Sep 17 00:00:00 2001 From: JaeYoo-Im Date: Tue, 22 Mar 2022 18:59:38 +0900 Subject: [PATCH] Emacs : Rational Config --- .emacs-profiles.el | 2 +- .emacs.rational.d/config.el | 828 +++++++++++++++--- .emacs.rational.d/desktop.el | 165 ++++ .../exwm/.start-exwm.sh.~undo-tree~ | 6 + .emacs.rational.d/exwm/EXWM.desktop | 8 + .emacs.rational.d/exwm/start-exwm.sh | 14 + .emacs.rational.d/exwm/start-exwm.sh~ | 14 + .emacs.rational.d/logos/emacs-e.png | Bin 0 -> 3452 bytes scripts/random_wallpaper.sh | 1 + 9 files changed, 899 insertions(+), 139 deletions(-) create mode 100644 .emacs.rational.d/desktop.el create mode 100644 .emacs.rational.d/exwm/.start-exwm.sh.~undo-tree~ create mode 100644 .emacs.rational.d/exwm/EXWM.desktop create mode 100755 .emacs.rational.d/exwm/start-exwm.sh create mode 100755 .emacs.rational.d/exwm/start-exwm.sh~ create mode 100644 .emacs.rational.d/logos/emacs-e.png diff --git a/.emacs-profiles.el b/.emacs-profiles.el index 632f9b2..4b5c702 100644 --- a/.emacs-profiles.el +++ b/.emacs-profiles.el @@ -1,5 +1,5 @@ (("default" . ((user-emacs-directory . "~/.emacs.rational") - (env . (("RATIONAL_EMACS_HOME" . "~/.emacs.rational.d"))))) + (env . (("RATIONAL_EMACS_HOME" . "~/.emacs.rational.d"))))) ("vanilla" . ((user-emacs-directory . "~/.emacs.vanilla"))) ("doom" . ((user-emacs-directory . "~/.emacs.doom") (env . (("DOOMDIR" . "~/.emacs.doom.d"))))) diff --git a/.emacs.rational.d/config.el b/.emacs.rational.d/config.el index 2184f2f..20d17ef 100644 --- a/.emacs.rational.d/config.el +++ b/.emacs.rational.d/config.el @@ -13,17 +13,21 @@ ;;; Code: (require 'rational-defaults) -(require 'rational-screencast) +;;(require 'rational-screencast) (require 'rational-ui) -(require 'rational-editing) +;;(require 'rational-editing) (require 'rational-evil) (require 'rational-completion) -(require 'rational-windows) +;;(require 'rational-windows) (require 'rational-use-package) +(setq user-full-name "JaeYoo-Im" + user-mail-address "cpu3792@gmail.com") + (setq system-time-locale "C") (setenv "LANG" "en_US.UTF-8") (setenv "LC_ALL" "en_US.UTF-8") + ;; Set further font and theme customizations (custom-set-variables '(rational-ui-default-font @@ -37,19 +41,96 @@ (setq face-font-rescale-alist '(("D2Coding" . 1.25))) - +;; Fullscreen (set-frame-parameter (selected-frame) 'fullscreen 'maximized) (add-to-list 'default-frame-alist '(fullscreen . maximized)) -(load-theme 'doom-dracula t) +;; Favorite Themes +(load-theme 'doom-palenight t) +;;(load-theme 'doom-gruvbox t) +;;(load-theme 'doom-one t) +;;(load-theme 'doom-dracula t) + +(straight-use-package 'use-package) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Additional Evil +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; EVIL Numbers +(use-package evil-numbers + :straight t + :after evil + :config + ;; 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)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Additional UI pkg +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Line numbers (column-number-mode) (global-display-line-numbers-mode t) (global-hl-line-mode) +(dolist (mode '(org-mode-hook + vterm-mode-hook + shell-mode-hook + treemacs-mode-hook + dired-mode-hook + eshell-mode-hook)) + (add-hook mode (lambda () (display-line-numbers-mode 0)))) +(use-package rainbow-delimiters + :hook (prog-mode . rainbow-delimiters-mode)) +;; dashboard +(use-package dashboard + :straight t + :after all-the-icons + :init + (setq dashboard-set-heading-icons t) + (setq dashboard-set-file-icons t) + ;;(setq dashboard-banner-logo-title "Emacs is more than a text editor!") + ;;(setq dashboard-startup-banner 'logo) + (setq dashboard-startup-banner "/home/jaeus/.emacs.rational.d/logos/emacs-e.png") + (setq dashboard-center-content t) + (setq dashboard-week-agenda t) + (setq dashboard-agenda-time-string-format "%d/%m/%Y %A %H:%M") + (setq dashboard-items '((recents . 10) + (agenda . 5) + (bookmarks . 5) + ;;(projects . 5) + (registers . 5))) + (setq dashboard-set-navigator t) + ;; Format: "(icon title help action face prefix suffix)" + (setq dashboard-navigator-buttons + `((;; Github + (,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust 0.0) + "Github" + "Browse github" + (lambda (&rest _) (browse-url "https://github.com/JaeYoo-Im/"))) + (,(all-the-icons-octicon "history" :height 1.1 :v-adjust 0.0) + "Reload last session" + "Reload last session" + (lambda (&rest _) (persp-state-load persp-state-default-file)))))) + :config + (dashboard-setup-startup-hook) + (dashboard-modify-heading-icons '((recents . "file-text") + (bookmarks . "book")))) +(setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))) + +(use-package vertico-posframe + :straight t + :disabled + :after vertico + :ensure t + :init + (setq vertico-posframe-parameters + `((left-fringe . 8) + (right-fringe . 8) (alpha . 100))) + (vertico-posframe-mode 1)) -;;; example-config.el ends here -(setq user-full-name "JaeYoo-Im" - user-mail-address "cpu3792@gmail.com") (defun toggle-transparency () (interactive) (let ((alpha (frame-parameter nil 'alpha))) @@ -64,53 +145,32 @@ (global-set-key (kbd "C-c t") 'toggle-transparency) (set-frame-parameter (selected-frame) 'alpha '(75 . 75)) -;; DASHBOARD -(straight-use-package 'dashboard) -(require 'all-the-icons) -(setq dashboard-set-heading-icons t) -(setq dashboard-set-file-icons t) -(setq dashboard-startup-banner 'logo) -(setq dashboard-center-content t) -(setq dashboard-week-agenda t) -(setq dashboard-agenda-time-string-format "%d/%m/%Y %A %H:%M") -(setq dashboard-items '((recents . 10) - (agenda . 5) - (bookmarks . 5) - (registers . 5))) -(setq dashboard-set-navigator t) -;; Format: "(icon title help action face prefix suffix)" -(setq dashboard-navigator-buttons - `(( - (,(all-the-icons-octicon "mark-github" :height 1.1 :v-adjust 0.0) - "Github" - "Browse github" - (lambda (&rest _) (browse-url "https://github.com/JaeUs3792"))) - (,(all-the-icons-octicon "book" :height 1.1 :v-adjust 0.0) - "My Blog" - "Browse Blog" - (lambda (&rest _) (browse-url "https://jaeus.net")))))) -(setq dashboard-set-footer nil) -(dashboard-setup-startup-hook) - - -;; EMOJI -(straight-use-package 'emojify) -(global-emojify-mode) - -;; Which Key -(straight-use-package 'which-key) -(setq which-key-idle-delay 0.5) -(which-key-mode) - - -;; GENERAL KEY MAP -(straight-use-package 'general) -(general-evil-setup t) -(general-create-definer ju/leader-key-def - :keymaps '(normal insert visual emacs) - :prefix "SPC" - :global-prefix "C-SPC") - +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; EMOJIFY ♌ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package emojify + :straight t + :hook (after-init . global-emojify-mode)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Key bindings +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package which-key + :straight t + :defer 0 + :diminish which-key-mode + :config + (which-key-mode) + (setq which-key-idle-delay 0.5)) +(use-package general + :straight t + :ensure t + :config + (general-evil-setup t) + (general-create-definer ju/leader-key-def + :keymaps '(normal insert visual emacs) + :prefix "SPC" + :global-prefix "C-SPC")) +;; General key definer key-prefix SPC (ju/leader-key-def "." 'find-file ;; Buffer @@ -125,6 +185,8 @@ "e" '(:ignore t :which-key "eshell") "e h" '(counsel-esh-history :which "Kill history") "e s" '(eshell :which "run eshell") + ;; Magit + "g" 'magit ;; Workspace ;; Counsel "f" '(:ignore t :which-key "file op.") @@ -133,100 +195,590 @@ "t t" '(toggle-truncate-lines :which-key "Toggle truncate lines") ;; Shortcut "f d d" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.rational.d/desktop.el")) :which-key "open exwm config") - "f d e" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.rational.d/config.el")) :which-key "open emacs config")) + "f d e" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.rational.d/config.el")) :which-key "open emacs config") + ;; Insert something + "i" '(:ignore t :which-key "insert something.") + "ie" '(emojify-insert-emoji :which-key "emoji") + ;; AVY (easymotion) + "v" '(:ignore t :which-key "Avy") + "vc" '(avy-goto-char :which-key "Avy Goto Char") + "vw" '(avy-goto-word-0 :which-key "Avy Goto Word") + "vl" '(avy-goto-line :which-key "Avy Goto Line") + ;; Org mode + "o" '(:ignore t :which-key "Org mode") + "oa" '(:ignore t :which-key "Org Agenda") + "oar" '(my/org-roam-refresh-agenda-list :which-key "Org agenda refresh list") + "oaa" '(org-agenda :which-key "open org agenda") + ;; project.el + "p" '(:ignore t :which-key "Project") + "p." 'project-find-file + "ps" 'project-switch-project + "pg" 'consult-ripgrep + "pc" 'project-compile + "pd" 'project-dired + ;; Org roam + "r" '(:ignore t :which-key "Org Roam") + "ru" 'org-roam-ui-open + "rl" 'org-roam-buffer-toggle + "rf" 'org-roam-node-find + "ri" 'org-roam-node-insert + "rI" 'org-roam-node-insert-immediate + "rp" 'my/org-roam-find-project) +(global-set-key (kbd "C-M-j") 'consult-buffer) +;; Make ESC quit prompts (global-set-key (kbd "") 'keyboard-escape-quit) +;; this annoying binding. (global-unset-key (kbd "C-j")) (global-unset-key (kbd "C-k")) (global-unset-key (kbd "S-SPC")) ;; use only S-\ - - -;; tramp default is scp +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; tramp default is scp +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq tramp-default-method "ssh") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Flycheck +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package flycheck + :straight t + :ensure t + :defer t + :init (global-flycheck-mode t)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; AVY (like easymotion) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package avy + :straight t + :commands (avy-goto-char avy-goto-word-0 avy-goto-line)) -(straight-use-package 'flycheck) -(global-flycheck-mode t) - - -;;(straight-use-package 'vertico-posframe) -;;(setq vertico-posframe-parameters -;; `((left-fringe . 8) -;; (right-fringe . 8) (alpha . 100))) -;;(vertico-posframe-mode 1) - - -;; TODO -(straight-use-package 'hl-todo) -(setq hl-todo-highlight-punctuation ":" - hl-todo-keyword-faces - `(;; For things that need to be done, just not today. - ("TODO" warning bold) - ;; For problems that will become bigger problems later if not - ;; fixed ASAP. - ("FIXME" error bold) - ;; For tidbits that are unconventional and not intended uses of the - ;; constituent parts, and may break in a future update. - ("HACK" font-lock-constant-face bold) - ;; For things that were done hastily and/or hasn't been thoroughly - ;; tested. It may not even be necessary! - ("REVIEW" font-lock-keyword-face bold) - ;; For especially important gotchas with a given implementation, - ;; directed at another user other than the author. - ("NOTE" success bold) - ;; For things that just gotta go and will soon be gone. - ("DEPRECATED" font-lock-doc-face bold) - ;; For a known bug that needs a workaround - ("BUG" error bold) - ;; For warning about a problematic or misguiding code - ("XXX" font-lock-constant-face bold))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Hilight TODO +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package hl-todo + :straight t + :hook (prog-mode . hl-todo-mode) + :hook (yaml-mode . hl-todo-mode) + :config + (setq hl-todo-highlight-punctuation ":" + hl-todo-keyword-faces + `(;; For things that need to be done, just not today. + ("TODO" warning bold) + ;; For problems that will become bigger problems later if not + ;; fixed ASAP. + ("FIXME" error bold) + ;; For tidbits that are unconventional and not intended uses of the + ;; constituent parts, and may break in a future update. + ("HACK" font-lock-constant-face bold) + ;; For things that were done hastily and/or hasn't been thoroughly + ;; tested. It may not even be necessary! + ("REVIEW" font-lock-keyword-face bold) + ;; For especially important gotchas with a given implementation, + ;; directed at another user other than the author. + ("NOTE" success bold) + ;; For things that just gotta go and will soon be gone. + ("DEPRECATED" font-lock-doc-face bold) + ;; For a known bug that needs a workaround + ("BUG" error bold) + ;; For warning about a problematic or misguiding code + ("XXX" font-lock-constant-face bold)))) (global-hl-todo-mode) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Dired +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package dired + :ensure nil + :straight nil + :commands (dired dired-jump) + :bind (("C-x C-j" . dired-jump)) + :custom ((dired-listing-switches "-agho --group-directories-first")) + :config + (evil-collection-define-key 'normal 'dired-mode-map + "h" 'dired-single-up-directory + "l" 'dired-single-buffer)) +(autoload 'dired-omit-mode "dired-x") +(add-hook 'dired-load-hook + (lambda () + (interactive) + (dired-collapse))) +;; to use h,l key +(use-package dired-single + :straight t + :commands (dired dired-jump)) +(use-package diredfl + :straight t + :hook (dired-mode . diredfl-mode)) -;; ORG Mode -(setq org-todo-keywords - '((sequence "TODO(t)" "HOLD(h)" "|" "KILL(k)" "DONE(d)"))) -(setq org-ellipsis " ▾") -(setq org-hide-emphasis-markers t) -(setq org-src-fontify-natively t) -(setq org-fontify-quote-and-verse-blocks t) +;; from doom emacs +(defun +dired-enable-git-info-h () + "Enable `dired-git-info-mode' in git repos." + (and (not (file-remote-p default-directory)) + (locate-dominating-file "." ".git") + (dired-git-info-mode 1))) +(use-package dired-git-info :straight t) +(use-package diff-hl + :straight t + :hook (dired-mode . diff-hl-dired-mode-unless-remote) + :hook (magit-post-refresh . diff-hl-magit-post-refresh) + :config + ;; use margin instead of fringe + (diff-hl-margin-mode)) +(use-package dired-rsync + :straight t + :config + (bind-key "C-c C-r" 'dired-rsync dired-mode-map)) +(use-package all-the-icons-dired + :straight t + :hook (dired-mode . all-the-icons-dired-mode) + :config + ;; HACK Fixes #1929: icons break file renaming in Emacs 27+, because the icon + ;; is considered part of the filename, so we disable icons while we're in + ;; wdired-mode. + ;;(when EMACS27+ + (defvar +wdired-icons-enabled -1)) -(setq org-agenda-start-with-log-mode t) -(setq org-log-done 'time) -(setq org-log-into-drawer t) -(add-hook 'org-mode-hook (lambda () (org-indent-mode))) +;;(defadvice! +dired-disable-icons-in-wdired-mode-a (&rest _) +;; :before #'wdired-change-to-wdired-mode +;; (setq-local +wdired-icons-enabled (if all-the-icons-dired-mode 1 -1)) +;; (when all-the-icons-dired-mode +;; (all-the-icons-dired-mode -1))) -;;(straight-use-package 'org-superstar) -;;(add-hook 'org-mode-hook (lambda () (org-superstar-mode 1))) -(straight-use-package 'org-attach-screenshot) -(straight-use-package 'org-download) -(defun efs/org-mode-visual-fill () - (setq visual-fill-column-width 100 - visual-fill-column-center-text t) - (visual-fill-column-mode 1)) +;;(defadvice! +dired-restore-icons-after-wdired-mode-a (&rest _) +;; :after #'wdired-change-to-dired-mode +;; (all-the-icons-dired-mode +wdired-icons-enabled)))) +;;(use-package fd-dired) -(straight-use-package 'visual-fill-column) -(add-hook 'org-mode-hook (lambda () org-mode . efs/org-mode-visual-fill)) +(use-package dired-hide-dotfiles + :straight t + :hook (dired-mode . dired-hide-dotfiles-mode) + :config + (evil-collection-define-key 'normal 'dired-mode-map + "H" 'dired-hide-dotfiles-mode)) +;;(use-package ranger +;; :config +;; (setq ranger-preview-file t) +;; (setq ranger-show-preview t) +;; (setq ranger-show-literal nil) +;; (ranger-override-dired-mode t)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; OpenWith +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package openwith + :straight t + :after dired + :config + (setq larget-file-warning-threshold nil) + (openwith-mode t) + (setq openwith-associations + (list (list (openwith-make-extension-regexp + '("mpg" "mpeg" "mp3" "mp4" "m4v" + "avi" "wmv" "wav" "mov" "flv" + "ogm" "ogg" "mkv")) + "mpv" + '(file))))) +;;(list (openwith-make-extension-regexp +;; '("pdf")) +;; "evince" +;; '(file))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Magit +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package magit + :straight t + :commands (magit-status magit-get-current-branch) + :custom + (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) -;;(with-eval-after-load 'org -;; (org-babel-do-load-languages -;; 'org-babel-load-languages -;; '((emacs-lisp . t) -;; (python . t) -;; (latex . t))) -;; -;; (push '("conf-unix" . conf-unix) org-src-lang-modes)) -;; -;;(with-eval-after-load 'org -;; ;; This is needed as of Org 9.2 -;; (require 'org-tempo) -;; -;; (add-to-list 'org-structure-template-alist '("sh" . "src shell")) -;; (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) -;; (add-to-list 'org-structure-template-alist '("hs" . "src haskell")) -;; (add-to-list 'org-structure-template-alist '("cc" . "src c")) -;; (add-to-list 'org-structure-template-alist '("cp" . "src c++")) -;; (add-to-list 'org-structure-template-alist '("rs" . "src rust")) -;; (add-to-list 'org-structure-template-alist '("py" . "src python")) -;; (add-to-list 'org-structure-template-alist '("oc" . "src octave")) -;; (add-to-list 'org-structure-template-alist '("vl" . "src verilog")) -;; (add-to-list 'org-structure-template-alist '("vh" . "src vhdl")) +;; NOTE: Make sure to configure a GitHub token before using this package! +;; - https://magit.vc/manual/forge/Token-Creation.html#Token-Creation +;; - https://magit.vc/manual/ghub/Getting-Started.html#Getting-Started +(use-package forge + :straight t + :after magit) +(use-package magit-todos + :straight t + :defer t) +(use-package git-link :straight t) +(use-package git-gutter + :straight git-gutter-fringe + ;;:diminish + :hook ((text-mode . git-gutter-mode) + (prog-mode . git-gutter-mode)) + :config + (setq git-gutter:update-interval 2) + (require 'git-gutter-fringe) + (set-face-foreground 'git-gutter-fr:added "LightGreen") + (fringe-helper-define 'git-gutter-fr:added nil + ".XXXXXX." + "XX....XX" + "X......X" + "X......X" + "XXXXXXXX" + "XXXXXXXX" + "X......X" + "X......X") + + (set-face-foreground 'git-gutter-fr:modified "LightGoldenrod") + (fringe-helper-define 'git-gutter-fr:modified nil + "XXXXXXXX" + "X..XX..X" + "X..XX..X" + "X..XX..X" + "X..XX..X" + "X..XX..X" + "X..XX..X" + "X..XX..X") + + (set-face-foreground 'git-gutter-fr:deleted "LightCoral") + (fringe-helper-define 'git-gutter-fr:deleted nil + "XXXXXX.." + "XX....X." + "XX.....X" + "XX.....X" + "XX.....X" + "XX.....X" + "XX....X." + "XXXXXX..") + + ;; These characters are used in terminal mode + (setq git-gutter:modified-sign "≡") + (setq git-gutter:added-sign "≡") + (setq git-gutter:deleted-sign "≡") + (set-face-foreground 'git-gutter:added "LightGreen") + (set-face-foreground 'git-gutter:modified "LightGoldenrod") + (set-face-foreground 'git-gutter:deleted "LightCoral")) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ORG mode +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun org-keyword-backend (command &optional arg &rest ignored) + (interactive (list 'interactive)) + (cl-case command + (interactive (company-begin-backend 'org-keyword-backend)) + (prefix (and (eq major-mode 'org-mode) + (cons (company-grab-line "^#\\+\\(\\w*\\)" 1) + t))) + (candidates (mapcar #'upcase + (cl-remove-if-not + (lambda (c) (string-prefix-p arg c)) + (pcomplete-completions)))) + (ignore-case t) + (duplicates t))) +(defun efs/org-mode-setup () + (org-indent-mode) + ;;(variable-pitch-mode 1) + (visual-line-mode 1)) + +(use-package org + :straight t + ;;:pin org + :commands (org-capture org-agenda) + :hook (org-mode . efs/org-mode-setup) + :config + + (setq org-todo-keywords + '((sequence "TODO(t)" "HOLD(h)" "|" "KILL(k)" "DONE(d)"))) + (setq org-ellipsis " ▾") + (setq org-hide-emphasis-markers t) + (setq org-src-fontify-natively t) + (setq org-fontify-quote-and-verse-blocks t) + + (setq org-agenda-start-with-log-mode t) + (setq org-log-done 'time) + (setq org-log-into-drawer t) + (setq org-format-latex-options (plist-put org-format-latex-options :scale 1.8))) + + (use-package org-superstar :straight t :after org :hook (org-mode . org-superstar-mode)) + (use-package org-attach-screenshot :straight t) + (use-package org-download :straight t) + + (defun efs/org-mode-visual-fill () + (setq visual-fill-column-width 100 + visual-fill-column-center-text t) + (visual-fill-column-mode 1)) + +(use-package visual-fill-column + :straight t + :hook (org-mode . efs/org-mode-visual-fill)) + +(with-eval-after-load 'org + (org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t) + (python . t) + (latex . t))) + + (push '("conf-unix" . conf-unix) org-src-lang-modes)) + +(with-eval-after-load 'org + ;; This is needed as of Org 9.2 + (require 'org-tempo) + + (add-to-list 'org-structure-template-alist '("sh" . "src shell")) + (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) + (add-to-list 'org-structure-template-alist '("hs" . "src haskell")) + (add-to-list 'org-structure-template-alist '("cc" . "src c")) + (add-to-list 'org-structure-template-alist '("cp" . "src c++")) + (add-to-list 'org-structure-template-alist '("rs" . "src rust")) + (add-to-list 'org-structure-template-alist '("py" . "src python")) + (add-to-list 'org-structure-template-alist '("oc" . "src octave")) + (add-to-list 'org-structure-template-alist '("vl" . "src verilog")) + (add-to-list 'org-structure-template-alist '("vh" . "src vhdl"))) + +;; ODT export to docx +(setq org-odt-preferred-output-format "docx") + +;; Do not ask when run code block +(setq org-confirm-babel-evaluate nil) +(use-package org-contrib :straight t) + +;; translate +(use-package ob-translate + :straight t + :config + (setq ob-translate:default-dest "ko")) + +;; Noter +(use-package pdf-tools + :straight t + :config + (pdf-tools-install) + (setq-default pdf-view-display-size 'fit-width) + (define-key pdf-view-mode-map (kbd "C-s") 'isearch-forward) + :custom + (pdf-annot-activate-created-annotations t "automatically annotate highlights")) +(use-package org-pdfview + :straight t) +(use-package org-noter :straight t) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ORG Roam +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package org-roam + :ensure t + :demand t ;; Ensure org-roam is loaded by default + :init + (setq org-roam-v2-ack t) + :custom + (org-roam-directory "~/Roam") + (org-roam-completion-everywhere t) + + :config + (org-roam-db-autosync-mode)) +;;(org-roam-setup)) + +(defun org-roam-node-insert-immediate (arg &rest args) + (interactive "P") + (let ((args (push arg args)) + (org-roam-capture-templates (list (append (car org-roam-capture-templates) + '(:immediate-finish t))))) + (apply #'org-roam-node-insert args))) + +(defun my/org-roam-filter-by-tag (tag-name) + (lambda (node) + (member tag-name (org-roam-node-tags node)))) + +(defun my/org-roam-list-notes-by-tag (tag-name) + (mapcar #'org-roam-node-file + (seq-filter + (my/org-roam-filter-by-tag tag-name) + (org-roam-node-list)))) + +(defun my/org-roam-refresh-agenda-list () + (interactive) + (setq org-agenda-files (my/org-roam-list-notes-by-tag "Project"))) + + +(defun my/org-roam-project-finalize-hook () + "Adds the captured project file to `org-agenda-files' if the + capture was not aborted." + ;; Remove the hook since it was added temporarily + (remove-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook) + + ;; Add project file to the agenda list if the capture was confirmed + (unless org-note-abort + (with-current-buffer (org-capture-get :buffer) + (add-to-list 'org-agenda-files (buffer-file-name))))) + +(defun my/org-roam-find-project () + (interactive) + ;; Add the project file to the agenda after capture is finished + (add-hook 'org-capture-after-finalize-hook #'my/org-roam-project-finalize-hook) + + ;; Select a project file to open, creating it if necessary + (org-roam-node-find + nil + nil + (my/org-roam-filter-by-tag "Project") + :templates + '(("p" "project" plain "* Goals\n\n%?\n\n* Tasks\n\n** TODO Add initial tasks\n\n* History\n\n* Notes\n\n" + :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+category: ${title}\n#+filetags: Project") + :unnarrowed t)))) + +(add-to-list 'org-after-todo-state-change-hook + (lambda () + (when (equal org-state "DONE") + (my/org-roam-copy-todo-to-today)))) + +(use-package websocket + :straight t + :after org-roam) +(use-package org-roam-ui + :straight t + :after org-roam + ;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have + ;; a hookable mode anymore, you're advised to pick something yourself + ;; if you don't care about startup time, use + ;; :hook (after-init . org-roam-ui-mode) + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start nil)) + +;; Build the agenda list the first time for the session +;;(my/org-roam-refresh-agenda-list) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Language Settings +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(custom-set-variables + '(verilog-indent-level 2) + '(verilog-indent-level-module 0) + '(verilog-indent-level-declaration 0) + '(verilog-indent-level-behavioral 0) + '(verilog-indent-level-directive 0) + '(verilog-cexp-indent 0) + '(verilog-case-indent 2) + + '(verilog-auto-newline nil)) + +(use-package rust-mode :straight t) + +(use-package jupyter + :straight t) +(org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t) ;; Other languages + (shell . t) + ;; Python & Jupyter + (python . t) + (jupyter . t))) +(org-babel-jupyter-override-src-block "python") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; Eshell +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(when (eq system-type 'windows-nt) + (setq explicit-shell-file-name "powershell.exe") + (setq explicit-powershell.exe-args '())) +(defun dw/get-prompt-path () + (let* ((current-path (eshell/pwd)) + (git-output (shell-command-to-string "git rev-parse --show-toplevel")) + (has-path (not (string-match "^fatal" git-output)))) + (if (not has-path) + (abbreviate-file-name current-path) + (string-remove-prefix (file-name-directory git-output) current-path)))) + +(defun dw/eshell-prompt () + (let ((current-branch (magit-get-current-branch))) + (concat + "\n" + (propertize (system-name) 'face `(:foreground "#62aeed")) + (propertize " ॐ " 'face `(:foreground "white")) + (propertize (dw/get-prompt-path) 'face `(:foreground "#82cfd3")) + (when current-branch + (concat + (propertize " • " 'face `(:foreground "white")) + (propertize (concat " " current-branch) 'face `(:foreground "#c475f0")))) + (propertize " • " 'face `(:foreground "white")) + (propertize (format-time-string "%I:%M:%S %p") 'face `(:foreground "#5a5b7f")) + (if (= (user-uid) 0) + (propertize "\n#" 'face `(:foreground "red2")) + (propertize "\nλ" 'face `(:foreground "#aece4a"))) + (propertize " " 'face `(:foreground "white"))))) +(defun efs/configure-eshell () + ;; Save command history when commands are entered + (add-hook 'eshell-pre-command-hook 'eshell-save-some-history) + + ;; Truncate buffer for performance + (add-to-list 'eshell-output-filter-functions 'eshell-truncate-buffer) + + ;; Bind some useful keys for evil-mode + (evil-define-key '(normal insert visual) eshell-mode-map (kbd "C-r") 'counsel-esh-history) + (evil-define-key '(normal insert visual) eshell-mode-map (kbd "") 'eshell-bol) + (evil-normalize-keymaps) + + (setq eshell-prompt-function 'dw/eshell-prompt + eshell-prompt-regexp "^λ " + eshell-history-size 10000 + eshell-buffer-maximum-lines 10000 + eshell-hist-ignoredups t + eshell-scroll-to-bottom-on-input t)) + +(use-package eshell-git-prompt + :straight t + :after eshell) + +(use-package eshell + :straight t + :hook (eshell-first-time-mode . efs/configure-eshell) + :config + + (with-eval-after-load 'esh-opt + (setq eshell-destroy-buffer-when-process-dies t) + (setq eshell-visual-commands '("htop" "zsh" "vim")))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ELFEED (rss) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(use-package elfeed + :straight t + :config + (setq elfeed-search-feed-face ":foreground #fff :weight bold" + elfeed-feeds (quote + (("https://www.reddit.com/r/linux.rss" reddit linux) + ("https://www.reddit.com/r/emacs.rss" reddit emacs) + ("https://www.gamingonlinux.com/article_rss.php" gaming linux) + ("https://hackaday.com/blog/feed/" hackaday linux) + ("https://opensource.com/feed" opensource linux) + ("https://linux.softpedia.com/backend.xml" softpedia linux) + ("https://itsfoss.com/feed/" itsfoss linux) + ("https://www.zdnet.com/topic/linux/rss.xml" zdnet linux) + ("https://www.phoronix.com/rss.php" phoronix linux) + ("http://feeds.feedburner.com/d0od" omgubuntu linux) + ("https://www.computerworld.com/index.rss" computerworld linux) + ("https://www.networkworld.com/category/linux/index.rss" networkworld linux) + ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) + ("https://betanews.com/feed" betanews linux) + ("http://lxer.com/module/newswire/headlines.rss" lxer linux) + ("https://coolenjoy.net/rss?bo_table=38" coolenjoy IT) + ("https://gigglehd.com/gg/ggnews/rss" giggle IT))))) + +(use-package elfeed-goodies + :straight t + :init + (elfeed-goodies/setup) + :config + (setq elfeed-goodies/entry-pane-size 0.5)) + +(add-hook 'elfeed-show-mode-hook 'visual-line-mode) +(evil-define-key 'normal elfeed-show-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +(evil-define-key 'normal elfeed-search-mode-map + (kbd "J") 'elfeed-goodies/split-show-next + (kbd "K") 'elfeed-goodies/split-show-prev) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; ETC +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ediff, keep it in one frame +(setq ediff-diff-options "-w" + ediff-split-window-function 'split-window-horizontally + ediff-window-setup-function 'ediff-setup-windows-plain) + +;; very large file +(use-package vlf + :straight t + :config (progn + (require 'vlf-setup))) + +;; epub +(use-package nov :straight t) +(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)) diff --git a/.emacs.rational.d/desktop.el b/.emacs.rational.d/desktop.el new file mode 100644 index 0000000..79c8041 --- /dev/null +++ b/.emacs.rational.d/desktop.el @@ -0,0 +1,165 @@ +(straight-use-package + '(app-launcher :type git :host github :repo "SebastienWae/app-launcher")) +(defun efs/run-in-background (command) + (let ((command-parts (split-string command "[ ]+"))) + (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts))))) +(defun vifon/exwm-terminal () + (interactive) + (let ((default-directory (if (derived-mode-p 'dired-mode) + (dired-current-directory) + default-directory))) + (start-process "alacritty" nil "alacritty"))) +(defun efs/exwm-init-hook () + ;; Make workspace 1 be the one where we land at startup + (exwm-workspace-switch-create 1) + (efs/start-panel) + (set-frame-parameter (selected-frame) 'alpha '(75 . 75)) + ;; if not wsl + ;;(efs/run-in-background "xsetroot -cursor_name left_ptr") + ;;(efs/run-in-background "nm-applet") + ;;(efs/run-in-background "pamac-tray") + ;;(efs/run-in-background "volumeicon") + ;;(efs/run-in-background "numlockx on") + ;;(efs/run-in-background "blueberry-tray") + ;;(efs/run-in-background "enpass -minimize") + + ;; Launch apps that will run in the background + ;;(efs/run-in-background "fcitx")) +) + +(defun efs/exwm-update-class () + (exwm-workspace-rename-buffer exwm-class-name)) + +(defun efs/exwm-update-title () + (pcase exwm-class-name + ("Firefox" (exwm-workspace-rename-buffer (format "Firefox: %s" exwm-title))))) + +;; This function isn't currently used, only serves as an example how to +;; position a window +(defun efs/position-window () + (let* ((pos (frame-position)) + (pos-x (car pos)) + (pos-y (cdr pos))) + + (exwm-floating-move (- pos-x) (- pos-y)))) + +(use-package exwm + :straight t + :config + ;; Set the default number of workspaces + (setq exwm-workspace-number 10) + + ;; When window "class" updates, use it to set the buffer name + (add-hook 'exwm-update-class-hook #'efs/exwm-update-class) + + ;; When window title updates, use it to set the buffer name + (add-hook 'exwm-update-title-hook #'efs/exwm-update-title) + + ;; Configure windows as they're created + ;;(add-hook 'exwm-manage-finish-hook #'efs/configure-window-by-class) + + ;; When EXWM starts up, do some extra confifuration + (add-hook 'exwm-init-hook #'efs/exwm-init-hook) + + ;; Automatically send the mouse cursor to the selected workspace's display + (setq exwm-workspace-warp-cursor t) + + ;; Window focus should follow the mouse pointer + (setq mouse-autoselect-window t + focus-follows-mouse t) + + (add-hook 'exwm-floating-setup-hook + (lambda () + (exwm-layout-hide-mode-line))) + + ;; These keys should always pass through to Emacs + (setq exwm-input-prefix-keys + '(?\C-x + ?\C-u + ?\C-h + ?\M-x + ?\M-` + ?\M-& + ?\M-: + ?\C-\M-j ;; Buffer list + ?\C-\ )) ;; Ctrl+Space + + ;; Ctrl+Q will enable the next key to be sent directly + (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key) + + ;; Set up global key bindings. These always work, no matter the input state! + ;; Keep in mind that changing this list after EXWM initializes has no effect. + (setq exwm-input-global-keys + `( + ;; Reset to line-mode (C-c C-k switches to char-mode via exwm-input-release-keyboard) + ([?\s-r] . exwm-reset) + + ;; Move between windows + ([?\s-h] . windmove-left) + ([?\s-l] . windmove-right) + ([?\s-k] . windmove-up) + ([?\s-j] . windmove-down) + + ;;([s-space] . toggle-frame-fullscreen) + ([?\s-f] . exwm-floating-toggle-floating) + + ;; Launch applications via shell command + ([?\s-&] . (lambda (command) + (interactive (list (read-shell-command "$ "))) + (start-process-shell-command command nil command))) + + ([?\s-C] . (lambda () (interactive) (kill-buffer))) + + ;; App + (,(kbd "") . vifon/exwm-terminal) + (,(kbd "") . app-launcher-run-app) + ;; Switch workspace + ([?\s-w] . exwm-workspace-switch) + ([?\s-`] . (lambda () (interactive) (exwm-workspace-switch-create 0))) + + ;; 's-N': Switch to certain workspace with Super (Win) plus a number key (0 - 9) + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 9)))) + + (exwm-enable)) + +;; if not wsl +;;(use-package desktop-environment +;; :after exwm +;; :config (desktop-environment-mode) +;; :custom +;; (desktop-environment-brightness-small-increment "2%+") +;; (desktop-environment-brightness-small-decrement "2%-") +;; (desktop-environment-brightness-normal-increment "5%+") +;; (desktop-environment-brightness-normal-decrement "5%-")) + +;; Make sure the server is started (better to do this in your main Emacs config!) +(server-start) + +(defvar efs/polybar-process nil + "Holds the process of the running Polybar instance, if any") + +(defun efs/kill-panel () + (interactive) + (when efs/polybar-process + (ignore-errors + (kill-process efs/polybar-process))) + (setq efs/polybar-process nil)) + +(defun efs/start-panel () + (interactive) + (efs/kill-panel) + (setq efs/polybar-process (start-process-shell-command "polybar" nil "polybar panel"))) + +(defun efs/send-polybar-hook (module-name hook-index) + (start-process-shell-command "polybar-msg" nil (format "polybar-msg hook %s %s" module-name hook-index))) + +(defun efs/send-polybar-exwm-workspace () + (efs/send-polybar-hook "exwm-workspace" 1)) + +;; Update panel indicator when workspace changes +(add-hook 'exwm-workspace-switch-hook #'efs/send-polybar-exwm-workspace) diff --git a/.emacs.rational.d/exwm/.start-exwm.sh.~undo-tree~ b/.emacs.rational.d/exwm/.start-exwm.sh.~undo-tree~ new file mode 100644 index 0000000..2271a37 --- /dev/null +++ b/.emacs.rational.d/exwm/.start-exwm.sh.~undo-tree~ @@ -0,0 +1,6 @@ +(undo-tree-save-format-version . 1) +"e976d2036366e62bb8915b7138e0b4a5fb4918fa" +[nil nil nil nil (25145 39387 666368 202000) 0 nil] +([nil nil ((445 . 454) (t 25145 11614 471859 40000)) nil (25145 39387 666364 698000) 0 nil]) +([nil current ((408 . 416) (#("vanilla" 0 7 (fontified t)) . 408) (undo-tree-id0 . -7) (undo-tree-id1 . -7) (undo-tree-id2 . -7) (undo-tree-id3 . -7) (undo-tree-id4 . -7) (undo-tree-id5 . -6) (undo-tree-id6 . -6) (undo-tree-id7 . -6) (undo-tree-id8 . -6) (undo-tree-id9 . -6) (undo-tree-id10 . -5) (undo-tree-id11 . -5) (undo-tree-id12 . -5) (undo-tree-id13 . -5) (undo-tree-id14 . -5) (undo-tree-id15 . -5) (undo-tree-id16 . -5) (undo-tree-id17 . -5) (undo-tree-id18 . -5) (undo-tree-id19 . -5) (undo-tree-id20 . -6) (undo-tree-id21 . -6) (undo-tree-id22 . -6) (undo-tree-id23 . -6) (undo-tree-id24 . -6) (undo-tree-id25 . -6) (undo-tree-id26 . -6) (undo-tree-id27 . -6) (undo-tree-id28 . -6) (undo-tree-id29 . -6) (undo-tree-id30 . -7) (undo-tree-id31 . -7) (undo-tree-id32 . -7) (undo-tree-id33 . -7) (undo-tree-id34 . -7) (undo-tree-id35 . -7) (undo-tree-id36 . -7) (undo-tree-id37 . -7) (undo-tree-id38 . -7) (undo-tree-id39 . -7) (undo-tree-id40 . -7) (undo-tree-id41 . -7) (undo-tree-id42 . -7) (undo-tree-id43 . -7) (undo-tree-id44 . -7) (undo-tree-id45 . -7) (undo-tree-id46 . -7) (undo-tree-id47 . -6) (undo-tree-id48 . -6) (undo-tree-id49 . -6) (undo-tree-id50 . -6) (undo-tree-id51 . -6) (undo-tree-id52 . -6) (undo-tree-id53 . -6) (undo-tree-id54 . -6) (undo-tree-id55 . -6) (undo-tree-id56 . -6) (undo-tree-id57 . -6) (undo-tree-id58 . -6) (undo-tree-id59 . -6) (undo-tree-id60 . -6) (undo-tree-id61 . -6) (undo-tree-id62 . -5) (undo-tree-id63 . -5) (undo-tree-id64 . -5) (undo-tree-id65 . -5) (undo-tree-id66 . -5) (undo-tree-id67 . -4) (undo-tree-id68 . -4) (undo-tree-id69 . -4) (undo-tree-id70 . -4) (undo-tree-id71 . -4) (undo-tree-id72 . -3) (undo-tree-id73 . -3) (undo-tree-id74 . -3) (undo-tree-id75 . -3) (undo-tree-id76 . -3) (undo-tree-id77 . -2) (undo-tree-id78 . -2) (undo-tree-id79 . -2) (undo-tree-id80 . -2) (undo-tree-id81 . -2) (undo-tree-id82 . -1) (undo-tree-id83 . -1) (undo-tree-id84 . -1) (undo-tree-id85 . -1) (undo-tree-id86 . -1) (undo-tree-id87 . -1) (undo-tree-id88 . -1) (undo-tree-id89 . -1) (undo-tree-id90 . -1) (undo-tree-id91 . -1) (t 25145 39387 681489 213000)) nil (25145 39399 354371 746000) 0 nil]) +nil diff --git a/.emacs.rational.d/exwm/EXWM.desktop b/.emacs.rational.d/exwm/EXWM.desktop new file mode 100644 index 0000000..7a5d2c2 --- /dev/null +++ b/.emacs.rational.d/exwm/EXWM.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=EXWM +Comment=Emacs Window Manager +Exec=sh /home/jaeus/.emacs.d/exwm/start-exwm.sh +TryExec=sh +Type=Application +X-LightDM-DesktopName=exwm +DesktopNames=exwm diff --git a/.emacs.rational.d/exwm/start-exwm.sh b/.emacs.rational.d/exwm/start-exwm.sh new file mode 100755 index 0000000..fb64887 --- /dev/null +++ b/.emacs.rational.d/exwm/start-exwm.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# Set the screen DPI (uncomment this if needed!) +# xrdb ~/.emacs.d/exwm/Xresources + +# Run the screen compositor +#picom & +#picom -b --config /home/jaeus/.config/i3/picom.conf & +# Enable screen locking on suspend +#xss-lock -- slock & + +rm ~/.emacs.d/emacs.el +picom -b --config $HOME/.xmonad/scripts/picom.conf & +~/scripts/random_wallpaper.sh +exec dbus-launch --exit-with-session emacs --with-profile rational -mm --debug-init -l ~/.emacs.rational.d/desktop.el diff --git a/.emacs.rational.d/exwm/start-exwm.sh~ b/.emacs.rational.d/exwm/start-exwm.sh~ new file mode 100755 index 0000000..60279be --- /dev/null +++ b/.emacs.rational.d/exwm/start-exwm.sh~ @@ -0,0 +1,14 @@ +#!/bin/sh +# Set the screen DPI (uncomment this if needed!) +# xrdb ~/.emacs.d/exwm/Xresources + +# Run the screen compositor +#picom & +#picom -b --config /home/jaeus/.config/i3/picom.conf & +# Enable screen locking on suspend +#xss-lock -- slock & + +rm ~/.emacs.d/emacs.el +picom -b --config $HOME/.xmonad/scripts/picom.conf & +~/scripts/random_wallpaper.sh +exec dbus-launch --exit-with-session emacs --with-profile vanilla -mm --debug-init -l ~/.emacs.d/desktop.el diff --git a/.emacs.rational.d/logos/emacs-e.png b/.emacs.rational.d/logos/emacs-e.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5cd633c62dea04fc0ff67c96f7b542a7dfa68c GIT binary patch literal 3452 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 ehsL_|-2Ve4+|8}Q8pNgm0000