(*)~changes
This commit is contained in:
@@ -3,7 +3,8 @@
|
|||||||
;; If you edit it by hand, you could mess it up, so be careful.
|
;; If you edit it by hand, you could mess it up, so be careful.
|
||||||
;; Your init file should contain only one such instance.
|
;; Your init file should contain only one such instance.
|
||||||
;; If there is more than one, they won't work right.
|
;; If there is more than one, they won't work right.
|
||||||
)
|
'(safe-local-variable-values
|
||||||
|
(flycheck-mode . t))))
|
||||||
(custom-set-faces
|
(custom-set-faces
|
||||||
;; custom-set-faces was added by Custom.
|
;; custom-set-faces was added by Custom.
|
||||||
;; If you edit it by hand, you could mess it up, so be careful.
|
;; If you edit it by hand, you could mess it up, so be careful.
|
||||||
|
|||||||
@@ -184,9 +184,12 @@ any buffers in ~+oreo/keep-buffer~ and kills the rest.
|
|||||||
#+end_src
|
#+end_src
|
||||||
* Aesthetics
|
* Aesthetics
|
||||||
General look and feel of Emacs (mostly disabling stuff I don't like).
|
General look and feel of Emacs (mostly disabling stuff I don't like).
|
||||||
** Custom theme
|
** Themes
|
||||||
Load my custom "personal-primary" theme which is stored in the Emacs
|
*** Dark theme
|
||||||
lisp folder (look at [[file:elisp/personal-primary-theme.el][this file]]).
|
My preferred dark theme is my own "personal-primary" theme which is
|
||||||
|
stored in the Emacs lisp folder (look at [[file:elisp/personal-primary-theme.el][this file]]). It tries to use
|
||||||
|
the primary colours for everything, leading to a colour -> meaning
|
||||||
|
relation.
|
||||||
|
|
||||||
I have an older version of this theme that uses a homogeneous colour
|
I have an older version of this theme that uses a homogeneous colour
|
||||||
scheme ([[file:elisp/personal-theme.el][this file]])
|
scheme ([[file:elisp/personal-theme.el][this file]])
|
||||||
@@ -199,6 +202,35 @@ scheme ([[file:elisp/personal-theme.el][this file]])
|
|||||||
:config
|
:config
|
||||||
(load-theme 'personal-primary t))
|
(load-theme 'personal-primary t))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
*** Light theme
|
||||||
|
I'm not very good at designing light themes as I don't really use
|
||||||
|
them. However they are necessary in high light situations where a
|
||||||
|
dark mode would strain the eyes too much. So I built a custom theme
|
||||||
|
on top of the default Emacs theme, "personal-light" (look at [[file:elisp/personal-light-theme.el][this
|
||||||
|
file]]).
|
||||||
|
|
||||||
|
I don't use it by default but I may need to switch between light and
|
||||||
|
dark easily, so here's a command to switch between them.
|
||||||
|
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package custom
|
||||||
|
:defer t
|
||||||
|
:straight nil
|
||||||
|
:commands +oreo/switch-theme
|
||||||
|
:init
|
||||||
|
(defvar +oreo/theme 'dark)
|
||||||
|
:config
|
||||||
|
(defun +oreo/switch-theme ()
|
||||||
|
(interactive)
|
||||||
|
(cond
|
||||||
|
((eq +oreo/theme 'dark)
|
||||||
|
(load-theme 'personal-light t)
|
||||||
|
(setq +oreo/theme 'light))
|
||||||
|
((eq +oreo/theme 'light)
|
||||||
|
(load-theme 'personal-primary t)
|
||||||
|
(setq +oreo/theme 'dark)))))
|
||||||
|
|
||||||
|
#+end_src
|
||||||
** Font size
|
** Font size
|
||||||
Set font size to 140 if on my desktop (oldboy) or 175 if on my laptop
|
Set font size to 140 if on my desktop (oldboy) or 175 if on my laptop
|
||||||
(spiderboy).
|
(spiderboy).
|
||||||
@@ -393,8 +425,8 @@ code.
|
|||||||
;; General which key definitions for leaders
|
;; General which key definitions for leaders
|
||||||
(general-def
|
(general-def
|
||||||
:states '(normal motion)
|
:states '(normal motion)
|
||||||
"SPC" nil
|
"SPC" 'nil
|
||||||
"SPC ," '(nil :which-key "Local leader")
|
"\\" '(nil :which-key "Local leader")
|
||||||
"SPC c" '(nil :which-key "Code")
|
"SPC c" '(nil :which-key "Code")
|
||||||
"SPC f" '(nil :which-key "File")
|
"SPC f" '(nil :which-key "File")
|
||||||
"SPC t" '(nil :which-key "Shell")
|
"SPC t" '(nil :which-key "Shell")
|
||||||
@@ -413,7 +445,7 @@ code.
|
|||||||
|
|
||||||
(general-create-definer local-leader
|
(general-create-definer local-leader
|
||||||
:states '(normal motion)
|
:states '(normal motion)
|
||||||
:prefix "SPC ,")
|
:prefix "\\")
|
||||||
|
|
||||||
(general-create-definer code-leader
|
(general-create-definer code-leader
|
||||||
:states '(normal motion)
|
:states '(normal motion)
|
||||||
@@ -475,47 +507,46 @@ code.
|
|||||||
*** Some binds in Emacs
|
*** Some binds in Emacs
|
||||||
Some bindings that I couldn't fit elsewhere easily.
|
Some bindings that I couldn't fit elsewhere easily.
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package emacs
|
(use-package emacs
|
||||||
:straight nil
|
:straight nil
|
||||||
:general
|
:general
|
||||||
(general-def
|
(general-def
|
||||||
"C-x d" #'delete-frame)
|
"C-x d" #'delete-frame)
|
||||||
|
|
||||||
(nmmap
|
(nmmap
|
||||||
"C--" #'text-scale-decrease
|
"C--" #'text-scale-decrease
|
||||||
"C-=" #'text-scale-increase)
|
"C-=" #'text-scale-increase)
|
||||||
|
|
||||||
(leader
|
(leader
|
||||||
"SPC" '(execute-extended-command :which-key "M-x")
|
"SPC" '(execute-extended-command :which-key "M-x")
|
||||||
"'" '(browse-url-emacs :which-key "Open url in Emacs")
|
"'" '(browse-url-emacs :which-key "Open url in Emacs")
|
||||||
"u" 'universal-argument
|
"u" 'universal-argument
|
||||||
";" 'eval-expression
|
";" 'eval-expression
|
||||||
":" `(,(proc (interactive) (switch-to-buffer "*scratch*"))
|
":" `(,(proc (interactive) (switch-to-buffer "*scratch*"))
|
||||||
:which-key "Switch to *scratch*")
|
:which-key "Switch to *scratch*")
|
||||||
"!" '(async-shell-command :which-key "Async shell command")
|
"!" '(async-shell-command :which-key "Async shell command")
|
||||||
"h" '(help-command :which-key "Help"))
|
"h" '(help-command :which-key "Help"))
|
||||||
|
|
||||||
(code-leader
|
(mode-leader
|
||||||
"j" #'next-error
|
"t" #'+oreo/switch-theme)
|
||||||
"k" #'previous-error
|
|
||||||
"c" #'compile
|
|
||||||
"C" #'recompile
|
|
||||||
"F" (list (proc (interactive) (find-file "~/Code/")) ':which-key "Open ~/Code/"))
|
|
||||||
|
|
||||||
(file-leader
|
(code-leader
|
||||||
"f" #'find-file
|
"F" (list (proc (interactive) (find-file "~/Code/")) ':which-key "Open ~/Code/"))
|
||||||
"F" #'find-file-other-frame
|
|
||||||
"s" #'save-buffer
|
|
||||||
"p" (list (proc (interactive) (find-file (concat user-emacs-directory "config.org")))
|
|
||||||
':which-key "Open config.org"))
|
|
||||||
|
|
||||||
(quit-leader
|
(file-leader
|
||||||
"q" #'save-buffers-kill-terminal
|
"f" #'find-file
|
||||||
"c" #'+literate/compile-config
|
"F" #'find-file-other-frame
|
||||||
"l" #'+literate/load-config
|
"s" #'save-buffer
|
||||||
"d" #'delete-frame)
|
"p" (list (proc (interactive) (find-file (concat user-emacs-directory "config.org")))
|
||||||
|
':which-key "Open config.org"))
|
||||||
|
|
||||||
(search-leader "i" #'imenu))
|
(quit-leader
|
||||||
|
"q" #'save-buffers-kill-terminal
|
||||||
|
"c" #'+literate/compile-config
|
||||||
|
"l" #'+literate/load-config
|
||||||
|
"d" #'delete-frame)
|
||||||
|
|
||||||
|
(search-leader "i" #'imenu))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Evil
|
** Evil
|
||||||
My editor journey started off with Vim rather than Emacs, so my brain
|
My editor journey started off with Vim rather than Emacs, so my brain
|
||||||
@@ -698,7 +729,7 @@ Setup for counsel. Load after ivy and helpful.
|
|||||||
[remap describe-bindings] #'counsel-descbinds
|
[remap describe-bindings] #'counsel-descbinds
|
||||||
[remap load-theme] #'counsel-load-theme)
|
[remap load-theme] #'counsel-load-theme)
|
||||||
:config
|
:config
|
||||||
(setq ivy-initial-inputs-alist nil
|
(setq ivy-initial-inputs-alist '((org-insert-link . "^"))
|
||||||
counsel-describe-function-function #'helpful-callable
|
counsel-describe-function-function #'helpful-callable
|
||||||
counsel-describe-variable-function #'helpful-variable
|
counsel-describe-variable-function #'helpful-variable
|
||||||
counsel-grep-swiper-limit 1500000
|
counsel-grep-swiper-limit 1500000
|
||||||
@@ -1000,36 +1031,27 @@ with abstracting a few things away.
|
|||||||
(prog-mode-hook . abbrev-mode)
|
(prog-mode-hook . abbrev-mode)
|
||||||
(text-mode-hook . abbrev-mode)
|
(text-mode-hook . abbrev-mode)
|
||||||
:init
|
:init
|
||||||
(defmacro +autotyping/deff-abbrev (ABBREV-TABLE ABBREV EXPANSION)
|
(defmacro +abbrev/define-abbrevs (abbrev-table &rest abbrevs)
|
||||||
"Wraps around define-abbrev to fill in some repeated stuff
|
`(progn
|
||||||
when expansion is a function."
|
,@(mapcar #'(lambda (abbrev)
|
||||||
`(define-abbrev
|
`(define-abbrev
|
||||||
,ABBREV-TABLE
|
,abbrev-table
|
||||||
,ABBREV
|
,(car abbrev)
|
||||||
""
|
""
|
||||||
(proc (insert ,EXPANSION))))
|
(proc (insert ,(cadr abbrev)))))
|
||||||
|
abbrevs)))
|
||||||
(setq save-abbrevs nil)
|
(setq save-abbrevs nil)
|
||||||
:config
|
:config
|
||||||
(+autotyping/deff-abbrev
|
(+abbrev/define-abbrevs
|
||||||
global-abbrev-table
|
global-abbrev-table
|
||||||
"sdate"
|
("sdate"
|
||||||
(format-time-string "%Y-%m-%d" (current-time)))
|
(format-time-string "%Y-%m-%d" (current-time)))
|
||||||
|
("stime"
|
||||||
(+autotyping/deff-abbrev
|
(format-time-string "%H:%M:%S" (current-time)))
|
||||||
global-abbrev-table
|
("sday"
|
||||||
"stime"
|
(format-time-string "%A" (current-time)))
|
||||||
(format-time-string "%H:%M:%S" (current-time)))
|
("smon"
|
||||||
|
(format-time-string "%B" (current-time)))))
|
||||||
(+autotyping/deff-abbrev
|
|
||||||
text-mode-abbrev-table
|
|
||||||
"sday"
|
|
||||||
(format-time-string "%A" (current-time)))
|
|
||||||
|
|
||||||
(+autotyping/deff-abbrev
|
|
||||||
text-mode-abbrev-table
|
|
||||||
"smon"
|
|
||||||
(format-time-string "%B" (current-time))))
|
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Skeletons
|
*** Skeletons
|
||||||
Defining some basic skeletons and a macro to help generate an abbrev
|
Defining some basic skeletons and a macro to help generate an abbrev
|
||||||
@@ -1225,8 +1247,9 @@ setups for programming without heavier packages like [[*Eglot][Eglot]].
|
|||||||
Highlights the current line, much better than a blinking cursor.
|
Highlights the current line, much better than a blinking cursor.
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package hl-line
|
(use-package hl-line
|
||||||
:defer t
|
:straight t
|
||||||
:hook (text-mode-hook . hl-line-mode))
|
:hook (text-mode-hook . hl-line-mode)
|
||||||
|
:hook (prog-mode-hook . hl-line-mode))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Recentf
|
** Recentf
|
||||||
Recentf provides a method of keeping track of recently opened files.
|
Recentf provides a method of keeping track of recently opened files.
|
||||||
@@ -2009,9 +2032,6 @@ don't need to write everything myself.
|
|||||||
(display-buffer-same-window))
|
(display-buffer-same-window))
|
||||||
:general
|
:general
|
||||||
(leader "g" '(magit-status :which-key "Magit"))
|
(leader "g" '(magit-status :which-key "Magit"))
|
||||||
(nmmap
|
|
||||||
:keymaps 'magit-status-mode-map
|
|
||||||
"TAB" #'magit-section-toggle)
|
|
||||||
:init
|
:init
|
||||||
(setq vc-follow-symlinks t)
|
(setq vc-follow-symlinks t)
|
||||||
(with-eval-after-load "autoinsert"
|
(with-eval-after-load "autoinsert"
|
||||||
@@ -2197,7 +2217,12 @@ flyspell-mode should be hooked to text-mode.
|
|||||||
(nmmap
|
(nmmap
|
||||||
:keymaps 'text-mode-map
|
:keymaps 'text-mode-map
|
||||||
(kbd "M-C") #'flyspell-correct-word-before-point
|
(kbd "M-C") #'flyspell-correct-word-before-point
|
||||||
(kbd "M-c") #'flyspell-auto-correct-word))
|
(kbd "M-c") #'flyspell-auto-correct-word)
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'flyspell-mode-map
|
||||||
|
"S" #'flyspell-region)
|
||||||
|
(mode-leader
|
||||||
|
"s" #'flyspell-mode))
|
||||||
#+end_src
|
#+end_src
|
||||||
*** Undo tree
|
*** Undo tree
|
||||||
Undo tree sits on top of the incredible Emacs undo capabilities.
|
Undo tree sits on top of the incredible Emacs undo capabilities.
|
||||||
@@ -2274,6 +2299,19 @@ context and easier to use.
|
|||||||
(sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p))
|
(sp-local-pair sp-lisp-modes "(" ")" :unless '(:rem sp-point-before-same-p))
|
||||||
(require 'smartparens-config))
|
(require 'smartparens-config))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
*** Thesaurus
|
||||||
|
=le-thesaurus= is a great extension for quickly searching up words for
|
||||||
|
synonyms or antonyms. I may need it anywhere so I bind it to all
|
||||||
|
keymaps.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package le-thesaurus
|
||||||
|
:straight t
|
||||||
|
:general
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'override
|
||||||
|
"[" #'le-thesaurus-get-synonyms
|
||||||
|
"]" #'le-thesaurus-get-antonyms))
|
||||||
|
#+end_src
|
||||||
* Programming modes
|
* Programming modes
|
||||||
Packages that help with programming in general, providing IDE like
|
Packages that help with programming in general, providing IDE like
|
||||||
capabilities.
|
capabilities.
|
||||||
@@ -2375,7 +2413,8 @@ I hook it to prog-mode.
|
|||||||
:init
|
:init
|
||||||
(setq hl-todo-keyword-faces
|
(setq hl-todo-keyword-faces
|
||||||
'(("TODO" . "#E50000")
|
'(("TODO" . "#E50000")
|
||||||
("WAIT" . "#00CC00")
|
("WIP" . "#ffa500")
|
||||||
|
("NOTE" . "#00CC00")
|
||||||
("FIXME" . "#d02090"))))
|
("FIXME" . "#d02090"))))
|
||||||
#+end_src
|
#+end_src
|
||||||
** Hide-show mode
|
** Hide-show mode
|
||||||
@@ -2398,6 +2437,385 @@ I give won't do it justice.
|
|||||||
:hook
|
:hook
|
||||||
(prog-mode-hook . aggressive-indent-mode))
|
(prog-mode-hook . aggressive-indent-mode))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
* Org mode
|
||||||
|
2023-03-30: finally decided to give org mode its own section.
|
||||||
|
|
||||||
|
Org is, at its most basic, a markup language. Files use the ".org"
|
||||||
|
extension and use =org-mode= to write text, with the ability to export
|
||||||
|
to a few formats, all within Emacs. However, this is a massive
|
||||||
|
disservice to its incredible capabilities:
|
||||||
|
+ Complete spreadsheet system, with formulas (including
|
||||||
|
[[*Calculator][calc-mode]] integration)
|
||||||
|
+ Evaluation of code blocks, even using the results of them in exports
|
||||||
|
(to, say, a $\LaTeX$ or HTML document)
|
||||||
|
+ This includes exporting all code blocks of a document to a code
|
||||||
|
file, say all the emacs-lisp files in this document to ~config.el~
|
||||||
|
([[file:elisp/literate.el][literate]])
|
||||||
|
+ Complete calendar/todo system with deadlines, scheduling and
|
||||||
|
repeaters
|
||||||
|
+ Export to a variety of formats or make your own export engine using
|
||||||
|
the org AST!
|
||||||
|
+ Writing latex in document, with ability to render them on demand,
|
||||||
|
and exporting to PDFs through Latex
|
||||||
|
** Aesthetic defaults
|
||||||
|
Org has a ton of settings to tweak, which change your experience quite
|
||||||
|
a bit. My setup should be as portable as possible and (/sometimes/) I
|
||||||
|
need to access org mode files in other editors, so org files should be
|
||||||
|
as close to clear text as possible. This is the guiding philosophy
|
||||||
|
that essentially makes most of my options pretty immediate.
|
||||||
|
|
||||||
|
Some arbitrary notes:
|
||||||
|
+ By default =~/Text= is my directory for text files. I actually have
|
||||||
|
a repository that manages this directory for agenda files and other
|
||||||
|
documents
|
||||||
|
+ Indentation in file should not be allowed, i.e. text indentation,
|
||||||
|
as that forces other editors to read it a certain way as well. It
|
||||||
|
seems obtrusive hence it's off.
|
||||||
|
+ Org startup indented is on by default as most documents do benefit
|
||||||
|
from the indentation, but I do turn it off for some files via
|
||||||
|
~#+startup:noindent~
|
||||||
|
+ When opening an org document there can be a lot of headings, so I
|
||||||
|
set folding to just content
|
||||||
|
+ Org documents can also have a lot of latex previews, which make
|
||||||
|
opening some after a while a massive hassle. If I want to see the
|
||||||
|
preview, I'll do it myself, so turn it off.
|
||||||
|
+ Org manages windowing itself, to some extent, so I set those options
|
||||||
|
to be as unobtrusive as possible
|
||||||
|
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:defer t
|
||||||
|
:straight t
|
||||||
|
:init
|
||||||
|
(setq
|
||||||
|
org-directory "~/Text"
|
||||||
|
org-adapt-indentation nil
|
||||||
|
org-indent-mode nil
|
||||||
|
org-startup-indented t
|
||||||
|
org-startup-folded 'content
|
||||||
|
org-startup-with-latex-preview nil
|
||||||
|
org-imenu-depth 10
|
||||||
|
org-src-window-setup 'current-window
|
||||||
|
org-indirect-buffer-display 'current-window
|
||||||
|
org-link-frame-setup '((vm . vm-visit-folder-other-frame)
|
||||||
|
(vm-imap . vm-visit-imap-folder-other-frame)
|
||||||
|
(file . find-file))))
|
||||||
|
#+end_src
|
||||||
|
** Latex options
|
||||||
|
Org mode has deep integration with latex, can export to PDF and even
|
||||||
|
display latex fragments in the document directly. I setup the
|
||||||
|
pdf-process, code listing options via minted and the format options
|
||||||
|
for latex fragments.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:defer t
|
||||||
|
:init
|
||||||
|
(setq org-format-latex-options '(:foreground default :background default :scale 2
|
||||||
|
:html-foreground "Black" :html-background "Transparent"
|
||||||
|
:html-scale 1.0 :matchers ("begin" "$1" "$" "$$" "\\(" "\\["))
|
||||||
|
org-latex-listings 'minted
|
||||||
|
org-latex-minted-langs '((emacs-lisp "common-lisp")
|
||||||
|
(ledger "text")
|
||||||
|
(cc "c++")
|
||||||
|
(cperl "perl")
|
||||||
|
(shell-script "bash")
|
||||||
|
(caml "ocaml"))
|
||||||
|
org-latex-packages-alist '(("" "minted"))
|
||||||
|
org-latex-pdf-process
|
||||||
|
'("latexmk -pdfxe -bibtex -f -shell-escape %f")
|
||||||
|
org-latex-minted-options '(("style" "colorful")
|
||||||
|
("linenos")
|
||||||
|
("frame" "single")
|
||||||
|
("mathescape")
|
||||||
|
("fontfamily" "courier")
|
||||||
|
("samepage" "false")
|
||||||
|
("breaklines" "true")
|
||||||
|
("breakanywhere" "true"))))
|
||||||
|
#+end_src
|
||||||
|
** Org Core Variables
|
||||||
|
Tons of variables for org-mode, including a ton of latex ones. Can't
|
||||||
|
really explain because it sets up quite a lot of local stuff. Also I
|
||||||
|
copy pasted the majority of this, tweaking it till it felt good. Doom
|
||||||
|
Emacs was very helpful here.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:init
|
||||||
|
(setq org-edit-src-content-indentation 0
|
||||||
|
org-goto-interface 'outline
|
||||||
|
org-imenu-depth 10
|
||||||
|
org-export-backends '(ascii html latex odt icalendar)
|
||||||
|
org-eldoc-breadcrumb-separator " → "
|
||||||
|
org-enforce-todo-dependencies t
|
||||||
|
org-fontify-quote-and-verse-blocks t
|
||||||
|
org-fontify-whole-heading-line t
|
||||||
|
org-footnote-auto-label t
|
||||||
|
org-hide-leading-stars t
|
||||||
|
org-hide-emphasis-markers nil
|
||||||
|
org-image-actual-width nil
|
||||||
|
org-priority-faces '((?A . error) (?B . warning) (?C . success))
|
||||||
|
org-link-descriptive nil
|
||||||
|
org-tags-column 0
|
||||||
|
org-todo-keywords
|
||||||
|
'((sequence "TODO" "WIP" "DONE")
|
||||||
|
(sequence "PROJ" "WAIT" "COMPLETE"))
|
||||||
|
org-use-sub-superscripts '{}
|
||||||
|
org-babel-load-languages '((emacs-lisp . t)
|
||||||
|
(lisp . t)
|
||||||
|
(C . t)
|
||||||
|
(python . t)
|
||||||
|
(shell . t))))
|
||||||
|
#+end_src
|
||||||
|
** Org Core Functionality
|
||||||
|
Hooks, prettify-symbols and records for auto insertion.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:hook
|
||||||
|
(org-mode-hook . prettify-symbols-mode)
|
||||||
|
:display
|
||||||
|
("\\*Org Src.*"
|
||||||
|
(display-buffer-same-window))
|
||||||
|
:pretty
|
||||||
|
(org-mode-hook
|
||||||
|
("#+begin_src" . "≫")
|
||||||
|
("#+end_src" . "≪"))
|
||||||
|
:init
|
||||||
|
(with-eval-after-load "autoinsert"
|
||||||
|
(define-auto-insert '("\\.org\\'" . "Org skeleton")
|
||||||
|
'("Enter title: "
|
||||||
|
"#+title: " str | (buffer-file-name) "\n"
|
||||||
|
"#+author: " (read-string "Enter author: ") | user-full-name "\n"
|
||||||
|
"#+description: " (read-string "Enter description: ") | "Description" "\n"
|
||||||
|
"#+date: " (format-time-string "%Y-%m-%d" (current-time)) "\n"
|
||||||
|
"* " _))))
|
||||||
|
#+end_src
|
||||||
|
** Org Core Bindings
|
||||||
|
Some bindings for org mode.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:after counsel
|
||||||
|
:config
|
||||||
|
(defun +org/swiper-goto ()
|
||||||
|
(interactive)
|
||||||
|
(swiper "^\\* "))
|
||||||
|
:general
|
||||||
|
(file-leader
|
||||||
|
"w" #'org-capture
|
||||||
|
"l" #'org-store-link
|
||||||
|
"i" #'org-insert-last-stored-link)
|
||||||
|
(code-leader
|
||||||
|
"D" #'org-babel-detangle)
|
||||||
|
(nmmap
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
[remap imenu] #'+org/swiper-goto)
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
"l" '(nil :which-key "Links")
|
||||||
|
"'" '(nil :which-key "Tables")
|
||||||
|
"c" '(nil :which-key "Clocks"))
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
:infix "l"
|
||||||
|
"i" #'org-insert-link
|
||||||
|
"l" #'org-open-at-point)
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
:infix "'"
|
||||||
|
"a" #'org-table-align
|
||||||
|
"f" #'org-table-edit-formulas
|
||||||
|
"t" #'org-table-toggle-coordinate-overlays
|
||||||
|
"s" #'org-table-sum
|
||||||
|
"e" #'org-table-calc-current-TBLFM
|
||||||
|
"E" #'org-table-eval-formula)
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
"i" #'org-clock-clock-in
|
||||||
|
"o" #'org-clock-clock-out
|
||||||
|
"c" #'org-clock-in-last
|
||||||
|
"d" #'org-clock-display)
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
"d" #'org-date-from-calendar
|
||||||
|
"t" #'org-todo
|
||||||
|
"T" #'org-babel-tangle
|
||||||
|
"i" #'org-insert-structure-template
|
||||||
|
"p" #'org-latex-preview
|
||||||
|
"s" #'org-property-action
|
||||||
|
"e" #'org-export-dispatch
|
||||||
|
"o" #'org-edit-special))
|
||||||
|
#+end_src
|
||||||
|
** Agenda
|
||||||
|
Org agenda provides a nice viewing for schedules. With org mode it's
|
||||||
|
a very tidy way to manage your time.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-agenda
|
||||||
|
:after org
|
||||||
|
:straight nil
|
||||||
|
:init
|
||||||
|
(defconst +org/agenda-root "~/Text"
|
||||||
|
"Root directory for all agenda files")
|
||||||
|
(setq org-agenda-files (list (expand-file-name +org/agenda-root))
|
||||||
|
org-agenda-window-setup 'current-window
|
||||||
|
org-agenda-skip-deadline-prewarning-if-scheduled t
|
||||||
|
org-agenda-skip-scheduled-if-done t
|
||||||
|
org-agenda-skip-deadline-if-done t
|
||||||
|
org-agenda-start-with-entry-text-mode nil)
|
||||||
|
:config
|
||||||
|
(evil-set-initial-state 'org-agenda-mode 'normal)
|
||||||
|
:general
|
||||||
|
(file-leader
|
||||||
|
"a" `(,(proc (interactive)
|
||||||
|
(find-file (completing-read "Enter directory: " org-agenda-files nil t)))
|
||||||
|
:which-key "Open agenda directory"))
|
||||||
|
|
||||||
|
(app-leader
|
||||||
|
"a" #'org-agenda)
|
||||||
|
|
||||||
|
(nmmap
|
||||||
|
:keymaps 'org-agenda-mode-map
|
||||||
|
"zd" #'org-agenda-day-view
|
||||||
|
"zw" #'org-agenda-week-view
|
||||||
|
"zm" #'org-agenda-month-view
|
||||||
|
"gd" #'org-agenda-goto-date
|
||||||
|
"RET" #'org-agenda-switch-to
|
||||||
|
"J" #'org-agenda-later
|
||||||
|
"K" #'org-agenda-earlier
|
||||||
|
"t" #'org-agenda-todo
|
||||||
|
"." #'org-agenda-goto-today
|
||||||
|
"," #'org-agenda-goto-date
|
||||||
|
"q" #'org-agenda-quit
|
||||||
|
"r" #'org-agenda-redo))
|
||||||
|
#+end_src
|
||||||
|
** Org clock-in
|
||||||
|
Org provides a nice timekeeping system that allows for managing how
|
||||||
|
much time is taken per task. It even has an extensive reporting
|
||||||
|
system to see how much time you spend on specific tasks or overall.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-clock
|
||||||
|
:after org
|
||||||
|
:straight nil
|
||||||
|
:init
|
||||||
|
(defvar +org/clock-out-toggle-report nil
|
||||||
|
"Non-nil means update the first clock report in the file every
|
||||||
|
time a clock out occurs.")
|
||||||
|
:config
|
||||||
|
(advice-add #'org-clock-out
|
||||||
|
:after
|
||||||
|
(proc (interactive)
|
||||||
|
(if +org/clock-out-toggle-report
|
||||||
|
(org-clock-report t))))
|
||||||
|
:general
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
:infix "c"
|
||||||
|
"c" #'org-clock-in
|
||||||
|
"o" #'org-clock-out
|
||||||
|
"r" #'org-clock-report
|
||||||
|
"t" (proc (interactive)
|
||||||
|
(setq-local +org/clock-out-toggle-report
|
||||||
|
(not +org/clock-out-toggle-report)))))
|
||||||
|
#+end_src
|
||||||
|
** Org on save
|
||||||
|
If ~+org/compile-to-pdf-on-save-p~ is non-nil, then compile to
|
||||||
|
\(\LaTeX\) and run an async process to compile it to a PDF. Doesn't
|
||||||
|
make Emacs hang (like ~org-latex-export-to-pdf~) and doesn't randomly
|
||||||
|
crash (like the async handler for org-export). Works really well with
|
||||||
|
~pdf-view-mode~.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org
|
||||||
|
:defer t
|
||||||
|
:init
|
||||||
|
(defvar +org/compile-to-pdf-on-save-p
|
||||||
|
nil
|
||||||
|
"Non-nil to activate compile functionality.")
|
||||||
|
:general
|
||||||
|
(local-leader
|
||||||
|
:keymaps 'org-mode-map
|
||||||
|
"C" (proc (interactive)
|
||||||
|
(if (+org/compile-to-pdf-on-save-f)
|
||||||
|
(setq-local +org/compile-to-pdf-on-save-p nil)
|
||||||
|
(setq-local +org/compile-to-pdf-on-save-p t))))
|
||||||
|
:config
|
||||||
|
(+oreo/create-auto-save
|
||||||
|
(and (eq major-mode 'org-mode) +org/compile-to-pdf-on-save-p)
|
||||||
|
(start-process-shell-command "" "*pdflatex*" (concat "pdflatex -shell-escape "
|
||||||
|
(org-latex-export-to-latex)))))
|
||||||
|
#+end_src
|
||||||
|
** Org ref
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-ref
|
||||||
|
:straight t
|
||||||
|
:defer t
|
||||||
|
:init
|
||||||
|
(setq bibtex-files '("~/Text/bibliography.bib")
|
||||||
|
bibtex-completion-bibliography '("~/Text/bibliography.bib")
|
||||||
|
bibtex-completion-additional-search-fields '(keywords)))
|
||||||
|
#+end_src
|
||||||
|
*** Org ref ivy integration
|
||||||
|
Org ref requires ivy-bibtex to work properly with ivy, so we need to
|
||||||
|
set that up as well
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package ivy-bibtex
|
||||||
|
:straight t
|
||||||
|
:after org-ref
|
||||||
|
:config
|
||||||
|
(require 'org-ref-ivy))
|
||||||
|
#+end_src
|
||||||
|
** Org message
|
||||||
|
Org message allows for the use of org mode when composing mails,
|
||||||
|
generating HTML multipart emails. This integrates the WYSIWYG
|
||||||
|
experience with mail in Emacs while also providing powerful text
|
||||||
|
features with basically no learning curve (as long as you've already
|
||||||
|
learnt the basics of org).
|
||||||
|
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-msg
|
||||||
|
:hook (message-mode-hook . org-msg-mode)
|
||||||
|
:config
|
||||||
|
(setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t tex:dvipng"
|
||||||
|
org-msg-greeting-name-limit 3)
|
||||||
|
|
||||||
|
(add-to-list 'org-msg-enforce-css
|
||||||
|
'(img latex-fragment-inline
|
||||||
|
((transform . ,(format "translateY(-1px) scale(%.3f)"
|
||||||
|
(/ 1.0 (if (boundp 'preview-scale)
|
||||||
|
preview-scale 1.4))))
|
||||||
|
(margin . "0 -0.35em")))))
|
||||||
|
#+end_src
|
||||||
|
** Org for evil
|
||||||
|
Evil org for some nice bindings.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package evil-org
|
||||||
|
:hook (org-mode-hook . evil-org-mode))
|
||||||
|
#+end_src
|
||||||
|
** Org reveal
|
||||||
|
Org reveal allows one to export org files as HTML presentations via
|
||||||
|
reveal.js. Pretty nifty and it's easy to use.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package ox-reveal
|
||||||
|
:defer t
|
||||||
|
:init
|
||||||
|
(setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js"
|
||||||
|
org-reveal-theme "sky"))
|
||||||
|
#+end_src
|
||||||
|
** Org fragtog
|
||||||
|
Toggle latex fragments in org mode so you get fancy maths symbols. I
|
||||||
|
use latex a bit in org mode as it is the premier way of getting
|
||||||
|
mathematical symbols rendered, but org mode > latex.
|
||||||
|
|
||||||
|
Delimited environments are aplenty, escaped brackets and dollar signs
|
||||||
|
are my favourite. Here's a snippet:
|
||||||
|
$\int_{-\infty}^{\infty}e^{-x^2}dx = \sqrt{\pi}$.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-fragtog
|
||||||
|
:hook (org-mode-hook . org-fragtog-mode))
|
||||||
|
#+end_src
|
||||||
|
** Org superstar
|
||||||
|
Org superstar adds cute little Unicode symbols for headers, much
|
||||||
|
better than the default asterisks.
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(use-package org-superstar
|
||||||
|
:hook (org-mode-hook . org-superstar-mode))
|
||||||
|
#+end_src
|
||||||
* Languages
|
* Languages
|
||||||
Configuration for specific languages or file formats.
|
Configuration for specific languages or file formats.
|
||||||
** PDF
|
** PDF
|
||||||
@@ -2481,304 +2899,6 @@ the [[https://elpa.gnu.org/packages/nhexl-mode.html][page]] yourself.
|
|||||||
:straight t
|
:straight t
|
||||||
:mode "\\.bin")
|
:mode "\\.bin")
|
||||||
#+end_src
|
#+end_src
|
||||||
** Org
|
|
||||||
Org mode
|
|
||||||
*** Org Core Variables
|
|
||||||
Tons of variables for org-mode, including a ton of latex ones. Can't
|
|
||||||
really explain because it sets up quite a lot of local stuff. Also I
|
|
||||||
copy pasted the majority of this, tweaking it till it felt good. Doom
|
|
||||||
Emacs was very helpful here.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org
|
|
||||||
:defer t
|
|
||||||
:custom
|
|
||||||
(org-directory "~/Text")
|
|
||||||
(org-edit-src-content-indentation 0)
|
|
||||||
(org-goto-interface 'outline)
|
|
||||||
(org-adapt-indentation nil)
|
|
||||||
(org-indent-mode nil)
|
|
||||||
(org-src-window-setup 'current-window)
|
|
||||||
(org-indirect-buffer-display 'current-window)
|
|
||||||
(org-export-backends '(ascii html latex odt icalendar))
|
|
||||||
(org-imenu-depth 10)
|
|
||||||
(org-link-frame-setup '((vm . vm-visit-folder-other-frame)
|
|
||||||
(vm-imap . vm-visit-imap-folder-other-frame)
|
|
||||||
(gnus . org-gnus-no-new-news)
|
|
||||||
(file . find-file-other-frame)
|
|
||||||
(wl . wl-other-frame)))
|
|
||||||
(org-eldoc-breadcrumb-separator " → ")
|
|
||||||
(org-enforce-todo-dependencies t)
|
|
||||||
(org-fontify-quote-and-verse-blocks t)
|
|
||||||
(org-fontify-whole-heading-line t)
|
|
||||||
(org-footnote-auto-label 'plain)
|
|
||||||
(org-hide-leading-stars t)
|
|
||||||
(org-hide-emphasis-markers nil)
|
|
||||||
(org-image-actual-width nil)
|
|
||||||
(org-priority-faces '((?A . error) (?B . warning) (?C . success)))
|
|
||||||
(org-startup-indented t)
|
|
||||||
(org-startup-with-latex-preview t)
|
|
||||||
(org-startup-folded 'content)
|
|
||||||
(org-tags-column 0)
|
|
||||||
(org-todo-keywords
|
|
||||||
'((sequence "TODO" "DONE")
|
|
||||||
(sequence "PROJ" "WAIT" "COMPLETE")))
|
|
||||||
(org-use-sub-superscripts '{})
|
|
||||||
(org-babel-load-languages '((emacs-lisp . t)
|
|
||||||
(lisp . t)
|
|
||||||
(C . t)
|
|
||||||
(python . t)
|
|
||||||
(shell . t)))
|
|
||||||
(org-format-latex-options '(:foreground default :background default :scale 2
|
|
||||||
:html-foreground "Black" :html-background "Transparent"
|
|
||||||
:html-scale 1.0 :matchers ("begin" "$1" "$" "$$" "\\(" "\\[")))
|
|
||||||
(org-latex-listings 'minted)
|
|
||||||
(org-latex-minted-langs '((emacs-lisp "common-lisp")
|
|
||||||
(ledger "text")
|
|
||||||
(cc "c++")
|
|
||||||
(cperl "perl")
|
|
||||||
(shell-script "bash")
|
|
||||||
(caml "ocaml")))
|
|
||||||
(org-latex-packages-alist '(("" "minted")))
|
|
||||||
(org-latex-pdf-process
|
|
||||||
'("latexmk -pdfxe -bibtex -f -shell-escape %f"))
|
|
||||||
(setq org-latex-minted-options '(("style" "colorful")
|
|
||||||
("linenos")
|
|
||||||
("frame" "single")
|
|
||||||
("mathescape")
|
|
||||||
("fontfamily" "courier")
|
|
||||||
("samepage" "false")
|
|
||||||
("breaklines" "true")
|
|
||||||
("breakanywhere" "true")
|
|
||||||
)))
|
|
||||||
#+end_src
|
|
||||||
*** Org Core Functionality
|
|
||||||
Hooks, prettify-symbols and records for auto insertion.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org
|
|
||||||
:hook
|
|
||||||
(org-mode-hook . prettify-symbols-mode)
|
|
||||||
:display
|
|
||||||
("\\*Org Src.*"
|
|
||||||
(display-buffer-same-window))
|
|
||||||
:pretty
|
|
||||||
(org-mode-hook
|
|
||||||
("#+begin_src" . "≫")
|
|
||||||
("#+end_src" . "≪"))
|
|
||||||
:init
|
|
||||||
(with-eval-after-load "autoinsert"
|
|
||||||
(define-auto-insert '("\\.org\\'" . "Org skeleton")
|
|
||||||
'("Enter title: "
|
|
||||||
"#+title: " str | (buffer-file-name) "\n"
|
|
||||||
"#+author: " (read-string "Enter author: ") | user-full-name "\n"
|
|
||||||
"#+description: " (read-string "Enter description: ") | "Description" "\n"
|
|
||||||
"#+date: " (format-time-string "%Y-%m-%d" (current-time)) "\n"
|
|
||||||
"* " _))))
|
|
||||||
#+end_src
|
|
||||||
*** Org Core Bindings
|
|
||||||
Some bindings for org mode.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org
|
|
||||||
:after counsel
|
|
||||||
:config
|
|
||||||
(defun +org/swiper-goto ()
|
|
||||||
(interactive)
|
|
||||||
(swiper "^\\* "))
|
|
||||||
:general
|
|
||||||
(file-leader
|
|
||||||
"w" #'org-capture
|
|
||||||
"l" #'org-store-link
|
|
||||||
"i" #'org-insert-last-stored-link)
|
|
||||||
(code-leader
|
|
||||||
"D" #'org-babel-detangle)
|
|
||||||
(nmmap
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
[remap imenu] #'+org/swiper-goto)
|
|
||||||
(local-leader
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
:infix "l"
|
|
||||||
"i" #'org-insert-link
|
|
||||||
"l" #'org-open-at-point)
|
|
||||||
(local-leader
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
:infix "'"
|
|
||||||
"a" #'org-table-align
|
|
||||||
"f" #'org-table-edit-formulas
|
|
||||||
"t" #'org-table-toggle-coordinate-overlays
|
|
||||||
"s" #'org-table-sum
|
|
||||||
"e" #'org-table-eval-formula)
|
|
||||||
(local-leader
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
"t" #'org-todo
|
|
||||||
"T" #'org-babel-tangle
|
|
||||||
"i" #'org-insert-structure-template
|
|
||||||
"p" #'org-latex-preview
|
|
||||||
"s" #'org-property-action
|
|
||||||
"e" #'org-export-dispatch
|
|
||||||
"o" #'org-edit-special))
|
|
||||||
#+end_src
|
|
||||||
*** Org agenda
|
|
||||||
Org agenda provides a nice viewing for schedules. With org mode it's
|
|
||||||
a very tidy way to manage your time.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-agenda
|
|
||||||
:after (org evil)
|
|
||||||
:straight nil
|
|
||||||
:init
|
|
||||||
(defconst +org/agenda-root "~/Text"
|
|
||||||
"Root directory for all agenda files")
|
|
||||||
(setq org-agenda-files (list (expand-file-name +org/agenda-root) (expand-file-name "~/Projects/lpv/"))
|
|
||||||
org-agenda-window-setup 'current-window
|
|
||||||
org-agenda-skip-deadline-prewarning-if-scheduled t
|
|
||||||
org-agenda-skip-scheduled-if-done t
|
|
||||||
org-agenda-skip-deadline-if-done t
|
|
||||||
org-agenda-start-with-entry-text-mode nil)
|
|
||||||
:config
|
|
||||||
(evil-set-initial-state 'org-agenda-mode 'normal)
|
|
||||||
:general
|
|
||||||
(file-leader
|
|
||||||
"a" `(,(proc (interactive)
|
|
||||||
(find-file (completing-read "Enter directory: " org-agenda-files nil t)))
|
|
||||||
:which-key "Open agenda directory"))
|
|
||||||
|
|
||||||
(app-leader
|
|
||||||
"aa" #'org-agenda)
|
|
||||||
|
|
||||||
(nmmap
|
|
||||||
:keymaps 'org-agenda-mode-map
|
|
||||||
"zd" #'org-agenda-day-view
|
|
||||||
"zw" #'org-agenda-week-view
|
|
||||||
"zm" #'org-agenda-month-view
|
|
||||||
"gd" #'org-agenda-goto-date
|
|
||||||
"RET" #'org-agenda-switch-to
|
|
||||||
"J" #'org-agenda-later
|
|
||||||
"K" #'org-agenda-earlier
|
|
||||||
"t" #'org-agenda-todo
|
|
||||||
"." #'org-agenda-goto-today
|
|
||||||
"," #'org-agenda-goto-date
|
|
||||||
"q" #'org-agenda-quit
|
|
||||||
"r" #'org-agenda-redo))
|
|
||||||
#+end_src
|
|
||||||
*** Org clock-in
|
|
||||||
Org provides a nice timekeeping system that allows for managing how
|
|
||||||
much time is taken per task. It even has an extensive reporting
|
|
||||||
system to see how much time you spend on specific tasks or overall.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-clock
|
|
||||||
:after org
|
|
||||||
:straight nil
|
|
||||||
:init
|
|
||||||
(defvar +org/clock-out-toggle-report nil
|
|
||||||
"Non-nil means update the first clock report in the file every
|
|
||||||
time a clock out occurs.")
|
|
||||||
:config
|
|
||||||
(advice-add #'org-clock-out
|
|
||||||
:after
|
|
||||||
(proc (interactive)
|
|
||||||
(if +org/clock-out-toggle-report
|
|
||||||
(org-clock-report t))))
|
|
||||||
:general
|
|
||||||
(local-leader
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
:infix "c"
|
|
||||||
"c" #'org-clock-in
|
|
||||||
"o" #'org-clock-out
|
|
||||||
"r" #'org-clock-report
|
|
||||||
"t" (proc (interactive)
|
|
||||||
(setq-local +org/clock-out-toggle-report
|
|
||||||
(not +org/clock-out-toggle-report)))))
|
|
||||||
#+end_src
|
|
||||||
*** Org on save
|
|
||||||
If ~+org/compile-to-pdf-on-save-p~ is non-nil, then compile to
|
|
||||||
\(\LaTeX\) and run an async process to compile it to a PDF. Doesn't
|
|
||||||
make Emacs hang (like ~org-latex-export-to-pdf~) and doesn't randomly
|
|
||||||
crash (like the async handler for org-export). Works really well with
|
|
||||||
~pdf-view-mode~.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org
|
|
||||||
:defer t
|
|
||||||
:init
|
|
||||||
(defvar +org/compile-to-pdf-on-save-p
|
|
||||||
nil
|
|
||||||
"Non-nil to activate compile functionality.")
|
|
||||||
:general
|
|
||||||
(local-leader
|
|
||||||
:keymaps 'org-mode-map
|
|
||||||
"C" (proc (interactive)
|
|
||||||
(if (+org/compile-to-pdf-on-save-f)
|
|
||||||
(setq-local +org/compile-to-pdf-on-save-p nil)
|
|
||||||
(setq-local +org/compile-to-pdf-on-save-p t))))
|
|
||||||
:config
|
|
||||||
(+oreo/create-auto-save
|
|
||||||
(and (eq major-mode 'org-mode) +org/compile-to-pdf-on-save-p)
|
|
||||||
(start-process-shell-command "" "*pdflatex*" (concat "pdflatex -shell-escape "
|
|
||||||
(org-latex-export-to-latex)))))
|
|
||||||
#+end_src
|
|
||||||
*** Org ref
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-ref
|
|
||||||
:straight t
|
|
||||||
:defer t
|
|
||||||
:init
|
|
||||||
(setq bibtex-files '("~/Text/bibliography.bib")
|
|
||||||
bibtex-completion-bibliography '("~/Text/bibliography.bib")
|
|
||||||
bibtex-completion-additional-search-fields '(keywords)))
|
|
||||||
#+end_src
|
|
||||||
*** Org message
|
|
||||||
Org message allows for the use of org mode when composing mails,
|
|
||||||
generating HTML multipart emails. This integrates the WYSIWYG
|
|
||||||
experience with mail in Emacs while also providing powerful text
|
|
||||||
features with basically no learning curve (as long as you've already
|
|
||||||
learnt the basics of org).
|
|
||||||
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-msg
|
|
||||||
:hook (message-mode-hook . org-msg-mode)
|
|
||||||
:config
|
|
||||||
(setq org-msg-options "html-postamble:nil H:5 num:nil ^:{} toc:nil author:nil email:nil \\n:t tex:dvipng"
|
|
||||||
org-msg-greeting-name-limit 3)
|
|
||||||
|
|
||||||
(add-to-list 'org-msg-enforce-css
|
|
||||||
'(img latex-fragment-inline
|
|
||||||
((transform . ,(format "translateY(-1px) scale(%.3f)"
|
|
||||||
(/ 1.0 (if (boundp 'preview-scale)
|
|
||||||
preview-scale 1.4))))
|
|
||||||
(margin . "0 -0.35em")))))
|
|
||||||
#+end_src
|
|
||||||
*** Org for evil
|
|
||||||
Evil org for some nice bindings.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package evil-org
|
|
||||||
:hook (org-mode-hook . evil-org-mode))
|
|
||||||
#+end_src
|
|
||||||
*** Org reveal
|
|
||||||
Org reveal allows one to export org files as HTML presentations via
|
|
||||||
reveal.js. Pretty nifty and it's easy to use.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package ox-reveal
|
|
||||||
:after org
|
|
||||||
:init
|
|
||||||
(setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js"
|
|
||||||
org-reveal-theme "sky"))
|
|
||||||
#+end_src
|
|
||||||
*** Org fragtog
|
|
||||||
Toggle latex fragments in org mode so you get fancy maths symbols. I
|
|
||||||
use latex a bit in org mode as it is the premier way of getting
|
|
||||||
mathematical symbols rendered, but org mode > latex.
|
|
||||||
|
|
||||||
Delimited environments are aplenty, escaped brackets and dollar signs
|
|
||||||
are my favourite. Here's a snippet:
|
|
||||||
$\int_{-\infty}^{\infty}e^{-x^2}dx = \sqrt{\pi}$.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-fragtog
|
|
||||||
:hook (org-mode-hook . org-fragtog-mode))
|
|
||||||
#+end_src
|
|
||||||
*** Org superstar
|
|
||||||
Org superstar adds cute little Unicode symbols for headers, much
|
|
||||||
better than the default asterisks.
|
|
||||||
#+begin_src emacs-lisp
|
|
||||||
(use-package org-superstar
|
|
||||||
:hook (org-mode-hook . org-superstar-mode))
|
|
||||||
#+end_src
|
|
||||||
** C/C++
|
** C/C++
|
||||||
Setup for C and C++ modes via the cc-mode package. C and C++ are
|
Setup for C and C++ modes via the cc-mode package. C and C++ are
|
||||||
great languages for general purpose programming. My preferred choice
|
great languages for general purpose programming. My preferred choice
|
||||||
@@ -2998,10 +3118,15 @@ Just setup a style and some pretty symbols.
|
|||||||
** Haskell
|
** Haskell
|
||||||
Haskell is a static lazy functional programming language (what a
|
Haskell is a static lazy functional programming language (what a
|
||||||
mouthful). It's quite a beautiful language and really learning it will
|
mouthful). It's quite a beautiful language and really learning it will
|
||||||
change the way you think about programming.
|
change the way you think about programming. However, my preferred
|
||||||
|
functional language is still unfortunately Lisp so no extra brownie
|
||||||
|
points there.
|
||||||
|
|
||||||
Here I configure the REPL for Haskell via the
|
Here I configure the REPL for Haskell via the
|
||||||
~haskell-interactive-mode~ as well.
|
~haskell-interactive-mode~. I also load my custom package
|
||||||
|
[[file:elisp/haskell-multiedit.el][haskell-multiedit]] which allows a user to create temporary
|
||||||
|
~haskell-mode~ buffers that, upon completion, will run in the REPL.
|
||||||
|
Even easier than making your own buffer.
|
||||||
#+begin_src emacs-lisp
|
#+begin_src emacs-lisp
|
||||||
(use-package haskell-mode
|
(use-package haskell-mode
|
||||||
:hook
|
:hook
|
||||||
@@ -3150,7 +3275,8 @@ development on Emacs.
|
|||||||
"s" #'+shell/toggle-sly
|
"s" #'+shell/toggle-sly
|
||||||
"c" #'sly-compile-file
|
"c" #'sly-compile-file
|
||||||
"a" #'sly-apropos
|
"a" #'sly-apropos
|
||||||
"d" #'sly-describe-symbol)
|
"d" #'sly-describe-symbol
|
||||||
|
"E" #'sly-eval-defun)
|
||||||
(local-leader
|
(local-leader
|
||||||
:keymaps 'lisp-mode-map
|
:keymaps 'lisp-mode-map
|
||||||
:infix "e"
|
:infix "e"
|
||||||
|
|||||||
@@ -22,9 +22,9 @@
|
|||||||
|
|
||||||
;; To be used in a haskell-interactive-mode buffer. It'll generate a
|
;; To be used in a haskell-interactive-mode buffer. It'll generate a
|
||||||
;; new buffer with haskell-mode and this minor mode activated. Once
|
;; new buffer with haskell-mode and this minor mode activated. Once
|
||||||
;; finished with the code, using another keybind it'll close this
|
;; finished with the code, using another keybind to close the buffer
|
||||||
;; buffer and paste the code into haskell-interactive-mode, evaluating
|
;; and paste the code into haskell-interactive-mode, evaluating it all
|
||||||
;; it all line by line with indenting and multi-line guards.
|
;; line by line with indenting and multi-line guards.
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
@@ -59,8 +59,7 @@ full multi-edit commands"
|
|||||||
(haskell-interactive-mode-return)))
|
(haskell-interactive-mode-return)))
|
||||||
|
|
||||||
(define-key haskell-interactive-mode-map (kbd "C-c '") #'haskell-multiedit)
|
(define-key haskell-interactive-mode-map (kbd "C-c '") #'haskell-multiedit)
|
||||||
(define-key haskell-multiedit-mode-map (kbd "C-c '") #'haskell-multiedit-evaluate-at-repl)
|
(define-key haskell-multiedit-mode-map (kbd "C-c '") #'haskell-multiedit-evaluate-at-repl))
|
||||||
)
|
|
||||||
|
|
||||||
(provide 'haskell-multiedit)
|
(provide 'haskell-multiedit)
|
||||||
;;; haskell-interactive-multiedit.el ends here
|
;;; haskell-interactive-multiedit.el ends here
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
(deftheme monokai
|
|
||||||
"Created 2021-03-10.")
|
|
||||||
|
|
||||||
(custom-theme-set-faces
|
|
||||||
'monokai
|
|
||||||
'(cursor ((t (:background "white"))))
|
|
||||||
'(fixed-pitch ((t (:family "Monospace"))))
|
|
||||||
'(variable-pitch ((((type w32)) (:foundry "outline" :family "Arial")) (t (:family "Sans Serif"))))
|
|
||||||
'(escape-glyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
|
|
||||||
'(homoglyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
|
|
||||||
'(minibuffer-prompt ((t (:foreground "#fd971f"))))
|
|
||||||
'(highlight ((t (:background "firebrick4" :foreground "white"))))
|
|
||||||
'(region ((t (:extend t :background "#4e4e4e"))))
|
|
||||||
'(shadow ((t (:foreground "#555556"))))
|
|
||||||
'(secondary-selection ((t (:extend t :background "#525254"))))
|
|
||||||
'(trailing-whitespace ((t (:background "#e74c3c"))))
|
|
||||||
'(font-lock-builtin-face ((t (:foreground "#fd971f"))))
|
|
||||||
'(font-lock-comment-delimiter-face ((t (:inherit font-lock-comment-face))))
|
|
||||||
'(font-lock-comment-face ((t (:foreground "#555556" :slant italic))))
|
|
||||||
'(font-lock-constant-face ((t (:inherit font-lock-variable-name-face))))
|
|
||||||
'(font-lock-doc-face ((t (:foreground "#7f7f80" :inherit (font-lock-comment-face)))))
|
|
||||||
'(font-lock-function-name-face ((t (:foreground "#b6e63e"))))
|
|
||||||
'(font-lock-keyword-face ((t (:foreground "#fb2874" :height 0.95 :family "Fira Code"))))
|
|
||||||
'(font-lock-negation-char-face ((t (:foreground "#9c91e4" :inherit (bold)))))
|
|
||||||
'(font-lock-preprocessor-face ((t (:foreground "#9c91e4" :inherit (bold)))))
|
|
||||||
'(font-lock-regexp-grouping-backslash ((t (:foreground "#9c91e4" :inherit (bold)))))
|
|
||||||
'(font-lock-regexp-grouping-construct ((t (:foreground "#9c91e4" :inherit (bold)))))
|
|
||||||
'(font-lock-string-face ((t (:foreground "yellow green"))))
|
|
||||||
'(font-lock-type-face ((t (:foreground "#66d9ef"))))
|
|
||||||
'(font-lock-variable-name-face ((t (:foreground "#fd971f"))))
|
|
||||||
'(font-lock-warning-face ((t (:inherit (warning)))))
|
|
||||||
'(button ((t (:inherit (link)))))
|
|
||||||
'(link ((t (:weight bold :underline (:color foreground-color :style line) :foreground "#fd971f"))))
|
|
||||||
'(link-visited ((t (:foreground "violet" :inherit (link)))))
|
|
||||||
'(fringe ((t (:foreground "#4e4e4e" :inherit (default)))))
|
|
||||||
'(header-line ((t (:foreground "#d6d6d4" :background "#1c1e1f"))))
|
|
||||||
'(tooltip ((t (:foreground "#d6d6d4" :background "#2d2e2e"))))
|
|
||||||
'(mode-line ((t (:box nil :background "#2d2e2e"))))
|
|
||||||
'(mode-line-buffer-id ((t (:weight bold))))
|
|
||||||
'(mode-line-emphasis ((t (:foreground "#fd971f"))))
|
|
||||||
'(mode-line-highlight ((t (:inherit (highlight)))))
|
|
||||||
'(mode-line-inactive ((t (:box nil :foreground "#4e4e4e" :background "#171819"))))
|
|
||||||
'(isearch ((t (:foreground "#1B2229" :background "#b6e63e"))))
|
|
||||||
'(isearch-fail ((t (:weight bold :foreground "#1B2229" :background "#e74c3c"))))
|
|
||||||
'(lazy-highlight ((t (:weight bold :foreground "#1B2229" :background "#9c91e4"))))
|
|
||||||
'(match ((t (:weight bold :foreground "#b6e63e" :background "#1B2229"))))
|
|
||||||
'(next-error ((t (:inherit (region)))))
|
|
||||||
'(query-replace ((t (:inherit (isearch)))))
|
|
||||||
'(outline-1 ((t (:foreground "#fb2874"))))
|
|
||||||
'(org-block ((t (:background "gray8"))))
|
|
||||||
'(ido-subdir ((t (:foreground "deepskyblue"))))
|
|
||||||
'(eshell-prompt ((t (:foreground "deepskyblue" :weight bold))))
|
|
||||||
'(company-tooltip-common ((((background light)) (:foreground "darkred")) (((background dark)) (:foreground "red"))))
|
|
||||||
'(company-tooltip ((t (:background "gray10" :foreground "white"))))
|
|
||||||
'(company-tooltip-selection ((t (:background "firebrick4"))))
|
|
||||||
'(org-quote ((t (:inherit org-block :slant italic :family "Liberation Mono"))))
|
|
||||||
'(org-verse ((t (:inherit org-block :slant oblique :family "Liberation Mono"))))
|
|
||||||
'(hl-line ((t (:extend t :background "gray9"))))
|
|
||||||
'(default ((t (:inherit nil :extend nil :stipple nil :background "black" :foreground "#d6d6d4" :inverse-video nil :box nil :strike-through nil :overline nil :underline nil :slant normal :weight normal :foundry "ADBO" :family "ibm plex mono")))))
|
|
||||||
|
|
||||||
(provide-theme 'monokai)
|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
'(region ((t (:extend t :background "gray25"))))
|
'(region ((t (:extend t :background "gray25"))))
|
||||||
'(shadow ((((class color grayscale) (min-colors 88) (background light)) (:foreground "grey50")) (((class color grayscale) (min-colors 88) (background dark)) (:foreground "grey70")) (((class color) (min-colors 8) (background light)) (:foreground "green")) (((class color) (min-colors 8) (background dark)) (:foreground "yellow"))))
|
'(shadow ((((class color grayscale) (min-colors 88) (background light)) (:foreground "grey50")) (((class color grayscale) (min-colors 88) (background dark)) (:foreground "grey70")) (((class color) (min-colors 8) (background light)) (:foreground "green")) (((class color) (min-colors 8) (background dark)) (:foreground "yellow"))))
|
||||||
'(secondary-selection ((((class color) (min-colors 88) (background light)) (:extend t :background "yellow1")) (((class color) (min-colors 88) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 16) (background light)) (:extend t :background "yellow")) (((class color) (min-colors 16) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 8)) (:extend t :foreground "black" :background "cyan")) (t (:inverse-video t))))
|
'(secondary-selection ((((class color) (min-colors 88) (background light)) (:extend t :background "yellow1")) (((class color) (min-colors 88) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 16) (background light)) (:extend t :background "yellow")) (((class color) (min-colors 16) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 8)) (:extend t :foreground "black" :background "cyan")) (t (:inverse-video t))))
|
||||||
'(trailing-whitespace ((((class color) (background light)) (:background "red1")) (((class color) (background dark)) (:background "red1")) (t (:inverse-video t))))
|
'(trailing-whitespace ((((class color) (background light)) (:background "red1")) (((class color) (background dark)) (:background "red1")))) ;;(t (:inverse-video t))))
|
||||||
'(font-lock-builtin-face ((t (:foreground "powder blue"))))
|
'(font-lock-builtin-face ((t (:foreground "powder blue"))))
|
||||||
'(font-lock-comment-delimiter-face ((t (:slant italic :foreground "gray24"))))
|
'(font-lock-comment-delimiter-face ((t (:slant italic :foreground "gray24"))))
|
||||||
'(font-lock-comment-face ((t (:slant italic :foreground "#868686"))))
|
'(font-lock-comment-face ((t (:slant italic :foreground "#868686"))))
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
'(eshell-prompt ((t (:foreground "deep sky blue" :weight bold))))
|
'(eshell-prompt ((t (:foreground "deep sky blue" :weight bold))))
|
||||||
'(whitespace-tab ((t (:background "gray5" :foreground "gray20"))))
|
'(whitespace-tab ((t (:background "gray5" :foreground "gray20"))))
|
||||||
'(whitespace-space ((t (:background "gray2" :foreground "darkgray"))))
|
'(whitespace-space ((t (:background "gray2" :foreground "darkgray"))))
|
||||||
|
'(whitespace-line ((t (:background "black" :foreground "violet"))))
|
||||||
'(haskell-interactive-face-prompt ((t (:foreground "green"))))
|
'(haskell-interactive-face-prompt ((t (:foreground "green"))))
|
||||||
'(org-verbatim ((t (:foreground "red3"))))
|
'(org-verbatim ((t (:foreground "red3"))))
|
||||||
'(org-code ((t (:foreground "green3"))))
|
'(org-code ((t (:foreground "green3"))))
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
(deftheme personal
|
|
||||||
"Created 2021-10-20.")
|
|
||||||
|
|
||||||
(custom-theme-set-faces
|
|
||||||
'personal
|
|
||||||
'(line-number ((t (:foreground "aquamarine1" :background "gray1"))))
|
|
||||||
'(cursor ((((background light)) (:background "black")) (((background dark)) (:background "white"))))
|
|
||||||
'(fixed-pitch ((t (:family "Monospace"))))
|
|
||||||
'(variable-pitch ((((type w32)) (:foundry "outline" :family "Arial")) (t (:family "Sans Serif"))))
|
|
||||||
'(escape-glyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
|
|
||||||
'(homoglyph ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "brown"))))
|
|
||||||
'(minibuffer-prompt ((((background dark)) (:foreground "cyan")) (((type pc)) (:foreground "magenta")) (t (:foreground "medium blue"))))
|
|
||||||
'(highlight ((t (:background "gray14"))))
|
|
||||||
'(region ((t (:extend t :background "gray25"))))
|
|
||||||
'(shadow ((((class color grayscale) (min-colors 88) (background light)) (:foreground "grey50")) (((class color grayscale) (min-colors 88) (background dark)) (:foreground "grey70")) (((class color) (min-colors 8) (background light)) (:foreground "green")) (((class color) (min-colors 8) (background dark)) (:foreground "yellow"))))
|
|
||||||
'(secondary-selection ((((class color) (min-colors 88) (background light)) (:extend t :background "yellow1")) (((class color) (min-colors 88) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 16) (background light)) (:extend t :background "yellow")) (((class color) (min-colors 16) (background dark)) (:extend t :background "SkyBlue4")) (((class color) (min-colors 8)) (:extend t :foreground "black" :background "cyan")) (t (:inverse-video t))))
|
|
||||||
'(trailing-whitespace ((((class color) (background light)) (:background "red1")) (((class color) (background dark)) (:background "red1")) (t (:inverse-video t))))
|
|
||||||
'(font-lock-builtin-face ((((class grayscale) (background light)) (:weight bold :foreground "LightGray")) (((class grayscale) (background dark)) (:weight bold :foreground "DimGray")) (((class color) (min-colors 88) (background light)) (:foreground "dark slate blue")) (((class color) (min-colors 88) (background dark)) (:foreground "LightSteelBlue")) (((class color) (min-colors 16) (background light)) (:foreground "Orchid")) (((class color) (min-colors 16) (background dark)) (:foreground "LightSteelBlue")) (((class color) (min-colors 8)) (:weight bold :foreground "blue")) (t (:weight bold))))
|
|
||||||
'(font-lock-comment-delimiter-face ((t (:slant italic :foreground "gray24"))))
|
|
||||||
'(font-lock-comment-face ((t (:slant italic :foreground "#868686"))))
|
|
||||||
'(font-lock-constant-face ((t (:foreground "slate blue" :weight semi-bold :height 0.99 :family "Source Code Pro"))))
|
|
||||||
'(font-lock-doc-face ((t (:inherit (font-lock-string-face)))))
|
|
||||||
'(font-lock-function-name-face ((t (:weight semi-bold))))
|
|
||||||
'(font-lock-keyword-face ((t (:foreground "DeepSkyBlue2" :weight bold :height 0.95 :family "Fira Code"))))
|
|
||||||
'(font-lock-negation-char-face ((t nil)))
|
|
||||||
'(font-lock-preprocessor-face ((t (:family "Source Code Pro" :foreground "#868686"))))
|
|
||||||
'(font-lock-regexp-grouping-backslash ((t (:inherit (bold)))))
|
|
||||||
'(font-lock-regexp-grouping-construct ((t (:inherit (bold)))))
|
|
||||||
'(font-lock-string-face ((t (:family "Fira Code" :foreground "yellow4"))))
|
|
||||||
'(font-lock-type-face ((t (:foreground "chartreuse" :family "Liberation Mono"))))
|
|
||||||
'(font-lock-variable-name-face ((t (:family "Source Code Variable" :foreground "#e6e6e6"))))
|
|
||||||
'(font-lock-warning-face ((t (:inherit (error)))))
|
|
||||||
'(button ((t (:inherit (link)))))
|
|
||||||
'(link ((t (:underline (:color foreground-color :style line) :foreground "cyan1"))))
|
|
||||||
'(link-visited ((t (:foreground "violet" :inherit (link)))))
|
|
||||||
'(fringe ((t (:background "grey4"))))
|
|
||||||
'(header-line ((t (:box nil :foreground "grey90" :background "grey20" :inherit (mode-line)))))
|
|
||||||
'(tooltip ((t (:foreground "black" :background "lightyellow" :inherit (variable-pitch)))))
|
|
||||||
'(mode-line ((t (:box (:line-width -1 :color nil :style released-button) :foreground "white" :background "black"))))
|
|
||||||
'(mode-line-buffer-id ((t (:weight bold))))
|
|
||||||
'(mode-line-emphasis ((t (:weight bold))))
|
|
||||||
'(mode-line-highlight ((((class color) (min-colors 88)) (:box (:line-width 2 :color "grey40" :style released-button))) (t (:inherit (highlight)))))
|
|
||||||
'(mode-line-inactive ((t (:weight light :box (:line-width -1 :color "grey40" :style nil) :foreground "grey30" :background "grey7" :inherit (mode-line)))))
|
|
||||||
'(isearch ((t (:foreground "brown4" :background "white"))))
|
|
||||||
'(isearch-fail ((((class color) (min-colors 88) (background light)) (:background "RosyBrown1")) (((class color) (min-colors 88) (background dark)) (:background "red4")) (((class color) (min-colors 16)) (:background "red")) (((class color) (min-colors 8)) (:background "red")) (((class color grayscale)) (:foreground "grey")) (t (:inverse-video t))))
|
|
||||||
'(lazy-highlight ((((class color) (min-colors 88) (background light)) (:background "paleturquoise")) (((class color) (min-colors 88) (background dark)) (:background "paleturquoise4")) (((class color) (min-colors 16)) (:background "turquoise3")) (((class color) (min-colors 8)) (:background "turquoise3")) (t (:underline (:color foreground-color :style line)))))
|
|
||||||
'(match ((((class color) (min-colors 88) (background light)) (:background "yellow1")) (((class color) (min-colors 88) (background dark)) (:background "RoyalBlue3")) (((class color) (min-colors 8) (background light)) (:foreground "black" :background "yellow")) (((class color) (min-colors 8) (background dark)) (:foreground "white" :background "blue")) (((type tty) (class mono)) (:inverse-video t)) (t (:background "gray"))))
|
|
||||||
'(next-error ((t (:inherit (region)))))
|
|
||||||
'(query-replace ((t (:inherit (isearch)))))
|
|
||||||
'(company-tooltip ((t (:background "navy blue" :foreground "white"))))
|
|
||||||
'(company-tooltip-selection ((t (:background "gray31"))))
|
|
||||||
'(company-tooltip-annotation ((t (:foreground "grey" :slant italic))))
|
|
||||||
'(company-preview ((((background light)) (:inherit (company-tooltip-selection company-tooltip))) (((background dark)) (:foreground "wheat" :background "blue4"))))
|
|
||||||
'(company-preview-common ((t (:inherit company-preview :foreground "grey"))))
|
|
||||||
'(org-block ((t (:background "gray3" :inherit shadow))))
|
|
||||||
'(eshell-prompt ((t (:foreground "deep sky blue" :weight bold))))
|
|
||||||
'(whitespace-tab ((t (:background "gray5" :foreground "gray20"))))
|
|
||||||
'(whitespace-space ((t (:background "gray2" :foreground "darkgray"))))
|
|
||||||
'(haskell-interactive-face-prompt ((t (:foreground "green"))))
|
|
||||||
'(org-verbatim ((t (:foreground "red3"))))
|
|
||||||
'(org-code ((t (:foreground "green3"))))
|
|
||||||
'(default ((t (:family "Source Code Pro" :foundry "ADBO" :width normal :height 113 :weight normal :slant normal :underline nil :overline nil :extend nil :strike-through nil :box nil :inverse-video nil :foreground "#b6b6b6" :background "#000000" :stipple nil :inherit nil)))))
|
|
||||||
|
|
||||||
(provide-theme 'personal)
|
|
||||||
@@ -1,202 +0,0 @@
|
|||||||
;;; profile-dotemacs.el --- Profile your Emacs init file
|
|
||||||
|
|
||||||
;; Copyright (C) 2010, 2012 David Engster
|
|
||||||
|
|
||||||
;; Author: David Engster <dengste@eml.cc>
|
|
||||||
|
|
||||||
;; This file is NOT part of GNU Emacs.
|
|
||||||
|
|
||||||
;; 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 2
|
|
||||||
;; 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
|
|
||||||
;; This is to easily profile your Emacs init file (or any other
|
|
||||||
;; script-like Emacs Lisp file, for that matter).
|
|
||||||
|
|
||||||
;; It will go over all sexp's (balanced expressions) in the file and
|
|
||||||
;; run them through `benchmark-run'. It will then show the file with
|
|
||||||
;; overlays applied in a way that let you easily find out which sexp's
|
|
||||||
;; take the most time. Since time is relative, it's not the absolute
|
|
||||||
;; value that counts but the percentage of the total running time.
|
|
||||||
;;
|
|
||||||
;; * All other sexp's with a percentage greater than
|
|
||||||
;; `profile-dotemacs-low-percentage' will be preceded by a
|
|
||||||
;; highlighted line, showing the results from `benchmark-run'.
|
|
||||||
;; Also, the more 'reddish' the background of the sexp, the more
|
|
||||||
;; time it needs.
|
|
||||||
|
|
||||||
;; * All other sexp's will be grayed out to indicate that their
|
|
||||||
;; running time is miniscule. You can still see the benchmark
|
|
||||||
;; results in the minibuffer by hovering over the sexp with the
|
|
||||||
;; mouse.
|
|
||||||
|
|
||||||
;; You can only benchmark full sexp's, so if you wrapped large parts
|
|
||||||
;; of your init file in some conditional clause, you'll have to remove
|
|
||||||
;; that for getting finer granularity.
|
|
||||||
|
|
||||||
;;; Usage:
|
|
||||||
|
|
||||||
;; Start emacs as follows:
|
|
||||||
;;
|
|
||||||
;; emacs -Q -l <PATH>/profile-dotemacs.el -f profile-dotemacs
|
|
||||||
;;
|
|
||||||
;; with <PATH> being the path to where this file resides.
|
|
||||||
|
|
||||||
;;; Caveats (thanks to Raffaele Ricciardi for reporting those):
|
|
||||||
|
|
||||||
;; - The usual `--debug-init' for debugging your init file won't work
|
|
||||||
;; with profile-dotemacs, so you'll have to call
|
|
||||||
;; `toggle-debug-on-error', either on the commandline or at the
|
|
||||||
;; beginning of your init file.
|
|
||||||
;; - `load-file-name' is nil when the init file is being loaded
|
|
||||||
;; by the profiler. This might matter if you perform the
|
|
||||||
;; bulk of initializations in a different file.
|
|
||||||
;; - Starting external shells like IELM or eshell in your init file
|
|
||||||
;; might mess with overlay creation, so this must not be done.
|
|
||||||
|
|
||||||
;;; Download:
|
|
||||||
|
|
||||||
;; You can always get the latest version from
|
|
||||||
;; http://randomsample.de/profile-dotemacs.el
|
|
||||||
|
|
||||||
;; Aryadev Chavali: customised for this emacs specifically.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(require 'thingatpt)
|
|
||||||
(require 'benchmark)
|
|
||||||
|
|
||||||
;; User variables
|
|
||||||
|
|
||||||
(defvar profile-dotemacs-file "~/.config/emacs/init.el"
|
|
||||||
"File to be profiled.")
|
|
||||||
|
|
||||||
(defvar profile-dotemacs-low-percentage 3
|
|
||||||
"Percentage which should be considered low.
|
|
||||||
All sexp's with a running time below this percentage will be
|
|
||||||
grayed out.")
|
|
||||||
|
|
||||||
(defface profile-dotemacs-time-face
|
|
||||||
'((((background dark)) (:background "OrangeRed1"))
|
|
||||||
(t (:background "red3")))
|
|
||||||
"Background color to indicate percentage of total time.")
|
|
||||||
|
|
||||||
(defface profile-dotemacs-low-percentage-face
|
|
||||||
'((((background dark)) (:foreground "gray25"))
|
|
||||||
(t (:foreground "gray75")))
|
|
||||||
"Face for sexps below `profile-dotemacs-low-percentage'.")
|
|
||||||
|
|
||||||
(defface profile-dotemacs-highlight-face
|
|
||||||
'((((background dark)) (:background "blue"))
|
|
||||||
(t (:background "yellow")))
|
|
||||||
"Highlight face for benchmark results.")
|
|
||||||
|
|
||||||
;; Main function
|
|
||||||
|
|
||||||
(defun profile-dotemacs ()
|
|
||||||
"Load `profile-dotemacs-file' and benchmark its sexps."
|
|
||||||
(interactive)
|
|
||||||
(with-current-buffer (find-file-noselect profile-dotemacs-file t)
|
|
||||||
(setq buffer-read-only t) ;; just to be sure
|
|
||||||
(goto-char (point-min))
|
|
||||||
(let (start end results)
|
|
||||||
(while
|
|
||||||
(< (point)
|
|
||||||
(setq end (progn
|
|
||||||
(forward-sexp 1)
|
|
||||||
(point))))
|
|
||||||
(forward-sexp -1)
|
|
||||||
(setq start (point))
|
|
||||||
(add-to-list
|
|
||||||
'results
|
|
||||||
`(,start ,end
|
|
||||||
,(benchmark-run
|
|
||||||
(eval (sexp-at-point)))))
|
|
||||||
(goto-char end))
|
|
||||||
(profile-dotemacs-show-results results)
|
|
||||||
(switch-to-buffer (current-buffer)))))
|
|
||||||
|
|
||||||
;; Helper functions
|
|
||||||
|
|
||||||
(defun profile-dotemacs-show-results (results)
|
|
||||||
"Show timings from RESULTS in current buffer."
|
|
||||||
(let ((totaltime (profile-dotemacs-totaltime results))
|
|
||||||
current percentage ov)
|
|
||||||
(while results
|
|
||||||
(let* ((current (pop results))
|
|
||||||
(ov (make-overlay (car current) (cadr current)))
|
|
||||||
(current (car (last current)))
|
|
||||||
(percentage (/ (+ (car current) (nth 2 current))
|
|
||||||
totaltime))
|
|
||||||
col benchstr lowface)
|
|
||||||
(setq col
|
|
||||||
(profile-dotemacs-percentage-color
|
|
||||||
percentage
|
|
||||||
(face-background 'default)
|
|
||||||
(face-background 'profile-dotemacs-time-face)))
|
|
||||||
(setq percentage (round (* 100 percentage)))
|
|
||||||
(setq benchstr (profile-dotemacs-make-benchstr current))
|
|
||||||
(overlay-put ov 'help-echo benchstr)
|
|
||||||
(if (and (numberp profile-dotemacs-low-percentage)
|
|
||||||
(< percentage profile-dotemacs-low-percentage))
|
|
||||||
(overlay-put ov 'face 'profile-dotemacs-low-percentage-face)
|
|
||||||
(overlay-put ov 'before-string
|
|
||||||
(propertize benchstr
|
|
||||||
'face 'profile-dotemacs-highlight-face))
|
|
||||||
(overlay-put ov 'face
|
|
||||||
`(:background ,col)))))
|
|
||||||
(setq ov (make-overlay (1- (point-max)) (point-max)))
|
|
||||||
(overlay-put ov 'after-string
|
|
||||||
(propertize
|
|
||||||
(format "\n-----------------\nTotal time: %.2fs\n"
|
|
||||||
totaltime)
|
|
||||||
'face 'profile-dotemacs-highlight-face))))
|
|
||||||
|
|
||||||
(defun profile-dotemacs-totaltime (results)
|
|
||||||
"Calculate total time of RESULTS."
|
|
||||||
(let ((totaltime 0))
|
|
||||||
(mapc (lambda (x)
|
|
||||||
(let ((cur (car (last x))))
|
|
||||||
(setq totaltime (+ totaltime (car cur) (nth 2 cur)))))
|
|
||||||
results)
|
|
||||||
totaltime))
|
|
||||||
|
|
||||||
(defun profile-dotemacs-percentage-color (percent col-begin col-end)
|
|
||||||
"Calculate color according to PERCENT between COL-BEGIN and COL-END."
|
|
||||||
(let* ((col1 (color-values col-begin))
|
|
||||||
(col2 (color-values col-end))
|
|
||||||
(col
|
|
||||||
(mapcar (lambda (c)
|
|
||||||
(round
|
|
||||||
(+ (* (- 1 percent) (nth c col1))
|
|
||||||
(* percent (nth c col2)))))
|
|
||||||
'(0 1 2))))
|
|
||||||
(format "RGB:%04x/%04x/%04x"
|
|
||||||
(car col)
|
|
||||||
(nth 1 col)
|
|
||||||
(nth 2 col))))
|
|
||||||
|
|
||||||
(defun profile-dotemacs-make-benchstr (timings)
|
|
||||||
"Create descriptive benchmark string from TIMINGS."
|
|
||||||
(format
|
|
||||||
(concat
|
|
||||||
"<Percentage: %d ; "
|
|
||||||
"Time: %.2f ; "
|
|
||||||
"Number of GC: %d ; "
|
|
||||||
"Time for GC: %.2f>\n")
|
|
||||||
percentage
|
|
||||||
(car timings) (nth 1 timings) (nth 2 timings)))
|
|
||||||
|
|
||||||
|
|
||||||
;; profile-dotemacs.el ends here
|
|
||||||
@@ -18,3 +18,5 @@ notmuch tag -inbox +jobs from:'*@jobs*' from:'*@indeed.com*'
|
|||||||
notmuch tag -inbox +bank from:'*@*hsbc*' from:'*@*lloydsbank*'
|
notmuch tag -inbox +bank from:'*@*hsbc*' from:'*@*lloydsbank*'
|
||||||
|
|
||||||
notmuch tag +flagged from:'expiry@letsencrypt.org'
|
notmuch tag +flagged from:'expiry@letsencrypt.org'
|
||||||
|
|
||||||
|
notmuch tag -inbox +unread +trading from:"noreply@trading212.com"
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ let mapleader = ' '
|
|||||||
|
|
||||||
|
|
||||||
"" Theming
|
"" Theming
|
||||||
colorscheme elflord
|
|
||||||
|
|
||||||
|
|
||||||
"" Dir Config
|
"" Dir Config
|
||||||
|
|||||||
Reference in New Issue
Block a user