#+TITLE: Emacs Configuration #+AUTHOR: JaeYoo-Im, (cpu3792@gmail.com) * Global Settings | 12345678 | | |----------+---| | 일이삼사 | | #+begin_src emacs-lisp ;; -*- lexical-binding: t; -*- ;;User (setq user-full-name "JaeYoo,Im" user-mail-address "cpu3792@gmail.com") ;; os (setq custom-file (make-temp-file "emacs-custom")) (setq windows? (eq system-type 'windows-nt)) (setq mac? (eq system-type 'darwin)) (setq large-file-warning-threshold nil) (setq system-time-locale "C") (setenv "LANG" "en_US.UTF-8") (setenv "LC_ALL" "en_US.UTF-8") ;; theme var (defvar gvar/default-font-size 110) (defvar gvar/default-variable-font-size 110) (defvar gvar/frame-transparency '(75 . 75)) ;;dir (setq user-emacs-directory "~/.cache/emacs") ;; encoding (set-language-environment "Korean") (set-default-coding-systems 'utf-8) (prefer-coding-system 'utf-8) ;; tab (setq-default tab-width 4) (setq-default evil-shift-width tab-width) (setq-default indent-tabs-mode nil) ;; font (defun available-font? (font) (member font (font-family-list))) #+end_src * Package Related ** Package Repo #+begin_src emacs-lisp (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("elpa" . "https://elpa.gnu.org/packages/") ("nongnu" . "https://elpa.nongnu.org/nongnu/"))) ;;(unless package-archive-contents ;; (package-refresh-contents)) (package-initialize) #+end_src ** use-package #+begin_src emacs-lisp ;; Initialize use-package on non-Linux platforms (unless (package-installed-p 'use-package) (package-install 'use-package)) (when (not (package-installed-p 'use-package)) (package-refresh-contents) (package-install 'use-package)) (require 'use-package) (setq use-package-always-ensure t) ;;(use-package auto-package-update ;; :custom ;; (auto-package-update-interval 7) ;; (auto-package-update-prompt-before-update t) ;; (auto-package-update-hide-results t) ;; :config ;; (auto-package-update-maybe) ;; (auto-package-update-at-time "09:00")) #+end_src ** Straight https://github.com/raxod502/straight.el #+begin_src emacs-lisp (defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory)) (bootstrap-version 5)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) (setq straight-use-package-by-default t) ;; Use package install from git (straight-use-package 'use-package) #+end_src * No-Littering #+begin_src emacs-lisp (use-package no-littering) ; make ~/.emacs.d clean ;; 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))) (setq inhibit-startup-message t) #+end_src * Performance Optimization ** Garbage Collection + Doom Emacs #+begin_src emacs-lisp ;; (setq gc-cons-threshold most-positive-fixnum) ;; (defconst 1mb 1048576) ;; (defconst 20mb 20971520) ;; (defconst 30mb 31457280) ;; (defconst 50mb 52428800) ;; ;; (defun fk/defer-garbage-collection () ;; (setq gc-cons-threshold most-positive-fixnum)) ;; ;; (defun fk/restore-garbage-collection () ;; (run-at-time 1 nil (lambda () (setq gc-cons-threshold 30mb)))) ;; ;; (add-hook 'emacs-startup-hook 'fk/restore-garbage-collection 100) ;; (add-hook 'minibuffer-setup-hook 'fk/defer-garbage-collection) ;; (add-hook 'minibuffer-exit-hook 'fk/restore-garbage-collection) ;; ;; (setq read-process-output-max 1mb) ;; lsp-mode's performance suggest #+end_src + Derek's #+begin_src emacs-lisp ;; Using garbage magic hack. (use-package gcmh :config (gcmh-mode 1)) ;; Setting garbage collection threshold (setq gc-cons-threshold 402653184 gc-cons-percentage 0.6) ;; Profile emacs startup (add-hook 'emacs-startup-hook (lambda () (message "*** Emacs loaded in %s with %d garbage collections." (format "%.2f seconds" (float-time (time-subtract after-init-time before-init-time))) gcs-done))) ;; Silence compiler warnings as they can be pretty disruptive (setq comp-async-report-warnings-errors nil) #+end_src * EVIL Mode #+begin_src emacs-lisp (defun ju/evil-hook() (dolist (mode '(custom-mode erc-mode)) (add-to-list 'evil-emacs-state-modes mode))) (use-package undo-tree :init (global-undo-tree-mode 1)) (use-package evil :ensure t :init (setq evil-want-integration t) (setq evil-want-keybinding nil) (setq evil-want-C-u-scroll t) (setq evil-want-C-i-jump nil) (setq evil-undo-system 'undo-tree) :config (add-hook 'evil-mode-hook 'ju/evil-hook) (evil-mode 1) (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) ;;(setq-default evil-symbol-word-search t) ;; evil can identify the word with underscore. ;; Http://blog.binchen.org/posts/auto-complete-word-in-emacs-mini-buffer-when-using-evil.html ;;(defun minibuffer-inactive-mode-hook-setup () ;;;; make `try-expand-dabbrev' from `hippie-expand' work in mini-buffer ;;;; @see `he-dabbrev-beg', so we need re-define syntax for '/' ;;(set-syntax-table (let* ((table (make-syntax-table))) ;;(modify-syntax-entry ?/ "." table) ;;table))) ;;(add-hook 'minibuffer-inactive-mode-hook 'minibuffer-inactive-mode-hook-setup) ;; Use visual line motions even outside of visual-line-mode buffers (evil-global-set-key 'motion "j" 'evil-next-visual-line) (evil-global-set-key 'motion "k" 'evil-previous-visual-line) (evil-set-initial-state 'messages-buffer-mode 'normal) (evil-set-initial-state 'dashboard-mode 'normal)) (use-package evil-numbers :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)) (use-package evil-nerd-commenter :after evil :config (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-collection :after evil :ensure t :config (evil-collection-init)) (modify-syntax-entry ?_ "w") ;;(defalias 'forward-evil-word 'forward-evil-symbol) ;; include underscore to word #+end_src ** TODO Check Tips https://github.com/noctuid/evil-guide https://nathantypanski.com/blog/2014-08-03-a-vim-like-emacs-config.html * GUI ** Initial Configuration #+begin_src emacs-lisp (scroll-bar-mode -1) ; Disable visible scrollbar (tool-bar-mode -1) ; Disable the toolbar (tooltip-mode -1) ; Disable tooltips (set-fringe-mode 10) ; Give some breathing room (menu-bar-mode -1) ; Disable the menu bar ;;(setq visible-bell t) #+end_src ** Line number #+begin_src emacs-lisp (column-number-mode) (global-display-line-numbers-mode t) ;; Disable line numbers for some modes (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)))) #+end_src * Theme #+begin_src emacs-lisp (use-package doom-themes :init (setq doom_themes-enable-bold t doom-themes-enablbe-italic t) :config ;;(load-theme 'doom-material t) ;;(load-theme 'doom-palenight t) ;;(load-theme 'doom-gruvbox t) (load-theme 'doom-one t) ;; Enable flashing mode-line on errors (doom-themes-visual-bell-config) ;; Corrects (and improves) org-mode's native fontification. (doom-themes-org-config)) ;; hilight line at the cursor. (global-hl-line-mode t) (use-package beacon :straight t :config (beacon-mode)) (use-package doom-modeline :init (doom-modeline-mode 1) :custom ((doom-modeline-height 15))) ;; Set frame transparency (set-frame-parameter (selected-frame) 'alpha gvar/frame-transparency) (add-to-list 'default-frame-alist `(alpha . ,gvar/frame-transparency)) ;;(set-frame-parameter (selected-frame) 'fullscreen 'maximized) ;;(add-to-list 'default-frame-alist '(fullscreen . maximized)) #+end_src * Dashboard #+begin_src emacs-lisp (use-package dashboard :ensure t :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!") ;;(dashboard-startup-banner 'logo) (setq dashboard-startup-banner "/home/jaeus/.emacs.d/logos/black-hole.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*"))) #+end_src * Fonts | 12345678 | | |----------+---| | 일이삼사 | | #+begin_src emacs-lisp ;; NanumGothicCoding ;;(add-to-list 'default-frame-alist `(font . "NanumGothicCoding")) ;;(set-face-attribute 'default nil :font "NanumGothicCoding" :height gvar/default-font-size) ;;(set-face-attribute 'fixed-pitch nil :font "NanumGothicCoding" :height gvar/default-font-size) ;;(set-face-attribute 'variable-pitch nil :font "NanumGothicCoding" :height gvar/default-variable-font-size :weight 'regular) ;;(set-fontset-font t 'hangul (font-spec :family "NanumGothicCoding" :height gvar/default-font-size)) ;; D2Coding ;;(add-to-list 'default-frame-alist `(font . "D2Coding")) ;;(set-face-attribute 'default nil :font "D2Coding" :height gvar/default-font-size) ;;(set-face-attribute 'fixed-pitch nil :font "D2Coding" :height gvar/default-font-size) ;;(set-face-attribute 'variable-pitch nil :font "D2Coding" :height gvar/default-variable-font-size :weight 'regular) ;;(set-fontset-font t 'hangul (font-spec :family "D2Coding" :height gvar/default-font-size)) ;; Fira Code Retina(English) / D2Coding(Hangul) - Fixed pitch only (add-to-list 'default-frame-alist `(font . "Fira Code Retina")) (set-face-attribute 'default nil :font "Fira Code Retina" :height gvar/default-font-size) (set-face-attribute 'fixed-pitch nil :font "Fira Code Retina" :height gvar/default-font-size) (set-face-attribute 'variable-pitch nil :font "Fira Code Retina" :height gvar/default-variable-font-size :weight 'regular) (set-fontset-font t 'hangul (font-spec :family "D2Coding" :height gvar/default-font-size)) (setq face-font-rescale-alist '(("D2Coding" . 1.25))) ;; Dejavu Sans Mono(English) / D2Coding(Hangul) - Fixed pitch only ;;(add-to-list 'default-frame-alist `(font . "Dejavu Sans Mono")) ;;(set-face-attribute 'default nil :font "Dejavu Sans Mono" :height gvar/default-font-size) ;;(set-face-attribute 'fixed-pitch nil :font "Dejavu Sans Mono" :height gvar/default-font-size) ;;(set-face-attribute 'variable-pitch nil :font "Dejavu Sans Mono" :height gvar/default-variable-font-size :weight 'regular) ;;(set-fontset-font t 'hangul (font-spec :family "D2Coding" :height gvar/default-font-size)) ;;(setq face-font-rescale-alist ;; '(("D2Coding" . 1.25))) ;;(setq-default line-spacing 2) ;;(global-prettify-symbols-mode +1) #+end_src * Whitespace This makes nov to ugly #+begin_src emacs-lisp ;; somtimes need to check white space. this configuration will be helpful ;;(custom-set-faces ;; ;; custom-set-faces was added by Custom. ;; ;; If you edit it by hand, you could mess it up, so be careful. ;; ;; Your init file should contain only one such instance. ;; ;; If there is more than one, they won't work right. ;; '(whitespace-line ((nil (:bold t :background "yellow")))) ;; '(whitespace-tab ((nil (:bold t :background "linen")))) ;; '(whitespace-trailing ((nil (:bold t :background "red1"))))) ;;(global-whitespace-mode t) ;;(add-hook ;; 'after-change-major-mode-hook ;; '(lambda () ;; (setq whitespace-line-column nil ;; whitespace-style '(face trailing)))) ;;(add-hook 'before-save-hook 'delete-trailing-whitespace) #+end_src * Emojify #+begin_src emacs-lisp (use-package emojify :hook (after-init . global-emojify-mode)) #+end_src * Which Key #+begin_src emacs-lisp (use-package which-key :defer 0 :diminish which-key-mode :config (which-key-mode) (setq which-key-idle-delay 0.5)) #+end_src * General Key Binding #+begin_src emacs-lisp (use-package general :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")) (ju/leader-key-def "." 'find-file ;; Buffer "b" '(:ignore t :which-key "buffer handling") "b b" '(ibuffer :which-key "IBuffer") "b k" '(kill-current-buffer :which-key "Kill current buffer") "b n" '(next-buffer :which-key "Next buffer") "b p" '(previous-buffer :which-key "Previous buffer") "b B" '(ibuffer-list-buffers :which-key "IBuffer List Buffers") "b K" '(kill-buffer :which-key "IBuffer Kill Buffers") ;; Eshell "e h" '(counsel-esh-history :which "Kill history") "e s" '(eshell :which "run eshell") ;; Workspace ;; Counsel "f" '(:ignore t :which-key "file op.") "f r" '(consult-recent-file :which-key "Recent files") "f R" '(revert-buffer :which-key "Revert Buffer") "t t" '(toggle-truncate-lines :which-key "Toggle truncate lines") ;; Shortcut "f d d" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.d/desktop.org")) :which-key "open exwm config") "f d e" '(lambda () (interactive) (find-file (expand-file-name "~/.emacs.d/emacs.org")) :which-key "open emacs config")) #+end_src #+begin_src emacs-lisp ;; Key binding ;; 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-\ #+end_src * Auto Save & reverting #+begin_src emacs-lisp (use-package diminish) (use-package super-save :defer 1 :diminish super-save-mode :config (super-save-mode +1) (setq super-save-auto-save-when-idle t)) (setq global-auto-revert-non-file-buffers t) (global-auto-revert-mode 1) #+end_src * Tramp #+begin_src emacs-lisp ;; tramp default is scp (setq tramp-default-method "ssh") #+end_src * Company #+begin_src emacs-lisp (use-package company :init (add-hook 'after-init-hook 'global-company-mode) :bind (:map company-active-map ("" . company-complete-selection)) (:map lsp-mode-map ("" . company-indent-or-complete-common)) :config (setq company-idle-delay 0 company-show-numbers "on" company-dabbrev-downcase nil ) (add-to-list 'company-backends 'org-keyword-backend) ) ;;(use-package company ;;:after lsp-mode ;;:hook (lsp-mode . company-mode) ;;:bind (:map company-active-map ;;("" . company-complete-selection)) ;;(:map lsp-mode-map ;;("" . company-indent-or-complete-common)) ;;:custom ;;(company-minimum-prefix-length 1) ;;(setq company-show-numbers "on") ;;(company-idle-delay 0.0)) ;;(use-package company-box ;;:hook (company-mode . company-box-mode)) #+end_src + ORG mode =#+= Candidates https://emacs.stackexchange.com/a/30691 #+begin_src emacs-lisp (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))) #+end_src ** Prescient #+begin_src emacs-lisp (use-package prescient :hook (dashboard-after-initialize . prescient-persist-mode)) ;;(use-package company-prescient ;; :after company ;; :config (company-prescient-mode)) #+end_src * FlyCheck #+begin_src emacs-lisp (use-package flycheck :ensure t :defer t :init (global-flycheck-mode t)) #+end_src * Yasnippet #+begin_src emacs-lisp (use-package yasnippet-snippets) (use-package yasnippet :init (defvar yas-snippet-dirs nil) :hook (prog-mode . yas-minor-mode) :config (add-to-list 'yas-snippet-dirs "~/.emacs.d/snippets") (yas-global-mode 1)) (ju/leader-key-def "i" '(:ignore t :which-key "insert something.") "is" '(yas-insert-snippet :which-key "snippet") "ie" '(emojify-insert-emoji :which-key "emoji")) #+end_src * World Time #+begin_src emacs-lisp (setq display-time-world-list '(("Etc/UTC" "UTC") ("Asia/Seoul" "Seoul") ("Asia/Shanghai" "Shanghai"))) (setq display-time-world-time-format "%a, %d %b %I:%M %p %Z") #+end_src * IVY Related ** IVY #+begin_src emacs-lisp ;; (use-package ivy ;; :diminish ;; :bind (("C-s" . swiper) ;; :map ivy-minibuffer-map ;; ("TAB" . ivy-alt-done) ;; ("C-l" . ivy-alt-done) ;; ("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-rich ;; :after ivy ;; :init ;; (ivy-rich-mode 1) ;; (ivy-rich-project-root-cache-mode 1)) ;; ;; (use-package ivy-posframe ;; ;;:disabled ;; :after ivy ;; :diminish ;; :init ;; (setq ivy-posframe-display-functions-alist ;; '((swiper . ivy-posframe-display-at-point) ;; (emojify-insert-emoji . ivy-display-function-fallback) ;; (t . ivy-posframe-display))) ;; :custom-face ;; (ivy-posframe-border ((t (:background "#ffffff")))) ;; :config ;; (setq ivy-posframe-height-minibuffer nil) ;; (setq ivy-posframe-parameters '((internal-border-width . 1))) ;; (ivy-posframe-mode 1)) ;; ;; (use-package ivy-prescient ;; :after counsel ;; :custom ;; (ivy-prescient-enable-filtering nil) ;; :config ;; ;; Uncomment the following line to have sorting remembered across sessions! ;; ;(prescient-persist-mode 1) ;; (ivy-prescient-mode 1)) ;; (use-package all-the-icons-ivy ;; :init (add-hook 'after-init-hook 'all-the-icons-ivy-setup)) #+end_src ** Counsel #+begin_src emacs-lisp ;; (use-package counsel ;; :bind (("M-x" . counsel-M-x) ;; ;;("C-M-j" . counsel-switch-buffer) ;; :map minibuffer-local-map ;; ("C-r" . 'counsel-minibuffer-history)) ;; :custom ;; (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only) ;; :config ;; ;; Don't use ^ as initial input. Set this here because `counsel' defines more ;; ;; of its own, on top of the defaults. ;; (setq ivy-initial-inputs-alist nil) ;; (counsel-mode 1)) #+end_src * Vertico Related ** Vertico #+begin_src emacs-lisp (use-package vertico :ensure t :bind (:map vertico-map ("C-j" . vertico-next) ("C-k" . vertico-previous)) :custom (vertico-cycle t) :init (vertico-mode)) (use-package savehist :init (savehist-mode)) (use-package marginalia :after vertico :ensure t :custom (marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) :init (marginalia-mode)) (use-package vertico-posframe :after vertico :ensure t :init (setq vertico-posframe-parameters `((left-fringe . 8) (right-fringe . 8) (alpha . 100))) (vertico-posframe-mode 1)) #+end_src ** Orderless #+begin_src emacs-lisp (use-package orderless :init (setq completion-styles '(orderless) completion-category-defaults nil completion-category-overrides '((file (styles . (partial-completion)))))) #+end_src ** Embark #+begin_src emacs-lisp (use-package embark :bind (("C-S-a" . embark-act) :map minibuffer-local-map ("C-d" . embark-act)) :config ;; Show Embark actions via which-key (setq embark-action-indicator (lambda (map) (which-key--show-keymap "Embark" map nil nil 'no-paging) #'which-key--hide-popup-ignore-command) embark-become-indicator embark-action-indicator)) (use-package embark-consult :after embark) #+end_src ** Consult #+begin_src emacs-lisp (defun dw/get-project-root () (when (fboundp 'projectile-project-root) (projectile-project-root))) (use-package consult :demand t :bind (("C-s" . consult-line) ("C-M-l" . consult-imenu) ("C-M-j" . persp-switch-to-buffer*) :map minibuffer-local-map ("C-r" . consult-history)) :custom (consult-project-root-function #'dw/get-project-root) (completion-in-region-function #'consult-completion-in-region)) (use-package consult-dir :straight t :bind (("C-x C-d" . consult-dir) :map vertico-map ("C-x C-d" . consult-dir) ("C-x C-j" . consult-dir-jump-file)) :custom (consult-dir-project-list-function nil)) #+end_src * Avy (like easymotion) #+begin_src emacs-lisp (use-package avy :commands (avy-goto-char avy-goto-word-0 avy-goto-line)) (ju/leader-key-def "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")) #+end_src * Projectile #+begin_src emacs-lisp (defun dw/switch-project-action () "Switch to a workspace with the project name and start `magit-status'." (persp-switch (projectile-project-name)) (magit-status)) (use-package projectile :diminish projectile-mode :config (projectile-mode) (setq projectile-enable-caching t) (setq projectile-indexing-method 'hybrid) :custom ((projectile-completion-system 'ivy)) :bind-keymap ("C-c p" . projectile-command-map) :init ;; NOTE: Set this to the folder where you keep your Git repos! (when (file-directory-p "~/Projects") (setq projectile-project-search-path '("~/Projects"))) (setq projectile-switch-project-action #'dw/switch-project-action)) (use-package counsel-projectile :disabled :after projectile :config (counsel-projectile-mode)) (ju/leader-key-def "p." 'projectile-find-file "ps" 'projectile-switch-project "pg" 'consult-ripgrep "pc" 'projectile-compile-project "pd" 'projectile-dired) ;;(defun dw/switch-project-action () ;; "Switch to a workspace with the project name and start `magit-status'." ;; ;; TODO: Switch to EXWM workspace 1? ;; (persp-switch (projectile-project-name)) ;; (magit-status)) #+end_src * Perspective #+begin_src emacs-lisp (use-package perspective :demand t :bind (("C-M-j" . consult-buffer) ("C-M-k" . persp-switch) ("C-M-n" . persp-next) ("C-x k" . persp-kill-buffer*)) :custom (persp-initial-frame-name "Main") :config ;; Running `persp-mode' multiple times resets the perspective list... (unless (equal persp-mode t) (persp-mode))) #+end_src * Helpful #+begin_src emacs-lisp (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] . describe-function) ([remap describe-command] . helpful-command) ([remap describe-variable] . describe-variable) ([remap describe-key] . helpful-key)) #+end_src * Hydra #+begin_src emacs-lisp ;;(use-package hydra ;; :defer t) ;;(defhydra hydra-text-scale (:timeout 4) ;; "scale text" ;; ("j" text-scale-increase "in") ;; ("k" text-scale-decrease "out") ;; ("f" nil "finished" :exit t)) ;;(gvar/leader-keys ;; "ts" '(hydra-text-scale/body :which-key "scale text")) #+end_src * HI-TOOD #+begin_src emacs-lisp (use-package hl-todo :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)))) #+end_src * Org mode + Initial Setup #+begin_src emacs-lisp (defun efs/org-mode-setup () (org-indent-mode) ;;(variable-pitch-mode 1) (visual-line-mode 1)) (use-package org :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 :after org :hook (org-mode . org-superstar-mode)) (use-package org-attach-screenshot) (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)) (use-package visual-fill-column :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")) (org-reload)) ;; ODT export to docx (setq org-odt-preferred-output-format "docx") ;; Do not ask when run code block (setq org-confirm-babel-evaluate nil) #+end_src ** Org mode Addons #+begin_src emacs-lisp (use-package org-contrib) #+end_src ** Org Roam #+begin_src emacs-lisp (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)) (ju/leader-key-def "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) (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"))) ;; Build the agenda list the first time for the session (my/org-roam-refresh-agenda-list) (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)))) #+end_src ** Org Roam Server + DEPRECATED ( ORG-ROAM V2 ) #+begin_src emacs-lisp ;;(use-package org-roam-server ;; :ensure t ;; :config ;; (setq org-roam-server-host "127.0.0.1" ;; org-roam-server-port 23799 ;; org-roam-server-authenticate nil ;; org-roam-server-export-inline-images t ;; org-roam-server-serve-files t ;; org-roam-server-served-file-extensions '("pdf" "mp4" "ogv") ;; org-roam-server-network-poll t ;; org-roam-server-network-arrows nil ;; org-roam-server-network-label-truncate t ;; org-roam-server-network-label-truncate-length 60 ;; org-roam-server-network-label-wrap-length 20)) #+end_src ** Org Roam UI #+begin_src emacs-lisp (use-package websocket :after org-roam) (use-package org-roam-ui :straight (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out")) :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 t)) #+end_src ** Org present #+begin_src emacs-lisp (defun dw/org-present-prepare-slide () (org-overview) (org-show-entry) (org-show-children)) (defun dw/org-present-hook () (setq-local face-remapping-alist '((default (:height 1.5) variable-pitch) (header-line (:height 4.5) variable-pitch) (org-code (:height 1.55) org-code) (org-verbatim (:height 1.55) org-verbatim) (org-bloc (:height 1.25) org-block) (org-block-begin-line (:height 0.7) org-block))) (setq header-line-format " ") (org-display-inline-images) (dw/org-present-prepare-slide)) (defun dw/org-present-quit-hook () (setq-local face-remapping-alist '((default variable-pitch default))) (setq header-line-format nil) (org-present-small) (org-remove-inline-images)) (defun dw/org-present-prev () (interactive) (org-present-prev) (dw/org-present-prepare-slide)) (defun dw/org-present-next () (interactive) (org-present-next) (dw/org-present-prepare-slide)) (use-package org-present :bind (:map org-present-mode-keymap ("C-c C-j" . dw/org-present-next) ("C-c C-k" . dw/org-present-prev)) :hook ((org-present-mode . dw/org-present-hook) (org-present-mode-quit . dw/org-present-quit-hook))) #+end_src ** Translate in org #+begin_src emacs-lisp (use-package ob-translate :config (setq ob-translate:default-dest "ko")) #+end_src ** Org Noter #+begin_src emacs-lisp (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) #+end_src * Magit #+begin_src emacs-lisp (use-package magit :commands (magit-status magit-get-current-branch) :custom (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)) ;; 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 :after magit) (use-package magit-todos :defer t) (use-package git-link) (ju/leader-key-def "g" 'magit) (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")) #+end_src ** Org mode latex [[https://github.com/GeneKao/orgmode-latex-templates][reference]] #+begin_src emacs-lisp (with-eval-after-load 'ox-latex (add-to-list 'org-latex-classes '("org-plain-latex" "\\documentclass[a4paper,11pt,titlepage]{memoir} \\usepackage{kotex} [NO-DEFAULT-PACKAGES] [PACKAGES] [EXTRA] \\linespread{1.1} \\hypersetup{pdfborder=0 0 0}" ("\\chapter{%s}" . "\\chapter*{%s}") ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) (add-to-list 'org-latex-classes '("ethz" "\\documentclass[a4paper,11pt,titlepage]{memoir} \\usepackage{kotex} \\usepackage[utf8]{inputenc} \\usepackage[T1]{fontenc} \\usepackage{fixltx2e} \\usepackage{graphicx} \\usepackage{longtable} \\usepackage{float} \\usepackage{wrapfig} \\usepackage{rotating} \\usepackage[normalem]{ulem} \\usepackage{amsmath} \\usepackage{textcomp} \\usepackage{marvosym} \\usepackage{wasysym} \\usepackage{amssymb} \\usepackage{hyperref} \\usepackage{mathpazo} \\usepackage{color} \\usepackage{enumerate} \\definecolor{bg}{rgb}{0.95,0.95,0.95} \\tolerance=1000 [NO-DEFAULT-PACKAGES] [PACKAGES] [EXTRA] \\linespread{1.1} \\hypersetup{pdfborder=0 0 0}" ("\\chapter{%s}" . "\\chapter*{%s}") ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) (add-to-list 'org-latex-classes '("article" "\\documentclass[11pt,a4paper]{article} \\usepackage{kotex} \\usepackage[utf8]{inputenc} \\usepackage[T1]{fontenc} \\usepackage{fixltx2e} \\usepackage{graphicx} \\usepackage{longtable} \\usepackage{float} \\usepackage{wrapfig} \\usepackage{rotating} \\usepackage[normalem]{ulem} \\usepackage{amsmath} \\usepackage{textcomp} \\usepackage{marvosym} \\usepackage{wasysym} \\usepackage{amssymb} \\usepackage{hyperref} \\usepackage{mathpazo} \\usepackage{color} \\usepackage{enumerate} \\definecolor{bg}{rgb}{0.95,0.95,0.95} \\tolerance=1000 [NO-DEFAULT-PACKAGES] [PACKAGES] [EXTRA] \\linespread{1.1} \\hypersetup{pdfborder=0 0 0}" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}"))) (add-to-list 'org-latex-classes '("ebook" "\\documentclass[11pt, oneside]{memoir} \\setstocksize{9in}{6in} \\settrimmedsize{\\stockheight}{\\stockwidth}{*} \\setlrmarginsandblock{2cm}{2cm}{*} % Left and right margin \\setulmarginsandblock{2cm}{2cm}{*} % Upper and lower margin \\checkandfixthelayout % Much more laTeX code omitted " ("\\chapter{%s}" . "\\chapter*{%s}") ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}")))) (add-to-list 'org-latex-packages-alist '("" "minted")) (setq org-latex-listings 'minted) ;; Use minted to highlight source code (setq org-latex-minted-options '(("breaklines" "true") ("tabsize" "4") ("autogobble") ("bgcolor" "monokaibg"))) (setq org-latex-pdf-process '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) #+end_src * EDiff #+begin_src emacs-lisp ;; Don't let ediff break EXWM, 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) #+end_src * Rainbow Delimiters #+begin_src emacs-lisp (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) #+end_src * Vterm #+begin_src emacs-lisp (use-package vterm :commands vterm :config (setq term-prompt-regexp "^[^#$%>\n]*[#$%>] *") ;; Set this to match your custom shell prompt ;;(setq vterm-shell "zsh") ;; Set this to customize the shell to launch (setq vterm-max-scrollback 10000)) #+end_src * Eshell ** EXEC-PATH-FROM-SHELL #+begin_src emacs-lisp (use-package exec-path-from-shell) (exec-path-from-shell-initialize) #+end_src ** Config #+begin_src emacs-lisp (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 :after eshell) (use-package eshell :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")))) #+end_src * Dired (from Doom Emacs) #+begin_src emacs-lisp (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 :commands (dired dired-jump)) (use-package diredfl :hook (dired-mode . diredfl-mode)) ;; 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) (use-package diff-hl :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 :config (bind-key "C-c C-r" 'dired-rsync dired-mode-map)) (use-package all-the-icons-dired :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)) ;;(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))) ;;(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) (use-package dired-hide-dotfiles :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)) #+end_src * Openwith #+begin_src emacs-lisp (use-package openwith :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))))) #+end_src * VLF (very large file) #+begin_src emacs-lisp (use-package vlf :config (progn (require 'vlf-setup))) #+end_src * Nov (EPUB file association) #+begin_src emacs-lisp (use-package nov) (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode)) #+end_src * LSP-MODE #+begin_src emacs-lisp (use-package lsp-mode :init ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") (setq lsp-keymap-prefix "C-c l") :hook (;; replace XXX-mode with concrete major-mode(e. g. python-mode) (c++-mode . lsp) (verilog-mode . lsp) ;; if you want which-key integration (lsp-mode . lsp-enable-which-key-integration)) :commands lsp) ;; optionally (use-package lsp-ui :commands lsp-ui-mode) ;; if you are ivy user (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 #+end_src * ELFEED #+begin_src emacs-lisp (use-package elfeed :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/commandline.rss" reddit commandline) ("https://www.reddit.com/r/distrotube.rss" reddit distrotube) ("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://distrowatch.com/news/dwd.xml" distrowatch linux))))) (use-package elfeed-goodies :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) #+end_src * Language Support ** Haskell #+begin_src emacs-lisp (use-package haskell-mode) #+end_src ** Verilog/System verilog using =svlangserver= #+begin_src shell sudo npm install -g @imc-trading/svlangserver paru -S verilator #+end_src ** Rust #+begin_src emacs-lisp (use-package rust-mode) #+end_src ** Markdown #+begin_src emacs-lisp (use-package markdown-mode :disabled :commands (markdown-mode gfm-mode) :mode (("README\\.md\\'" . gfm-mode) ("\\.md\\'" . markdown-mode) ("\\.markdown\\'" . markdown-mode)) :init (setq markdown-command "multimarkdown")) #+end_src ** CMAKE #+begin_src emacs-lisp (use-package cmake-mode) #+end_src ** YAML #+begin_src emacs-lisp (use-package yaml-mode) #+end_src * ETC ** Youtube #+begin_src emacs-lisp (use-package ytel :straight t :config (setq ytel-invidious-api-url "https://invidious.snopyta.org") ) (defun ytel-watch () "Stream video at point in mpv." (interactive) (let* ((video (ytel-get-current-video)) (id (ytel-video-id video))) (start-process "ytel mpv" nil "mpv" (concat "https://www.youtube.com/watch?v=" id)) "--ytdl-format=bestvideo[height<=?720]+bestaudio/best") (message "Starting streaming...")) #+end_src ** Python - prequisite #+begin_src shell paru -S jupyter python-pip pip install matplotlib numpy pandas tabulate #+end_src - configuration for emacs table #+begin_src emacs-lisp (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") #+end_src