mirror of
http://github.com/JaeUs3792/dotfiles
synced 2025-12-14 16:11:34 +09:00
1152 lines
42 KiB
Org Mode
1152 lines
42 KiB
Org Mode
#+TITLE: Emacs Configuration
|
|
#+AUTHOR: JaeYoo-Im, (cpu3792@gmail.com)
|
|
|
|
|
|
* Global Settings
|
|
#+begin_src emacs-lisp
|
|
(defvar gvar/default-font-size 100)
|
|
(defvar gvar/default-variable-font-size 100)
|
|
(defvar gvar/frame-transparency '(80 . 80))
|
|
(setq gc-cons-threshold (* 2 1000 1000))
|
|
(setq user-emacs-directory "~/.cache/emacs")
|
|
(set-default-coding-systems 'utf-8)
|
|
(setq-default tab-width 4)
|
|
(setq-default evil-shift-width tab-width)
|
|
(setq large-file-warning-threshold nil)
|
|
#+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/")))
|
|
;;(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))
|
|
|
|
(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
|
|
#+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
|
|
|
|
|
|
* 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)
|
|
|
|
;; 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))
|
|
#+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
|
|
:ensure t)
|
|
(setq doom_themes-enable-bold t
|
|
doom-themes-enablbe-italic t)
|
|
(load-theme 'doom-palenight t)
|
|
|
|
(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/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/")))
|
|
;; Codebase
|
|
;;(,(all-the-icons-faicon "briefcase" :height 1.1 :v-adjust -0.1)
|
|
;; "Codebase"
|
|
;; "My assigned tickets"
|
|
;; (lambda (&rest _) (browse-url "https://hipo.codebasehq.com/tickets")))
|
|
;; Perspective
|
|
(,(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"))))
|
|
#+end_src
|
|
* Fonts
|
|
#+begin_src emacs-lisp
|
|
(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 "Cantarell" :height gvar/default-variable-font-size :weight 'regular)
|
|
(set-fontset-font t 'hangul (font-spec :family "NanumGothic" :size 15))
|
|
#+end_src
|
|
** Text Scale Key bindings
|
|
#+begin_src emacs-lisp
|
|
;(global-set-key (kbd "C-=") 'text-scale-increase)
|
|
;(global-set-key (kbd "C--") 'text-scale-decrease)
|
|
;(global-set-key (kbd "<C-wheel-up>") 'text-scale-increase)
|
|
;(global-set-key (kbd "<C-wheel-down>") 'text-scale-decrease)
|
|
(use-package default-text-scale
|
|
:defer 1
|
|
:config
|
|
(default-text-scale-mode))
|
|
#+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" '(counsel-recentf :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 a" '(lambda () (interactive) (find-file (expand-file-name "~/Roam/Agenda")))
|
|
"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 "<escape>") '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
|
|
; :after lsp-mode
|
|
; :hook (lsp-mode . company-mode)
|
|
; :bind (:map company-active-map
|
|
; ("<tab>" . company-complete-selection))
|
|
; (:map lsp-mode-map
|
|
; ("<tab>" . company-indent-or-complete-common))
|
|
; :custom
|
|
; (company-minimum-prefix-length 1)
|
|
; (company-idle-delay 0.0))
|
|
|
|
;(use-package company-box
|
|
; :hook (company-mode . company-box-mode))
|
|
|
|
#+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
|
|
* Snippet
|
|
#+begin_src emacs-lisp
|
|
;;(use-package yasnippet
|
|
;; Expand snippets with `C-j', not with `TAB'. Use `TAB' to always
|
|
;; jump to next field, even when company window is active. If there
|
|
;; is need to complete company's selection, use `C-s'
|
|
;; (`company-complete-selection').
|
|
;;:custom
|
|
;;(yas-indent-line nil)
|
|
;;(yas-inhibit-overlay-modification-protection t)
|
|
;;:custom-face
|
|
;;(yas-field-highlight-face ((t (:inherit region))))
|
|
;;:bind*
|
|
;;(("C-j" . yas-expand)
|
|
;; :map yas-minor-mode-map
|
|
;; ("TAB" . nil)
|
|
;; ("<tab>" . nil)
|
|
;; :map yas-keymap
|
|
;; ("TAB" . (lambda () (interactive) (company-abort) (yas-next-field)))
|
|
;; ("<tab>" . (lambda () (interactive) (company-abort) (yas-next-field))))
|
|
;;:hook
|
|
;;(dashboard-after-initialize . yas-global-mode)
|
|
;;(snippet-mode . (lambda () (setq-local require-final-newline nil))))
|
|
#+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
|
|
|
|
* 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
|
|
#+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
|
|
: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
|
|
* 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
|
|
(use-package projectile
|
|
:diminish projectile-mode
|
|
:config (projectile-mode)
|
|
: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/Code")
|
|
(setq projectile-project-search-path '("~/Projects/Code")))
|
|
(setq projectile-switch-project-action #'dw/switch-project-action))
|
|
(use-package counsel-projectile
|
|
:after projectile
|
|
:config (counsel-projectile-mode))
|
|
(ju/leader-key-def
|
|
"p." 'counsel-projectile-find-file
|
|
"ps" 'counsel-projectile-switch-project
|
|
"pg" 'counsel-projectile-rg
|
|
"pp" 'counsel-projectile
|
|
"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" . persp-counsel-switch-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] . counsel-describe-function)
|
|
;; ([remap describe-command] . helpful-command)
|
|
;; ([remap describe-variable] . counsel-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
|
|
#+begin_src emacs-lisp
|
|
(defun efs/org-font-setup ()
|
|
;; Replace list hyphen with dot
|
|
(font-lock-add-keywords 'org-mode
|
|
'(("^ *\\([-]\\) "
|
|
(0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•"))))))
|
|
|
|
;; Set faces for heading levels
|
|
(dolist (face '((org-level-1 . 1.5)
|
|
(org-level-2 . 1.4)
|
|
(org-level-3 . 1.3)
|
|
(org-level-4 . 1.2)
|
|
(org-level-5 . 1.1)
|
|
(org-level-6 . 1.0)
|
|
(org-level-7 . 1.0)
|
|
(org-level-8 . 1.0)))
|
|
(set-face-attribute (car face) nil :font "Cantarell" :weight 'regular :height (cdr face)))
|
|
|
|
;; Ensure that anything that should be fixed-pitch in Org files appears that way
|
|
(set-face-attribute 'org-block nil :foreground nil :inherit 'fixed-pitch)
|
|
(set-face-attribute 'org-table nil :inherit 'fixed-pitch)
|
|
(set-face-attribute 'org-formula nil :inherit 'fixed-pitch)
|
|
(set-face-attribute 'org-code nil :inherit '(shadow fixed-pitch))
|
|
(set-face-attribute 'org-table nil :inherit '(shadow fixed-pitch))
|
|
(set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
|
|
(set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
|
|
(set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
|
|
(set-face-attribute 'org-checkbox nil :inherit 'fixed-pitch)
|
|
(set-face-attribute 'line-number nil :inherit 'fixed-pitch)
|
|
(set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch))
|
|
|
|
(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-ellipsis " ▾")
|
|
|
|
(setq org-agenda-start-with-log-mode t)
|
|
(setq org-log-done 'time)
|
|
(setq org-log-into-drawer t)
|
|
|
|
(setq org-agenda-files
|
|
'("/home/jaeus/Roam/Agenda/Agenda-2021-6th.org"))
|
|
|
|
;(require 'org-habit)
|
|
;(add-to-list 'org-modules 'org-habit)
|
|
;(setq org-habit-graph-column 60)
|
|
|
|
;(setq org-todo-keywords
|
|
; '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)")
|
|
; (sequence "BACKLOG(b)" "PLAN(p)" "READY(r)" "ACTIVE(a)" "REVIEW(v)" "WAIT(w@/!)" "HOLD(h)" "|" "COMPLETED(c)" "CANC(k@)")))
|
|
|
|
;(setq org-refile-targets
|
|
; '(("Archive.org" :maxlevel . 1)
|
|
; ("Tasks.org" :maxlevel . 1)))
|
|
|
|
;;; Save Org buffers after refiling!
|
|
;(advice-add 'org-refile :after 'org-save-all-org-buffers)
|
|
|
|
;(setq org-tag-alist
|
|
; '((:startgroup)
|
|
; ; Put mutually exclusive tags here
|
|
; (:endgroup)
|
|
; ("@errand" . ?E)
|
|
; ("@home" . ?H)
|
|
; ("@work" . ?W)
|
|
; ("agenda" . ?a)
|
|
; ("planning" . ?p)
|
|
; ("publish" . ?P)
|
|
; ("batch" . ?b)
|
|
; ("note" . ?n)
|
|
; ("idea" . ?i)))
|
|
|
|
;; Configure custom agenda views
|
|
;(setq org-agenda-custom-commands
|
|
; '(("d" "Dashboard"
|
|
; ((agenda "" ((org-deadline-warning-days 7)))
|
|
; (todo "NEXT"
|
|
; ((org-agenda-overriding-header "Next Tasks")))
|
|
; (tags-todo "agenda/ACTIVE" ((org-agenda-overriding-header "Active Projects")))))
|
|
|
|
; ("n" "Next Tasks"
|
|
; ((todo "NEXT"
|
|
; ((org-agenda-overriding-header "Next Tasks")))))
|
|
|
|
; ("W" "Work Tasks" tags-todo "+work-email")
|
|
|
|
; ;; Low-effort next actions
|
|
; ("e" tags-todo "+TODO=\"NEXT\"+Effort<15&+Effort>0"
|
|
; ((org-agenda-overriding-header "Low Effort Tasks")
|
|
; (org-agenda-max-todos 20)
|
|
; (org-agenda-files org-agenda-files)))
|
|
|
|
; ("w" "Workflow Status"
|
|
; ((todo "WAIT"
|
|
; ((org-agenda-overriding-header "Waiting on External")
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "REVIEW"
|
|
; ((org-agenda-overriding-header "In Review")
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "PLAN"
|
|
; ((org-agenda-overriding-header "In Planning")
|
|
; (org-agenda-todo-list-sublevels nil)
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "BACKLOG"
|
|
; ((org-agenda-overriding-header "Project Backlog")
|
|
; (org-agenda-todo-list-sublevels nil)
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "READY"
|
|
; ((org-agenda-overriding-header "Ready for Work")
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "ACTIVE"
|
|
; ((org-agenda-overriding-header "Active Projects")
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "COMPLETED"
|
|
; ((org-agenda-overriding-header "Completed Projects")
|
|
; (org-agenda-files org-agenda-files)))
|
|
; (todo "CANC"
|
|
; ((org-agenda-overriding-header "Cancelled Projects")
|
|
; (org-agenda-files org-agenda-files)))))))
|
|
|
|
;(setq org-capture-templates
|
|
; `(("t" "Tasks / Projects")
|
|
; ("tt" "Task" entry (file+olp "~/Projects/Code/emacs-from-scratch/OrgFiles/Tasks.org" "Inbox")
|
|
; "* TODO %?\n %U\n %a\n %i" :empty-lines 1)
|
|
|
|
; ("j" "Journal Entries")
|
|
; ("jj" "Journal" entry
|
|
; (file+olp+datetree "~/Projects/Code/emacs-from-scratch/OrgFiles/Journal.org")
|
|
; "\n* %<%I:%M %p> - Journal :journal:\n\n%?\n\n"
|
|
; ;; ,(dw/read-file-as-string "~/Notes/Templates/Daily.org")
|
|
; :clock-in :clock-resume
|
|
; :empty-lines 1)
|
|
; ("jm" "Meeting" entry
|
|
; (file+olp+datetree "~/Projects/Code/emacs-from-scratch/OrgFiles/Journal.org")
|
|
; "* %<%I:%M %p> - %a :meetings:\n\n%?\n\n"
|
|
; :clock-in :clock-resume
|
|
; :empty-lines 1)
|
|
|
|
; ("w" "Workflows")
|
|
; ("we" "Checking Email" entry (file+olp+datetree "~/Projects/Code/emacs-from-scratch/OrgFiles/Journal.org")
|
|
; "* Checking Email :email:\n\n%?" :clock-in :clock-resume :empty-lines 1)
|
|
|
|
; ("m" "Metrics Capture")
|
|
; ("mw" "Weight" table-line (file+headline "~/Projects/Code/emacs-from-scratch/OrgFiles/Metrics.org" "Weight")
|
|
; "| %U | %^{Weight} | %^{Notes} |" :kill-buffer t)))
|
|
|
|
;(define-key global-map (kbd "C-c j")
|
|
; (lambda () (interactive) (org-capture nil "jj")))
|
|
|
|
(efs/org-font-setup))
|
|
(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)))
|
|
|
|
(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 '("py" . "src python")))
|
|
#+end_src
|
|
|
|
** Org Roam
|
|
#+begin_src emacs-lisp
|
|
(use-package org-roam
|
|
:straight t
|
|
:hook
|
|
(after-init . org-roam-mode)
|
|
:custom
|
|
(org-roam-directory "~/Roam/")
|
|
(org-roam-completion-everywhere t)
|
|
(org-roam-completion-system 'ivy))
|
|
#+end_src
|
|
** Org Roam Server
|
|
#+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 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
|
|
* 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
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX")
|
|
|
|
(set-face-foreground 'git-gutter-fr:modified "LightGoldenrod")
|
|
(fringe-helper-define 'git-gutter-fr:modified nil
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX")
|
|
|
|
(set-face-foreground 'git-gutter-fr:deleted "LightCoral")
|
|
(fringe-helper-define 'git-gutter-fr:deleted nil
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
".........."
|
|
".........."
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX"
|
|
"XXXXXXXXXX")
|
|
|
|
;; 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
|
|
|
|
* 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 shell
|
|
(when (not (package-installed-p 'exec-path-from-shell))
|
|
(package-refresh-contents)
|
|
(package-install '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 "<home>") '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
|
|
|
|
* App Launcher
|
|
#+begin_src emacs-lisp
|
|
(straight-use-package
|
|
'(app-launcher :type git :host github :repo "SebastienWae/app-launcher"))
|
|
#+end_src
|
|
|
|
* Dired
|
|
#+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 ranger)
|
|
(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))
|
|
|
|
#+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
|
|
|
|
* 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
|