stufffffff, so much of it!
This commit is contained in:
		
							parent
							
								
									37fcddeaa3
								
							
						
					
					
						commit
						1569de0f24
					
				
							
								
								
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					/.lsp-session-v1
 | 
				
			||||||
 | 
					/autosaves/
 | 
				
			||||||
 | 
					/eln-cache/
 | 
				
			||||||
 | 
					/elpa/
 | 
				
			||||||
 | 
					/forge-database.sqlite
 | 
				
			||||||
 | 
					/history
 | 
				
			||||||
 | 
					/ltximg/
 | 
				
			||||||
 | 
					/places
 | 
				
			||||||
 | 
					/projectile-bookmarks.eld
 | 
				
			||||||
 | 
					/projects
 | 
				
			||||||
 | 
					/recentf
 | 
				
			||||||
 | 
					/transient/
 | 
				
			||||||
							
								
								
									
										403
									
								
								init.org
									
									
									
									
									
								
							
							
						
						
									
										403
									
								
								init.org
									
									
									
									
									
								
							| 
						 | 
					@ -22,11 +22,15 @@ These are some packages which I might want to use in the future, or maybe not, b
 | 
				
			||||||
  Completion engine alternative to helm, super lightweight
 | 
					  Completion engine alternative to helm, super lightweight
 | 
				
			||||||
- https://github.com/rougier/svg-tag-mode
 | 
					- https://github.com/rougier/svg-tag-mode
 | 
				
			||||||
  create svg images to replace tokens based on regexes
 | 
					  create svg images to replace tokens based on regexes
 | 
				
			||||||
 | 
					- https://github.com/minad/org-modern
 | 
				
			||||||
 | 
					  maybe for em dashes? does loads more too.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
look at org-bullets to make a package which turns =--= and =---= into \em and \en.
 | 
					look at org-bullets to make a package which turns =--= and =---= into $\textemdash$ and $\textemdash$.
 | 
				
			||||||
 | 
					-> https://github.com/jorgenschaefer/typoel perchance?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Links
 | 
					** Links
 | 
				
			||||||
https://emacs.stackexchange.com/questions/12383/how-to-unbind-a-key
 | 
					https://emacs.stackexchange.com/questions/12383/how-to-unbind-a-key
 | 
				
			||||||
 | 
					https://github.com/noctuid/evil-guide?tab=readme-ov-file#keymap-precedence
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Start
 | 
					* Start
 | 
				
			||||||
** Lexical Scoping
 | 
					** Lexical Scoping
 | 
				
			||||||
| 
						 | 
					@ -36,7 +40,7 @@ https://emacs.stackexchange.com/questions/12383/how-to-unbind-a-key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Tangling init.org
 | 
					** Tangling init.org
 | 
				
			||||||
