From e9406f51266f9b9179f475886fa4ec78f1ccba44 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 8 May 2016 15:32:20 -0400 Subject: [PATCH] Document $> and fix escaping * doc/snippet-development.org: New "Indentation markers" section. * yasnippet-tests.el (indentation-markers): New test. * yasnippet.el (yas--indent-markers): New variable. (yas--indent): Use it instead of searching for $> directly. (yas--indent-parse-create): New function, records occurences of $> into `yas--indent-markers'. (yas--snippet-parse-create): Call it. --- doc/snippet-development.org | 6 ++++++ yasnippet-tests.el | 13 +++++++++++++ yasnippet.el | 27 +++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/doc/snippet-development.org b/doc/snippet-development.org index 768684c6c..c79248376 100644 --- a/doc/snippet-development.org +++ b/doc/snippet-development.org @@ -422,3 +422,9 @@ the exit marker. By the way, =C-d= will only clear the field if you cursor is at the beginning of the field /and/ it hasn't been changed yet. Otherwise, it performs the normal Emacs =delete-char= command. + +** Indentation markers + +If [[sym:yas-indent-line][=yas-indent-line=]] is *not* set to '=auto=, it's still possible to +indent specific lines by adding an indentation marker, =$>=, somewhere +on the line. diff --git a/yasnippet-tests.el b/yasnippet-tests.el index 8ba4632d3..9d2074aa4 100644 --- a/yasnippet-tests.el +++ b/yasnippet-tests.el @@ -215,6 +215,19 @@ end" (buffer-string))) end" (buffer-string))) (should (= 4 (current-column))))) +(ert-deftest indentation-markers () + "Test a snippet with indentation markers (`$<')." + (with-temp-buffer + (ruby-mode) + (yas-minor-mode 1) + (set (make-local-variable 'yas-indent-line) nil) + (yas-expand-snippet "def ${1:method}${2:(${3:args})}\n$>Indent\nNo indent\\$>\nend") + (should (string= "def method(args) + Indent +No indent$> +end" (buffer-string))))) + + (ert-deftest navigate-a-snippet-with-multiline-mirrors-issue-665 () "In issue 665, a multi-line mirror is attempted. diff --git a/yasnippet.el b/yasnippet.el index 2da30625d..4f8bc7630 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -3826,6 +3826,9 @@ cons cells to this var.") backquoted Lisp expressions should be inserted at the end of expansion.") +(defvar yas--indent-markers nil + "List of markers for manual indentation.") + (defun yas--snippet-parse-create (snippet) "Parse a recently inserted snippet template, creating all necessary fields, mirrors and exit points. @@ -3845,6 +3848,9 @@ Meant to be called in a narrowed buffer, does various passes" ;; protect escaped characters ;; (yas--protect-escapes) + ;; Parse indent markers: `$>'. + (goto-char parse-start) + (yas--indent-parse-create snippet) ;; parse fields with {} ;; (goto-char parse-start) @@ -3932,14 +3938,17 @@ The SNIPPET's markers are preserved." (defvar yas--indent-original-column nil) (defun yas--indent (snippet) - ;; Look for those `$>'. + ;; Indent lines that had indent markers (`$>') on them. (save-excursion - (while (re-search-forward "$>" nil t) - (delete-region (match-beginning 0) (match-end 0)) + (dolist (marker yas--indent-markers) (unless (eq yas-indent-line 'auto) + (goto-char marker) (yas--indent-region (line-beginning-position) (line-end-position) - snippet)))) + snippet)) + ;; Finished with this marker. + (set-marker marker nil)) + (setq yas--indent-markers nil)) ;; Now do stuff for `fixed' and `auto'. (save-excursion (cond ((eq yas-indent-line 'fixed) @@ -4045,6 +4054,16 @@ with their evaluated value into `yas--backquote-markers-and-strings'." (set-marker-insertion-type marker nil) marker)) +(defun yas--indent-parse-create (snippet) + "Parse the \"$>\" indentation markers in SNIPPET." + (setq yas--indent-markers ()) + (while (search-forward "$>" nil t) + (delete-region (match-beginning 0) (match-end 0)) + ;; Mark the beginning of the line. + (push (yas--make-marker (line-beginning-position)) + yas--indent-markers)) + (setq yas--indent-markers (nreverse yas--indent-markers))) + (defun yas--field-parse-create (snippet &optional parent-field) "Parse most field expressions in SNIPPET, except for the simple one \"$n\". -- 2.39.2