branch: master commit 6c3e0294dd9ae738e9ae08ba27351f7e301029e3 Merge: 3bb1515 5c76a0f Author: João Távora <joaotav...@gmail.com> Commit: João Távora <joaotav...@gmail.com>
Merge pull request #412 from npostavs/less-narrow Wait till after content insertion to narrow --- yasnippet-tests.el | 9 +++++++ yasnippet.el | 60 +++++++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/yasnippet-tests.el b/yasnippet-tests.el index c5d8738..fd75063 100644 --- a/yasnippet-tests.el +++ b/yasnippet-tests.el @@ -213,6 +213,15 @@ (yas-expand-snippet snippet) (should (string= (yas--buffer-contents) "#include <foo>\nmain"))))) +(ert-deftest middle-of-buffer-snippet-insertion () + (with-temp-buffer + (yas-minor-mode 1) + (insert "beginning") + (save-excursion (insert "end")) + (let ((snippet "-middle-")) + (yas-expand-snippet snippet)) + (should (string= (yas--buffer-contents) "beginning-middle-end")))) + (ert-deftest another-example-for-issue-271 () ;; expect this to fail in batch mode since `region-active-p' doesn't ;; used by `yas-expand-snippet' doesn't make sense in that context. diff --git a/yasnippet.el b/yasnippet.el index afa0a42..91aabd9 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -3509,24 +3509,20 @@ considered when expanding the snippet." ;; plain text will get recorded at the end. ;; ;; stacked expansion: also shoosh the overlay modification hooks - (save-restriction - (narrow-to-region start start) - (let ((buffer-undo-list t)) - ;; snippet creation might evaluate users elisp, which - ;; might generate errors, so we have to be ready to catch - ;; them mostly to make the undo information - ;; - (setq yas--start-column (save-restriction (widen) (current-column))) - (yas--inhibit-overlay-hooks - (setq snippet - (if expand-env - (eval `(let* ,expand-env - (let ((inhibit-modification-hooks t)) - (insert content)) - (yas--snippet-create (point-min)))) - (let ((inhibit-modification-hooks t)) - (insert content)) - (yas--snippet-create (point-min))))))) + (let ((buffer-undo-list t)) + ;; snippet creation might evaluate users elisp, which + ;; might generate errors, so we have to be ready to catch + ;; them mostly to make the undo information + ;; + (setq yas--start-column (current-column)) + (yas--inhibit-overlay-hooks + (setq snippet + (if expand-env + (eval `(let* ,expand-env + (insert content) + (yas--snippet-create start (point)))) + (insert content) + (yas--snippet-create start (point)))))) ;; stacked-expansion: This checks for stacked expansion, save the ;; `yas--previous-active-field' and advance its boundary. @@ -3604,25 +3600,27 @@ After revival, push the `yas--take-care-of-redo' in the (push `(apply yas--take-care-of-redo ,beg ,end ,snippet) buffer-undo-list)))) -(defun yas--snippet-create (begin) - "Create a snippet from a template inserted at BEGIN. +(defun yas--snippet-create (begin end) + "Create a snippet from a template inserted at BEGIN to END. Returns the newly created snippet." - (let ((snippet (yas--make-snippet))) - (goto-char begin) - (yas--snippet-parse-create snippet) + (save-restriction + (narrow-to-region begin end) + (let ((snippet (yas--make-snippet))) + (goto-char begin) + (yas--snippet-parse-create snippet) - ;; Sort and link each field - (yas--snippet-sort-fields snippet) + ;; Sort and link each field + (yas--snippet-sort-fields snippet) - ;; Create keymap overlay for snippet - (setf (yas--snippet-control-overlay snippet) - (yas--make-control-overlay snippet (point-min) (point-max))) + ;; Create keymap overlay for snippet + (setf (yas--snippet-control-overlay snippet) + (yas--make-control-overlay snippet (point-min) (point-max))) - ;; Move to end - (goto-char (point-max)) + ;; Move to end + (goto-char (point-max)) - snippet)) + snippet))) ;;; Apropos adjacencies and "fom's":