yas/compile-directory: now works :-)

This commit is contained in:
João Távora 2012-04-21 11:58:50 +01:00
parent 9dedf91209
commit 0bdb370c06

View File

@ -1604,39 +1604,13 @@ TEMPLATES is a list of `yas/template'."
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Loading snippets from files ;; Loading snippets from files
;; ;;
(defun yas/load-directory-1 (directory mode-sym &optional no-compiled-snippets) (defun yas/load-yas-setup-file (file)
"Recursively load snippet templates from DIRECTORY." (load file 'noerror))
(unless (file-exists-p (concat directory "/" ".yas-skip"))
;; Load .yas-setup.el files wherever we find them
;;
(load (expand-file-name ".yas-setup" directory) 'noerror)
(if (and (not no-compiled-snippets)
(load (expand-file-name ".yas-compiled-snippets" directory) 'noerror))
(message "[yas] Loading much faster .yas-compiled-snippets from %s" directory)
(let* ((default-directory directory)
(snippet-defs nil))
;; load the snippet files
;;
(with-temp-buffer
(dolist (file (yas/subdirs directory 'no-subdirs-just-files))
(when (file-readable-p file)
(insert-file-contents file nil nil nil t)
(push (yas/parse-template file)
snippet-defs))))
(when snippet-defs
(yas/define-snippets mode-sym
snippet-defs))
;; now recurse to a lower level
;;
(dolist (subdir (yas/subdirs directory))
(yas/load-directory-1 subdir
mode-sym
t))))))
(defun yas/load-directory (top-level-dir) (defun yas/load-directory (top-level-dir &optional nojit)
"Load snippet definition from directory hierarchy under TOP-LEVEL-DIR. "Load snippet definition from directory hierarchy under TOP-LEVEL-DIR.
Below TOP-LEVEL-DIR., each directory is a mode name." Below TOP-LEVEL-DIR each directory is a mode name."
(interactive "DSelect the root directory: ") (interactive "DSelect the root directory: ")
(unless (file-directory-p top-level-dir) (unless (file-directory-p top-level-dir)
(error "%s is not a directory" top-level-dir)) (error "%s is not a directory" top-level-dir))
@ -1647,17 +1621,50 @@ Below TOP-LEVEL-DIR., each directory is a mode name."
(concat dir "/dummy"))) (concat dir "/dummy")))
(mode-sym (car major-mode-and-parents)) (mode-sym (car major-mode-and-parents))
(parents (cdr major-mode-and-parents))) (parents (cdr major-mode-and-parents)))
(puthash mode-sym (remove-duplicates (let ((form `(yas/load-directory-1 ,dir
(append parents ',mode-sym
(gethash mode-sym yas/parents))) ',parents)))
yas/parents) (if (or (called-interactively-p)
(yas/schedule-jit mode-sym nojit)
`(yas/load-directory-1 ,dir (eval form)
',mode-sym)))) (yas/schedule-jit mode-sym form)))))
(when (interactive-p) (when (interactive-p)
(yas/message 3 "Loaded snippets from %s." top-level-dir))) (yas/message 3 "Loaded snippets from %s." top-level-dir)))
(defun yas/load-snippet-dirs () (defun yas/load-directory-1 (directory mode-sym parents &optional no-compiled-snippets)
"Recursively load snippet templates from DIRECTORY."
(unless (file-exists-p (concat directory "/" ".yas-skip"))
(if (and (not no-compiled-snippets)
(load (expand-file-name ".yas-compiled-snippets" directory) 'noerror))
(message "[yas] Loading much faster .yas-compiled-snippets from %s" directory)
(yas/load-directory-2 directory mode-sym parents))))
(defun yas/load-directory-2 (directory mode-sym parents)
(yas/define-parents mode-sym parents)
;; Load .yas-setup.el files wherever we find them
;;
(yas/load-yas-setup-file (expand-file-name ".yas-setup" directory))
(let* ((default-directory directory)
(snippet-defs nil))
;; load the snippet files
;;
(with-temp-buffer
(dolist (file (yas/subdirs directory 'no-subdirs-just-files))
(when (file-readable-p file)
(insert-file-contents file nil nil nil t)
(push (yas/parse-template file)
snippet-defs))))
(when snippet-defs
(yas/define-snippets mode-sym
snippet-defs))
;; now recurse to a lower level
;;
(dolist (subdir (yas/subdirs directory))
(yas/load-directory-2 subdir
mode-sym
nil))))
(defun yas/load-snippet-dirs (&optional nojit)
"Reload the directories listed in `yas/snippet-dirs' or "Reload the directories listed in `yas/snippet-dirs' or
prompt the user to select one." prompt the user to select one."
(let (errors) (let (errors)
@ -1665,14 +1672,14 @@ Below TOP-LEVEL-DIR., each directory is a mode name."
(dolist (directory (reverse (yas/snippet-dirs))) (dolist (directory (reverse (yas/snippet-dirs)))
(condition-case oops (condition-case oops
(progn (progn
(yas/load-directory directory) (yas/load-directory directory nojit)
(yas/message 3 "Loaded %s" directory)) (yas/message 3 "Loaded %s" directory))
(error (push oops errors) (error (push oops errors)
(yas/message 3 "Check your `yas/snippet-dirs': %s" (second oops))))) (yas/message 3 "Check your `yas/snippet-dirs': %s" (second oops)))))
(call-interactively 'yas/load-directory)) (call-interactively 'yas/load-directory))
errors)) errors))
(defun yas/reload-all (&optional with-jit) (defun yas/reload-all (&optional nojit)
"Reload all snippets and rebuild the YASnippet menu. " "Reload all snippets and rebuild the YASnippet menu. "
(interactive "p") (interactive "p")
(let ((errors)) (let ((errors))
@ -1695,7 +1702,7 @@ Below TOP-LEVEL-DIR., each directory is a mode name."
;; Reload the directories listed in `yas/snippet-dirs' or prompt ;; Reload the directories listed in `yas/snippet-dirs' or prompt
;; the user to select one. ;; the user to select one.
;; ;;
(setq errors (yas/load-snippet-dirs)) (setq errors (yas/load-snippet-dirs nojit))
;; Reload the direct keybindings ;; Reload the direct keybindings
;; ;;
(yas/direct-keymaps-reload) (yas/direct-keymaps-reload)
@ -1717,62 +1724,56 @@ foo\"bar\\! -> \"foo\\\"bar\\\\!\""
"For backward compatibility, enable `yas/minor-mode' globally" "For backward compatibility, enable `yas/minor-mode' globally"
(yas/global-mode 1)) (yas/global-mode 1))
(defun yas/compile-top-level-dir (top-level-dir) (defun yas/compile-directory (top-level-dir)
"Create .yas-compiled-snippets.el files under subdirs of TOP-LEVEL-DIR." "Create .yas-compiled-snippets.el files under subdirs of TOP-LEVEL-DIR.
This works by stubbing a few functions, then calling
`yas/load-directory'."
(interactive "DTop level snippet directory?") (interactive "DTop level snippet directory?")
(dolist (dir (yas/subdirs top-level-dir)) (flet ((yas/load-yas-setup-file
(yas/compile-snippets dir))) (file)
(let ((elfile (concat file ".el")))
(defun yas/compile-snippets (input-dir &optional output-file) (when (file-exists-p elfile)
"Compile snippets files in INPUT-DIR to OUTPUT-FILE file. (insert ";;; .yas-setup.el support file if any:\n;;;\n")
(insert-file-contents elfile))))
Prompts for INPUT-DIR and OUTPUT-FILE if called-interactively" (yas/define-parents
(interactive (let* ((input-dir (read-directory-name "Snippet dir ")) (mode parents)
(output-file (let ((ido-everywhere nil)) (insert ";;; Parent definitions:\n;;;\n")
(read-file-name "Output file " (insert (pp-to-string `(yas/define-parents ',mode ',parents))))
input-dir nil nil (yas/define-snippets
".yas-compiled-snippets.el" (mode snippets)
nil)))) (insert ";;; Snippet definitions:\n;;;\n")
(list input-dir output-file))) (let ((literal-snippets (list)))
(let ((default-directory input-dir)) (dolist (snippet snippets)
(with-temp-file (setq output-file (or output-file ".yas-compiled-snippets.el")) (let ((key (first snippet))
(flet ((yas/define-snippets (template-content (second snippet))
(mode snippets) (name (third snippet))
(insert (format ";;; %s - automatically compiled snippets for `%s' , do not edit!\n" (condition (fourth snippet))
(file-name-nondirectory output-file) mode)) (group (fifth snippet))
(insert ";;;\n") (expand-env (sixth snippet))
(let ((literal-snippets (list))) (file nil) ;; (seventh snippet)) ;; omit on purpose
(dolist (snippet snippets) (binding (eighth snippet))
(let ((key (first snippet)) (uuid (ninth snippet)))
(template-content (second snippet)) (push `(,key
(name (third snippet)) ,template-content
(condition (fourth snippet)) ,name
(group (fifth snippet)) ,condition
(expand-env (sixth snippet)) ,group
(file nil) ;; (seventh snippet)) ;; omit on purpose ,expand-env
(binding (eighth snippet)) ,file
(uuid (ninth snippet))) ,binding
(push `(,key ,uuid)
,template-content literal-snippets)))
,name (insert (pp-to-string `(yas/define-snippets ',mode ',literal-snippets)))
,condition (insert "\n\n")))
,group (yas/load-directory-1
,expand-env (dir mode parents &rest ignore)
,file (let ((output-file (concat (file-name-as-directory dir) ".yas-compiled-snippets.el")))
,binding (with-temp-file output-file
,uuid) (insert (format ";;; Compiled snippets and support files for `%s'\n" mode))
literal-snippets))) (yas/load-directory-2 dir mode parents)
(insert (pp-to-string `(yas/define-snippets ',mode ',literal-snippets ',parent-or-parents))) (insert (format ";;; Do not edit! File generated at %s\n" (current-time-string)))))))
(insert "\n\n") (yas/load-directory top-level-dir 'im-compiling-so-no-jit-ok?)))
(insert (format ";;; %s - automatically compiled snippets for `%s' end here\n"
(file-name-nondirectory output-file) mode))
(insert ";;;"))))
(yas/load-directory-1 input-dir nil 'no-compiled-snippets))))
(if (and (called-interactively-p)
(yes-or-no-p (format "Open the resulting file (%s)? "
(expand-file-name output-file))))
(find-file-other-window output-file)))
;;; JIT loading ;;; JIT loading
@ -1798,6 +1799,13 @@ Prompts for INPUT-DIR and OUTPUT-FILE if called-interactively"
yas/version yas/version
") -- pluskid <pluskid@gmail.com>/joaotavora <joaotavora@gmail.com>"))) ") -- pluskid <pluskid@gmail.com>/joaotavora <joaotavora@gmail.com>")))
(defun yas/define-parents (mode parents)
"Add PARENTS to the list of MODE's parents"
(puthash mode-sym (remove-duplicates
(append parents
(gethash mode-sym yas/parents)))
yas/parents))
(defun yas/define-snippets (mode snippets) (defun yas/define-snippets (mode snippets)
"Define SNIPPETS for MODE. "Define SNIPPETS for MODE.