From Sophie's emacs.d:
 | 
					From Sophie's emacs.d:
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
  (defun tangle-init ()
 | 
					  (defun tangle-init ()
 | 
				
			||||||
    "If the current buffer is init.org the code-blocks are
 | 
					    "If the current buffer is init.org the code-blocks are
 | 
				
			||||||
  tangled, and the tangled file is compiled."
 | 
					  tangled, and the tangled file is compiled."
 | 
				
			||||||
| 
						 | 
					@ -88,6 +92,34 @@ Remove visual elements:
 | 
				
			||||||
        use-dialog-box nil)
 | 
					        use-dialog-box nil)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Warnings crop up every so often and they are usually unimportant.
 | 
				
			||||||
 | 
					I disable this buffer when actively working on my config.
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
 | 
					  (setq native-comp-async-report-warnings-errors 'silent) ;; native-comp warning
 | 
				
			||||||
 | 
					  (setq byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Backups / Auto-saves
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (defvar emacs-autosave-directory
 | 
				
			||||||
 | 
					    (concat user-emacs-directory "autosaves/")
 | 
				
			||||||
 | 
					    "This variable dictates where to put auto saves. It is set to a
 | 
				
			||||||
 | 
					    directory called autosaves located wherever your .emacs.d/ is
 | 
				
			||||||
 | 
					    located.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ;; Sets all files to be backed up and auto saved in a single directory.
 | 
				
			||||||
 | 
					  (setq backup-directory-alist
 | 
				
			||||||
 | 
					        `((".*" . ,emacs-autosave-directory))
 | 
				
			||||||
 | 
					        auto-save-file-name-transforms
 | 
				
			||||||
 | 
					        `((".*" ,emacs-autosave-directory t)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (use-package auto-save-buffers-enhanced
 | 
				
			||||||
 | 
					    :ensure t
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (auto-save-buffers-enhanced t)
 | 
				
			||||||
 | 
					    (setq auto-save-buffers-enhanced-exclude-regexps '("init.org")))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Package repositories
 | 
					** Package repositories
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (require 'package)
 | 
					  (require 'package)
 | 
				
			||||||
| 
						 | 
					@ -95,6 +127,7 @@ Remove visual elements:
 | 
				
			||||||
  (require 'use-package-ensure)
 | 
					  (require 'use-package-ensure)
 | 
				
			||||||
  (setq use-package-always-ensure t)
 | 
					  (setq use-package-always-ensure t)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Add package repositories and rank them by priority
 | 
					Add package repositories and rank them by priority
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (setq package-archives
 | 
					  (setq package-archives
 | 
				
			||||||
| 
						 | 
					@ -114,7 +147,14 @@ Add package repositories and rank them by priority
 | 
				
			||||||
  ; (package-refresh-contents)
 | 
					  ; (package-refresh-contents)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Globals
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (defvar local-lisp (concat user-emacs-directory "local-lisp/"))
 | 
				
			||||||
 | 
					  (add-to-list 'load-path  local-lisp)
 | 
				
			||||||
 | 
					  (let ((default-directory local-lisp))
 | 
				
			||||||
 | 
					    (normal-top-level-add-subdirs-to-load-path))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					** Global Variables
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (set-language-environment "UTF-8")
 | 
					  (set-language-environment "UTF-8")
 | 
				
			||||||
  (column-number-mode      t) ;; Show current column number in mode line
 | 
					  (column-number-mode      t) ;; Show current column number in mode line
 | 
				
			||||||
| 
						 | 
					@ -129,6 +169,20 @@ Add package repositories and rank them by priority
 | 
				
			||||||
  (show-paren-mode         t) ;; Highlight matching parentheses
 | 
					  (show-paren-mode         t) ;; Highlight matching parentheses
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (setq-default tab-width 4
 | 
				
			||||||
 | 
					                fill-column 80
 | 
				
			||||||
 | 
					                indent-tabs-mode nil)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 #+begin_src emacs-lisp
 | 
				
			||||||
 | 
					   (use-package exec-path-from-shell
 | 
				
			||||||
 | 
					     :ensure t
 | 
				
			||||||
 | 
					     :config
 | 
				
			||||||
 | 
					     (when (daemonp)
 | 
				
			||||||
 | 
					       (exec-path-from-shell-initialize)))
 | 
				
			||||||
 | 
					 #+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Keymap:
 | 
					Keymap:
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (defvar custom-bindings-map (make-keymap)
 | 
					  (defvar custom-bindings-map (make-keymap)
 | 
				
			||||||
| 
						 | 
					@ -141,9 +195,9 @@ Keymap:
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
* Visuals
 | 
					* Visuals
 | 
				
			||||||
** Themes
 | 
					** Themes
 | 
				
			||||||
[[https://github.com/mswift42/light-soap-theme][Light Soap Theme]] for writing
 | 
					Light theme for writing
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package light-soap-theme
 | 
					  (use-package gruvbox-theme
 | 
				
			||||||
    :ensure t)
 | 
					    :ensure t)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,7 +217,7 @@ Keymap:
 | 
				
			||||||
Manage themes, use dark-theme by default:
 | 
					Manage themes, use dark-theme by default:
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (defvar nemo/dark-theme 'doom-one)
 | 
					  (defvar nemo/dark-theme 'doom-one)
 | 
				
			||||||
  (defvar nemo/light-theme 'light-soap-theme)
 | 
					  (defvar nemo/light-theme 'gruvbox-light-medium)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (load-theme nemo/dark-theme t)
 | 
					  (load-theme nemo/dark-theme t)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
| 
						 | 
					@ -317,17 +371,59 @@ Honestly not very happy with this at the moment, but it's kind of hacked togethe
 | 
				
			||||||
      :inherit 'mode-line-position-face
 | 
					      :inherit 'mode-line-position-face
 | 
				
			||||||
      :foreground "black" :background "#eab700")
 | 
					      :foreground "black" :background "#eab700")
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					 | 
				
			||||||
* Packages
 | 
					* Packages
 | 
				
			||||||
** magit
 | 
					** Web Search
 | 
				
			||||||
Magit is awesome and the number one reason why I use emacs!
 | 
					 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package magit
 | 
					  (use-package engine-mode
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (defengine duckduckgo
 | 
				
			||||||
 | 
					               "https://duckduckgo.com/?q=%s"
 | 
				
			||||||
 | 
					               :keybinding "g")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (defengine twitter
 | 
				
			||||||
 | 
					               "https://twitter.com/search?q=%s"
 | 
				
			||||||
 | 
					               :keybinding "x")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (defengine wikipedia
 | 
				
			||||||
 | 
					               "https://www.wikipedia.org/search-redirect.php?language=en&go=Go&search=%s"
 | 
				
			||||||
 | 
					               :keybinding "w"
 | 
				
			||||||
 | 
					               :docstring "Searchin' the wikis.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (defengine wiktionary
 | 
				
			||||||
 | 
					               "https://www.wikipedia.org/search-redirect.php?family=wiktionary&language=en&go=Go&search=%s"
 | 
				
			||||||
 | 
					               :keybinding "d")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (defengine wolfram-alpha
 | 
				
			||||||
 | 
					               "https://www.wolframalpha.com/input/?i=%s")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (defengine youtube
 | 
				
			||||||
 | 
					               "https://www.youtube.com/results?aq=f&oq=&search_query=%s"
 | 
				
			||||||
 | 
					               :keybinding "y")
 | 
				
			||||||
 | 
					    (engine-mode t)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					** =magit=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
magit-todos sounds cool.
 | 
					try out =diff-hl= for highlighting diffs in magit:
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
 | 
					(use-package diff-hl
 | 
				
			||||||
 | 
					  :config
 | 
				
			||||||
 | 
					  (diff-hl-margin-mode)
 | 
				
			||||||
 | 
					  (global-diff-hl-mode))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=magit= is awesome and the number one reason why I use Emacs!
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					(use-package magit
 | 
				
			||||||
 | 
					  :defer t
 | 
				
			||||||
 | 
					  :config
 | 
				
			||||||
 | 
					  (setq magit-mode-quit-window 'magit-restore-window-configuration
 | 
				
			||||||
 | 
					        ;;magit-auto-revert-mode t
 | 
				
			||||||
 | 
					        ))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=magit-todos= sounds cool.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package magit-todos
 | 
					  (use-package magit-todos
 | 
				
			||||||
    :after magit
 | 
					    :after magit
 | 
				
			||||||
| 
						 | 
					@ -335,7 +431,7 @@ magit-todos sounds cool.
 | 
				
			||||||
    (magit-todos-mode t))
 | 
					    (magit-todos-mode t))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
And magit-forge sounds cool aswell.
 | 
					And forge sounds cool as well.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package forge
 | 
					  (use-package forge
 | 
				
			||||||
    :after magit)
 | 
					    :after magit)
 | 
				
			||||||
| 
						 | 
					@ -359,17 +455,21 @@ Used by Spacemacs as well.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** evil
 | 
					** evil
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package evil
 | 
					(use-package evil
 | 
				
			||||||
    :ensure t
 | 
					  :ensure t
 | 
				
			||||||
    :init
 | 
					  :init
 | 
				
			||||||
    (setq evil-want-C-u-scroll t)
 | 
					  (setq evil-want-C-u-scroll t)
 | 
				
			||||||
    :config
 | 
					  (setq evil-want-keybinding nil)
 | 
				
			||||||
    (evil-mode 1)
 | 
					  (setq evil-want-integration t)
 | 
				
			||||||
 | 
					  :config
 | 
				
			||||||
 | 
					  (evil-mode 1)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Evil keybinds:
 | 
					Evil keybinds:
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (evil-global-set-key 'normal (kbd "<SPC>TAB") 'mode-line-other-buffer)
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>bb") 'consult-buffer)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>bb") 'consult-buffer)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>bd") 'kill-current-buffer)
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>ff") 'find-file)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>ff") 'find-file)
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>wj") 'evil-window-down)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>wj") 'evil-window-down)
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>wk") 'evil-window-up)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>wk") 'evil-window-up)
 | 
				
			||||||
| 
						 | 
					@ -377,10 +477,18 @@ Evil keybinds:
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>wl") 'evil-window-right)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>wl") 'evil-window-right)
 | 
				
			||||||
  ;; magit
 | 
					  ;; magit
 | 
				
			||||||
  (evil-define-key 'normal 'global (kbd "<SPC>gs") 'magit-status)
 | 
					  (evil-define-key 'normal 'global (kbd "<SPC>gs") 'magit-status)
 | 
				
			||||||
  ; (evil-define-key 'normal 'global (kbd "<SPC>gd") 'magit-diff)
 | 
					                                          ; (evil-define-key 'normal 'global (kbd "<SPC>gd") 'magit-diff)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal org-mode-map (kbd "TAB") 'org-cycle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ;; org-mode
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'org-mode-map (kbd "<SPC>ih") 'org-insert-heading)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'org-mode-map (kbd "<SPC>is") 'org-insert-subheading)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'org-mode-map (kbd "<SPC>ii") 'org-insert-item)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'org-mode-map (kbd "<SPC>ib") 'org-insert-structure-template)
 | 
				
			||||||
 | 
					  (evil-define-key 'normal 'org-mode-map (kbd "<SPC>il") 'org-insert-link)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Close =config=.
 | 
					Close =:config=.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
| 
						 | 
					@ -395,13 +503,13 @@ Close =config=.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package evil-collection
 | 
					  (use-package evil-collection
 | 
				
			||||||
    :after evil
 | 
					    :after evil
 | 
				
			||||||
    :defer t
 | 
					    :ensure t
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (evil-collection-init))
 | 
					    (evil-collection-init))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** undo-fu
 | 
					** =undo-fu=
 | 
				
			||||||
Also use undo-fu, which evil can use.
 | 
					Also use =undo-fu=, which evil can use.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package undo-fu
 | 
					  (use-package undo-fu
 | 
				
			||||||
    :defer t)
 | 
					    :defer t)
 | 
				
			||||||
| 
						 | 
					@ -416,7 +524,7 @@ Also use undo-fu, which evil can use.
 | 
				
			||||||
    (projectile-mode))
 | 
					    (projectile-mode))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Ripgrep & Co.
 | 
					** =ripgrep= & Co.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package ripgrep
 | 
					  (use-package ripgrep
 | 
				
			||||||
    :defer t)
 | 
					    :defer t)
 | 
				
			||||||
| 
						 | 
					@ -432,11 +540,16 @@ Also use undo-fu, which evil can use.
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
* Stuff
 | 
					* Stuff
 | 
				
			||||||
** Minibuffer escape
 | 
					** Minibuffer escape
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
  (setq minibuffer-prompt-properties
 | 
					(setq minibuffer-prompt-properties
 | 
				
			||||||
  	  '(read-only t intangible t cursor-intangible t face minibuffer-prompt))
 | 
						  '(read-only t
 | 
				
			||||||
  (add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
 | 
					        intangible t
 | 
				
			||||||
 | 
					        cursor-intangible t
 | 
				
			||||||
 | 
					        face minibuffer-prompt))
 | 
				
			||||||
 | 
					(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (defun nemo/abort-minibuffer-if-active ()
 | 
					  (defun nemo/abort-minibuffer-if-active ()
 | 
				
			||||||
    "Abort the minibuffer if it is active."
 | 
					    "Abort the minibuffer if it is active."
 | 
				
			||||||
    (interactive)
 | 
					    (interactive)
 | 
				
			||||||
| 
						 | 
					@ -446,6 +559,16 @@ Also use undo-fu, which evil can use.
 | 
				
			||||||
  (global-set-key (kbd "<escape>") 'nemo/abort-minibuffer-if-active)
 | 
					  (global-set-key (kbd "<escape>") 'nemo/abort-minibuffer-if-active)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
* Writing
 | 
					* Writing
 | 
				
			||||||
 | 
					** Olivetti
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package olivetti
 | 
				
			||||||
 | 
					    :defer t
 | 
				
			||||||
 | 
					    ; :bind (:map custom-bindings-map ("C-c o" . olivetti-mode))
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (setq olivetti-style t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (add-hook 'olivetti-mode-on-hook (lambda () (olivetti-set-width 88)))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
** Spelling
 | 
					** Spelling
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package jinx
 | 
					  (use-package jinx
 | 
				
			||||||
| 
						 | 
					@ -464,7 +587,7 @@ Also use undo-fu, which evil can use.
 | 
				
			||||||
    (LaTeX-mode . reftex-mode)
 | 
					    (LaTeX-mode . reftex-mode)
 | 
				
			||||||
    ; (LaTeX-mode . (lambda () (corfu-mode -1)))
 | 
					    ; (LaTeX-mode . (lambda () (corfu-mode -1)))
 | 
				
			||||||
    ; (LaTeX-mode . outline-minor-mode)
 | 
					    ; (LaTeX-mode . outline-minor-mode)
 | 
				
			||||||
    ; (LaTeX-mode . olivetti-mode)
 | 
					    (LaTeX-mode . olivetti-mode)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -480,7 +603,7 @@ Taken from [[https://sophiebos.io/posts/prettifying-emacs-org-mode/][ here]].
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package org
 | 
					  (use-package org
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
    ; :hook (org-mode . olivetti-mode)
 | 
					    :hook (org-mode . olivetti-mode)
 | 
				
			||||||
    :hook (org-mode . variable-pitch-mode)
 | 
					    :hook (org-mode . variable-pitch-mode)
 | 
				
			||||||
    ; I basically always want to be running =visual-line-mode= anyway, but certainly in org-mode.
 | 
					    ; I basically always want to be running =visual-line-mode= anyway, but certainly in org-mode.
 | 
				
			||||||
    :hook (org-mode . visual-line-mode)
 | 
					    :hook (org-mode . visual-line-mode)
 | 
				
			||||||
| 
						 | 
					@ -502,6 +625,11 @@ Change heading font sizes:
 | 
				
			||||||
  '(outline-9          ((t (:height 1.1)))))
 | 
					  '(outline-9          ((t (:height 1.1)))))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Open Org files with the content folded away:
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					(setq org-startup-folded 'content)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Enable LaTeX previews.
 | 
					Enable LaTeX previews.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (setq org-startup-with-latex-preview t)
 | 
					  (setq org-startup-with-latex-preview t)
 | 
				
			||||||
| 
						 | 
					@ -539,12 +667,20 @@ End =:config=
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Use org-bullets for fancy headline markers
 | 
					Use org-bullets for fancy headline markers
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
  (use-package org-bullets
 | 
					  (use-package org-bullets
 | 
				
			||||||
    :hook (org-mode . (lambda () (org-bullets-mode 1)))
 | 
					    :hook (org-mode . (lambda () (org-bullets-mode 1)))
 | 
				
			||||||
    :config)
 | 
					    :config)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use typo-mode in org-mode for en and em dashes:
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (require 'typo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (typo-global-mode 1)
 | 
				
			||||||
 | 
					  (add-hook 'org-mode-hook 'typo-mode)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Use =org-fragtog= to show embedded LaTeX fragments when in insert mode.
 | 
					Use =org-fragtog= to show embedded LaTeX fragments when in insert mode.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package org-fragtog
 | 
					  (use-package org-fragtog
 | 
				
			||||||
| 
						 | 
					@ -563,6 +699,13 @@ Using =org-appear= we can hide emphasis markers for italic, bold, etc. and show
 | 
				
			||||||
          org-appear-autosubmarkers t)) ;; show _.._ and superscript markers
 | 
					          org-appear-autosubmarkers t)) ;; show _.._ and superscript markers
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package org-modern
 | 
				
			||||||
 | 
					    :defer t
 | 
				
			||||||
 | 
					    :after org
 | 
				
			||||||
 | 
					    :hook (org-mode . org-modern-mode))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Change org face fonts and font sizes for headers.
 | 
					Change org face fonts and font sizes for headers.
 | 
				
			||||||
#+begin_src emacs-lisp :tangle no
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
  (require 'org-faces)
 | 
					  (require 'org-faces)
 | 
				
			||||||
| 
						 | 
					@ -617,8 +760,8 @@ prettify symbols for quotes and source blocks in org-mode.
 | 
				
			||||||
    (prettify-symbols-mode))
 | 
					    (prettify-symbols-mode))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
svg-tags-mode for fancy svg images
 | 
					=svg-tags-mode= for fancy SVG images
 | 
				
			||||||
#+begin_src emacs-lisp :tangle no
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package svg-tag-mode
 | 
					  (use-package svg-tag-mode
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (setq svg-tag-tags
 | 
					    (setq svg-tag-tags
 | 
				
			||||||
| 
						 | 
					@ -627,6 +770,27 @@ svg-tags-mode for fancy svg images
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Agenda
 | 
					* Agenda
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (require 'org)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (setq org-agenda-start-on-weekday nil
 | 
				
			||||||
 | 
					        org-agenda-block-separator nil
 | 
				
			||||||
 | 
					        org-agenda-remove-tags t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (use-package org-super-agenda
 | 
				
			||||||
 | 
					    :after org
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (org-super-agenda-mode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (setq org-agenda-files (list "~/Shared/agenda.org"
 | 
				
			||||||
 | 
					                               "~/notes.org"
 | 
				
			||||||
 | 
					                               "~/projects.org"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (add-hook 'emacs-startup-hook
 | 
				
			||||||
 | 
					  		  (lambda () (progn (org-agenda nil "a")
 | 
				
			||||||
 | 
					  					        (delete-other-windows)
 | 
				
			||||||
 | 
					  					        (olivetti-mode))))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
* Navigation / Minibuffer
 | 
					* Navigation / Minibuffer
 | 
				
			||||||
Realistically, I will probably never use 90% of Helm's functionality, so vertico should be sufficient.
 | 
					Realistically, I will probably never use 90% of Helm's functionality, so vertico should be sufficient.
 | 
				
			||||||
** Treemacs
 | 
					** Treemacs
 | 
				
			||||||
| 
						 | 
					@ -672,11 +836,17 @@ Realistically, I will probably never use 90% of Helm's functionality, so vertico
 | 
				
			||||||
  (use-package savehist :init (savehist-mode))
 | 
					  (use-package savehist :init (savehist-mode))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use consult-xref for lsp-xref and xref-find-references.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package consult
 | 
					  (use-package consult
 | 
				
			||||||
    :bind (:map custom-bindings-map
 | 
					    :bind (:map custom-bindings-map
 | 
				
			||||||
                ("C-x b" . consult-buffer)
 | 
					                ("C-x b" . consult-buffer)
 | 
				
			||||||
                ("M-g g" . consult-goto-line)))
 | 
					                ("M-g g" . consult-goto-line))
 | 
				
			||||||
 | 
					    :init
 | 
				
			||||||
 | 
					    (setq xref-show-xrefs-function 'consult-xref
 | 
				
			||||||
 | 
					          xref-show-definitions-function 'consult-xref)
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    ())
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
| 
						 | 
					@ -685,31 +855,37 @@ Realistically, I will probably never use 90% of Helm's functionality, so vertico
 | 
				
			||||||
    (marginalia-mode 1))
 | 
					    (marginalia-mode 1))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp :tangle no
 | 
				
			||||||
  (use-package corfu
 | 
					(use-package corfu
 | 
				
			||||||
    :custom
 | 
					  :custom
 | 
				
			||||||
    (corfu-auto t)                 ;; Enable auto completion
 | 
					  ;; Enable auto completion
 | 
				
			||||||
    (corfu-cycle t)                ;; Enable cycling for `corfu-next/previous'
 | 
					  (corfu-auto t)
 | 
				
			||||||
    (corfu-auto-delay 0)           ;; No delay
 | 
					  ;; Enable cycling for `corfu-next/previous'
 | 
				
			||||||
    (corfu-auto-prefix 2)          ;; Start when this many characters have been typed
 | 
					  (corfu-cycle t)
 | 
				
			||||||
    (corfu-popupinfo-delay 0.5)    ;; Short delay
 | 
					  ;; No delay
 | 
				
			||||||
    (corfu-preselect 'prompt)      ;; Preselect the prompt
 | 
					  (corfu-auto-delay 0)
 | 
				
			||||||
    :init
 | 
					  ;; Start when this many characters have been typed
 | 
				
			||||||
    (global-corfu-mode))
 | 
					  (corfu-auto-prefix 2)
 | 
				
			||||||
 | 
					  ;; Short delay
 | 
				
			||||||
 | 
					  (corfu-popupinfo-delay 0.5)
 | 
				
			||||||
 | 
					  ;; Preselect the prompt
 | 
				
			||||||
 | 
					  (corfu-preselect 'prompt)
 | 
				
			||||||
 | 
					  :init
 | 
				
			||||||
 | 
					  (global-corfu-mode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (use-package emacs
 | 
					(use-package emacs
 | 
				
			||||||
    :init
 | 
					  :init
 | 
				
			||||||
    ;; TAB cycle if there are only few candidates
 | 
					  ;; TAB cycle if there are only few candidates
 | 
				
			||||||
    (setq completion-cycle-threshold 3)
 | 
					  (setq completion-cycle-threshold 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ;; Hide commands in M-x which do not apply to the current mode.
 | 
					  ;; Hide commands in M-x which do not apply to the current mode.  Corfu
 | 
				
			||||||
    ;; Corfu commands are hidden, since they are not supposed to be used via M-x.
 | 
					  ;; commands are hidden, since they are not supposed to be used via M-x.
 | 
				
			||||||
    (setq read-extended-command-predicate
 | 
					  (setq read-extended-command-predicate
 | 
				
			||||||
          #'command-completion-default-include-p)
 | 
					        #'command-completion-default-include-p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ;; Enable indentation+completion using the TAB key.
 | 
					  ;; Enable indentation+completion using the TAB key.
 | 
				
			||||||
    ;; `completion-at-point' is often bound to M-TAB.
 | 
					  ;; `completion-at-point' is often bound to M-TAB.
 | 
				
			||||||
    (setq tab-always-indent 'complete))
 | 
					  (setq tab-always-indent 'complete))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This package seems to slow down search quite a bit in common buffers like find-file and exectue-extended-comand:
 | 
					This package seems to slow down search quite a bit in common buffers like find-file and exectue-extended-comand:
 | 
				
			||||||
| 
						 | 
					@ -786,7 +962,7 @@ This package seems to slow down search quite a bit in common buffers like find-f
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package smartparens
 | 
					  (use-package smartparens
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
    :hook (prog-mode text-mode markdown-mode)
 | 
					    :hook ((prog-mode text-mode markdown-mode) . smartparens-mode)
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (require 'smartparens-config))
 | 
					    (require 'smartparens-config))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
| 
						 | 
					@ -794,7 +970,11 @@ This package seems to slow down search quite a bit in common buffers like find-f
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package company
 | 
					  (use-package company
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
    :hook (after-init . company-mode))
 | 
					    :hook (after-init . global-company-mode)
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (setq
 | 
				
			||||||
 | 
					     company-minimum-prefix-length 1
 | 
				
			||||||
 | 
					     company-idle-delay 0.0))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
** Flycheck
 | 
					** Flycheck
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
| 
						 | 
					@ -803,15 +983,44 @@ This package seems to slow down search quite a bit in common buffers like find-f
 | 
				
			||||||
    :hook (after-init. global-flycheck-mode)
 | 
					    :hook (after-init. global-flycheck-mode)
 | 
				
			||||||
    :config)
 | 
					    :config)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					** Yasnippet
 | 
				
			||||||
 | 
					Auto-completion requires yasnippet for some competions, such as function arguments and parens.
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package yasnippet
 | 
				
			||||||
 | 
					    :defer t
 | 
				
			||||||
 | 
					    :hook ((prog-mode text-mode) . yas-minor-mode))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (use-package yasnippet-snippets
 | 
				
			||||||
 | 
					    :ensure t)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** LSP
 | 
					** LSP
 | 
				
			||||||
Use lsp-mode and lsp-ui for LSP functionality.
 | 
					Use lsp-mode and lsp-ui for LSP functionality.
 | 
				
			||||||
Emacs has its own internal LSP client called eglot, but I've never used it and I'm relatively happy with lsp-mode.
 | 
					Emacs has its own internal LSP client called eglot, but I've never used it and I'm relatively happy with lsp-mode.
 | 
				
			||||||
 | 
					LSP sets it's prefix key to =s-l= by default, which uses the Super key which I use as my Mod key in sway, so I can't use it in emacs.
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package lsp-mode
 | 
					  (use-package lsp-mode
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
    :hook (prog-mode . lsp)
 | 
					    :hook (prog-mode . lsp)
 | 
				
			||||||
    :hook (lsp-mode . lsp-enable-which-key-integration)
 | 
					    :hook (lsp-mode . lsp-enable-which-key-integration)
 | 
				
			||||||
    :commands lsp)
 | 
					    :hook (lsp-mode . lsp-inlay-hints-mode)
 | 
				
			||||||
 | 
					    :init
 | 
				
			||||||
 | 
					    (setq lsp-keymap-prefix "C-l")
 | 
				
			||||||
 | 
					    :commands lsp
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (setq
 | 
				
			||||||
 | 
					    lsp-idle-delay 0.6
 | 
				
			||||||
 | 
					    lsp-inlay-hint-enable t
 | 
				
			||||||
 | 
					    lsp-modeline-code-actions-enable t
 | 
				
			||||||
 | 
					    lsp-modeline-code-actions-segments '(name count)
 | 
				
			||||||
 | 
					    lsp-modeline-diagnostics-enable t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lsp-rust-server 'rust-analyzer
 | 
				
			||||||
 | 
					    lsp-rust-analyzer-server-display-inlay-hints t
 | 
				
			||||||
 | 
					    lsp-rust-analyzer-proc-macro-enable t
 | 
				
			||||||
 | 
					    lsp-rust-analyzer-binding-mode-hints t
 | 
				
			||||||
 | 
					    lsp-rust-analyzer-display-closure-return-type-hints t
 | 
				
			||||||
 | 
					    lsp-rust-analyzer-server-format-inlay-hints t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (use-package lsp-treemacs
 | 
					  (use-package lsp-treemacs
 | 
				
			||||||
    :commands lsp-treemacs-errors-list)
 | 
					    :commands lsp-treemacs-errors-list)
 | 
				
			||||||
| 
						 | 
					@ -819,26 +1028,17 @@ Emacs has its own internal LSP client called eglot, but I've never used it and I
 | 
				
			||||||
  (use-package lsp-ui
 | 
					  (use-package lsp-ui
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (setq
 | 
					    (setq
 | 
				
			||||||
    ;;lsp-modeline-code-actions-enable nil
 | 
					     ;;lsp-modeline-code-actions-enable nil
 | 
				
			||||||
    ;;lsp-rust-analyzer-cargo-all-targets nil
 | 
					     ;;lsp-rust-analyzer-cargo-all-targets nil
 | 
				
			||||||
    lsp-rust-server 'rust-analyzer
 | 
					     ;; lsp-rust-analyzer-server-command "xwin-env rust-analyzer"
 | 
				
			||||||
    ;; lsp-rust-analyzer-server-command "xwin-env rust-analyzer"
 | 
					     lsp-ui-sideline-show-code-actions t
 | 
				
			||||||
    lsp-ui-sideline-show-code-actions t
 | 
					     lsp-ui-doc-enable t
 | 
				
			||||||
    lsp-ui-doc-enable t
 | 
					     lsp-ui-doc-delay 0.5
 | 
				
			||||||
    lsp-ui-doc-delay 0.5
 | 
					     lsp-ui-doc-show-with-cursor t
 | 
				
			||||||
    lsp-ui-doc-show-with-cursor t
 | 
					 | 
				
			||||||
                                          ; lsp-ui-doc-use-childframe t
 | 
					                                          ; lsp-ui-doc-use-childframe t
 | 
				
			||||||
                                          ; lsp-ui-doc-use-webkit t
 | 
					                                          ; lsp-ui-doc-use-webkit t
 | 
				
			||||||
    lsp-inlay-hint-enable t
 | 
					     )
 | 
				
			||||||
    lsp-modeline-code-actions-enable t
 | 
					    :commands lsp-ui-mode)
 | 
				
			||||||
    lsp-modeline-code-actions-segments '(name count)
 | 
					 | 
				
			||||||
    lsp-modeline-diagnostics-enable t
 | 
					 | 
				
			||||||
    lsp-rust-analyzer-proc-macro-enable t
 | 
					 | 
				
			||||||
    lsp-rust-analyzer-binding-mode-hints t
 | 
					 | 
				
			||||||
    lsp-rust-analyzer-display-closure-return-type-hints t
 | 
					 | 
				
			||||||
    lsp-rust-analyzer-server-format-inlay-hints t)
 | 
					 | 
				
			||||||
    :commands lsp-ui-mode
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Rust
 | 
					** Rust
 | 
				
			||||||
| 
						 | 
					@ -852,12 +1052,61 @@ Emacs has its own internal LSP client called eglot, but I've never used it and I
 | 
				
			||||||
    :config
 | 
					    :config
 | 
				
			||||||
    (setq rust-format-on-save t))
 | 
					    (setq rust-format-on-save t))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package rust-playground
 | 
				
			||||||
 | 
					    :defer t)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[https://github.com/kwrooijen/cargo.el][cargo-mode]]
 | 
					[[https://github.com/kwrooijen/cargo.el][cargo-mode]]
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
  (use-package cargo-mode
 | 
					  (use-package cargo-mode
 | 
				
			||||||
    :defer t
 | 
					    :defer t
 | 
				
			||||||
    :hook (rust-mode . cargo-minor-mode))
 | 
					    :hook (rust-mode . cargo-minor-mode))
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					** Web
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package web-mode
 | 
				
			||||||
 | 
					    :defer t
 | 
				
			||||||
 | 
					    :mode
 | 
				
			||||||
 | 
					    (("\\.phtml\\'"      . web-mode)
 | 
				
			||||||
 | 
					     ("\\.tpl\\.php\\'"  . web-mode)
 | 
				
			||||||
 | 
					     ("\\.twig\\'"       . web-mode)
 | 
				
			||||||
 | 
					     ("\\.xml\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.html\\'"       . web-mode)
 | 
				
			||||||
 | 
					     ("\\.htm\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.[gj]sp\\'"     . web-mode)
 | 
				
			||||||
 | 
					     ("\\.as[cp]x?\\'"   . web-mode)
 | 
				
			||||||
 | 
					     ("\\.eex\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.erb\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.mustache\\'"   . web-mode)
 | 
				
			||||||
 | 
					     ("\\.handlebars\\'" . web-mode)
 | 
				
			||||||
 | 
					     ("\\.hbs\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.eco\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.ejs\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.svelte\\'"     . web-mode)
 | 
				
			||||||
 | 
					     ("\\.ctp\\'"        . web-mode)
 | 
				
			||||||
 | 
					     ("\\.djhtml\\'"     . web-mode))
 | 
				
			||||||
 | 
					    :config
 | 
				
			||||||
 | 
					    (setq
 | 
				
			||||||
 | 
					     web-mode-css-indent-offset 2
 | 
				
			||||||
 | 
					     web-mode-code-indent-offset 2
 | 
				
			||||||
 | 
					     web-mode-attr-indent-offset 2
 | 
				
			||||||
 | 
					     web-mode-markup-indent-offset 2))
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					** C/C++
 | 
				
			||||||
 | 
					clang-format
 | 
				
			||||||
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (use-package clang-format
 | 
				
			||||||
 | 
					    :defer t)
 | 
				
			||||||
 | 
					#+end_src
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* Keybinds
 | 
					* Keybinds
 | 
				
			||||||
#+begin_src emacs-lisp
 | 
					#+begin_src emacs-lisp
 | 
				
			||||||
 | 
					  (define-key custom-bindings-map (kbd "C-c l") 'org-store-link)
 | 
				
			||||||
 | 
					  (define-key custom-bindings-map (kbd "C-c a") 'org-agenda)
 | 
				
			||||||
 | 
					  (define-key custom-bindings-map (kbd "C-c c") 'org-capture)
 | 
				
			||||||
 | 
					  (define-key custom-bindings-map (kbd "C-c t") 'org-todo)
 | 
				
			||||||
#+end_src
 | 
					#+end_src
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										471
									
								
								local-lisp/typo.el
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										471
									
								
								local-lisp/typo.el
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,471 @@
 | 
				
			||||||
 | 
					;;; typo.el --- Minor mode for typographic editing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Copyright (C) 2012 Jorgen Schaefer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; Version: 1.1
 | 
				
			||||||
 | 
					;; Author: Jorgen Schaefer <forcer@forcix.cx>
 | 
				
			||||||
 | 
					;; URL: https://github.com/jorgenschaefer/typoel
 | 
				
			||||||
 | 
					;; Created: 6 Feb 2012
 | 
				
			||||||
 | 
					;; Keywords: convenience, wp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; This program is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					;; modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					;; as published by the Free Software Foundation; either version 3
 | 
				
			||||||
 | 
					;; of the License, or (at your option) any later version.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					;; GNU General Public License for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					;; along with this program; if not, write to the Free Software
 | 
				
			||||||
 | 
					;; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 | 
				
			||||||
 | 
					;; 02110-1301  USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Commentary:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; typo.el includes two modes, `typo-mode` and `typo-global-mode`.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; `typo-mode` is a buffer-specific minor mode that will change a number
 | 
				
			||||||
 | 
					;; of normal keys to make them insert typographically useful unicode
 | 
				
			||||||
 | 
					;; characters. Some of those keys can be used repeatedly to cycle through
 | 
				
			||||||
 | 
					;; variations. This includes in particular quotation marks and dashes.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; `typo-global-mode` introduces a global minor mode which adds the
 | 
				
			||||||
 | 
					;; `C-c 8` prefix to complement Emacs’ default `C-x 8` prefix map.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; See the documentation of `typo-mode` and `typo-global-mode` for
 | 
				
			||||||
 | 
					;; further details.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; ## Quotation Marks
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; > “He said, ‘leave me alone,’ and closed the door.”
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; All quotation marks in this sentence were added by hitting the " key
 | 
				
			||||||
 | 
					;; exactly once each. typo.el guessed the correct glyphs to use from
 | 
				
			||||||
 | 
					;; context. If it gets it wrong, you can just repeat hitting the " key
 | 
				
			||||||
 | 
					;; until you get the quotation mark you wanted.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; `M-x typo-change-language` lets you change which quotation marks to
 | 
				
			||||||
 | 
					;; use. This is also configurable, in case you want to add your own.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; ## Dashes and Dots
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; The hyphen key will insert a default hyphen-minus glyph. On repeated
 | 
				
			||||||
 | 
					;; use, though, it will cycle through the en-dash, em-dash, and a number
 | 
				
			||||||
 | 
					;; of other dash-like glyphs available in Unicode. This means that typing
 | 
				
			||||||
 | 
					;; two dashes inserts an en-dash and typing three dashes inserts an
 | 
				
			||||||
 | 
					;; em-dash, as would be expected. The name of the currently inserted dash
 | 
				
			||||||
 | 
					;; is shown in the minibuffer.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; The full stop key will self-insert as usual. When three dots are
 | 
				
			||||||
 | 
					;; inserted in a row, though, they are replaced by a horizontal ellipsis
 | 
				
			||||||
 | 
					;; glyph.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; ## Other Keys
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; Tick and backtick keys insert the appropriate quotation mark as well.
 | 
				
			||||||
 | 
					;; The less-than and greater-than signs cycle insert the default glyphs
 | 
				
			||||||
 | 
					;; on first use, but cycle through double and single guillemets on
 | 
				
			||||||
 | 
					;; repeated use.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; ## Prefix Map
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; In addition to the above, typo-global-mode also provides a
 | 
				
			||||||
 | 
					;; globally-accessible key map under the `C-c 8` prefix (akin to Emacs’
 | 
				
			||||||
 | 
					;; default `C-x 8` prefix map) to insert various Unicode characters.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; In particular, `C-c 8 SPC` will insert a no-break space. Continued use
 | 
				
			||||||
 | 
					;; of SPC after this will cycle through half a dozen different space
 | 
				
			||||||
 | 
					;; types available in Unicode.
 | 
				
			||||||
 | 
					;;
 | 
				
			||||||
 | 
					;; Check the mode’s documentation for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; For some reason, Emacs default has these as parentheses. This is
 | 
				
			||||||
 | 
					;; completely confusing when mixing this with normal parentheses,
 | 
				
			||||||
 | 
					;; and gets e.g. the following code wrong, even. Punctuation syntax
 | 
				
			||||||
 | 
					;; results in much more intuitive behavior.
 | 
				
			||||||
 | 
					(modify-syntax-entry ?» ".")
 | 
				
			||||||
 | 
					(modify-syntax-entry ?« ".")
 | 
				
			||||||
 | 
					;; Sorry for the intrusion.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defgroup typo nil
 | 
				
			||||||
 | 
					  "*Typography mode for Emacs"
 | 
				
			||||||
 | 
					  :prefix "typo-"
 | 
				
			||||||
 | 
					  :group 'convenience)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defcustom typo-quotation-marks
 | 
				
			||||||
 | 
					  '(("Czech"                 "„" "“" "‚" "‘")
 | 
				
			||||||
 | 
					    ("Czech (Guillemets)"    "»" "«" "›" "‹")
 | 
				
			||||||
 | 
					    ("English"               "“" "”" "‘" "’")
 | 
				
			||||||
 | 
					    ("German"                "„" "“" "‚" "‘")
 | 
				
			||||||
 | 
					    ("German (Guillemets)"   "»" "«" "›" "‹")
 | 
				
			||||||
 | 
					    ("French"                "«" "»" "‹" "›")
 | 
				
			||||||
 | 
					    ("Finnish"               "”" "”" "’" "’")
 | 
				
			||||||
 | 
					    ("Finnish (Guillemets)"  "»" "»" "›" "›")
 | 
				
			||||||
 | 
					    ("Swedish"               "”" "”" "’" "’")
 | 
				
			||||||
 | 
					    ("Russian"               "«" "»" "„" "“")
 | 
				
			||||||
 | 
					    ("Italian"               "«" "»" "“" "”")
 | 
				
			||||||
 | 
					    ("Polish"                "„" "”" "‚" "’")
 | 
				
			||||||
 | 
					    ("Serbian"               "„" "”" "’" "’")
 | 
				
			||||||
 | 
					    ("Ukrainian"             "«" "»" "„" "“"))
 | 
				
			||||||
 | 
					  "*Quotation marks per language."
 | 
				
			||||||
 | 
					  :type '(repeat (list (string :tag "Language")
 | 
				
			||||||
 | 
					                       (string :tag "Double Opening Quotation Mark")
 | 
				
			||||||
 | 
					                       (string :tag "Double Closing Quotation Mark")
 | 
				
			||||||
 | 
					                       (string :tag "Single Opening Quotation Mark")
 | 
				
			||||||
 | 
					                       (string :tag "Single Closing Quotation Mark")))
 | 
				
			||||||
 | 
					  :group 'typo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defcustom typo-language "English"
 | 
				
			||||||
 | 
					  "*The default language typo-mode should use."
 | 
				
			||||||
 | 
					  :type '(string :tag "Default Language")
 | 
				
			||||||
 | 
					  :group 'typo)
 | 
				
			||||||
 | 
					(make-variable-buffer-local 'typo-language)
 | 
				
			||||||
 | 
					(put 'typo-language 'safe-local-variable 'stringp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defcustom typo-disable-electricity-functions '(typo-in-xml-tag)
 | 
				
			||||||
 | 
					  "*A list of functions to call before an electric key binding is
 | 
				
			||||||
 | 
					used. If one of the functions returns non-nil, the key
 | 
				
			||||||
 | 
					self-inserts.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This can be used to disable the electric keys in e.g. XML tags."
 | 
				
			||||||
 | 
					  :type 'hook
 | 
				
			||||||
 | 
					  :options '(typo-in-xml-tag)
 | 
				
			||||||
 | 
					  :group 'typo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defvar typo-mode-map
 | 
				
			||||||
 | 
					  (let ((map (make-sparse-keymap)))
 | 
				
			||||||
 | 
					    (define-key map (kbd "\"") 'typo-insert-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "'") 'typo-cycle-right-single-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "`") 'typo-cycle-left-single-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "-") 'typo-cycle-dashes)
 | 
				
			||||||
 | 
					    (define-key map (kbd ".") 'typo-cycle-ellipsis)
 | 
				
			||||||
 | 
					    (define-key map (kbd "<") 'typo-cycle-left-angle-brackets)
 | 
				
			||||||
 | 
					    (define-key map (kbd ">") 'typo-cycle-right-angle-brackets)
 | 
				
			||||||
 | 
					    map)
 | 
				
			||||||
 | 
					  "The keymap for `typo-mode'.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defvar typo-global-mode-map
 | 
				
			||||||
 | 
					  (let ((gmap (make-sparse-keymap))
 | 
				
			||||||
 | 
					        (map (make-sparse-keymap)))
 | 
				
			||||||
 | 
					    (define-key gmap (kbd "C-c 8") map)
 | 
				
			||||||
 | 
					    (define-key map (kbd "\"") 'typo-insert-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "'") 'typo-cycle-right-single-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "`") 'typo-cycle-left-single-quotation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "--") 'typo-cycle-dashes)
 | 
				
			||||||
 | 
					    (define-key map (kbd ".") 'typo-cycle-ellipsis)
 | 
				
			||||||
 | 
					    (define-key map (kbd "<<") 'typo-cycle-left-angle-brackets)
 | 
				
			||||||
 | 
					    (define-key map (kbd ">>") 'typo-cycle-right-angle-brackets)
 | 
				
			||||||
 | 
					    (define-key map (kbd "*") 'typo-cycle-multiplication-signs)
 | 
				
			||||||
 | 
					    (define-key map (kbd "SPC") 'typo-cycle-spaces)
 | 
				
			||||||
 | 
					    (define-key map (kbd "?") 'typo-cycle-question-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "!") 'typo-cycle-exclamation-mark)
 | 
				
			||||||
 | 
					    (define-key map (kbd "/=") "≠")
 | 
				
			||||||
 | 
					    (define-key map (kbd "//") "÷")
 | 
				
			||||||
 | 
					    (define-key map (kbd ">=") "≥")
 | 
				
			||||||
 | 
					    (define-key map (kbd "<=") "≤")
 | 
				
			||||||
 | 
					    (define-key map (kbd "=<") "⇐")
 | 
				
			||||||
 | 
					    (define-key map (kbd "=>") "⇒")
 | 
				
			||||||
 | 
					    (define-key map (kbd "<-") "←")
 | 
				
			||||||
 | 
					    (define-key map (kbd "-<") "←")
 | 
				
			||||||
 | 
					    (define-key map (kbd "->") "→")
 | 
				
			||||||
 | 
					    (define-key map (kbd "-^") "↑")
 | 
				
			||||||
 | 
					    (define-key map (kbd "=^") "⇑")
 | 
				
			||||||
 | 
					    (define-key map (kbd "-v") "↓")
 | 
				
			||||||
 | 
					    (define-key map (kbd "=v") "⇓")
 | 
				
			||||||
 | 
					    (define-key map (kbd "T")  "™")
 | 
				
			||||||
 | 
					    gmap)
 | 
				
			||||||
 | 
					  "The keymap for `typo-global-mode'.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;###autoload
 | 
				
			||||||
 | 
					(define-minor-mode typo-mode
 | 
				
			||||||
 | 
					  "Minor mode for typographic editing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This mode changes some default keybindings to enter typographic
 | 
				
			||||||
 | 
					glyphs. In particular, this changes how quotation marks, the
 | 
				
			||||||
 | 
					dash, the dot, and the angle brackets work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Most keys will cycle through various options when used
 | 
				
			||||||
 | 
					repeatedly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\\{typo-mode-map}"
 | 
				
			||||||
 | 
					  :group 'typo
 | 
				
			||||||
 | 
					  :lighter " Typo"
 | 
				
			||||||
 | 
					  :keymap typo-mode-map)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;###autoload
 | 
				
			||||||
 | 
					(define-minor-mode typo-global-mode
 | 
				
			||||||
 | 
					  "Minor mode for typographic editing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This mode provides a prefix map under C-c 8 which complements the
 | 
				
			||||||
 | 
					default C-x 8 prefix map.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					\\{typo-global-mode-map}"
 | 
				
			||||||
 | 
					  :group 'typo
 | 
				
			||||||
 | 
					  :global t
 | 
				
			||||||
 | 
					  :keymap typo-global-mode-map)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-change-language (language)
 | 
				
			||||||
 | 
					  "Change the current language used for quotation marks."
 | 
				
			||||||
 | 
					  (interactive (list (completing-read
 | 
				
			||||||
 | 
					                      "Quotation marks: "
 | 
				
			||||||
 | 
					                      typo-quotation-marks
 | 
				
			||||||
 | 
					                      )))
 | 
				
			||||||
 | 
					  (when (not (assoc-string language typo-quotation-marks))
 | 
				
			||||||
 | 
					    (error "Unknown language %s (see `typo-quotation-marks')" language))
 | 
				
			||||||
 | 
					  (setq typo-language language))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-open-double-quotation-mark ()
 | 
				
			||||||
 | 
					  "Return the opening double quotation marks for the current language."
 | 
				
			||||||
 | 
					  (nth 1 (assoc-string typo-language typo-quotation-marks)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-close-double-quotation-mark ()
 | 
				
			||||||
 | 
					  "Return the closing double quotation marks for the current language."
 | 
				
			||||||
 | 
					  (nth 2 (assoc-string typo-language typo-quotation-marks)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-open-single-quotation-mark ()
 | 
				
			||||||
 | 
					  "Return the opening single quotation marks for the current language."
 | 
				
			||||||
 | 
					  (nth 3 (assoc-string typo-language typo-quotation-marks)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-close-single-quotation-mark ()
 | 
				
			||||||
 | 
					  "Return the closing single quotation marks for the current language."
 | 
				
			||||||
 | 
					  (nth 4 (assoc-string typo-language typo-quotation-marks)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-in-xml-tag ()
 | 
				
			||||||
 | 
					  "Return non-nil if point is inside an XML tag."
 | 
				
			||||||
 | 
					  (save-excursion
 | 
				
			||||||
 | 
					    (and (re-search-backward "[<>]"
 | 
				
			||||||
 | 
					                             ;; If you have an XML tag that spans more
 | 
				
			||||||
 | 
					                             ;; than 25 lines, you should be shot.
 | 
				
			||||||
 | 
					                             (max (point-min)
 | 
				
			||||||
 | 
					                                  (- (point)
 | 
				
			||||||
 | 
					                                     (* 80 25)))
 | 
				
			||||||
 | 
					                             t)
 | 
				
			||||||
 | 
					         ;; < without a word char is a math formula
 | 
				
			||||||
 | 
					         (looking-at "<\\w"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-electricity-disabled-p ()
 | 
				
			||||||
 | 
					  "Return non-nil if electricity is disabled at point.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					See `typo-disable-electricity-functions'."
 | 
				
			||||||
 | 
					  ;; Only if this happened from a non-prefix variable
 | 
				
			||||||
 | 
					  (and (= (length (this-single-command-keys)) 1)
 | 
				
			||||||
 | 
					       (run-hook-with-args-until-success 'typo-disable-electricity-functions)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-quotation-needs-closing (open close)
 | 
				
			||||||
 | 
					  "Return non-nil if the last occurrence of either OPEN and CLOSE
 | 
				
			||||||
 | 
					in the current buffer is OPEN, i.e. if this pair still needs
 | 
				
			||||||
 | 
					closing.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This does not support nested, equal quotation marks."
 | 
				
			||||||
 | 
					  (save-excursion
 | 
				
			||||||
 | 
					    (if (re-search-backward (regexp-opt (list open close))
 | 
				
			||||||
 | 
					                            nil t)
 | 
				
			||||||
 | 
					        (equal open (match-string 0))
 | 
				
			||||||
 | 
					      nil)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-insert-quotation-mark (arg)
 | 
				
			||||||
 | 
					  "Insert quotation marks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This command tries to be intelligent. Opening quotation marks are
 | 
				
			||||||
 | 
					closed. If you repeat the command after a quotation mark, that
 | 
				
			||||||
 | 
					mark is cycled through various variants.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After a closing double quotation mark, the next variant is an
 | 
				
			||||||
 | 
					opening single quotation mark. So when this command is issued
 | 
				
			||||||
 | 
					inside a quotation, it will first close the quotation. On the
 | 
				
			||||||
 | 
					second time, it will open an inner quotation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					After an opening double quotation mark, the next variant is the
 | 
				
			||||||
 | 
					typewriter quotation mark, making it possible in the usual case
 | 
				
			||||||
 | 
					to simple issue this command twice to get a typewriter quotation
 | 
				
			||||||
 | 
					mark (use C-q \" or C-o \" to force inserting one).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument, only typewriter quotation
 | 
				
			||||||
 | 
					marks will be inserted."
 | 
				
			||||||
 | 
					  (interactive "P")
 | 
				
			||||||
 | 
					  (if (or (typo-electricity-disabled-p) arg)
 | 
				
			||||||
 | 
					      (call-interactively 'self-insert-command)
 | 
				
			||||||
 | 
					    (let* ((double-open (typo-open-double-quotation-mark))
 | 
				
			||||||
 | 
					           (double-close (typo-close-double-quotation-mark))
 | 
				
			||||||
 | 
					          (double-needs-closing (typo-quotation-needs-closing
 | 
				
			||||||
 | 
					                                 double-open double-close))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          (single-open (typo-open-single-quotation-mark))
 | 
				
			||||||
 | 
					          (single-close (typo-close-single-quotation-mark))
 | 
				
			||||||
 | 
					          (single-needs-closing (typo-quotation-needs-closing
 | 
				
			||||||
 | 
					                                 single-open single-close))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          (after-any-opening (looking-back (regexp-opt (list double-open
 | 
				
			||||||
 | 
					                                                             single-open)))))
 | 
				
			||||||
 | 
					     (cond
 | 
				
			||||||
 | 
					      ;; For languages that use the same symbol for opening and
 | 
				
			||||||
 | 
					      ;; closing (Finnish, Swedish...), the simplest thing to do is to
 | 
				
			||||||
 | 
					      ;; not try to be too smart and just cycle ” and "
 | 
				
			||||||
 | 
					      ((equal double-open double-close)
 | 
				
			||||||
 | 
					       (typo-insert-cycle (list double-open "\"")))
 | 
				
			||||||
 | 
					      ;; Inside a single quotation, if we're not directly at the
 | 
				
			||||||
 | 
					      ;; opening one, we close it.
 | 
				
			||||||
 | 
					      ((and single-needs-closing
 | 
				
			||||||
 | 
					            (not after-any-opening))
 | 
				
			||||||
 | 
					       (insert single-close))
 | 
				
			||||||
 | 
					      ;; Inside a double quotation, if we're not directly at the
 | 
				
			||||||
 | 
					      ;; opening one ...
 | 
				
			||||||
 | 
					      ((and double-needs-closing
 | 
				
			||||||
 | 
					            (not after-any-opening))
 | 
				
			||||||
 | 
					       ;; ... if we are after a space, we open an inner quotation.
 | 
				
			||||||
 | 
					       ;;
 | 
				
			||||||
 | 
					       ;; (This misses the situation where we start a quotation with an
 | 
				
			||||||
 | 
					       ;; inner quotation, but that's indistinguishable from cycling
 | 
				
			||||||
 | 
					       ;; through keys, and the latter is more common.)
 | 
				
			||||||
 | 
					       (if (looking-back "\\s-")
 | 
				
			||||||
 | 
					           (insert single-open)
 | 
				
			||||||
 | 
					         ;; Otherwise, close the double one
 | 
				
			||||||
 | 
					         (insert double-close)))
 | 
				
			||||||
 | 
					      ;; Nothing is open, or we are directly at an opening quote. If
 | 
				
			||||||
 | 
					      ;; this is a repetition of a this command, start cycling.
 | 
				
			||||||
 | 
					      ((eq this-command last-command)
 | 
				
			||||||
 | 
					       (delete-char -1)
 | 
				
			||||||
 | 
					       (typo-insert-cycle (list "\""
 | 
				
			||||||
 | 
					                                double-open double-close
 | 
				
			||||||
 | 
					                                single-open single-close)))
 | 
				
			||||||
 | 
					      ;; Otherwise, just open a double quotation mark.
 | 
				
			||||||
 | 
					      ;;
 | 
				
			||||||
 | 
					      ;; This can actually happen if we open a quotation, then move
 | 
				
			||||||
 | 
					      ;; point, then go back to directly after the quotation, and then
 | 
				
			||||||
 | 
					      ;; call this again. Opening another double quotation there is
 | 
				
			||||||
 | 
					      ;; weird, but I'm not sure what else to do then, either.
 | 
				
			||||||
 | 
					      (t
 | 
				
			||||||
 | 
					       (insert double-open))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-cycle-ellipsis (arg)
 | 
				
			||||||
 | 
					  "Add periods. The third period will add an ellipsis.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N periods will be inserted."
 | 
				
			||||||
 | 
					  (interactive "P")
 | 
				
			||||||
 | 
					  (if (or (typo-electricity-disabled-p) arg)
 | 
				
			||||||
 | 
					      (call-interactively 'self-insert-command)
 | 
				
			||||||
 | 
					    (if (looking-back "\\.\\.")
 | 
				
			||||||
 | 
					        (replace-match "…")
 | 
				
			||||||
 | 
					      (call-interactively 'self-insert-command))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defmacro define-typo-cycle (name docstring cycle)
 | 
				
			||||||
 | 
					  "Define a typo command that cycles through various options.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N standard characters will be
 | 
				
			||||||
 | 
					inserted instead of cycling.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NAME is the name of the command to define.
 | 
				
			||||||
 | 
					DOCSTRING is the docstring for that command.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CYCLE is a list of strings to cycle through."
 | 
				
			||||||
 | 
					  (declare (indent 1) (doc-string 2))
 | 
				
			||||||
 | 
					  `(defun ,name (arg)
 | 
				
			||||||
 | 
					     ,docstring
 | 
				
			||||||
 | 
					     (interactive "P")
 | 
				
			||||||
 | 
					     (if (or (typo-electricity-disabled-p) arg)
 | 
				
			||||||
 | 
					         (call-interactively 'self-insert-command)
 | 
				
			||||||
 | 
					       (typo-insert-cycle ',cycle))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; This event cycling loop is from `kmacro-call-macro'
 | 
				
			||||||
 | 
					(defun typo-insert-cycle (cycle)
 | 
				
			||||||
 | 
					  "Insert the strings in CYCLE"
 | 
				
			||||||
 | 
					  (let ((i 0)
 | 
				
			||||||
 | 
					        (repeat-key last-input-event)
 | 
				
			||||||
 | 
					        repeat-key-str)
 | 
				
			||||||
 | 
					    (insert (nth i cycle))
 | 
				
			||||||
 | 
					    (setq repeat-key-str (format-kbd-macro (vector repeat-key) nil))
 | 
				
			||||||
 | 
					    (while repeat-key
 | 
				
			||||||
 | 
					      (message "(Inserted %s; type %s for other options)"
 | 
				
			||||||
 | 
					               (typo-char-name (nth i cycle))
 | 
				
			||||||
 | 
					               repeat-key-str)
 | 
				
			||||||
 | 
					      (if (equal repeat-key (read-event))
 | 
				
			||||||
 | 
					          (progn
 | 
				
			||||||
 | 
					            (clear-this-command-keys t)
 | 
				
			||||||
 | 
					            (delete-char (- (length (nth i cycle))))
 | 
				
			||||||
 | 
					            (setq i (% (+ i 1)
 | 
				
			||||||
 | 
					                       (length cycle)))
 | 
				
			||||||
 | 
					            (insert (nth i cycle))
 | 
				
			||||||
 | 
					            (setq last-input-event nil))
 | 
				
			||||||
 | 
					        (setq repeat-key nil)))
 | 
				
			||||||
 | 
					    (when last-input-event
 | 
				
			||||||
 | 
					      (clear-this-command-keys t)
 | 
				
			||||||
 | 
					      (setq unread-command-events (list last-input-event)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defun typo-char-name (string)
 | 
				
			||||||
 | 
					  "Return the Unicode name of the first char in STRING."
 | 
				
			||||||
 | 
					  (let ((char-code (elt string 0))
 | 
				
			||||||
 | 
					        name)
 | 
				
			||||||
 | 
					    (setq name (get-char-code-property char-code 'name))
 | 
				
			||||||
 | 
					    (when (or (not name)
 | 
				
			||||||
 | 
					              (= ?< (elt name 0)))
 | 
				
			||||||
 | 
					      (setq name (get-char-code-property char-code 'old-name)))
 | 
				
			||||||
 | 
					    name))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-right-single-quotation-mark
 | 
				
			||||||
 | 
					  "Cycle through the right quotation mark and the typewriter apostrophe.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N typewriter apostrophes
 | 
				
			||||||
 | 
					will be inserted."
 | 
				
			||||||
 | 
					  ("’" "'"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-left-single-quotation-mark
 | 
				
			||||||
 | 
					  "Cycle through the left single quotation mark and the backtick.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N backticks will be inserted."
 | 
				
			||||||
 | 
					  ("‘" "`"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-dashes
 | 
				
			||||||
 | 
					  "Cycle through various dashes."
 | 
				
			||||||
 | 
					  ("-" ; HYPHEN-MINUS
 | 
				
			||||||
 | 
					   "–" ; EN DASH
 | 
				
			||||||
 | 
					   "—" ; EM DASH
 | 
				
			||||||
 | 
					   "−" ; MINUS SIGN
 | 
				
			||||||
 | 
					   "‐" ; HYPHEN
 | 
				
			||||||
 | 
					   "‑" ; NON-BREAKING HYPHEN
 | 
				
			||||||
 | 
					  ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-left-angle-brackets
 | 
				
			||||||
 | 
					  "Cycle through the less-than sign and guillemet quotation marks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N less-than signs will be inserted."
 | 
				
			||||||
 | 
					  ("<" "«" "‹"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-right-angle-brackets
 | 
				
			||||||
 | 
					  "Cycle through the greater-than sign and guillemet quotation marks.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If used with a numeric prefix argument N, N greater-than signs will be inserted."
 | 
				
			||||||
 | 
					  (">" "»" "›"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-multiplication-signs
 | 
				
			||||||
 | 
					  "Cycle through the asterisk and various multiplication signs"
 | 
				
			||||||
 | 
					  ("×" "·"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-spaces
 | 
				
			||||||
 | 
					  "Cycle through various spaces"
 | 
				
			||||||
 | 
					  (" " ; NO-BREAK SPACE
 | 
				
			||||||
 | 
					   " " ; THIN SPACE
 | 
				
			||||||
 | 
					   "" ; ZERO WIDTH NON-JOINER
 | 
				
			||||||
 | 
					   "" ; ZERO WIDTH JOINER
 | 
				
			||||||
 | 
					   " " ; MEDIUM MATHEMATICAL SPACE
 | 
				
			||||||
 | 
					   " " ; HAIR SPACE
 | 
				
			||||||
 | 
					   ;; " " ; EM SPACE
 | 
				
			||||||
 | 
					   ;; " " ; EN SPACE
 | 
				
			||||||
 | 
					   " " ; SPACE
 | 
				
			||||||
 | 
					  ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-question-mark
 | 
				
			||||||
 | 
					  "Cycle through various interrogatory marks."
 | 
				
			||||||
 | 
					  ("?" "¿" "‽" "⸘" "⸮"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-typo-cycle typo-cycle-exclamation-mark
 | 
				
			||||||
 | 
					  "Cycle through various exclamatory marks."
 | 
				
			||||||
 | 
					  ("!" "¡" "‽" "⸘"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(provide 'typo)
 | 
				
			||||||
 | 
					;;; typo.el ends here
 | 
				
			||||||
		Loading…
	
		Reference in a new issue