2174 lines
64 KiB
Org Mode
2174 lines
64 KiB
Org Mode
#+TITLE: Org Mode Configuration
|
||
#+AUTHOR: h7x4
|
||
#+PROPERTY: header-args :emacs-lisp :tangle yes
|
||
#+STARTUP: org-startup-folded: t
|
||
|
||
#+BEGIN_SRC elisp
|
||
;;; ~/.emacs.d/config.el -*- lexical-binding: t; -*-
|
||
#+END_SRC
|
||
|
||
* Use-package
|
||
|
||
#+BEGIN_SRC elisp
|
||
(setq user-emacs-directory (substitute-in-file-name "$HOME/.emacs.d"))
|
||
|
||
(require 'package)
|
||
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
|
||
|
||
(package-initialize)
|
||
(unless (package-installed-p 'use-package)
|
||
(package-refresh-contents)
|
||
(package-install 'use-package))
|
||
|
||
(require 'use-package)
|
||
(setq use-package-always-ensure t)
|
||
#+END_SRC
|
||
|
||
* Keybindings
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package general
|
||
:config
|
||
(general-evil-setup)
|
||
|
||
(general-create-definer leader-key
|
||
; :states 'normal
|
||
:states 'motion
|
||
:prefix "SPC"
|
||
:non-normal-prefix "C-SPC"))
|
||
;:non-normal-prefix "SPC"))
|
||
#+END_SRC
|
||
|
||
Base keys
|
||
|
||
g - git
|
||
l - lsp
|
||
o - org
|
||
p - project management
|
||
w - multiple cursors
|
||
|
||
#+BEGIN_SRC elisp
|
||
(leader-key
|
||
"" nil
|
||
"c" (general-simulate-key "C-c" :which-key "C-c")
|
||
"u" (general-simulate-key "C-u" :which-key "C-u")
|
||
"x" (general-simulate-key "C-x" :which-key "C-x")
|
||
|
||
"m" '(:ignore t :which-key "mode")
|
||
"mx" 'nil
|
||
|
||
;; Help
|
||
"h" (general-simulate-key "<f1>" :which-key "C-h")
|
||
|
||
;; Insert
|
||
"i" '(:ignore t :which-key "C-h")
|
||
"ix" 'nil
|
||
|
||
;; Package manager
|
||
;; "p" '(:ignore t :which-key "packages")
|
||
;; "pl" 'list-packages
|
||
|
||
;; Quit operations
|
||
"q" '(:ignore t :which-key "quit emacs")
|
||
"qq" 'kill-emacs
|
||
"qz" 'delete-frame
|
||
|
||
;; Buffer operations
|
||
"b" '(:ignore t :which-key "buffer")
|
||
"bb" 'mode-line-other-buffer
|
||
"bk" 'kill-this-buffer
|
||
;; "bn" 'next-buffer
|
||
;; "bp" 'previous-buffer
|
||
"bq" 'kill-buffer-and-window
|
||
;; "bR" 'rename-file-and-buffer
|
||
"br" 'revert-buffer
|
||
|
||
;; Window operations
|
||
"w" '(:ignore t :which-key "window")
|
||
"wm" 'maximize-window
|
||
"wh" 'split-window-horizontally
|
||
"wg" 'split-window-vertically
|
||
;; "wu" 'winner-undo
|
||
"ww" 'other-window
|
||
"wk" 'delete-window
|
||
"wD" 'delete-other-windows
|
||
|
||
;; File operations
|
||
"f" '(:ignore t :which-key "find")
|
||
; "fc" 'write-file
|
||
; "fe" '(:ignore t :which-key "emacs")
|
||
;; "fed" 'find-user-init-file
|
||
;; "feR" 'load-user-init-file
|
||
; "fj" 'dired-jump
|
||
"fl" 'find-file-literally
|
||
;; "fR" 'rename-file-and-buffer
|
||
"fs" 'save-buffer
|
||
|
||
;; Applications
|
||
"a" '(:ignore t :which-key "apps")
|
||
"ad" 'dired
|
||
":" 'shell-command
|
||
";" 'eval-expression
|
||
"ac" 'calendar
|
||
"oa" 'org-agenda)
|
||
#+END_SRC
|
||
|
||
General keys
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
; (global-set-key (kbd "<escape>") 'keyboard-escape-quit)
|
||
(general-define-key
|
||
"<escape>" 'keyboard-escape-quit
|
||
"C-o" 'previous-buffer
|
||
"C-p" 'next-buffer)
|
||
#+END_SRC
|
||
|
||
* Essentials
|
||
** Basic config
|
||
|
||
Stop emacs from using dialog windows
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq use-dialog-box nil)
|
||
#+END_SRC
|
||
|
||
Save sessions
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; (desktop-save-mode 1)
|
||
#+END_SRC
|
||
|
||
Set spacing
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq-default
|
||
tab-width 2
|
||
c-basic-offset 2)
|
||
#+END_SRC
|
||
|
||
Put backup files in emacs.d/temp
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq backup-directory-alist
|
||
`(("." . ,(concat user-emacs-directory "/temp"))))
|
||
#+END_SRC
|
||
|
||
** Evil mode
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package evil
|
||
:demand t
|
||
:init
|
||
(setq evil-want-integration t)
|
||
(setq evil-want-keybinding nil)
|
||
|
||
:general ; (leader-key
|
||
; "wh" '(evil-window-left :which-key "←")
|
||
; "wj" '(evil-window-down :which-key "↓")
|
||
; "wk" '(evil-window-up :which-key "↑")
|
||
; "wl" '(evil-window-right :which-key "→"))
|
||
([remap evil-ex-search-forward] 'swiper)
|
||
([remap evil-ex-search-backward] 'swiper-backward)
|
||
|
||
:bind (
|
||
("C-h" . evil-window-left)
|
||
("C-j" . evil-window-down)
|
||
("C-k" . evil-window-up)
|
||
("C-l" . evil-window-right)
|
||
:map evil-insert-state-map
|
||
("C-g" . evil-normal-state)
|
||
("C-h" . evil-delete-backward-char-and-join))
|
||
|
||
:config
|
||
|
||
;; :q should kill the current buffer rather than quitting emacs entirely
|
||
(evil-ex-define-cmd "q" 'kill-this-buffer)
|
||
;; Need to type out :quit to close emacs
|
||
(evil-ex-define-cmd "quit" 'evil-quit)
|
||
|
||
(evil-set-initial-state 'messages-buffer-mode 'normal)
|
||
(evil-set-initial-state 'dashboard-mode 'normal)
|
||
|
||
(evil-mode 1))
|
||
#+END_SRC
|
||
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package evil-collection
|
||
:after (evil)
|
||
:config
|
||
(evil-collection-init)
|
||
(evil-collection-company-setup))
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package evil-nerd-commenter
|
||
:bind ("M-/" . evilnc-comment-or-uncomment-lines)
|
||
:general (leader-key
|
||
"c" '(evilnc-comment-or-uncomment-lines :which-key "/* */"))
|
||
(general-nmap
|
||
"gc" 'evilnc-comment-operator))
|
||
#+END_SRC
|
||
|
||
Evil escape mode
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package evil-escape
|
||
:after (evil company)
|
||
:diminish evil-escape-mode
|
||
:init
|
||
(with-eval-after-load 'company
|
||
(add-hook 'evil-normal-state-entry-hook #'company-cancel))
|
||
;; (use-package lsp-python-ms
|
||
;; :init (setq
|
||
;; ; (lsp-python-ms-auto-install-server t)
|
||
;; lsp-python-ms-executable (executable-find "mspyls"))
|
||
;; ; :hook (python-mode . (lambda () (require 'lsp-python-ms) (lsp))))
|
||
;; :hook (python-mode . lsp))
|
||
(setq evil-escape-key-sequence "jk"
|
||
evil-escape-unordered-key-sequence t)
|
||
:config
|
||
(evil-escape-mode))
|
||
#+END_SRC
|
||
|
||
** Ivy
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package ivy
|
||
|
||
:bind (
|
||
:map ivy-minibuffer-map
|
||
("M-j" . ivy-next-line)
|
||
("M-k" . ivy-previous-line)
|
||
("M-l" . ivy-alt-done)))
|
||
|
||
;; :general (leader-key
|
||
;; "ij" 'ivy-next-line
|
||
;; "ik" 'ivy-previous-line))
|
||
#+END_SRC
|
||
|
||
Ivy-rich adds extra columns to a few of the Counsel commands to provide more information about each item.
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package ivy-rich
|
||
:config (ivy-rich-mode 1))
|
||
#+END_SRC
|
||
|
||
** Counsel
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package counsel
|
||
:general (leader-key
|
||
"ff" '(counsel-find-file :which-key "find file")
|
||
"f SPC" '(counsel-ag :which-key "Ag")
|
||
"ik" '(counsel-yank-pop :which-key "from kill-ring")
|
||
"bb" '(counsel-ibuffer :which-key "choose buffer")
|
||
"fe" '(counsel-flycheck :which-key "find error"))
|
||
|
||
:bind (("M-x" . counsel-M-x)
|
||
("C-x b" . counsel-ibuffer)
|
||
("C-x C-f" . counsel-find-file)
|
||
:map minibuffer-local-map
|
||
("C-r" . 'counsel-minibuffer-history)))
|
||
#+END_SRC
|
||
|
||
** Org mode
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package org
|
||
:general (leader-key
|
||
"o" '(:ignore t :which-key "org")
|
||
"oa" '(org-agenda :which-key "agenda")
|
||
"ox" '(org-toggle-checkbox :which-key "[X]")
|
||
"oe" '(org-edit-src-code :which-key "Edit SRC")
|
||
; Insert
|
||
"io" '(:ignore t :which-key "org")
|
||
"ios" 'org-insert-structure-template))
|
||
#+END_SRC
|
||
|
||
Improved version of org-bullets
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package org-superstar
|
||
:hook (org-mode-hook . org-superstar-mode)
|
||
:config
|
||
(setq org-startup-indented t) ;; Indent according to section
|
||
(setq org-startup-with-inline-images t)) ;; Display images in-buffer by default
|
||
#+END_SRC
|
||
|
||
Evil bindings for org mode
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package evil-org
|
||
:after (evil org)
|
||
:hook
|
||
(org-mode-hook . evil-org-mode)
|
||
(evil-org-mode-hook . (lambda ()
|
||
(evil-org-set-key-theme '(navigation insert textobjects additional calendar))))
|
||
:config
|
||
(require 'evil-org-agenda)
|
||
(evil-org-agenda-set-keys)
|
||
|
||
(setq org-agenda-files '("~/org/agenda.org"))
|
||
(setq org-directory "~/org/"))
|
||
#+END_SRC
|
||
|
||
** Notes
|
||
*** Project notes
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defvar notes-folder "~/.emacs.d/notes")
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun format-note-path (project-root)
|
||
(concat notes-folder (string-remove-suffix "/" (string-remove-prefix (getenv "HOME") project-root)) ".org"))
|
||
|
||
(defun get-notes ()
|
||
(interactive)
|
||
(if (projectile-project-p)
|
||
(let
|
||
((note-path (format-note-path (projectile-project-root))))
|
||
(unless (file-exists-p note-path)
|
||
(when (y-or-n-p (format "%s does not exist. Create it?" note-path))
|
||
(make-directory (file-name-directory note-path) t)
|
||
(make-empty-file note-path)))
|
||
(find-file note-path))
|
||
;; else
|
||
(message "Couldn't find project folder")))
|
||
|
||
(leader-key
|
||
"fn" '(get-notes :which-key "Get project notes"))
|
||
#+END_SRC
|
||
|
||
** Config files
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq dotfiles '(
|
||
("Emacs" . "~/.emacs.d/config.org")
|
||
("Xmonad" . "~/.xmonad/xmonad.hs")
|
||
("Xmobar" . "~/.config/xmobar/xmobarrc")
|
||
("Awesome" . "~/.config/awesome/rc.lua")
|
||
("Stalonetray" . "~/.stalonetrayrc")
|
||
("Termite" . "~/.config/termite/config")
|
||
("Kitty" . "~/.config/kitty/kitty.conf")
|
||
("Mpd" . "~/.config/mpd/mpd.conf")
|
||
("Ncmpcpp" . "~/.ncmpcpp/config")
|
||
("Nnn" . "~/.config/nnn/")
|
||
("TeX-ntnu" . "~/texmf/tex/latex/local/ntnu.sty")
|
||
("Tmux" . "~/.tmux.conf")
|
||
("Todo" . "~/.todo")
|
||
("Qutebrowser" . "~/.config/qutebrowser/config.py")
|
||
("Vim" . "~/.config/nvim/init.vim")
|
||
("Zsh" . "~/.zshrc")
|
||
("Config-selector" . "~/.scripts/rofi/config-selector")
|
||
("Configfiles" . "~/.scripts/rofi/configfiles")))
|
||
|
||
(defun find-config-file ()
|
||
"Chooses a config-file from dotfiles and opens it in a new buffer"
|
||
(interactive)
|
||
(ivy-read "Config: " dotfiles
|
||
:action (lambda (confpair) (find-file (cdr confpair)))))
|
||
|
||
(leader-key "fc" '(find-config-file :which-key "find config file"))
|
||
#+END_SRC
|
||
|
||
This piece of code is put here in order for config.org to not ask for permission to tangle and reload
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(custom-set-variables
|
||
'(safe-local-variable-values
|
||
'((eval add-hook 'after-save-hook
|
||
(lambda nil
|
||
(if
|
||
(y-or-n-p "Tangle?")
|
||
(org-babel-tangle)))
|
||
nil t)
|
||
(eval add-hook 'after-save-hook
|
||
(lambda nil
|
||
(if
|
||
(y-or-n-p "Reload?")
|
||
(load-file user-init-file)))
|
||
nil t))))
|
||
#+END_SRC
|
||
|
||
* Look and Feel
|
||
** Theme
|
||
doom-theme can be used to set a theme from the doom package
|
||
For every other theme, use load-theme
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package monokai-theme
|
||
:config
|
||
(load-theme 'monokai t))
|
||
#+END_SRC
|
||
|
||
** Centaur-tabs
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package centaur-tabs
|
||
:demand
|
||
:config
|
||
(setq
|
||
centaur-tabs-set-icons t
|
||
centaur-tabs-gray-out-icons 'buffer
|
||
centaur-tabs-height 32
|
||
centaur-tabs-set-modified-marker t
|
||
centaur-tabs-modified-marker "•"
|
||
centaur-tabs-set-bar 'under
|
||
x-underline-at-descent-line t
|
||
centaur-tabs-style "wave")
|
||
|
||
(centaur-tabs-headline-match)
|
||
(centaur-tabs-mode t)
|
||
|
||
; TODO: configure centaur-tabs-active-bar-face and colors
|
||
|
||
:general (leader-key
|
||
"bg" '(centaur-tabs-counsel-switch-group :which-key "choose tab group")
|
||
"b M-p" '(centaur-tabs-backward-group :which-key "previous group")
|
||
"b M-n" '(centaur-tabs-forward-group :which-key "next group")
|
||
"bp" '(centaur-tabs-backward-tab :which-key "previous tab")
|
||
"bn" '(centaur-tabs-forward-tab :which-key "next tab")))
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun centaur-tabs-hide-tab (x)
|
||
"Do no to show buffer X in tabs."
|
||
(let ((name (format "%s" x)))
|
||
(or
|
||
;; Current window is not dedicated window.
|
||
(window-dedicated-p (selected-window))
|
||
|
||
;; Buffer name not match below blacklist.
|
||
(string-prefix-p "*epc" name)
|
||
(string-prefix-p "*helm" name)
|
||
(string-prefix-p "*Helm" name)
|
||
(string-prefix-p "*Compile-Log*" name)
|
||
(string-prefix-p "*lsp" name)
|
||
(string-prefix-p "*company" name)
|
||
(string-prefix-p "*Flycheck" name)
|
||
(string-prefix-p "*tramp" name)
|
||
(string-prefix-p " *Mini" name)
|
||
(string-prefix-p "*help" name)
|
||
(string-prefix-p "*straight" name)
|
||
(string-prefix-p " *temp" name)
|
||
(string-prefix-p "*Help" name)
|
||
(string-prefix-p "*mybuf" name)
|
||
|
||
;; Is not magit buffer.
|
||
(and (string-prefix-p "magit" name)
|
||
(not (file-name-extension name)))
|
||
)))
|
||
#+END_SRC
|
||
|
||
** Modeline
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package doom-modeline
|
||
:init (doom-modeline-mode 1)
|
||
:config
|
||
;; How tall the mode-line should be. It's only respected in GUI.
|
||
;; If the actual char height is larger, it respects the actual height.
|
||
(setq doom-modeline-height 25)
|
||
|
||
;; How wide the mode-line bar should be. It's only respected in GUI.
|
||
(setq doom-modeline-bar-width 3)
|
||
|
||
;; The limit of the window width.
|
||
;; If `window-width' is smaller than the limit, some information won't be displayed.
|
||
(setq doom-modeline-window-width-limit fill-column)
|
||
|
||
;; How to detect the project root.
|
||
;; The default priority of detection is `ffip' > `projectile' > `project'.
|
||
;; nil means to use `default-directory'.
|
||
;; The project management packages have some issues on detecting project root.
|
||
;; e.g. `projectile' doesn't handle symlink folders well, while `project' is unable
|
||
;; to hanle sub-projects.
|
||
;; You can specify one if you encounter the issue.
|
||
(setq doom-modeline-project-detection 'project)
|
||
|
||
;; Determines the style used by `doom-modeline-buffer-file-name'.
|
||
;;
|
||
;; Given ~/Projects/FOSS/emacs/lisp/comint.el
|
||
;; auto => emacs/lisp/comint.el (in a project) or comint.el
|
||
;; truncate-upto-project => ~/P/F/emacs/lisp/comint.el
|
||
;; truncate-from-project => ~/Projects/FOSS/emacs/l/comint.el
|
||
;; truncate-with-project => emacs/l/comint.el
|
||
;; truncate-except-project => ~/P/F/emacs/l/comint.el
|
||
;; truncate-upto-root => ~/P/F/e/lisp/comint.el
|
||
;; truncate-all => ~/P/F/e/l/comint.el
|
||
;; truncate-nil => ~/Projects/FOSS/emacs/lisp/comint.el
|
||
;; relative-from-project => emacs/lisp/comint.el
|
||
;; relative-to-project => lisp/comint.el
|
||
;; file-name => comint.el
|
||
;; buffer-name => comint.el<2> (uniquify buffer name)
|
||
;;
|
||
;; If you are experiencing the laggy issue, especially while editing remote files
|
||
;; with tramp, please try `file-name' style.
|
||
;; Please refer to https://github.com/bbatsov/projectile/issues/657.
|
||
(setq doom-modeline-buffer-file-name-style 'relative-to-project)
|
||
|
||
;; Whether display icons in the mode-line.
|
||
;; While using the server mode in GUI, should set the value explicitly.
|
||
(setq doom-modeline-icon (display-graphic-p))
|
||
|
||
;; Whether display the icon for `major-mode'. It respects `doom-modeline-icon'.
|
||
(setq doom-modeline-major-mode-icon nil)
|
||
|
||
;; Whether display the colorful icon for `major-mode'.
|
||
;; It respects `all-the-icons-color-icons'.
|
||
(setq doom-modeline-major-mode-color-icon nil)
|
||
|
||
;; Whether display the icon for the buffer state. It respects `doom-modeline-icon'.
|
||
(setq doom-modeline-buffer-state-icon t)
|
||
|
||
;; Whether display the modification icon for the buffer.
|
||
;; It respects `doom-modeline-icon' and `doom-modeline-buffer-state-icon'.
|
||
(setq doom-modeline-buffer-modification-icon t)
|
||
|
||
;; Whether to use unicode as a fallback (instead of ASCII) when not using icons.
|
||
(setq doom-modeline-unicode-fallback nil)
|
||
|
||
;; Whether display the minor modes in the mode-line.
|
||
(setq doom-modeline-minor-modes nil)
|
||
|
||
;; If non-nil, a word count will be added to the selection-info modeline segment.
|
||
(setq doom-modeline-enable-word-count nil)
|
||
|
||
;; Major modes in which to display word count continuously.
|
||
;; Also applies to any derived modes. Respects `doom-modeline-enable-word-count'.
|
||
;; If it brings the sluggish issue, disable `doom-modeline-enable-word-count' or
|
||
;; remove the modes from `doom-modeline-continuous-word-count-modes'.
|
||
(setq doom-modeline-continuous-word-count-modes '(markdown-mode gfm-mode org-mode))
|
||
|
||
;; Whether display the buffer encoding.
|
||
(setq doom-modeline-buffer-encoding t)
|
||
|
||
;; Whether display the indentation information.
|
||
(setq doom-modeline-indent-info nil)
|
||
|
||
;; If non-nil, only display one number for checker information if applicable.
|
||
(setq doom-modeline-checker-simple-format t)
|
||
|
||
;; The maximum number displayed for notifications.
|
||
(setq doom-modeline-number-limit 99)
|
||
|
||
;; The maximum displayed length of the branch name of version control.
|
||
(setq doom-modeline-vcs-max-length 12)
|
||
|
||
;; Whether display the workspace name. Non-nil to display in the mode-line.
|
||
(setq doom-modeline-workspace-name t)
|
||
|
||
;; Whether display the perspective name. Non-nil to display in the mode-line.
|
||
(setq doom-modeline-persp-name t)
|
||
|
||
;; If non nil the default perspective name is displayed in the mode-line.
|
||
(setq doom-modeline-display-default-persp-name nil)
|
||
|
||
;; If non nil the perspective name is displayed alongside a folder icon.
|
||
(setq doom-modeline-persp-icon t)
|
||
|
||
;; Whether display the `lsp' state. Non-nil to display in the mode-line.
|
||
(setq doom-modeline-lsp t)
|
||
|
||
;; Whether display the GitHub notifications. It requires `ghub' package.
|
||
(setq doom-modeline-github nil)
|
||
|
||
;; The interval of checking GitHub.
|
||
(setq doom-modeline-github-interval (* 30 60))
|
||
|
||
;; Whether display the modal state icon.
|
||
;; Including `evil', `overwrite', `god', `ryo' and `xah-fly-keys', etc.
|
||
(setq doom-modeline-modal-icon nil)
|
||
|
||
;; Whether display the mu4e notifications. It requires `mu4e-alert' package.
|
||
(setq doom-modeline-mu4e nil)
|
||
|
||
;; Whether display the gnus notifications.
|
||
(setq doom-modeline-gnus t)
|
||
|
||
;; Wheter gnus should automatically be updated and how often (set to 0 or smaller than 0 to disable)
|
||
(setq doom-modeline-gnus-timer 2)
|
||
|
||
;; Wheter groups should be excludede when gnus automatically being updated.
|
||
(setq doom-modeline-gnus-excluded-groups '("dummy.group"))
|
||
|
||
;; Whether display the IRC notifications. It requires `circe' or `erc' package.
|
||
(setq doom-modeline-irc t)
|
||
|
||
;; Function to stylize the irc buffer names.
|
||
(setq doom-modeline-irc-stylize 'identity)
|
||
|
||
;; Whether display the environment version.
|
||
(setq doom-modeline-env-version t)
|
||
;; Or for individual languages
|
||
(setq doom-modeline-env-enable-python t)
|
||
(setq doom-modeline-env-enable-ruby t)
|
||
(setq doom-modeline-env-enable-perl t)
|
||
(setq doom-modeline-env-enable-go t)
|
||
(setq doom-modeline-env-enable-elixir t)
|
||
(setq doom-modeline-env-enable-rust t)
|
||
|
||
;; Change the executables to use for the language version string
|
||
(setq doom-modeline-env-python-executable "python") ; or `python-shell-interpreter'
|
||
(setq doom-modeline-env-ruby-executable "ruby")
|
||
(setq doom-modeline-env-perl-executable "perl")
|
||
(setq doom-modeline-env-go-executable "go")
|
||
(setq doom-modeline-env-elixir-executable "iex")
|
||
(setq doom-modeline-env-rust-executable "rustc")
|
||
|
||
;; What to dispaly as the version while a new one is being loaded
|
||
(setq doom-modeline-env-load-string "...")
|
||
|
||
;; Hooks that run before/after the modeline version string is updated
|
||
(setq doom-modeline-before-update-env-hook nil)
|
||
(setq doom-modeline-after-update-env-hook nil))
|
||
|
||
(column-number-mode)
|
||
#+END_SRC
|
||
|
||
** Fonts
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(set-face-attribute 'default nil
|
||
:family "Fira Code"
|
||
:height 130
|
||
:weight 'normal
|
||
:width 'normal)
|
||
|
||
; (setq doom-font (font-spec :family "Fira Code" :size 16 :weight 'regular)
|
||
; doom-variable-pitch-font (font-spec :family "Droid Sans" :size 13)
|
||
; doom-big-font (font-spec :family "Droid Sans" :size 16)) ;; Presentations or streaming
|
||
|
||
(set-fontset-font (frame-parameter nil 'font)
|
||
'japanese-jisx0208
|
||
'("Droid Sans Japanese" . "unicode-bmp"))
|
||
|
||
#+END_SRC
|
||
|
||
Use the fira-code-mode plugin for ligatures.
|
||
In order for this to work, the [[https://github.com/tonsky/FiraCode/issues/211#issuecomment-239058632][Fira Code Symbol]] font is needed
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package fira-code-mode
|
||
:custom (fira-code-mode-disabled-ligatures '("x", "[]"))
|
||
:hook prog-mode)
|
||
#+END_SRC
|
||
|
||
** Dashboard
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package dashboard
|
||
:init
|
||
(setq dashboard-set-heading-icons t)
|
||
(setq dashboard-set-file-icons t)
|
||
|
||
(setq dashboard-image-banner-max-height (/ (frame-pixel-height) 3))
|
||
(setq dashboard-startup-banner "~/.emacs.d/logo.svg")
|
||
; (setq dashboard-startup-banner "~/.emacs.d/logo.svg")
|
||
(setq dashboard-center-content t)
|
||
(setq dashboard-items '((recents . 10)
|
||
(projects . 5)
|
||
(agenda . 5)
|
||
(bookmarks . 10)))
|
||
(setq dashboard-projects-switch-function 'counsel-projectile-switch-project-by-name)
|
||
|
||
(dashboard-setup-startup-hook)
|
||
|
||
:custom
|
||
; (dashboard-banner-logo-title "Execution >> Idea")
|
||
(dashboard-banner-logo-title "Emacs")
|
||
|
||
:config
|
||
(set-face-attribute 'dashboard-banner-logo-title nil :font "Droid Sans" :height 300))
|
||
#+END_SRC
|
||
|
||
** Window
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(scroll-bar-mode -1)
|
||
(tool-bar-mode -1)
|
||
(menu-bar-mode -1)
|
||
#+END_SRC
|
||
|
||
** Editor
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(global-display-line-numbers-mode)
|
||
(setq
|
||
display-line-numbers-type 'relative
|
||
scroll-margin 5)
|
||
|
||
;; Disable line numbers for some modes
|
||
(dolist (mode '(term-mode-hook
|
||
shell-mode-hook
|
||
treemacs-mode-hook
|
||
eshell-mode-hook))
|
||
(add-hook mode (lambda () (display-line-numbers-mode 0))))
|
||
|
||
|
||
|
||
(setq display-line-numbers-type 'relative)
|
||
(setq evil-normal-state-cursor '(box "#66d9ef")
|
||
evil-insert-state-cursor '(bar "#a6e22e")
|
||
evil-visual-state-cursor '(hollow "orange"))
|
||
#+END_SRC
|
||
|
||
*** Rainbow parenthesis
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package rainbow-delimiters
|
||
:hook (prog-mode . rainbow-delimiters-mode))
|
||
#+END_SRC
|
||
|
||
** Misc
|
||
|
||
* IDE Tools
|
||
** LSP
|
||
|
||
Setup to activate every time LSP gets activated
|
||
|
||
Adds the relative path to the project root into the header
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun lsp-mode-setup ()
|
||
(setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols))
|
||
(lsp-headerline-breadcrumb-mode)
|
||
|
||
(general-nmap
|
||
"gr" 'lsp-find-references
|
||
"gd" 'lsp-find-definition
|
||
"gf" 'find-file-at-point))
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-mode
|
||
:commands (lsp lsp-deferred)
|
||
|
||
:hook (
|
||
(lsp-mode . lsp-mode-setup)
|
||
(lsp-mode . lsp-enable-which-key-integration))
|
||
|
||
:init (setq
|
||
lsp-keymap-prefix "C-c l"
|
||
lsp-completion-provider :capf)
|
||
|
||
:config (setq
|
||
lsp-inhibit-message t
|
||
lsp-eldoc-render-all nil
|
||
lsp-enable-file-watchers t
|
||
lsp-enable-snippet t
|
||
lsp-enable-symbol-highlighting t
|
||
lsp-headerline-breadcrumb-enable t
|
||
lsp-highlight-symbol-at-point t
|
||
lsp-modeline-code-actions-enable t
|
||
lsp-modeline-diagnostics-enable t
|
||
|
||
lsp-ui-doc-position 'right
|
||
lsp-ui-doc-max-height 40
|
||
lsp-ui-doc-enable nil
|
||
lsp-ui-sideline-delay 0.05
|
||
lsp-ui-sideline-show-code-actions nil)
|
||
(lsp-enable-which-key-integration t)
|
||
|
||
(add-to-list 'company-backends '(company-capf company-dabbrev))
|
||
|
||
:bind (
|
||
:map lsp-mode-map
|
||
("M-RET" . lsp-execute-code-action))
|
||
|
||
:general (leader-key
|
||
"l" (general-simulate-key "C-c l" :which-key "LSP"))
|
||
|
||
([remap xref-find-references] #'lsp-ui-peek-find-references)
|
||
([remap xref-find-definitions] 'lsp-ui-peek-find-definitions)
|
||
|
||
(leader-key
|
||
"j" '(:ignore t :which-key "LSP OWN")
|
||
"ja" 'lsp-format-buffer
|
||
"jf" 'lsp-format-buffer
|
||
"jh" 'lsp-describe-thing-at-point
|
||
"jr" 'lsp-restart-workspace
|
||
"jd" 'lsp-goto-implementation
|
||
"jt" 'lsp-goto-type-definition
|
||
"jx" 'lsp-ui-doc-mode
|
||
"j <f2>" 'lsp-rename)
|
||
|
||
(general-nmap
|
||
"K" 'lsp-ui-doc-glance))
|
||
#+END_SRC
|
||
|
||
*** lsp-ui
|
||
|
||
All the config for lsp-ui can be found in the lsp block.
|
||
This is because lsp automatically loads lsp-ui and any code inside this block will not get executed.
|
||
This is only in order to install lsp-ui.
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-ui)
|
||
#+END_SRC
|
||
|
||
*** lsp-treemacs
|
||
|
||
Treemacs integration for lsp-mode.
|
||
Mainly used in order to see the tree of objects, functions and so on.
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-treemacs
|
||
:after (lsp treemacs)
|
||
:hook (lsp-mode . lsp-treemacs-sync-mode))
|
||
#+END_SRC
|
||
|
||
*** lsp-ivy
|
||
|
||
Ivy integration for lsp-mode.
|
||
Mainly used in order to choose from the tree of objects, functions and so on.
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-ivy
|
||
:after lsp
|
||
:commands lsp-ivy-workspace-symbol)
|
||
#+END_SRC
|
||
|
||
** Completion
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package company
|
||
:init (setq
|
||
company-idle-delay 0.1 ; show autocompletion after n seconds
|
||
company-async-timeout 15 ; completion may be slow
|
||
company-tooltip-idle-delay 0.1
|
||
company-minimum-prefix-length 1 ; show suggestions after only one character (insted of several)
|
||
company-tooltip-align-annotations t)
|
||
|
||
(add-to-list 'company-backends 'company-files)
|
||
|
||
:hook (prog-mode . company-mode)
|
||
|
||
:bind (("C-RET" . counsel-company)
|
||
:map prog-mode-map
|
||
("C-i" . company-indent-or-complete-common)
|
||
("C-;" . counsel-company)
|
||
("C-M-i" . counsel-company)
|
||
:map company-active-map
|
||
; ("C-o" . company-search-kill-others)
|
||
; ("C-h" . company-quickhelp-manual-begin)
|
||
("C-h" . company-show-doc-buffer)
|
||
("C-s" . company-search-candidates)
|
||
("M-s" . company-filter-candidates)
|
||
([C-tab] . company-complete-common-or-cycle)
|
||
([tab] . company-complete-common-or-cycle)
|
||
([backtab] . company-select-previous)
|
||
;; ("M-RET" . company-complete-selection)
|
||
("RET" . company-complete-selection)
|
||
:map company-search-map
|
||
;; ("M-j" . company-select-next)
|
||
;; ("M-k" . company-select-previous)
|
||
("C-p" . company-select-next-or-abort)
|
||
("C-n" . company-select-previous-or-abort))
|
||
;; ("C-n" . 'company-search-repeat-forward)
|
||
;; ("C-p" . 'company-search-repeat-backward)))
|
||
;; ("<esc>" . (cmd! (company-search-abort) (company-filter-candidates)))))
|
||
:config
|
||
(general-define-key
|
||
"C-SPC" 'company-capf))
|
||
#+END_SRC
|
||
|
||
Nice looking completions
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package company-box
|
||
:hook (company-mode . company-box-mode))
|
||
#+END_SRC
|
||
|
||
** Debugging
|
||
|
||
*** Flycheck mode
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package flycheck
|
||
:config
|
||
(setq
|
||
flycheck-highlighting-mode 'lines)
|
||
|
||
(set-face-attribute 'flycheck-error nil
|
||
:family "Fira Code"
|
||
:background "#773131"
|
||
:weight 'normal
|
||
:width 'normal)
|
||
|
||
(set-face-attribute 'flycheck-warning nil
|
||
:family "Fira Code"
|
||
:background "#767731"
|
||
:weight 'normal
|
||
:width 'normal)
|
||
|
||
:general (leader-key
|
||
"!" (general-simulate-key "C-u C-c !" :which-key "Flycheck")))
|
||
(global-flycheck-mode 1)
|
||
#+END_SRC
|
||
|
||
** Documentation
|
||
|
||
#+BEGIN_SRC elisp
|
||
#+END_SRC
|
||
|
||
*** Helpful
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package helpful
|
||
: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
|
||
|
||
** Project Management
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package projectile
|
||
:init
|
||
(setq projectile-project-search-path '("~/git/"
|
||
"~/git/temp/"))
|
||
(setq projectile-switch-project-action #'projectile-dired)
|
||
|
||
:custom ((projectile-completion-system 'ivy))
|
||
:bind-keymap ("C-c p" . projectile-command-map)
|
||
:config (projectile-mode)
|
||
|
||
:general (leader-key
|
||
;; File path
|
||
"fR" 'projectile-recentf
|
||
"fa" 'projectile-ag
|
||
;; "fyC" 'spacemacs/projectile-copy-file-path-with-line-column
|
||
;; "fyD" 'spacemacs/projectile-copy-directory-path
|
||
;; "fyL" 'spacemacs/projectile-copy-file-path-with-line
|
||
;; "fyY" 'spacemacs/projectile-copy-file-path
|
||
;; Project
|
||
"p" '(:ignore t :which-key "projectile")
|
||
"p!" 'projectile-run-shell-command-in-root
|
||
"p&" 'projectile-run-async-shell-command-in-root
|
||
"p%" 'projectile-replace-regexp
|
||
"pa" 'projectile-toggle-between-implementation-and-test
|
||
"pb" 'projectile-switch-to-buffer
|
||
"pc" 'projectile-compile-project
|
||
"pd" 'projectile-find-dir
|
||
"pD" 'projectile-dired
|
||
"pe" 'projectile-edit-dir-locals
|
||
"pf" 'projectile-find-file
|
||
"pF" 'projectile-find-file-dwim
|
||
"pg" 'projectile-find-tag
|
||
"pG" 'projectile-regenerate-tags
|
||
"pI" 'projectile-invalidate-cache
|
||
"pk" 'projectile-kill-buffers
|
||
"pp" 'projectile-switch-project
|
||
"pr" 'projectile-recentf
|
||
"pR" 'projectile-replace
|
||
"pT" 'projectile-test-project
|
||
"pv" 'projectile-vc))
|
||
#+END_SRC
|
||
|
||
** REST Client
|
||
|
||
restclient
|
||
|
||
** Search
|
||
|
||
Swiper is used for finding local occurences of a word inside a buffer.
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package swiper
|
||
:general (leader-key
|
||
"s" '(swiper :which-key "search")))
|
||
#+END_SRC
|
||
|
||
Ag is used for project-wide search
|
||
|
||
** Snippets
|
||
|
||
Yasnippet
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package yasnippet
|
||
:init (yas-global-mode t)
|
||
:config (yas-reload-all)
|
||
:general (leader-key
|
||
"y" '(:ignore t :which-key "yasnippet")
|
||
"yn" '(yas-new-snippet :which-key "New snippet")
|
||
;; "yi" '(yas-insert-snippet :which-key "Insert snippet")
|
||
"y/" '(yas-visit-snippet-file :which-key "Find global snippet")
|
||
"yr" '(yas-reload-all :which-key "Reload snippets")
|
||
"yv" '(yas-describe-tables :which-key "View loaded snippets")))
|
||
#+END_SRC
|
||
|
||
For easy selection of snippets
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package ivy-yasnippet
|
||
:after yasnippet
|
||
:general (leader-key
|
||
"yi" '(ivy-yasnippet :which-key "Insert snippet")))
|
||
#+END_SRC
|
||
|
||
|
||
Add yasnippet support for all company backends
|
||
https://github.com/syl20bnr/spacemacs/pull/179
|
||
https://emacs.stackexchange.com/questions/10431/get-company-to-show-suggestions-for-yasnippet-names
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defvar company-mode/enable-yas t
|
||
"Enable yasnippet for all backends.")
|
||
|
||
(defun company-mode/backend-with-yas (backend)
|
||
(if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
|
||
backend
|
||
(append (if (consp backend) backend (list backend))
|
||
'(:with company-yasnippet))))
|
||
|
||
(setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))
|
||
#+END_SRC
|
||
|
||
** Todo
|
||
|
||
#+BEGIN_SRC elisp
|
||
(use-package hl-todo
|
||
:ensure t
|
||
:custom-face
|
||
(hl-todo ((t (:inherit hl-todo :italic t))))
|
||
:hook ((prog-mode . hl-todo-mode)
|
||
(yaml-mode . hl-todo-mode)))
|
||
#+END_SRC
|
||
|
||
** Version Control
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package magit
|
||
:general (leader-key
|
||
"g" '(:ignore t :which-key "git")
|
||
"g/" '(magit-dispatch :which-key "Magit dispatch")
|
||
"g." '(magit-file-dispatch :which-key "Magit file dispatch")
|
||
;; "g'" '(forge-dispatch :which-key "Forge dispatch")
|
||
"gg" '(magit-status :which-key "Magit status")
|
||
"gG" '(magit-status-here :which-key "Magit status here")
|
||
"gx" '(magit-file-delete :which-key "Magit file delete")
|
||
"gB" '(magit-blame-addition :which-key "Magit blame")
|
||
"gC" '(magit-clone :which-key "Magit clone")
|
||
"gF" '(magit-fetch :which-key "Magit fetch")
|
||
"gL" '(magit-log :which-key "Magit buffer log")
|
||
"gS" '(magit-stage-file :which-key "Git stage file")
|
||
"gU" '(magit-unstage-file :which-key "Git unstage file")
|
||
|
||
"gf" '(:ignore t :which-key "find")
|
||
"gff" '(magit-find-file :which-key "Find file")
|
||
"gfg" '(magit-find-git-config-file :which-key "Find gitconfig file")
|
||
"gfc" '(magit-show-commit :which-key "Find commit")
|
||
|
||
|
||
"gl" '(:ignore t :which-key "list")
|
||
;; "glg" '(gist-list :which-key "List gists")
|
||
"glr" '(magit-list-repositories :which-key "List repositories")
|
||
"gls" '(magit-list-submodules :which-key "List submodules")
|
||
;; "gli" '(forge-list-issues :which-key "List issues")
|
||
;; "glp" '(forge-list-pullreqs :which-key "List pull requests")
|
||
;; "gln" '(forge-list-notifications :which-key "List notifications")
|
||
|
||
"gc" '(:ignore t :which-key "create")
|
||
"gcr" '(magit-init :which-key "Initialize repo")
|
||
"gcR" '(magit-clone :which-key "Clone repo")
|
||
"gcc" '(magit-commit-create :which-key "Commit")
|
||
"gcf" '(magit-commit-fixup :which-key "Fixup")))
|
||
;; "gci" '(forge-create-issue :which-key "Issue")
|
||
;; "gcp" '(forge-create-pullreq :which-key "Pull request")))
|
||
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package evil-magit
|
||
:after (magit evil))
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package git-gutter
|
||
:init
|
||
(global-git-gutter-mode 1))
|
||
#+END_SRC
|
||
|
||
* Langugages
|
||
** Agda
|
||
|
||
(after! agda2-mode
|
||
(set-lookup-handlers! 'agda2-mode
|
||
:definition #'agda2-goto-definition-keyboard)
|
||
(map! :map agda2-mode-map
|
||
:localleader
|
||
"?" #'agda2-show-goals
|
||
"." #'agda2-goal-and-context-and-inferred
|
||
"," #'agda2-goal-and-context
|
||
"=" #'agda2-show-constraints
|
||
"SPC" #'agda2-give
|
||
"a" #'agda2-auto-maybe-all
|
||
"b" #'agda2-previous-goal
|
||
"c" #'agda2-make-case
|
||
"d" #'agda2-infer-type-maybe-toplevel
|
||
"e" #'agda2-show-context
|
||
"f" #'agda2-next-goal
|
||
"gG" #'agda2-go-back
|
||
"h" #'agda2-helper-function-type
|
||
"l" #'agda2-load
|
||
"n" #'agda2-compute-normalised-maybe-toplevel
|
||
"p" #'agda2-module-contents-maybe-toplevel
|
||
"r" #'agda2-refine
|
||
"s" #'agda2-solveAll
|
||
"t" #'agda2-goal-type
|
||
"w" #'agda2-why-in-scope-maybe-toplevel
|
||
(:prefix "x"
|
||
"c" #'agda2-compile
|
||
"d" #'agda2-remove-annotations
|
||
"h" #'agda2-display-implicit-arguments
|
||
"q" #'agda2-quit
|
||
"r" #'agda2-restart)))
|
||
|
||
** C/C++
|
||
** Clojure
|
||
** Coq
|
||
** Dart / Flutter
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package dart-mode
|
||
:mode "\\.dart\\'")
|
||
#+END_SRC
|
||
|
||
** Elixir
|
||
|
||
Major mode for elixir
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
; (use-package elixir-mode)
|
||
#+END_SRC
|
||
|
||
Several tools for navigation, formatting, compilation, docs and completion
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
; (use-package alchemist)
|
||
#+END_SRC
|
||
|
||
** Elm
|
||
|
||
Major mode for elm
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package elm-mode
|
||
:mode ("\\.elm\\'" . elm-mode)
|
||
:after (company)
|
||
:config (add-to-list 'company-backends 'elm-company)
|
||
|
||
:general (leader-key elm-mode-map
|
||
|
||
"mc" '(:ignore t :which-key "compile")
|
||
"mcb" 'elm-compile-buffer
|
||
"mcm" 'elm-compile-main
|
||
"mct" 'elm-test-project
|
||
"mcr" 'elm-reactor
|
||
"mcb" 'elm-preview-buffer
|
||
"mcp" 'elm-preview-main
|
||
|
||
"mh" '(:ignore t :which-key "docs")
|
||
"mhd" 'elm-documentation-lookup
|
||
"mhh" 'elm-oracle-doc-at-point
|
||
"mht" 'elm-oracle-type-at-point
|
||
|
||
"m." 'elm-repl-load
|
||
"mp" 'elm-repl-push
|
||
"md" 'elm-repl-push-decl
|
||
|
||
"mi" 'elm-import
|
||
"me" 'elm-expose-at-point
|
||
"ms" 'elm-sort-imports
|
||
"mf" 'elm-format-buffer
|
||
"mv" 'elm-package-catalog))
|
||
#+END_SRC
|
||
|
||
Proper error-providing to flycheck to flycheck
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package flycheck-elm
|
||
:after (flycheck elm-mode)
|
||
:hook (elm-mode-hook . flycheck-elm-setup))
|
||
#+END_SRC
|
||
|
||
LSP mode
|
||
|
||
install via
|
||
|
||
#+BEGIN_SRC bash :tangle no
|
||
npm i -g @elm-tooling/elm-language-server
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(add-hook 'elm-mode-hook 'lsp)
|
||
#+END_SRC
|
||
|
||
** Emacs Lisp
|
||
|
||
Package for highlighting defined macros/functions/variables/symbols in emacs
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package highlight-defined
|
||
:config
|
||
(add-hook 'emacs-lisp-mode-hook 'highlight-defined-mode))
|
||
#+END_SRC
|
||
|
||
** Haskell
|
||
|
||
Major mode for haskell
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package haskell-mode
|
||
:general (leader-key haskell-mode-map
|
||
|
||
"mh" '(haskell-hide-toggle :which-key "hide")
|
||
"mH" '(haskell-hide-toggle-all :which-key "hide all")
|
||
|
||
"mc" '(:ignore t :which-key "cabal")
|
||
"mcf" '(haskell-cabal-visit-file :which-key "cabal file")
|
||
"mcb" '(haskell-process-cabal-build :which-key "build")))
|
||
#+END_SRC
|
||
|
||
Hlint is a linter for suggesting better ways to write certain pieces of code.
|
||
It requires [[https://github.com/mpickering/apply-refact][apply-refact]] to be installed
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package hlint-refactor
|
||
:hook (haskell-mode-hook . hlint-refactor-mode)
|
||
:general (leader-key haskell-mode-map
|
||
"mr" '(hlint-refactor-refactor-buffer :which-key "refactor suggestion")))
|
||
#+END_SRC
|
||
|
||
Hindent is a reformatter for properly indenting haskell code (haskell can be quite picky about the indentation, so this is actually pretty useful not only for readability).
|
||
It requires the hindent executable
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package hindent
|
||
:hook (haskell-mode-hook . hindent-mode))
|
||
#+END_SRC
|
||
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-haskell
|
||
:hook (haskell-mode-hook . lsp)
|
||
(haskell-literate-mode-hook . lsp))
|
||
#+END_SRC
|
||
|
||
flycheck-haskell?
|
||
ghc ?
|
||
|
||
** Idris
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; (use-package idris-mode
|
||
;; :hook (idris-mode-hook . turn-on-idris-simple-indent)
|
||
;; :general (leader-key idris-mode-map
|
||
;; "m." 'idris-pop-to-repl
|
||
;; "mr" 'idris-load-file
|
||
;; "md" 'idris-docs-at-point
|
||
;; "mt" 'idris-type-at-point
|
||
;; "md" 'idris-add-clause
|
||
;; "ml" 'idris-make-lemma
|
||
;; "mc" 'idris-case-split
|
||
;; "mw" 'idris-make-with-block
|
||
;; "mm" 'idris-add-missing
|
||
;; "mp" 'idris-proof-search
|
||
;; "mh" 'idris-docs-at-point))
|
||
#+END_SRC
|
||
|
||
** Java
|
||
|
||
Java LSP using the Eclipse JDT Language server
|
||
|
||
install jdtls from AUR
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-java
|
||
:init
|
||
; (setq lsp-java-server-install-dir "/usr/share/java/jdtls/")
|
||
(setenv "JAVA_HOME" "/usr/lib/jvm/default")
|
||
(setq
|
||
lsp-java-java-path (substitute-in-file-name "$JAVA_HOME/bin/java")
|
||
lsp-java-jdt-download-url "https://download.eclipse.org/jdtls/snapshots/jdt-language-server-latest.tar.gz")
|
||
; :hook (java-mode-hook . lsp)
|
||
:config
|
||
(add-hook 'java-mode-hook 'flycheck-mode)
|
||
(add-hook 'java-mode-hook 'company-mode)
|
||
(add-hook 'java-mode-hook 'lsp)
|
||
:general (leader-key java-mode-map
|
||
;; LSP Java commands
|
||
"mi" '(lsp-java-organize-imports :which-key "Organize imports")
|
||
"mc" '(lsp-java-build-project :which-key "Perform partial or full build for the projects")
|
||
;; lsp-java-update-project-configuration - Update project configuration
|
||
;; lsp-java-actionable-notifications - Resolve actionable notifications
|
||
;; lsp-java-update-user-settings - Update user settings (Check the options in the table bellow.)
|
||
;; lsp-java-update-server - Update server instalation.
|
||
"mg" '(:ignore t :which-key "Generate")
|
||
"mgs" '(lsp-java-generate-to-string :which-key "Generate toString method")
|
||
"mge" '(lsp-java-generate-equals-and-hash-code :which-key "Generate equals and hashCode methods")
|
||
"mgo" '(lsp-java-generate-overrides :which-key "Generate method overrides")
|
||
"mgg" '(lsp-java-generate-getters-and-setters :which-key "Generate getters and setters")
|
||
;; Refactoring
|
||
;; LSP Java provides rich set of refactorings via Eclipse JDT Language Server code actions and some of them are bound to Emacs commands:
|
||
|
||
"mr" '(:ignore t :which-key "Refactor")
|
||
"mr" '(lsp-java-extract-to-constant :which-key "Extract constant refactoring")
|
||
"mr" '(lsp-java-add-unimplemented-methods :which-key "Extract constant refactoring")
|
||
"mr" '(lsp-java-create-parameter :which-key "Create parameter refactoring")
|
||
"mr" '(lsp-java-create-field :which-key "Create field refactoring")
|
||
"mr" '(lsp-java-create-local :which-key "Create local refactoring")
|
||
"mr" '(lsp-java-extract-method :which-key "Extract method refactoring")
|
||
"mr" '(lsp-java-add-import :which-key "Add missing import")
|
||
|
||
;; Testing support
|
||
"mt" '(:ignore t :which-key "JUnit")
|
||
"mtr" '(lsp-jt-report-open :which-key "open test report")
|
||
"mtb" '(lsp-jt-browser :which-key "Browse tests and run/debug them.")
|
||
;; ^^^ ** Use x to run the test(s) under point; d to debug the tests under point. R to refresh. ** Support for GUI operations.
|
||
"mtl" '(lsp-jt-lens-mode :which-key "test lenses mode")
|
||
|
||
;; Dependency viewer
|
||
"md" '(lsp-java-dependency-list :which-key "View java dependencies")))
|
||
#+END_SRC
|
||
|
||
Maven integration
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package maven-test-mode
|
||
:hook (java-mode-hook . maven-test-mode)
|
||
;; (spacemacs/declare-prefix-for-mode 'java-mode "mm" "maven")
|
||
;; (spacemacs/declare-prefix-for-mode 'java-mode "mmg" "goto")
|
||
;; (spacemacs/declare-prefix-for-mode 'java-mode "mmt" "tests"))
|
||
;; :config
|
||
;; (progn
|
||
;; (spacemacs|hide-lighter maven-test-mode)
|
||
;; (spacemacs/set-leader-keys-for-minor-mode 'maven-test-mode
|
||
:general (leader-key maven-test-mode-map
|
||
"mm" '(:ignore t :which-key "Maven")
|
||
"mmga" 'maven-test-toggle-between-test-and-class
|
||
"mmgA" 'maven-test-toggle-between-test-and-class-other-window
|
||
"mmta" 'maven-test-all
|
||
"mmt C-a" 'maven-test-clean-test-all
|
||
"mmtb" 'maven-test-file
|
||
"mmti" 'maven-test-install
|
||
"mmtt" 'maven-test-method))
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
|
||
#+END_SRC
|
||
|
||
|
||
malabar-mode
|
||
|
||
emacs-eclim ?
|
||
|
||
** JavaScript / TypeScript
|
||
|
||
Typescript mode and hook for activating lsp
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package typescript-mode
|
||
:mode "\\.ts\\'"
|
||
:hook (typescript-mode . lsp)
|
||
:config
|
||
(setq typescript-indent-level 2))
|
||
#+END_SRC
|
||
|
||
Install lsp server with
|
||
|
||
#+BEGIN_SRC bash :tangle no
|
||
npm i -g typescript-language-server; npm i -g typescript
|
||
#+END_SRC
|
||
|
||
js2-mode
|
||
js-doc
|
||
js2-refactor
|
||
npm.el
|
||
** Json
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package json-mode
|
||
:mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'"
|
||
:hook (json-mode . lsp)
|
||
; :config
|
||
; (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))
|
||
:general (leader-key json-mode-map
|
||
"mp" '(json-mode-show-path :which-key "Copy path")
|
||
"mt" 'json-toggle-boolean
|
||
"md" 'json-mode-kill-path
|
||
"mx" 'json-nullify-sexp
|
||
"m+" 'json-increment-number-at-point
|
||
"m-" 'json-decrement-number-at-point
|
||
"mf" 'json-mode-beautify))
|
||
#+END_SRC
|
||
|
||
(use-package! counsel-jq
|
||
:when (featurep! :completion ivy)
|
||
:defer t
|
||
:init
|
||
(map! :after json-mode
|
||
:map json-mode-map
|
||
:localleader
|
||
"s" #'counsel-jq))
|
||
|
||
** LaTeX
|
||
|
||
AUCTeX
|
||
|
||
The reason the package is called "tex" and not "auctex" is explained [[https://emacs.stackexchange.com/questions/41321/when-to-specify-a-package-name-in-use-packages-ensure-tag/41324#41324][here]]
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package tex
|
||
;; :after (pdf-tools)
|
||
:ensure auctex
|
||
:mode ("\\.tex\\'" . LaTeX-mode)
|
||
:config
|
||
(setq
|
||
TeX-source-correlate-method 'synctex
|
||
TeX-source-correlate-start-server t
|
||
TeX-auto-save t
|
||
TeX-parse-self t
|
||
; reftex-plug-into-AUCTeX t
|
||
TeX-PDF-mode t) ; Use PDF instead of DVI
|
||
|
||
(setq-default
|
||
TeX-master "main.tex"
|
||
TeX-engine 'default) ; default | xetex | luatex
|
||
|
||
(TeX-source-correlate-mode t) ;
|
||
|
||
(add-hook 'LaTeX-mode-hook
|
||
(lambda ()
|
||
(reftex-mode t)
|
||
(flyspell-mode t)))
|
||
|
||
:general (leader-key
|
||
"mc" '(TeX-command-run-all :which-key "Compile")
|
||
"me" '(TeX-engine-set :which-key "Set engine")
|
||
"mv" '(TeX-view :which-key "view")))
|
||
#+END_SRC
|
||
|
||
Completions for AUCTeX
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package company-auctex
|
||
:after auctex
|
||
:hook LaTeX-mode
|
||
:config
|
||
(company-auctex-init)
|
||
(add-to-list 'company-backends 'company-yasnippet)
|
||
(company-mode))
|
||
|
||
;; :config
|
||
;; (add-to-list '+latex--company-backends #'company-auctex-environments nil #'eq)
|
||
;; (add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq))
|
||
#+END_SRC
|
||
|
||
Support for compiling documents with the LaTeXmk tool
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package auctex-latexmk
|
||
:after auctex
|
||
(auctex-latexmk-setup)
|
||
(setq auctex-latexmk-inherit-TeX-PDF-mode t))
|
||
#+END_SRC
|
||
|
||
PDF viewer
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package pdf-tools
|
||
;; :hook
|
||
|
||
;; (add-hook 'pdf-view-mode-hook (lambda ()
|
||
;; (bms/pdf-midnite-amber))) ; automatically turns on midnight-mode for pdfs
|
||
:init
|
||
;; (pdf-tools-install)
|
||
(setq
|
||
TeX-view-program-selection '((output-pdf "pdf-tools"))
|
||
TeX-view-program-list '(("pdf-tools" "TeX-pdf-tools-sync-view")))
|
||
|
||
:config
|
||
(setq-default pdf-view-display-size 'fit-page)
|
||
(setq pdf-annot-activate-created-annotations t)
|
||
|
||
(add-hook 'TeX-after-compilation-finished-functions ;; Update PDF buffers after successful LaTeX runs
|
||
#'TeX-revert-document-buffer)
|
||
|
||
:general (leader-key pdf-view-mode-map
|
||
"mf" 'isearch-forward
|
||
"mb" 'isearch-backward))
|
||
#+END_SRC
|
||
|
||
Some functions to help with efficient writing of environments etc.
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package cdlatex
|
||
:general (leader-key
|
||
"mis" 'cdlatex-sub-superscript
|
||
"mip" 'cdlatex-lr-pair
|
||
"mie" 'cdlatex-environment))
|
||
#+END_SRC
|
||
|
||
Preview math inside the buffer
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; (use-package math-preview)
|
||
;; (use-package preview-latex)
|
||
#+END_SRC
|
||
|
||
Preview pane
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
; (use-package latex-preview-pane)
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
; (use-package lsp-latex)
|
||
#+END_SRC
|
||
|
||
Some math functions
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(leader-key LaTeX-mode-map
|
||
"mm" '(:ignore t :which-key "Insert math")
|
||
"mm^" '(LaTeX-math-wedge :which-key "∧")
|
||
"mmv" '(LaTeX-math-vee :which-key "∨")
|
||
"mm=>" '(LaTeX-math-Rightarrow :which-key "=>")
|
||
"mm->" '(LaTeX-math-rightarrow :which-key "->")
|
||
"mm<==" '(LaTeX-math-Leftarrow :which-key "<=")
|
||
"mm<-" '(LaTeX-math-leftarrow :which-key "<-")
|
||
"mm<=>" '(LaTeX-math-Leftrightarrow :which-key "<=>")
|
||
"mm==" '(LaTeX-math-equiv :which-key "≡")
|
||
"mm!=" '(LaTeX-math-neq :which-key "≠")
|
||
"mmn" '(LaTeX-math-neg :which-key "¬")
|
||
"mma" '(LaTeX-math-forall :which-key "∀")
|
||
"mme" '(LaTeX-math-exists :which-key "∃")
|
||
"mmt" '(LaTeX-math-top :which-key "⊤")
|
||
"mmT" '(LaTeX-math-bot :which-key "⊥")
|
||
"mm." '(LaTeX-math-therefore :which-key "∴")
|
||
"mm," '(LaTeX-math-because :which-key "∵"))
|
||
#+END_SRC
|
||
|
||
;; Nicely indent lines that have wrapped when visual line mode is activated
|
||
(use-package! adaptive-wrap
|
||
:hook (LaTeX-mode . adaptive-wrap-prefix-mode)
|
||
:init (setq-default adaptive-wrap-extra-indent 0))
|
||
|
||
|
||
(use-package! auctex-latexmk
|
||
:when (featurep! +latexmk)
|
||
:after latex
|
||
:init
|
||
;; Pass the -pdf flag when TeX-PDF-mode is active
|
||
(setq auctex-latexmk-inherit-TeX-PDF-mode t)
|
||
;; Set LatexMk as the default
|
||
(setq-hook! LaTeX-mode TeX-command-default "LatexMk")
|
||
:config
|
||
;; Add latexmk as a TeX target
|
||
(auctex-latexmk-setup))
|
||
|
||
|
||
(use-package! evil-tex
|
||
:when (featurep! :editor evil +everywhere)
|
||
:hook (LaTeX-mode . evil-tex-mode))
|
||
|
||
|
||
(use-package! company-auctex
|
||
:when (featurep! :completion company)
|
||
:defer t
|
||
:init
|
||
(add-to-list '+latex--company-backends #'company-auctex-environments nil #'eq)
|
||
(add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq))
|
||
|
||
|
||
(use-package! company-math
|
||
:when (featurep! :completion company)
|
||
:defer t
|
||
:init
|
||
(add-to-list '+latex--company-backends #'+latex-symbols-company-backend nil #'eq))
|
||
|
||
*** NTNU style macros
|
||
|
||
- [ ] TODO: add support for indentation
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun ntnu/expand-truth-table ()
|
||
(interactive)
|
||
(save-excursion
|
||
(let
|
||
(start
|
||
end
|
||
(l/rep (lambda (pat repl)
|
||
(setq
|
||
start (evil-range-beginning (evil-visual-range))
|
||
end (evil-range-end (evil-visual-range)))
|
||
(replace-regexp pat repl nil start end))))
|
||
;; (evil-ex-substitute start end '("[tT]") "\\\\T" '("g")))))
|
||
(funcall l/rep "[tT]" "\\\\T")
|
||
(funcall l/rep "[fF]" "\\\\F")
|
||
(funcall l/rep " " " & ")
|
||
(funcall l/rep "$" " \\\\\\\\"))))
|
||
#+END_SRC
|
||
|
||
** Lua
|
||
** Markdown
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package markdown-mode
|
||
:commands (markdown-mode gfm-mode)
|
||
:mode (("README\\.md\\'" . gfm-mode)
|
||
("\\.md\\'" . markdown-mode)
|
||
("\\.markdown\\'" . markdown-mode))
|
||
:init
|
||
(setq markdown-enable-math t ; syntax highlighting for latex fragments
|
||
markdown-enable-wiki-links t
|
||
markdown-italic-underscore t
|
||
markdown-asymmetric-header t
|
||
markdown-fontify-code-blocks-natively t
|
||
markdown-gfm-additional-languages '("sh")
|
||
markdown-make-gfm-checkboxes-buttons t
|
||
markdown-content-type "application/xhtml+xml"
|
||
markdown-css-paths
|
||
; markdown-command "multimarkdown"
|
||
'("https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.min.css"
|
||
"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/styles/github.min.css")
|
||
markdown-xhtml-header-content
|
||
(concat "<meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'>"
|
||
"<style> body { box-sizing: border-box; max-width: 740px; width: 100%; margin: 40px auto; padding: 0 10px; } </style>"
|
||
"<script id='MathJax-script' async src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'></script>"
|
||
"<script src='https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js'></script>"
|
||
"<script>document.addEventListener('DOMContentLoaded', () => { document.body.classList.add('markdown-body'); document.querySelectorAll('pre[lang] > code').forEach((code) => { code.classList.add(code.parentElement.lang); }); document.querySelectorAll('pre > code').forEach((code) => { hljs.highlightBlock(code); }); });</script>"))
|
||
:general (leader-key markdown-mode-map
|
||
"m'" 'markdown-edit-code-block
|
||
"mo" 'markdown-open
|
||
"mp" 'markdown-preview
|
||
"me" 'markdown-export
|
||
; "mp" 'grip-mode)
|
||
|
||
"mi" '(:ignore t :which-key "insert")
|
||
; "mit" 'markdown-toc-generate-toc
|
||
"mii" 'markdown-insert-image
|
||
"mil" 'markdown-insert-link))
|
||
#+END_SRC
|
||
|
||
** Python
|
||
|
||
Major mode for python
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package python-mode)
|
||
#+END_SRC
|
||
|
||
Palintirs python LSP server
|
||
|
||
To be installed from the arch community repos: python-language-server
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq lsp-pyls-plugins-autopep8-enabled nil)
|
||
(setq lsp-pyls-plugins-yapf-enabled t)
|
||
(add-hook 'python-mode-hook 'lsp)
|
||
#+END_SRC
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun prettify-python ()
|
||
(set-face-attribute font-lock-keyword-face nil :font "CMU Serif" :slant 'italic :height 160)
|
||
(setq prettify-symbols-alist '(
|
||
("def" . "f")
|
||
("lambda" . "λ")
|
||
("delta" . "Δ")
|
||
("for" . "∀")
|
||
("not in" . "∉")
|
||
("in" . "∈")
|
||
("return" . "→")
|
||
("->" . "→")
|
||
("\\n" . "⏎")
|
||
("!=" . "≠")
|
||
("not" . "¬")
|
||
("and" . "^")
|
||
("or" . "∨")
|
||
("pi" . "π"))))
|
||
|
||
(add-hook 'python-mode-hook 'prettify-symbols-mode)
|
||
(add-hook 'python-mode-hook 'prettify-python)
|
||
|
||
#+END_SRC
|
||
|
||
** Rust
|
||
rust-mode
|
||
flycheck-rust
|
||
cargo.el - Cargo support for Emacs.
|
||
|
||
** Scala
|
||
** Shellscripts
|
||
** Yaml
|
||
** Web-dev
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package emmet-mode
|
||
:hook (sgml-mode-hook . emmet-mode)
|
||
(html-mode-hook . emmet-mode)
|
||
(css-mode-hook . emmet-mode))
|
||
#+END_SRC
|
||
|
||
web-m
|
||
|
||
|
||
** Config file languages
|
||
** Others
|
||
* Packages
|
||
** Drag stuff
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package drag-stuff
|
||
:bind (("M-j" . drag-stuff-down)
|
||
("M-k" . drag-stuff-up)
|
||
;; ("M-h" . drag-left-stuff)
|
||
;; ("M-l" . drag-stuff-right)
|
||
))
|
||
#+END_SRC
|
||
|
||
** Emoji
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package emojify
|
||
:hook (after-init-hook . global-emojify-mode)
|
||
:general (leader-key
|
||
"ie" 'emojify-insert-emoji))
|
||
#+END_SRC
|
||
|
||
** Lorem-Ipsum
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lorem-ipsum
|
||
:general (leader-key
|
||
"il" '(:ignore t :which-key "lorem ipsum")
|
||
"ill" 'lorem-ipsum-insert-list
|
||
"ils" 'lorem-ipsum-insert-sentences
|
||
"ilp" 'lorem-ipsum-insert-paragraphs))
|
||
#+END_SRC
|
||
|
||
** Multiple Cursors
|
||
|
||
evil-mc
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; (use-package multiple-cursors
|
||
;; :general (leader-key
|
||
;; "d" '(:ignore t :which-key "multiple cursors")
|
||
;; "dl" '(mc/edit-lines :which-key "edit lines")
|
||
;; "dn" '(mc/mark-next-like-this :which-key "mark next")
|
||
;; "dN" '(mc/unmark-next-like-this :which-key "unmark next")
|
||
;; "dp" '(mc/mark-previous-like-this :which-key "mark previous")
|
||
;; "dP" '(mc/unmark-previous-like-this :which-key "unmark previous")
|
||
;; "dt" '(mc/mark-all-like-this :which-key "mark all")
|
||
;; "dm" '(mc/mark-all-like-this-dwim :which-key "mark all DWIM")
|
||
;; "de" '(mc/edit-ends-of-lines :which-key "edit line endings")
|
||
;; "da" '(mc/edit-beginnings-of-lines :which-key "edit line starts")
|
||
;; "ds" '(mc/mark-sgml-tag-pair :which-key "mark tag")
|
||
;; "dd" '(mc/mark-all-like-this-in-defun :which-key "mark in defun")))
|
||
;; "w<mouse-1>" '(mc/add-cursor-on-click :which-key "add cursor w/mouse")))
|
||
#+END_SRC
|
||
|
||
** Recentf
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package recentf
|
||
:init (recentf-mode t)
|
||
:config
|
||
(add-to-list 'recentf-exclude (format "%s/\\.emacs\\.d/elpa/.*" (getenv "HOME")))
|
||
(add-to-list 'recentf-exclude "~/\\.emacs\\.d/elpa/.*")
|
||
:general (leader-key
|
||
"fr" 'counsel-recentf))
|
||
#+END_SRC
|
||
|
||
** Treemacs
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package treemacs
|
||
|
||
:init
|
||
(with-eval-after-load 'winum
|
||
(define-key winum-keymap (kbd "M-0") 'treemacs-select-window))
|
||
|
||
:config
|
||
(progn
|
||
(setq treemacs-collapse-dirs (if (executable-find "python") 3 0)
|
||
treemacs-deferred-git-apply-delay 0.5
|
||
treemacs-display-in-side-window t
|
||
treemacs-file-event-delay 5000
|
||
treemacs-file-follow-delay 0.2
|
||
treemacs-follow-after-init t
|
||
treemacs-follow-recenter-distance 0.1
|
||
treemacs-git-command-pipe ""
|
||
treemacs-goto-tag-strategy 'refetch-index
|
||
treemacs-indentation 2
|
||
treemacs-indentation-string " "
|
||
treemacs-is-never-other-window nil
|
||
treemacs-max-git-entries 5000
|
||
treemacs-no-png-images nil
|
||
treemacs-no-delete-other-windows t
|
||
treemacs-project-follow-cleanup nil
|
||
treemacs-persist-file (expand-file-name ".cache/treemacs-persist" user-emacs-directory)
|
||
treemacs-recenter-after-file-follow nil
|
||
treemacs-recenter-after-tag-follow nil
|
||
treemacs-show-cursor nil
|
||
treemacs-show-hidden-files nil
|
||
treemacs-silent-filewatch nil
|
||
treemacs-silent-refresh nil
|
||
treemacs-sorting 'alphabetic-desc
|
||
treemacs-space-between-root-nodes t
|
||
treemacs-tag-follow-cleanup t
|
||
treemacs-tag-follow-delay 1.5
|
||
treemacs-width 35)
|
||
|
||
;; The default width and height of the icons is 22 pixels. If you are
|
||
;; using a Hi-DPI display, uncomment this to double the icon size.
|
||
;;(treemacs-resize-icons 44)
|
||
|
||
(treemacs-follow-mode t)
|
||
(treemacs-filewatch-mode t)
|
||
(treemacs-fringe-indicator-mode t)
|
||
(pcase (cons (not (null (executable-find "git")))
|
||
(not (null (executable-find "python3"))))
|
||
(`(t . t)
|
||
(treemacs-git-mode 'deferred))
|
||
(`(t . _)
|
||
(treemacs-git-mode 'simple))))
|
||
|
||
:bind
|
||
(:map global-map
|
||
("M-0" . treemacs-select-window)
|
||
("C-x t 1" . treemacs-delete-other-windows)
|
||
("C-x t t" . treemacs)
|
||
("C-x t B" . treemacs-bookmark)
|
||
("C-x t C-t" . treemacs-find-file)
|
||
("C-x t M-t" . treemacs-find-tag)))
|
||
|
||
:general (leader-key
|
||
"t" '(:ignore t :which-key "treemacs")
|
||
"tt" 'treemacs)
|
||
#+END_SRC
|
||
|
||
Evil navigation
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package treemacs-evil
|
||
:after (treemacs evil))
|
||
#+END_SRC
|
||
|
||
Projectile integration
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package treemacs-projectile
|
||
:after (treemacs projectile))
|
||
#+END_SRC
|
||
|
||
LSP integration
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package lsp-treemacs
|
||
:after (treemacs lsp)
|
||
:config (lsp-treemacs-sync-mode 1))
|
||
#+END_SRC
|
||
|
||
Magit integration
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package treemacs-magit
|
||
:after (treemacs magit))
|
||
#+END_SRC
|
||
|
||
Icons for dired
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package treemacs-icons-dired
|
||
:after treemacs)
|
||
#+END_SRC
|
||
|
||
** Unicode
|
||
** Which-key
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package which-key
|
||
:config
|
||
(setq which-key-idle-delay 0.3)
|
||
(setq which-key-popup-type 'frame)
|
||
(which-key-mode)
|
||
(which-key-setup-side-window-right-bottom)
|
||
; (which-key-setup-minibuffer)
|
||
(set-face-attribute 'which-key-local-map-description-face nil
|
||
:weight 'bold))
|
||
#+END_SRC
|
||
|
||
** Zen mode
|
||
|
||
Turns out 'zen-mode' was actually reserved for a programming language called Zen. Never heard of.
|
||
This will be covering the writeroom-mode package
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(use-package writeroom-mode
|
||
:config (setq fringes-outside-margins 1)
|
||
:general (leader-key
|
||
"z" '(writeroom-mode :which-key "zen")))
|
||
#+END_SRC
|
||
|
||
* Misc
|
||
** Input Methods
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(setq default-input-method nil)
|
||
;; (map! :leader
|
||
;; (:prefix-map ("l" . "language")
|
||
;; :desc "English" "e" (lambda () (interactive) (deactivate-input-method))
|
||
;; :desc "Japanese" "j" (lambda () (interactive) (set-input-method 'japanese))
|
||
;; :desc "Norwegian" "n" (lambda () (interactive) (set-input-method 'norwegian-keyboard))
|
||
;; :desc "Latin" "l" (lambda () (interactive) (set-input-method 'latin-1-postfix))
|
||
;; :desc "TeX" "t" (lambda () (interactive) (set-input-method 'TeX))))
|
||
#+END_SRC
|
||
|
||
** Comment Utils
|
||
|
||
Make a header comment using the [[https://github.com/cacalabs/toilet][toilet]] utility with the font pagga
|
||
|
||
░█▀█░█▀█░█▀▀░█▀▀░█▀█
|
||
░█▀▀░█▀█░█░█░█░█░█▀█
|
||
░▀░░░▀░▀░▀▀▀░▀▀▀░▀░▀
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
(defun header_comment ()
|
||
"Function to make a header comment"
|
||
(interactive)
|
||
(save-excursion
|
||
(let (start end commentString)
|
||
(setq start (line-beginning-position) )
|
||
(setq end (line-end-position) )
|
||
(setq commentString (thing-at-point 'line) )
|
||
|
||
(delete-region start end)
|
||
(insert
|
||
(concat
|
||
(cdr (call-process "toilet" nil t nil "-f" "pagga" commentString)) "\n"
|
||
commentString))
|
||
(comment-region start (line-end-position))
|
||
)))
|
||
|
||
(leader-key
|
||
"ic" '(header_comment :which-key "header comment"))
|
||
#+END_SRC
|
||
|
||
** Other
|
||
|
||
#+BEGIN_SRC emacs-lisp
|
||
;; (use-package! flycheck-popup-tip
|
||
;; :config (flycheck-popup-tip-error-prefix "E -> "))
|
||
;;
|
||
;; (defun scroll-error-up ()
|
||
;; (interactive)
|
||
;; (message (prin1-to-string flycheck-popup-tip-object))
|
||
;; (popup-scroll-up flycheck-popup-tip-object))
|
||
;;
|
||
;; (defun scroll-error-down ()
|
||
;; (interactive)
|
||
;; (popup-scroll-down flycheck-popup-tip-object))
|
||
|
||
|
||
;; (map!
|
||
;; (:after flycheck-popup-tip
|
||
;; :en "C-j" #'scroll-error-down
|
||
;; :en "C-k" #'scroll-error-up))
|
||
|
||
#+END_SRC
|
||
* Sources
|
||
** Articles
|
||
|
||
https://protesilaos.com/
|
||
|
||
https://writequit.org/denver-emacs/presentations/2017-04-11-ivy.html
|
||
|
||
** Configs
|
||
*** Quinoa42
|
||
|
||
https://quinoa42.github.io/en/dot-emacs/
|
||
|
||
*** Yang Haoxie
|
||
|
||
Evil escape mode
|
||
|
||
https://github.com/yanghaoxie/emacs.d
|
||
|
||
*** Rohit Goswami
|
||
|
||
Anki, viewnior, PKGBUILD mode, Docker-mode
|
||
|
||
https://dotdoom.rgoswami.me/config.html
|
||
|
||
** Distributions
|
||
|
||
Dots and pieces (especially language-specific package configs) were taken from spacemacs and doom
|
||
|
||
Doom bindings: https://github.com/hlissner/doom-emacs/blob/develop/modules/config/default/%2Bemacs-bindings.el
|
||
(evil) https://github.com/hlissner/doom-emacs/blob/develop/modules/editor/evil/config.el
|
||
https://github.com/hlissner/doom-emacs/blob/develop/modules/config/default/%2Bevil-bindings.el
|
||
|
||
** Youtube
|
||
|
||
*** System crafters
|
||
Most of the config is made with great help from a video series made by System Crafters called "Emacs from Scratch"
|
||
Config: https://github.com/daviwil/emacs-from-scratch
|
||
|
||
*** Matheus Augusto da Silva
|
||
Several configuration options and explanations was given by Matheus Augusto da Silva
|
||
|
||
*** Uncle Dave
|
||
*** Talks
|
||
|
||
The Spacemacs based way of handling shortcuts was made with help from a talk by Suyash Bire
|
||
https://www.youtube.com/watch?v=6INMXmsCCC8
|
||
https://github.com/suyashbire1/emacs.d/blob/master/init.el
|
||
|
||
* TODO: [0/6]
|
||
|
||
*** Prioritized [1/5]
|
||
- [-] IDE stuff [3/5]
|
||
- [ ] magit [0/1]
|
||
- [ ] evil keybindings
|
||
- [-] company-mode [2/6]
|
||
- [X] LSP integration
|
||
- [X] open on CTRL-SPC
|
||
- [ ] scroll with M-[jk]
|
||
- [ ] close on enter
|
||
- [ ] Path autocompletion company
|
||
- [ ] Yasnippets in company
|
||
- [X] helpful
|
||
- [X] projectile
|
||
- [X] flycheck
|
||
- [-] Add several bindings [2/9]
|
||
- [ ] counsel
|
||
- [ ] swiper
|
||
- [ ] pdf tools
|
||
- [ ] LaTeX
|
||
- [ ] org
|
||
- [ ] treemacs
|
||
- [X] look through doom
|
||
- [ ] look through spacemacs
|
||
- [X] emacs control [4/4]
|
||
- [X] windows
|
||
- [X] quit
|
||
- [X] files
|
||
- [X] config files
|
||
- [-] LaTeX config [3/6]
|
||
- [X] synctex (zathura or pdf-tools)
|
||
- [ ] preview math
|
||
- [X] conceal levels (prettify-symbols)
|
||
- [X] snippets
|
||
- [ ] bibtex [0/1]
|
||
- [ ] set up reftex
|
||
- [ ] Castel like way of opening geogebra/inkscape
|
||
- [X] Shortcut to config files
|
||
- [ ] Add toggler for menubar
|
||
|
||
*** Fix LSP mode [1/4]
|
||
- [X] Fix LSP UI
|
||
- [ ] Fix LSP UI bindings [0/8]
|
||
- [ ] toggle doc mode
|
||
- [ ] scroll in doc mode
|
||
- [ ] toggle sideline [0/3]
|
||
- [ ] diagnostics
|
||
- [ ] hover
|
||
- [ ] code-actions
|
||
- [ ] toggle flycheckers
|
||
- [ ] toggle breadcrumb
|
||
- [ ] peek-definitions
|
||
- [ ] peek-references
|
||
- [ ] lsp-ui-imenu
|
||
- [-] Fix some languages [3/8]
|
||
- [X] Elm
|
||
- [X] Java
|
||
- [X] Python
|
||
- [ ] Haskell
|
||
- [ ] Dart / Flutter
|
||
- [ ] C / C++
|
||
- [ ] Yaml
|
||
- [ ] Json
|
||
- [ ] Toggle error modes in flycheck (warnings, suggestions, errors, ...)
|
||
|
||
*** Research [1/2]
|
||
- [-] Research org mode [3/5]
|
||
- [X] How to add agenda entries
|
||
- [ ] Vimwiki like stuff?
|
||
- [X] Project specific todo-lists?
|
||
I'm planning on making a folder in ~/org called notes which hosts the relative paths to all project folders (as in "~/git/project" -> "~/org/notes/git/project.org")
|
||
|
||
- [ ] Links and images?
|
||
- [X] SRC block shortcut -> C-c C-,
|
||
- [X] Research yasnippets [2/2]
|
||
- [X] How to add language specific snippets?
|
||
- [X] Snippet format
|
||
|
||
*** Smaller tasks [1/9]
|
||
- [ ] remove star buffers from tab line -> https://www.emacswiki.org/emacs/TabBarMode
|
||
- [ ] make :q close a window [delete-window] whenever there is more than one window (except treemacs)
|
||
- [ ] solve drag mode in org mode (conflict with evil-org dragging)
|
||
- [-] Dired / *messages* leader-key usage
|
||
- [ ] Dired
|
||
- [X] *messages*
|
||
- [ ] Fix esc key
|
||
- [ ] ag-search-file
|
||
- [X] Lambda conceal
|
||
- [ ] remove collision between fira-code-mode and prettify-symbols
|
||
- [ ] disable next-buffer/pre in treemacs-mode-map (if exists?)
|
||
|
||
*** Less Prioritized [1/10]
|
||
- [X] Make a nice dashboard
|
||
- [ ] Customize dashboard-heading face size (and maybe font type?)
|
||
- [ ] Customize dashboard-item placement (logo in middle, items on sides)
|
||
- [ ] Add "go to previous file" type of function (instead of C-o)
|
||
- [ ] Add borders to zen mode
|
||
- [ ] Edit modeline items?
|
||
- [ ] Emoji
|
||
- [ ] Unicode
|
||
- [ ] Add images to plugin descriptions
|
||
- [ ] Add Japanese support [0/2]
|
||
- [ ] DDSKK
|
||
- [ ] pangu-spacing
|
||
|
||
*** Set up packages [0/12]
|
||
- [ ] popup
|
||
- [ ] magit-popup
|
||
- [ ] gitignore-mode
|
||
- [ ] dotenv-mode
|
||
- [ ] smooth-scrolling
|
||
- [ ] gist
|
||
- [ ] docker
|
||
- [ ] treemacs-magit?
|
||
- [ ] move-text vs dragstuff
|
||
- [ ] visual-regexp - Replace via RegExp, with real-time visual feedback directly in the buffer.
|
||
- [ ] visual-regexp-steroids - The same as visual-regexp, but use modern regular expressions instead of Emacs-style.
|
||
- [ ] From doom [0/9]
|
||
- [ ] ligatures
|
||
- [ ] ophints?
|
||
- [ ] unicode
|
||
- [ ] fold
|
||
- [ ] word-wrapping (soft wordwrap indent)
|
||
- [ ] vc-gutter (+ or - on the side of the code based on git status)
|
||
- [ ] electric ?
|
||
- [ ] editorconfig ?
|
||
- [ ] lookup
|
||
|
||
|
||
;; Local Variables:
|
||
;; eval: (add-hook 'after-save-hook (lambda ()(if (y-or-n-p "Reload?")(load-file user-init-file))) nil t)
|
||
;; eval: (add-hook 'after-save-hook (lambda ()(if (y-or-n-p "Tangle?")(org-babel-tangle))) nil t)
|
||
;; End:
|