don't kill snippet buffer unless saved

Split the quit-window part of yas-load-snippet-buffer into
yas-load-snippet-buffer-and-close, and only quit if the snippet was
saved.

This resolves #417, where you could lose a snippet by giving the wrong
answer in a prompt.
This commit is contained in:
Noam Postavsky 2013-10-26 12:11:04 -04:00
parent 32ee5cbde5
commit ffd497d541

View File

@ -837,7 +837,8 @@ Honour `yas-dont-activate', which see."
(when (third ent) (when (third ent)
(define-key map (third ent) (second ent))) (define-key map (third ent) (second ent)))
(vector (first ent) (second ent) t)) (vector (first ent) (second ent) t))
'(("Load this snippet" yas-load-snippet-buffer "\C-c\C-c") '(("Load this snippet" yas-load-snippet-buffer "\C-c\C-l")
("Load and quit window" yas-load-snippet-buffer-and-close "\C-c\C-c")
("Try out this snippet" yas-tryout-snippet "\C-c\C-t"))))) ("Try out this snippet" yas-tryout-snippet "\C-c\C-t")))))
map) map)
"The keymap used when `snippet-mode' is active.") "The keymap used when `snippet-mode' is active.")
@ -2527,7 +2528,9 @@ neither do the elements of PARENTS."
TABLE is a symbol naming a passed to `yas--table-get-create'. TABLE is a symbol naming a passed to `yas--table-get-create'.
When called interactively, prompt for the table name and When called interactively, prompt for the table name and
whether (and where) to save the snippet, then quit the window." whether (and where) to save the snippet.
Returns the name of the file saved (if any)."
(interactive (list (yas--read-table) t)) (interactive (list (yas--read-table) t))
(cond (cond
;; We have `yas--editing-template', this buffer's content comes from a ;; We have `yas--editing-template', this buffer's content comes from a
@ -2547,35 +2550,42 @@ whether (and where) to save the snippet, then quit the window."
(yas--define-snippets-1 (yas--parse-template buffer-file-name) (yas--define-snippets-1 (yas--parse-template buffer-file-name)
table))))) table)))))
(when (and interactive (prog1
(or (when (and interactive
;; Only offer to save this if it looks like a library or new (or
;; snippet (loaded from elisp, from a dir in `yas-snippet-dirs' ;; Only offer to save this if it looks like a library or new
;; which is not the first, or from an unwritable file) ;; snippet (loaded from elisp, from a dir in `yas-snippet-dirs'
;; ;; which is not the first, or from an unwritable file)
(not (yas--template-file yas--editing-template)) ;;
(not (file-writable-p (yas--template-file yas--editing-template))) (not (yas--template-file yas--editing-template))
(and (listp yas-snippet-dirs) (not (file-writable-p (yas--template-file yas--editing-template)))
(second yas-snippet-dirs) (and (listp yas-snippet-dirs)
(not (string-match (expand-file-name (first yas-snippet-dirs)) (second yas-snippet-dirs)
(yas--template-file yas--editing-template))))) (not (string-match (expand-file-name (first yas-snippet-dirs))
(y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? "))) (yas--template-file yas--editing-template)))))
(let* ((option (first (yas--guess-snippet-directories (yas--template-table yas--editing-template)))) (y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? ")))
(chosen (and option (let* ((option (first (yas--guess-snippet-directories (yas--template-table yas--editing-template))))
(yas--make-directory-maybe option)))) (chosen (and option
(when chosen (yas--make-directory-maybe option))))
(let ((default-file-name (or (and (yas--template-file yas--editing-template) (when chosen
(file-name-nondirectory (yas--template-file yas--editing-template))) (let ((default-file-name (or (and (yas--template-file yas--editing-template)
(yas--template-name yas--editing-template)))) (file-name-nondirectory (yas--template-file yas--editing-template)))
(write-file (concat chosen "/" (yas--template-name yas--editing-template))))
(read-from-minibuffer (format "File name to create in %s? " chosen) (write-file (concat chosen "/"
default-file-name))) (read-from-minibuffer (format "File name to create in %s? " chosen)
(setf (yas--template-file yas--editing-template) buffer-file-name))))) default-file-name)))
(when interactive (setf (yas--template-file yas--editing-template) buffer-file-name)))))
(yas--message 3 "Snippet \"%s\" loaded for %s." (when interactive
(yas--template-name yas--editing-template) (yas--message 3 "Snippet \"%s\" loaded for %s."
(yas--table-name (yas--template-table yas--editing-template))) (yas--template-name yas--editing-template)
(quit-window interactive))) (yas--table-name (yas--template-table yas--editing-template))))))
(defun yas-load-snippet-buffer-and-close (table &optional kill interactive)
"Call `yas-load-snippet-buffer' and then `quit-window', prefix
argument KILL passed to `quit-window'."
(interactive (list (yas--read-table) current-prefix-arg t))
(and (yas-load-snippet-buffer table interactive)
(quit-window kill)))
(defun yas-tryout-snippet (&optional debug) (defun yas-tryout-snippet (&optional debug)
"Test current buffer's snippet template in other buffer." "Test current buffer's snippet template in other buffer."