about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--+bindings.el19
-rw-r--r--config.el286
-rw-r--r--init.el193
-rw-r--r--packages.el10
-rw-r--r--snippets/haskell-mode/annotation5
-rw-r--r--snippets/haskell-mode/import-i4
-rw-r--r--snippets/haskell-mode/inl6
-rw-r--r--snippets/haskell-mode/inline5
-rw-r--r--snippets/haskell-mode/language pragma6
-rw-r--r--snippets/haskell-mode/shut up, hlint6
-rw-r--r--snippets/js2-mode/action-type4
-rw-r--r--snippets/js2-mode/describe6
-rw-r--r--snippets/js2-mode/expect5
-rw-r--r--snippets/js2-mode/header6
-rw-r--r--snippets/js2-mode/it7
-rw-r--r--snippets/js2-mode/it-pending5
-rw-r--r--snippets/js2-mode/module12
-rw-r--r--snippets/js2-mode/record7
-rw-r--r--snippets/js2-mode/test7
19 files changed, 345 insertions, 254 deletions
diff --git a/+bindings.el b/+bindings.el
index bfb40424b3..eb7b14365b 100644
--- a/+bindings.el
+++ b/+bindings.el
@@ -1022,17 +1022,20 @@ private/hlissner/snippets."
 
 (map!
   (:map haskell-mode-map
-     :n "K"     'lsp-info-under-point
-     :n "g d"   'lsp-ui-peek-find-definitions
-     :n "g r"   'lsp-ui-peek-find-references
-     ;; :n "g SPC" 'intero-repl-load
-     :n "g \\"  '+haskell/repl
-     ;; :n "g y"   'intero-type-at
+     ;; :n "K"     'lsp-info-under-point
+     ;; :n "g d"   'lsp-ui-peek-find-definitions
+     ;; :n "g r"   'lsp-ui-peek-find-references
+     ;; :n "g \\"  '+haskell/repl
+     :n "K"     'intero-info
+     :n "g d"   'intero-goto-definition
+     :n "g SPC" 'intero-repl-load
+     :n "g \\"  'intero-repl
+     :n "g y"   'intero-type-at
      ;; :n "g RET" 'grfn/run-sputnik-test-for-file
 
      (:localleader
-       :desc "Apply action"  :n "a" 'lsp-execute-code-action
-       :desc "Rename symbol" :n "r" 'lsp-rename))
+       :desc "Apply action"  :n "e" 'intero-repl-eval-region
+       :desc "Rename symbol" :n "r" 'intero-apply-suggestions))
 
   (:after agda2-mode
     (:map agda2-mode-map
diff --git a/config.el b/config.el
index 1646314ab7..ec91438d39 100644
--- a/config.el
+++ b/config.el
@@ -1,5 +1,195 @@
 ;;; private/grfn/config.el -*- lexical-binding: t; -*-
 
+;; I've swapped these keys on my keyboard
+(setq x-super-keysym 'alt
+      x-alt-keysym   'meta)
+
+(setq user-mail-address "root@gws.fyi"
+      user-full-name    "Griffin Smith")
+
+; (def-package-hook! doom-themes :disable)
+
+(after! rust
+  (setq rust-format-on-save t))
+
+; (defconst rust-src-path
+;   (-> "/Users/griffin/.cargo/bin/rustc --print sysroot"
+;       shell-command-to-string
+;       string-trim
+;       (concat "/lib/rustlib/src/rust/src")))
+;
+; (setenv "RUST_SRC_PATH" rust-src-path)
+;
+; (after! racer
+;   (setq racer-rust-src-path rust-src-path))
+;
+(add-hook! rust-mode
+  (flycheck-rust-setup)
+  (flycheck-mode)
+  (racer-mode)
+  (cargo-minor-mode))
+
+(add-hook! elixir-mode
+  (require 'flycheck-credo)
+  (setq flycheck-elixir-credo-strict t)
+  (flycheck-credo-setup)
+
+  (require 'flycheck-mix) (flycheck-mix-setup)
+
+  (require 'flycheck-dialyxir) (flycheck-dialyxir-setup)
+
+  (flycheck-mode))
+
+(setq exec-path (append exec-path '("/Users/griffin/.cargo/bin")))
+
+(after! cargo
+  (setq cargo-process--custom-path-to-bin "/Users/griffin/.cargo/bin/cargo"))
+
+(setq +solarized-s-base03    "#002b36"
+      +solarized-s-base02    "#073642"
+      ;; emphasized content
+      +solarized-s-base01    "#586e75"
+      ;; primary content
+      +solarized-s-base00    "#657b83"
+      +solarized-s-base0     "#839496"
+      ;; comments
+      +solarized-s-base1     "#93a1a1"
+      ;; background highlight light
+      +solarized-s-base2     "#eee8d5"
+      ;; background light
+      +solarized-s-base3     "#fdf6e3"
+
+      ;; Solarized accented colors
+      +solarized-yellow    "#b58900"
+      +solarized-orange    "#cb4b16"
+      +solarized-red       "#dc322f"
+      +solarized-magenta   "#d33682"
+      +solarized-violet    "#6c71c4"
+      +solarized-blue      "#268bd2"
+      +solarized-cyan      "#2aa198"
+      +solarized-green     "#859900"
+
+      ;; Darker and lighter accented colors
+      ;; Only use these in exceptional circumstances!
+      +solarized-yellow-d  "#7B6000"
+      +solarized-yellow-l  "#DEB542"
+      +solarized-orange-d  "#8B2C02"
+      +solarized-orange-l  "#F2804F"
+      +solarized-red-d     "#990A1B"
+      +solarized-red-l     "#FF6E64"
+      +solarized-magenta-d "#93115C"
+      +solarized-magenta-l "#F771AC"
+      +solarized-violet-d  "#3F4D91"
+      +solarized-violet-l  "#9EA0E5"
+      +solarized-blue-d    "#00629D"
+      +solarized-blue-l    "#69B7F0"
+      +solarized-cyan-d    "#00736F"
+      +solarized-cyan-l    "#69CABF"
+      +solarized-green-d   "#546E00"
+      +solarized-green-l "#B4C342")
+
+(defadvice load-theme (after theme-set-overrides activate)
+  (dolist (theme-settings theme-overrides)
+    (let ((theme (car theme-settings))
+          (faces (cadr theme-settings)))
+      (if (member theme custom-enabled-themes)
+          (dolist (face faces)
+            (custom-theme-set-faces theme face))))))
+
+(defcustom theme-overrides nil
+  "Association list of override faces to set for different custom themes.")
+
+(defun alist-set (alist-symbol key value)
+  "Set VALUE of a KEY in ALIST-SYMBOL."
+  (set alist-symbol (cons (list key value) (assq-delete-all key (eval alist-symbol)))))
+
+(alist-set 'theme-overrides 'grfn-solarized-light
+           `((font-lock-doc-face ((t (:foreground ,+solarized-s-base1))))
+             (font-lock-preprocessor-face ((t (:foreground ,+solarized-red))))
+             (font-lock-keyword-face ((t (:foreground ,+solarized-green))))
+
+             (elixir-attribute-face ((t (:foreground ,+solarized-blue))))
+             (elixir-atom-face ((t (:foreground ,+solarized-cyan))))
+             (linum ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
+             (line-number ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
+
+             (haskell-operator-face ((t (:foreground ,+solarized-green))))
+             (haskell-keyword-face ((t (:foreground ,+solarized-cyan))))))
+
+(setq solarized-use-variable-pitch nil
+      solarized-scale-org-headlines nil)
+
+(add-to-list 'custom-theme-load-path "~/.doom.d/themes")
+(load-theme 'grfn-solarized-light t)
+
+(defface haskell-import-face `((t (:foreground ,+solarized-magenta))) "")
+
+(setq doom-theme 'grfn-solarized-light)
+; (setq doom-theme 'doom-solarized-light)
+
+(add-hook! doom-post-init
+  (set-face-attribute 'bold nil :weight 'ultra-light)
+  (set-face-bold-p 'bold nil))
+
+(defun rx-words (&rest words)
+  (rx-to-string
+   `(and symbol-start (group (or ,@words)) symbol-end)))
+
+(font-lock-add-keywords
+ 'elixir-mode
+ `((,(rx-words "def"
+               "defp"
+               "test"
+               "describe"
+               "property"
+               "defrecord"
+               "defmodule"
+               "defstruct"
+               "defdelegate"
+               "defprotocol"
+               "defimpl"
+               "use"
+               "import"
+               "alias"
+               "require"
+               "assert"
+               "refute"
+               "assert_raise")
+    .
+    'font-lock-preprocessor-face)))
+
+(font-lock-add-keywords
+ 'elixir-mode
+ `((,(rx-words "def"
+               "defp"
+               "test"
+               "describe"
+               "property"
+               "defrecord"
+               "defmodule"
+               "defstruct"
+               "defdelegate"
+               "use"
+               "import"
+               "alias"
+               "require"
+               "assert"
+               "refute"
+               "assert_raise")
+    .
+    'font-lock-preprocessor-face)))
+
+(font-lock-add-keywords
+ 'haskell-mode
+ `((,(rx-words "import") . 'haskell-import-face)))
+
+;; (font-lock-add-keywords
+;;  'haskell-mode
+;;  `((,(rx "-- |") . 'haskell-keyword-face)))
+
+
+(load-file (let ((coding-system-for-read 'utf-8))
+                (shell-command-to-string "agda-mode locate")))
 
 (defvar +grfn-dir (file-name-directory load-file-name))
 (defvar +grfn-snippets-dir (expand-file-name "snippets/" +grfn-dir))
@@ -85,9 +275,6 @@
 
 (def-package! org-clubhouse)
 
-(setq solarized-use-variable-pitch nil
-      solarized-scale-org-headlines nil)
-
 ; (require 'doom-themes)
 
 ;; Should really figure out which of these is correct, eventually
@@ -248,11 +435,11 @@
 
 
 (add-hook! haskell-mode
-  ;; (intero-mode)
-  (lsp-mode)
-  ;; (flycheck-add-next-checker
-  ;;  'intero
-  ;;  'haskell-hlint)
+  (intero-mode)
+  ;; (lsp-mode)
+  (flycheck-add-next-checker
+   'intero
+   'haskell-hlint)
   (set-fill-column 80)
   (setq evil-shift-width 2))
 
@@ -451,44 +638,47 @@
 ;;                  (with-selected-window window
 ;;                    (split-window-below))))))))
 
-(def-package! lsp-mode
-  :after (:any haskell-mode)
-  :config
-  (lsp-mode)
-  (setq lsp-project-whitelist '("^/home/griffin/code/urb/grid/$")
-        lsp-response-timeout 60)
-  :hook
-  (haskell-mode . lsp-mode))
-
-(def-package! lsp-ui
-  :after lsp-mode
-  :config
-  (setq lsp-ui-flycheck-enable t)
-  (setq imenu-auto-rescan t)
-  (set-face-background 'lsp-ui-doc-background +solarized-s-base2)
-  (set-face-background 'lsp-face-highlight-read +solarized-s-base2)
-  (set-face-background 'lsp-face-highlight-write +solarized-s-base2)
-  :hook
-  (lsp-mode . lsp-ui-mode)
-  (lsp-ui-mode . flycheck-mode))
-
-(def-package! company-lsp
-  :after (lsp-mode lsp-ui)
-  :config
-  (setq company-backends '(company-lsp))
-  (setq company-lsp-async t))
-
-(def-package! lsp-haskell
-  :after (lsp-mode lsp-ui haskell-mode)
-  :hook
-  (haskell-mode . lsp-haskell-enable)
-  :config
-  (setq lsp-haskell-process-path-hie "/home/griffin/.local/bin/hie-wrapper"))
-
-(def-package! lsp-imenu
-  :after (lsp-mode lsp-ui)
-  :hook
-  (lsp-after-open . lsp-enable-imenu))
+;; (def-package! lsp-mode
+;;   :after (:any haskell-mode)
+;;   :config
+;;   (lsp-mode)
+;;   (setq lsp-project-whitelist '("^/home/griffin/code/urb/grid/$")
+;;         lsp-response-timeout 60)
+;;   :hook
+;;   (haskell-mode . lsp-mode))
+
+;; (def-package! lsp-ui
+;;   :after lsp-mode
+;;   :config
+;;   (setq lsp-ui-flycheck-enable t)
+;;   (setq imenu-auto-rescan t)
+;;   (set-face-background 'lsp-ui-doc-background +solarized-s-base2)
+;;   (set-face-background 'lsp-face-highlight-read +solarized-s-base2)
+;;   (set-face-background 'lsp-face-highlight-write +solarized-s-base2)
+;;   :hook
+;;   (lsp-mode . lsp-ui-mode)
+;;   (lsp-ui-mode . flycheck-mode))
+
+;; (def-package! company-lsp
+;;   :after (lsp-mode lsp-ui)
+;;   :config
+;;   (setq company-backends '(company-lsp))
+;;   (setq company-lsp-async t))
+
+;; (def-package! lsp-haskell
+;;   :after (lsp-mode lsp-ui haskell-mode)
+;;   :hook
+;;   (haskell-mode . lsp-haskell-enable)
+;;   :config
+;;   (setq lsp-haskell-process-path-hie "/home/griffin/.local/bin/hie-wrapper"
+;;         lsp-haskell-process-args-hie
+;;           '("-d" "-l" "/tmp/hie.log" "+RTS" "-M4G" "-H1G" "-K4G" "-A16M" "-RTS"
+;;             "--lsp")))
+
+;; (def-package! lsp-imenu
+;;   :after (lsp-mode lsp-ui)
+;;   :hook
+;;   (lsp-after-open . lsp-enable-imenu))
 
 (def-package! evil-magit
   :after (magit))
@@ -548,7 +738,3 @@
    `(agda2-highlight-termination-problem-face ((t (:background ,orange :foreground ,base03))))
    `(agda2-highlight-incomplete-pattern-face ((t (:background ,orange :foreground ,base03))))
    `(agda2-highlight-typechecks-face ((t (:background ,cyan :foreground ,base03))))))
-
-;; (with-eval-after-load 'intero
-;;   (setq intero-package-version "0.1.31"))
-
diff --git a/init.el b/init.el
index 2948da3333..e984b50ef4 100644
--- a/init.el
+++ b/init.el
@@ -91,8 +91,8 @@
        emacs-lisp        ; drown in parentheses
       ;ess               ; emacs speaks statistics
       ;go                ; the hipster dialect
-      ;(haskell +intero) ; a language that's lazier than I am
-       haskell           ; a language that's lazier than I am
+      (haskell +intero) ; a language that's lazier than I am
+       ;; haskell           ; a language that's lazier than I am
       ;hy                ; readability of scheme w/ speed of python
       ;(java +meghanada) ; the poster child for carpal tunnel syndrome
        javascript        ; all(hope(abandon(ye(who(enter(here))))))
@@ -152,192 +152,3 @@
        ;; and additional ex commands for evil-mode. Use it as a reference for
        ;; your own modules.
        (default +bindings +snippets +evil-commands))
-
-
-;; I've swapped these keys on my keyboard
-(setq x-super-keysym 'alt
-      x-alt-keysym   'meta)
-
-(setq user-mail-address "root@gws.fyi"
-      user-full-name    "Griffin Smith")
-
-; (def-package-hook! doom-themes :disable)
-
-(after! rust
-  (setq rust-format-on-save t))
-
-; (defconst rust-src-path
-;   (-> "/Users/griffin/.cargo/bin/rustc --print sysroot"
-;       shell-command-to-string
-;       string-trim
-;       (concat "/lib/rustlib/src/rust/src")))
-;
-; (setenv "RUST_SRC_PATH" rust-src-path)
-;
-; (after! racer
-;   (setq racer-rust-src-path rust-src-path))
-;
-(add-hook! rust-mode
-  (flycheck-rust-setup)
-  (flycheck-mode)
-  (racer-mode)
-  (cargo-minor-mode))
-
-(add-hook! elixir-mode
-  (require 'flycheck-credo)
-  (setq flycheck-elixir-credo-strict t)
-  (flycheck-credo-setup)
-
-  (require 'flycheck-mix) (flycheck-mix-setup)
-
-  (require 'flycheck-dialyxir) (flycheck-dialyxir-setup)
-
-  (flycheck-mode))
-
-(setq exec-path (append exec-path '("/Users/griffin/.cargo/bin")))
-
-(after! cargo
-  (setq cargo-process--custom-path-to-bin "/Users/griffin/.cargo/bin/cargo"))
-
-(setq +solarized-s-base03    "#002b36"
-      +solarized-s-base02    "#073642"
-      ;; emphasized content
-      +solarized-s-base01    "#586e75"
-      ;; primary content
-      +solarized-s-base00    "#657b83"
-      +solarized-s-base0     "#839496"
-      ;; comments
-      +solarized-s-base1     "#93a1a1"
-      ;; background highlight light
-      +solarized-s-base2     "#eee8d5"
-      ;; background light
-      +solarized-s-base3     "#fdf6e3"
-
-      ;; Solarized accented colors
-      +solarized-yellow    "#b58900"
-      +solarized-orange    "#cb4b16"
-      +solarized-red       "#dc322f"
-      +solarized-magenta   "#d33682"
-      +solarized-violet    "#6c71c4"
-      +solarized-blue      "#268bd2"
-      +solarized-cyan      "#2aa198"
-      +solarized-green     "#859900"
-
-      ;; Darker and lighter accented colors
-      ;; Only use these in exceptional circumstances!
-      +solarized-yellow-d  "#7B6000"
-      +solarized-yellow-l  "#DEB542"
-      +solarized-orange-d  "#8B2C02"
-      +solarized-orange-l  "#F2804F"
-      +solarized-red-d     "#990A1B"
-      +solarized-red-l     "#FF6E64"
-      +solarized-magenta-d "#93115C"
-      +solarized-magenta-l "#F771AC"
-      +solarized-violet-d  "#3F4D91"
-      +solarized-violet-l  "#9EA0E5"
-      +solarized-blue-d    "#00629D"
-      +solarized-blue-l    "#69B7F0"
-      +solarized-cyan-d    "#00736F"
-      +solarized-cyan-l    "#69CABF"
-      +solarized-green-d   "#546E00"
-      +solarized-green-l "#B4C342")
-
-(defadvice load-theme (after theme-set-overrides activate)
-  (dolist (theme-settings theme-overrides)
-    (let ((theme (car theme-settings))
-          (faces (cadr theme-settings)))
-      (if (member theme custom-enabled-themes)
-          (dolist (face faces)
-            (custom-theme-set-faces theme face))))))
-
-(defcustom theme-overrides nil
-  "Association list of override faces to set for different custom themes.")
-
-(defun alist-set (alist-symbol key value)
-  "Set VALUE of a KEY in ALIST-SYMBOL."
-  (set alist-symbol (cons (list key value) (assq-delete-all key (eval alist-symbol)))))
-
-(alist-set 'theme-overrides 'grfn-solarized-light
-           `((font-lock-doc-face ((t (:foreground ,+solarized-s-base1))))
-             (font-lock-preprocessor-face ((t (:foreground ,+solarized-red))))
-             (font-lock-keyword-face ((t (:foreground ,+solarized-green))))
-
-             (elixir-attribute-face ((t (:foreground ,+solarized-blue))))
-             (elixir-atom-face ((t (:foreground ,+solarized-cyan))))
-             (linum ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-             (line-number ((t (:background ,+solarized-s-base2 :foreground ,+solarized-s-base1))))
-
-             (haskell-operator-face ((t (:foreground ,+solarized-green))))
-             (haskell-keyword-face ((t (:foreground ,+solarized-cyan))))))
-
-(add-to-list 'custom-theme-load-path "~/.doom.d/themes")
-(load-theme 'grfn-solarized-light t)
-
-(defface haskell-import-face `((t (:foreground ,+solarized-magenta))) "")
-
-(setq doom-theme 'grfn-solarized-light)
-; (setq doom-theme 'doom-solarized-light)
-
-(add-hook! doom-post-init
-  (set-face-attribute 'bold nil :weight 'ultra-light)
-  (set-face-bold-p 'bold nil))
-
-(defun rx-words (&rest words)
-  (rx-to-string
-   `(and symbol-start (group (or ,@words)) symbol-end)))
-
-(font-lock-add-keywords
- 'elixir-mode
- `((,(rx-words "def"
-               "defp"
-               "test"
-               "describe"
-               "property"
-               "defrecord"
-               "defmodule"
-               "defstruct"
-               "defdelegate"
-               "defprotocol"
-               "defimpl"
-               "use"
-               "import"
-               "alias"
-               "require"
-               "assert"
-               "refute"
-               "assert_raise")
-    .
-    'font-lock-preprocessor-face)))
-
-(font-lock-add-keywords
- 'elixir-mode
- `((,(rx-words "def"
-               "defp"
-               "test"
-               "describe"
-               "property"
-               "defrecord"
-               "defmodule"
-               "defstruct"
-               "defdelegate"
-               "use"
-               "import"
-               "alias"
-               "require"
-               "assert"
-               "refute"
-               "assert_raise")
-    .
-    'font-lock-preprocessor-face)))
-
-(font-lock-add-keywords
- 'haskell-mode
- `((,(rx-words "import") . 'haskell-import-face)))
-
-;; (font-lock-add-keywords
-;;  'haskell-mode
-;;  `((,(rx "-- |") . 'haskell-keyword-face)))
-
-
-(load-file (let ((coding-system-for-read 'utf-8))
-                (shell-command-to-string "agda-mode locate")))
diff --git a/packages.el b/packages.el
index 2264afa9c9..75d28d6850 100644
--- a/packages.el
+++ b/packages.el
@@ -68,8 +68,8 @@
 (package! graphql-mode)
 
 ;; Haskell
-(package! lsp-mode)
-(package! lsp-ui)
-(package! lsp-haskell)
-(package! company-lsp)
-(package! lsp-imenu)
+;; (package! lsp-mode)
+;; (package! lsp-ui)
+;; (package! lsp-haskell)
+;; (package! company-lsp)
+;; (package! lsp-imenu)
diff --git a/snippets/haskell-mode/annotation b/snippets/haskell-mode/annotation
new file mode 100644
index 0000000000..8a2854d759
--- /dev/null
+++ b/snippets/haskell-mode/annotation
@@ -0,0 +1,5 @@
+# key: ann
+# name: annotation
+# expand-env: ((yas-indent-line 'fixed))
+# --
+{-# ANN ${1:module} ("${2:HLint: ignore ${3:Reduce duplication}}" :: String) #-}
\ No newline at end of file
diff --git a/snippets/haskell-mode/import-i b/snippets/haskell-mode/import-i
new file mode 100644
index 0000000000..4a7fca2c2f
--- /dev/null
+++ b/snippets/haskell-mode/import-i
@@ -0,0 +1,4 @@
+# key: i
+# name: import-i
+# --
+import           ${1:Prelude}
\ No newline at end of file
diff --git a/snippets/haskell-mode/inl b/snippets/haskell-mode/inl
new file mode 100644
index 0000000000..6e17b83d71
--- /dev/null
+++ b/snippets/haskell-mode/inl
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: inl
+# key: inl
+# expand-env: ((yas-indent-line 'fixed))
+# --
+{-# INLINE $1 #-}
\ No newline at end of file
diff --git a/snippets/haskell-mode/inline b/snippets/haskell-mode/inline
new file mode 100644
index 0000000000..1beafbe50b
--- /dev/null
+++ b/snippets/haskell-mode/inline
@@ -0,0 +1,5 @@
+# key: inline
+# name: inline
+# expand-env: ((yas-indent-line 'fixed))
+# --
+{-# INLINE $1 #-}
\ No newline at end of file
diff --git a/snippets/haskell-mode/language pragma b/snippets/haskell-mode/language pragma
new file mode 100644
index 0000000000..6f84720f45
--- /dev/null
+++ b/snippets/haskell-mode/language pragma
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: language pragma
+# key: lang
+# expand-env: ((yas-indent-line 'fixed))
+# --
+{-# LANGUAGE $1 #-}
\ No newline at end of file
diff --git a/snippets/haskell-mode/shut up, hlint b/snippets/haskell-mode/shut up, hlint
new file mode 100644
index 0000000000..fccff1d66f
--- /dev/null
+++ b/snippets/haskell-mode/shut up, hlint
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: shut up, hlint
+# key: dupl
+# expand-env: ((yas-indent-line 'fixed))
+# --
+{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
\ No newline at end of file
diff --git a/snippets/js2-mode/action-type b/snippets/js2-mode/action-type
new file mode 100644
index 0000000000..ef8d1a3863
--- /dev/null
+++ b/snippets/js2-mode/action-type
@@ -0,0 +1,4 @@
+# key: at
+# name: action-type
+# --
+export const ${1:FOO_BAR$(->> yas-text s-upcase (s-replace-all '(("-" . "_") (" " . "_"))))}: '${3:ns}/${1:$(-> yas-text s-dashed-words)}' = '$3/${1:$(-> yas-text s-dashed-words)}'$5
\ No newline at end of file
diff --git a/snippets/js2-mode/describe b/snippets/js2-mode/describe
new file mode 100644
index 0000000000..bd0198181d
--- /dev/null
+++ b/snippets/js2-mode/describe
@@ -0,0 +1,6 @@
+# key: desc
+# name: describe
+# --
+describe('$1', () => {
+  $2
+})
\ No newline at end of file
diff --git a/snippets/js2-mode/expect b/snippets/js2-mode/expect
new file mode 100644
index 0000000000..eba41ef330
--- /dev/null
+++ b/snippets/js2-mode/expect
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: expect
+# key: ex
+# --
+expect($1).$2
\ No newline at end of file
diff --git a/snippets/js2-mode/header b/snippets/js2-mode/header
new file mode 100644
index 0000000000..3e303764cb
--- /dev/null
+++ b/snippets/js2-mode/header
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: header
+# key: hh
+# expand-env: ((yas-indent-line 'fixed))
+# --
+////////////////////////////////////////////////////////////////////////////////
diff --git a/snippets/js2-mode/it b/snippets/js2-mode/it
new file mode 100644
index 0000000000..a451cfc08a
--- /dev/null
+++ b/snippets/js2-mode/it
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: it
+# key: it
+# --
+it('$1', () => {
+  $2
+})
\ No newline at end of file
diff --git a/snippets/js2-mode/it-pending b/snippets/js2-mode/it-pending
new file mode 100644
index 0000000000..00da312e10
--- /dev/null
+++ b/snippets/js2-mode/it-pending
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: it-pending
+# key: xi
+# --
+it('$1')$0
\ No newline at end of file
diff --git a/snippets/js2-mode/module b/snippets/js2-mode/module
new file mode 100644
index 0000000000..dc79819d89
--- /dev/null
+++ b/snippets/js2-mode/module
@@ -0,0 +1,12 @@
+# key: module
+# name: module
+# expand-env: ((yas-indent-line (quote fixed)))
+# condition: (= (length "module") (current-column))
+# --
+/**
+ * @fileOverview $1
+ * @name ${2:`(file-name-nondirectory (buffer-file-name))`}
+ * @author Griffin Smith
+ * @license Proprietary
+ */
+$3
\ No newline at end of file
diff --git a/snippets/js2-mode/record b/snippets/js2-mode/record
new file mode 100644
index 0000000000..0bb0f02436
--- /dev/null
+++ b/snippets/js2-mode/record
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: record
+# key: rec
+# --
+export default class $1 extends Record({
+  $2
+}) {}
\ No newline at end of file
diff --git a/snippets/js2-mode/test b/snippets/js2-mode/test
new file mode 100644
index 0000000000..938d490a74
--- /dev/null
+++ b/snippets/js2-mode/test
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: test
+# key: test
+# --
+test('$1', () => {
+  $2
+})
\ No newline at end of file