;;; feature/snippets/autoload/snippets.el -*- lexical-binding: t; -*- ;; ;; Commands ;; ;;;###autoload (defun +snippets/goto-start-of-field () "Go to the beginning of the current field." (interactive) (let* ((snippet (car (yas-active-snippets))) (active-field (yas--snippet-active-field snippet)) (position (if (yas--field-p active-field) (yas--field-start active-field) -1))) (if (= (point) position) (move-beginning-of-line 1) (goto-char position)))) ;;;###autoload (defun +snippets/goto-end-of-field () "Go to the end of the current field." (interactive) (let* ((snippet (car (yas-active-snippets))) (active-field (yas--snippet-active-field snippet)) (position (if (yas--field-p active-field) (yas--field-end active-field) -1))) (if (= (point) position) (move-end-of-line 1) (goto-char position)))) ;;;###autoload (defun +snippets/delete-backward-char (&optional field) "Prevents Yas from interfering with backspace deletion." (interactive) (let ((field (or field (and (overlayp yas--active-field-overlay) (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field))))) (unless (and (yas--field-p field) (eq (point) (marker-position (yas--field-start field)))) (call-interactively #'delete-backward-char)))) ;;;###autoload (defun +snippets/delete-forward-char-or-field (&optional field) "Delete forward, or skip the current field if it's empty. This is to prevent buggy behavior when is pressed in an empty field." (interactive) (let ((field (or field (and yas--active-field-overlay (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field))))) (cond ((not (yas--field-p field)) (delete-char 1)) ((and (not (yas--field-modified-p field)) (eq (point) (marker-position (yas--field-start field)))) (yas--skip-and-clear field) (yas-next-field 1)) ((eq (point) (marker-position (yas--field-end field))) nil) ((delete-char 1))))) ;;;###autoload (defun +snippets/delete-to-start-of-field (&optional field) "Delete to start-of-field." (interactive) (unless field (setq field (and (overlayp yas--active-field-overlay) (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field)))) (when (yas--field-p field) (let ((sof (marker-position (yas--field-start field)))) (when (and field (> (point) sof)) (delete-region sof (point)))))) ;; ;; Hooks ;; ;;;###autoload (defun +snippets|enable-project-modes (mode &rest _) "Automatically enable snippet libraries for project minor modes defined with `def-project-mode!'." (if (symbol-value mode) (yas-activate-extra-mode mode) (yas-deactivate-extra-mode mode)))