Simplify `yas-new-snippet' load&save logic

Two significant changes:

1. The criteria for offering to save in upon
   `yas-load-snippet-buffer-and-close' is much simplified, and relies
   on `buffer-modified-p' solely.

2. C-x C-s snippet after `yas-new-snippet' or `yas-visit-snippet'
   suggests at least a sensible directory.

Still missing in this commit is the suggestion for loading upon
saving. The `after-save-hook' could be used for something like that.

* yasnippet.el (yas-new-snippet): Set `default-directory' based on
result of `yas--guess-snippet-directories'.
(yas-load-snippet-buffer): Return template object.
(yas-load-snippet-buffer-and-close): Simplify.
(yas--visit-snippet-file-1): Also set `default-directory' here.
(yas--guess-snippet-directories-1): Return directory names, i.e., ending
in slash.
This commit is contained in:
João Távora 2016-05-23 13:18:49 +01:00 committed by Noam Postavsky
parent ea9581fb19
commit 0ee86a2d1e

View File

@ -2408,15 +2408,15 @@ visited file in `snippet-mode'."
(pp-to-string (yas--template-content template)) (pp-to-string (yas--template-content template))
(yas--template-content template)))) (yas--template-content template))))
(snippet-mode) (snippet-mode)
(set (make-local-variable 'yas--editing-template) template))))) (set (make-local-variable 'yas--editing-template) template)
(set (make-local-variable 'default-directory)
(car (cdr (car (yas--guess-snippet-directories (yas--template-table template))))))))))
(defun yas--guess-snippet-directories-1 (table) (defun yas--guess-snippet-directories-1 (table)
"Guess possible snippet subdirectories for TABLE." "Guess possible snippet subdirectories for TABLE."
(cons (yas--table-name table) (cons (file-name-as-directory (yas--table-name table))
(mapcan #'(lambda (parent) (cl-mapcan #'yas--guess-snippet-directories-1
(yas--guess-snippet-directories-1 (yas--table-parents table))))
parent))
(yas--table-parents table))))
(defun yas--guess-snippet-directories (&optional table) (defun yas--guess-snippet-directories (&optional table)
"Try to guess suitable directories based on the current active "Try to guess suitable directories based on the current active
@ -2483,6 +2483,7 @@ NO-TEMPLATE is non-nil."
(set (make-local-variable 'yas--guessed-modes) (mapcar #'(lambda (d) (set (make-local-variable 'yas--guessed-modes) (mapcar #'(lambda (d)
(yas--table-mode (car d))) (yas--table-mode (car d)))
guessed-directories)) guessed-directories))
(set (make-local-variable 'default-directory) (car (cdr (car guessed-directories))))
(if (and (not no-template) yas-new-snippet-default) (if (and (not no-template) yas-new-snippet-default)
(yas-expand-snippet yas-new-snippet-default)))) (yas-expand-snippet yas-new-snippet-default))))
@ -2549,7 +2550,8 @@ neither do the elements of PARENTS."
(defun yas-load-snippet-buffer (table &optional interactive) (defun yas-load-snippet-buffer (table &optional interactive)
"Parse and load current buffer's snippet definition into TABLE. "Parse and load current buffer's snippet definition into TABLE.
TABLE is a symbol name passed to `yas--table-get-create'. When TABLE is a symbol name passed to `yas--table-get-create'. When
called interactively, prompt for the table name." called interactively, prompt for the table name.
Return the `yas--template' object created"
(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
@ -2571,7 +2573,8 @@ called interactively, prompt for the table name."
(when interactive (when interactive
(yas--message 3 "Snippet \"%s\" loaded for %s." (yas--message 3 "Snippet \"%s\" loaded for %s."
(yas--template-name yas--editing-template) (yas--template-name yas--editing-template)
(yas--table-name (yas--template-table yas--editing-template))))) (yas--table-name (yas--template-table yas--editing-template))))
yas--editing-template)
(defun yas-load-snippet-buffer-and-close (table &optional kill) (defun yas-load-snippet-buffer-and-close (table &optional kill)
"Load and save the snippet, then `quit-window' if saved. "Load and save the snippet, then `quit-window' if saved.
@ -2584,31 +2587,18 @@ The prefix argument KILL is passed to `quit-window'.
Don't use this from a Lisp program, call `yas-load-snippet-buffer' Don't use this from a Lisp program, call `yas-load-snippet-buffer'
and `kill-buffer' instead." and `kill-buffer' instead."
(interactive (list (yas--read-table) current-prefix-arg)) (interactive (list (yas--read-table) current-prefix-arg))
(yas-load-snippet-buffer table t) (let ((template (yas-load-snippet-buffer table t)))
(let ((file (yas--template-get-file yas--editing-template))) (when (and (buffer-modified-p)
(when (and (or (y-or-n-p
;; Only offer to save this if it looks like a library or new (format "[yas] Loaded for %s. Also save snippet buffer?"
;; snippet (loaded from elisp, from a dir in `yas-snippet-dirs' (yas--table-name (yas--template-table template)))))
;; which is not the first, or from an unwritable file) (let ((default-directory (car (cdr (car (yas--guess-snippet-directories (yas--template-table template))))))
;; (default-file-name (yas--template-name template)))
(not file) (unless (or buffer-file-name (not default-file-name))
(not (file-writable-p file)) (setq buffer-file-name
(and (cdr-safe yas-snippet-dirs) (read-file-name "File to save snippet in: "
(not (string-prefix-p (expand-file-name (car yas-snippet-dirs)) file)))) nil nil nil default-file-name )))
(y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? "))) (save-buffer)))
(let* ((option (first (yas--guess-snippet-directories (yas--template-table yas--editing-template))))
(chosen (and option
(yas--make-directory-maybe option))))
(when chosen
(let ((default-file-name (or (and file (file-name-nondirectory file))
(yas--template-name yas--editing-template))))
(write-file (expand-file-name
(read-file-name (format "File name to create in %s? " chosen)
chosen default-file-name)
chosen))
(setf (yas--template-load-file yas--editing-template) buffer-file-name))))))
(when buffer-file-name
(save-buffer)
(quit-window kill))) (quit-window kill)))
(defun yas-tryout-snippet (&optional debug) (defun yas-tryout-snippet (&optional debug)