M .hgignore +1 -0
@@ 20,5 20,6 @@ emacs.d/erc-auth.el
 emacs.d/request/
 emacs.d/eln-cache/
 emacs.d/recentf
+emacs.d/speed-type
 
 vim/bundle/

          
M .hgsubstate +2 -2
@@ 1,3 1,3 @@ 
-5987b06b724475f2ed0686d3a16acfe618886059 emacs.d/lisp/eglot
+10669992d2c33b2c88a578213797223b83de6c28 emacs.d/lisp/eglot
 fbfb98ff2f8841d47ac8a703fd8e37519abd9b15 emacs.d/lisp/elm-mode
-6ad71fa89a6837cf2f01139c71a4351a792400ae emacs.d/lisp/fsharp-mode
+4182ab9e36f55d29a04292b11255fe495cb80a54 emacs.d/lisp/fsharp-mode

          
M emacs.d/init.el +8 -2
@@ 5,7 5,7 @@ 
 (blink-cursor-mode -1)
 
 (if (eq system-type 'darwin)
-    (add-to-list 'default-frame-alist '(font . "Iosevka-16"))
+    (add-to-list 'default-frame-alist '(font . "JetBrains Mono-14"))
   (add-to-list 'default-frame-alist '(font . "Iosevka-14")))
 
 (package-initialize)

          
@@ 36,7 36,13 @@ 
 (use-package themodor
   :ensure nil
   :load-path "lisp"
-  :config (enable-theme 'themodor))
+  ;; :config (enable-theme 'themodor)
+  )
+
+(use-package frende-theme
+  :ensure nil
+  :load-path "lisp"
+  :config (load-theme 'frende t))
 
 (use-package eglot-x
   :ensure nil

          
M emacs.d/lisp/eglot-x.el +4 -2
@@ 17,7 17,9 @@ 
           rust-mode
           csharp-tree-sitter-mode) . 'eglot-ensure)
   :config
-  (setq eglot-confirm-server-initiated-edits nil))
+  (setq eglot-confirm-server-initiated-edits nil
+        eglot-send-changes-idle-time 0
+        eglot-events-buffer-size 0))
 
 (require 'eglot)
 

          
@@ 35,7 37,7 @@ 
 (cl-defmethod eglot-initialization-options ((server eglot-elm))
   "Init options for elm-language-server. "
   (list
-   :onlyUpdateDiagnosticsOnSave t
+   :onlyUpdateDiagnosticsOnSave :json-false
    :elmPath ""
    :elmFormatPath ""
    :elmTestPath ""

          
A => emacs.d/lisp/frende-dark-theme.el +409 -0
@@ 0,0 1,409 @@ 
+;;; frende-dark-theme.el --- Personal theme for emacs  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Theodor Thornhill
+
+;; Author: Theodor Thornhill <theo@thornhill.no>
+;; Version: 0.1
+
+;; 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, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Frende-Dark theme for emacs
+
+;;; Code:
+
+(defgroup frende-dark nil
+  "Frende-Dark theme."
+  :group 'faces)
+
+(deftheme frende-dark
+  "The Frende-Dark theme")
+
+;;;###autoload
+(defcustom frende-dark-override-colors-alist '()
+  "Place to override default theme colors.
+You can override a subset of the theme's default colors by
+defining them in this alist."
+  :group 'frende-dark-theme
+  :type '(alist
+          :key-type (string :tag "Name")
+          :value-type (string :tag " Hex")))
+
+(defvar frende-dark-use-variable-pitch nil
+  "When non-nil, use variable pitch face for some headings and titles.")
+
+;;; Color Palette
+
+(defvar frende-dark-default-colors-alist
+  '(("hvit"    . "#fff7f1")
+    ("svart-1" . "#5e081d")
+    ("svart"   . "#3f0613")
+    ("svart+1" . "#63091e")
+
+    ("krem-2"  . "#e0ceb8")
+    ("krem-1" . "#edd9c2")
+    ("krem"    . "#ffead2")
+    ("krem+1"  . "#fff1e0")
+    ("krem+2"  . "#fff4e6")
+
+    ("grå"     . "#5A5B5A")
+    ("brun"    . "#87010b")
+
+    ("rød-2"   . "#940721")
+    ("rød-1"   . "#ab0928")
+    ("rød"     . "#c60c30")
+    ("rød+1"   . "#e3103a")
+
+    ("beige"   . "#ffc69d")
+
+    ("rosa-1"  . "#eb6774")
+    ("rosa"    . "#ff8e99")
+
+    ("grønn-2" . "#238636")
+    ("grønn-1" . "#228769")
+    ("grønn"   . "#007162")
+    ("grønn+1" . "#8FB28F")
+    ("grønn+2" . "#9FC59F")
+    ("grønn+3" . "#AFD8AF")
+    ("grønn+4" . "#BFEBBF")
+
+    ("cyan"    . "#8ABEB7")
+
+    ("blå+1"   . "#106dc4")
+    ("blå"     . "#0e5eab")
+    ("blå-1"   . "#0c559c")
+    ("blå-2"   . "#0b4a8a")
+    ("blå-3"   . "#0a4682")
+
+    ("magenta"  . "#C9B4CF"))
+  "List of Frende-Dark colors.
+Each element has the form (NAME . HEX).
+`+N' suffixes indicate a color is lighter.
+`-N' suffixes indicate a color is darker.")
+
+(defmacro frende-dark-with-color-variables (&rest body)
+  "`let' bind all colors defined in `frende-dark-default-colors-alist' around BODY.
+Also bind `class' to ((class color) (min-colors 89))."
+  (declare (indent 0))
+  `(let ((class '((class color) (min-colors 89)))
+         ,@(mapcar (lambda (cons)
+                     (list (intern (car cons)) (cdr cons)))
+                   (append frende-dark-default-colors-alist
+                           frende-dark-override-colors-alist))
+         (z-variable-pitch (if frende-dark-use-variable-pitch
+                               'variable-pitch 'default)))
+     ,@body))
+
+;;; Theme Faces
+(frende-dark-with-color-variables
+  (custom-theme-set-faces
+   'frende-dark
+;;;; Built-in
+;;;;; basic coloring
+   '(button ((t (:underline t))))
+   `(link ((t (:foreground ,rosa :underline t :weight bold))))
+   `(link-visited ((t (:foreground ,rosa-1 :underline t :weight normal))))
+   `(default ((t (:foreground ,hvit :background ,svart))))
+   `(cursor ((t (:foreground ,svart :background ,hvit))))
+   `(widget-field ((t (:foreground ,krem+2 :background ,svart))))
+   `(escape-glyph ((t (:foreground ,rosa :weight bold))))
+   `(fringe ((t (:foreground ,hvit :background ,svart))))
+   `(header-line ((t (:foreground ,rosa
+                                  :background ,krem-2
+                                  :box (:line-width -1 :style pressed-button)
+                                  :extend t))))
+   `(highlight ((t (:background ,svart+1))))
+   `(success ((t (:foreground ,grønn))))
+   `(warning ((t (:foreground ,blå))))
+   `(error ((t (:foreground ,rød))))
+   `(tooltip ((t (:foreground ,svart :background ,krem+1))))
+   `(show-paren-match ((t (:background ,beige))))
+;;;;; modeline
+   `(mode-line ((t (:foreground ,svart :background ,krem+1 :box ,svart))))
+   `(mode-line-buffer-id ((t :inherit bold)))
+   `(mode-line-emphasis ((t :inherit bold :foreground ,blå)))
+   `(mode-line-highlight ((t :foreground ,blå :box (:line-width -1 :style pressed-button))))
+   `(mode-line-inactive ((t (:foreground ,svart :background ,krem :box ,svart))))
+;;;;; compilation
+   `(compilation-column-face ((t (:foreground ,rosa))))
+   `(compilation-column-number ((t (:foreground ,rosa))))
+   `(compilation-enter-directory-face ((t (:foreground ,grønn))))
+   `(compilation-error-face ((t (:foreground ,rød-1 :weight bold :underline t))))
+   `(compilation-face ((t (:foreground ,svart))))
+   `(compilation-info-face ((t (:foreground ,blå))))
+   `(compilation-info ((t (:foreground ,grønn+4 :underline t))))
+   `(compilation-leave-directory-face ((t (:foreground ,grønn))))
+   `(compilation-line-face ((t (:foreground ,rosa))))
+   `(compilation-line-number ((t (:foreground ,rosa))))
+   `(compilation-message-face ((t (:foreground ,blå))))
+   `(compilation-warning-face ((t (:foreground ,beige :weight bold :underline t))))
+   `(compilation-mode-line-exit ((t (:foreground ,grønn+2 :weight bold))))
+   `(compilation-mode-line-fail ((t (:foreground ,rød :weight bold))))
+   `(compilation-mode-line-run ((t (:foreground ,rosa :weight bold))))
+;;;;; completions
+   `(completions-annotations ((t (:foreground ,svart-1))))
+
+;;;;; corfu
+   `(corfu-background ((t (:background ,krem))))
+   `(corfu-current ((t (:background ,grønn+2))))
+   `(corfu-border ((t (:background ,svart))))
+;;;;; customize
+   `(custom-variable-tag ((t (:foreground ,blå :weight bold))))
+   `(custom-group-tag ((t (:foreground ,blå :weight bold :height 1.2))))
+   `(custom-state ((t (:foreground ,grønn+4))))
+;;;;; grep
+   `(grep-context-face ((t (:foreground ,svart))))
+   `(grep-error-face ((t (:foreground ,rød-1 :weight bold :underline t))))
+   `(grep-hit-face ((t (:foreground ,blå))))
+   `(grep-match-face ((t (:foreground ,beige :weight bold))))
+   `(match ((t (:background ,krem-2 :foreground ,beige :weight bold))))
+;;;;; info
+   `(Info-quoted ((t (:inherit font-lock-constant-face))))
+;;;;; isearch
+   `(isearch ((t (:foreground ,rosa-1 :weight bold :background ,krem))))
+   `(isearch-fail ((t (:foreground ,svart :background ,rød))))
+   `(lazy-highlight ((t (:foreground ,rosa-1 :weight bold :background ,krem))))
+
+   `(menu ((t (:foreground ,svart :background ,krem))))
+   `(minibuffer-prompt ((t (:foreground ,rosa))))
+;;;;; modeline
+   `(mode-line ((t (:foreground ,svart :background ,krem :box ,svart))))
+   `(mode-line-buffer-id ((t :inherit bold)))
+   `(mode-line-emphasis ((t :inherit bold :foreground ,blå)))
+   `(mode-line-highlight ((t :foreground ,blå :box (:line-width -1 :style pressed-button))))
+   `(mode-line-inactive ((t (:foreground ,svart :background ,svart+1 :box ,svart))))
+
+   `(region ((,class (:background ,beige :extend t))
+             (t :inverse-video t)))
+   `(secondary-selection ((t (:background ,krem+2))))
+   `(trailing-whitespace ((t (:background ,rød))))
+   `(vertical-border ((t (:foreground ,svart))))
+;;;;; font lock
+   `(font-lock-builtin-face ((t (:foreground ,rød :slant italic))))
+   `(font-lock-comment-face ((t (:foreground ,grå :slant italic))))
+   `(font-lock-comment-delimiter-face ((t (:foreground ,grå :slant italic))))
+   `(font-lock-constant-face ((t (:foreground ,brun))))
+   `(font-lock-doc-face ((t (:foreground ,grå))))
+   `(font-lock-function-name-face ((t (:foreground ,grønn))))
+   `(font-lock-keyword-face ((t (:foreground ,blå :slant italic))))
+   `(font-lock-negation-char-face ((t (:foreground ,rosa :weight bold))))
+   `(font-lock-preprocessor-face ((t (:foreground ,blå+1))))
+   `(font-lock-regexp-grouping-construct ((t (:foreground ,rosa :weight bold))))
+   `(font-lock-regexp-grouping-backslash ((t (:foreground ,grønn :weight bold))))
+   `(font-lock-string-face ((t (:foreground ,brun))))
+   `(font-lock-type-face ((t (:foreground ,grønn-1 :slant italic))))
+   `(font-lock-variable-name-face ((t (:foreground ,svart))))
+   `(font-lock-warning-face ((t (:foreground ,rosa-1 :weight bold))))
+
+   `(c-annotation-face ((t (:inherit font-lock-constant-face))))
+;;;; icomplete
+   `(icomplete-selected-match ((t (:background ,grønn+3))))
+;;;; Third-party
+   `(vertico-current ((t (:background ,krem+2))))
+;;;;; SLIME
+   `(sly-mrepl-output-face ((t (:foreground ,blå))))
+   `(slime-repl-inputed-output-face ((t (:foreground ,grønn))))
+   `(slime-error-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,rød)))
+      (t
+       (:underline ,rød))))
+   `(slime-warning-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,beige)))
+      (t
+       (:underline ,beige))))
+   `(slime-style-warning-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,rosa)))
+      (t
+       (:underline ,rosa))))
+   `(slime-note-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,grønn)))
+      (t
+       (:underline ,grønn))))
+   `(slime-highlight-face ((t (:inherit highlight))))
+;;;;; diff
+   `(diff-added             ((t (:background ,grønn+2))))
+   `(diff-changed           ((t (:background ,grønn+1))))
+   `(diff-removed           ((t (:background ,rosa))))
+   `(diff-refine-added      ((t (:foreground ,grønn))))
+   `(diff-refine-changed    ((t (:foreground ,grønn+2))))
+   `(diff-refine-removed    ((t (:foreground ,rød+1))))
+   `(diff-indicator-added   ((t (:background ,grønn+2))))
+   `(diff-indicator-removed ((t (:background ,rosa))))
+   `(diff-header ((,class (:foreground ,svart ::background ,krem))
+                  (t (:background ,svart :foreground ,krem))))
+   `(diff-file-header
+     ((,class (:background ,krem+1 :foreground ,svart :weight bold))
+      (t (:background ,svart :foreground ,krem :weight bold))))
+;;;;; ediff
+   `(ediff-current-diff-A ((t (:foreground ,svart :background ,rød-2))))
+   `(ediff-current-diff-Ancestor ((t (:foreground ,svart :background ,rød-2))))
+   `(ediff-current-diff-B ((t (:foreground ,svart :background ,grønn-2))))
+   `(ediff-current-diff-C ((t (:foreground ,svart :background ,blå-3))))
+   `(ediff-even-diff-A ((t (:background ,krem+1))))
+   `(ediff-even-diff-Ancestor ((t (:background ,krem+1))))
+   `(ediff-even-diff-B ((t (:background ,krem+1))))
+   `(ediff-even-diff-C ((t (:background ,krem+1))))
+   `(ediff-fine-diff-A ((t (:foreground ,svart :background ,rød-2 :weight bold))))
+   `(ediff-fine-diff-Ancestor ((t (:foreground ,svart :background ,rød-2 weight bold))))
+   `(ediff-fine-diff-B ((t (:foreground ,svart :background ,grønn :weight bold))))
+   `(ediff-fine-diff-C ((t (:foreground ,svart :background ,blå-3 :weight bold ))))
+   `(ediff-odd-diff-A ((t (:background ,krem+2))))
+   `(ediff-odd-diff-Ancestor ((t (:background ,krem+2))))
+   `(ediff-odd-diff-B ((t (:background ,krem+2))))
+   `(ediff-odd-diff-C ((t (:background ,krem+2))))
+;;;;; erc
+   `(erc-action-face ((t (:inherit erc-default-face))))
+   `(erc-bold-face ((t (:weight bold))))
+   `(erc-current-nick-face ((t (:foreground ,blå :weight bold))))
+   `(erc-dangerous-host-face ((t (:inherit font-lock-warning-face))))
+   `(erc-default-face ((t (:foreground ,svart))))
+   `(erc-direct-msg-face ((t (:inherit erc-default-face))))
+   `(erc-error-face ((t (:inherit font-lock-warning-face))))
+   `(erc-fool-face ((t (:inherit erc-default-face))))
+   `(erc-highlight-face ((t (:inherit hover-highlight))))
+   `(erc-input-face ((t (:foreground ,grønn))))
+   `(erc-keyword-face ((t (:foreground ,blå :weight bold))))
+   `(erc-nick-default-face ((t (:foreground ,cyan :weight bold))))
+   `(erc-my-nick-face ((t (:foreground ,rød :weight bold))))
+   `(erc-nick-msg-face ((t (:inherit erc-default-face))))
+   `(erc-notice-face ((t (:foreground ,grå))))
+   `(erc-pal-face ((t (:foreground ,beige :weight bold))))
+   `(erc-prompt-face ((t (:foreground ,blå :background ,krem :weight bold))))
+   `(erc-timestamp-face ((t (:foreground ,grønn))))
+   `(erc-underline-face ((t (:underline t))))
+;;;;; eshell
+   `(eshell-prompt ((t (:foreground ,grønn :weight bold))))
+   `(eshell-ls-archive ((t (:foreground ,rød-1 :weight bold))))
+   `(eshell-ls-backup ((t (:inherit font-lock-comment-face))))
+   `(eshell-ls-clutter ((t (:inherit font-lock-comment-face))))
+   `(eshell-ls-directory ((t (:foreground ,blå+1 :weight bold))))
+   `(eshell-ls-executable ((t (:foreground ,rød+1 :weight bold))))
+   `(eshell-ls-unreadable ((t (:foreground ,svart))))
+   `(eshell-ls-missing ((t (:inherit font-lock-warning-face))))
+   `(eshell-ls-product ((t (:inherit font-lock-doc-face))))
+   `(eshell-ls-special ((t (:foreground ,rosa :weight bold))))
+   `(eshell-ls-symlink ((t (:foreground ,cyan :weight bold))))
+;;;;; flymake
+   `(flymake-error
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,rød)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,rød :weight bold :underline t))))
+   `(flymake-warning
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,blå)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,blå :weight bold :underline t))))
+   `(flymake-note
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,grønn)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,grønn :weight bold :underline t))))
+;;;;; message-mode
+   `(message-cited-text ((t (:inherit font-lock-comment-face))))
+   `(message-header-name ((t (:foreground ,grønn+1))))
+   `(message-header-other ((t (:foreground ,grønn))))
+   `(message-header-to ((t (:foreground ,rosa :weight bold))))
+   `(message-header-cc ((t (:foreground ,rosa :weight bold))))
+   `(message-header-newsgroups ((t (:foreground ,rosa :weight bold))))
+   `(message-header-subject ((t (:foreground ,beige :weight bold))))
+   `(message-header-xheader ((t (:foreground ,grønn))))
+   `(message-mml ((t (:foreground ,rosa :weight bold))))
+   `(message-separator ((t (:inherit font-lock-comment-face))))
+;;;;; notmuch
+   `(notmuch-crypto-decryption ((t (:foreground ,krem :background ,magenta))))
+   `(notmuch-crypto-part-header ((t (:foreground ,blå+1))))
+   `(notmuch-crypto-signature-bad ((t (:foreground ,krem :background ,rød))))
+   `(notmuch-crypto-signature-good ((t (:foreground ,krem :background ,grønn+1))))
+   `(notmuch-crypto-signature-good-key ((t (:foreground ,krem :background ,beige))))
+   `(notmuch-crypto-signature-unknown ((t (:foreground ,krem :background ,rød))))
+   `(notmuch-hello-logo-background ((t (:background ,krem+2))))
+   `(notmuch-message-summary-face ((t (:background ,krem-1))))
+   `(notmuch-search-flagged-face ((t (:foreground ,blå+1))))
+   `(notmuch-search-non-matching-authors ((t (:foreground ,svart-1))))
+   `(notmuch-tag-added ((t (:underline ,grønn+1))))
+   `(notmuch-tag-deleted ((t (:strike-through ,rød))))
+   `(notmuch-tag-face ((t (:foreground ,grønn+1))))
+   `(notmuch-tag-flagged ((t (:foreground ,blå+1))))
+   `(notmuch-tag-unread ((t (:foreground ,rød))))
+   `(notmuch-tree-match-author-face ((t (:foreground ,grønn+1))))
+   `(notmuch-tree-match-tag-face ((t (:foreground ,grønn+1))))
+;;;;; markdown
+   `(markdown-code-face
+     ((t (:foreground ,grønn))))
+;;;;; whitespace-mode
+   `(whitespace-space ((t (:background ,krem+1 :foreground ,krem+1))))
+   `(whitespace-hspace ((t (:background ,krem+1 :foreground ,krem+1))))
+   `(whitespace-tab ((t (:background ,rød-1))))
+   `(whitespace-newline ((t (:foreground ,krem+1))))
+   `(whitespace-trailing ((t (:background ,rød))))
+   `(whitespace-line ((t (:background ,krem :foreground ,magenta))))
+   `(whitespace-space-before-tab ((t (:background ,beige :foreground ,beige))))
+   `(whitespace-indentation ((t (:background ,rosa :foreground ,rød))))
+   `(whitespace-empty ((t (:background ,rosa))))
+   `(whitespace-space-after-tab ((t (:background ,rosa :foreground ,rød))))))
+
+;;; Theme Variables
+(frende-dark-with-color-variables
+  (custom-theme-set-variables
+   'frende-dark
+;;;;; ansi-color
+   `(ansi-color-names-vector [,krem ,rød ,grønn ,rosa ,blå ,magenta ,cyan ,svart])
+;;;;; company-quickhelp
+   `(company-quickhelp-color-background ,krem+1)
+   `(company-quickhelp-color-foreground ,svart)
+;;;;; nrepl-client
+   `(nrepl-message-colors
+     '(,rød ,beige ,rosa ,grønn ,grønn+4
+            ,cyan ,blå+1 ,magenta))
+;;;;; vc-annotate
+   `(vc-annotate-color-map
+     '(( 20. . ,rød-1)
+       ( 40. . ,rød)
+       ( 60. . ,beige)
+       ( 80. . ,rosa-1)
+       (100. . ,rød-2)
+       (120. . ,rosa)
+       (140. . ,grønn-2)
+       (160. . ,grønn)
+       (180. . ,grønn+1)
+       (200. . ,grønn+2)
+       (220. . ,grønn+3)
+       (240. . ,grønn+4)
+       (260. . ,cyan)
+       (280. . ,blå-2)
+       (300. . ,blå-1)
+       (320. . ,blå)
+       (340. . ,blå+1)
+       (360. . ,magenta)))
+   `(vc-annotate-very-old-color ,magenta)
+   `(vc-annotate-background ,krem-2)
+   ))
+
+;;; Footer
+
+;;;###autoload
+(when load-file-name
+  (let ((dir (file-name-directory load-file-name)))
+    (unless (equal dir (expand-file-name "themes/" data-directory))
+      (add-to-list 'custom-theme-load-path dir))))
+
+(provide-theme 'frende-dark)
+
+;;; frende-dark-theme.el ends here

          
A => emacs.d/lisp/frende-theme.el +427 -0
@@ 0,0 1,427 @@ 
+;;; frende-theme.el --- Personal theme for emacs  -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 Theodor Thornhill
+
+;; Author: Theodor Thornhill <theo@thornhill.no>
+;; Version: 0.1
+
+;; 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, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Frende theme for emacs
+
+;;; Code:
+
+(defgroup frende nil
+  "Frende theme."
+  :group 'faces)
+
+(deftheme frende
+  "The Frende theme")
+
+;;;###autoload
+(defcustom frende-override-colors-alist '()
+  "Place to override default theme colors.
+You can override a subset of the theme's default colors by
+defining them in this alist."
+  :group 'frende-theme
+  :type '(alist
+          :key-type (string :tag "Name")
+          :value-type (string :tag " Hex")))
+
+(defvar frende-use-variable-pitch nil
+  "When non-nil, use variable pitch face for some headings and titles.")
+
+;;; Color Palette
+
+(defvar frende-default-colors-alist
+  '(("hvit"    . "#fff7f1")
+
+    ("rød-2"   . "#940721")
+    ("rød-1"   . "#ab0928")
+    ("rød"     . "#c60c30")
+    ("rød+1"   . "#e3103a")
+    
+    ("svart-1" . "#5e081d")
+    ("svart"   . "#3f0613")
+    ("svart+1" . "#63091e")
+
+    ("krem-2"  . "#faddb9")
+    ("krem-1"  . "#fce4c7")
+    ("krem"    . "#ffead2")
+    ("krem+1"  . "#fceddc")
+    ("krem+2"  . "#faedde")
+
+    ("beige"   . "#ffc69d")
+
+    ("rosa-1"  . "#eb6774")
+    ("rosa"    . "#ff8e99")
+    
+    ("fersken" . "#dc1234")
+
+    ("brun"    . "#87010b")
+
+    ("grønn-2" . "#015c50")
+    ("grønn-1" . "#016356")
+    ("grønn"   . "#007162")
+    ("grønn+1" . "#007d6c")
+    ("grønn+2" . "#008775")
+    ("grønn+3" . "#019480")
+    ("grønn+4" . "#02a18b")
+
+    ("blå+1"   . "#106dc4")
+    ("blå"     . "#0e5eab")
+    ("blå-1"   . "#0c559c")
+    ("blå-2"   . "#0b4a8a")
+    ("blå-3"   . "#0a4682")
+
+    ("cyan"    . "#8ABEB7")
+    ("magenta"  . "#C9B4CF")
+    ("grå"     . "#5A5B5A")
+
+    ("frende-added"             . "#172E20")
+    ("frende-changed"           . "#16252d")
+    ("frende-removed"           . "#371A1E")
+    ("frende-refine-added"      . "#3CC156")
+    ("frende-refine-changed"    . "#888811")
+    ("frende-refine-removed"    . "#BA3434")
+    ("frende-indicator-added"   . "#172E20")
+    ("frende-indicator-removed" . "#371A1E"))
+  "List of Frende colors.
+Each element has the form (NAME . HEX).
+`+N' suffixes indicate a color is lighter.
+`-N' suffixes indicate a color is darker.")
+
+(defmacro frende-with-color-variables (&rest body)
+  "`let' bind all colors defined in `frende-default-colors-alist' around BODY.
+Also bind `class' to ((class color) (min-colors 89))."
+  (declare (indent 0))
+  `(let ((class '((class color) (min-colors 89)))
+         ,@(mapcar (lambda (cons)
+                     (list (intern (car cons)) (cdr cons)))
+                   (append frende-default-colors-alist
+                           frende-override-colors-alist))
+         (z-variable-pitch (if frende-use-variable-pitch
+                               'variable-pitch 'default)))
+     ,@body))
+
+;;; Theme Faces
+(frende-with-color-variables
+  (custom-theme-set-faces
+   'frende
+;;;; Built-in
+;;;;; basic coloring
+   '(button ((t (:underline t))))
+   `(link ((t (:foreground ,rosa :underline t :weight bold))))
+   `(link-visited ((t (:foreground ,rosa-1 :underline t :weight normal))))
+   `(default ((t (:foreground ,svart :background ,krem))))
+   `(cursor ((t (:foreground ,svart :background ,brun))))
+   `(widget-field ((t (:foreground ,svart :background ,krem+2))))
+   `(escape-glyph ((t (:foreground ,rosa :weight bold))))
+   `(fringe ((t (:foreground ,svart :background ,krem))))
+   `(header-line ((t (:foreground ,rosa
+                                  :background ,krem-2
+                                  :box (:line-width -1 :style pressed-button)
+                                  :extend t))))
+   `(highlight ((t (:background ,krem-2))))
+   `(success ((t (:foreground ,grønn))))
+   `(warning ((t (:foreground ,blå))))
+   `(error ((t (:foreground ,fersken))))
+   `(tooltip ((t (:foreground ,svart :background ,krem+1))))
+   `(show-paren-match ((t (:background ,beige))))
+;;;;; line numbers
+   `(line-number
+     ((t (:foreground ,svart :background ,krem+1))))
+   `(line-number-current-line
+     ((t (:foreground ,grønn :background ,beige))))
+;;;;; modeline
+   `(mode-line ((t (:foreground ,svart :background ,krem+1 :box ,svart))))
+   `(mode-line-buffer-id ((t :inherit bold)))
+   `(mode-line-emphasis ((t :inherit bold :foreground ,blå)))
+   `(mode-line-highlight ((t :foreground ,blå :box (:line-width -1 :style pressed-button))))
+   `(mode-line-inactive ((t (:foreground ,svart :background ,krem :box ,svart))))
+;;;;; compilation
+   `(compilation-column-face ((t (:foreground ,rosa))))
+   `(compilation-column-number ((t (:foreground ,rosa))))
+   `(compilation-enter-directory-face ((t (:foreground ,grønn))))
+   `(compilation-error-face ((t (:foreground ,fersken :weight bold :underline t))))
+   `(compilation-face ((t (:foreground ,svart))))
+   `(compilation-info-face ((t (:foreground ,blå))))
+   `(compilation-info ((t (:foreground ,grønn :underline t))))
+   `(compilation-leave-directory-face ((t (:foreground ,grønn))))
+   `(compilation-line-face ((t (:foreground ,rosa))))
+   `(compilation-line-number ((t (:foreground ,rosa))))
+   `(compilation-message-face ((t (:foreground ,blå))))
+   `(compilation-warning-face ((t (:foreground ,beige :weight bold :underline t))))
+   `(compilation-mode-line-exit ((t (:foreground ,grønn+2 :weight bold))))
+   `(compilation-mode-line-fail ((t (:foreground ,rød :weight bold))))
+   `(compilation-mode-line-run ((t (:foreground ,rosa :weight bold))))
+;;;;; completions
+   `(completions-annotations ((t (:foreground ,svart-1))))
+
+;;;;; corfu
+   `(corfu-background ((t (:background ,krem))))
+   `(corfu-current ((t (:background ,grønn+2))))
+   `(corfu-border ((t (:background ,svart))))
+;;;;; customize
+   `(custom-variable-tag ((t (:foreground ,blå :weight bold))))
+   `(custom-group-tag ((t (:foreground ,blå :weight bold :height 1.2))))
+   `(custom-state ((t (:foreground ,grønn+4))))
+;;;;; xref
+   `(xref-match ((t (:foreground ,grønn :background ,beige))))
+   `(xref-line-number ((t :foreground ,svart)))
+;;;;; grep
+   `(grep-context-face ((t (:foreground ,svart))))
+   `(grep-error-face ((t (:foreground ,fersken :weight bold :underline t))))
+   `(grep-hit-face ((t (:foreground ,blå))))
+   `(grep-match-face ((t (:foreground ,beige :weight bold))))
+   `(match ((t (:background ,krem-2 :foreground ,beige :weight bold))))
+;;;;; info
+   `(Info-quoted ((t (:inherit font-lock-constant-face))))
+;;;;; isearch
+   `(isearch ((t (:foreground ,rosa-1 :weight bold :background ,krem))))
+   `(isearch-fail ((t (:foreground ,svart :background ,fersken))))
+   `(lazy-highlight ((t (:foreground ,rosa-1 :weight bold :background ,krem))))
+
+   `(menu ((t (:foreground ,svart :background ,krem))))
+   `(minibuffer-prompt ((t (:foreground ,rosa))))
+;;;;; modeline
+   `(mode-line ((t (:foreground ,svart :background ,krem :box ,svart))))
+   `(mode-line-buffer-id ((t :inherit bold)))
+   `(mode-line-emphasis ((t :inherit bold :foreground ,blå)))
+   `(mode-line-highlight ((t :foreground ,blå :box (:line-width -1 :style pressed-button))))
+   `(mode-line-inactive ((t (:foreground ,svart :background ,svart+1 :box ,svart))))
+
+   `(region ((,class (:background ,beige :extend t))
+             (t :inverse-video t)))
+   `(secondary-selection ((t (:background ,krem+2))))
+   `(trailing-whitespace ((t (:background ,rød))))
+   `(vertical-border ((t (:foreground ,svart))))
+;;;;; font lock
+   `(font-lock-builtin-face ((t (:foreground ,rød))))
+   `(font-lock-comment-face ((t (:foreground ,grå :slant italic))))
+   `(font-lock-comment-delimiter-face ((t (:foreground ,grå :slant italic))))
+   `(font-lock-constant-face ((t (:foreground ,brun))))
+   `(font-lock-doc-face ((t (:foreground ,grå))))
+   `(font-lock-function-name-face ((t (:foreground ,grønn))))
+   `(font-lock-keyword-face ((t (:foreground ,blå))))
+   `(font-lock-negation-char-face ((t (:foreground ,rosa :weight bold))))
+   `(font-lock-preprocessor-face ((t (:foreground ,blå+1))))
+   `(font-lock-regexp-grouping-construct ((t (:foreground ,rosa :weight bold))))
+   `(font-lock-regexp-grouping-backslash ((t (:foreground ,grønn :weight bold))))
+   `(font-lock-string-face ((t (:foreground ,brun))))
+   `(font-lock-type-face ((t (:foreground ,grønn-1 :slant italic))))
+   `(font-lock-variable-name-face ((t (:foreground ,brun))))
+   `(font-lock-warning-face ((t (:foreground ,rosa-1 :weight bold))))
+
+   `(c-annotation-face ((t (:inherit font-lock-constant-face))))
+;;;; icomplete
+   `(icomplete-selected-match ((t (:background ,grønn+4))))
+;;;; Third-party
+;;;;; SLIME
+   `(sly-mrepl-output-face ((t (:foreground ,blå))))
+   `(slime-repl-inputed-output-face ((t (:foreground ,grønn))))
+   `(slime-error-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,fersken)))
+      (t
+       (:underline ,rød))))
+   `(slime-warning-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,blå)))
+      (t
+       (:underline ,beige))))
+   `(slime-style-warning-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,rosa)))
+      (t
+       (:underline ,rosa))))
+   `(slime-note-face
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,grønn)))
+      (t
+       (:underline ,grønn))))
+   `(slime-highlight-face ((t (:inherit highlight))))
+;;;;; diff
+   `(diff-added             ((t (:background ,grønn+4))))
+   `(diff-changed           ((t (:background ,grønn+1))))
+   `(diff-removed           ((t (:background ,rosa))))
+   `(diff-refine-added      ((t (:foreground ,blå))))
+   `(diff-refine-changed    ((t (:foreground ,grønn+2))))
+   `(diff-refine-removed    ((t (:foreground ,rød+1))))
+   `(diff-indicator-added   ((t (:background ,grønn+4))))
+   `(diff-indicator-removed ((t (:background ,rosa))))
+   `(diff-header ((,class (:foreground ,svart ::background ,krem))
+                  (t (:background ,svart :foreground ,krem))))
+   `(diff-file-header
+     ((,class (:background ,krem+1 :foreground ,svart :weight bold))
+      (t (:background ,svart :foreground ,krem :weight bold))))
+;;;;; ediff
+   `(ediff-current-diff-A ((t (:foreground ,svart :background ,rød-2))))
+   `(ediff-current-diff-Ancestor ((t (:foreground ,svart :background ,rød-2))))
+   `(ediff-current-diff-B ((t (:foreground ,svart :background ,grønn-2))))
+   `(ediff-current-diff-C ((t (:foreground ,svart :background ,blå-3))))
+   `(ediff-even-diff-A ((t (:background ,krem+1))))
+   `(ediff-even-diff-Ancestor ((t (:background ,krem+1))))
+   `(ediff-even-diff-B ((t (:background ,krem+1))))
+   `(ediff-even-diff-C ((t (:background ,krem+1))))
+   `(ediff-fine-diff-A ((t (:foreground ,svart :background ,rød-2 :weight bold))))
+   `(ediff-fine-diff-Ancestor ((t (:foreground ,svart :background ,rød-2 weight bold))))
+   `(ediff-fine-diff-B ((t (:foreground ,svart :background ,grønn :weight bold))))
+   `(ediff-fine-diff-C ((t (:foreground ,svart :background ,blå-3 :weight bold ))))
+   `(ediff-odd-diff-A ((t (:background ,krem+2))))
+   `(ediff-odd-diff-Ancestor ((t (:background ,krem+2))))
+   `(ediff-odd-diff-B ((t (:background ,krem+2))))
+   `(ediff-odd-diff-C ((t (:background ,krem+2))))
+;;;;; erc
+   `(erc-action-face ((t (:inherit erc-default-face))))
+   `(erc-bold-face ((t (:weight bold))))
+   `(erc-current-nick-face ((t (:foreground ,blå :weight bold))))
+   `(erc-dangerous-host-face ((t (:inherit font-lock-warning-face))))
+   `(erc-default-face ((t (:foreground ,svart))))
+   `(erc-direct-msg-face ((t (:inherit erc-default-face))))
+   `(erc-error-face ((t (:inherit font-lock-warning-face))))
+   `(erc-fool-face ((t (:inherit erc-default-face))))
+   `(erc-highlight-face ((t (:inherit hover-highlight))))
+   `(erc-input-face ((t (:foreground ,grønn))))
+   `(erc-keyword-face ((t (:foreground ,blå :weight bold))))
+   `(erc-nick-default-face ((t (:foreground ,cyan :weight bold))))
+   `(erc-my-nick-face ((t (:foreground ,rød :weight bold))))
+   `(erc-nick-msg-face ((t (:inherit erc-default-face))))
+   `(erc-notice-face ((t (:foreground ,grå))))
+   `(erc-pal-face ((t (:foreground ,beige :weight bold))))
+   `(erc-prompt-face ((t (:foreground ,blå :background ,krem :weight bold))))
+   `(erc-timestamp-face ((t (:foreground ,grønn))))
+   `(erc-underline-face ((t (:underline t))))
+;;;;; eshell
+   `(eshell-prompt ((t (:foreground ,grønn :weight bold))))
+   `(eshell-ls-archive ((t (:foreground ,rød-1 :weight bold))))
+   `(eshell-ls-backup ((t (:inherit font-lock-comment-face))))
+   `(eshell-ls-clutter ((t (:inherit font-lock-comment-face))))
+   `(eshell-ls-directory ((t (:foreground ,blå+1 :weight bold))))
+   `(eshell-ls-executable ((t (:foreground ,rød+1 :weight bold))))
+   `(eshell-ls-unreadable ((t (:foreground ,svart))))
+   `(eshell-ls-missing ((t (:inherit font-lock-warning-face))))
+   `(eshell-ls-product ((t (:inherit font-lock-doc-face))))
+   `(eshell-ls-special ((t (:foreground ,rosa :weight bold))))
+   `(eshell-ls-symlink ((t (:foreground ,cyan :weight bold))))
+;;;;; flymake
+   `(flymake-error
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,fersken)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,rød :weight bold :underline t))))
+   `(flymake-warning
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,blå)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,blå :weight bold :underline t))))
+   `(flymake-note
+     ((((supports :underline (:style wave)))
+       (:underline (:style wave :color ,grønn)
+                   :inherit unspecified :foreground unspecified :background unspecified))
+      (t (:foreground ,grønn :weight bold :underline t))))
+;;;;; message-mode
+   `(message-cited-text ((t (:inherit font-lock-comment-face))))
+   `(message-header-name ((t (:foreground ,grønn+1))))
+   `(message-header-other ((t (:foreground ,grønn))))
+   `(message-header-to ((t (:foreground ,rosa :weight bold))))
+   `(message-header-cc ((t (:foreground ,rosa :weight bold))))
+   `(message-header-newsgroups ((t (:foreground ,rosa :weight bold))))
+   `(message-header-subject ((t (:foreground ,beige :weight bold))))
+   `(message-header-xheader ((t (:foreground ,grønn))))
+   `(message-mml ((t (:foreground ,rosa :weight bold))))
+   `(message-separator ((t (:inherit font-lock-comment-face))))
+;;;;; notmuch
+   `(notmuch-crypto-decryption ((t (:foreground ,krem :background ,magenta))))
+   `(notmuch-crypto-part-header ((t (:foreground ,blå+1))))
+   `(notmuch-crypto-signature-bad ((t (:foreground ,krem :background ,rød))))
+   `(notmuch-crypto-signature-good ((t (:foreground ,krem :background ,grønn+1))))
+   `(notmuch-crypto-signature-good-key ((t (:foreground ,krem :background ,beige))))
+   `(notmuch-crypto-signature-unknown ((t (:foreground ,krem :background ,rød))))
+   `(notmuch-hello-logo-background ((t (:background ,krem+2))))
+   `(notmuch-message-summary-face ((t (:background ,krem-1))))
+   `(notmuch-search-flagged-face ((t (:foreground ,blå+1))))
+   `(notmuch-search-non-matching-authors ((t (:foreground ,svart-1))))
+   `(notmuch-tag-added ((t (:underline ,grønn+1))))
+   `(notmuch-tag-deleted ((t (:strike-through ,rød))))
+   `(notmuch-tag-face ((t (:foreground ,grønn+1))))
+   `(notmuch-tag-flagged ((t (:foreground ,blå+1))))
+   `(notmuch-tag-unread ((t (:foreground ,rød))))
+   `(notmuch-tree-match-author-face ((t (:foreground ,grønn+1))))
+   `(notmuch-tree-match-tag-face ((t (:foreground ,grønn+1))))
+;;;;; markdown
+   `(markdown-code-face
+     ((t (:foreground ,grønn))))
+;;;;; whitespace-mode
+   `(whitespace-space ((t (:background ,krem+1 :foreground ,krem+1))))
+   `(whitespace-hspace ((t (:background ,krem+1 :foreground ,krem+1))))
+   `(whitespace-tab ((t (:background ,rød-1))))
+   `(whitespace-newline ((t (:foreground ,krem+1))))
+   `(whitespace-trailing ((t (:background ,rød))))
+   `(whitespace-line ((t (:background ,krem :foreground ,magenta))))
+   `(whitespace-space-before-tab ((t (:background ,beige :foreground ,beige))))
+   `(whitespace-indentation ((t (:background ,rosa :foreground ,rød))))
+   `(whitespace-empty ((t (:background ,rosa))))
+   `(whitespace-space-after-tab ((t (:background ,rosa :foreground ,rød))))))
+
+;;; Theme Variables
+(frende-with-color-variables
+  (custom-theme-set-variables
+   'frende
+;;;;; ansi-color
+   `(ansi-color-names-vector [,krem ,rød ,grønn ,rosa ,blå ,magenta ,cyan ,svart])
+;;;;; company-quickhelp
+   `(company-quickhelp-color-background ,krem+1)
+   `(company-quickhelp-color-foreground ,svart)
+;;;;; nrepl-client
+   `(nrepl-message-colors
+     '(,rød ,beige ,rosa ,grønn ,grønn+4
+            ,cyan ,blå+1 ,magenta))
+;;;;; vc-annotate
+   `(vc-annotate-color-map
+     '(( 20. . ,rød-1)
+       ( 40. . ,rød)
+       ( 60. . ,beige)
+       ( 80. . ,rosa-1)
+       (100. . ,rød-2)
+       (120. . ,rosa)
+       (140. . ,grønn-2)
+       (160. . ,grønn)
+       (180. . ,grønn+1)
+       (200. . ,grønn+2)
+       (220. . ,grønn+3)
+       (240. . ,grønn+4)
+       (260. . ,cyan)
+       (280. . ,blå-2)
+       (300. . ,blå-1)
+       (320. . ,blå)
+       (340. . ,blå+1)
+       (360. . ,magenta)))
+   `(vc-annotate-very-old-color ,magenta)
+   `(vc-annotate-background ,krem-2)
+   ))
+
+;;; Footer
+
+;;;###autoload
+(when load-file-name
+  (let ((dir (file-name-directory load-file-name)))
+    (unless (equal dir (expand-file-name "themes/" data-directory))
+      (add-to-list 'custom-theme-load-path dir))))
+
+(provide-theme 'frende)
+
+;;; frende-theme.el ends here

          
M emacs.d/lisp/settings.el +49 -4
@@ 7,12 7,14 @@ 
          ("C-x ~"   . 'cd)
          ("C-x C-b" . 'display-buffer)
          ("C-c v b" . 'view-this-buffer)
+         ("C-w"     . 'backward-kill-word)
+         ("C-x C-k" . 'kill-region)
          ("C-z"     . 'repeat)
          ("C-."     . 'imenu)
          ("C-c C-r" . 'query-replace-regexp)
          ("M-'"     . 'bookmark-map)
          ("M-' M-'" . 'point-to-register)
-         ("M-@"   . 'jump-to-register)
+         ("M-@"     . 'jump-to-register)
          ("M-j"     . 'join-line)
          ("M-o"     . 'other-window)
          ("C-o"     . 'open-line-above)

          
@@ 58,12 60,23 @@ 
   :bind ((:map emacs-lisp-mode-map
                ("C-c C-k" . #'eval-buffer))))
 
+(use-package isearch
+  :ensure nil
+  :config
+  (setq isearch-lazy-count t))
+
+(use-package vc
+  :config
+  (setq vc-hg-log-graph t))
+
 (use-package icomplete
   :ensure nil
   :config
   (setq completion-styles '(flex basic)
-        completion-ignore-case t
+        read-file-name-completion-ignore-case t
+        read-buffer-completion-ignore-case t
         completions-detailed t
+        completion-cycl-threshold 3
         icomplete-show-matches-on-no-input t
         icomplete-compute-delay 0.0)
   (fido-mode t)

          
@@ 124,7 137,7 @@ 
        :nick "theothornhill"
        :password erc-pass))
 
-(setq erc-autojoin-channels-alist '(("freenode.net" "#mercurial" "#sr.ht" "#lisp" "#dpans")))
+(setq erc-autojoin-channels-alist '(("libera.chat" "#mercurial" "#sr.ht" "#lisp" "#dpans #commonlisp")))
 
 (use-package xref
   :ensure nil

          
@@ 268,8 281,10 @@ 
 ;;; Third party packages
 
 (use-package corfu
+  :init
+  (corfu-global-mode t)
   :config
-  (corfu-global-mode t))
+  (setq corfu-min-width 50))
 
 (use-package paredit
   :hook ((scheme-mode

          
@@ 324,6 339,36 @@ 
   (setq inferior-lisp-program "sbcl"
         sly-symbol-completion-mode nil))
 
+;; Ligatures
+(let ((alist `((?! . ,(regexp-opt '("!!" "!=" "!==")))
+               (?# . ,(regexp-opt '("##" "###" "####" "#(" "#?" "#[" "#_" "#_(" "#{")))
+               (?$ . ,(regexp-opt '("$>")))
+               (?% . ,(regexp-opt '("%%")))
+               (?& . ,(regexp-opt '("&&")))
+               (?* . ,(regexp-opt '("*" "**" "***" "**/" "*/" "*>")))
+               (?+ . ,(regexp-opt '("+" "++" "+++" "+>")))
+               (?- . ,(regexp-opt '("--" "---" "-->" "-<" "-<<" "->" "->>" "-}" "-~")))
+               (?. . ,(regexp-opt '(".-" ".." "..." "..<" ".=")))
+               (?/ . ,(regexp-opt '("/*" "/**" "//" "///" "/=" "/==" "/>")))
+               (?: . ,(regexp-opt '(":" "::" ":::" ":=")))
+               (?\; . ,(regexp-opt '(";;")))
+               (?< . ,(regexp-opt '("<!--" "<$" "<$>" "<*" "<*>" "<+" "<+>" "<-" "<--" "<->" "</" "</>" "<<" "<<-" "<<<" "<<=" "<=" "<=" "<=<" "<==" "<=>" "<>" "<|" "<|>" "<~" "<~~")))
+               (?= . ,(regexp-opt '("=/=" "=:=" "=<<" "==" "===" "==>" "=>" "=>>")))
+               (?> . ,(regexp-opt '(">-" ">=" ">=>" ">>" ">>-" ">>=" ">>>")))
+               (?= . ,(regexp-opt '("?=")))
+               (?? . ,(regexp-opt '("??")))
+               (?\[ . ,(regexp-opt '("[]")))
+               (?\\ . ,(regexp-opt '("\\\\" "\\\\\\")))
+               (?^ . ,(regexp-opt '("^=")))
+               (?w . ,(regexp-opt '("www")))
+               (?x . ,(regexp-opt '("x")))
+               (?{ . ,(regexp-opt '("{-")))
+               (?| . ,(regexp-opt '("|=" "|>" "||" "||=")))
+               (?~ . ,(regexp-opt '("~-" "~=" "~>" "~@" "~~" "~~>"))))))
+  (dolist (char-regexp alist)
+    (set-char-table-range composition-function-table (car char-regexp)
+                          `([,(cdr char-regexp) 0 font-shape-gstring]))))
+
 (provide 'settings)
 
 ;;; settings.el ends here

          
A => emacs.d/snippets/elm-mode/import +5 -0
@@ 0,0 1,5 @@ 
+# -*- mode: snippet -*-
+# name: import
+# key: imp
+# --
+import $1 as $2
  No newline at end of file

          
A => emacs.d/snippets/elm-mode/mpd +5 -0
@@ 0,0 1,5 @@ 
+# -*- mode: snippet -*-
+# name: Multi Product Discount
+# key: mpd
+# --
+MultiProductDiscount
  No newline at end of file