aboutsummaryrefslogtreecommitdiffstats
path: root/emacs/.emacs.d
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/.emacs.d')
-rw-r--r--emacs/.emacs.d/init.org522
-rwxr-xr-xemacs/.emacs.d/scripts/find-php-class74
-rw-r--r--emacs/.emacs.d/snippets/bats-mode/test7
-rw-r--r--emacs/.emacs.d/snippets/conf-mode/section8
-rw-r--r--emacs/.emacs.d/snippets/csharp-mode/testm9
-rw-r--r--emacs/.emacs.d/snippets/css-mode/box-shadow5
-rw-r--r--emacs/.emacs.d/snippets/emacs-lisp-mode/cookie5
-rw-r--r--emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on5
-rw-r--r--emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on-git5
-rw-r--r--emacs/.emacs.d/snippets/emacs-lisp-mode/face5
-rw-r--r--emacs/.emacs.d/snippets/haml-mode/faq12
-rw-r--r--emacs/.emacs.d/snippets/html-mode/block7
-rw-r--r--emacs/.emacs.d/snippets/html-mode/for8
-rw-r--r--emacs/.emacs.d/snippets/html-mode/generic-block8
-rw-r--r--emacs/.emacs.d/snippets/html-mode/script5
-rw-r--r--emacs/.emacs.d/snippets/html-mode/trans-with-cap6
-rw-r--r--emacs/.emacs.d/snippets/nxml-mode/Import6
-rw-r--r--emacs/.emacs.d/snippets/nxml-mode/pencil-property7
-rw-r--r--emacs/.emacs.d/snippets/nxml-mode/pencil-property-value5
-rw-r--r--emacs/.emacs.d/snippets/nxml-mode/pencil-shortcut9
-rw-r--r--emacs/.emacs.d/snippets/org-mode/codeblock7
-rw-r--r--emacs/.emacs.d/snippets/org-mode/heading9
-rw-r--r--emacs/.emacs.d/snippets/org-mode/project51
-rw-r--r--emacs/.emacs.d/snippets/org-mode/snippet14
-rw-r--r--emacs/.emacs.d/snippets/org-mode/task10
-rw-r--r--emacs/.emacs.d/snippets/php-mode/arrow-function6
-rw-r--r--emacs/.emacs.d/snippets/php-mode/casts7
-rw-r--r--emacs/.emacs.d/snippets/php-mode/class8
-rw-r--r--emacs/.emacs.d/snippets/php-mode/constructor8
-rw-r--r--emacs/.emacs.d/snippets/php-mode/factory6
-rw-r--r--emacs/.emacs.d/snippets/php-mode/for7
-rw-r--r--emacs/.emacs.d/snippets/php-mode/function-expression8
-rw-r--r--emacs/.emacs.d/snippets/php-mode/function-statement11
-rw-r--r--emacs/.emacs.d/snippets/php-mode/if-statement7
-rw-r--r--emacs/.emacs.d/snippets/php-mode/logger-debug5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/logger-error5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/logger-info5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/logger-warning5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/mark-test-skipped6
-rw-r--r--emacs/.emacs.d/snippets/php-mode/namespace5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/php5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/phpstan-ignore5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/strict-types5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/test-class14
-rw-r--r--emacs/.emacs.d/snippets/php-mode/test-comment9
-rw-r--r--emacs/.emacs.d/snippets/php-mode/test-name8
-rw-r--r--emacs/.emacs.d/snippets/php-mode/todo-comment5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/var5
-rw-r--r--emacs/.emacs.d/snippets/php-mode/wpheader.php13
-rw-r--r--emacs/.emacs.d/snippets/php-ts-mode/.yas-parents1
-rw-r--r--emacs/.emacs.d/snippets/python-mode/defm_empty7
-rw-r--r--emacs/.emacs.d/snippets/python-mode/form9
-rw-r--r--emacs/.emacs.d/snippets/python-mode/form_valid8
-rw-r--r--emacs/.emacs.d/snippets/python-mode/form_valid_with_return8
-rw-r--r--emacs/.emacs.d/snippets/python-mode/import_from6
-rw-r--r--emacs/.emacs.d/snippets/python-mode/method7
-rw-r--r--emacs/.emacs.d/snippets/python-mode/permission_guard9
-rw-r--r--emacs/.emacs.d/snippets/python-mode/url5
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/ProductSeed5
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/ProductSeedHW5
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/ProductSeedHWGroup8
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/describe7
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/do6
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/factory9
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/fill_in5
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/mod11
-rw-r--r--emacs/.emacs.d/snippets/ruby-mode/reduce5
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/_self5
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/blk7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/def7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/ext5
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/for7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/if7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/ife9
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/iif5
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/imp7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/mac7
-rw-r--r--emacs/.emacs.d/snippets/twig-mode/set5
78 files changed, 1098 insertions, 71 deletions
diff --git a/emacs/.emacs.d/init.org b/emacs/.emacs.d/init.org
index 71ca9cc..10e1a98 100644
--- a/emacs/.emacs.d/init.org
+++ b/emacs/.emacs.d/init.org
@@ -74,12 +74,12 @@ Add MELPA to package archives, this lets me install more packages. Also my own o
(add-to-list 'package-archives '("oni" . "https://ryuslash.srht.site/emacs-config/packages/")))
#+end_src
-Make use-package default to ensuring everything. This way each =use-package= doesn't need to have its own ~:ensure t~ and when I use Guix to install these modules they don't try to download everything from everywhere else.
+Make use-package default to ensuring everything on macos. This way each =use-package= doesn't need to have its own ~:ensure t~ and when I use Guix to install these modules they don't try to download everything from everywhere else.
#+begin_src emacs-lisp
(eval-and-compile
(require 'use-package-ensure)
- (setq use-package-always-ensure t))
+ (setq use-package-always-ensure (eq system-type 'darwin)))
#+end_src
* exec-path-from-shell
@@ -98,8 +98,10 @@ This is necessary to make sure that packages installed through bundle and such a
Add the =use-package-ensure-system-package= extension for =use-package=.
#+begin_src emacs-lisp
- (use-package use-package-ensure-system-package)
- (use-package system-packages)
+ (use-package use-package-ensure-system-package
+ :when (eq system-type 'darwin))
+ (use-package system-packages
+ :when (eq system-type 'darwin))
#+end_src
* Docker
@@ -116,7 +118,357 @@ I currently develop in PHP.
#+begin_src emacs-lisp
(use-package php-mode
- :ensure-system-package php)
+ :ensure-system-package php
+ :config
+ (require 'align)
+ (require 'grep)
+ (require 'hydra)
+ (require 'map)
+ (require 'php-mode)
+ (require 'project)
+ (require 'whitespace)
+
+ (defconst oni-php-scripts-dir
+ (expand-file-name "scripts" user-emacs-directory)
+ "The directory where I store scripts.")
+
+ (defun oni-php--set-require-final-newline ()
+ "Set `require-final-newline' to t.
+ This is necessary because the PHP mode configuration sets this to nil
+ for some reason."
+ (setq require-final-newline t))
+
+ (defun oni-php--whitespace-mode ()
+ "Enable whitespace mode with only tabs showing."
+ (setq-local whitespace-style '(face tabs))
+ (whitespace-mode))
+
+ (defun oni-php--auto-fill-mode ()
+ "Enable ‘auto-fill-mode’ only for comments."
+ (setq-local comment-auto-fill-only-comments t)
+ (auto-fill-mode))
+
+ (defun oni-php-set-rainbow-identifier-faces ()
+ "Set the faces to override for ‘rainbow-identifiers-mode’."
+ (setq-local rainbow-identifiers-faces-to-override
+ '(font-lock-type-face php-property-name php-function-call-traditional
+ php-doc-variable-sigil php-method-call-traditional
+ php-variable-sigil php-variable-name)))
+
+ (defun oni-php-add-use (class)
+ "Try to add a use statement for CLASS under point."
+ (interactive (list (thing-at-point 'symbol)))
+ (let* ((default-directory (project-root (project-current)))
+ (classes (read (shell-command-to-string (concat (expand-file-name "find-php-class" oni-php-scripts-dir) " " class))))
+ (class (cond
+ ((null classes)
+ (user-error "Class ‘%s’ not found" class))
+ ((> (length classes) 1)
+ (completing-read "Use: " classes nil t))
+ (t (car classes)))))
+ (save-excursion
+ (goto-char (point-min))
+
+ (if (search-forward "use " nil t)
+ (forward-paragraph)
+ (search-forward "namespace ")
+ (forward-line)
+ (insert "\n"))
+
+ (unless (re-search-backward (rx "use " (literal class) ";") nil t)
+ (let ((start (point)))
+ (insert "use " class ";\n")
+ (pulse-momentary-highlight-region start (point)))))))
+
+ (defun oni-php--syntax-in-string-p (syntax)
+ "Does SYNTAX indicate point is inside a string?"
+ (nth 3 syntax))
+
+ (defun oni-php--syntax-in-comment-p (syntax)
+ "Does SYNTAX indicate point is inside a comment?"
+ (nth 4 syntax))
+
+ (defun oni-php--in-string-or-comment-p ()
+ "Return whether or not point is within a string or comment."
+ (let ((syntax (syntax-ppss)))
+ (or (oni-php--syntax-in-string-p syntax)
+ (oni-php--syntax-in-comment-p syntax))))
+
+ (defun oni-php-insert-dot-dwim (N)
+ "Insert either a concatenation or access operator depending on context.
+
+ Do the insert N times."
+ (interactive "p")
+ (if (or (oni-php--in-string-or-comment-p)
+ (save-excursion
+ (skip-syntax-backward " ")
+ (nth 3 (syntax-ppss (1- (point)))))
+ (save-excursion
+ (skip-syntax-forward " ")
+ (nth 3 (syntax-ppss (1+ (point))))))
+ (self-insert-command N)
+ (let ((op (if (looking-back (rx (or "$" ")") (zero-or-more (any whitespace "\n" alnum "(" ")" "->")))
+ (save-excursion (backward-up-list) (1+ (point))))
+ "->"
+ "::")))
+ (dotimes (_ N) (insert op)))))
+
+ (defun oni-php-doc-comment ()
+ "Insert a PHP documentation comment at point."
+ (interactive)
+ (let ((start (point)))
+ (insert "/**\n * ")
+ (let ((insert-marker (point-marker)))
+ (insert "\n */")
+ (indent-region start (point))
+ (goto-char insert-marker))))
+
+ (defun oni-php-doc-use-comment ()
+ "Insert a PHP documentation comment for a use statement."
+ (interactive)
+ (let ((start (point))
+ (class (save-excursion
+ (save-match-data
+ (search-forward-regexp (rx "use " (group (minimal-match (zero-or-more alnum))) ";"))
+ (match-string 1)))))
+ (insert "/**\n * @use " class)
+ (let ((insert-marker (point-marker)))
+ (insert "\n */")
+ (indent-region start (point))
+ (goto-char insert-marker))))
+
+ (defun oni-php-return-belongs-to-comment ()
+ "Insert a PHP documentation comment for a BelongsTo return type."
+ (interactive)
+ (let ((start (point)))
+ (insert "/**\n * @return BelongsTo<")
+ (save-excursion
+ (insert ", $this>\n */")
+ (indent-region start (point)))))
+
+ (defun oni-php-comment-dwim (func &rest args)
+ "See if a PHP documentation comment should be added and add it.
+ Otherwise call FUNC with ARGS. This is meant as advice around
+ ‘comment-dwim’ to make it smarter for PHP code."
+ (cond ((looking-at (rx (minimal-match (zero-or-more (any whitespace "\n")))
+ "use "))
+ (oni-php-doc-use-comment))
+ ((looking-at (rx (minimal-match (zero-or-more (any whitespace "\n")))
+ (one-or-more nonl) ": BelongsTo" eol))
+ (oni-php-return-belongs-to-comment))
+ ((and (derived-mode-p 'php-mode)
+ (not (region-active-p))
+ (looking-back (rx (minimal-match (zero-or-more blank))) (line-beginning-position))
+ (looking-at (rx (minimal-match (zero-or-more (any whitespace "\n")))
+ (or (regexp php-beginning-of-defun-regexp)
+ (regexp php--re-classlike-pattern)))))
+ (oni-php-doc-comment))
+ (t (apply func args))))
+
+ (defun oni-php-generate-namespace ()
+ (string-join
+ (mapcar
+ (lambda (s)
+ (let ((case-fold-search nil))
+ (if (string-match-p (rx upper-case) s)
+ s
+ (capitalize s))))
+ (cdr (split-string
+ (directory-file-name
+ (file-name-directory
+ (file-relative-name
+ buffer-file-name
+ (project-root (project-current)))))
+ "/")))
+ "\\"))
+
+ (defun oni-php-set-dabbrev-settings ()
+ "Set any settings for dabbrev that make sense for PHP code."
+ (setq-local dabbrev-abbrev-skip-leading-regexp (rx "$")))
+
+ (defun oni-php-ignore-error-at-point (error-type)
+ (interactive
+ (list (let* ((error-types
+ (seq-uniq
+ (mapcar (lambda (e)
+ (let ((str (flycheck-error-message e)))
+ (string-match (rx "🪪" (one-or-more whitespace) (group (one-or-more (any alnum ".")))) str)
+ (match-string 1 str)))
+ (seq-filter (lambda (e) (not (flycheck-error-checker e)))
+ (flycheck-overlay-errors-at (point))))
+ 'string=)))
+ (if (> 1 (length error-types))
+ (completing-read "Ignore type: " error-types)
+ (car error-types)))))
+ (save-excursion
+ (goto-char (line-beginning-position))
+ (indent-for-tab-command)
+ (insert "/** @phpstan-ignore " error-type " */\n")
+ (indent-for-tab-command)))
+
+ (defconst +oni-php-import-display+ "…"
+ "What to display instead of imports.")
+
+ (defun oni-php-toggle-import-display ()
+ (interactive)
+ (let* ((overlay (seq-find (lambda (o) (overlay-get o 'oni-php-hidden-imports))
+ (overlays-at (point))))
+ (visiblep (not (string= +oni-php-import-display+
+ (overlay-get overlay 'display)))))
+ (overlay-put overlay 'display (if visiblep +oni-php-import-display+ nil))))
+
+ (defvar oni-php-hidden-imports-keymap
+ (let ((keymap (make-sparse-keymap)))
+ (define-key keymap (kbd "TAB") 'oni-php-toggle-import-display)
+ keymap))
+
+ (defun oni-php-hide-imports ()
+ "Hide the imports at the start of the file."
+ (save-excursion
+ (let (start end)
+ (goto-char (point-min))
+ (when (re-search-forward (rx bol "use ") nil t)
+ (setq start (point))
+ (while (re-search-forward (rx bol "use ") nil t))
+ (setq end (line-end-position))
+ (dolist (o (overlays-in start end))
+ (when (overlay-get o 'oni-php-hidden-imports)
+ (delete-overlay o)))
+ (let ((overlay (make-overlay start end nil t t)))
+ (overlay-put overlay 'oni-php-hidden-imports t)
+ (overlay-put overlay 'display +oni-php-import-display+)
+ (overlay-put overlay 'keymap oni-php-hidden-imports-keymap))))))
+
+ (defhydra php-mode-hydra (:color blue)
+ ("a" align-current "Align current selection"))
+
+ (advice-add 'comment-dwim :around #'oni-php-comment-dwim)
+
+ (add-hook 'php-mode-hook #'oni-php--set-require-final-newline)
+ (add-hook 'php-mode-hook #'oni-php--whitespace-mode)
+ (add-hook 'php-mode-hook 'corfu-mode)
+ (add-hook 'php-mode-hook 'display-fill-column-indicator-mode)
+ (add-hook 'php-mode-hook 'electric-indent-local-mode)
+ (add-hook 'php-mode-hook 'fic-mode)
+ (add-hook 'php-mode-hook 'flycheck-mode)
+ (add-hook 'php-mode-hook 'oni-php--auto-fill-mode)
+ (add-hook 'php-mode-hook 'oni-php-hide-imports)
+ (add-hook 'php-mode-hook 'oni-php-set-dabbrev-settings)
+ (add-hook 'php-mode-hook 'oni-php-set-rainbow-identifier-faces)
+ (add-hook 'php-mode-hook 'rainbow-delimiters-mode)
+ (add-hook 'php-mode-hook 'rainbow-identifiers-mode)
+ (add-hook 'php-mode-hook 'smartparens-mode)
+ (add-hook 'php-mode-hook 'subword-mode)
+ (add-hook 'php-mode-hook 'yas-minor-mode)
+
+ (define-key php-mode-map (kbd "C-c m") #'php-mode-hydra/body)
+ (define-key php-mode-map (kbd ".") #'oni-php-insert-dot-dwim)
+
+ ;; In PHP code it's nice to have any ~=>~ aligned.
+
+ ;; <?php
+ ;; array(
+ ;; 'foo' => 'bar',
+ ;; 'frob' => 'baz'
+ ;; );
+ ;; ?>
+
+ (add-to-list 'align-rules-list
+ `(php-array-arrow
+ (regexp . ,(rx any (group (zero-or-more whitespace)) "=>" any))
+ (group . (1))
+ (modes . '(php-mode web-mode php-mode))
+ (repeat . t)))
+
+ ;; The WordPress coding standards specify that multiple assignments
+ ;; should have their assignment operators aligned.
+
+ ;; <?php
+ ;; $variable = "value";
+ ;; $other_variable = "other value";
+ ;; $one_more_variable = "one more variable";
+
+ (add-to-list 'align-rules-list
+ `(php-assignment-equals
+ (regexp . ,(rx any (group (zero-or-more whitespace)) "="
+ (zero-or-more whitespace) any))
+ (group . (1))
+ (modes . '(php-mode web-mode php-ts-mode))
+ (repeat . t)))
+
+ ;;;###autoload
+ (add-to-list 'auto-mode-alist '("\\.inc\\'" . php-mode))
+
+ ;;;###autoload
+ (add-to-list 'auto-mode-alist '("\\.module\\'" . php-mode))
+
+ ;;;###autoload
+ (with-eval-after-load 'grep
+ (add-to-list 'grep-files-aliases '("php" . "*.php *.inc *.module")))
+
+ (with-eval-after-load 'autoinsert
+ (setf (map-elt auto-insert-alist (rx ".php" eos))
+ '(nil
+ "<?php\n"
+ "\n"
+ "declare(strict_types=1);\n"
+ "\n"
+ "namespace " (oni-php-generate-namespace) ";\n"
+ "\n"
+ "class " (file-name-sans-extension (file-name-nondirectory (buffer-file-name))) "\n"
+ "{\n"
+ > _ "\n"
+ "}\n")
+ (map-elt auto-insert-alist (rx "Test.php" eos))
+ '(nil
+ "<?php\n"
+ "\n"
+ "declare(strict_types=1);\n"
+ "\n"
+ "namespace " (oni-php-generate-namespace) ";\n"
+ "\n"
+ "use Illuminate\\Foundation\\Testing\\RefreshDatabase;\n"
+ "use Illuminate\\Foundation\\Testing\\WithFaker;\n"
+ "use Tests\\TestCase;\n"
+ "\n"
+ "class " (file-name-sans-extension (file-name-nondirectory (buffer-file-name))) " extends TestCase\n"
+ "{\n"
+ > "use RefreshDatabase;\n"
+ > "use WithFaker;\n"
+ "\n"
+ > "/** @test */\n"
+ > "public function " (replace-regexp-in-string (rx whitespace) "_" (downcase (skeleton-read "Test function name: "))) "(): void\n"
+ "{" > "\n"
+ > _ "\n"
+ "}" > "\n"
+ "}")))
+
+ (defun oni-php-in-expression-context-p ()
+ (not (oni-php-in-static-call-context-p)))
+
+ (defun oni-php-in-test-file ()
+ (string-suffix-p "Test.php" buffer-file-name))
+
+ (defun oni-php-in-static-call-context-p ()
+ (looking-back "::\\w+" (- (point) (line-beginning-position))))
+
+ (defun oni-php-grep-symbol (symbol)
+ "Use ‘rgrep’ to find SYMBOL.
+ If there is an active region when this command is called interactively
+ SYMBOL will be the text in the region. Otherwise it's the symbol at
+ point."
+ (interactive (list
+ (if (region-active-p)
+ (buffer-substring-no-properties (region-beginning) (region-end))
+ (thing-at-point 'symbol))))
+ (rgrep (rx (literal symbol))
+ (map-elt grep-files-aliases "php")
+ (project-root (project-current))))
+
+ (define-key php-mode-map (kbd "C-c .") nil t)
+ (define-key php-mode-map (kbd "C-c . g") '("Search for symbol at point" . oni-php-grep-symbol))
+ (define-key php-mode-map (kbd "C-c . a") '("Import symbol at point" . oni-php-add-use))
+ (define-key php-mode-map (kbd "C-c . i") '("Ignore error at point" . oni-php-ignore-error-at-point)))
#+end_src
* Magit
@@ -164,39 +516,40 @@ Also install =markdown-indent-mode= which is very much like =org-indent-mode= (b
* Org Mode
#+begin_src emacs-lisp
- (use-package org
- :bind (("C-c o c" . org-capture)
- ("C-c o a" . org-agenda)
- ("C-c o l" . org-store-link)
- ("C-c o b" . org-switchb))
- :config
- (add-hook 'org-mode-hook 'visual-line-mode)
- (add-hook 'org-mode-hook 'org-indent-mode))
+ (use-package org
+ :init (define-key global-map (kbd "C-c o") (make-sparse-keymap))
+ :bind (("C-c o c" . org-capture)
+ ("C-c o a" . org-agenda)
+ ("C-c o l" . org-store-link)
+ ("C-c o b" . org-switchb))
+ :config
+ (add-hook 'org-mode-hook 'visual-line-mode)
+ (add-hook 'org-mode-hook 'org-indent-mode))
- (use-package org-capture
- :config
- (map-put org-capture-templates "t"
- '("A simple TODO item" entry (file "") "* TODO %?
+ (use-package org-capture
+ :config
+ (map-put org-capture-templates "t"
+ '("A simple TODO item" entry (file "") "* TODO %?
:PROPERTIES:
:CREATED: %U
:END:"))
- (map-put org-capture-templates "d"
- '("A simple DONE item" entry (file "") "* DONE %?
+ (map-put org-capture-templates "d"
+ '("A simple DONE item" entry (file "") "* DONE %?
:PROPERTIES:
:CREATED: %U
:END:"))
- (map-put org-capture-templates "n"
- '("A simple note" entry (file "") "* Note taken on %U
+ (map-put org-capture-templates "n"
+ '("A simple note" entry (file "") "* Note taken on %U
:PROPERTIES:
:CREATED: %U
:END:
%?"))
- (map-put org-capture-templates "N"
- '("A simple note (on current task)" item (clock) "- Note taken on %U: \\\\
+ (map-put org-capture-templates "N"
+ '("A simple note (on current task)" item (clock) "- Note taken on %U: \\\\
%?"))
- (map-put org-capture-templates "r"
- '("An Operational Request came in" entry (file "") "* TODO Operation Request %^U
+ (map-put org-capture-templates "r"
+ '("An Operational Request came in" entry (file "") "* TODO Operation Request %^U
:PROPERTIES:
:CREATED: %U
:END:
@@ -831,7 +1184,7 @@ Highlight diffs in the fringe.
#+begin_src emacs-lisp
(use-package rainbow-delimiters
- :hook (php-mode emacs-lisp-mode))
+ :hook (prog-mode))
#+end_src
* Mixed Pitch Mode
@@ -928,6 +1281,39 @@ Now the pull app.
'pull-app))
#+end_src
+social api:
+
+#+begin_src emacs-lisp
+ (use-package files
+ :ensure nil
+ :config
+ (dir-locals-set-class-variables
+ 'social-api
+ '((nil . ((grep-find-ignored-directories . (".git" "vendor" "cdk.out" "storage" "punt/tmp" "chanced/tmp"))
+ (eglot-workspace-configuration
+ . (:language_server_phpstan (:enabled t
+ :mem_limit "2G"
+ :bin "chanced/vendor/bin/phpstan")))))
+ (php-mode . ((fill-column . 80)
+ (eglot-server-programs . (((php-mode phps-mode php-ts-mode)
+ "localhost" 4564)))
+ (php-project-root . git)
+ (phpstan-executable . (root . "../chanced-scripts/phpstan"))
+ (phpstan-config-file . "/app/chanced/phpstan.neon")
+ (phpstan-memory-limit . "4G")
+ (phpstan-level . 9)
+ (eval . (setq-local flycheck-phpstan-executable (expand-file-name "../chanced-scripts/phpstan" (project-root (project-current)))))
+ (php-ts-mode-php-executable . "docker exec -it chanced-backend php artisan tinker")))
+ (typescript-mode . ((typescript-indent-level . 2)))
+ ("punt"
+ . ((php-mode . ((phpstan-config-file . "/app/punt/phpstan.neon")))))
+ ("filament"
+ . ((php-mode . ((phpstan-config-file . "/app/filament/phpstan.neon")))))))
+ (dir-locals-set-directory-class
+ (expand-file-name "~/code/diamond-interactive/social-api")
+ 'social-api))
+#+end_src
+
* Eglot
Set up a server program for Eglot for org-mode.
@@ -959,6 +1345,7 @@ This includes cape for extra completion-at-point functions, and corfu-prescient
#+begin_src emacs-lisp
(use-package corfu
+ :hook (prog-mode)
:config
(setq corfu-auto t))
@@ -996,3 +1383,86 @@ Phel is a Clojure-inspired lisp that compiles to PHP.
(use-package phel-mode
:mode (rx ".phel" eos))
#+end_src
+
+* Paredit
+
+The only way to edit lispy languages. This turns Emacs into a structural editor for s-expression-based languages.
+
+#+begin_src emacs-lisp
+ (use-package paredit
+ :hook (lisp-data-mode fennel-mode clojure-mode))
+#+end_src
+
+* Yasnippet
+
+Snippets!
+
+#+begin_src emacs-lisp
+ (use-package yasnippet
+ :diminish yasnippet-minor-mode
+ :init
+ (yas-global-mode)
+ :bind (:map yas-minor-mode-map
+ ("<tab>")
+ ("C-\\" . yas-expand)
+ ("TAB"))
+ :config
+ (define-key yas-minor-mode-map (kbd "SPC") yas-maybe-expand)
+ (setq-default yas-buffer-local-condition
+ yas-not-string-or-comment-condition))
+#+end_src
+
+* Help
+
+I've always been annoyed that calling any of the help functions never select the help buffer. Thankfully due to [[https://irreal.org/blog/?p=13752][Irreal: A Short Report On Help Focus]] I know how to fix that now.
+
+That got me looking at [[elisp:(customize-group "help")]] and discover [[help:help-enable-variable-value-editing]].
+
+#+begin_src emacs-lisp
+ (use-package help
+ :custom
+ (help-window-select t)
+ (help-enable-variable-value-editing t))
+#+end_src
+
+* Denote
+
+I need to try taking notes with Denote.
+
+#+begin_src emacs-lisp
+ (use-package denote
+ :hook (dired-mode . denote-dired-mode)
+ :bind
+ (("C-c n n" . denote)
+ ("C-c n r" . denote-rename-file)
+ ("C-c n l" . denote-link)
+ ("C-c n b" . denote-backlinks)
+ ("C-c n d" . denote-dired)
+ ("C-c n g" . denote-grep))
+ :config
+ (setq denote-directory (expand-file-name "~/Documents/denote-notes/"))
+ (denote-rename-buffer-mode 1))
+#+end_src
+
+* Dabbrev
+
+Dynamic abbreviations are one of the completion mechanisms that Emacs supports. I mainly use this with corfu and cape-dabbrev, but when I'm looking for completions I want to see any variant with different letter casings, and also maintain the letter casing of which option I pick.
+
+#+begin_src emacs-lisp
+ (use-package dabbrev
+ :ensure nil
+ :config
+ (setq dabbrev-case-replace nil)
+ (setq dabbrev-case-distinction nil)
+ (setq dabbrev-case-fold-search t))
+#+end_src
+
+* Typescript
+
+Emacs comes with built-in typescript mode.
+
+#+begin_src emacs-lisp
+ (use-package typescript-ts-mode
+ :ensure nil
+ :mode (rx ".ts" eos))
+#+end_src
diff --git a/emacs/.emacs.d/scripts/find-php-class b/emacs/.emacs.d/scripts/find-php-class
index 4268dcf..3564f00 100755
--- a/emacs/.emacs.d/scripts/find-php-class
+++ b/emacs/.emacs.d/scripts/find-php-class
@@ -1,48 +1,32 @@
-#!/usr/bin/env bash
-# ;; #!/usr/bin/env -S scsh -e main -o srfi-1 -s
-# ;; !#
+#!/usr/bin/env -S scsh -e main -o srfi-1 -s
+;; -*- mode: scheme; -*-
+!#
-# ;; (define (main args)
-# ;; (let* ((class-name (cadr args))
-# ;; (file-names
-# ;; (run/strings (find "."
-# ;; -path "./cdk.out" -prune -o
-# ;; -type f
-# ;; -name ,(string-append class-name ".php")
-# ;; -exec grep "^namespace" "{}" ";")
-# ;; (> 2 "/dev/null"))))
-# ;; (format #t "~s"
-# ;; (delete-duplicates
-# ;; (map (lambda (n)
-# ;; (string-append
-# ;; (match:substring
-# ;; (regexp-search (rx "namespace " (submatch (+ any)) ";") n)
-# ;; 1)
-# ;; "\\"
-# ;; class-name))
-# ;; file-names)))))
+(define (find-class class-name)
+ (run/strings (find "." "("
+ -path "./cdk.out"
+ -o -path "./*/tmp"
+ -o -path "./*/node_modules"
+ -o -path "./*/.phpunit.cache"
+ -o -path "./*/storage"
+ -o -path "./.git"
+ -o -path "./data"
+ ")" -prune
+ -o -type f -name ,(string-append class-name ".php")
+ -exec grep "^namespace" "{}" ";")
+ (> 2 "/dev/null")))
-main() {
- local classname=$1
- find . \( \
- -path "./cdk.out" \
- -o -path "./punt/tmp" \
- -o -path "./punt/vendor" \
- -o -path "./filament/storage/larastan/cache" \
- -o -path "./filament/vendor" \
- -o -path "./chanced/tmp" \
- -o -path "./chanced/node_modules" \
- -o -path "./chanced/.phpunit.cache" \
- -o -path "./.git" \
- -o -path "./chanced/storage" \
- \) -prune \
- -o -type f -name "${classname}.php" \
- -exec grep '^namespace' '{}' \; \
- | awk "{ print substr(\$0, 11, length(\$0) - 11) \"\\\\${classname}\" }"
- # for f in "$(git ls-files | grep "${classname}.php")"; do
- # grep '^namespace' "$f" | awk '{ print substr($0, 11, length($0) - 11) }'
- # done
-}
-
-main "$@"
+(define (main args)
+ (let* ((class-name (cadr args))
+ (file-names (find-class class-name)))
+ (format #t "~s"
+ (delete-duplicates
+ (map (lambda (n)
+ (string-append
+ (match:substring
+ (regexp-search (rx "namespace " (submatch (+ any)) ";") n)
+ 1)
+ "\\"
+ class-name))
+ file-names)))))
diff --git a/emacs/.emacs.d/snippets/bats-mode/test b/emacs/.emacs.d/snippets/bats-mode/test
new file mode 100644
index 0000000..8a2f028
--- /dev/null
+++ b/emacs/.emacs.d/snippets/bats-mode/test
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: test
+# key: test
+# --
+@test "$1" {
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/conf-mode/section b/emacs/.emacs.d/snippets/conf-mode/section
new file mode 100644
index 0000000..496e4fd
--- /dev/null
+++ b/emacs/.emacs.d/snippets/conf-mode/section
@@ -0,0 +1,8 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: Xorg Section
+# key: Section
+# --
+Section "$1"
+ Identifier "$2"
+ $0
+EndSection
diff --git a/emacs/.emacs.d/snippets/csharp-mode/testm b/emacs/.emacs.d/snippets/csharp-mode/testm
new file mode 100644
index 0000000..4bd243d
--- /dev/null
+++ b/emacs/.emacs.d/snippets/csharp-mode/testm
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Test Method
+# key: testm
+# --
+[TestMethod]
+public void ${1:TestMethod}()
+{
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/css-mode/box-shadow b/emacs/.emacs.d/snippets/css-mode/box-shadow
new file mode 100644
index 0000000..82fe9d5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/css-mode/box-shadow
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: box-shadow
+# key: boxshadow
+# --
+box-shadow: ${1:offset-x} ${2:offset-y}${3: [blur-radius]}${4: [spread-radius]}${5: [color]}; \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/emacs-lisp-mode/cookie b/emacs/.emacs.d/snippets/emacs-lisp-mode/cookie
new file mode 100644
index 0000000..6fafd3c
--- /dev/null
+++ b/emacs/.emacs.d/snippets/emacs-lisp-mode/cookie
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: with-eval-after-load-cookie
+# key: cookie
+# --
+;;;###autoload(with-eval-after-load '${1:`(string-remove-prefix "oni-" (string-remove-suffix ".el" (buffer-name)))`-mode} (require '`(string-remove-suffix ".el" (buffer-name))`)) \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on b/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on
new file mode 100644
index 0000000..4f99d92
--- /dev/null
+++ b/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: depends-on
+# key: do
+# --
+(depends-on "$1")$0 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on-git b/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on-git
new file mode 100644
index 0000000..1da2f31
--- /dev/null
+++ b/emacs/.emacs.d/snippets/emacs-lisp-mode/depends-on-git
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: depends-on-git
+# key: do
+# --
+(depends-on "$1" :git "../" :files ("$1.el"))$0 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/emacs-lisp-mode/face b/emacs/.emacs.d/snippets/emacs-lisp-mode/face
new file mode 100644
index 0000000..9fdbbb2
--- /dev/null
+++ b/emacs/.emacs.d/snippets/emacs-lisp-mode/face
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: face
+# key: face
+# --
+ `($1 ((t (${2::foreground} $0)))) \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/haml-mode/faq b/emacs/.emacs.d/snippets/haml-mode/faq
new file mode 100644
index 0000000..4d1a9e2
--- /dev/null
+++ b/emacs/.emacs.d/snippets/haml-mode/faq
@@ -0,0 +1,12 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: FAQ Question & Answer
+# key: faq
+# expand-env: ((yas-indent-line 'fixed))
+# --
+%dt
+ = link_to '#' do
+ .expand_icon
+ $1
+%dd
+ %p
+ $0 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/html-mode/block b/emacs/.emacs.d/snippets/html-mode/block
new file mode 100644
index 0000000..6510011
--- /dev/null
+++ b/emacs/.emacs.d/snippets/html-mode/block
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: block
+# key: block
+# --
+{% block $1 %}
+ $0
+{% endblock %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/html-mode/for b/emacs/.emacs.d/snippets/html-mode/for
new file mode 100644
index 0000000..01d9c44
--- /dev/null
+++ b/emacs/.emacs.d/snippets/html-mode/for
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: for
+# key: for
+# condition: pony-tpl-minor-mode
+# --
+{% for $1 in $2 %}
+ $0
+{% endfor %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/html-mode/generic-block b/emacs/.emacs.d/snippets/html-mode/generic-block
new file mode 100644
index 0000000..82d40c7
--- /dev/null
+++ b/emacs/.emacs.d/snippets/html-mode/generic-block
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: Template Block
+# key: %
+# condition: pony-tpl-minor-mode
+# --
+{% $1 %}
+ $0
+{% end$1 %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/html-mode/script b/emacs/.emacs.d/snippets/html-mode/script
new file mode 100644
index 0000000..e50dbf5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/html-mode/script
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: script
+# key: script
+# --
+<script src="$1" type="${2:text/javascript}" language="${3:javascript}"></script> \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/html-mode/trans-with-cap b/emacs/.emacs.d/snippets/html-mode/trans-with-cap
new file mode 100644
index 0000000..4f20a33
--- /dev/null
+++ b/emacs/.emacs.d/snippets/html-mode/trans-with-cap
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: trans with cap
+# key: trans
+# condition: pony-tpl-minor-mode
+# --
+{% trans "$1"|capfirst %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/nxml-mode/Import b/emacs/.emacs.d/snippets/nxml-mode/Import
new file mode 100644
index 0000000..bddbf3f
--- /dev/null
+++ b/emacs/.emacs.d/snippets/nxml-mode/Import
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: Import
+# key: imp
+# condition: (string-suffix-p ".proj" (buffer-file-name))
+# --
+<Import Project="$1"/>
diff --git a/emacs/.emacs.d/snippets/nxml-mode/pencil-property b/emacs/.emacs.d/snippets/nxml-mode/pencil-property
new file mode 100644
index 0000000..7fafcb8
--- /dev/null
+++ b/emacs/.emacs.d/snippets/nxml-mode/pencil-property
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: PencilProperty
+# key: p
+# --
+<Property name="$1"
+ displayName="$2"
+ type="$3">$4</Property> \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/nxml-mode/pencil-property-value b/emacs/.emacs.d/snippets/nxml-mode/pencil-property-value
new file mode 100644
index 0000000..5da3d10
--- /dev/null
+++ b/emacs/.emacs.d/snippets/nxml-mode/pencil-property-value
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: PropertyValue
+# key: pv
+# --
+<PropertyValue name="$1">$2</PropertyValue> \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/nxml-mode/pencil-shortcut b/emacs/.emacs.d/snippets/nxml-mode/pencil-shortcut
new file mode 100644
index 0000000..e760d27
--- /dev/null
+++ b/emacs/.emacs.d/snippets/nxml-mode/pencil-shortcut
@@ -0,0 +1,9 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: Shortcut
+# key: s
+# --
+<Shortcut displayName="$1"
+ icon="$2"
+ to="$3">
+ $0
+</Shortcut> \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/org-mode/codeblock b/emacs/.emacs.d/snippets/org-mode/codeblock
new file mode 100644
index 0000000..a200b08
--- /dev/null
+++ b/emacs/.emacs.d/snippets/org-mode/codeblock
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: codeblock
+# key: code
+# --
+#+begin_src $1
+ $0
+#+end_src \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/org-mode/heading b/emacs/.emacs.d/snippets/org-mode/heading
new file mode 100644
index 0000000..a472f06
--- /dev/null
+++ b/emacs/.emacs.d/snippets/org-mode/heading
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Heading
+# key: <t
+# --
+${1:*} ${2:TODO$(upcase yas-text)} $3
+:PROPERTIES:
+:CREATED: [`(format-time-string "%Y-%m-%d %a %H:%M")`]
+:END:
+$0 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/org-mode/project b/emacs/.emacs.d/snippets/org-mode/project
new file mode 100644
index 0000000..269d655
--- /dev/null
+++ b/emacs/.emacs.d/snippets/org-mode/project
@@ -0,0 +1,51 @@
+# -*- mode: snippet -*-
+# name: project
+# key: project
+# --
+#+TITLE: ${1:project_name}
+#+LINK: src ${2:http://code.ryuslash.org/cgit.cgi/$3$1/}
+#+LINK: tar_gz $2${4:snapshot/$1-master}.tar.gz
+#+LINK: zip $2$4.zip
+#+STARTUP: showall
+
+#+begin_html
+ <script src="/keyjs.js" type="text/javascript"></script>
+ <script type="text/javascript">
+ keyjs_initialize({ "u": [ "keyjs_goto", "../index.html" ],
+ "h": [ "keyjs_goto", "http://ryuslash.org" ] });
+ </script>
+#+end_html
+
+#+INCLUDE: "dlmenu.inc"
+
+* About
+
+ ${5:A short description about $1}
+
+ | $0Status | $6 |
+ | Language | $7 |
+ | License | ${8:GPLv3} |
+
+* Why?
+
+ ${9:Why did you even think of writing $1?}
+
+* Features
+
+ ${10:$1 does...}
+
+* Dependencies
+
+ ${11:$1 needs to have...}
+
+* Download
+
+ ${12:To download $1...}
+
+* Install
+
+ ${13:To install $1...}
+
+* Usage
+
+ ${14:Using $1...} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/org-mode/snippet b/emacs/.emacs.d/snippets/org-mode/snippet
new file mode 100644
index 0000000..67f15d5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/org-mode/snippet
@@ -0,0 +1,14 @@
+# -*- mode: snippet -*-
+# name: snippet
+# key: snippet
+# --
+#+TITLE: ${1:snippet-name}
+#+OPTIONS: toc:nil
+
+* $1
+
+ ${2:A short description abount $1}
+
+ #+BEGIN_SRC $3 :tangle yes
+$0
+ #+END_SRC \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/org-mode/task b/emacs/.emacs.d/snippets/org-mode/task
new file mode 100644
index 0000000..af229d1
--- /dev/null
+++ b/emacs/.emacs.d/snippets/org-mode/task
@@ -0,0 +1,10 @@
+# -*- mode: snippet -*-
+# name: task
+# key: todo
+# --
+* TODO ${1:What is the outcome?}
+:PROPERTIES:
+:CREATED: [`(format-time-string "%Y-%m-%d %a %H:%M")`]
+:END:
+
+$0
diff --git a/emacs/.emacs.d/snippets/php-mode/arrow-function b/emacs/.emacs.d/snippets/php-mode/arrow-function
new file mode 100644
index 0000000..3b44e01
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/arrow-function
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: arrow-function
+# key: f
+# condition: (oni-php-in-expression-context-p)
+# --
+fn($1): $2 => $3 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/casts b/emacs/.emacs.d/snippets/php-mode/casts
new file mode 100644
index 0000000..2850d72
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/casts
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: casts
+# key: casts
+# --
+protected $casts = [
+ '$1' => $0,
+]; \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/class b/emacs/.emacs.d/snippets/php-mode/class
new file mode 100644
index 0000000..26a58a1
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/class
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: class
+# key: cls
+# --
+class ${1:`(file-name-nondirectory (file-name-sans-extension buffer-file-name))`}
+{
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/constructor b/emacs/.emacs.d/snippets/php-mode/constructor
new file mode 100644
index 0000000..f919e6c
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/constructor
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: constructor
+# key: constructor
+# --
+public function __construct($1)
+{
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/factory b/emacs/.emacs.d/snippets/php-mode/factory
new file mode 100644
index 0000000..534f227
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/factory
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: factory
+# key: f
+# condition: (and (oni-php-in-test-file) (oni-php-in-static-call-context-p))
+# --
+factory()->create([$0]); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/for b/emacs/.emacs.d/snippets/php-mode/for
new file mode 100644
index 0000000..1adae91
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/for
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: for
+# key: for
+# --
+for (${1:$i = 0}; ${2:$i < $3}; ${4:$i++}) {
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/function-expression b/emacs/.emacs.d/snippets/php-mode/function-expression
new file mode 100644
index 0000000..fa59b03
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/function-expression
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: function expression
+# key: f
+# condition: (oni-php-in-expression-context-p)
+# --
+function ($1) ${2:use ($3)} {
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/function-statement b/emacs/.emacs.d/snippets/php-mode/function-statement
new file mode 100644
index 0000000..9c44aef
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/function-statement
@@ -0,0 +1,11 @@
+# -*- mode: snippet -*-
+# name: function statement
+# key: f
+# condition: (oni-php-in-expression-context-p)
+# --
+/**
+ * $5
+ */
+${1:private} function $2($3): ${4:void} {
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/if-statement b/emacs/.emacs.d/snippets/php-mode/if-statement
new file mode 100644
index 0000000..6033e3a
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/if-statement
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: if statement
+# key: ?
+# --
+if ($1) {
+ $2
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/logger-debug b/emacs/.emacs.d/snippets/php-mode/logger-debug
new file mode 100644
index 0000000..d0e0b7e
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/logger-debug
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: logger.debug
+# key: ld
+# --
+logger()->debug('$1'${2:, [ $3 ]}); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/logger-error b/emacs/.emacs.d/snippets/php-mode/logger-error
new file mode 100644
index 0000000..19344aa
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/logger-error
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: logger-error
+# key: le
+# --
+logger()->error('$1'${2:, [ $3 ]}); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/logger-info b/emacs/.emacs.d/snippets/php-mode/logger-info
new file mode 100644
index 0000000..9491d24
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/logger-info
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: logger.info
+# key: li
+# --
+logger()->info('$1'${2:, [ $3 ]}); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/logger-warning b/emacs/.emacs.d/snippets/php-mode/logger-warning
new file mode 100644
index 0000000..3945490
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/logger-warning
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: logger.warning
+# key: lw
+# --
+logger()->warning('$1'${2, [ $3 ]}); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/mark-test-skipped b/emacs/.emacs.d/snippets/php-mode/mark-test-skipped
new file mode 100644
index 0000000..ce4761d
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/mark-test-skipped
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: mark test skipped
+# key: @s
+# condition: (string-suffix-p "Test.php" buffer-file-name)
+# --
+$this->markTestSkipped("${1:Don't skip your tests.}"); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/namespace b/emacs/.emacs.d/snippets/php-mode/namespace
new file mode 100644
index 0000000..7a5b5e1
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/namespace
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: namespace
+# key: ns
+# --
+namespace ${1:`(oni-php-generate-namespace)`}; \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/php b/emacs/.emacs.d/snippets/php-mode/php
new file mode 100644
index 0000000..12f7492
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/php
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: <?php
+# key: php
+# --
+<?php
diff --git a/emacs/.emacs.d/snippets/php-mode/phpstan-ignore b/emacs/.emacs.d/snippets/php-mode/phpstan-ignore
new file mode 100644
index 0000000..91439ba
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/phpstan-ignore
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: phpstan-ignore
+# key: @i
+# --
+/** @phpstan-ignore $1 */ \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/strict-types b/emacs/.emacs.d/snippets/php-mode/strict-types
new file mode 100644
index 0000000..bdcf3f9
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/strict-types
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: strict-types
+# key: strict-types
+# --
+declare(strict_types=1); \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/test-class b/emacs/.emacs.d/snippets/php-mode/test-class
new file mode 100644
index 0000000..de3bd3f
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/test-class
@@ -0,0 +1,14 @@
+# -*- mode: snippet -*-
+# name: test-class
+# key: test
+# --
+
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Tests\TestCase;
+
+class ${1:`(file-name-sans-extension (file-name-nondirectory (buffer-file-name)))`} extends TestCase
+{
+ use RefreshDatabase;
+
+ $0
+} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/test-comment b/emacs/.emacs.d/snippets/php-mode/test-comment
new file mode 100644
index 0000000..b1c9dfb
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/test-comment
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: test-comment
+# key: @t
+# --
+#[Test]
+public function $1(): void
+{
+ $0
+}
diff --git a/emacs/.emacs.d/snippets/php-mode/test-name b/emacs/.emacs.d/snippets/php-mode/test-name
new file mode 100644
index 0000000..2b9d72b
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/test-name
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: test-name
+# key: test
+# --
+public function test_$1(): void
+{
+ $0
+}
diff --git a/emacs/.emacs.d/snippets/php-mode/todo-comment b/emacs/.emacs.d/snippets/php-mode/todo-comment
new file mode 100644
index 0000000..a079ce8
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/todo-comment
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: todo-comment
+# key: /t
+# --
+`comment-start``(if (looking-back " " 2) " " "")`TODO: $0`comment-end` \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/var b/emacs/.emacs.d/snippets/php-mode/var
new file mode 100644
index 0000000..ce2b8fc
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/var
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: var
+# key: @v
+# --
+/** @var $1 `(save-excursion (and (search-forward "$" nil t) (symbol-at-point)))` */`(unless (looking-at (rx "\n")) "\n")` \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-mode/wpheader.php b/emacs/.emacs.d/snippets/php-mode/wpheader.php
new file mode 100644
index 0000000..2c70f93
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-mode/wpheader.php
@@ -0,0 +1,13 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: WP Plugin Header
+# key: header
+# --
+/*
+ * Plugin Name: $1
+ * Plugin URI: $2
+ * Description: $3
+ * Version: ${4:1.0}
+ * Author: ${5:Tom Willemse}
+ * Author URI: ${6:https://ryuslash.org}
+ * License: ${7:GPLv2}
+ */ \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/php-ts-mode/.yas-parents b/emacs/.emacs.d/snippets/php-ts-mode/.yas-parents
new file mode 100644
index 0000000..00d75e1
--- /dev/null
+++ b/emacs/.emacs.d/snippets/php-ts-mode/.yas-parents
@@ -0,0 +1 @@
+php-mode \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/defm_empty b/emacs/.emacs.d/snippets/python-mode/defm_empty
new file mode 100644
index 0000000..baa976e
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/defm_empty
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+# name: Empty Defmethod
+# key: defm
+# --
+def ${1:name}(self, *args, **kwargs):
+ '''$2'''
+ return super(${3:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).$1(*args, **kwargs) \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/form b/emacs/.emacs.d/snippets/python-mode/form
new file mode 100644
index 0000000..225d5e4
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/form
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Model Form
+# key: form
+# --
+class ${1:Model}Form(forms.ModelForm):
+ '''Form for the $1 model.'''
+
+ class Meta:
+ model = $1 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/form_valid b/emacs/.emacs.d/snippets/python-mode/form_valid
new file mode 100644
index 0000000..c5a7e58
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/form_valid
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: Record form
+# key: defm
+# --
+@record_activity(model=${1:`(progn (re-search-backward "^[ \t]*model = \\([a-zA-Z_].*\\)$") (match-string 1))`})
+def form_valid(self, form):
+ '''Make sure any changes to the $1 model get logged.'''
+ return super(${2:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).form_valid(form) \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/form_valid_with_return b/emacs/.emacs.d/snippets/python-mode/form_valid_with_return
new file mode 100644
index 0000000..fac23bc
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/form_valid_with_return
@@ -0,0 +1,8 @@
+# -*- mode: snippet -*-
+# name: form_valid with return
+# key: formvalid
+# --
+def form_valid(self, form):
+ rv = super(`(let ((name (python-info-current-defun))) (substring name 0 (cl-position ?. name)))`, self).form_valid(form)
+ $0
+ return rv \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/import_from b/emacs/.emacs.d/snippets/python-mode/import_from
new file mode 100644
index 0000000..d9cc4e2
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/import_from
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# name: from ... import ...
+# contributor: Tom Willemse
+# key: from
+# --
+from ${1:module} import ${2:class_or_module}
diff --git a/emacs/.emacs.d/snippets/python-mode/method b/emacs/.emacs.d/snippets/python-mode/method
new file mode 100644
index 0000000..7c033cf
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/method
@@ -0,0 +1,7 @@
+# -*- mode: snippet -*-
+# name: method
+# key: defm
+# --
+def $1(self$2):
+ '''$3'''
+ $0 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/permission_guard b/emacs/.emacs.d/snippets/python-mode/permission_guard
new file mode 100644
index 0000000..ab53895
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/permission_guard
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: Permission guard
+# key: defm
+# --
+@method_decorator(permission_required('$1',
+ raise_exception=True))
+def dispatch(self, *args, **kwargs):
+ '''Make sure the user has the $1 permission.'''
+ return super(${3:`(progn (re-search-backward "^[ \t]*class \\(.+\\)(") (match-string 1)))`}, self).dispatch(*args, **kwargs) \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/python-mode/url b/emacs/.emacs.d/snippets/python-mode/url
new file mode 100644
index 0000000..00ade72
--- /dev/null
+++ b/emacs/.emacs.d/snippets/python-mode/url
@@ -0,0 +1,5 @@
+# -*- mode: snippet -*-
+# name: url
+# key: url
+# --
+url(r'^$1', $2, name='$3'), \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/ProductSeed b/emacs/.emacs.d/snippets/ruby-mode/ProductSeed
new file mode 100644
index 0000000..7e836c2
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/ProductSeed
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: ProductSeed
+# key: pseed
+# --
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: '$3', price: '$4') \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHW b/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHW
new file mode 100644
index 0000000..843b32e
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHW
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: ProductSeedWithHW
+# key: pseed
+# --
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: '$3', price: '$4', width_in_cm: '$5', height_in_cm: '$6', width_in_mm: '${5:$(round (* 10 (string-to-int yas-text)))}', height_in_mm: '${6:$(round (* 10 (string-to-int yas-text)))}') \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHWGroup b/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHWGroup
new file mode 100644
index 0000000..25594c5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/ProductSeedHWGroup
@@ -0,0 +1,8 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: ProductSeedWithHWGroup
+# key: pseed
+# --
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: 'Small', price: '20.00', width_in_cm: '25.00', height_in_cm: '21.00', width_in_mm: '250', height_in_mm: '210')
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: 'Medium', price: '20.00', width_in_cm: '30.00', height_in_cm: '25.80', width_in_mm: '300', height_in_mm: '258')
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: 'Large', price: '20.00', width_in_cm: '35.00', height_in_cm: '30.00', width_in_mm: '350', height_in_mm: '300')
+Product.find_or_create_by_name(parent_id: $1, name: '$2', description: 'Extra large', price: '20.00', width_in_cm: '40.00', height_in_cm: '34.00', width_in_mm: '400', height_in_mm: '340')
diff --git a/emacs/.emacs.d/snippets/ruby-mode/describe b/emacs/.emacs.d/snippets/ruby-mode/describe
new file mode 100644
index 0000000..acd3a6b
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/describe
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: describe
+# key: desc
+# --
+describe '$1' do
+ $0
+end \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/do b/emacs/.emacs.d/snippets/ruby-mode/do
new file mode 100644
index 0000000..3c556fc
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/do
@@ -0,0 +1,6 @@
+# -*- mode: snippet -*-
+# name: do
+# key: do
+# --
+do$0
+end \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/factory b/emacs/.emacs.d/snippets/ruby-mode/factory
new file mode 100644
index 0000000..619b2e5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/factory
@@ -0,0 +1,9 @@
+# -*- mode: snippet -*-
+# name: factory
+# key: factory
+# --
+FactoryGirl.define do
+ factory :${1:`(file-name-sans-extension (file-name-nondirectory buffer-file-name))`} do
+ $0
+ end
+end \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/fill_in b/emacs/.emacs.d/snippets/ruby-mode/fill_in
new file mode 100644
index 0000000..854b029
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/fill_in
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: fill_in
+# key: fin
+# --
+fill_in '$1', with: $2 \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/mod b/emacs/.emacs.d/snippets/ruby-mode/mod
new file mode 100644
index 0000000..9af7d23
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/mod
@@ -0,0 +1,11 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: module ... end
+# key: mod
+# group: definitions
+# --
+module ${1:`(let ((fn (capitalize (file-name-nondirectory
+ (directory-file-name
+ default-directory)))))
+ (replace-regexp-in-string "_" "" fn t t))`}
+ $0
+end \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/ruby-mode/reduce b/emacs/.emacs.d/snippets/ruby-mode/reduce
new file mode 100644
index 0000000..3d4bfe4
--- /dev/null
+++ b/emacs/.emacs.d/snippets/ruby-mode/reduce
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: reduce
+# key: reduce
+# --
+reduce { |a, e| $0 } \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/_self b/emacs/.emacs.d/snippets/twig-mode/_self
new file mode 100644
index 0000000..c441690
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/_self
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: _self
+# key: _self
+# --
+{% import _self as ${1:`(file-name-nondirectory (file-name-sans-extension buffer-file-name))`} %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/blk b/emacs/.emacs.d/snippets/twig-mode/blk
new file mode 100644
index 0000000..bb100a3
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/blk
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: block
+# key: blk
+# --
+{% block $1 %}
+ $0
+{% endblock %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/def b/emacs/.emacs.d/snippets/twig-mode/def
new file mode 100644
index 0000000..78dead4
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/def
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: default value
+# key: def
+# --
+{% if $1 is not defined %}
+ {% set $1 = $2 %}
+{% endif %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/ext b/emacs/.emacs.d/snippets/twig-mode/ext
new file mode 100644
index 0000000..501cae8
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/ext
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: extends
+# key: ext
+# --
+{% extends "$1" %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/for b/emacs/.emacs.d/snippets/twig-mode/for
new file mode 100644
index 0000000..01c0cc5
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/for
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: for
+# key: for
+# --
+{% for $1 in $2 %}
+ `yas-selected-text`$0
+{% endfor %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/if b/emacs/.emacs.d/snippets/twig-mode/if
new file mode 100644
index 0000000..a9385d9
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/if
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: if
+# key: if
+# --
+{% if $1 %}
+ $0
+{% endif %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/ife b/emacs/.emacs.d/snippets/twig-mode/ife
new file mode 100644
index 0000000..a4d18f3
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/ife
@@ -0,0 +1,9 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: if...else
+# key: ife
+# --
+{% if $1 %}
+ $0
+{% else %}
+
+{% endif %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/iif b/emacs/.emacs.d/snippets/twig-mode/iif
new file mode 100644
index 0000000..df26b61
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/iif
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: Inline if
+# key: iif
+# --
+{% if $1 %}$0{% endif %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/imp b/emacs/.emacs.d/snippets/twig-mode/imp
new file mode 100644
index 0000000..01ceb69
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/imp
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: import
+# key: imp
+# --
+{% import "${1:module}" as ${1:$(if (string-match "/\\\\([^/]*\\\\)$" yas-text)
+ (match-string 1 yas-text)
+ yas-text)} %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/mac b/emacs/.emacs.d/snippets/twig-mode/mac
new file mode 100644
index 0000000..d4e480a
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/mac
@@ -0,0 +1,7 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: macro
+# key: mac
+# --
+{% macro ${1:name}(${2:args}) %}
+ $0
+{% endmacro %} \ No newline at end of file
diff --git a/emacs/.emacs.d/snippets/twig-mode/set b/emacs/.emacs.d/snippets/twig-mode/set
new file mode 100644
index 0000000..715c828
--- /dev/null
+++ b/emacs/.emacs.d/snippets/twig-mode/set
@@ -0,0 +1,5 @@
+# -*- mode: snippet; require-final-newline: nil -*-
+# name: set
+# key: set
+# --
+{% set $1 = $2 %} \ No newline at end of file