Mercurial > hg > dotemacs
changeset 141:ee4b6191b61e
packages: update yasnippet and deps
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/elpa/goto-last-change-1.2/goto-last-change-autoloads.el @@ -0,0 +1,25 @@ +;;; goto-last-change-autoloads.el --- automatically extracted autoloads +;; +;;; Code: +(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) + +;;;### (autoloads nil "goto-last-change" "goto-last-change.el" (22294 +;;;;;; 19053 52329 265000)) +;;; Generated autoloads from goto-last-change.el + +(autoload 'goto-last-change "goto-last-change" "\ +Set point to the position of the last change. +Consecutive calls set point to the position of the previous change. +With a prefix arg (optional arg MARK-POINT non-nil), set mark so \\[exchange-point-and-mark] +will return point to the current position. + +\(fn &optional MARK-POINT MINIMAL-LINE-DISTANCE)" t nil) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; End: +;;; goto-last-change-autoloads.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/goto-last-change-1.2/goto-last-change-pkg.el @@ -0,0 +1,1 @@ +(define-package "goto-last-change" "1.2" "Move point through buffer-undo-list positions" 'nil)
new file mode 100644 --- /dev/null +++ b/elpa/goto-last-change-1.2/goto-last-change.el @@ -0,0 +1,140 @@ +;;; goto-last-change.el --- Move point through buffer-undo-list positions -*-unibyte: t; coding: iso-8859-1;-*- + +;; Copyright 2003 Kevin Rodgers + +;; Author: Kevin Rodgers <ihs_4664@yahoo.com> +;; Created: 17 Jun 2003 +;; Version: 1.2 +;; Keywords: convenience + +;; Contributors: +;; Attila Lendvai <attila.lendvai@gmail.com> (line distance and auto marks) + +;; This program is free software; you can redistribute it and/or +;; modify it under the terms of the GNU General Public License as +;; published by the Free Software Foundation; either version 2 of +;; the License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be +;; useful, but WITHOUT ANY WARRANTY; without even the implied +;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +;; PURPOSE. See the GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public +;; License along with this program; if not, write to the Free +;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +;; MA 02111-1307 USA + +;;; Commentary: + +;; After installing goto-last-change.el in a `load-path' directory and +;; compiling it with `M-x byte-compile-file', load it with +;; (require 'goto-last-change) +;; or autoload it with +;; (autoload 'goto-last-change "goto-last-change" +;; "Set point to the position of the last change." t) +;; +;; You may also want to bind a key to `M-x goto-last-change', e.g. +;; (global-set-key "\C-x\C-\\" 'goto-last-change) + +;; goto-last-change.el was written in response to to the following: +;; +;; From: Dan Jacobson <jidanni@jidanni.org> +;; Newsgroups: gnu.emacs.bug +;; Subject: function to go to spot of last change +;; Date: Sun, 15 Jun 2003 00:15:08 +0000 (UTC) +;; Sender: news <news@main.gmane.org> +;; Message-ID: <mailman.7910.1055637181.21513.bug-gnu-emacs@gnu.org> +;; NNTP-Posting-Host: monty-python.gnu.org +;; +;; +;; Why of course, a function to get the user to the spot of last changes +;; in the current buffer(s?), that's what emacs must lack. +;; +;; How many times have you found yourself mosying [<-not in spell +;; checker!?] thru a file when you wonder, where the heck was I just +;; editing? Well, the best you can do is hit undo, ^F, and undo again, +;; to get back. Hence the "burning need" for the additional function, +;; which you might name the-jacobson-memorial-function, due to its brilliance. +;; -- +;; http://jidanni.org/ Taiwan(04)25854780 + +;;; Code: +(provide 'goto-last-change) + +(or (fboundp 'last) ; Emacs 20 + (require 'cl)) ; Emacs 19 + +(defvar goto-last-change-undo nil + "The `buffer-undo-list' entry of the previous \\[goto-last-change] command.") +(make-variable-buffer-local 'goto-last-change-undo) + +;;;###autoload +(defun goto-last-change (&optional mark-point minimal-line-distance) + "Set point to the position of the last change. +Consecutive calls set point to the position of the previous change. +With a prefix arg (optional arg MARK-POINT non-nil), set mark so \ +\\[exchange-point-and-mark] +will return point to the current position." + (interactive "P") + ;; (unless (buffer-modified-p) + ;; (error "Buffer not modified")) + (when (eq buffer-undo-list t) + (error "No undo information in this buffer")) + (when mark-point + (push-mark)) + (unless minimal-line-distance + (setq minimal-line-distance 10)) + (let ((position nil) + (undo-list (if (and (eq this-command last-command) + goto-last-change-undo) + (cdr (memq goto-last-change-undo buffer-undo-list)) + buffer-undo-list)) + undo) + (while (and undo-list + (or (not position) + (eql position (point)) + (and minimal-line-distance + ;; The first invocation always goes to the last change, subsequent ones skip + ;; changes closer to (point) then minimal-line-distance. + (memq last-command '(goto-last-change + goto-last-change-with-auto-marks)) + (< (count-lines (min position (point-max)) (point)) + minimal-line-distance)))) + (setq undo (car undo-list)) + (cond ((and (consp undo) (integerp (car undo)) (integerp (cdr undo))) + ;; (BEG . END) + (setq position (cdr undo))) + ((and (consp undo) (stringp (car undo))) ; (TEXT . POSITION) + (setq position (abs (cdr undo)))) + ((and (consp undo) (eq (car undo) t))) ; (t HIGH . LOW) + ((and (consp undo) (null (car undo))) + ;; (nil PROPERTY VALUE BEG . END) + (setq position (cdr (last undo)))) + ((and (consp undo) (markerp (car undo)))) ; (MARKER . DISTANCE) + ((integerp undo)) ; POSITION + ((null undo)) ; nil + (t (error "Invalid undo entry: %s" undo))) + (setq undo-list (cdr undo-list))) + (cond (position + (setq goto-last-change-undo undo) + (goto-char (min position (point-max)))) + ((and (eq this-command last-command) + goto-last-change-undo) + (setq goto-last-change-undo nil) + (error "No further undo information")) + (t + (setq goto-last-change-undo nil) + (error "Buffer not modified"))))) + +(defun goto-last-change-with-auto-marks (&optional minimal-line-distance) + "Calls goto-last-change and sets the mark at only the first invocations +in a sequence of invocations." + (interactive "P") + (goto-last-change (not (or (eq last-command 'goto-last-change-with-auto-marks) + (eq last-command t))) + minimal-line-distance)) + +;; (global-set-key "\C-x\C-\\" 'goto-last-change) + +;;; goto-last-change.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/nginx-mode-1.1/nginx-mode-autoloads.el @@ -0,0 +1,25 @@ +;;; nginx-mode-autoloads.el --- automatically extracted autoloads +;; +;;; Code: +(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) + +;;;### (autoloads nil "nginx-mode" "nginx-mode.el" (22108 42670 412832 +;;;;;; 144000)) +;;; Generated autoloads from nginx-mode.el + +(autoload 'nginx-mode "nginx-mode" "\ +Major mode for highlighting nginx config files. + +The variable nginx-indent-level controls the amount of indentation. +\\{nginx-mode-map} + +\(fn)" t nil) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; End: +;;; nginx-mode-autoloads.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/nginx-mode-1.1/nginx-mode-pkg.el @@ -0,0 +1,1 @@ +(define-package "nginx-mode" "1.1" "major mode for editing nginx config files" 'nil)
new file mode 100644 --- /dev/null +++ b/elpa/nginx-mode-1.1/nginx-mode.el @@ -0,0 +1,193 @@ +;;; nginx-mode.el --- major mode for editing nginx config files + +;; Copyright 2010 Andrew J Cosgriff <andrew@cosgriff.name> + +;; Author: Andrew J Cosgriff <andrew@cosgriff.name> +;; Maintainer: Andrew J Cosgriff <andrew@cosgriff.name> +;; Created: 15 Oct 2010 +;; Version: 1.1 +;; Keywords: nginx + +;; available from http://github.com/ajc/nginx-mode + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; This is a quick mode for editing Nginx config files, as I didn't find +;; anything else around that did quite this much. + +;; Many thanks to the authors of puppet-mode.el, from where I found a +;; useful indentation function that I've modified to suit this situation. + +;; Put this file into your load-path and the following into your ~/.emacs: +;; (require 'nginx-mode) + +;;; Code: + +(provide 'nginx-mode) + + +;;;;########################################################################## +;;;; User Options, Variables +;;;;########################################################################## + +(defcustom nginx-indent-level 4 + "*Indentation of Nginx statements." + :type 'integer :group 'nginx) + +(defcustom nginx-indent-tabs-mode nil + "*Indentation can insert tabs in nginx mode if this is non-nil." + :type 'boolean :group 'nginx) + + +(defvar nginx-font-lock-keywords + (list '("#.*" . font-lock-comment-face) + '("^\\([ \t]+\\)?\\([A-Za-z09_]+\\)" 2 font-lock-keyword-face t) + '(";$" . font-lock-pseudo-keyword-face) + ;; uncomment the next one if you want your eyes to bleed + ;; (it'll highlight parentheses and curly braces) + ;;'("\\(\{\\|\}\\|\(\\|\)\\)" . font-lock-pseudo-keyword-face) + '("^\\([ \t]+\\)?rewrite[ \t]+.+[ \t]+\\(permanent\\|redirect\\|break\\|last\\);$" 2 font-lock-operator-face) + '("\\(\$[0-9]+\\)[^0-9]" 1 font-lock-constant-face) + '("\$[A-Za-z0-9_\-]+" . font-lock-variable-name-face) + '("[ \t]+\\(on\\|off\\);$" 1 font-lock-constant-face) + '("[A-Za-z0-9_\-]+\\([ \t]+[^ \t\n]+\\)?[ \t]+\\([^ \t\n]+\\)[ \t]+{" 2 font-lock-operator-face))) + + +;;;;########################################################################## +;;;; Code +;;;;########################################################################## + +(defun nginx-block-indent () + "If point is in a block, return the indentation of the first line of that +block (the line containing the opening brace). Used to set the indentation +of the closing brace of a block." + (save-excursion + (save-match-data + (let ((opoint (point)) + (apoint (search-backward "{" nil t))) + (when apoint + ;; This is a bit of a hack and doesn't allow for strings. We really + ;; want to parse by sexps at some point. + (let ((close-braces (count-matches "}" apoint opoint)) + (open-braces 0)) + (while (and apoint (> close-braces open-braces)) + (setq apoint (search-backward "{" nil t)) + (when apoint + (setq close-braces (count-matches "}" apoint opoint)) + (setq open-braces (1+ open-braces))))) + (if apoint + (current-indentation) + nil)))))) + + +(defun nginx-comment-line-p () + "Return non-nil iff this line is a comment." + (save-excursion + (save-match-data + (beginning-of-line) + (looking-at "^\\s-*#")))) + +(defun nginx-indent-line () + "Indent current line as nginx code." + (interactive) + (beginning-of-line) + (if (bobp) + (indent-line-to 0) ; First line is always non-indented + (let ((not-indented t) + (block-indent (nginx-block-indent)) + cur-indent) + (cond + ((and (looking-at "^\\s-*}\\s-*$") block-indent) + ;; This line contains a closing brace and we're at the inner + ;; block, so we should indent it matching the indentation of + ;; the opening brace of the block. + (setq cur-indent block-indent)) + (t + ;; Otherwise, we did not start on a block-ending-only line. + (save-excursion + ;; Iterate backwards until we find an indentation hint + (while not-indented + (forward-line -1) + (cond + ;; Comment lines are ignored unless we're at the start of the + ;; buffer. + ((nginx-comment-line-p) + (if (bobp) + (setq not-indented nil))) + + ;; Brace or paren on a line by itself will already be indented to + ;; the right level, so we can cheat and stop there. + ((looking-at "^\\s-*}\\s-*") + (setq cur-indent (current-indentation)) + (setq not-indented nil)) + + ;; Indent by one level more than the start of our block. We lose + ;; if there is more than one block opened and closed on the same + ;; line but it's still unbalanced; hopefully people don't do that. + ((looking-at "^.*{[^\n}]*$") + (setq cur-indent (+ (current-indentation) nginx-indent-level)) + (setq not-indented nil)) + + ;; Start of buffer. + ((bobp) + (setq not-indented nil))))))) + + ;; We've figured out the indentation, so do it. + (if (and cur-indent (> cur-indent 0)) + (indent-line-to cur-indent) + (indent-line-to 0))))) + + +(defvar nginx-mode-map + (let + ((map (make-sparse-keymap))) + (define-key map "\C-j" 'newline-and-indent) + (define-key map "\C-m" 'newline-and-indent) + map) + "Keymap for editing nginx config files.") + +;;;###autoload +(defun nginx-mode () + "Major mode for highlighting nginx config files. + +The variable nginx-indent-level controls the amount of indentation. +\\{nginx-mode-map}" + (interactive) + (kill-all-local-variables) + (use-local-map nginx-mode-map) + (setq mode-name "Nginx" + major-mode 'nginx-mode) + + (set (make-local-variable 'comment-start) "# ") + (set (make-local-variable 'comment-start-skip) "#+ *") + (set (make-local-variable 'comment-use-syntax) t) + (set (make-local-variable 'comment-end) "") + (set (make-local-variable 'comment-auto-fill-only-comments) t) + + (set (make-local-variable 'indent-line-function) 'nginx-indent-line) + (set (make-local-variable 'indent-tabs-mode) nginx-indent-tabs-mode) + (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'paragraph-ignore-fill-prefix) t) + (set (make-local-variable 'paragraph-start) "\f\\|[ ]*$\\|#$") + (set (make-local-variable 'paragraph-separate) "\\([ \f]*\\|#\\)$") + + (set (make-local-variable 'font-lock-defaults) + '(nginx-font-lock-keywords nil)) + (run-hooks 'nginx-mode-hook)) + +(provide 'nginx-mode) + +;;; nginx-mode.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/undo-tree-0.6.5.signed @@ -0,0 +1,1 @@ +Good signature from 474F05837FBDEF9B GNU ELPA Signing Agent <elpasign@elpa.gnu.org> (trust undefined) created at 2014-09-24T10:20:09-0400 using DSA \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/undo-tree-0.6.5/undo-tree-autoloads.el @@ -0,0 +1,58 @@ +;;; undo-tree-autoloads.el --- automatically extracted autoloads +;; +;;; Code: +(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) + +;;;### (autoloads nil "undo-tree" "undo-tree.el" (22294 19053 520329 +;;;;;; 287000)) +;;; Generated autoloads from undo-tree.el + +(autoload 'undo-tree-mode "undo-tree" "\ +Toggle undo-tree mode. +With no argument, this command toggles the mode. +A positive prefix argument turns the mode on. +A negative prefix argument turns it off. + +Undo-tree-mode replaces Emacs' standard undo feature with a more +powerful yet easier to use version, that treats the undo history +as what it is: a tree. + +The following keys are available in `undo-tree-mode': + + \\{undo-tree-map} + +Within the undo-tree visualizer, the following keys are available: + + \\{undo-tree-visualizer-mode-map} + +\(fn &optional ARG)" t nil) + +(defvar global-undo-tree-mode nil "\ +Non-nil if Global-Undo-Tree mode is enabled. +See the command `global-undo-tree-mode' for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `global-undo-tree-mode'.") + +(custom-autoload 'global-undo-tree-mode "undo-tree" nil) + +(autoload 'global-undo-tree-mode "undo-tree" "\ +Toggle Undo-Tree mode in all buffers. +With prefix ARG, enable Global-Undo-Tree mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Undo-Tree mode is enabled in all buffers where +`turn-on-undo-tree-mode' would do it. +See `undo-tree-mode' for more information on Undo-Tree mode. + +\(fn &optional ARG)" t nil) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; End: +;;; undo-tree-autoloads.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/undo-tree-0.6.5/undo-tree-pkg.el @@ -0,0 +1,1 @@ +(define-package "undo-tree" "0.6.5" "Treat undo history as a tree" 'nil :url "http://www.dr-qubit.org/emacs.php" :keywords '("convenience" "files" "undo" "redo" "history" "tree"))
new file mode 100644 --- /dev/null +++ b/elpa/undo-tree-0.6.5/undo-tree.el @@ -0,0 +1,4418 @@ +;;; undo-tree.el --- Treat undo history as a tree -*- lexical-binding: t; -*- + +;; Copyright (C) 2009-2013 Free Software Foundation, Inc + +;; Author: Toby Cubitt <toby-undo-tree@dr-qubit.org> +;; Version: 0.6.5 +;; Keywords: convenience, files, undo, redo, history, tree +;; URL: http://www.dr-qubit.org/emacs.php +;; Repository: http://www.dr-qubit.org/git/undo-tree.git + +;; This file is part of Emacs. +;; +;; This file is free software: you can redistribute it and/or modify it under +;; the terms of the GNU General Public License as published by the Free +;; Software Foundation, either version 3 of the License, or (at your option) +;; any later version. +;; +;; This program is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +;; more details. +;; +;; You should have received a copy of the GNU General Public License along +;; with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + + +;;; Commentary: +;; +;; Emacs has a powerful undo system. Unlike the standard undo/redo system in +;; most software, it allows you to recover *any* past state of a buffer +;; (whereas the standard undo/redo system can lose past states as soon as you +;; redo). However, this power comes at a price: many people find Emacs' undo +;; system confusing and difficult to use, spawning a number of packages that +;; replace it with the less powerful but more intuitive undo/redo system. +;; +;; Both the loss of data with standard undo/redo, and the confusion of Emacs' +;; undo, stem from trying to treat undo history as a linear sequence of +;; changes. It's not. The `undo-tree-mode' provided by this package replaces +;; Emacs' undo system with a system that treats undo history as what it is: a +;; branching tree of changes. This simple idea allows the more intuitive +;; behaviour of the standard undo/redo system to be combined with the power of +;; never losing any history. An added side bonus is that undo history can in +;; some cases be stored more efficiently, allowing more changes to accumulate +;; before Emacs starts discarding history. +;; +;; The only downside to this more advanced yet simpler undo system is that it +;; was inspired by Vim. But, after all, most successful religions steal the +;; best ideas from their competitors! +;; +;; +;; Installation +;; ============ +;; +;; This package has only been tested with Emacs versions 24 and CVS. It should +;; work in Emacs versions 22 and 23 too, but will not work without +;; modifications in earlier versions of Emacs. +;; +;; To install `undo-tree-mode', make sure this file is saved in a directory in +;; your `load-path', and add the line: +;; +;; (require 'undo-tree) +;; +;; to your .emacs file. Byte-compiling undo-tree.el is recommended (e.g. using +;; "M-x byte-compile-file" from within emacs). +;; +;; If you want to replace the standard Emacs' undo system with the +;; `undo-tree-mode' system in all buffers, you can enable it globally by +;; adding: +;; +;; (global-undo-tree-mode) +;; +;; to your .emacs file. +;; +;; +;; Quick-Start +;; =========== +;; +;; If you're the kind of person who likes to jump in the car and drive, +;; without bothering to first figure out whether the button on the left dips +;; the headlights or operates the ejector seat (after all, you'll soon figure +;; it out when you push it), then here's the minimum you need to know: +;; +;; `undo-tree-mode' and `global-undo-tree-mode' +;; Enable undo-tree mode (either in the current buffer or globally). +;; +;; C-_ C-/ (`undo-tree-undo') +;; Undo changes. +;; +;; M-_ C-? (`undo-tree-redo') +;; Redo changes. +;; +;; `undo-tree-switch-branch' +;; Switch undo-tree branch. +;; (What does this mean? Better press the button and see!) +;; +;; C-x u (`undo-tree-visualize') +;; Visualize the undo tree. +;; (Better try pressing this button too!) +;; +;; C-x r u (`undo-tree-save-state-to-register') +;; Save current buffer state to register. +;; +;; C-x r U (`undo-tree-restore-state-from-register') +;; Restore buffer state from register. +;; +;; +;; +;; In the undo-tree visualizer: +;; +;; <up> p C-p (`undo-tree-visualize-undo') +;; Undo changes. +;; +;; <down> n C-n (`undo-tree-visualize-redo') +;; Redo changes. +;; +;; <left> b C-b (`undo-tree-visualize-switch-branch-left') +;; Switch to previous undo-tree branch. +;; +;; <right> f C-f (`undo-tree-visualize-switch-branch-right') +;; Switch to next undo-tree branch. +;; +;; C-<up> M-{ (`undo-tree-visualize-undo-to-x') +;; Undo changes up to last branch point. +;; +;; C-<down> M-} (`undo-tree-visualize-redo-to-x') +;; Redo changes down to next branch point. +;; +;; <down> n C-n (`undo-tree-visualize-redo') +;; Redo changes. +;; +;; <mouse-1> (`undo-tree-visualizer-mouse-set') +;; Set state to node at mouse click. +;; +;; t (`undo-tree-visualizer-toggle-timestamps') +;; Toggle display of time-stamps. +;; +;; d (`undo-tree-visualizer-toggle-diff') +;; Toggle diff display. +;; +;; s (`undo-tree-visualizer-selection-mode') +;; Toggle keyboard selection mode. +;; +;; q (`undo-tree-visualizer-quit') +;; Quit undo-tree-visualizer. +;; +;; C-q (`undo-tree-visualizer-abort') +;; Abort undo-tree-visualizer. +;; +;; , < +;; Scroll left. +;; +;; . > +;; Scroll right. +;; +;; <pgup> M-v +;; Scroll up. +;; +;; <pgdown> C-v +;; Scroll down. +;; +;; +;; +;; In visualizer selection mode: +;; +;; <up> p C-p (`undo-tree-visualizer-select-previous') +;; Select previous node. +;; +;; <down> n C-n (`undo-tree-visualizer-select-next') +;; Select next node. +;; +;; <left> b C-b (`undo-tree-visualizer-select-left') +;; Select left sibling node. +;; +;; <right> f C-f (`undo-tree-visualizer-select-right') +;; Select right sibling node. +;; +;; <pgup> M-v +;; Select node 10 above. +;; +;; <pgdown> C-v +;; Select node 10 below. +;; +;; <enter> (`undo-tree-visualizer-set') +;; Set state to selected node and exit selection mode. +;; +;; s (`undo-tree-visualizer-mode') +;; Exit selection mode. +;; +;; t (`undo-tree-visualizer-toggle-timestamps') +;; Toggle display of time-stamps. +;; +;; d (`undo-tree-visualizer-toggle-diff') +;; Toggle diff display. +;; +;; q (`undo-tree-visualizer-quit') +;; Quit undo-tree-visualizer. +;; +;; C-q (`undo-tree-visualizer-abort') +;; Abort undo-tree-visualizer. +;; +;; , < +;; Scroll left. +;; +;; . > +;; Scroll right. +;; +;; +;; +;; Persistent undo history: +;; +;; Note: Requires Emacs version 24.3 or higher. +;; +;; `undo-tree-auto-save-history' (variable) +;; automatically save and restore undo-tree history along with buffer +;; (disabled by default) +;; +;; `undo-tree-save-history' (command) +;; manually save undo history to file +;; +;; `undo-tree-load-history' (command) +;; manually load undo history from file +;; +;; +;; +;; Compressing undo history: +;; +;; Undo history files cannot grow beyond the maximum undo tree size, which +;; is limited by `undo-limit', `undo-strong-limit' and +;; `undo-outer-limit'. Nevertheless, undo history files can grow quite +;; large. If you want to automatically compress undo history, add the +;; following advice to your .emacs file (replacing ".gz" with the filename +;; extension of your favourite compression algorithm): +;; +;; (defadvice undo-tree-make-history-save-file-name +;; (after undo-tree activate) +;; (setq ad-return-value (concat ad-return-value ".gz"))) +;; +;; +;; +;; +;; Undo Systems +;; ============ +;; +;; To understand the different undo systems, it's easiest to consider an +;; example. Imagine you make a few edits in a buffer. As you edit, you +;; accumulate a history of changes, which we might visualize as a string of +;; past buffer states, growing downwards: +;; +;; o (initial buffer state) +;; | +;; | +;; o (first edit) +;; | +;; | +;; o (second edit) +;; | +;; | +;; x (current buffer state) +;; +;; +;; Now imagine that you undo the last two changes. We can visualize this as +;; rewinding the current state back two steps: +;; +;; o (initial buffer state) +;; | +;; | +;; x (current buffer state) +;; | +;; | +;; o +;; | +;; | +;; o +;; +;; +;; However, this isn't a good representation of what Emacs' undo system +;; does. Instead, it treats the undos as *new* changes to the buffer, and adds +;; them to the history: +;; +;; o (initial buffer state) +;; | +;; | +;; o (first edit) +;; | +;; | +;; o (second edit) +;; | +;; | +;; x (buffer state before undo) +;; | +;; | +;; o (first undo) +;; | +;; | +;; x (second undo) +;; +;; +;; Actually, since the buffer returns to a previous state after an undo, +;; perhaps a better way to visualize it is to imagine the string of changes +;; turning back on itself: +;; +;; (initial buffer state) o +;; | +;; | +;; (first edit) o x (second undo) +;; | | +;; | | +;; (second edit) o o (first undo) +;; | / +;; |/ +;; o (buffer state before undo) +;; +;; Treating undos as new changes might seem a strange thing to do. But the +;; advantage becomes clear as soon as we imagine what happens when you edit +;; the buffer again. Since you've undone a couple of changes, new edits will +;; branch off from the buffer state that you've rewound to. Conceptually, it +;; looks like this: +;; +;; o (initial buffer state) +;; | +;; | +;; o +;; |\ +;; | \ +;; o x (new edit) +;; | +;; | +;; o +;; +;; The standard undo/redo system only lets you go backwards and forwards +;; linearly. So as soon as you make that new edit, it discards the old +;; branch. Emacs' undo just keeps adding changes to the end of the string. So +;; the undo history in the two systems now looks like this: +;; +;; Undo/Redo: Emacs' undo +;; +;; o o +;; | | +;; | | +;; o o o +;; .\ | |\ +;; . \ | | \ +;; . x (new edit) o o | +;; (discarded . | / | +;; branch) . |/ | +;; . o | +;; | +;; | +;; x (new edit) +;; +;; Now, what if you change your mind about those undos, and decide you did +;; like those other changes you'd made after all? With the standard undo/redo +;; system, you're lost. There's no way to recover them, because that branch +;; was discarded when you made the new edit. +;; +;; However, in Emacs' undo system, those old buffer states are still there in +;; the undo history. You just have to rewind back through the new edit, and +;; back through the changes made by the undos, until you reach them. Of +;; course, since Emacs treats undos (even undos of undos!) as new changes, +;; you're really weaving backwards and forwards through the history, all the +;; time adding new changes to the end of the string as you go: +;; +;; o +;; | +;; | +;; o o o (undo new edit) +;; | |\ |\ +;; | | \ | \ +;; o o | | o (undo the undo) +;; | / | | | +;; |/ | | | +;; (trying to get o | | x (undo the undo) +;; to this state) | / +;; |/ +;; o +;; +;; So far, this is still reasonably intuitive to use. It doesn't behave so +;; differently to standard undo/redo, except that by going back far enough you +;; can access changes that would be lost in standard undo/redo. +;; +;; However, imagine that after undoing as just described, you decide you +;; actually want to rewind right back to the initial state. If you're lucky, +;; and haven't invoked any command since the last undo, you can just keep on +;; undoing until you get back to the start: +;; +;; (trying to get o x (got there!) +;; to this state) | | +;; | | +;; o o o o (keep undoing) +;; | |\ |\ | +;; | | \ | \ | +;; o o | | o o (keep undoing) +;; | / | | | / +;; |/ | | |/ +;; (already undid o | | o (got this far) +;; to this state) | / +;; |/ +;; o +;; +;; But if you're unlucky, and you happen to have moved the point (say) after +;; getting to the state labelled "got this far", then you've "broken the undo +;; chain". Hold on to something solid, because things are about to get +;; hairy. If you try to undo now, Emacs thinks you're trying to undo the +;; undos! So to get back to the initial state you now have to rewind through +;; *all* the changes, including the undos you just did: +;; +;; (trying to get o x (finally got there!) +;; to this state) | | +;; | | +;; o o o o o o +;; | |\ |\ |\ |\ | +;; | | \ | \ | \ | \ | +;; o o | | o o o | o o +;; | / | | | / | | | / +;; |/ | | |/ | | |/ +;; (already undid o | | o<. | | o +;; to this state) | / : | / +;; |/ : |/ +;; o : o +;; : +;; (got this far, but +;; broke the undo chain) +;; +;; Confused? +;; +;; In practice you can just hold down the undo key until you reach the buffer +;; state that you want. But whatever you do, don't move around in the buffer +;; to *check* that you've got back to where you want! Because you'll break the +;; undo chain, and then you'll have to traverse the entire string of undos +;; again, just to get back to the point at which you broke the +;; chain. Undo-in-region and commands such as `undo-only' help to make using +;; Emacs' undo a little easier, but nonetheless it remains confusing for many +;; people. +;; +;; +;; So what does `undo-tree-mode' do? Remember the diagram we drew to represent +;; the history we've been discussing (make a few edits, undo a couple of them, +;; and edit again)? The diagram that conceptually represented our undo +;; history, before we started discussing specific undo systems? It looked like +;; this: +;; +;; o (initial buffer state) +;; | +;; | +;; o +;; |\ +;; | \ +;; o x (current state) +;; | +;; | +;; o +;; +;; Well, that's *exactly* what the undo history looks like to +;; `undo-tree-mode'. It doesn't discard the old branch (as standard undo/redo +;; does), nor does it treat undos as new changes to be added to the end of a +;; linear string of buffer states (as Emacs' undo does). It just keeps track +;; of the tree of branching changes that make up the entire undo history. +;; +;; If you undo from this point, you'll rewind back up the tree to the previous +;; state: +;; +;; o +;; | +;; | +;; x (undo) +;; |\ +;; | \ +;; o o +;; | +;; | +;; o +;; +;; If you were to undo again, you'd rewind back to the initial state. If on +;; the other hand you redo the change, you'll end up back at the bottom of the +;; most recent branch: +;; +;; o (undo takes you here) +;; | +;; | +;; o (start here) +;; |\ +;; | \ +;; o x (redo takes you here) +;; | +;; | +;; o +;; +;; So far, this is just like the standard undo/redo system. But what if you +;; want to return to a buffer state located on a previous branch of the +;; history? Since `undo-tree-mode' keeps the entire history, you simply need +;; to tell it to switch to a different branch, and then redo the changes you +;; want: +;; +;; o +;; | +;; | +;; o (start here, but switch +;; |\ to the other branch) +;; | \ +;; (redo) o o +;; | +;; | +;; (redo) x +;; +;; Now you're on the other branch, if you undo and redo changes you'll stay on +;; that branch, moving up and down through the buffer states located on that +;; branch. Until you decide to switch branches again, of course. +;; +;; Real undo trees might have multiple branches and sub-branches: +;; +;; o +;; ____|______ +;; / \ +;; o o +;; ____|__ __| +;; / | \ / \ +;; o o o o x +;; | | +;; / \ / \ +;; o o o o +;; +;; Trying to imagine what Emacs' undo would do as you move about such a tree +;; will likely frazzle your brain circuits! But in `undo-tree-mode', you're +;; just moving around this undo history tree. Most of the time, you'll +;; probably only need to stay on the most recent branch, in which case it +;; behaves like standard undo/redo, and is just as simple to understand. But +;; if you ever need to recover a buffer state on a different branch, the +;; possibility of switching between branches and accessing the full undo +;; history is still there. +;; +;; +;; +;; The Undo-Tree Visualizer +;; ======================== +;; +;; Actually, it gets better. You don't have to imagine all these tree +;; diagrams, because `undo-tree-mode' includes an undo-tree visualizer which +;; draws them for you! In fact, it draws even better diagrams: it highlights +;; the node representing the current buffer state, it highlights the current +;; branch, and you can toggle the display of time-stamps (by hitting "t") and +;; a diff of the undo changes (by hitting "d"). (There's one other tiny +;; difference: the visualizer puts the most recent branch on the left rather +;; than the right.) +;; +;; Bring up the undo tree visualizer whenever you want by hitting "C-x u". +;; +;; In the visualizer, the usual keys for moving up and down a buffer instead +;; move up and down the undo history tree (e.g. the up and down arrow keys, or +;; "C-n" and "C-p"). The state of the "parent" buffer (the buffer whose undo +;; history you are visualizing) is updated as you move around the undo tree in +;; the visualizer. If you reach a branch point in the visualizer, the usual +;; keys for moving forward and backward in a buffer instead switch branch +;; (e.g. the left and right arrow keys, or "C-f" and "C-b"). +;; +;; Clicking with the mouse on any node in the visualizer will take you +;; directly to that node, resetting the state of the parent buffer to the +;; state represented by that node. +;; +;; You can also select nodes directly using the keyboard, by hitting "s" to +;; toggle selection mode. The usual motion keys now allow you to move around +;; the tree without changing the parent buffer. Hitting <enter> will reset the +;; state of the parent buffer to the state represented by the currently +;; selected node. +;; +;; It can be useful to see how long ago the parent buffer was in the state +;; represented by a particular node in the visualizer. Hitting "t" in the +;; visualizer toggles the display of time-stamps for all the nodes. (Note +;; that, because of the way `undo-tree-mode' works, these time-stamps may be +;; somewhat later than the true times, especially if it's been a long time +;; since you last undid any changes.) +;; +;; To get some idea of what changes are represented by a given node in the +;; tree, it can be useful to see a diff of the changes. Hit "d" in the +;; visualizer to toggle a diff display. This normally displays a diff between +;; the current state and the previous one, i.e. it shows you the changes that +;; will be applied if you undo (move up the tree). However, the diff display +;; really comes into its own in the visualizer's selection mode (see above), +;; where it instead shows a diff between the current state and the currently +;; selected state, i.e. it shows you the changes that will be applied if you +;; reset to the selected state. +;; +;; (Note that the diff is generated by the Emacs `diff' command, and is +;; displayed using `diff-mode'. See the corresponding customization groups if +;; you want to customize the diff display.) +;; +;; Finally, hitting "q" will quit the visualizer, leaving the parent buffer in +;; whatever state you ended at. Hitting "C-q" will abort the visualizer, +;; returning the parent buffer to whatever state it was originally in when the +;; visualizer was . +;; +;; +;; +;; Undo-in-Region +;; ============== +;; +;; Emacs allows a very useful and powerful method of undoing only selected +;; changes: when a region is active, only changes that affect the text within +;; that region will be undone. With the standard Emacs undo system, changes +;; produced by undoing-in-region naturally get added onto the end of the +;; linear undo history: +;; +;; o +;; | +;; | x (second undo-in-region) +;; o | +;; | | +;; | o (first undo-in-region) +;; o | +;; | / +;; |/ +;; o +;; +;; You can of course redo these undos-in-region as usual, by undoing the +;; undos: +;; +;; o +;; | +;; | o_ +;; o | \ +;; | | | +;; | o o (undo the undo-in-region) +;; o | | +;; | / | +;; |/ | +;; o x (undo the undo-in-region) +;; +;; +;; In `undo-tree-mode', undo-in-region works similarly: when there's an active +;; region, undoing only undoes changes that affect that region. However, the +;; way these undos-in-region are recorded in the undo history is quite +;; different. In `undo-tree-mode', undo-in-region creates a new branch in the +;; undo history. The new branch consists of an undo step that undoes some of +;; the changes that affect the current region, and another step that undoes +;; the remaining changes needed to rejoin the previous undo history. +;; +;; Previous undo history Undo-in-region +;; +;; o o +;; | | +;; | | +;; o o +;; | |\ +;; | | \ +;; o o x (undo-in-region) +;; | | | +;; | | | +;; x o o +;; +;; As long as you don't change the active region after undoing-in-region, +;; continuing to undo-in-region extends the new branch, pulling more changes +;; that affect the current region into an undo step immediately above your +;; current location in the undo tree, and pushing the point at which the new +;; branch is attached further up the tree: +;; +;; First undo-in-region Second undo-in-region +;; +;; o o +;; | |\ +;; | | \ +;; o o x (undo-in-region) +;; |\ | | +;; | \ | | +;; o x o o +;; | | | | +;; | | | | +;; o o o o +;; +;; Redoing takes you back down the undo tree, as usual (as long as you haven't +;; changed the active region after undoing-in-region, it doesn't matter if it +;; is still active): +;; +;; o +;; |\ +;; | \ +;; o o +;; | | +;; | | +;; o o (redo) +;; | | +;; | | +;; o x (redo) +;; +;; +;; What about redo-in-region? Obviously, this only makes sense if you have +;; already undone some changes, so that there are some changes to redo! +;; Redoing-in-region splits off a new branch of the undo history below your +;; current location in the undo tree. This time, the new branch consists of a +;; redo step that redoes some of the redo changes that affect the current +;; region, followed by all the remaining redo changes. +;; +;; Previous undo history Redo-in-region +;; +;; o o +;; | | +;; | | +;; x o +;; | |\ +;; | | \ +;; o o x (redo-in-region) +;; | | | +;; | | | +;; o o o +;; +;; As long as you don't change the active region after redoing-in-region, +;; continuing to redo-in-region extends the new branch, pulling more redo +;; changes into a redo step immediately below your current location in the +;; undo tree. +;; +;; First redo-in-region Second redo-in-region +;; +;; o o +;; | | +;; | | +;; o o +;; |\ |\ +;; | \ | \ +;; o x (redo-in-region) o o +;; | | | | +;; | | | | +;; o o o x (redo-in-region) +;; | +;; | +;; o +;; +;; Note that undo-in-region and redo-in-region only ever add new changes to +;; the undo tree, they *never* modify existing undo history. So you can always +;; return to previous buffer states by switching to a previous branch of the +;; tree. + + + +;;; Code: + +(eval-when-compile (require 'cl)) +(require 'diff) + + + +;;; ===================================================================== +;;; Compatibility hacks for older Emacsen + +;; `characterp' isn't defined in Emacs versions < 23 +(unless (fboundp 'characterp) + (defalias 'characterp 'char-valid-p)) + +;; `region-active-p' isn't defined in Emacs versions < 23 +(unless (fboundp 'region-active-p) + (defun region-active-p () (and transient-mark-mode mark-active))) + + +;; `registerv' defstruct isn't defined in Emacs versions < 24 +(unless (fboundp 'registerv-make) + (defmacro registerv-make (data &rest _dummy) data)) + +(unless (fboundp 'registerv-data) + (defmacro registerv-data (data) data)) + + +;; `diff-no-select' and `diff-file-local-copy' aren't defined in Emacs +;; versions < 24 (copied and adapted from Emacs 24) +(unless (fboundp 'diff-no-select) + (defun diff-no-select (old new &optional switches no-async buf) + ;; Noninteractive helper for creating and reverting diff buffers + (unless (bufferp new) (setq new (expand-file-name new))) + (unless (bufferp old) (setq old (expand-file-name old))) + (or switches (setq switches diff-switches)) ; If not specified, use default. + (unless (listp switches) (setq switches (list switches))) + (or buf (setq buf (get-buffer-create "*Diff*"))) + (let* ((old-alt (diff-file-local-copy old)) + (new-alt (diff-file-local-copy new)) + (command + (mapconcat 'identity + `(,diff-command + ;; Use explicitly specified switches + ,@switches + ,@(mapcar #'shell-quote-argument + (nconc + (when (or old-alt new-alt) + (list "-L" (if (stringp old) + old (prin1-to-string old)) + "-L" (if (stringp new) + new (prin1-to-string new)))) + (list (or old-alt old) + (or new-alt new))))) + " ")) + (thisdir default-directory)) + (with-current-buffer buf + (setq buffer-read-only t) + (buffer-disable-undo (current-buffer)) + (let ((inhibit-read-only t)) + (erase-buffer)) + (buffer-enable-undo (current-buffer)) + (diff-mode) + (set (make-local-variable 'revert-buffer-function) + (lambda (_ignore-auto _noconfirm) + (diff-no-select old new switches no-async (current-buffer)))) + (setq default-directory thisdir) + (let ((inhibit-read-only t)) + (insert command "\n")) + (if (and (not no-async) (fboundp 'start-process)) + (let ((proc (start-process "Diff" buf shell-file-name + shell-command-switch command))) + (set-process-filter proc 'diff-process-filter) + (set-process-sentinel + proc (lambda (proc _msg) + (with-current-buffer (process-buffer proc) + (diff-sentinel (process-exit-status proc)) + (if old-alt (delete-file old-alt)) + (if new-alt (delete-file new-alt)))))) + ;; Async processes aren't available. + (let ((inhibit-read-only t)) + (diff-sentinel + (call-process shell-file-name nil buf nil + shell-command-switch command)) + (if old-alt (delete-file old-alt)) + (if new-alt (delete-file new-alt))))) + buf))) + +(unless (fboundp 'diff-file-local-copy) + (defun diff-file-local-copy (file-or-buf) + (if (bufferp file-or-buf) + (with-current-buffer file-or-buf + (let ((tempfile (make-temp-file "buffer-content-"))) + (write-region nil nil tempfile nil 'nomessage) + tempfile)) + (file-local-copy file-or-buf)))) + + +;; `user-error' isn't defined in Emacs < 24.3 +(unless (fboundp 'user-error) + (defalias 'user-error 'error) + ;; prevent debugger being called on user errors + (add-to-list 'debug-ignored-errors "^No further undo information") + (add-to-list 'debug-ignored-errors "^No further redo information") + (add-to-list 'debug-ignored-errors "^No further redo information for region")) + + + + + +;;; ===================================================================== +;;; Global variables and customization options + +(defvar buffer-undo-tree nil + "Tree of undo entries in current buffer.") +(put 'buffer-undo-tree 'permanent-local t) +(make-variable-buffer-local 'buffer-undo-tree) + + +(defgroup undo-tree nil + "Tree undo/redo." + :group 'undo) + +(defcustom undo-tree-mode-lighter " Undo-Tree" + "Lighter displayed in mode line +when `undo-tree-mode' is enabled." + :group 'undo-tree + :type 'string) + + +(defcustom undo-tree-incompatible-major-modes '(term-mode) + "List of major-modes in which `undo-tree-mode' should not be enabled. +\(See `turn-on-undo-tree-mode'.\)" + :group 'undo-tree + :type '(repeat symbol)) + + +(defcustom undo-tree-enable-undo-in-region t + "When non-nil, enable undo-in-region. + +When undo-in-region is enabled, undoing or redoing when the +region is active (in `transient-mark-mode') or with a prefix +argument (not in `transient-mark-mode') only undoes changes +within the current region." + :group 'undo-tree + :type 'boolean) + + +(defcustom undo-tree-auto-save-history nil + "When non-nil, `undo-tree-mode' will save undo history to file +when a buffer is saved to file. + +It will automatically load undo history when a buffer is loaded +from file, if an undo save file exists. + +By default, undo-tree history is saved to a file called +\".<buffer-file-name>.~undo-tree~\" in the same directory as the +file itself. To save under a different directory, customize +`undo-tree-history-directory-alist' (see the documentation for +that variable for details). + +WARNING! `undo-tree-auto-save-history' will not work properly in +Emacs versions prior to 24.3, so it cannot be enabled via +the customization interface in versions earlier than that one. To +ignore this warning and enable it regardless, set +`undo-tree-auto-save-history' to a non-nil value outside of +customize." + :group 'undo-tree + :type (if (version-list-< (version-to-list emacs-version) '(24 3)) + '(choice (const :tag "<disabled>" nil)) + 'boolean)) + + +(defcustom undo-tree-history-directory-alist nil + "Alist of filename patterns and undo history directory names. +Each element looks like (REGEXP . DIRECTORY). Undo history for +files with names matching REGEXP will be saved in DIRECTORY. +DIRECTORY may be relative or absolute. If it is absolute, so +that all matching files are backed up into the same directory, +the file names in this directory will be the full name of the +file backed up with all directory separators changed to `!' to +prevent clashes. This will not work correctly if your filesystem +truncates the resulting name. + +For the common case of all backups going into one directory, the +alist should contain a single element pairing \".\" with the +appropriate directory name. + +If this variable is nil, or it fails to match a filename, the +backup is made in the original file's directory. + +On MS-DOS filesystems without long names this variable is always +ignored." + :group 'undo-tree + :type '(repeat (cons (regexp :tag "Regexp matching filename") + (directory :tag "Undo history directory name")))) + + + +(defcustom undo-tree-visualizer-relative-timestamps t + "When non-nil, display times relative to current time +when displaying time stamps in visualizer. + +Otherwise, display absolute times." + :group 'undo-tree + :type 'boolean) + + +(defcustom undo-tree-visualizer-timestamps nil + "When non-nil, display time-stamps by default +in undo-tree visualizer. + +\\<undo-tree-visualizer-mode-map>You can always toggle time-stamps on and off \ +using \\[undo-tree-visualizer-toggle-timestamps], regardless of the +setting of this variable." + :group 'undo-tree + :type 'boolean) + + +(defcustom undo-tree-visualizer-diff nil + "When non-nil, display diff by default in undo-tree visualizer. + +\\<undo-tree-visualizer-mode-map>You can always toggle the diff display \ +using \\[undo-tree-visualizer-toggle-diff], regardless of the +setting of this variable." + :group 'undo-tree + :type 'boolean) + + +(defcustom undo-tree-visualizer-lazy-drawing 100 + "When non-nil, use lazy undo-tree drawing in visualizer. + +Setting this to a number causes the visualizer to switch to lazy +drawing when the number of nodes in the tree is larger than this +value. + +Lazy drawing means that only the visible portion of the tree will +be drawn initially, and the tree will be extended later as +needed. For the most part, the only visible effect of this is to +significantly speed up displaying the visualizer for very large +trees. + +There is one potential negative effect of lazy drawing. Other +branches of the tree will only be drawn once the node from which +they branch off becomes visible. So it can happen that certain +portions of the tree that would be shown with lazy drawing +disabled, will not be drawn immediately when it is +enabled. However, this effect is quite rare in practice." + :group 'undo-tree + :type '(choice (const :tag "never" nil) + (const :tag "always" t) + (integer :tag "> size"))) + + +(defface undo-tree-visualizer-default-face + '((((class color)) :foreground "gray")) + "Face used to draw undo-tree in visualizer." + :group 'undo-tree) + +(defface undo-tree-visualizer-current-face + '((((class color)) :foreground "red")) + "Face used to highlight current undo-tree node in visualizer." + :group 'undo-tree) + +(defface undo-tree-visualizer-active-branch-face + '((((class color) (background dark)) + (:foreground "white" :weight bold)) + (((class color) (background light)) + (:foreground "black" :weight bold))) + "Face used to highlight active undo-tree branch in visualizer." + :group 'undo-tree) + +(defface undo-tree-visualizer-register-face + '((((class color)) :foreground "yellow")) + "Face used to highlight undo-tree nodes saved to a register +in visualizer." + :group 'undo-tree) + +(defface undo-tree-visualizer-unmodified-face + '((((class color)) :foreground "cyan")) + "Face used to highlight nodes corresponding to unmodified buffers +in visualizer." + :group 'undo-tree) + + +(defvar undo-tree-visualizer-parent-buffer nil + "Parent buffer in visualizer.") +(put 'undo-tree-visualizer-parent-buffer 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-parent-buffer) + +;; stores modification time of parent buffer's file, if any +(defvar undo-tree-visualizer-parent-mtime nil) +(put 'undo-tree-visualizer-parent-mtime 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-parent-mtime) + +;; stores current horizontal spacing needed for drawing undo-tree +(defvar undo-tree-visualizer-spacing nil) +(put 'undo-tree-visualizer-spacing 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-spacing) + +;; calculate horizontal spacing required for drawing tree with current +;; settings +(defsubst undo-tree-visualizer-calculate-spacing () + (if undo-tree-visualizer-timestamps + (if undo-tree-visualizer-relative-timestamps 9 13) + 3)) + +;; holds node that was current when visualizer was invoked +(defvar undo-tree-visualizer-initial-node nil) +(put 'undo-tree-visualizer-initial-node 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-initial-node) + +;; holds currently selected node in visualizer selection mode +(defvar undo-tree-visualizer-selected-node nil) +(put 'undo-tree-visualizer-selected-node 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-selected) + +;; used to store nodes at edge of currently drawn portion of tree +(defvar undo-tree-visualizer-needs-extending-down nil) +(put 'undo-tree-visualizer-needs-extending-down 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-down) +(defvar undo-tree-visualizer-needs-extending-up nil) +(put 'undo-tree-visualizer-needs-extending-up 'permanent-local t) +(make-variable-buffer-local 'undo-tree-visualizer-needs-extending-up) + +;; dynamically bound to t when undoing from visualizer, to inhibit +;; `undo-tree-kill-visualizer' hook function in parent buffer +(defvar undo-tree-inhibit-kill-visualizer nil) + +;; can be let-bound to a face name, used in drawing functions +(defvar undo-tree-insert-face nil) + +;; visualizer buffer names +(defconst undo-tree-visualizer-buffer-name " *undo-tree*") +(defconst undo-tree-diff-buffer-name "*undo-tree Diff*") + +;; install history-auto-save hooks +(add-hook 'write-file-functions 'undo-tree-save-history-hook) +(add-hook 'find-file-hook 'undo-tree-load-history-hook) + + + + +;;; ================================================================= +;;; Default keymaps + +(defvar undo-tree-map nil + "Keymap used in undo-tree-mode.") + +(unless undo-tree-map + (let ((map (make-sparse-keymap))) + ;; remap `undo' and `undo-only' to `undo-tree-undo' + (define-key map [remap undo] 'undo-tree-undo) + (define-key map [remap undo-only] 'undo-tree-undo) + ;; bind standard undo bindings (since these match redo counterparts) + (define-key map (kbd "C-/") 'undo-tree-undo) + (define-key map "\C-_" 'undo-tree-undo) + ;; redo doesn't exist normally, so define our own keybindings + (define-key map (kbd "C-?") 'undo-tree-redo) + (define-key map (kbd "M-_") 'undo-tree-redo) + ;; just in case something has defined `redo'... + (define-key map [remap redo] 'undo-tree-redo) + ;; we use "C-x u" for the undo-tree visualizer + (define-key map (kbd "\C-x u") 'undo-tree-visualize) + ;; bind register commands + (define-key map (kbd "C-x r u") 'undo-tree-save-state-to-register) + (define-key map (kbd "C-x r U") 'undo-tree-restore-state-from-register) + ;; set keymap + (setq undo-tree-map map))) + + +(defvar undo-tree-visualizer-mode-map nil + "Keymap used in undo-tree visualizer.") + +(unless undo-tree-visualizer-mode-map + (let ((map (make-sparse-keymap))) + ;; vertical motion keys undo/redo + (define-key map [remap previous-line] 'undo-tree-visualize-undo) + (define-key map [remap next-line] 'undo-tree-visualize-redo) + (define-key map [up] 'undo-tree-visualize-undo) + (define-key map "p" 'undo-tree-visualize-undo) + (define-key map "\C-p" 'undo-tree-visualize-undo) + (define-key map [down] 'undo-tree-visualize-redo) + (define-key map "n" 'undo-tree-visualize-redo) + (define-key map "\C-n" 'undo-tree-visualize-redo) + ;; horizontal motion keys switch branch + (define-key map [remap forward-char] + 'undo-tree-visualize-switch-branch-right) + (define-key map [remap backward-char] + 'undo-tree-visualize-switch-branch-left) + (define-key map [right] 'undo-tree-visualize-switch-branch-right) + (define-key map "f" 'undo-tree-visualize-switch-branch-right) + (define-key map "\C-f" 'undo-tree-visualize-switch-branch-right) + (define-key map [left] 'undo-tree-visualize-switch-branch-left) + (define-key map "b" 'undo-tree-visualize-switch-branch-left) + (define-key map "\C-b" 'undo-tree-visualize-switch-branch-left) + ;; paragraph motion keys undo/redo to significant points in tree + (define-key map [remap backward-paragraph] 'undo-tree-visualize-undo-to-x) + (define-key map [remap forward-paragraph] 'undo-tree-visualize-redo-to-x) + (define-key map "\M-{" 'undo-tree-visualize-undo-to-x) + (define-key map "\M-}" 'undo-tree-visualize-redo-to-x) + (define-key map [C-up] 'undo-tree-visualize-undo-to-x) + (define-key map [C-down] 'undo-tree-visualize-redo-to-x) + ;; mouse sets buffer state to node at click + (define-key map [mouse-1] 'undo-tree-visualizer-mouse-set) + ;; toggle timestamps + (define-key map "t" 'undo-tree-visualizer-toggle-timestamps) + ;; toggle diff + (define-key map "d" 'undo-tree-visualizer-toggle-diff) + ;; toggle selection mode + (define-key map "s" 'undo-tree-visualizer-selection-mode) + ;; horizontal scrolling may be needed if the tree is very wide + (define-key map "," 'undo-tree-visualizer-scroll-left) + (define-key map "." 'undo-tree-visualizer-scroll-right) + (define-key map "<" 'undo-tree-visualizer-scroll-left) + (define-key map ">" 'undo-tree-visualizer-scroll-right) + ;; vertical scrolling may be needed if the tree is very tall + (define-key map [next] 'undo-tree-visualizer-scroll-up) + (define-key map [prior] 'undo-tree-visualizer-scroll-down) + ;; quit/abort visualizer + (define-key map "q" 'undo-tree-visualizer-quit) + (define-key map "\C-q" 'undo-tree-visualizer-abort) + ;; set keymap + (setq undo-tree-visualizer-mode-map map))) + + +(defvar undo-tree-visualizer-selection-mode-map nil + "Keymap used in undo-tree visualizer selection mode.") + +(unless undo-tree-visualizer-selection-mode-map + (let ((map (make-sparse-keymap))) + ;; vertical motion keys move up and down tree + (define-key map [remap previous-line] + 'undo-tree-visualizer-select-previous) + (define-key map [remap next-line] + 'undo-tree-visualizer-select-next) + (define-key map [up] 'undo-tree-visualizer-select-previous) + (define-key map "p" 'undo-tree-visualizer-select-previous) + (define-key map "\C-p" 'undo-tree-visualizer-select-previous) + (define-key map [down] 'undo-tree-visualizer-select-next) + (define-key map "n" 'undo-tree-visualizer-select-next) + (define-key map "\C-n" 'undo-tree-visualizer-select-next) + ;; vertical scroll keys move up and down quickly + (define-key map [next] + (lambda () (interactive) (undo-tree-visualizer-select-next 10))) + (define-key map [prior] + (lambda () (interactive) (undo-tree-visualizer-select-previous 10))) + ;; horizontal motion keys move to left and right siblings + (define-key map [remap forward-char] 'undo-tree-visualizer-select-right) + (define-key map [remap backward-char] 'undo-tree-visualizer-select-left) + (define-key map [right] 'undo-tree-visualizer-select-right) + (define-key map "f" 'undo-tree-visualizer-select-right) + (define-key map "\C-f" 'undo-tree-visualizer-select-right) + (define-key map [left] 'undo-tree-visualizer-select-left) + (define-key map "b" 'undo-tree-visualizer-select-left) + (define-key map "\C-b" 'undo-tree-visualizer-select-left) + ;; horizontal scroll keys move left or right quickly + (define-key map "," + (lambda () (interactive) (undo-tree-visualizer-select-left 10))) + (define-key map "." + (lambda () (interactive) (undo-tree-visualizer-select-right 10))) + (define-key map "<" + (lambda () (interactive) (undo-tree-visualizer-select-left 10))) + (define-key map ">" + (lambda () (interactive) (undo-tree-visualizer-select-right 10))) + ;; <enter> sets buffer state to node at point + (define-key map "\r" 'undo-tree-visualizer-set) + ;; mouse selects node at click + (define-key map [mouse-1] 'undo-tree-visualizer-mouse-select) + ;; toggle diff + (define-key map "d" 'undo-tree-visualizer-selection-toggle-diff) + ;; set keymap + (setq undo-tree-visualizer-selection-mode-map map))) + + +(defvar undo-tree-old-undo-menu-item nil) + +(defun undo-tree-update-menu-bar () + "Update `undo-tree-mode' Edit menu items." + (if undo-tree-mode + (progn + ;; save old undo menu item, and install undo/redo menu items + (setq undo-tree-old-undo-menu-item + (cdr (assq 'undo (lookup-key global-map [menu-bar edit])))) + (define-key (lookup-key global-map [menu-bar edit]) + [undo] '(menu-item "Undo" undo-tree-undo + :enable (and undo-tree-mode + (not buffer-read-only) + (not (eq t buffer-undo-list)) + (undo-tree-node-previous + (undo-tree-current buffer-undo-tree))) + :help "Undo last operation")) + (define-key-after (lookup-key global-map [menu-bar edit]) + [redo] '(menu-item "Redo" undo-tree-redo + :enable (and undo-tree-mode + (not buffer-read-only) + (not (eq t buffer-undo-list)) + (undo-tree-node-next + (undo-tree-current buffer-undo-tree))) + :help "Redo last operation") + 'undo)) + ;; uninstall undo/redo menu items + (define-key (lookup-key global-map [menu-bar edit]) + [undo] undo-tree-old-undo-menu-item) + (define-key (lookup-key global-map [menu-bar edit]) + [redo] nil))) + +(add-hook 'menu-bar-update-hook 'undo-tree-update-menu-bar) + + + + + +;;; ===================================================================== +;;; Undo-tree data structure + +(defstruct + (undo-tree + :named + (:constructor nil) + (:constructor make-undo-tree + (&aux + (root (undo-tree-make-node nil nil)) + (current root) + (size 0) + (count 0) + (object-pool (make-hash-table :test 'eq :weakness 'value)))) + ;;(:copier nil) + ) + root current size count object-pool) + + + +(defstruct + (undo-tree-node + (:type vector) ; create unnamed struct + (:constructor nil) + (:constructor undo-tree-make-node + (previous undo + &optional redo + &aux + (timestamp (current-time)) + (branch 0))) + (:constructor undo-tree-make-node-backwards + (next-node undo + &optional redo + &aux + (next (list next-node)) + (timestamp (current-time)) + (branch 0))) + (:copier nil)) + previous next undo redo timestamp branch meta-data) + + +(defmacro undo-tree-node-p (n) + (let ((len (length (undo-tree-make-node nil nil)))) + `(and (vectorp ,n) (= (length ,n) ,len)))) + + + +(defstruct + (undo-tree-region-data + (:type vector) ; create unnamed struct + (:constructor nil) + (:constructor undo-tree-make-region-data + (&optional undo-beginning undo-end + redo-beginning redo-end)) + (:constructor undo-tree-make-undo-region-data + (undo-beginning undo-end)) + (:constructor undo-tree-make-redo-region-data + (redo-beginning redo-end)) + (:copier nil)) + undo-beginning undo-end redo-beginning redo-end) + + +(defmacro undo-tree-region-data-p (r) + (let ((len (length (undo-tree-make-region-data)))) + `(and (vectorp ,r) (= (length ,r) ,len)))) + +(defmacro undo-tree-node-clear-region-data (node) + `(setf (undo-tree-node-meta-data ,node) + (delq nil + (delq :region + (plist-put (undo-tree-node-meta-data ,node) + :region nil))))) + + +(defmacro undo-tree-node-undo-beginning (node) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (when (undo-tree-region-data-p r) + (undo-tree-region-data-undo-beginning r)))) + +(defmacro undo-tree-node-undo-end (node) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (when (undo-tree-region-data-p r) + (undo-tree-region-data-undo-end r)))) + +(defmacro undo-tree-node-redo-beginning (node) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (when (undo-tree-region-data-p r) + (undo-tree-region-data-redo-beginning r)))) + +(defmacro undo-tree-node-redo-end (node) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (when (undo-tree-region-data-p r) + (undo-tree-region-data-redo-end r)))) + + +(defsetf undo-tree-node-undo-beginning (node) (val) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (unless (undo-tree-region-data-p r) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :region + (setq r (undo-tree-make-region-data))))) + (setf (undo-tree-region-data-undo-beginning r) ,val))) + +(defsetf undo-tree-node-undo-end (node) (val) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (unless (undo-tree-region-data-p r) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :region + (setq r (undo-tree-make-region-data))))) + (setf (undo-tree-region-data-undo-end r) ,val))) + +(defsetf undo-tree-node-redo-beginning (node) (val) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (unless (undo-tree-region-data-p r) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :region + (setq r (undo-tree-make-region-data))))) + (setf (undo-tree-region-data-redo-beginning r) ,val))) + +(defsetf undo-tree-node-redo-end (node) (val) + `(let ((r (plist-get (undo-tree-node-meta-data ,node) :region))) + (unless (undo-tree-region-data-p r) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :region + (setq r (undo-tree-make-region-data))))) + (setf (undo-tree-region-data-redo-end r) ,val))) + + + +(defstruct + (undo-tree-visualizer-data + (:type vector) ; create unnamed struct + (:constructor nil) + (:constructor undo-tree-make-visualizer-data + (&optional lwidth cwidth rwidth marker)) + (:copier nil)) + lwidth cwidth rwidth marker) + + +(defmacro undo-tree-visualizer-data-p (v) + (let ((len (length (undo-tree-make-visualizer-data)))) + `(and (vectorp ,v) (= (length ,v) ,len)))) + +(defun undo-tree-node-clear-visualizer-data (node) + (let ((plist (undo-tree-node-meta-data node))) + (if (eq (car plist) :visualizer) + (setf (undo-tree-node-meta-data node) (nthcdr 2 plist)) + (while (and plist (not (eq (cadr plist) :visualizer))) + (setq plist (cdr plist))) + (if plist (setcdr plist (nthcdr 3 plist)))))) + +(defmacro undo-tree-node-lwidth (node) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (when (undo-tree-visualizer-data-p v) + (undo-tree-visualizer-data-lwidth v)))) + +(defmacro undo-tree-node-cwidth (node) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (when (undo-tree-visualizer-data-p v) + (undo-tree-visualizer-data-cwidth v)))) + +(defmacro undo-tree-node-rwidth (node) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (when (undo-tree-visualizer-data-p v) + (undo-tree-visualizer-data-rwidth v)))) + +(defmacro undo-tree-node-marker (node) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (when (undo-tree-visualizer-data-p v) + (undo-tree-visualizer-data-marker v)))) + + +(defsetf undo-tree-node-lwidth (node) (val) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (unless (undo-tree-visualizer-data-p v) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :visualizer + (setq v (undo-tree-make-visualizer-data))))) + (setf (undo-tree-visualizer-data-lwidth v) ,val))) + +(defsetf undo-tree-node-cwidth (node) (val) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (unless (undo-tree-visualizer-data-p v) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :visualizer + (setq v (undo-tree-make-visualizer-data))))) + (setf (undo-tree-visualizer-data-cwidth v) ,val))) + +(defsetf undo-tree-node-rwidth (node) (val) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (unless (undo-tree-visualizer-data-p v) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :visualizer + (setq v (undo-tree-make-visualizer-data))))) + (setf (undo-tree-visualizer-data-rwidth v) ,val))) + +(defsetf undo-tree-node-marker (node) (val) + `(let ((v (plist-get (undo-tree-node-meta-data ,node) :visualizer))) + (unless (undo-tree-visualizer-data-p v) + (setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :visualizer + (setq v (undo-tree-make-visualizer-data))))) + (setf (undo-tree-visualizer-data-marker v) ,val))) + + + +(defstruct + (undo-tree-register-data + (:type vector) + (:constructor nil) + (:constructor undo-tree-make-register-data (buffer node))) + buffer node) + +(defun undo-tree-register-data-p (data) + (and (vectorp data) + (= (length data) 2) + (undo-tree-node-p (undo-tree-register-data-node data)))) + +(defun undo-tree-register-data-print-func (data) + (princ (format "an undo-tree state for buffer %s" + (undo-tree-register-data-buffer data)))) + +(defmacro undo-tree-node-register (node) + `(plist-get (undo-tree-node-meta-data ,node) :register)) + +(defsetf undo-tree-node-register (node) (val) + `(setf (undo-tree-node-meta-data ,node) + (plist-put (undo-tree-node-meta-data ,node) :register ,val))) + + + + +;;; ===================================================================== +;;; Basic undo-tree data structure functions + +(defun undo-tree-grow (undo) + "Add an UNDO node to current branch of `buffer-undo-tree'." + (let* ((current (undo-tree-current buffer-undo-tree)) + (new (undo-tree-make-node current undo))) + (push new (undo-tree-node-next current)) + (setf (undo-tree-current buffer-undo-tree) new))) + + +(defun undo-tree-grow-backwards (node undo &optional redo) + "Add new node *above* undo-tree NODE, and return new node. +Note that this will overwrite NODE's \"previous\" link, so should +only be used on a detached NODE, never on nodes that are already +part of `buffer-undo-tree'." + (let ((new (undo-tree-make-node-backwards node undo redo))) + (setf (undo-tree-node-previous node) new) + new)) + + +(defun undo-tree-splice-node (node splice) + "Splice NODE into undo tree, below node SPLICE. +Note that this will overwrite NODE's \"next\" and \"previous\" +links, so should only be used on a detached NODE, never on nodes +that are already part of `buffer-undo-tree'." + (setf (undo-tree-node-next node) (undo-tree-node-next splice) + (undo-tree-node-branch node) (undo-tree-node-branch splice) + (undo-tree-node-previous node) splice + (undo-tree-node-next splice) (list node) + (undo-tree-node-branch splice) 0) + (dolist (n (undo-tree-node-next node)) + (setf (undo-tree-node-previous n) node))) + + +(defun undo-tree-snip-node (node) + "Snip NODE out of undo tree." + (let* ((parent (undo-tree-node-previous node)) + position p) + ;; if NODE is only child, replace parent's next links with NODE's + (if (= (length (undo-tree-node-next parent)) 0) + (setf (undo-tree-node-next parent) (undo-tree-node-next node) + (undo-tree-node-branch parent) (undo-tree-node-branch node)) + ;; otherwise... + (setq position (undo-tree-position node (undo-tree-node-next parent))) + (cond + ;; if active branch used do go via NODE, set parent's branch to active + ;; branch of NODE + ((= (undo-tree-node-branch parent) position) + (setf (undo-tree-node-branch parent) + (+ position (undo-tree-node-branch node)))) + ;; if active branch didn't go via NODE, update parent's branch to point + ;; to same node as before + ((> (undo-tree-node-branch parent) position) + (incf (undo-tree-node-branch parent) + (1- (length (undo-tree-node-next node)))))) + ;; replace NODE in parent's next list with NODE's entire next list + (if (= position 0) + (setf (undo-tree-node-next parent) + (nconc (undo-tree-node-next node) + (cdr (undo-tree-node-next parent)))) + (setq p (nthcdr (1- position) (undo-tree-node-next parent))) + (setcdr p (nconc (undo-tree-node-next node) (cddr p))))) + ;; update previous links of NODE's children + (dolist (n (undo-tree-node-next node)) + (setf (undo-tree-node-previous n) parent)))) + + +(defun undo-tree-mapc (--undo-tree-mapc-function-- node) + ;; Apply FUNCTION to NODE and to each node below it. + (let ((stack (list node)) + n) + (while stack + (setq n (pop stack)) + (funcall --undo-tree-mapc-function-- n) + (setq stack (append (undo-tree-node-next n) stack))))) + + +(defmacro undo-tree-num-branches () + "Return number of branches at current undo tree node." + '(length (undo-tree-node-next (undo-tree-current buffer-undo-tree)))) + + +(defun undo-tree-position (node list) + "Find the first occurrence of NODE in LIST. +Return the index of the matching item, or nil of not found. +Comparison is done with `eq'." + (let ((i 0)) + (catch 'found + (while (progn + (when (eq node (car list)) (throw 'found i)) + (incf i) + (setq list (cdr list)))) + nil))) + + +(defvar *undo-tree-id-counter* 0) +(make-variable-buffer-local '*undo-tree-id-counter*) + +(defmacro undo-tree-generate-id () + ;; Generate a new, unique id (uninterned symbol). + ;; The name is made by appending a number to "undo-tree-id". + ;; (Copied from CL package `gensym'.) + `(let ((num (prog1 *undo-tree-id-counter* (incf *undo-tree-id-counter*)))) + (make-symbol (format "undo-tree-id%d" num)))) + + +(defun undo-tree-decircle (undo-tree) + ;; Nullify PREVIOUS links of UNDO-TREE nodes, to make UNDO-TREE data + ;; structure non-circular. + (undo-tree-mapc + (lambda (node) + (dolist (n (undo-tree-node-next node)) + (setf (undo-tree-node-previous n) nil))) + (undo-tree-root undo-tree))) + + +(defun undo-tree-recircle (undo-tree) + ;; Recreate PREVIOUS links of UNDO-TREE nodes, to restore circular UNDO-TREE + ;; data structure. + (undo-tree-mapc + (lambda (node) + (dolist (n (undo-tree-node-next node)) + (setf (undo-tree-node-previous n) node))) + (undo-tree-root undo-tree))) + + + + +;;; ===================================================================== +;;; Undo list and undo changeset utility functions + +(defmacro undo-list-marker-elt-p (elt) + `(markerp (car-safe ,elt))) + +(defmacro undo-list-GCd-marker-elt-p (elt) + ;; Return t if ELT is a marker element whose marker has been moved to the + ;; object-pool, so may potentially have been garbage-collected. + ;; Note: Valid marker undo elements should be uniquely identified as cons + ;; cells with a symbol in the car (replacing the marker), and a number in + ;; the cdr. However, to guard against future changes to undo element + ;; formats, we perform an additional redundant check on the symbol name. + `(and (car-safe ,elt) + (symbolp (car ,elt)) + (let ((str (symbol-name (car ,elt)))) + (and (> (length str) 12) + (string= (substring str 0 12) "undo-tree-id"))) + (numberp (cdr-safe ,elt)))) + + +(defun undo-tree-move-GC-elts-to-pool (elt) + ;; Move elements that can be garbage-collected into `buffer-undo-tree' + ;; object pool, substituting a unique id that can be used to retrieve them + ;; later. (Only markers require this treatment currently.) + (when (undo-list-marker-elt-p elt) + (let ((id (undo-tree-generate-id))) + (puthash id (car elt) (undo-tree-object-pool buffer-undo-tree)) + (setcar elt id)))) + + +(defun undo-tree-restore-GC-elts-from-pool (elt) + ;; Replace object id's in ELT with corresponding objects from + ;; `buffer-undo-tree' object pool and return modified ELT, or return nil if + ;; any object in ELT has been garbage-collected. + (if (undo-list-GCd-marker-elt-p elt) + (when (setcar elt (gethash (car elt) + (undo-tree-object-pool buffer-undo-tree))) + elt) + elt)) + + +(defun undo-list-clean-GCd-elts (undo-list) + ;; Remove object id's from UNDO-LIST that refer to elements that have been + ;; garbage-collected. UNDO-LIST is modified by side-effect. + (while (undo-list-GCd-marker-elt-p (car undo-list)) + (unless (gethash (caar undo-list) + (undo-tree-object-pool buffer-undo-tree)) + (setq undo-list (cdr undo-list)))) + (let ((p undo-list)) + (while (cdr p) + (when (and (undo-list-GCd-marker-elt-p (cadr p)) + (null (gethash (car (cadr p)) + (undo-tree-object-pool buffer-undo-tree)))) + (setcdr p (cddr p))) + (setq p (cdr p)))) + undo-list) + + +(defun undo-list-pop-changeset (&optional discard-pos) + ;; Pop changeset from `buffer-undo-list'. If DISCARD-POS is non-nil, discard + ;; any position entries from changeset. + + ;; discard undo boundaries and (if DISCARD-POS is non-nil) position entries + ;; at head of undo list + (while (or (null (car buffer-undo-list)) + (and discard-pos (integerp (car buffer-undo-list)))) + (setq buffer-undo-list (cdr buffer-undo-list))) + ;; pop elements up to next undo boundary, discarding position entries if + ;; DISCARD-POS is non-nil + (if (eq (car buffer-undo-list) 'undo-tree-canary) + (push nil buffer-undo-list) + (let* ((changeset (list (pop buffer-undo-list))) + (p changeset)) + (while (progn + (undo-tree-move-GC-elts-to-pool (car p)) + (while (and discard-pos (integerp (car buffer-undo-list))) + (setq buffer-undo-list (cdr buffer-undo-list))) + (and (car buffer-undo-list) + (not (eq (car buffer-undo-list) 'undo-tree-canary)))) + (setcdr p (list (pop buffer-undo-list))) + (setq p (cdr p))) + changeset))) + + +(defun undo-tree-copy-list (undo-list) + ;; Return a deep copy of first changeset in `undo-list'. Object id's are + ;; replaced by corresponding objects from `buffer-undo-tree' object-pool. + (when undo-list + (let (copy p) + ;; if first element contains an object id, replace it with object from + ;; pool, discarding element entirely if it's been GC'd + (while (null copy) + (setq copy + (undo-tree-restore-GC-elts-from-pool (pop undo-list)))) + (setq copy (list copy) + p copy) + ;; copy remaining elements, replacing object id's with objects from + ;; pool, or discarding them entirely if they've been GC'd + (while undo-list + (when (setcdr p (undo-tree-restore-GC-elts-from-pool + (undo-copy-list-1 (pop undo-list)))) + (setcdr p (list (cdr p))) + (setq p (cdr p)))) + copy))) + + + +(defun undo-list-transfer-to-tree () + ;; Transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree'. + + ;; `undo-list-transfer-to-tree' should never be called when undo is disabled + ;; (i.e. `buffer-undo-tree' is t) + (assert (not (eq buffer-undo-tree t))) + + ;; if `buffer-undo-tree' is empty, create initial undo-tree + (when (null buffer-undo-tree) (setq buffer-undo-tree (make-undo-tree))) + ;; make sure there's a canary at end of `buffer-undo-list' + (when (null buffer-undo-list) + (setq buffer-undo-list '(nil undo-tree-canary))) + + (unless (or (eq (cadr buffer-undo-list) 'undo-tree-canary) + (eq (car buffer-undo-list) 'undo-tree-canary)) + ;; create new node from first changeset in `buffer-undo-list', save old + ;; `buffer-undo-tree' current node, and make new node the current node + (let* ((node (undo-tree-make-node nil (undo-list-pop-changeset))) + (splice (undo-tree-current buffer-undo-tree)) + (size (undo-list-byte-size (undo-tree-node-undo node))) + (count 1)) + (setf (undo-tree-current buffer-undo-tree) node) + ;; grow tree fragment backwards using `buffer-undo-list' changesets + (while (and buffer-undo-list + (not (eq (cadr buffer-undo-list) 'undo-tree-canary))) + (setq node + (undo-tree-grow-backwards node (undo-list-pop-changeset))) + (incf size (undo-list-byte-size (undo-tree-node-undo node))) + (incf count)) + ;; if no undo history has been discarded from `buffer-undo-list' since + ;; last transfer, splice new tree fragment onto end of old + ;; `buffer-undo-tree' current node + (if (or (eq (cadr buffer-undo-list) 'undo-tree-canary) + (eq (car buffer-undo-list) 'undo-tree-canary)) + (progn + (setf (undo-tree-node-previous node) splice) + (push node (undo-tree-node-next splice)) + (setf (undo-tree-node-branch splice) 0) + (incf (undo-tree-size buffer-undo-tree) size) + (incf (undo-tree-count buffer-undo-tree) count)) + ;; if undo history has been discarded, replace entire + ;; `buffer-undo-tree' with new tree fragment + (setq node (undo-tree-grow-backwards node nil)) + (setf (undo-tree-root buffer-undo-tree) node) + (setq buffer-undo-list '(nil undo-tree-canary)) + (setf (undo-tree-size buffer-undo-tree) size) + (setf (undo-tree-count buffer-undo-tree) count) + (setq buffer-undo-list '(nil undo-tree-canary)))) + ;; discard undo history if necessary + (undo-tree-discard-history))) + + +(defun undo-list-byte-size (undo-list) + ;; Return size (in bytes) of UNDO-LIST + (let ((size 0) (p undo-list)) + (while p + (incf size 8) ; cons cells use up 8 bytes + (when (and (consp (car p)) (stringp (caar p))) + (incf size (string-bytes (caar p)))) + (setq p (cdr p))) + size)) + + + +(defun undo-list-rebuild-from-tree () + "Rebuild `buffer-undo-list' from information in `buffer-undo-tree'." + (unless (eq buffer-undo-list t) + (undo-list-transfer-to-tree) + (setq buffer-undo-list nil) + (when buffer-undo-tree + (let ((stack (list (list (undo-tree-root buffer-undo-tree))))) + (push (sort (mapcar 'identity (undo-tree-node-next (caar stack))) + (lambda (a b) + (time-less-p (undo-tree-node-timestamp a) + (undo-tree-node-timestamp b)))) + stack) + ;; Traverse tree in depth-and-oldest-first order, but add undo records + ;; on the way down, and redo records on the way up. + (while (or (car stack) + (not (eq (car (nth 1 stack)) + (undo-tree-current buffer-undo-tree)))) + (if (car stack) + (progn + (setq buffer-undo-list + (append (undo-tree-node-undo (caar stack)) + buffer-undo-list)) + (undo-boundary) + (push (sort (mapcar 'identity + (undo-tree-node-next (caar stack))) + (lambda (a b) + (time-less-p (undo-tree-node-timestamp a) + (undo-tree-node-timestamp b)))) + stack)) + (pop stack) + (setq buffer-undo-list + (append (undo-tree-node-redo (caar stack)) + buffer-undo-list)) + (undo-boundary) + (pop (car stack)))))))) + + + + +;;; ===================================================================== +;;; History discarding utility functions + +(defun undo-tree-oldest-leaf (node) + ;; Return oldest leaf node below NODE. + (while (undo-tree-node-next node) + (setq node + (car (sort (mapcar 'identity (undo-tree-node-next node)) + (lambda (a b) + (time-less-p (undo-tree-node-timestamp a) + (undo-tree-node-timestamp b))))))) + node) + + +(defun undo-tree-discard-node (node) + ;; Discard NODE from `buffer-undo-tree', and return next in line for + ;; discarding. + + ;; don't discard current node + (unless (eq node (undo-tree-current buffer-undo-tree)) + + ;; discarding root node... + (if (eq node (undo-tree-root buffer-undo-tree)) + (cond + ;; should always discard branches before root + ((> (length (undo-tree-node-next node)) 1) + (error "Trying to discard undo-tree root which still\ + has multiple branches")) + ;; don't discard root if current node is only child + ((eq (car (undo-tree-node-next node)) + (undo-tree-current buffer-undo-tree)) + nil) + ;; discard root + (t + ;; clear any register referring to root + (let ((r (undo-tree-node-register node))) + (when (and r (eq (get-register r) node)) + (set-register r nil))) + ;; make child of root into new root + (setq node (setf (undo-tree-root buffer-undo-tree) + (car (undo-tree-node-next node)))) + ;; update undo-tree size + (decf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node)))) + (decf (undo-tree-count buffer-undo-tree)) + ;; discard new root's undo data and PREVIOUS link + (setf (undo-tree-node-undo node) nil + (undo-tree-node-redo node) nil + (undo-tree-node-previous node) nil) + ;; if new root has branches, or new root is current node, next node + ;; to discard is oldest leaf, otherwise it's new root + (if (or (> (length (undo-tree-node-next node)) 1) + (eq (car (undo-tree-node-next node)) + (undo-tree-current buffer-undo-tree))) + (undo-tree-oldest-leaf node) + node))) + + ;; discarding leaf node... + (let* ((parent (undo-tree-node-previous node)) + (current (nth (undo-tree-node-branch parent) + (undo-tree-node-next parent)))) + ;; clear any register referring to the discarded node + (let ((r (undo-tree-node-register node))) + (when (and r (eq (get-register r) node)) + (set-register r nil))) + ;; update undo-tree size + (decf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node)))) + (decf (undo-tree-count buffer-undo-tree)) + ;; discard leaf + (setf (undo-tree-node-next parent) + (delq node (undo-tree-node-next parent)) + (undo-tree-node-branch parent) + (undo-tree-position current (undo-tree-node-next parent))) + ;; if parent has branches, or parent is current node, next node to + ;; discard is oldest leaf, otherwise it's the parent itself + (if (or (eq parent (undo-tree-current buffer-undo-tree)) + (and (undo-tree-node-next parent) + (or (not (eq parent (undo-tree-root buffer-undo-tree))) + (> (length (undo-tree-node-next parent)) 1)))) + (undo-tree-oldest-leaf parent) + parent))))) + + + +(defun undo-tree-discard-history () + "Discard undo history until we're within memory usage limits +set by `undo-limit', `undo-strong-limit' and `undo-outer-limit'." + + (when (> (undo-tree-size buffer-undo-tree) undo-limit) + ;; if there are no branches off root, first node to discard is root; + ;; otherwise it's leaf node at botom of oldest branch + (let ((node (if (> (length (undo-tree-node-next + (undo-tree-root buffer-undo-tree))) 1) + (undo-tree-oldest-leaf (undo-tree-root buffer-undo-tree)) + (undo-tree-root buffer-undo-tree)))) + + ;; discard nodes until memory use is within `undo-strong-limit' + (while (and node + (> (undo-tree-size buffer-undo-tree) undo-strong-limit)) + (setq node (undo-tree-discard-node node))) + + ;; discard nodes until next node to discard would bring memory use + ;; within `undo-limit' + (while (and node + ;; check first if last discard has brought us within + ;; `undo-limit', in case we can avoid more expensive + ;; `undo-strong-limit' calculation + ;; Note: this assumes undo-strong-limit > undo-limit; + ;; if not, effectively undo-strong-limit = undo-limit + (> (undo-tree-size buffer-undo-tree) undo-limit) + (> (- (undo-tree-size buffer-undo-tree) + ;; if next node to discard is root, the memory we + ;; free-up comes from discarding changesets from its + ;; only child... + (if (eq node (undo-tree-root buffer-undo-tree)) + (+ (undo-list-byte-size + (undo-tree-node-undo + (car (undo-tree-node-next node)))) + (undo-list-byte-size + (undo-tree-node-redo + (car (undo-tree-node-next node))))) + ;; ...otherwise, it comes from discarding changesets + ;; from along with the node itself + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node))) + )) + undo-limit)) + (setq node (undo-tree-discard-node node))) + + ;; if we're still over the `undo-outer-limit', discard entire history + (when (> (undo-tree-size buffer-undo-tree) undo-outer-limit) + ;; query first if `undo-ask-before-discard' is set + (if undo-ask-before-discard + (when (yes-or-no-p + (format + "Buffer `%s' undo info is %d bytes long; discard it? " + (buffer-name) (undo-tree-size buffer-undo-tree))) + (setq buffer-undo-tree nil)) + ;; otherwise, discard and display warning + (display-warning + '(undo discard-info) + (concat + (format "Buffer `%s' undo info was %d bytes long.\n" + (buffer-name) (undo-tree-size buffer-undo-tree)) + "The undo info was discarded because it exceeded\ + `undo-outer-limit'. + +This is normal if you executed a command that made a huge change +to the buffer. In that case, to prevent similar problems in the +future, set `undo-outer-limit' to a value that is large enough to +cover the maximum size of normal changes you expect a single +command to make, but not so large that it might exceed the +maximum memory allotted to Emacs. + +If you did not execute any such command, the situation is +probably due to a bug and you should report it. + +You can disable the popping up of this buffer by adding the entry +\(undo discard-info) to the user option `warning-suppress-types', +which is defined in the `warnings' library.\n") + :warning) + (setq buffer-undo-tree nil))) + ))) + + + + +;;; ===================================================================== +;;; Visualizer utility functions + +(defun undo-tree-compute-widths (node) + "Recursively compute widths for nodes below NODE." + (let ((stack (list node)) + res) + (while stack + ;; try to compute widths for node at top of stack + (if (undo-tree-node-p + (setq res (undo-tree-node-compute-widths (car stack)))) + ;; if computation fails, it returns a node whose widths still need + ;; computing, which we push onto the stack + (push res stack) + ;; otherwise, store widths and remove it from stack + (setf (undo-tree-node-lwidth (car stack)) (aref res 0) + (undo-tree-node-cwidth (car stack)) (aref res 1) + (undo-tree-node-rwidth (car stack)) (aref res 2)) + (pop stack))))) + + +(defun undo-tree-node-compute-widths (node) + ;; Compute NODE's left-, centre-, and right-subtree widths. Returns widths + ;; (in a vector) if successful. Otherwise, returns a node whose widths need + ;; calculating before NODE's can be calculated. + (let ((num-children (length (undo-tree-node-next node))) + (lwidth 0) (cwidth 0) (rwidth 0) p) + (catch 'need-widths + (cond + ;; leaf nodes have 0 width + ((= 0 num-children) + (setf cwidth 1 + (undo-tree-node-lwidth node) 0 + (undo-tree-node-cwidth node) 1 + (undo-tree-node-rwidth node) 0)) + + ;; odd number of children + ((= (mod num-children 2) 1) + (setq p (undo-tree-node-next node)) + ;; compute left-width + (dotimes (i (/ num-children 2)) + (if (undo-tree-node-lwidth (car p)) + (incf lwidth (+ (undo-tree-node-lwidth (car p)) + (undo-tree-node-cwidth (car p)) + (undo-tree-node-rwidth (car p)))) + ;; if child's widths haven't been computed, return that child + (throw 'need-widths (car p))) + (setq p (cdr p))) + (if (undo-tree-node-lwidth (car p)) + (incf lwidth (undo-tree-node-lwidth (car p))) + (throw 'need-widths (car p))) + ;; centre-width is inherited from middle child + (setf cwidth (undo-tree-node-cwidth (car p))) + ;; compute right-width + (incf rwidth (undo-tree-node-rwidth (car p))) + (setq p (cdr p)) + (dotimes (i (/ num-children 2)) + (if (undo-tree-node-lwidth (car p)) + (incf rwidth (+ (undo-tree-node-lwidth (car p)) + (undo-tree-node-cwidth (car p)) + (undo-tree-node-rwidth (car p)))) + (throw 'need-widths (car p))) + (setq p (cdr p)))) + + ;; even number of children + (t + (setq p (undo-tree-node-next node)) + ;; compute left-width + (dotimes (i (/ num-children 2)) + (if (undo-tree-node-lwidth (car p)) + (incf lwidth (+ (undo-tree-node-lwidth (car p)) + (undo-tree-node-cwidth (car p)) + (undo-tree-node-rwidth (car p)))) + (throw 'need-widths (car p))) + (setq p (cdr p))) + ;; centre-width is 0 when number of children is even + (setq cwidth 0) + ;; compute right-width + (dotimes (i (/ num-children 2)) + (if (undo-tree-node-lwidth (car p)) + (incf rwidth (+ (undo-tree-node-lwidth (car p)) + (undo-tree-node-cwidth (car p)) + (undo-tree-node-rwidth (car p)))) + (throw 'need-widths (car p))) + (setq p (cdr p))))) + + ;; return left-, centre- and right-widths + (vector lwidth cwidth rwidth)))) + + +(defun undo-tree-clear-visualizer-data (tree) + ;; Clear visualizer data below NODE. + (undo-tree-mapc + (lambda (n) (undo-tree-node-clear-visualizer-data n)) + (undo-tree-root tree))) + + +(defun undo-tree-node-unmodified-p (node &optional mtime) + ;; Return non-nil if NODE corresponds to a buffer state that once upon a + ;; time was unmodified. If a file modification time MTIME is specified, + ;; return non-nil if the corresponding buffer state really is unmodified. + (let (changeset ntime) + (setq changeset + (or (undo-tree-node-redo node) + (and (setq changeset (car (undo-tree-node-next node))) + (undo-tree-node-undo changeset))) + ntime + (catch 'found + (dolist (elt changeset) + (when (and (consp elt) (eq (car elt) t) (consp (cdr elt)) + (throw 'found (cdr elt))))))) + (and ntime + (or (null mtime) + ;; high-precision timestamps + (if (listp (cdr ntime)) + (equal ntime mtime) + ;; old-style timestamps + (and (= (car ntime) (car mtime)) + (= (cdr ntime) (cadr mtime)))))))) + + + + +;;; ===================================================================== +;;; Undo-in-region utility functions + +;; `undo-elt-in-region' uses this as a dynamically-scoped variable +(defvar undo-adjusted-markers nil) + + +(defun undo-tree-pull-undo-in-region-branch (start end) + ;; Pull out entries from undo changesets to create a new undo-in-region + ;; branch, which undoes changeset entries lying between START and END first, + ;; followed by remaining entries from the changesets, before rejoining the + ;; existing undo tree history. Repeated calls will, if appropriate, extend + ;; the current undo-in-region branch rather than creating a new one. + + ;; if we're just reverting the last redo-in-region, we don't need to + ;; manipulate the undo tree at all + (if (undo-tree-reverting-redo-in-region-p start end) + t ; return t to indicate success + + ;; We build the `region-changeset' and `delta-list' lists forwards, using + ;; pointers `r' and `d' to the penultimate element of the list. So that we + ;; don't have to treat the first element differently, we prepend a dummy + ;; leading nil to the lists, and have the pointers point to that + ;; initially. + ;; Note: using '(nil) instead of (list nil) in the `let*' results in + ;; bizarre errors when the code is byte-compiled, where parts of the + ;; lists appear to survive across different calls to this function. + ;; An obscure byte-compiler bug, perhaps? + (let* ((region-changeset (list nil)) + (r region-changeset) + (delta-list (list nil)) + (d delta-list) + (node (undo-tree-current buffer-undo-tree)) + (repeated-undo-in-region + (undo-tree-repeated-undo-in-region-p start end)) + undo-adjusted-markers ; `undo-elt-in-region' expects this + fragment splice original-fragment original-splice original-current + got-visible-elt undo-list elt) + + ;; --- initialisation --- + (cond + ;; if this is a repeated undo in the same region, start pulling changes + ;; from NODE at which undo-in-region branch iss attached, and detatch + ;; the branch, using it as initial FRAGMENT of branch being constructed + (repeated-undo-in-region + (setq original-current node + fragment (car (undo-tree-node-next node)) + splice node) + ;; undo up to node at which undo-in-region branch is attached + ;; (recognizable as first node with more than one branch) + (let ((mark-active nil)) + (while (= (length (undo-tree-node-next node)) 1) + (undo-tree-undo-1) + (setq fragment node + node (undo-tree-current buffer-undo-tree)))) + (when (eq splice node) (setq splice nil)) + ;; detatch undo-in-region branch + (setf (undo-tree-node-next node) + (delq fragment (undo-tree-node-next node)) + (undo-tree-node-previous fragment) nil + original-fragment fragment + original-splice node)) + + ;; if this is a new undo-in-region, initial FRAGMENT is a copy of all + ;; nodes below the current one in the active branch + ((undo-tree-node-next node) + (setq fragment (undo-tree-make-node nil nil) + splice fragment) + (while (setq node (nth (undo-tree-node-branch node) + (undo-tree-node-next node))) + (push (undo-tree-make-node + splice + (undo-copy-list (undo-tree-node-undo node)) + (undo-copy-list (undo-tree-node-redo node))) + (undo-tree-node-next splice)) + (setq splice (car (undo-tree-node-next splice)))) + (setq fragment (car (undo-tree-node-next fragment)) + splice nil + node (undo-tree-current buffer-undo-tree)))) + + + ;; --- pull undo-in-region elements into branch --- + ;; work backwards up tree, pulling out undo elements within region until + ;; we've got one that undoes a visible change (insertion or deletion) + (catch 'abort + (while (and (not got-visible-elt) node (undo-tree-node-undo node)) + ;; we cons a dummy nil element on the front of the changeset so that + ;; we can conveniently remove the first (real) element from the + ;; changeset if we need to; the leading nil is removed once we're + ;; done with this changeset + (setq undo-list (cons nil (undo-copy-list (undo-tree-node-undo node))) + elt (cadr undo-list)) + (if fragment + (progn + (setq fragment (undo-tree-grow-backwards fragment undo-list)) + (unless splice (setq splice fragment))) + (setq fragment (undo-tree-make-node nil undo-list)) + (setq splice fragment)) + + (while elt + (cond + ;; keep elements within region + ((undo-elt-in-region elt start end) + ;; set flag if kept element is visible (insertion or deletion) + (when (and (consp elt) + (or (stringp (car elt)) (integerp (car elt)))) + (setq got-visible-elt t)) + ;; adjust buffer positions in elements previously undone before + ;; kept element, as kept element will now be undone first + (undo-tree-adjust-elements-to-elt splice elt) + ;; move kept element to undo-in-region changeset, adjusting its + ;; buffer position as it will now be undone first + (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list)))) + (setq r (cdr r)) + (setcdr undo-list (cddr undo-list))) + + ;; discard "was unmodified" elements + ;; FIXME: deal properly with these + ((and (consp elt) (eq (car elt) t)) + (setcdr undo-list (cddr undo-list))) + + ;; if element crosses region, we can't pull any more elements + ((undo-elt-crosses-region elt start end) + ;; if we've found a visible element, it must be earlier in + ;; current node's changeset; stop pulling elements (null + ;; `undo-list' and non-nil `got-visible-elt' cause loop to exit) + (if got-visible-elt + (setq undo-list nil) + ;; if we haven't found a visible element yet, pulling + ;; undo-in-region branch has failed + (setq region-changeset nil) + (throw 'abort t))) + + ;; if rejecting element, add its delta (if any) to the list + (t + (let ((delta (undo-delta elt))) + (when (/= 0 (cdr delta)) + (setcdr d (list delta)) + (setq d (cdr d)))) + (setq undo-list (cdr undo-list)))) + + ;; process next element of current changeset + (setq elt (cadr undo-list))) + + ;; if there are remaining elements in changeset, remove dummy nil + ;; from front + (if (cadr (undo-tree-node-undo fragment)) + (pop (undo-tree-node-undo fragment)) + ;; otherwise, if we've kept all elements in changeset, discard + ;; empty changeset + (when (eq splice fragment) (setq splice nil)) + (setq fragment (car (undo-tree-node-next fragment)))) + ;; process changeset from next node up the tree + (setq node (undo-tree-node-previous node)))) + + ;; pop dummy nil from front of `region-changeset' + (setq region-changeset (cdr region-changeset)) + + + ;; --- integrate branch into tree --- + ;; if no undo-in-region elements were found, restore undo tree + (if (null region-changeset) + (when original-current + (push original-fragment (undo-tree-node-next original-splice)) + (setf (undo-tree-node-branch original-splice) 0 + (undo-tree-node-previous original-fragment) original-splice) + (let ((mark-active nil)) + (while (not (eq (undo-tree-current buffer-undo-tree) + original-current)) + (undo-tree-redo-1))) + nil) ; return nil to indicate failure + + ;; otherwise... + ;; need to undo up to node where new branch will be attached, to + ;; ensure redo entries are populated, and then redo back to where we + ;; started + (let ((mark-active nil) + (current (undo-tree-current buffer-undo-tree))) + (while (not (eq (undo-tree-current buffer-undo-tree) node)) + (undo-tree-undo-1)) + (while (not (eq (undo-tree-current buffer-undo-tree) current)) + (undo-tree-redo-1))) + + (cond + ;; if there's no remaining fragment, just create undo-in-region node + ;; and attach it to parent of last node from which elements were + ;; pulled + ((null fragment) + (setq fragment (undo-tree-make-node node region-changeset)) + (push fragment (undo-tree-node-next node)) + (setf (undo-tree-node-branch node) 0) + ;; set current node to undo-in-region node + (setf (undo-tree-current buffer-undo-tree) fragment)) + + ;; if no splice point has been set, add undo-in-region node to top of + ;; fragment and attach it to parent of last node from which elements + ;; were pulled + ((null splice) + (setq fragment (undo-tree-grow-backwards fragment region-changeset)) + (push fragment (undo-tree-node-next node)) + (setf (undo-tree-node-branch node) 0 + (undo-tree-node-previous fragment) node) + ;; set current node to undo-in-region node + (setf (undo-tree-current buffer-undo-tree) fragment)) + + ;; if fragment contains nodes, attach fragment to parent of last node + ;; from which elements were pulled, and splice in undo-in-region node + (t + (setf (undo-tree-node-previous fragment) node) + (push fragment (undo-tree-node-next node)) + (setf (undo-tree-node-branch node) 0) + ;; if this is a repeated undo-in-region, then we've left the current + ;; node at the original splice-point; we need to set the current + ;; node to the equivalent node on the undo-in-region branch and redo + ;; back to where we started + (when repeated-undo-in-region + (setf (undo-tree-current buffer-undo-tree) + (undo-tree-node-previous original-fragment)) + (let ((mark-active nil)) + (while (not (eq (undo-tree-current buffer-undo-tree) splice)) + (undo-tree-redo-1 nil 'preserve-undo)))) + ;; splice new undo-in-region node into fragment + (setq node (undo-tree-make-node nil region-changeset)) + (undo-tree-splice-node node splice) + ;; set current node to undo-in-region node + (setf (undo-tree-current buffer-undo-tree) node))) + + ;; update undo-tree size + (setq node (undo-tree-node-previous fragment)) + (while (progn + (and (setq node (car (undo-tree-node-next node))) + (not (eq node original-fragment)) + (incf (undo-tree-count buffer-undo-tree)) + (incf (undo-tree-size buffer-undo-tree) + (+ (undo-list-byte-size (undo-tree-node-undo node)) + (undo-list-byte-size (undo-tree-node-redo node))))))) + t) ; indicate undo-in-region branch was successfully pulled + ))) + + + +(defun undo-tree-pull-redo-in-region-branch (start end) + ;; Pull out entries from redo changesets to create a new redo-in-region + ;; branch, which redoes changeset entries lying between START and END first, + ;; followed by remaining entries from the changesets. Repeated calls will, + ;; if appropriate, extend the current redo-in-region branch rather than + ;; creating a new one. + + ;; if we're just reverting the last undo-in-region, we don't need to + ;; manipulate the undo tree at all + (if (undo-tree-reverting-undo-in-region-p start end) + t ; return t to indicate success + + ;; We build the `region-changeset' and `delta-list' lists forwards, using + ;; pointers `r' and `d' to the penultimate element of the list. So that we + ;; don't have to treat the first element differently, we prepend a dummy + ;; leading nil to the lists, and have the pointers point to that + ;; initially. + ;; Note: using '(nil) instead of (list nil) in the `let*' causes bizarre + ;; errors when the code is byte-compiled, where parts of the lists + ;; appear to survive across different calls to this function. An + ;; obscure byte-compiler bug, perhaps? + (let* ((region-changeset (list nil)) + (r region-changeset) + (delta-list (list nil)) + (d delta-list) + (node (undo-tree-current buffer-undo-tree)) + (repeated-redo-in-region + (undo-tree-repeated-redo-in-region-p start end)) + undo-adjusted-markers ; `undo-elt-in-region' expects this + fragment splice got-visible-elt redo-list elt) + + ;; --- inisitalisation --- + (cond + ;; if this is a repeated redo-in-region, detach fragment below current + ;; node + (repeated-redo-in-region + (when (setq fragment (car (undo-tree-node-next node))) + (setf (undo-tree-node-previous fragment) nil + (undo-tree-node-next node) + (delq fragment (undo-tree-node-next node))))) + ;; if this is a new redo-in-region, initial fragment is a copy of all + ;; nodes below the current one in the active branch + ((undo-tree-node-next node) + (setq fragment (undo-tree-make-node nil nil) + splice fragment) + (while (setq node (nth (undo-tree-node-branch node) + (undo-tree-node-next node))) + (push (undo-tree-make-node + splice nil + (undo-copy-list (undo-tree-node-redo node))) + (undo-tree-node-next splice)) + (setq splice (car (undo-tree-node-next splice)))) + (setq fragment (car (undo-tree-node-next fragment))))) + + + ;; --- pull redo-in-region elements into branch --- + ;; work down fragment, pulling out redo elements within region until + ;; we've got one that redoes a visible change (insertion or deletion) + (setq node fragment) + (catch 'abort + (while (and (not got-visible-elt) node (undo-tree-node-redo node)) + ;; we cons a dummy nil element on the front of the changeset so that + ;; we can conveniently remove the first (real) element from the + ;; changeset if we need to; the leading nil is removed once we're + ;; done with this changeset + (setq redo-list (push nil (undo-tree-node-redo node)) + elt (cadr redo-list)) + (while elt + (cond + ;; keep elements within region + ((undo-elt-in-region elt start end) + ;; set flag if kept element is visible (insertion or deletion) + (when (and (consp elt) + (or (stringp (car elt)) (integerp (car elt)))) + (setq got-visible-elt t)) + ;; adjust buffer positions in elements previously redone before + ;; kept element, as kept element will now be redone first + (undo-tree-adjust-elements-to-elt fragment elt t) + ;; move kept element to redo-in-region changeset, adjusting its + ;; buffer position as it will now be redone first + (setcdr r (list (undo-tree-apply-deltas elt (cdr delta-list) -1))) + (setq r (cdr r)) + (setcdr redo-list (cddr redo-list))) + + ;; discard "was unmodified" elements + ;; FIXME: deal properly with these + ((and (consp elt) (eq (car elt) t)) + (setcdr redo-list (cddr redo-list))) + + ;; if element crosses region, we can't pull any more elements + ((undo-elt-crosses-region elt start end) + ;; if we've found a visible element, it must be earlier in + ;; current node's changeset; stop pulling elements (null + ;; `redo-list' and non-nil `got-visible-elt' cause loop to exit) + (if got-visible-elt + (setq redo-list nil) + ;; if we haven't found a visible element yet, pulling + ;; redo-in-region branch has failed + (setq region-changeset nil) + (throw 'abort t))) + + ;; if rejecting element, add its delta (if any) to the list + (t + (let ((delta (undo-delta elt))) + (when (/= 0 (cdr delta)) + (setcdr d (list delta)) + (setq d (cdr d)))) + (setq redo-list (cdr redo-list)))) + + ;; process next element of current changeset + (setq elt (cadr redo-list))) + + ;; if there are remaining elements in changeset, remove dummy nil + ;; from front + (if (cadr (undo-tree-node-redo node)) + (pop (undo-tree-node-undo node)) + ;; otherwise, if we've kept all elements in changeset, discard + ;; empty changeset + (if (eq fragment node) + (setq fragment (car (undo-tree-node-next fragment))) + (undo-tree-snip-node node))) + ;; process changeset from next node in fragment + (setq node (car (undo-tree-node-next node))))) + + ;; pop dummy nil from front of `region-changeset' + (setq region-changeset (cdr region-changeset)) + + + ;; --- integrate branch into tree --- + (setq node (undo-tree-current buffer-undo-tree)) + ;; if no redo-in-region elements were found, restore undo tree + (if (null (car region-changeset)) + (when (and repeated-redo-in-region fragment) + (push fragment (undo-tree-node-next node)) + (setf (undo-tree-node-branch node) 0 + (undo-tree-node-previous fragment) node) + nil) ; return nil to indicate failure + + ;; otherwise, add redo-in-region node to top of fragment, and attach + ;; it below current node + (setq fragment + (if fragment + (undo-tree-grow-backwards fragment nil region-changeset) + (undo-tree-make-node nil nil region-changeset))) + (push fragment (undo-tree-node-next node)) + (setf (undo-tree-node-branch node) 0 + (undo-tree-node-previous fragment) node) + ;; update undo-tree size + (unless repeated-redo-in-region + (setq node fragment) + (while (and (setq node (car (undo-tree-node-next node))) + (incf (undo-tree-count buffer-undo-tree)) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size + (undo-tree-node-redo node)))))) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo fragment))) + t) ; indicate redo-in-region branch was successfully pulled + ))) + + + +(defun undo-tree-adjust-elements-to-elt (node undo-elt &optional below) + "Adjust buffer positions of undo elements, starting at NODE's +and going up the tree (or down the active branch if BELOW is +non-nil) and through the nodes' undo elements until we reach +UNDO-ELT. UNDO-ELT must appear somewhere in the undo changeset +of either NODE itself or some node above it in the tree." + (let ((delta (list (undo-delta undo-elt))) + (undo-list (undo-tree-node-undo node))) + ;; adjust elements until we reach UNDO-ELT + (while (and (car undo-list) + (not (eq (car undo-list) undo-elt))) + (setcar undo-list + (undo-tree-apply-deltas (car undo-list) delta -1)) + ;; move to next undo element in list, or to next node if we've run out + ;; of elements + (unless (car (setq undo-list (cdr undo-list))) + (if below + (setq node (nth (undo-tree-node-branch node) + (undo-tree-node-next node))) + (setq node (undo-tree-node-previous node))) + (setq undo-list (undo-tree-node-undo node)))))) + + + +(defun undo-tree-apply-deltas (undo-elt deltas &optional sgn) + ;; Apply DELTAS in order to UNDO-ELT, multiplying deltas by SGN + ;; (only useful value for SGN is -1). + (let (position offset) + (dolist (delta deltas) + (setq position (car delta) + offset (* (cdr delta) (or sgn 1))) + (cond + ;; POSITION + ((integerp undo-elt) + (when (>= undo-elt position) + (setq undo-elt (- undo-elt offset)))) + ;; nil (or any other atom) + ((atom undo-elt)) + ;; (TEXT . POSITION) + ((stringp (car undo-elt)) + (let ((text-pos (abs (cdr undo-elt))) + (point-at-end (< (cdr undo-elt) 0))) + (if (>= text-pos position) + (setcdr undo-elt (* (if point-at-end -1 1) + (- text-pos offset)))))) + ;; (BEGIN . END) + ((integerp (car undo-elt)) + (when (>= (car undo-elt) position) + (setcar undo-elt (- (car undo-elt) offset)) + (setcdr undo-elt (- (cdr undo-elt) offset)))) + ;; (nil PROPERTY VALUE BEG . END) + ((null (car undo-elt)) + (let ((tail (nthcdr 3 undo-elt))) + (when (>= (car tail) position) + (setcar tail (- (car tail) offset)) + (setcdr tail (- (cdr tail) offset))))) + )) + undo-elt)) + + + +(defun undo-tree-repeated-undo-in-region-p (start end) + ;; Return non-nil if undo-in-region between START and END is a repeated + ;; undo-in-region + (let ((node (undo-tree-current buffer-undo-tree))) + (and (setq node + (nth (undo-tree-node-branch node) (undo-tree-node-next node))) + (eq (undo-tree-node-undo-beginning node) start) + (eq (undo-tree-node-undo-end node) end)))) + + +(defun undo-tree-repeated-redo-in-region-p (start end) + ;; Return non-nil if undo-in-region between START and END is a repeated + ;; undo-in-region + (let ((node (undo-tree-current buffer-undo-tree))) + (and (eq (undo-tree-node-redo-beginning node) start) + (eq (undo-tree-node-redo-end node) end)))) + + +;; Return non-nil if undo-in-region between START and END is simply +;; reverting the last redo-in-region +(defalias 'undo-tree-reverting-undo-in-region-p + 'undo-tree-repeated-undo-in-region-p) + + +;; Return non-nil if redo-in-region between START and END is simply +;; reverting the last undo-in-region +(defalias 'undo-tree-reverting-redo-in-region-p + 'undo-tree-repeated-redo-in-region-p) + + + + +;;; ===================================================================== +;;; Undo-tree commands + +;;;###autoload +(define-minor-mode undo-tree-mode + "Toggle undo-tree mode. +With no argument, this command toggles the mode. +A positive prefix argument turns the mode on. +A negative prefix argument turns it off. + +Undo-tree-mode replaces Emacs' standard undo feature with a more +powerful yet easier to use version, that treats the undo history +as what it is: a tree. + +The following keys are available in `undo-tree-mode': + + \\{undo-tree-map} + +Within the undo-tree visualizer, the following keys are available: + + \\{undo-tree-visualizer-mode-map}" + + nil ; init value + undo-tree-mode-lighter ; lighter + undo-tree-map ; keymap + + ;; if disabling `undo-tree-mode', rebuild `buffer-undo-list' from tree so + ;; Emacs undo can work + (when (not undo-tree-mode) + (undo-list-rebuild-from-tree) + (setq buffer-undo-tree nil))) + + +(defun turn-on-undo-tree-mode (&optional print-message) + "Enable `undo-tree-mode' in the current buffer, when appropriate. +Some major modes implement their own undo system, which should +not normally be overridden by `undo-tree-mode'. This command does +not enable `undo-tree-mode' in such buffers. If you want to force +`undo-tree-mode' to be enabled regardless, use (undo-tree-mode 1) +instead. + +The heuristic used to detect major modes in which +`undo-tree-mode' should not be used is to check whether either +the `undo' command has been remapped, or the default undo +keybindings (C-/ and C-_) have been overridden somewhere other +than in the global map. In addition, `undo-tree-mode' will not be +enabled if the buffer's `major-mode' appears in +`undo-tree-incompatible-major-modes'." + (interactive "p") + (if (or (key-binding [remap undo]) + (undo-tree-overridden-undo-bindings-p) + (memq major-mode undo-tree-incompatible-major-modes)) + (when print-message + (message "Buffer does not support undo-tree-mode;\ + undo-tree-mode NOT enabled")) + (undo-tree-mode 1))) + + +(defun undo-tree-overridden-undo-bindings-p () + "Returns t if default undo bindings are overridden, nil otherwise. +Checks if either of the default undo key bindings (\"C-/\" or +\"C-_\") are overridden in the current buffer by any keymap other +than the global one. (So global redefinitions of the default undo +key bindings do not count.)" + (let ((binding1 (lookup-key (current-global-map) [?\C-/])) + (binding2 (lookup-key (current-global-map) [?\C-_]))) + (global-set-key [?\C-/] 'undo) + (global-set-key [?\C-_] 'undo) + (unwind-protect + (or (and (key-binding [?\C-/]) + (not (eq (key-binding [?\C-/]) 'undo))) + (and (key-binding [?\C-_]) + (not (eq (key-binding [?\C-_]) 'undo)))) + (global-set-key [?\C-/] binding1) + (global-set-key [?\C-_] binding2)))) + + +;;;###autoload +(define-globalized-minor-mode global-undo-tree-mode + undo-tree-mode turn-on-undo-tree-mode) + + + +(defun undo-tree-undo (&optional arg) + "Undo changes. +Repeat this command to undo more changes. +A numeric ARG serves as a repeat count. + +In Transient Mark mode when the mark is active, only undo changes +within the current region. Similarly, when not in Transient Mark +mode, just \\[universal-argument] as an argument limits undo to +changes within the current region." + (interactive "*P") + ;; throw error if undo is disabled in buffer + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + (undo-tree-undo-1 arg) + ;; inform user if at branch point + (when (> (undo-tree-num-branches) 1) (message "Undo branch point!"))) + + +(defun undo-tree-undo-1 (&optional arg preserve-redo preserve-timestamps) + ;; Internal undo function. An active mark in `transient-mark-mode', or + ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-REDO + ;; causes the existing redo record to be preserved, rather than replacing it + ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS + ;; disables updating of timestamps in visited undo-tree nodes. (This latter + ;; should *only* be used when temporarily visiting another undo state and + ;; immediately returning to the original state afterwards. Otherwise, it + ;; could cause history-discarding errors.) + (let ((undo-in-progress t) + (undo-in-region (and undo-tree-enable-undo-in-region + (or (region-active-p) + (and arg (not (numberp arg)))))) + pos current) + ;; transfer entries accumulated in `buffer-undo-list' to + ;; `buffer-undo-tree' + (undo-list-transfer-to-tree) + + (dotimes (i (or (and (numberp arg) (prefix-numeric-value arg)) 1)) + ;; check if at top of undo tree + (unless (undo-tree-node-previous (undo-tree-current buffer-undo-tree)) + (user-error "No further undo information")) + + ;; if region is active, or a non-numeric prefix argument was supplied, + ;; try to pull out a new branch of changes affecting the region + (when (and undo-in-region + (not (undo-tree-pull-undo-in-region-branch + (region-beginning) (region-end)))) + (user-error "No further undo information for region")) + + ;; remove any GC'd elements from node's undo list + (setq current (undo-tree-current buffer-undo-tree)) + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) + (setf (undo-tree-node-undo current) + (undo-list-clean-GCd-elts (undo-tree-node-undo current))) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) + ;; undo one record from undo tree + (when undo-in-region + (setq pos (set-marker (make-marker) (point))) + (set-marker-insertion-type pos t)) + (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-undo current))) + (undo-boundary) + + ;; if preserving old redo record, discard new redo entries that + ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd + ;; elements from node's redo list + (if preserve-redo + (progn + (undo-list-pop-changeset) + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) + (setf (undo-tree-node-redo current) + (undo-list-clean-GCd-elts (undo-tree-node-redo current))) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current)))) + ;; otherwise, record redo entries that `primitive-undo' has added to + ;; `buffer-undo-list' in current node's redo record, replacing + ;; existing entry if one already exists + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) + (setf (undo-tree-node-redo current) + (undo-list-pop-changeset 'discard-pos)) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current)))) + + ;; rewind current node and update timestamp + (setf (undo-tree-current buffer-undo-tree) + (undo-tree-node-previous (undo-tree-current buffer-undo-tree))) + (unless preserve-timestamps + (setf (undo-tree-node-timestamp (undo-tree-current buffer-undo-tree)) + (current-time))) + + ;; if undoing-in-region, record current node, region and direction so we + ;; can tell if undo-in-region is repeated, and re-activate mark if in + ;; `transient-mark-mode'; if not, erase any leftover data + (if (not undo-in-region) + (undo-tree-node-clear-region-data current) + (goto-char pos) + ;; note: we deliberately want to store the region information in the + ;; node *below* the now current one + (setf (undo-tree-node-undo-beginning current) (region-beginning) + (undo-tree-node-undo-end current) (region-end)) + (set-marker pos nil))) + + ;; undo deactivates mark unless undoing-in-region + (setq deactivate-mark (not undo-in-region)))) + + + +(defun undo-tree-redo (&optional arg) + "Redo changes. A numeric ARG serves as a repeat count. + +In Transient Mark mode when the mark is active, only redo changes +within the current region. Similarly, when not in Transient Mark +mode, just \\[universal-argument] as an argument limits redo to +changes within the current region." + (interactive "*P") + ;; throw error if undo is disabled in buffer + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + (undo-tree-redo-1 arg) + ;; inform user if at branch point + (when (> (undo-tree-num-branches) 1) (message "Undo branch point!"))) + + +(defun undo-tree-redo-1 (&optional arg preserve-undo preserve-timestamps) + ;; Internal redo function. An active mark in `transient-mark-mode', or + ;; non-nil ARG otherwise, enables undo-in-region. Non-nil PRESERVE-UNDO + ;; causes the existing redo record to be preserved, rather than replacing it + ;; with the new one generated by undoing. Non-nil PRESERVE-TIMESTAMPS + ;; disables updating of timestamps in visited undo-tree nodes. (This latter + ;; should *only* be used when temporarily visiting another undo state and + ;; immediately returning to the original state afterwards. Otherwise, it + ;; could cause history-discarding errors.) + (let ((undo-in-progress t) + (redo-in-region (and undo-tree-enable-undo-in-region + (or (region-active-p) + (and arg (not (numberp arg)))))) + pos current) + ;; transfer entries accumulated in `buffer-undo-list' to + ;; `buffer-undo-tree' + (undo-list-transfer-to-tree) + + (dotimes (i (or (and (numberp arg) (prefix-numeric-value arg)) 1)) + ;; check if at bottom of undo tree + (when (null (undo-tree-node-next (undo-tree-current buffer-undo-tree))) + (user-error "No further redo information")) + + ;; if region is active, or a non-numeric prefix argument was supplied, + ;; try to pull out a new branch of changes affecting the region + (when (and redo-in-region + (not (undo-tree-pull-redo-in-region-branch + (region-beginning) (region-end)))) + (user-error "No further redo information for region")) + + ;; get next node (but DON'T advance current node in tree yet, in case + ;; redoing fails) + (setq current (undo-tree-current buffer-undo-tree) + current (nth (undo-tree-node-branch current) + (undo-tree-node-next current))) + ;; remove any GC'd elements from node's redo list + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) + (setf (undo-tree-node-redo current) + (undo-list-clean-GCd-elts (undo-tree-node-redo current))) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-redo current))) + ;; redo one record from undo tree + (when redo-in-region + (setq pos (set-marker (make-marker) (point))) + (set-marker-insertion-type pos t)) + (primitive-undo 1 (undo-tree-copy-list (undo-tree-node-redo current))) + (undo-boundary) + ;; advance current node in tree + (setf (undo-tree-current buffer-undo-tree) current) + + ;; if preserving old undo record, discard new undo entries that + ;; `primitive-undo' has added to `buffer-undo-list', and remove any GC'd + ;; elements from node's redo list + (if preserve-undo + (progn + (undo-list-pop-changeset) + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) + (setf (undo-tree-node-undo current) + (undo-list-clean-GCd-elts (undo-tree-node-undo current))) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current)))) + ;; otherwise, record undo entries that `primitive-undo' has added to + ;; `buffer-undo-list' in current node's undo record, replacing + ;; existing entry if one already exists + (decf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current))) + (setf (undo-tree-node-undo current) + (undo-list-pop-changeset 'discard-pos)) + (incf (undo-tree-size buffer-undo-tree) + (undo-list-byte-size (undo-tree-node-undo current)))) + + ;; update timestamp + (unless preserve-timestamps + (setf (undo-tree-node-timestamp current) (current-time))) + + ;; if redoing-in-region, record current node, region and direction so we + ;; can tell if redo-in-region is repeated, and re-activate mark if in + ;; `transient-mark-mode' + (if (not redo-in-region) + (undo-tree-node-clear-region-data current) + (goto-char pos) + (setf (undo-tree-node-redo-beginning current) (region-beginning) + (undo-tree-node-redo-end current) (region-end)) + (set-marker pos nil))) + + ;; redo deactivates the mark unless redoing-in-region + (setq deactivate-mark (not redo-in-region)))) + + + +(defun undo-tree-switch-branch (branch) + "Switch to a different BRANCH of the undo tree. +This will affect which branch to descend when *redoing* changes +using `undo-tree-redo'." + (interactive (list (or (and prefix-arg (prefix-numeric-value prefix-arg)) + (and (not (eq buffer-undo-list t)) + (or (undo-list-transfer-to-tree) t) + (let ((b (undo-tree-node-branch + (undo-tree-current + buffer-undo-tree)))) + (cond + ;; switch to other branch if only 2 + ((= (undo-tree-num-branches) 2) (- 1 b)) + ;; prompt if more than 2 + ((> (undo-tree-num-branches) 2) + (read-number + (format "Branch (0-%d, on %d): " + (1- (undo-tree-num-branches)) b))) + )))))) + ;; throw error if undo is disabled in buffer + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + ;; sanity check branch number + (when (<= (undo-tree-num-branches) 1) + (user-error "Not at undo branch point")) + (when (or (< branch 0) (> branch (1- (undo-tree-num-branches)))) + (user-error "Invalid branch number")) + ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree' + (undo-list-transfer-to-tree) + ;; switch branch + (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree)) + branch) + (message "Switched to branch %d" branch)) + + +(defun undo-tree-set (node &optional preserve-timestamps) + ;; Set buffer to state corresponding to NODE. Returns intersection point + ;; between path back from current node and path back from selected NODE. + ;; Non-nil PRESERVE-TIMESTAMPS disables updating of timestamps in visited + ;; undo-tree nodes. (This should *only* be used when temporarily visiting + ;; another undo state and immediately returning to the original state + ;; afterwards. Otherwise, it could cause history-discarding errors.) + (let ((path (make-hash-table :test 'eq)) + (n node)) + (puthash (undo-tree-root buffer-undo-tree) t path) + ;; build list of nodes leading back from selected node to root, updating + ;; branches as we go to point down to selected node + (while (progn + (puthash n t path) + (when (undo-tree-node-previous n) + (setf (undo-tree-node-branch (undo-tree-node-previous n)) + (undo-tree-position + n (undo-tree-node-next (undo-tree-node-previous n)))) + (setq n (undo-tree-node-previous n))))) + ;; work backwards from current node until we intersect path back from + ;; selected node + (setq n (undo-tree-current buffer-undo-tree)) + (while (not (gethash n path)) + (setq n (undo-tree-node-previous n))) + ;; ascend tree until intersection node + (while (not (eq (undo-tree-current buffer-undo-tree) n)) + (undo-tree-undo-1 nil nil preserve-timestamps)) + ;; descend tree until selected node + (while (not (eq (undo-tree-current buffer-undo-tree) node)) + (undo-tree-redo-1 nil nil preserve-timestamps)) + n)) ; return intersection node + + + +(defun undo-tree-save-state-to-register (register) + "Store current undo-tree state to REGISTER. +The saved state can be restored using +`undo-tree-restore-state-from-register'. +Argument is a character, naming the register." + (interactive "cUndo-tree state to register: ") + ;; throw error if undo is disabled in buffer + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree' + (undo-list-transfer-to-tree) + ;; save current node to REGISTER + (set-register + register (registerv-make + (undo-tree-make-register-data + (current-buffer) (undo-tree-current buffer-undo-tree)) + :print-func 'undo-tree-register-data-print-func)) + ;; record REGISTER in current node, for visualizer + (setf (undo-tree-node-register (undo-tree-current buffer-undo-tree)) + register)) + + + +(defun undo-tree-restore-state-from-register (register) + "Restore undo-tree state from REGISTER. +The state must be saved using `undo-tree-save-state-to-register'. +Argument is a character, naming the register." + (interactive "*cRestore undo-tree state from register: ") + ;; throw error if undo is disabled in buffer, or if register doesn't contain + ;; an undo-tree node + (let ((data (registerv-data (get-register register)))) + (cond + ((eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + ((not (undo-tree-register-data-p data)) + (user-error "Register doesn't contain undo-tree state")) + ((not (eq (current-buffer) (undo-tree-register-data-buffer data))) + (user-error "Register contains undo-tree state for a different buffer"))) + ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree' + (undo-list-transfer-to-tree) + ;; restore buffer state corresponding to saved node + (undo-tree-set (undo-tree-register-data-node data)))) + + + + +;;; ===================================================================== +;;; Persistent storage commands + +(defun undo-tree-make-history-save-file-name (file) + "Create the undo history file name for FILE. +Normally this is the file's name with \".\" prepended and +\".~undo-tree~\" appended. + +A match for FILE is sought in `undo-tree-history-directory-alist' +\(see the documentation of that variable for details\). If the +directory for the backup doesn't exist, it is created." + (let* ((backup-directory-alist undo-tree-history-directory-alist) + (name (make-backup-file-name-1 file))) + (concat (file-name-directory name) "." (file-name-nondirectory name) + ".~undo-tree~"))) + + +(defun undo-tree-save-history (&optional filename overwrite) + "Store undo-tree history to file. + +If optional argument FILENAME is omitted, default save file is +\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file. +Otherwise, prompt for one. + +If OVERWRITE is non-nil, any existing file will be overwritten +without asking for confirmation." + (interactive) + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + (undo-list-transfer-to-tree) + (when (and buffer-undo-tree (not (eq buffer-undo-tree t))) + (condition-case nil + (undo-tree-kill-visualizer) + (error (undo-tree-clear-visualizer-data buffer-undo-tree))) + (let ((buff (current-buffer)) + tree) + ;; get filename + (unless filename + (setq filename + (if buffer-file-name + (undo-tree-make-history-save-file-name buffer-file-name) + (expand-file-name (read-file-name "File to save in: ") nil)))) + (when (or (not (file-exists-p filename)) + overwrite + (yes-or-no-p (format "Overwrite \"%s\"? " filename))) + (unwind-protect + (progn + ;; transform undo-tree into non-circular structure, and make + ;; temporary copy + (undo-tree-decircle buffer-undo-tree) + (setq tree (copy-undo-tree buffer-undo-tree)) + ;; discard undo-tree object pool before saving + (setf (undo-tree-object-pool tree) nil) + ;; print undo-tree to file + ;; NOTE: We use `with-temp-buffer' instead of `with-temp-file' + ;; to allow `auto-compression-mode' to take effect, in + ;; case user has overridden or advised the default + ;; `undo-tree-make-history-save-file-name' to add a + ;; compressed file extension. + (with-auto-compression-mode + (with-temp-buffer + (prin1 (sha1 buff) (current-buffer)) + (terpri (current-buffer)) + (let ((print-circle t)) (prin1 tree (current-buffer))) + (write-region nil nil filename)))) + ;; restore circular undo-tree data structure + (undo-tree-recircle buffer-undo-tree)) + )))) + + + +(defun undo-tree-load-history (&optional filename noerror) + "Load undo-tree history from file. + +If optional argument FILENAME is null, default load file is +\".<buffer-file-name>.~undo-tree\" if buffer is visiting a file. +Otherwise, prompt for one. + +If optional argument NOERROR is non-nil, return nil instead of +signaling an error if file is not found." + (interactive) + ;; get filename + (unless filename + (setq filename + (if buffer-file-name + (undo-tree-make-history-save-file-name buffer-file-name) + (expand-file-name (read-file-name "File to load from: ") nil)))) + + ;; attempt to read undo-tree from FILENAME + (catch 'load-error + (unless (file-exists-p filename) + (if noerror + (throw 'load-error nil) + (error "File \"%s\" does not exist; could not load undo-tree history" + filename))) + (let (buff hash tree) + (setq buff (current-buffer)) + (with-auto-compression-mode + (with-temp-buffer + (insert-file-contents filename) + (goto-char (point-min)) + (condition-case nil + (setq hash (read (current-buffer))) + (error + (kill-buffer nil) + (funcall (if noerror 'message 'user-error) + "Error reading undo-tree history from \"%s\"" filename) + (throw 'load-error nil))) + (unless (string= (sha1 buff) hash) + (kill-buffer nil) + (funcall (if noerror 'message 'user-error) + "Buffer has been modified; could not load undo-tree history") + (throw 'load-error nil)) + (condition-case nil + (setq tree (read (current-buffer))) + (error + (kill-buffer nil) + (funcall (if noerror 'message 'error) + "Error reading undo-tree history from \"%s\"" filename) + (throw 'load-error nil))) + (kill-buffer nil))) + ;; initialise empty undo-tree object pool + (setf (undo-tree-object-pool tree) + (make-hash-table :test 'eq :weakness 'value)) + ;; restore circular undo-tree data structure + (undo-tree-recircle tree) + (setq buffer-undo-tree tree)))) + + + +;; Versions of save/load functions for use in hooks +(defun undo-tree-save-history-hook () + (when (and undo-tree-mode undo-tree-auto-save-history + (not (eq buffer-undo-list t))) + (undo-tree-save-history nil t) nil)) + +(defun undo-tree-load-history-hook () + (when (and undo-tree-mode undo-tree-auto-save-history + (not (eq buffer-undo-list t)) + (not revert-buffer-in-progress-p)) + (undo-tree-load-history nil t))) + + + + +;;; ===================================================================== +;;; Visualizer drawing functions + +(defun undo-tree-visualize () + "Visualize the current buffer's undo tree." + (interactive "*") + (deactivate-mark) + ;; throw error if undo is disabled in buffer + (when (eq buffer-undo-list t) + (user-error "No undo information in this buffer")) + ;; transfer entries accumulated in `buffer-undo-list' to `buffer-undo-tree' + (undo-list-transfer-to-tree) + ;; add hook to kill visualizer buffer if original buffer is changed + (add-hook 'before-change-functions 'undo-tree-kill-visualizer nil t) + ;; prepare *undo-tree* buffer, then draw tree in it + (let ((undo-tree buffer-undo-tree) + (buff (current-buffer)) + (display-buffer-mark-dedicated 'soft)) + (switch-to-buffer-other-window + (get-buffer-create undo-tree-visualizer-buffer-name)) + (setq undo-tree-visualizer-parent-buffer buff) + (setq undo-tree-visualizer-parent-mtime + (and (buffer-file-name buff) + (nth 5 (file-attributes (buffer-file-name buff))))) + (setq undo-tree-visualizer-initial-node (undo-tree-current undo-tree)) + (setq undo-tree-visualizer-spacing + (undo-tree-visualizer-calculate-spacing)) + (make-local-variable 'undo-tree-visualizer-timestamps) + (make-local-variable 'undo-tree-visualizer-diff) + (setq buffer-undo-tree undo-tree) + (undo-tree-visualizer-mode) + ;; FIXME; don't know why `undo-tree-visualizer-mode' clears this + (setq buffer-undo-tree undo-tree) + (set (make-local-variable 'undo-tree-visualizer-lazy-drawing) + (or (eq undo-tree-visualizer-lazy-drawing t) + (and (numberp undo-tree-visualizer-lazy-drawing) + (>= (undo-tree-count undo-tree) + undo-tree-visualizer-lazy-drawing)))) + (when undo-tree-visualizer-diff (undo-tree-visualizer-show-diff)) + (let ((inhibit-read-only t)) (undo-tree-draw-tree undo-tree)))) + + +(defun undo-tree-kill-visualizer (&rest _dummy) + ;; Kill visualizer. Added to `before-change-functions' hook of original + ;; buffer when visualizer is invoked. + (unless (or undo-tree-inhibit-kill-visualizer + (null (get-buffer undo-tree-visualizer-buffer-name))) + (with-current-buffer undo-tree-visualizer-buffer-name + (undo-tree-visualizer-quit)))) + + + +(defun undo-tree-draw-tree (undo-tree) + ;; Draw undo-tree in current buffer starting from NODE (or root if nil). + (let ((node (if undo-tree-visualizer-lazy-drawing + (undo-tree-current undo-tree) + (undo-tree-root undo-tree)))) + (erase-buffer) + (setq undo-tree-visualizer-needs-extending-down nil + undo-tree-visualizer-needs-extending-up nil) + (undo-tree-clear-visualizer-data undo-tree) + (undo-tree-compute-widths node) + ;; lazy drawing starts vertically centred and displaced horizontally to + ;; the left (window-width/4), since trees will typically grow right + (if undo-tree-visualizer-lazy-drawing + (progn + (undo-tree-move-down (/ (window-height) 2)) + (undo-tree-move-forward (max 2 (/ (window-width) 4)))) ; left margin + ;; non-lazy drawing starts in centre at top of buffer + (undo-tree-move-down 1) ; top margin + (undo-tree-move-forward + (max (/ (window-width) 2) + (+ (undo-tree-node-char-lwidth node) + ;; add space for left part of left-most time-stamp + (if undo-tree-visualizer-timestamps + (/ (- undo-tree-visualizer-spacing 4) 2) + 0) + 2)))) ; left margin + ;; link starting node to its representation in visualizer + (setf (undo-tree-node-marker node) (make-marker)) + (set-marker-insertion-type (undo-tree-node-marker node) nil) + (move-marker (undo-tree-node-marker node) (point)) + ;; draw undo-tree + (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face) + node-list) + (if (not undo-tree-visualizer-lazy-drawing) + (undo-tree-extend-down node t) + (undo-tree-extend-down node) + (undo-tree-extend-up node) + (setq node-list undo-tree-visualizer-needs-extending-down + undo-tree-visualizer-needs-extending-down nil) + (while node-list (undo-tree-extend-down (pop node-list))))) + ;; highlight active branch + (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)) + (undo-tree-highlight-active-branch + (or undo-tree-visualizer-needs-extending-up + (undo-tree-root undo-tree)))) + ;; highlight current node + (undo-tree-draw-node (undo-tree-current undo-tree) 'current))) + + +(defun undo-tree-extend-down (node &optional bottom) + ;; Extend tree downwards starting from NODE and point. If BOTTOM is t, + ;; extend all the way down to the leaves. If BOTTOM is a node, extend down + ;; as far as that node. If BOTTOM is an integer, extend down as far as that + ;; line. Otherwise, only extend visible portion of tree. NODE is assumed to + ;; already have a node marker. Returns non-nil if anything was actually + ;; extended. + (let ((extended nil) + (cur-stack (list node)) + next-stack) + ;; don't bother extending if BOTTOM specifies an already-drawn node + (unless (and (undo-tree-node-p bottom) (undo-tree-node-marker bottom)) + ;; draw nodes layer by layer + (while (or cur-stack + (prog1 (setq cur-stack next-stack) + (setq next-stack nil))) + (setq node (pop cur-stack)) + ;; if node is within range being drawn... + (if (or (eq bottom t) + (and (undo-tree-node-p bottom) + (not (eq (undo-tree-node-previous node) bottom))) + (and (integerp bottom) + (>= bottom (line-number-at-pos + (undo-tree-node-marker node)))) + (and (null bottom) + (pos-visible-in-window-p (undo-tree-node-marker node) + nil t))) + ;; ...draw one layer of node's subtree (if not already drawn) + (progn + (unless (and (undo-tree-node-next node) + (undo-tree-node-marker + (nth (undo-tree-node-branch node) + (undo-tree-node-next node)))) + (goto-char (undo-tree-node-marker node)) + (undo-tree-draw-subtree node) + (setq extended t)) + (setq next-stack + (append (undo-tree-node-next node) next-stack))) + ;; ...otherwise, postpone drawing until later + (push node undo-tree-visualizer-needs-extending-down)))) + extended)) + + +(defun undo-tree-extend-up (node &optional top) + ;; Extend tree upwards starting from NODE. If TOP is t, extend all the way + ;; to root. If TOP is a node, extend up as far as that node. If TOP is an + ;; integer, extend up as far as that line. Otherwise, only extend visible + ;; portion of tree. NODE is assumed to already have a node marker. Returns + ;; non-nil if anything was actually extended. + (let ((extended nil) parent) + ;; don't bother extending if TOP specifies an already-drawn node + (unless (and (undo-tree-node-p top) (undo-tree-node-marker top)) + (while node + (setq parent (undo-tree-node-previous node)) + ;; if we haven't reached root... + (if parent + ;; ...and node is within range being drawn... + (if (or (eq top t) + (and (undo-tree-node-p top) (not (eq node top))) + (and (integerp top) + (< top (line-number-at-pos + (undo-tree-node-marker node)))) + (and (null top) + ;; NOTE: we check point in case window-start is outdated + (< (min (line-number-at-pos (point)) + (line-number-at-pos (window-start))) + (line-number-at-pos + (undo-tree-node-marker node))))) + ;; ...and it hasn't already been drawn + (when (not (undo-tree-node-marker parent)) + ;; link parent node to its representation in visualizer + (undo-tree-compute-widths parent) + (undo-tree-move-to-parent node) + (setf (undo-tree-node-marker parent) (make-marker)) + (set-marker-insertion-type + (undo-tree-node-marker parent) nil) + (move-marker (undo-tree-node-marker parent) (point)) + ;; draw subtree beneath parent + (setq undo-tree-visualizer-needs-extending-down + (nconc (delq node (undo-tree-draw-subtree parent)) + undo-tree-visualizer-needs-extending-down)) + (setq extended t)) + ;; ...otherwise, postpone drawing for later and exit + (setq undo-tree-visualizer-needs-extending-up (when parent node) + parent nil)) + + ;; if we've reached root, stop extending and add top margin + (setq undo-tree-visualizer-needs-extending-up nil) + (goto-char (undo-tree-node-marker node)) + (undo-tree-move-up 1) ; top margin + (delete-region (point-min) (line-beginning-position))) + ;; next iteration + (setq node parent))) + extended)) + + +(defun undo-tree-expand-down (from &optional to) + ;; Expand tree downwards. FROM is the node to start expanding from. Stop + ;; expanding at TO if specified. Otherwise, just expand visible portion of + ;; tree and highlight active branch from FROM. + (when undo-tree-visualizer-needs-extending-down + (let ((inhibit-read-only t) + node-list extended) + ;; extend down as far as TO node + (when to + (setq extended (undo-tree-extend-down from to)) + (goto-char (undo-tree-node-marker to)) + (redisplay t)) ; force redisplay to scroll buffer if necessary + ;; extend visible portion of tree downwards + (setq node-list undo-tree-visualizer-needs-extending-down + undo-tree-visualizer-needs-extending-down nil) + (when node-list + (dolist (n node-list) + (when (undo-tree-extend-down n) (setq extended t))) + ;; highlight active branch in newly-extended-down portion, if any + (when extended + (let ((undo-tree-insert-face + 'undo-tree-visualizer-active-branch-face)) + (undo-tree-highlight-active-branch from))))))) + + +(defun undo-tree-expand-up (from &optional to) + ;; Expand tree upwards. FROM is the node to start expanding from, TO is the + ;; node to stop expanding at. If TO node isn't specified, just expand visible + ;; portion of tree and highlight active branch down to FROM. + (when undo-tree-visualizer-needs-extending-up + (let ((inhibit-read-only t) + extended node-list) + ;; extend up as far as TO node + (when to + (setq extended (undo-tree-extend-up from to)) + (goto-char (undo-tree-node-marker to)) + ;; simulate auto-scrolling if close to top of buffer + (when (<= (line-number-at-pos (point)) scroll-margin) + (undo-tree-move-up (if (= scroll-conservatively 0) + (/ (window-height) 2) 3)) + (when (undo-tree-extend-up to) (setq extended t)) + (goto-char (undo-tree-node-marker to)) + (unless (= scroll-conservatively 0) (recenter scroll-margin)))) + ;; extend visible portion of tree upwards + (and undo-tree-visualizer-needs-extending-up + (undo-tree-extend-up undo-tree-visualizer-needs-extending-up) + (setq extended t)) + ;; extend visible portion of tree downwards + (setq node-list undo-tree-visualizer-needs-extending-down + undo-tree-visualizer-needs-extending-down nil) + (dolist (n node-list) (undo-tree-extend-down n)) + ;; highlight active branch in newly-extended-up portion, if any + (when extended + (let ((undo-tree-insert-face + 'undo-tree-visualizer-active-branch-face)) + (undo-tree-highlight-active-branch + (or undo-tree-visualizer-needs-extending-up + (undo-tree-root buffer-undo-tree)) + from)))))) + + + +(defun undo-tree-highlight-active-branch (node &optional end) + ;; Draw highlighted active branch below NODE in current buffer. Stop + ;; highlighting at END node if specified. + (let ((stack (list node))) + ;; draw active branch + (while stack + (setq node (pop stack)) + (unless (or (eq node end) + (memq node undo-tree-visualizer-needs-extending-down)) + (goto-char (undo-tree-node-marker node)) + (setq node (undo-tree-draw-subtree node 'active) + stack (nconc stack node)))))) + + +(defun undo-tree-draw-node (node &optional current) + ;; Draw symbol representing NODE in visualizer. If CURRENT is non-nil, node + ;; is current node. + (goto-char (undo-tree-node-marker node)) + (when undo-tree-visualizer-timestamps + (undo-tree-move-backward (/ undo-tree-visualizer-spacing 2))) + + (let* ((undo-tree-insert-face (and undo-tree-insert-face + (or (and (consp undo-tree-insert-face) + undo-tree-insert-face) + (list undo-tree-insert-face)))) + (register (undo-tree-node-register node)) + (unmodified (if undo-tree-visualizer-parent-mtime + (undo-tree-node-unmodified-p + node undo-tree-visualizer-parent-mtime) + (undo-tree-node-unmodified-p node))) + node-string) + ;; check node's register (if any) still stores appropriate undo-tree state + (unless (and register + (undo-tree-register-data-p + (registerv-data (get-register register))) + (eq node (undo-tree-register-data-node + (registerv-data (get-register register))))) + (setq register nil)) + ;; represent node by different symbols, depending on whether it's the + ;; current node, is saved in a register, or corresponds to an unmodified + ;; buffer + (setq node-string + (cond + (undo-tree-visualizer-timestamps + (undo-tree-timestamp-to-string + (undo-tree-node-timestamp node) + undo-tree-visualizer-relative-timestamps + current register)) + (register (char-to-string register)) + (unmodified "s") + (current "x") + (t "o")) + undo-tree-insert-face + (nconc + (cond + (current '(undo-tree-visualizer-current-face)) + (unmodified '(undo-tree-visualizer-unmodified-face)) + (register '(undo-tree-visualizer-register-face))) + undo-tree-insert-face)) + ;; draw node and link it to its representation in visualizer + (undo-tree-insert node-string) + (undo-tree-move-backward (if undo-tree-visualizer-timestamps + (1+ (/ undo-tree-visualizer-spacing 2)) + 1)) + (move-marker (undo-tree-node-marker node) (point)) + (put-text-property (point) (1+ (point)) 'undo-tree-node node))) + + +(defun undo-tree-draw-subtree (node &optional active-branch) + ;; Draw subtree rooted at NODE. The subtree will start from point. + ;; If ACTIVE-BRANCH is non-nil, just draw active branch below NODE. Returns + ;; list of nodes below NODE. + (let ((num-children (length (undo-tree-node-next node))) + node-list pos trunk-pos n) + ;; draw node itself + (undo-tree-draw-node node) + + (cond + ;; if we're at a leaf node, we're done + ((= num-children 0)) + + ;; if node has only one child, draw it (not strictly necessary to deal + ;; with this case separately, but as it's by far the most common case + ;; this makes the code clearer and more efficient) + ((= num-children 1) + (undo-tree-move-down 1) + (undo-tree-insert ?|) + (undo-tree-move-backward 1) + (undo-tree-move-down 1) + (undo-tree-insert ?|) + (undo-tree-move-backward 1) + (undo-tree-move-down 1) + (setq n (car (undo-tree-node-next node))) + ;; link next node to its representation in visualizer + (unless (markerp (undo-tree-node-marker n)) + (setf (undo-tree-node-marker n) (make-marker)) + (set-marker-insertion-type (undo-tree-node-marker n) nil)) + (move-marker (undo-tree-node-marker n) (point)) + ;; add next node to list of nodes to draw next + (push n node-list)) + + ;; if node has multiple children, draw branches + (t + (undo-tree-move-down 1) + (undo-tree-insert ?|) + (undo-tree-move-backward 1) + (move-marker (setq trunk-pos (make-marker)) (point)) + ;; left subtrees + (undo-tree-move-backward + (- (undo-tree-node-char-lwidth node) + (undo-tree-node-char-lwidth + (car (undo-tree-node-next node))))) + (move-marker (setq pos (make-marker)) (point)) + (setq n (cons nil (undo-tree-node-next node))) + (dotimes (i (/ num-children 2)) + (setq n (cdr n)) + (when (or (null active-branch) + (eq (car n) + (nth (undo-tree-node-branch node) + (undo-tree-node-next node)))) + (undo-tree-move-forward 2) + (undo-tree-insert ?_ (- trunk-pos pos 2)) + (goto-char pos) + (undo-tree-move-forward 1) + (undo-tree-move-down 1) + (undo-tree-insert ?/) + (undo-tree-move-backward 2) + (undo-tree-move-down 1) + ;; link node to its representation in visualizer + (unless (markerp (undo-tree-node-marker (car n))) + (setf (undo-tree-node-marker (car n)) (make-marker)) + (set-marker-insertion-type (undo-tree-node-marker (car n)) nil)) + (move-marker (undo-tree-node-marker (car n)) (point)) + ;; add node to list of nodes to draw next + (push (car n) node-list)) + (goto-char pos) + (undo-tree-move-forward + (+ (undo-tree-node-char-rwidth (car n)) + (undo-tree-node-char-lwidth (cadr n)) + undo-tree-visualizer-spacing 1)) + (move-marker pos (point))) + ;; middle subtree (only when number of children is odd) + (when (= (mod num-children 2) 1) + (setq n (cdr n)) + (when (or (null active-branch) + (eq (car n) + (nth (undo-tree-node-branch node) + (undo-tree-node-next node)))) + (undo-tree-move-down 1) + (undo-tree-insert ?|) + (undo-tree-move-backward 1) + (undo-tree-move-down 1) + ;; link node to its representation in visualizer + (unless (markerp (undo-tree-node-marker (car n))) + (setf (undo-tree-node-marker (car n)) (make-marker)) + (set-marker-insertion-type (undo-tree-node-marker (car n)) nil)) + (move-marker (undo-tree-node-marker (car n)) (point)) + ;; add node to list of nodes to draw next + (push (car n) node-list)) + (goto-char pos) + (undo-tree-move-forward + (+ (undo-tree-node-char-rwidth (car n)) + (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0) + undo-tree-visualizer-spacing 1)) + (move-marker pos (point))) + ;; right subtrees + (move-marker trunk-pos (1+ trunk-pos)) + (dotimes (i (/ num-children 2)) + (setq n (cdr n)) + (when (or (null active-branch) + (eq (car n) + (nth (undo-tree-node-branch node) + (undo-tree-node-next node)))) + (goto-char trunk-pos) + (undo-tree-insert ?_ (- pos trunk-pos 1)) + (goto-char pos) + (undo-tree-move-backward 1) + (undo-tree-move-down 1) + (undo-tree-insert ?\\) + (undo-tree-move-down 1) + ;; link node to its representation in visualizer + (unless (markerp (undo-tree-node-marker (car n))) + (setf (undo-tree-node-marker (car n)) (make-marker)) + (set-marker-insertion-type (undo-tree-node-marker (car n)) nil)) + (move-marker (undo-tree-node-marker (car n)) (point)) + ;; add node to list of nodes to draw next + (push (car n) node-list)) + (when (cdr n) + (goto-char pos) + (undo-tree-move-forward + (+ (undo-tree-node-char-rwidth (car n)) + (if (cadr n) (undo-tree-node-char-lwidth (cadr n)) 0) + undo-tree-visualizer-spacing 1)) + (move-marker pos (point)))) + )) + ;; return list of nodes to draw next + (nreverse node-list))) + + +(defun undo-tree-node-char-lwidth (node) + ;; Return left-width of NODE measured in characters. + (if (= (length (undo-tree-node-next node)) 0) 0 + (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-lwidth node)) + (if (= (undo-tree-node-cwidth node) 0) + (1+ (/ undo-tree-visualizer-spacing 2)) 0)))) + + +(defun undo-tree-node-char-rwidth (node) + ;; Return right-width of NODE measured in characters. + (if (= (length (undo-tree-node-next node)) 0) 0 + (- (* (+ undo-tree-visualizer-spacing 1) (undo-tree-node-rwidth node)) + (if (= (undo-tree-node-cwidth node) 0) + (1+ (/ undo-tree-visualizer-spacing 2)) 0)))) + + +(defun undo-tree-insert (str &optional arg) + ;; Insert character or string STR ARG times, overwriting, and using + ;; `undo-tree-insert-face'. + (unless arg (setq arg 1)) + (when (characterp str) + (setq str (make-string arg str)) + (setq arg 1)) + (dotimes (i arg) (insert str)) + (setq arg (* arg (length str))) + (undo-tree-move-forward arg) + ;; make sure mark isn't active, otherwise `backward-delete-char' might + ;; delete region instead of single char if transient-mark-mode is enabled + (setq mark-active nil) + (backward-delete-char arg) + (when undo-tree-insert-face + (put-text-property (- (point) arg) (point) 'face undo-tree-insert-face))) + + +(defun undo-tree-move-down (&optional arg) + ;; Move down, extending buffer if necessary. + (let ((row (line-number-at-pos)) + (col (current-column)) + line) + (unless arg (setq arg 1)) + (forward-line arg) + (setq line (line-number-at-pos)) + ;; if buffer doesn't have enough lines, add some + (when (/= line (+ row arg)) + (cond + ((< arg 0) + (insert (make-string (- line row arg) ?\n)) + (forward-line (+ arg (- row line)))) + (t (insert (make-string (- arg (- line row)) ?\n))))) + (undo-tree-move-forward col))) + + +(defun undo-tree-move-up (&optional arg) + ;; Move up, extending buffer if necessary. + (unless arg (setq arg 1)) + (undo-tree-move-down (- arg))) + + +(defun undo-tree-move-forward (&optional arg) + ;; Move forward, extending buffer if necessary. + (unless arg (setq arg 1)) + (let (n) + (cond + ((>= arg 0) + (setq n (- (line-end-position) (point))) + (if (> n arg) + (forward-char arg) + (end-of-line) + (insert (make-string (- arg n) ? )))) + ((< arg 0) + (setq arg (- arg)) + (setq n (- (point) (line-beginning-position))) + (when (< (- n 2) arg) ; -2 to create left-margin + ;; no space left - shift entire buffer contents right! + (let ((pos (move-marker (make-marker) (point)))) + (set-marker-insertion-type pos t) + (goto-char (point-min)) + (while (not (eobp)) + (insert-before-markers (make-string (- arg -2 n) ? )) + (forward-line 1)) + (goto-char pos))) + (backward-char arg))))) + + +(defun undo-tree-move-backward (&optional arg) + ;; Move backward, extending buffer if necessary. + (unless arg (setq arg 1)) + (undo-tree-move-forward (- arg))) + + +(defun undo-tree-move-to-parent (node) + ;; Move to position of parent of NODE, extending buffer if necessary. + (let* ((parent (undo-tree-node-previous node)) + (n (undo-tree-node-next parent)) + (l (length n)) p) + (goto-char (undo-tree-node-marker node)) + (unless (= l 1) + ;; move horizontally + (setq p (undo-tree-position node n)) + (cond + ;; node in centre subtree: no horizontal movement + ((and (= (mod l 2) 1) (= p (/ l 2)))) + ;; node in left subtree: move right + ((< p (/ l 2)) + (setq n (nthcdr p n)) + (undo-tree-move-forward + (+ (undo-tree-node-char-rwidth (car n)) + (/ undo-tree-visualizer-spacing 2) 1)) + (dotimes (i (- (/ l 2) p 1)) + (setq n (cdr n)) + (undo-tree-move-forward + (+ (undo-tree-node-char-lwidth (car n)) + (undo-tree-node-char-rwidth (car n)) + undo-tree-visualizer-spacing 1))) + (when (= (mod l 2) 1) + (setq n (cdr n)) + (undo-tree-move-forward + (+ (undo-tree-node-char-lwidth (car n)) + (/ undo-tree-visualizer-spacing 2) 1)))) + (t ;; node in right subtree: move left + (setq n (nthcdr (/ l 2) n)) + (when (= (mod l 2) 1) + (undo-tree-move-backward + (+ (undo-tree-node-char-rwidth (car n)) + (/ undo-tree-visualizer-spacing 2) 1)) + (setq n (cdr n))) + (dotimes (i (- p (/ l 2) (mod l 2))) + (undo-tree-move-backward + (+ (undo-tree-node-char-lwidth (car n)) + (undo-tree-node-char-rwidth (car n)) + undo-tree-visualizer-spacing 1)) + (setq n (cdr n))) + (undo-tree-move-backward + (+ (undo-tree-node-char-lwidth (car n)) + (/ undo-tree-visualizer-spacing 2) 1))))) + ;; move vertically + (undo-tree-move-up 3))) + + +(defun undo-tree-timestamp-to-string + (timestamp &optional relative current register) + ;; Convert TIMESTAMP to string (either absolute or RELATVE time), indicating + ;; if it's the CURRENT node and/or has an associated REGISTER. + (if relative + ;; relative time + (let ((time (floor (float-time + (subtract-time (current-time) timestamp)))) + n) + (setq time + ;; years + (if (> (setq n (/ time 315360000)) 0) + (if (> n 999) "-ages" (format "-%dy" n)) + (setq time (% time 315360000)) + ;; days + (if (> (setq n (/ time 86400)) 0) + (format "-%dd" n) + (setq time (% time 86400)) + ;; hours + (if (> (setq n (/ time 3600)) 0) + (format "-%dh" n) + (setq time (% time 3600)) + ;; mins + (if (> (setq n (/ time 60)) 0) + (format "-%dm" n) + ;; secs + (format "-%ds" (% time 60))))))) + (setq time (concat + (if current "*" " ") + time + (if register (concat "[" (char-to-string register) "]") + " "))) + (setq n (length time)) + (if (< n 9) + (concat (make-string (- 9 n) ? ) time) + time)) + ;; absolute time + (concat (if current " *" " ") + (format-time-string "%H:%M:%S" timestamp) + (if register + (concat "[" (char-to-string register) "]") + " ")))) + + + + +;;; ===================================================================== +;;; Visualizer commands + +(define-derived-mode + undo-tree-visualizer-mode special-mode "undo-tree-visualizer" + "Major mode used in undo-tree visualizer. + +The undo-tree visualizer can only be invoked from a buffer in +which `undo-tree-mode' is enabled. The visualizer displays the +undo history tree graphically, and allows you to browse around +the undo history, undoing or redoing the corresponding changes in +the parent buffer. + +Within the undo-tree visualizer, the following keys are available: + + \\{undo-tree-visualizer-mode-map}" + :syntax-table nil + :abbrev-table nil + (setq truncate-lines t) + (setq cursor-type nil) + (setq undo-tree-visualizer-selected-node nil)) + + + +(defun undo-tree-visualize-undo (&optional arg) + "Undo changes. A numeric ARG serves as a repeat count." + (interactive "p") + (let ((old (undo-tree-current buffer-undo-tree)) + current) + ;; unhighlight old current node + (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face) + (inhibit-read-only t)) + (undo-tree-draw-node old)) + ;; undo in parent buffer + (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer) + (deactivate-mark) + (unwind-protect + (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-undo-1 arg)) + (setq current (undo-tree-current buffer-undo-tree)) + (switch-to-buffer-other-window undo-tree-visualizer-buffer-name) + ;; when using lazy drawing, extend tree upwards as required + (when undo-tree-visualizer-lazy-drawing + (undo-tree-expand-up old current)) + ;; highlight new current node + (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current)) + ;; update diff display, if any + (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))))) + + +(defun undo-tree-visualize-redo (&optional arg) + "Redo changes. A numeric ARG serves as a repeat count." + (interactive "p") + (let ((old (undo-tree-current buffer-undo-tree)) + current) + ;; unhighlight old current node + (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face) + (inhibit-read-only t)) + (undo-tree-draw-node (undo-tree-current buffer-undo-tree))) + ;; redo in parent buffer + (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer) + (deactivate-mark) + (unwind-protect + (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-redo-1 arg)) + (setq current (undo-tree-current buffer-undo-tree)) + (switch-to-buffer-other-window undo-tree-visualizer-buffer-name) + ;; when using lazy drawing, extend tree downwards as required + (when undo-tree-visualizer-lazy-drawing + (undo-tree-expand-down old current)) + ;; highlight new current node + (let ((inhibit-read-only t)) (undo-tree-draw-node current 'current)) + ;; update diff display, if any + (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))))) + + +(defun undo-tree-visualize-switch-branch-right (arg) + "Switch to next branch of the undo tree. +This will affect which branch to descend when *redoing* changes +using `undo-tree-redo' or `undo-tree-visualizer-redo'." + (interactive "p") + ;; un-highlight old active branch below current node + (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree))) + (let ((undo-tree-insert-face 'undo-tree-visualizer-default-face) + (inhibit-read-only t)) + (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree))) + ;; increment branch + (let ((branch (undo-tree-node-branch (undo-tree-current buffer-undo-tree)))) + (setf (undo-tree-node-branch (undo-tree-current buffer-undo-tree)) + (cond + ((>= (+ branch arg) (undo-tree-num-branches)) + (1- (undo-tree-num-branches))) + ((<= (+ branch arg) 0) 0) + (t (+ branch arg)))) + (let ((inhibit-read-only t)) + ;; highlight new active branch below current node + (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree))) + (let ((undo-tree-insert-face 'undo-tree-visualizer-active-branch-face)) + (undo-tree-highlight-active-branch (undo-tree-current buffer-undo-tree))) + ;; re-highlight current node + (undo-tree-draw-node (undo-tree-current buffer-undo-tree) 'current)))) + + +(defun undo-tree-visualize-switch-branch-left (arg) + "Switch to previous branch of the undo tree. +This will affect which branch to descend when *redoing* changes +using `undo-tree-redo' or `undo-tree-visualizer-redo'." + (interactive "p") + (undo-tree-visualize-switch-branch-right (- arg))) + + +(defun undo-tree-visualizer-quit () + "Quit the undo-tree visualizer." + (interactive) + (undo-tree-clear-visualizer-data buffer-undo-tree) + ;; remove kill visualizer hook from parent buffer + (unwind-protect + (with-current-buffer undo-tree-visualizer-parent-buffer + (remove-hook 'before-change-functions 'undo-tree-kill-visualizer t)) + ;; kill diff buffer, if any + (when undo-tree-visualizer-diff (undo-tree-visualizer-hide-diff)) + (let ((parent undo-tree-visualizer-parent-buffer) + window) + ;; kill visualizer buffer + (kill-buffer nil) + ;; switch back to parent buffer + (unwind-protect + (if (setq window (get-buffer-window parent)) + (select-window window) + (switch-to-buffer parent)))))) + + +(defun undo-tree-visualizer-abort () + "Quit the undo-tree visualizer and return buffer to original state." + (interactive) + (let ((node undo-tree-visualizer-initial-node)) + (undo-tree-visualizer-quit) + (undo-tree-set node))) + + +(defun undo-tree-visualizer-set (&optional pos) + "Set buffer to state corresponding to undo tree node +at POS, or point if POS is nil." + (interactive) + (unless pos (setq pos (point))) + (let ((node (get-text-property pos 'undo-tree-node))) + (when node + ;; set parent buffer to state corresponding to node at POS + (switch-to-buffer-other-window undo-tree-visualizer-parent-buffer) + (let ((undo-tree-inhibit-kill-visualizer t)) (undo-tree-set node)) + (switch-to-buffer-other-window undo-tree-visualizer-buffer-name) + ;; re-draw undo tree + (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree)) + (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))))) + + +(defun undo-tree-visualizer-mouse-set (pos) + "Set buffer to state corresponding to undo tree node +at mouse event POS." + (interactive "@e") + (undo-tree-visualizer-set (event-start (nth 1 pos)))) + + +(defun undo-tree-visualize-undo-to-x (&optional x) + "Undo to last branch point, register, or saved state. +If X is the symbol `branch', undo to last branch point. If X is +the symbol `register', undo to last register. If X is the sumbol +`saved', undo to last saved state. If X is null, undo to first of +these that's encountered. + +Interactively, a single \\[universal-argument] specifies +`branch', a double \\[universal-argument] \\[universal-argument] +specifies `saved', and a negative prefix argument specifies +`register'." + (interactive "P") + (when (and (called-interactively-p 'any) x) + (setq x (prefix-numeric-value x) + x (cond + ((< x 0) 'register) + ((<= x 4) 'branch) + (t 'saved)))) + (let ((current (if undo-tree-visualizer-selection-mode + undo-tree-visualizer-selected-node + (undo-tree-current buffer-undo-tree))) + (diff undo-tree-visualizer-diff) + r) + (undo-tree-visualizer-hide-diff) + (while (and (undo-tree-node-previous current) + (or (if undo-tree-visualizer-selection-mode + (progn + (undo-tree-visualizer-select-previous) + (setq current undo-tree-visualizer-selected-node)) + (undo-tree-visualize-undo) + (setq current (undo-tree-current buffer-undo-tree))) + t) + ;; branch point + (not (or (and (or (null x) (eq x 'branch)) + (> (undo-tree-num-branches) 1)) + ;; register + (and (or (null x) (eq x 'register)) + (setq r (undo-tree-node-register current)) + (undo-tree-register-data-p + (setq r (registerv-data (get-register r)))) + (eq current (undo-tree-register-data-node r))) + ;; saved state + (and (or (null x) (eq x 'saved)) + (undo-tree-node-unmodified-p current)) + )))) + ;; update diff display, if any + (when diff + (undo-tree-visualizer-show-diff + (when undo-tree-visualizer-selection-mode + undo-tree-visualizer-selected-node))))) + + +(defun undo-tree-visualize-redo-to-x (&optional x) + "Redo to last branch point, register, or saved state. +If X is the symbol `branch', redo to last branch point. If X is +the symbol `register', redo to last register. If X is the sumbol +`saved', redo to last saved state. If X is null, redo to first of +these that's encountered. + +Interactively, a single \\[universal-argument] specifies +`branch', a double \\[universal-argument] \\[universal-argument] +specifies `saved', and a negative prefix argument specifies +`register'." + (interactive "P") + (when (and (called-interactively-p 'any) x) + (setq x (prefix-numeric-value x) + x (cond + ((< x 0) 'register) + ((<= x 4) 'branch) + (t 'saved)))) + (let ((current (if undo-tree-visualizer-selection-mode + undo-tree-visualizer-selected-node + (undo-tree-current buffer-undo-tree))) + (diff undo-tree-visualizer-diff) + r) + (undo-tree-visualizer-hide-diff) + (while (and (undo-tree-node-next current) + (or (if undo-tree-visualizer-selection-mode + (progn + (undo-tree-visualizer-select-next) + (setq current undo-tree-visualizer-selected-node)) + (undo-tree-visualize-redo) + (setq current (undo-tree-current buffer-undo-tree))) + t) + ;; branch point + (not (or (and (or (null x) (eq x 'branch)) + (> (undo-tree-num-branches) 1)) + ;; register + (and (or (null x) (eq x 'register)) + (setq r (undo-tree-node-register current)) + (undo-tree-register-data-p + (setq r (registerv-data (get-register r)))) + (eq current (undo-tree-register-data-node r))) + ;; saved state + (and (or (null x) (eq x 'saved)) + (undo-tree-node-unmodified-p current)) + )))) + ;; update diff display, if any + (when diff + (undo-tree-visualizer-show-diff + (when undo-tree-visualizer-selection-mode + undo-tree-visualizer-selected-node))))) + + +(defun undo-tree-visualizer-toggle-timestamps () + "Toggle display of time-stamps." + (interactive) + (setq undo-tree-visualizer-timestamps (not undo-tree-visualizer-timestamps)) + (setq undo-tree-visualizer-spacing (undo-tree-visualizer-calculate-spacing)) + ;; redraw tree + (let ((inhibit-read-only t)) (undo-tree-draw-tree buffer-undo-tree))) + + +(defun undo-tree-visualizer-scroll-left (&optional arg) + (interactive "p") + (scroll-left (or arg 1) t)) + + +(defun undo-tree-visualizer-scroll-right (&optional arg) + (interactive "p") + (scroll-right (or arg 1) t)) + + +(defun undo-tree-visualizer-scroll-up (&optional arg) + (interactive "P") + (if (or (and (numberp arg) (< arg 0)) (eq arg '-)) + (undo-tree-visualizer-scroll-down arg) + ;; scroll up and expand newly-visible portion of tree + (unwind-protect + (scroll-up-command arg) + (undo-tree-expand-down + (nth (undo-tree-node-branch (undo-tree-current buffer-undo-tree)) + (undo-tree-node-next (undo-tree-current buffer-undo-tree))))) + ;; signal error if at eob + (when (and (not undo-tree-visualizer-needs-extending-down) (eobp)) + (scroll-up)))) + + +(defun undo-tree-visualizer-scroll-down (&optional arg) + (interactive "P") + (if (or (and (numberp arg) (< arg 0)) (eq arg '-)) + (undo-tree-visualizer-scroll-up arg) + ;; ensure there's enough room at top of buffer to scroll + (let ((scroll-lines + (or arg (- (window-height) next-screen-context-lines))) + (window-line (1- (line-number-at-pos (window-start))))) + (when (and undo-tree-visualizer-needs-extending-up + (< window-line scroll-lines)) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (undo-tree-move-up (- scroll-lines window-line))))) + ;; scroll down and expand newly-visible portion of tree + (unwind-protect + (scroll-down-command arg) + (undo-tree-expand-up + (undo-tree-node-previous (undo-tree-current buffer-undo-tree)))) + ;; signal error if at bob + (when (and (not undo-tree-visualizer-needs-extending-down) (bobp)) + (scroll-down)))) + + + + +;;; ===================================================================== +;;; Visualizer selection mode + +(define-minor-mode undo-tree-visualizer-selection-mode + "Toggle mode to select nodes in undo-tree visualizer." + :lighter "Select" + :keymap undo-tree-visualizer-selection-mode-map + :group undo-tree + (cond + ;; enable selection mode + (undo-tree-visualizer-selection-mode + (setq cursor-type 'box) + (setq undo-tree-visualizer-selected-node + (undo-tree-current buffer-undo-tree)) + ;; erase diff (if any), as initially selected node is identical to current + (when undo-tree-visualizer-diff + (let ((buff (get-buffer undo-tree-diff-buffer-name)) + (inhibit-read-only t)) + (when buff (with-current-buffer buff (erase-buffer)))))) + (t ;; disable selection mode + (setq cursor-type nil) + (setq undo-tree-visualizer-selected-node nil) + (goto-char (undo-tree-node-marker (undo-tree-current buffer-undo-tree))) + (when undo-tree-visualizer-diff (undo-tree-visualizer-update-diff))) + )) + + +(defun undo-tree-visualizer-select-previous (&optional arg) + "Move to previous node." + (interactive "p") + (let ((node undo-tree-visualizer-selected-node)) + (catch 'top + (dotimes (i (or arg 1)) + (unless (undo-tree-node-previous node) (throw 'top t)) + (setq node (undo-tree-node-previous node)))) + ;; when using lazy drawing, extend tree upwards as required + (when undo-tree-visualizer-lazy-drawing + (undo-tree-expand-up undo-tree-visualizer-selected-node node)) + ;; update diff display, if any + (when (and undo-tree-visualizer-diff + (not (eq node undo-tree-visualizer-selected-node))) + (undo-tree-visualizer-update-diff node)) + ;; move to selected node + (goto-char (undo-tree-node-marker node)) + (setq undo-tree-visualizer-selected-node node))) + + +(defun undo-tree-visualizer-select-next (&optional arg) + "Move to next node." + (interactive "p") + (let ((node undo-tree-visualizer-selected-node)) + (catch 'bottom + (dotimes (i (or arg 1)) + (unless (nth (undo-tree-node-branch node) (undo-tree-node-next node)) + (throw 'bottom t)) + (setq node + (nth (undo-tree-node-branch node) (undo-tree-node-next node))))) + ;; when using lazy drawing, extend tree downwards as required + (when undo-tree-visualizer-lazy-drawing + (undo-tree-expand-down undo-tree-visualizer-selected-node node)) + ;; update diff display, if any + (when (and undo-tree-visualizer-diff + (not (eq node undo-tree-visualizer-selected-node))) + (undo-tree-visualizer-update-diff node)) + ;; move to selected node + (goto-char (undo-tree-node-marker node)) + (setq undo-tree-visualizer-selected-node node))) + + +(defun undo-tree-visualizer-select-right (&optional arg) + "Move right to a sibling node." + (interactive "p") + (let ((node undo-tree-visualizer-selected-node) + end) + (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node)) + (setq end (line-end-position)) + (catch 'end + (dotimes (i arg) + (while (or (null node) (eq node undo-tree-visualizer-selected-node)) + (forward-char) + (setq node (get-text-property (point) 'undo-tree-node)) + (when (= (point) end) (throw 'end t))))) + (goto-char (undo-tree-node-marker + (or node undo-tree-visualizer-selected-node))) + (when (and undo-tree-visualizer-diff node + (not (eq node undo-tree-visualizer-selected-node))) + (undo-tree-visualizer-update-diff node)) + (when node (setq undo-tree-visualizer-selected-node node)))) + + +(defun undo-tree-visualizer-select-left (&optional arg) + "Move left to a sibling node." + (interactive "p") + (let ((node (get-text-property (point) 'undo-tree-node)) + beg) + (goto-char (undo-tree-node-marker undo-tree-visualizer-selected-node)) + (setq beg (line-beginning-position)) + (catch 'beg + (dotimes (i arg) + (while (or (null node) (eq node undo-tree-visualizer-selected-node)) + (backward-char) + (setq node (get-text-property (point) 'undo-tree-node)) + (when (= (point) beg) (throw 'beg t))))) + (goto-char (undo-tree-node-marker + (or node undo-tree-visualizer-selected-node))) + (when (and undo-tree-visualizer-diff node + (not (eq node undo-tree-visualizer-selected-node))) + (undo-tree-visualizer-update-diff node)) + (when node (setq undo-tree-visualizer-selected-node node)))) + + +(defun undo-tree-visualizer-select (pos) + (let ((node (get-text-property pos 'undo-tree-node))) + (when node + ;; select node at POS + (goto-char (undo-tree-node-marker node)) + ;; when using lazy drawing, extend tree up and down as required + (when undo-tree-visualizer-lazy-drawing + (undo-tree-expand-up undo-tree-visualizer-selected-node node) + (undo-tree-expand-down undo-tree-visualizer-selected-node node)) + ;; update diff display, if any + (when (and undo-tree-visualizer-diff + (not (eq node undo-tree-visualizer-selected-node))) + (undo-tree-visualizer-update-diff node)) + ;; update selected node + (setq undo-tree-visualizer-selected-node node) + ))) + + +(defun undo-tree-visualizer-mouse-select (pos) + "Select undo tree node at mouse event POS." + (interactive "@e") + (undo-tree-visualizer-select (event-start (nth 1 pos)))) + + + + +;;; ===================================================================== +;;; Visualizer diff display + +(defun undo-tree-visualizer-toggle-diff () + "Toggle diff display in undo-tree visualizer." + (interactive) + (if undo-tree-visualizer-diff + (undo-tree-visualizer-hide-diff) + (undo-tree-visualizer-show-diff))) + + +(defun undo-tree-visualizer-selection-toggle-diff () + "Toggle diff display in undo-tree visualizer selection mode." + (interactive) + (if undo-tree-visualizer-diff + (undo-tree-visualizer-hide-diff) + (let ((node (get-text-property (point) 'undo-tree-node))) + (when node (undo-tree-visualizer-show-diff node))))) + + +(defun undo-tree-visualizer-show-diff (&optional node) + ;; show visualizer diff display + (setq undo-tree-visualizer-diff t) + (let ((buff (with-current-buffer undo-tree-visualizer-parent-buffer + (undo-tree-diff node))) + (display-buffer-mark-dedicated 'soft) + win) + (setq win (split-window)) + (set-window-buffer win buff) + (shrink-window-if-larger-than-buffer win))) + + +(defun undo-tree-visualizer-hide-diff () + ;; hide visualizer diff display + (setq undo-tree-visualizer-diff nil) + (let ((win (get-buffer-window undo-tree-diff-buffer-name))) + (when win (with-selected-window win (kill-buffer-and-window))))) + + +(defun undo-tree-diff (&optional node) + ;; Create diff between NODE and current state (or previous state and current + ;; state, if NODE is null). Returns buffer containing diff. + (let (tmpfile buff) + ;; generate diff + (let ((undo-tree-inhibit-kill-visualizer t) + (current (undo-tree-current buffer-undo-tree))) + (undo-tree-set (or node (undo-tree-node-previous current) current) + 'preserve-timestamps) + (setq tmpfile (diff-file-local-copy (current-buffer))) + (undo-tree-set current 'preserve-timestamps)) + (setq buff (diff-no-select + tmpfile (current-buffer) nil 'noasync + (get-buffer-create undo-tree-diff-buffer-name))) + ;; delete process messages and useless headers from diff buffer + (let ((inhibit-read-only t)) + (with-current-buffer buff + (goto-char (point-min)) + (delete-region (point) (1+ (line-end-position 3))) + (goto-char (point-max)) + (forward-line -2) + (delete-region (point) (point-max)) + (setq cursor-type nil) + (setq buffer-read-only t))) + buff)) + + +(defun undo-tree-visualizer-update-diff (&optional node) + ;; update visualizer diff display to show diff between current state and + ;; NODE (or previous state, if NODE is null) + (with-current-buffer undo-tree-visualizer-parent-buffer + (undo-tree-diff node)) + (let ((win (get-buffer-window undo-tree-diff-buffer-name))) + (when win + (balance-windows) + (shrink-window-if-larger-than-buffer win)))) + +;;;; ChangeLog: + +;; 2013-12-28 Toby S. Cubitt <tsc25@cantab.net> +;; +;; * undo-tree: Update to version 0.6.5. +;; +;; 2012-12-05 Toby S. Cubitt <tsc25@cantab.net> +;; +;; Update undo-tree to version 0.6.3 +;; +;; * undo-tree.el: Implement lazy tree drawing to significantly speed up +;; visualization of large trees + various more minor improvements. +;; +;; 2012-09-25 Toby S. Cubitt <tsc25@cantab.net> +;; +;; Updated undo-tree package to version 0.5.5. +;; +;; Small bug-fix to avoid hooks triggering an error when trying to save +;; undo history in a buffer where undo is disabled. +;; +;; 2012-09-11 Toby S. Cubitt <tsc25@cantab.net> +;; +;; Updated undo-tree package to version 0.5.4 +;; +;; Bug-fixes and improvements to persistent history storage. +;; +;; 2012-07-18 Toby S. Cubitt <tsc25@cantab.net> +;; +;; Update undo-tree to version 0.5.3 +;; +;; * undo-tree.el: Cope gracefully with undo boundaries being deleted +;; (cf. bug#11774). Allow customization of directory to which undo +;; history is +;; saved. +;; +;; 2012-05-24 Toby S. Cubitt <tsc25@cantab.net> +;; +;; updated undo-tree package to version 0.5.2 +;; +;; * undo-tree.el: add diff view feature in undo-tree visualizer. +;; +;; 2012-05-02 Toby S. Cubitt <tsc25@cantab.net> +;; +;; undo-tree.el: Update package to version 0.4 +;; +;; 2012-04-20 Toby S. Cubitt <tsc25@cantab.net> +;; +;; undo-tree.el: Update package to version 0.3.4 +;; +;; * undo-tree.el (undo-list-pop-changeset): fix pernicious bug causing +;; undo history to be lost. +;; (buffer-undo-tree): set permanent-local property. +;; (undo-tree-enable-undo-in-region): add new customization option +;; allowing undo-in-region to be disabled. +;; +;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net> +;; +;; undo-tree.el: Fixed copyright attribution and Emacs status. +;; +;; 2012-01-26 Toby S. Cubitt <tsc25@cantab.net> +;; +;; undo-tree.el: Update package to version 0.3.3 +;; +;; 2011-09-17 Stefan Monnier <monnier@iro.umontreal.ca> +;; +;; Add undo-tree.el +;; + + + + +(provide 'undo-tree) + +;;; undo-tree.el ends here
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/ChangeLog +++ /dev/null @@ -1,12 +0,0 @@ -2012-09-24 Chong Yidong <cyd@gnu.org> - - Add missing file yasnippet-pkg.el - -2012-09-24 Chong Yidong <cyd@gnu.org> - - Add README file for yasnippet. - -2012-09-24 Chong Yidong <cyd@gnu.org> - - Add yasnippet. -
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/dropdown-list.el +++ /dev/null @@ -1,253 +0,0 @@ -;;; dropdown-list.el --- Drop-down menu interface -;; -;; Filename: dropdown-list.el -;; Description: Drop-down menu interface -;; Copyright (C) 2008-2012 Free Software Foundation, Inc. -;; Author: Jaeyoun Chung [jay.chung@gmail.com] -;; Maintainer: -;; Authors: pluskid <pluskid@gmail.com>, João Távora <joaotavora@gmail.com> -;; Created: Sun Mar 16 11:20:45 2008 (Pacific Daylight Time) -;; Version: -;; Last-Updated: Sun Mar 16 12:19:49 2008 (Pacific Daylight Time) -;; By: dradams -;; Update #: 43 -;; URL: http://www.emacswiki.org/cgi-bin/wiki/dropdown-list.el -;; Keywords: convenience menu -;; Compatibility: GNU Emacs 21.x, GNU Emacs 22.x -;; -;; Features that might be required by this library: -;; -;; `cl'. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Commentary: -;; -;; According to Jaeyoun Chung, "overlay code stolen from company-mode.el." -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Change log: -;; -;; 2008/03/16 dadams -;; Clean-up - e.g. use char-to-string for control chars removed by email posting. -;; Moved example usage code (define-key*, command-selector) inside the library. -;; Require cl.el at byte-compile time. -;; Added GPL statement. -;; 2008/01/06 Jaeyoun Chung -;; Posted to gnu-emacs-sources@gnu.org at 9:10 p.m. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; This program is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;; Code: - -(eval-when-compile (require 'cl)) ;; decf, fourth, incf, loop, mapcar* - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defface dropdown-list-face - '((t :inherit default :background "lightyellow" :foreground "black")) - "*Bla." :group 'dropdown-list) - -(defface dropdown-list-selection-face - '((t :inherit dropdown-list-face :background "purple")) - "*Bla." :group 'dropdown-list) - -(defvar dropdown-list-overlays nil) - -(defun dropdown-list-hide () - (while dropdown-list-overlays - (delete-overlay (pop dropdown-list-overlays)))) - -(defun dropdown-list-put-overlay (beg end &optional prop value prop2 value2) - (let ((ov (make-overlay beg end))) - (overlay-put ov 'window t) - (when prop - (overlay-put ov prop value) - (when prop2 (overlay-put ov prop2 value2))) - ov)) - -(defun dropdown-list-line (start replacement &optional no-insert) - ;; start might be in the middle of a tab, which means we need to hide the - ;; tab and add spaces - (let ((end (+ start (length replacement))) - beg-point end-point - before-string after-string) - (goto-char (point-at-eol)) - (if (< (current-column) start) - (progn (setq before-string (make-string (- start (current-column)) ? )) - (setq beg-point (point))) - (goto-char (point-at-bol)) ;; Emacs bug, move-to-column is wrong otherwise - (move-to-column start) - (setq beg-point (point)) - (when (> (current-column) start) - (goto-char (1- (point))) - (setq beg-point (point)) - (setq before-string (make-string (- start (current-column)) ? )))) - (move-to-column end) - (setq end-point (point)) - (let ((end-offset (- (current-column) end))) - (when (> end-offset 0) (setq after-string (make-string end-offset ?b)))) - (when no-insert - ;; prevent inheriting of faces - (setq before-string (when before-string (propertize before-string 'face 'default))) - (setq after-string (when after-string (propertize after-string 'face 'default)))) - (let ((string (concat before-string replacement after-string))) - (if no-insert - string - (push (dropdown-list-put-overlay beg-point end-point 'invisible t - 'after-string string) - dropdown-list-overlays))))) - -(defun dropdown-list-start-column (display-width) - (let ((column (mod (current-column) (window-width))) - (width (window-width))) - (cond ((<= (+ column display-width) width) column) - ((> column display-width) (- column display-width)) - ((>= width display-width) (- width display-width)) - (t nil)))) - -(defun dropdown-list-move-to-start-line (candidate-count) - (decf candidate-count) - (let ((above-line-count (save-excursion (- (vertical-motion (- candidate-count))))) - (below-line-count (save-excursion (vertical-motion candidate-count)))) - (cond ((= below-line-count candidate-count) - t) - ((= above-line-count candidate-count) - (vertical-motion (- candidate-count)) - t) - ((>= (+ below-line-count above-line-count) candidate-count) - (vertical-motion (- (- candidate-count below-line-count))) - t) - (t nil)))) - -(defun dropdown-list-at-point (candidates &optional selidx) - (dropdown-list-hide) - (let* ((lengths (mapcar #'length candidates)) - (max-length (apply #'max lengths)) - (start (dropdown-list-start-column (+ max-length 3))) - (i -1) - (candidates (mapcar* (lambda (candidate length) - (let ((diff (- max-length length))) - (propertize - (concat (if (> diff 0) - (concat candidate (make-string diff ? )) - (substring candidate 0 max-length)) - (format "%3d" (+ 2 i))) - 'face (if (eql (incf i) selidx) - 'dropdown-list-selection-face - 'dropdown-list-face)))) - candidates - lengths))) - (save-excursion - (and start - (dropdown-list-move-to-start-line (length candidates)) - (loop initially (vertical-motion 0) - for candidate in candidates - do (dropdown-list-line (+ (current-column) start) candidate) - while (/= (vertical-motion 1) 0) - finally return t))))) - -(defun dropdown-list (candidates) - (let ((selection) - (temp-buffer)) - (save-window-excursion - (unwind-protect - (let ((candidate-count (length candidates)) - done key (selidx 0)) - (while (not done) - (unless (dropdown-list-at-point candidates selidx) - (switch-to-buffer (setq temp-buffer (get-buffer-create "*selection*")) - 'norecord) - (delete-other-windows) - (delete-region (point-min) (point-max)) - (insert (make-string (length candidates) ?\n)) - (goto-char (point-min)) - (dropdown-list-at-point candidates selidx)) - (setq key (read-key-sequence "")) - (cond ((and (stringp key) - (>= (aref key 0) ?1) - (<= (aref key 0) (+ ?0 (min 9 candidate-count)))) - (setq selection (- (aref key 0) ?1) - done t)) - ((member key `(,(char-to-string ?\C-p) [up] "p")) - (setq selidx (mod (+ candidate-count (1- (or selidx 0))) - candidate-count))) - ((member key `(,(char-to-string ?\C-n) [down] "n")) - (setq selidx (mod (1+ (or selidx -1)) candidate-count))) - ((member key `(,(char-to-string ?\f)))) - ((member key `(,(char-to-string ?\r) [return])) - (setq selection selidx - done t)) - (t (setq done t))))) - (dropdown-list-hide) - (and temp-buffer (kill-buffer temp-buffer))) - ;; (when selection - ;; (message "your selection => %d: %s" selection (nth selection candidates)) - ;; (sit-for 1)) - selection))) - -(defun define-key* (keymap key command) - "Add COMMAND to the multiple-command binding of KEY in KEYMAP. -Use multiple times to bind different COMMANDs to the same KEY." - (define-key keymap key (combine-command command (lookup-key keymap key)))) - -(defun combine-command (command defs) - "$$$$$ FIXME - no doc string" - (cond ((null defs) command) - ((and (listp defs) - (eq 'lambda (car defs)) - (= (length defs) 4) - (listp (fourth defs)) - (eq 'command-selector (car (fourth defs)))) - (unless (member `',command (cdr (fourth defs))) - (setcdr (fourth defs) (nconc (cdr (fourth defs)) `(',command)))) - defs) - (t - `(lambda () (interactive) (command-selector ',defs ',command))))) - -(defvar command-selector-last-command nil "$$$$$ FIXME - no doc string") - -(defun command-selector (&rest candidates) - "$$$$$ FIXME - no doc string" - (if (and (eq last-command this-command) command-selector-last-command) - (call-interactively command-selector-last-command) - (let* ((candidate-strings - (mapcar (lambda (candidate) - (format "%s" (if (symbolp candidate) - candidate - (let ((s (format "%s" candidate))) - (if (>= (length s) 7) - (concat (substring s 0 7) "...") - s))))) - candidates)) - (selection (dropdown-list candidate-strings))) - (when selection - (let ((cmd (nth selection candidates))) - (call-interactively cmd) - (setq command-selector-last-command cmd)))))) - -;;;;;;;;;;;;;;;;;;;; - -(provide 'dropdown-list) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; dropdown-list.el ends here -;; Local Variables: -;; coding: utf-8 -;; End:
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/c++-mode/ns +++ /dev/null @@ -1,4 +0,0 @@ -# name: namespace ... -# key: ns -# -- -namespace \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/c++-mode/using +++ /dev/null @@ -1,5 +0,0 @@ -# name: using namespace ... -# key: using -# -- -using namespace ${std}; -$0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/c-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -cc-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/cc-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/csharp-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -cc-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/css-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/f.yasnippet +++ /dev/null @@ -1,5 +0,0 @@ -# contributor: Xah Lee (XahLee.org) -# name: format -# key: format -# -- -(format "$0" &optional OBJECTS) \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/erlang-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/f90-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/f90-mode/ii +++ /dev/null @@ -1,5 +0,0 @@ -# contributor: Li Zhu <http://www.zhuli.name> -# name: implicit integer -# key: ii -# -- -implicit integer $0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/html-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/html-mode/div +++ /dev/null @@ -1,4 +0,0 @@ -# name: <div...>...</div> -# key: div -# -- -<div${1: id="${2:some_id}"}${3: class="${4:some_class}"}>$0</div> \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/html-mode/script.javascript +++ /dev/null @@ -1,7 +0,0 @@ -# contributor: Jimmy Wu <frozenthrone88@gmail.com> -#name :<script type="text/javascript">...</script> -# key: script -# -- -<script type="text/javascript"> - $0 -</script> \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/html-mode/script.javascript-src +++ /dev/null @@ -1,5 +0,0 @@ -# contributor: Jimmy Wu <frozenthrone88@gmail.com> -#name :<script type="text/javascript" src="..."></script> -# key: script -# -- -<script type="text/javascript" src="$1"></script> \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/latex-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/markdown-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/nxml-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/objc-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -cc-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/perl-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/python-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/rst-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/zip +++ /dev/null @@ -1,4 +0,0 @@ -#name : zip(...) { |...| ... } -# key: collectionszip -# -- -zip(${enums}) { |${row}| $0 } \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/asof +++ /dev/null @@ -1,5 +0,0 @@ -# Author: Jonas Bonèr <jonas@jonasboner.com> -# name: asInstanceOf[T] -# key: asof -# -- -asInstanceOf[${1:type}] $0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/case +++ /dev/null @@ -1,5 +0,0 @@ -# Author: Jonas Bonèr <jonas@jonasboner.com> -# name: case pattern => -# key: case -# -- -case ${1:pattern} => $0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/cast +++ /dev/null @@ -1,5 +0,0 @@ -# Author: Jonas Bonèr <jonas@jonasboner.com> -# name: asInstanceOf[T] -# key: cast -# -- -asInstanceOf[${1:type}] $0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/isof +++ /dev/null @@ -1,5 +0,0 @@ -# Author: Jonas Bonèr <jonas@jonasboner.com> -# name: isInstanceOf[T] -# key: isof -# -- -isInstanceOf[${1:type}] $0 \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/match.can +++ /dev/null @@ -1,12 +0,0 @@ -# Author: Jonas Bonèr <jonas@jonasboner.com> -# name: can match { case Full(res) => .. } -# key: match -# -- -${1:option} match { - case Full(res) => $0 - - case Empty => - - case Failure(msg, _, _) => - -} \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/snippet-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/sql-mode/.yas-parents +++ /dev/null @@ -1,1 +0,0 @@ -text-mode
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/sql-mode/constraint +++ /dev/null @@ -1,5 +0,0 @@ -# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> -# name: CONSTRAINT [..] PRIMARY KEY ... -# key: constraint -# -- -CONSTRAINT [${1:PK_Name}] PRIMARY KEY ${2:CLUSTERED} ([${3:ColumnName}]) \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/sql-mode/constraint.1 +++ /dev/null @@ -1,5 +0,0 @@ -# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> -# name: CONSTRAINT [..] FOREIGN KEY ... -# key: constraint -# -- -CONSTRAINT [${1:FK_Name}] FOREIGN KEY ${2:CLUSTERED} ([${3:ColumnName}]) \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/snippets/sql-mode/create +++ /dev/null @@ -1,11 +0,0 @@ -# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> -# name: create table ... -# key: create -# -- -CREATE TABLE [${1:dbo}].[${2:TableName}] -( - ${3:Id} ${4:INT IDENTITY(1,1)} ${5:NOT NULL} -$0 - CONSTRAINT [${6:PK_}] PRIMARY KEY ${7:CLUSTERED} ([$3]) -) -GO \ No newline at end of file
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/yasnippet-autoloads.el +++ /dev/null @@ -1,62 +0,0 @@ -;;; yasnippet-autoloads.el --- automatically extracted autoloads -;; -;;; Code: - - -;;;### (autoloads (yas-global-mode yas-minor-mode) "yasnippet" "yasnippet.el" -;;;;;; (21577 27260 926494 998000)) -;;; Generated autoloads from yasnippet.el - -(autoload 'yas-minor-mode "yasnippet" "\ -Toggle YASnippet mode. - -When YASnippet mode is enabled, the `yas-trigger-key' key expands -snippets of code depending on the major mode. - -With no argument, this command toggles the mode. -positive prefix argument turns on the mode. -Negative prefix argument turns off the mode. - -You can customize the key through `yas-trigger-key'. - -Key bindings: -\\{yas-minor-mode-map} - -\(fn &optional ARG)" t nil) - -(defvar yas-global-mode nil "\ -Non-nil if Yas-Global mode is enabled. -See the command `yas-global-mode' for a description of this minor mode. -Setting this variable directly does not take effect; -either customize it (see the info node `Easy Customization') -or call the function `yas-global-mode'.") - -(custom-autoload 'yas-global-mode "yasnippet" nil) - -(autoload 'yas-global-mode "yasnippet" "\ -Toggle Yas minor mode in all buffers. -With prefix ARG, enable Yas-Global mode if ARG is positive; -otherwise, disable it. If called from Lisp, enable the mode if -ARG is omitted or nil. - -Yas minor mode is enabled in all buffers where -`yas-minor-mode-on' would do it. -See `yas-minor-mode' for more information on Yas minor mode. - -\(fn &optional ARG)" t nil) - -;;;*** - -;;;### (autoloads nil nil ("dropdown-list.el" "yasnippet-pkg.el") -;;;;;; (21577 27284 13157 354000)) - -;;;*** - -(provide 'yasnippet-autoloads) -;; Local Variables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; coding: utf-8 -;; End: -;;; yasnippet-autoloads.el ends here
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/yasnippet-pkg.el +++ /dev/null @@ -1,3 +0,0 @@ -(define-package "yasnippet" - "0.8.0" - "A template system for Emacs")
deleted file mode 100644 --- a/elpa/yasnippet-0.8.0/yasnippet.el +++ /dev/null @@ -1,4490 +0,0 @@ -;;; yasnippet.el --- Yet another snippet extension for Emacs. - -;; Copyright (C) 2008-2012 Free Software Foundation, Inc. -;; Authors: pluskid <pluskid@gmail.com>, João Távora <joaotavora@gmail.com> -;; Version: 0.8.0 -;; Package-version: 0.8.0 -;; X-URL: http://github.com/capitaomorte/yasnippet -;; Keywords: convenience, emulation -;; URL: http://github.com/capitaomorte/yasnippet -;; EmacsWiki: YaSnippetMode - -;; This program is free software: you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation, either version 3 of the License, or -;; (at your option) any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program. If not, see <http://www.gnu.org/licenses/>. - -;;; Commentary: -;; -;; Basic steps to setup: -;; -;; (add-to-list 'load-path -;; "~/path-to-yasnippet") -;; (require 'yasnippet) -;; (yas-global-mode 1) -;; -;; -;; Interesting variables are: -;; -;; `yas-snippet-dirs' -;; -;; The directory where user-created snippets are to be -;; stored. Can also be a list of directories. In that case, -;; when used for bulk (re)loading of snippets (at startup or -;; via `yas-reload-all'), directories appearing earlier in -;; the list shadow other dir's snippets. Also, the first -;; directory is taken as the default for storing the user's -;; new snippets. -;; -;; The deprecated `yas/root-directory' aliases this variable -;; for backward-compatibility. -;; -;; `yas-extra-modes' -;; -;; A local variable that you can set in a hook to override -;; snippet-lookup based on major mode. It is a a symbol (or -;; list of symbols) that correspond to subdirectories of -;; `yas-snippet-dirs' and is used for deciding which -;; snippets to consider for the active buffer. -;; -;; Deprecated `yas/mode-symbol' aliases this variable for -;; backward-compatibility. -;; -;; Major commands are: -;; -;; M-x yas-expand -;; -;; Try to expand snippets before point. In `yas-minor-mode', -;; this is bound to `yas-trigger-key' which you can customize. -;; -;; M-x yas-load-directory -;; -;; Prompts you for a directory hierarchy of snippets to load. -;; -;; M-x yas-insert-snippet -;; -;; Prompts you for possible snippet expansion if that is -;; possible according to buffer-local and snippet-local -;; expansion conditions. With prefix argument, ignore these -;; conditions. -;; -;; M-x yas-visit-snippet-file -;; -;; Prompts you for possible snippet expansions like -;; `yas-insert-snippet', but instead of expanding it, takes -;; you directly to the snippet definition's file, if it -;; exists. -;; -;; M-x yas-new-snippet -;; -;; Lets you create a new snippet file in the correct -;; subdirectory of `yas-snippet-dirs', according to the -;; active major mode. -;; -;; M-x yas-load-snippet-buffer -;; -;; When editing a snippet, this loads the snippet. This is -;; bound to "C-c C-c" while in the `snippet-mode' editing -;; mode. -;; -;; M-x yas-tryout-snippet -;; -;; When editing a snippet, this opens a new empty buffer, -;; sets it to the appropriate major mode and inserts the -;; snippet there, so you can see what it looks like. This is -;; bound to "C-c C-t" while in `snippet-mode'. -;; -;; M-x yas-describe-tables -;; -;; Lists known snippets in a separate buffer. User is -;; prompted as to whether only the currently active tables -;; are to be displayed, or all the tables for all major -;; modes. -;; -;; The `dropdown-list.el' extension is bundled with YASnippet, you -;; can optionally use it the preferred "prompting method", puting in -;; your .emacs file, for example: -;; -;; (require 'dropdown-list) -;; (setq yas-prompt-functions '(yas-dropdown-prompt -;; yas-ido-prompt -;; yas-completing-prompt)) -;; -;; Also check out the customization group -;; -;; M-x customize-group RET yasnippet RET -;; -;; If you use the customization group to set variables -;; `yas-snippet-dirs' or `yas-global-mode', make sure the path to -;; "yasnippet.el" is present in the `load-path' *before* the -;; `custom-set-variables' is executed in your .emacs file. -;; -;; For more information and detailed usage, refer to the project page: -;; http://github.com/capitaomorte/yasnippet - -;;; Code: - -(require 'cl) -(require 'easymenu) -(require 'help-mode) - - -;;; User customizable variables - -(defgroup yasnippet nil - "Yet Another Snippet extension" - :group 'editing) - -(defvar yas--load-file-name load-file-name - "Store the filename that yasnippet.el was originally loaded from.") - -(defcustom yas-snippet-dirs (remove nil - (list "~/.emacs.d/snippets" - (when yas--load-file-name - (concat (file-name-directory yas--load-file-name) "snippets")))) - "Directory or list of snippet dirs for each major mode. - -The directory where user-created snippets are to be stored. Can -also be a list of directories. In that case, when used for -bulk (re)loading of snippets (at startup or via -`yas-reload-all'), directories appearing earlier in the list -shadow other dir's snippets. Also, the first directory is taken -as the default for storing the user's new snippets." - :type '(choice (string :tag "Single directory (string)") - (repeat :args (string) :tag "List of directories (strings)")) - :group 'yasnippet - :require 'yasnippet - :set #'(lambda (symbol new) - (let ((old (and (boundp symbol) - (symbol-value symbol)))) - (set-default symbol new) - (unless (or (not (fboundp 'yas-reload-all)) - (equal old new)) - (yas-reload-all))))) - -(defun yas-snippet-dirs () - "Returns `yas-snippet-dirs' (which see) as a list." - (if (listp yas-snippet-dirs) yas-snippet-dirs (list yas-snippet-dirs))) - -(defvaralias 'yas/root-directory 'yas-snippet-dirs) - -(defcustom yas-prompt-functions '(yas-x-prompt - yas-dropdown-prompt - yas-completing-prompt - yas-ido-prompt - yas-no-prompt) - "Functions to prompt for keys, templates, etc interactively. - -These functions are called with the following arguments: - -- PROMPT: A string to prompt the user - -- CHOICES: a list of strings or objects. - -- optional DISPLAY-FN : A function that, when applied to each of -the objects in CHOICES will return a string. - -The return value of any function you put here should be one of -the objects in CHOICES, properly formatted with DISPLAY-FN (if -that is passed). - -- To signal that your particular style of prompting is -unavailable at the moment, you can also have the function return -nil. - -- To signal that the user quit the prompting process, you can -signal `quit' with - - (signal 'quit \"user quit!\")." - :type '(repeat function) - :group 'yasnippet) - -(defcustom yas-indent-line 'auto - "Controls indenting applied to a recent snippet expansion. - -The following values are possible: - -- `fixed' Indent the snippet to the current column; - -- `auto' Indent each line of the snippet with `indent-according-to-mode' - -Every other value means don't apply any snippet-side indendation -after expansion (the manual per-line \"$>\" indentation still -applies)." - :type '(choice (const :tag "Nothing" nothing) - (const :tag "Fixed" fixed) - (const :tag "Auto" auto)) - :group 'yasnippet) - -(defcustom yas-also-auto-indent-first-line nil - "Non-nil means also auto indent first line according to mode. - -Naturally this is only valid when `yas-indent-line' is `auto'" - :type 'boolean - :group 'yasnippet) - -(defcustom yas-snippet-revival t - "Non-nil means re-activate snippet fields after undo/redo." - :type 'boolean - :group 'yasnippet) - -(defcustom yas-trigger-key "TAB" - "The key bound to `yas-expand' when function `yas-minor-mode' is active. - -Value is a string that is converted to the internal Emacs key -representation using `read-kbd-macro'." - :type 'string - :group 'yasnippet - :set #'(lambda (symbol key) - (let ((old (and (boundp symbol) - (symbol-value symbol)))) - (set-default symbol key) - ;; On very first loading of this defcustom, - ;; `yas-trigger-key' is *not* loaded. - (if (fboundp 'yas--trigger-key-reload) - (yas--trigger-key-reload old))))) - -(defcustom yas-next-field-key '("TAB" "<tab>") - "The key to navigate to next field when a snippet is active. - -Value is a string that is converted to the internal Emacs key -representation using `read-kbd-macro'. - -Can also be a list of strings." - :type '(choice (string :tag "String") - (repeat :args (string) :tag "List of strings")) - :group 'yasnippet - :set #'(lambda (symbol val) - (set-default symbol val) - (if (fboundp 'yas--init-yas-in-snippet-keymap) - (yas--init-yas-in-snippet-keymap)))) - - -(defcustom yas-prev-field-key '("<backtab>" "<S-tab>") - "The key to navigate to previous field when a snippet is active. - -Value is a string that is converted to the internal Emacs key -representation using `read-kbd-macro'. - -Can also be a list of strings." - :type '(choice (string :tag "String") - (repeat :args (string) :tag "List of strings")) - :group 'yasnippet - :set #'(lambda (symbol val) - (set-default symbol val) - (if (fboundp 'yas--init-yas-in-snippet-keymap) - (yas--init-yas-in-snippet-keymap)))) - -(defcustom yas-skip-and-clear-key '("C-d" "<delete>" "<deletechar>") - "The key to clear the currently active field. - -Value is a string that is converted to the internal Emacs key -representation using `read-kbd-macro'. - -Can also be a list of strings." - :type '(choice (string :tag "String") - (repeat :args (string) :tag "List of strings")) - :group 'yasnippet - :set #'(lambda (symbol val) - (set-default symbol val) - (if (fboundp 'yas--init-yas-in-snippet-keymap) - (yas--init-yas-in-snippet-keymap)))) - -(defcustom yas-triggers-in-field nil - "If non-nil, `yas-next-field-key' can trigger stacked expansions. - -Otherwise, `yas-next-field-key' just tries to move on to the next -field" - :type 'boolean - :group 'yasnippet) - -(defcustom yas-fallback-behavior 'call-other-command - "How to act when `yas-trigger-key' does *not* expand a snippet. - -- `call-other-command' means try to temporarily disable YASnippet - and call the next command bound to `yas-trigger-key'. - -- nil or the symbol `return-nil' mean do nothing. (and - `yas-expand' returns nil) - -- A lisp form (apply COMMAND . ARGS) means interactively call - COMMAND, if ARGS is non-nil, call COMMAND non-interactively - with ARGS as arguments." - :type '(choice (const :tag "Call previous command" call-other-command) - (const :tag "Do nothing" return-nil)) - :group 'yasnippet) - -(defcustom yas-choose-keys-first nil - "If non-nil, prompt for snippet key first, then for template. - -Otherwise prompts for all possible snippet names. - -This affects `yas-insert-snippet' and `yas-visit-snippet-file'." - :type 'boolean - :group 'yasnippet) - -(defcustom yas-choose-tables-first nil - "If non-nil, and multiple eligible snippet tables, prompts user for tables first. - -Otherwise, user chooses between the merging together of all -eligible tables. - -This affects `yas-insert-snippet', `yas-visit-snippet-file'" - :type 'boolean - :group 'yasnippet) - -(defcustom yas-use-menu 'abbreviate - "Display a YASnippet menu in the menu bar. - -When non-nil, submenus for each snippet table will be listed -under the menu \"Yasnippet\". - -- If set to `abbreviate', only the current major-mode -menu and the modes set in `yas-extra-modes' are listed. - -- If set to `full', every submenu is listed - -- It set to nil, don't display a menu at all (this requires a - `yas-reload-all' call if the menu is already visible). - -Any other non-nil value, every submenu is listed." - :type '(choice (const :tag "Full" full) - (const :tag "Abbreviate" abbreviate) - (const :tag "No menu" nil)) - :group 'yasnippet) - -(defcustom yas-trigger-symbol (if (eq window-system 'mac) - (char-to-string ?\x21E5) ;; little ->| sign - " =>") - "The text that will be used in menu to represent the trigger." - :type 'string - :group 'yasnippet) - -(defcustom yas-wrap-around-region nil - "If non-nil, snippet expansion wraps around selected region. - -The wrapping occurs just before the snippet's exit marker. This -can be overriden on a per-snippet basis." - :type 'boolean - :group 'yasnippet) - -(defcustom yas-good-grace t - "If non-nil, don't raise errors in inline elisp evaluation. - -An error string \"[yas] error\" is returned instead." - :type 'boolean - :group 'yasnippet) - -(defcustom yas-visit-from-menu nil - "If non-nil visit snippets's files from menu, instead of expanding them. - -This cafn only work when snippets are loaded from files." - :type 'boolean - :group 'yasnippet) - -(defcustom yas-expand-only-for-last-commands nil - "List of `last-command' values to restrict tab-triggering to, or nil. - -Leave this set at nil (the default) to be able to trigger an -expansion simply by placing the cursor after a valid tab trigger, -using whichever commands. - -Optionallly, set this to something like '(self-insert-command) if -you to wish restrict expansion to only happen when the last -letter of the snippet tab trigger was typed immediately before -the trigger key itself." - :type '(repeat function) - :group 'yasnippet) - -;; Only two faces, and one of them shouldn't even be used... -;; -(defface yas-field-highlight-face - '((t (:inherit 'region))) - "The face used to highlight the currently active field of a snippet" - :group 'yasnippet) - -(defface yas--field-debug-face - '() - "The face used for debugging some overlays normally hidden" - :group 'yasnippet) - - -;;; User can also customize the next defvars - -(defun yas--define-some-keys (keys keymap definition) - "Bind KEYS to DEFINITION in KEYMAP, read with `read-kbd-macro'." - (let ((keys (or (and (listp keys) keys) - (list keys)))) - (dolist (key keys) - (define-key keymap (read-kbd-macro key) definition)))) - -(defvar yas-keymap - (let ((map (make-sparse-keymap))) - (mapc #'(lambda (binding) - (yas--define-some-keys (car binding) map (cdr binding))) - `((,yas-next-field-key . yas-next-field-or-maybe-expand) - (,yas-prev-field-key . yas-prev-field) - ("C-g" . yas-abort-snippet) - (,yas-skip-and-clear-key . yas-skip-and-clear-or-delete-char))) - map) - "The keymap active while a snippet expansion is in progress.") - -(defvar yas-key-syntaxes (list "w" "w_" "w_." "w_.()" "^ ") - "List of character syntaxes used to find a trigger key before point. -The list is tried in the order while scanning characters -backwards from point. For example, if the list is '(\"w\" \"w_\") -first look for trigger keys which are composed exclusively of -\"word\"-syntax characters, and then, if that fails, look for -keys which are either of \"word\" or \"symbol\" -syntax. Triggering after - -foo-bar - -will, according to the \"w\" element first try \"bar\". If that -isn't a trigger key, \"foo-bar\" is tried, respecting a second -\"w_\" element.") - -(defvar yas-after-exit-snippet-hook - '() - "Hooks to run after a snippet exited. - -The hooks will be run in an environment where some variables bound to -proper values: - -`yas-snippet-beg' : The beginning of the region of the snippet. - -`yas-snippet-end' : Similar to beg. - -Attention: These hooks are not run when exiting nested/stackd snippet expansion!") - -(defvar yas-before-expand-snippet-hook - '() - "Hooks to run just before expanding a snippet.") - -(defvar yas-buffer-local-condition - '(if (and (or (fourth (syntax-ppss)) - (fifth (syntax-ppss))) - (eq (symbol-function this-command) 'yas-expand-from-trigger-key)) - '(require-snippet-condition . force-in-comment) - t) - "Snippet expanding condition. - -This variable is a lisp form which is evaluated everytime a -snippet expansion is attemped: - - * If it evaluates to nil, no snippets can be expanded. - - * If it evaluates to the a cons (require-snippet-condition - . REQUIREMENT) - - * Snippets bearing no \"# condition:\" directive are not - considered - - * Snippets bearing conditions that evaluate to nil (or - produce an error) won't be onsidered. - - * If the snippet has a condition that evaluates to non-nil - RESULT: - - * If REQUIREMENT is t, the snippet is considered - - * If REQUIREMENT is `eq' RESULT, the snippet is - considered - - * Otherwise, the snippet is not considered. - - * If it evaluates to the symbol 'always, all snippets are - considered for expansion, regardless of any conditions. - - * If it evaluates to t or some other non-nil value - - * Snippet bearing no conditions, or conditions that - evaluate to non-nil, are considered for expansion. - - * Otherwise, the snippet is not considered. - -Here's an example preventing snippets from being expanded from -inside comments, in `python-mode' only, with the exception of -snippets returning the symbol 'force-in-comment in their -conditions. - - (add-hook 'python-mode-hook - '(lambda () - (setq yas-buffer-local-condition - '(if (python-in-string/comment) - '(require-snippet-condition . force-in-comment) - t)))) - -The default value is similar, it filters out potential snippet -expansions inside comments and string literals, unless the -snippet itself contains a condition that returns the symbol -`force-in-comment'.") - - -;;; Internal variables - -(defvar yas--version "0.8.0 (beta)") - -(defvar yas--menu-table (make-hash-table) - "A hash table of MAJOR-MODE symbols to menu keymaps.") - -(defvar yas--known-modes - '(ruby-mode rst-mode markdown-mode) - "A list of mode which is well known but not part of emacs.") - -(defvar yas--escaped-characters - '(?\\ ?` ?\" ?' ?$ ?} ?{ ?\( ?\)) - "List of characters which *might* need to be escaped.") - -(defconst yas--field-regexp - "${\\([0-9]+:\\)?\\([^}]*\\)}" - "A regexp to *almost* recognize a field.") - -(defconst yas--multi-dollar-lisp-expression-regexp - "$+[ \t\n]*\\(([^)]*)\\)" - "A regexp to *almost* recognize a \"$(...)\" expression.") - -(defconst yas--backquote-lisp-expression-regexp - "`\\([^`]*\\)`" - "A regexp to recognize a \"`lisp-expression`\" expression." ) - -(defconst yas--transform-mirror-regexp - "${\\(?:\\([0-9]+\\):\\)?$\\([ \t\n]*([^}]*\\)" - "A regexp to *almost* recognize a mirror with a transform.") - -(defconst yas--simple-mirror-regexp - "$\\([0-9]+\\)" - "A regexp to recognize a simple mirror.") - -(defvar yas--snippet-id-seed 0 - "Contains the next id for a snippet.") - -(defun yas--snippet-next-id () - (let ((id yas--snippet-id-seed)) - (incf yas--snippet-id-seed) - id)) - - -;;; Minor mode stuff - -;; XXX: `last-buffer-undo-list' is somehow needed in Carbon Emacs for MacOSX -(defvar last-buffer-undo-list nil) - -(defvar yas--minor-mode-menu nil - "Holds the YASnippet menu") - -(defun yas--init-minor-keymap () - (let ((map (make-sparse-keymap))) - (when yas-use-menu - (easy-menu-define yas--minor-mode-menu - map - "Menu used when `yas-minor-mode' is active." - '("YASnippet" - "----" - ["Expand trigger" yas-expand - :help "Possibly expand tab trigger before point"] - ["Insert at point..." yas-insert-snippet - :help "Prompt for an expandable snippet and expand it at point"] - ["New snippet..." yas-new-snippet - :help "Create a new snippet in an appropriate directory"] - ["Visit snippet file..." yas-visit-snippet-file - :help "Prompt for an expandable snippet and find its file"] - "----" - ("Snippet menu behaviour" - ["Visit snippets" (setq yas-visit-from-menu t) - :help "Visit snippets from the menu" - :active t :style radio :selected yas-visit-from-menu] - ["Expand snippets" (setq yas-visit-from-menu nil) - :help "Expand snippets from the menu" - :active t :style radio :selected (not yas-visit-from-menu)] - "----" - ["Show all known modes" (setq yas-use-menu 'full) - :help "Show one snippet submenu for each loaded table" - :active t :style radio :selected (eq yas-use-menu 'full)] - ["Abbreviate according to current mode" (setq yas-use-menu 'abbreviate) - :help "Show only snippet submenus for the current active modes" - :active t :style radio :selected (eq yas-use-menu 'abbreviate)]) - ("Indenting" - ["Auto" (setq yas-indent-line 'auto) - :help "Indent each line of the snippet with `indent-according-to-mode'" - :active t :style radio :selected (eq yas-indent-line 'auto)] - ["Fixed" (setq yas-indent-line 'fixed) - :help "Indent the snippet to the current column" - :active t :style radio :selected (eq yas-indent-line 'fixed)] - ["None" (setq yas-indent-line 'none) - :help "Don't apply any particular snippet indentation after expansion" - :active t :style radio :selected (not (member yas-indent-line '(fixed auto)))] - "----" - ["Also auto indent first line" (setq yas-also-auto-indent-first-line - (not yas-also-auto-indent-first-line)) - :help "When auto-indenting also, auto indent the first line menu" - :active (eq yas-indent-line 'auto) - :style toggle :selected yas-also-auto-indent-first-line] - ) - ("Prompting method" - ["System X-widget" (setq yas-prompt-functions - (cons 'yas-x-prompt - (remove 'yas-x-prompt - yas-prompt-functions))) - :help "Use your windowing system's (gtk, mac, windows, etc...) default menu" - :active t :style radio :selected (eq (car yas-prompt-functions) - 'yas-x-prompt)] - ["Dropdown-list" (setq yas-prompt-functions - (cons 'yas-dropdown-prompt - (remove 'yas-dropdown-prompt - yas-prompt-functions))) - :help "Use a special dropdown list" - :active t :style radio :selected (eq (car yas-prompt-functions) - 'yas-dropdown-prompt)] - ["Ido" (setq yas-prompt-functions - (cons 'yas-ido-prompt - (remove 'yas-ido-prompt - yas-prompt-functions))) - :help "Use an ido-style minibuffer prompt" - :active t :style radio :selected (eq (car yas-prompt-functions) - 'yas-ido-prompt)] - ["Completing read" (setq yas-prompt-functions - (cons 'yas-completing-prompt - (remove 'yas-completing-prompt - yas-prompt-functions))) - :help "Use a normal minibuffer prompt" - :active t :style radio :selected (eq (car yas-prompt-functions) - 'yas-completing-prompt)] - ) - ("Misc" - ["Wrap region in exit marker" - (setq yas-wrap-around-region - (not yas-wrap-around-region)) - :help "If non-nil automatically wrap the selected text in the $0 snippet exit" - :style toggle :selected yas-wrap-around-region] - ["Allow stacked expansions " - (setq yas-triggers-in-field - (not yas-triggers-in-field)) - :help "If non-nil allow snippets to be triggered inside other snippet fields" - :style toggle :selected yas-triggers-in-field] - ["Revive snippets on undo " - (setq yas-snippet-revival - (not yas-snippet-revival)) - :help "If non-nil allow snippets to become active again after undo" - :style toggle :selected yas-snippet-revival] - ["Good grace " - (setq yas-good-grace - (not yas-good-grace)) - :help "If non-nil don't raise errors in bad embedded eslip in snippets" - :style toggle :selected yas-good-grace] - ) - "----" - ["Load snippets..." yas-load-directory - :help "Load snippets from a specific directory"] - ["Reload everything" yas-reload-all - :help "Cleanup stuff, reload snippets, rebuild menus"] - ["About" yas-about - :help "Display some information about YASsnippet"]))) - - ;; Now for the stuff that has direct keybindings - ;; - (define-key map "\C-c&\C-s" 'yas-insert-snippet) - (define-key map "\C-c&\C-n" 'yas-new-snippet) - (define-key map "\C-c&\C-v" 'yas-visit-snippet-file) - map)) - -(defvar yas-minor-mode-map (yas--init-minor-keymap) - "The keymap used when `yas-minor-mode' is active.") - -(defun yas--trigger-key-reload (&optional unbind-key) - "Rebind `yas-expand' to the new value of `yas-trigger-key'. - -With optional UNBIND-KEY, try to unbind that key from -`yas-minor-mode-map'." - (when (and unbind-key - (stringp unbind-key) - (not (string= unbind-key ""))) - (define-key yas-minor-mode-map (read-kbd-macro unbind-key) nil)) - (when (and yas-trigger-key - (stringp yas-trigger-key) - (not (string= yas-trigger-key ""))) - (define-key yas-minor-mode-map (read-kbd-macro yas-trigger-key) 'yas-expand))) - -(defvar yas--tables (make-hash-table) - "A hash table of mode symbols to `yas--table' objects.") - -(defvar yas--parents (make-hash-table) - "A hash table of mode symbols do lists of direct parent mode symbols. - -This list is populated when reading the \".yas-parents\" files -found when traversing snippet directories with -`yas-load-directory'. - -There might be additionalal parenting information stored in the -`derived-mode-parent' property of some mode symbols, but that is -not recorded here.") - -(defvar yas--direct-keymaps (list) - "Keymap alist supporting direct snippet keybindings. - -This variable is is placed in `emulation-mode-map-alists'. - -Its elements looks like (TABLE-NAME . KEYMAP). They're -instantiated on `yas-reload-all' but KEYMAP is added to only when -loading snippets. `yas--direct-TABLE-NAME' is then a variable set -buffer-locally when entering `yas-minor-mode'. KEYMAP binds all -defined direct keybindings to the command -`yas-expand-from-keymap' which then which snippet to expand.") - -(defun yas-direct-keymaps-reload () - "Force reload the direct keybinding for active snippet tables." - (interactive) - (setq yas--direct-keymaps nil) - (maphash #'(lambda (name table) - (push (cons (intern (format "yas--direct-%s" name)) - (yas--table-direct-keymap table)) - yas--direct-keymaps)) - yas--tables)) - -(defun yas--modes-to-activate () - "Compute list of mode symbols that are active for `yas-expand' -and friends." - (let ((modes-to-activate (list major-mode)) - (mode major-mode)) - (while (setq mode (get mode 'derived-mode-parent)) - (push mode modes-to-activate)) - (dolist (mode (yas-extra-modes)) - (push mode modes-to-activate)) - (remove-duplicates - (append modes-to-activate - (mapcan #'(lambda (mode) - (yas--all-parents mode)) - modes-to-activate))))) - -(defvar yas-minor-mode-hook nil - "Hook run when yas-minor-mode is turned on") - -;;;###autoload -(define-minor-mode yas-minor-mode - "Toggle YASnippet mode. - -When YASnippet mode is enabled, the `yas-trigger-key' key expands -snippets of code depending on the major mode. - -With no argument, this command toggles the mode. -positive prefix argument turns on the mode. -Negative prefix argument turns off the mode. - -You can customize the key through `yas-trigger-key'. - -Key bindings: -\\{yas-minor-mode-map}" - nil - ;; The indicator for the mode line. - " yas" - :group 'yasnippet - (cond (yas-minor-mode - ;; Reload the trigger key - ;; - (yas--trigger-key-reload) - ;; Install the direct keymaps in `emulation-mode-map-alists' - ;; (we use `add-hook' even though it's not technically a hook, - ;; but it works). Then define variables named after modes to - ;; index `yas--direct-keymaps'. - ;; - ;; Also install the post-command-hook. - ;; - (add-hook 'emulation-mode-map-alists 'yas--direct-keymaps) - (add-hook 'post-command-hook 'yas--post-command-handler nil t) - ;; Set the `yas--direct-%s' vars for direct keymap expansion - ;; - (dolist (mode (yas--modes-to-activate)) - (let ((name (intern (format "yas--direct-%s" mode)))) - (set-default name nil) - (set (make-local-variable name) t))) - ;; Perform JIT loads - ;; - (yas--load-pending-jits)) - (t - ;; Uninstall the direct keymaps and the post-command hook - ;; - (remove-hook 'post-command-hook 'yas--post-command-handler t) - (remove-hook 'emulation-mode-map-alists 'yas--direct-keymaps)))) - -(defvar yas--dont-activate '(minibufferp) - "If non-nil don't let `yas-minor-mode-on' active yas for this buffer. - -If a function, then its result is used. - -If a list of functions, then all functions must return nil to -activate yas for this buffer. - -`yas-minor-mode-on' is usually called by `yas-global-mode' so -this effectively lets you define exceptions to the \"global\" -behaviour. Can also be a function of zero arguments.") -(make-variable-buffer-local 'yas--dont-activate) - -(defun yas-minor-mode-on () - "Turn on YASnippet minor mode. - -Do this unless `yas--dont-activate' is truish " - (interactive) - (unless (cond ((functionp yas--dont-activate) - (funcall yas--dont-activate)) - ((consp yas--dont-activate) - (some #'funcall yas--dont-activate)) - (yas--dont-activate)) - ;; Load all snippets definitions unless we still don't have a - ;; root-directory or some snippets have already been loaded. - ;; - (yas-minor-mode 1))) - -;;;###autoload -(define-globalized-minor-mode yas-global-mode yas-minor-mode yas-minor-mode-on - :group 'yasnippet - :require 'yasnippet) - -(defadvice yas-global-mode (before yas--reload-with-jit (arg) activate) - (cond ((and arg - (numberp arg) - (> arg 1)) - ;; explicitly enabling - (yas-reload-all)) - ((not yas-global-mode) - ;; toggling - (yas-reload-all)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Major mode stuff -;; -(defvar yas--font-lock-keywords - (append '(("^#.*$" . font-lock-comment-face)) - lisp-font-lock-keywords - lisp-font-lock-keywords-1 - lisp-font-lock-keywords-2 - '(("$\\([0-9]+\\)" - (0 font-lock-keyword-face) - (1 font-lock-string-face t)) - ("${\\([0-9]+\\):?" - (0 font-lock-keyword-face) - (1 font-lock-warning-face t)) - ("${" font-lock-keyword-face) - ("$[0-9]+?" font-lock-preprocessor-face) - ("\\(\\$(\\)" 1 font-lock-preprocessor-face) - ("}" - (0 font-lock-keyword-face))))) - -(defun yas--init-major-keymap () - (let ((map (make-sparse-keymap))) - (easy-menu-define nil - map - "Menu used when snippet-mode is active." - (cons "Snippet" - (mapcar #'(lambda (ent) - (when (third ent) - (define-key map (third ent) (second ent))) - (vector (first ent) (second ent) t)) - (list - (list "Load this snippet" 'yas-load-snippet-buffer "\C-c\C-c") - (list "Try out this snippet" 'yas-tryout-snippet "\C-c\C-t"))))) - map)) - -(defvar snippet-mode-map - (yas--init-major-keymap) - "The keymap used when `snippet-mode' is active") - - -(define-derived-mode snippet-mode text-mode "Snippet" - "A mode for editing yasnippets" - (setq font-lock-defaults '(yas--font-lock-keywords)) - (set (make-local-variable 'require-final-newline) nil) - (set (make-local-variable 'comment-start) "#") - (set (make-local-variable 'comment-start-skip) "#+[\t ]*")) - - - -;;; Internal structs for template management - -(defstruct (yas--template (:constructor yas--make-blank-template)) - "A template for a snippet." - key - content - name - condition - expand-env - file - keybinding - uuid - menu-binding-pair - group ;; as dictated by the #group: directive or .yas-make-groups - perm-group ;; as dictated by `yas-define-menu' - table - ) - -(defun yas--populate-template (template &rest args) - "Helper function to populate a template with properties" - (let (p v) - (while args - (aset template - (position (intern (substring (symbol-name (car args)) 1)) - (mapcar #'car (get 'yas--template 'cl-struct-slots))) - (second args)) - (setq args (cddr args))) - template)) - -(defstruct (yas--table (:constructor yas--make-snippet-table (name))) - "A table to store snippets for a particular mode. - -Has the following fields: - -`yas--table-name' - - A symbol name normally corresponding to a major mode, but can - also be a pseudo major-mode to be referenced in - `yas-extra-modes', for example. - -`yas--table-hash' - - A hash table (KEY . NAMEHASH), known as the \"keyhash\". KEY is - a string or a vector, where the former is the snippet's trigger - and the latter means it's a direct keybinding. NAMEHASH is yet - another hash of (NAME . TEMPLATE) where NAME is the snippet's - name and TEMPLATE is a `yas--template' object. - -`yas--table-direct-keymap' - - A keymap for the snippets in this table that have direct - keybindings. This is kept in sync with the keyhash, i.e., all - the elements of the keyhash that are vectors appear here as - bindings to `yas-expand-from-keymap'. - -`yas--table-uuidhash' - - A hash table mapping snippets uuid's to the same `yas--template' - objects. A snippet uuid defaults to the snippet's name. -" - name - (hash (make-hash-table :test 'equal)) - (uuidhash (make-hash-table :test 'equal)) - (parents nil) - (direct-keymap (make-sparse-keymap))) - -(defun yas--get-template-by-uuid (mode uuid) - "Find the snippet template in MODE by its UUID." - (let* ((table (gethash mode yas--tables mode))) - (when table - (gethash uuid (yas--table-uuidhash table))))) - -;; Apropos storing/updating in TABLE, this works in two steps: -;; -;; 1. `yas--remove-template-by-uuid' removes any -;; keyhash-namehash-template mappings from TABLE, grabing the -;; snippet by its uuid. Also removes mappings from TABLE's -;; `yas--table-direct-keymap' (FIXME: and should probably take care -;; of potentially stale menu bindings right?.) -;; -;; 2. `yas--add-template' adds this all over again. -;; -;; Create a new or add to an existing keyhash-namehash mapping. -;; -;; For reference on understanding this, consider three snippet -;; definitions: -;; -;; A: # name: The Foo -;; # key: foo -;; # binding: C-c M-l -;; -;; B: # name: Mrs Foo -;; # key: foo -;; -;; C: # name: The Bar -;; # binding: C-c M-l -;; -;; D: # name: Baz -;; # key: baz -;; -;; keyhash namehashes(3) yas--template structs(4) -;; ----------------------------------------------------- -;; __________ -;; / \ -;; "foo" ---> "The Foo" ---> [yas--template A] | -;; "Mrs Foo" ---> [yas--template B] | -;; | -;; [C-c M-l] ---> "The Foo" -------------------------/ -;; "The Bar" ---> [yas--template C] -;; -;; "baz" ---> "Baz" ---> [yas--template D] -;; -;; Additionally, since uuid defaults to the name, we have a -;; `yas--table-uuidhash' for TABLE -;; -;; uuidhash yas--template structs -;; ------------------------------- -;; "The Foo" ---> [yas--template A] -;; "Mrs Foo" ---> [yas--template B] -;; "The Bar" ---> [yas--template C] -;; "Baz" ---> [yas--template D] -;; -;; FIXME: the more I look at this data-structure the more I think I'm -;; stupid. There has to be an easier way (but beware lots of code -;; depends on this). -;; -(defun yas--remove-template-by-uuid (table uuid) - "Remove from TABLE a template identified by UUID." - (let ((template (gethash uuid (yas--table-uuidhash table)))) - (when template - (let* ((name (yas--template-name template)) - (empty-keys nil)) - ;; Remove the name from each of the targeted namehashes - ;; - (maphash #'(lambda (k v) - (let ((template (gethash name v))) - (when (and template - (eq uuid (yas--template-uuid template))) - (remhash name v) - (when (zerop (hash-table-count v)) - (push k empty-keys))))) - (yas--table-hash table)) - ;; Remove the namehash themselves if they've become empty - ;; - (dolist (key empty-keys) - (when (vectorp key) - (define-key (yas--table-direct-keymap table) key nil)) - (remhash key (yas--table-hash table))) - - ;; Finally, remove the uuid from the uuidhash - ;; - (remhash uuid (yas--table-uuidhash table)))))) - -(defun yas--add-template (table template) - "Store in TABLE the snippet template TEMPLATE. - -KEY can be a string (trigger key) of a vector (direct -keybinding)." - (let ((name (yas--template-name template)) - (key (yas--template-key template)) - (keybinding (yas--template-keybinding template)) - (menu-binding-pair (yas--template-menu-binding-pair-get-create template))) - (dolist (k (remove nil (list key keybinding))) - (puthash name - template - (or (gethash k - (yas--table-hash table)) - (puthash k - (make-hash-table :test 'equal) - (yas--table-hash table)))) - (when (vectorp k) - (define-key (yas--table-direct-keymap table) k 'yas-expand-from-keymap))) - - ;; Update TABLE's `yas--table-uuidhash' - (puthash (yas--template-uuid template) - template - (yas--table-uuidhash table)))) - -(defun yas--update-template (table template) - "Add or update TEMPLATE in TABLE. - -Also takes care of adding and updating to the associated menu." - ;; Remove from table by uuid - ;; - (yas--remove-template-by-uuid table (yas--template-uuid template)) - ;; Add to table again - ;; - (yas--add-template table template) - ;; Take care of the menu - ;; - (when yas-use-menu - (yas--update-template-menu table template))) - -(defun yas--update-template-menu (table template) - "Update every menu-related for TEMPLATE" - (let ((menu-binding-pair (yas--template-menu-binding-pair-get-create template)) - (key (yas--template-key template)) - (keybinding (yas--template-keybinding template))) - ;; The snippet might have changed name or keys, so update - ;; user-visible strings - ;; - (unless (eq (cdr menu-binding-pair) :none) - ;; the menu item name - ;; - (setf (cadar menu-binding-pair) (yas--template-name template)) - ;; the :keys information (also visible to the user) - (setf (getf (cdr (car menu-binding-pair)) :keys) - (or (and keybinding (key-description keybinding)) - (and key (concat key yas-trigger-symbol)))))) - (unless (yas--template-menu-managed-by-yas-define-menu template) - (let ((menu-keymap - (yas--menu-keymap-get-create (yas--table-mode table) - (mapcar #'yas--table-mode - (yas--table-parents table)))) - (group (yas--template-group template))) - ;; Remove from menu keymap - ;; - (assert menu-keymap) - (yas--delete-from-keymap menu-keymap (yas--template-uuid template)) - - ;; Add necessary subgroups as necessary. - ;; - (dolist (subgroup group) - (let ((subgroup-keymap (lookup-key menu-keymap (vector (make-symbol subgroup))))) - (unless (and subgroup-keymap - (keymapp subgroup-keymap)) - (setq subgroup-keymap (make-sparse-keymap)) - (define-key menu-keymap (vector (make-symbol subgroup)) - `(menu-item ,subgroup ,subgroup-keymap))) - (setq menu-keymap subgroup-keymap))) - - ;; Add this entry to the keymap - ;; - (define-key menu-keymap - (vector (make-symbol (yas--template-uuid template))) - (car (yas--template-menu-binding-pair template)))))) - -(defun yas--namehash-templates-alist (namehash) - (let (alist) - (maphash #'(lambda (k v) - (push (cons k v) alist)) - namehash) - alist)) - -(defun yas--fetch (table key) - "Fetch templates in TABLE by KEY. - -Return a list of cons (NAME . TEMPLATE) where NAME is a -string and TEMPLATE is a `yas--template' structure." - (let* ((keyhash (yas--table-hash table)) - (namehash (and keyhash (gethash key keyhash)))) - (when namehash - (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash))))) - - -;;; Filtering/condition logic - -(defun yas--eval-condition (condition) - (condition-case err - (save-excursion - (save-restriction - (save-match-data - (eval condition)))) - (error (progn - (yas--message 1 "Error in condition evaluation: %s" (error-message-string err)) - nil)))) - - -(defun yas--filter-templates-by-condition (templates) - "Filter the templates using the applicable condition. - -TEMPLATES is a list of cons (NAME . TEMPLATE) where NAME is a -string and TEMPLATE is a `yas--template' structure. - -This function implements the rules described in -`yas-buffer-local-condition'. See that variables documentation." - (let ((requirement (yas--require-template-specific-condition-p))) - (if (eq requirement 'always) - templates - (remove-if-not #'(lambda (pair) - (yas--template-can-expand-p - (yas--template-condition (cdr pair)) requirement)) - templates)))) - -(defun yas--require-template-specific-condition-p () - "Decides if this buffer requests/requires snippet-specific -conditions to filter out potential expansions." - (if (eq 'always yas-buffer-local-condition) - 'always - (let ((local-condition (or (and (consp yas-buffer-local-condition) - (yas--eval-condition yas-buffer-local-condition)) - yas-buffer-local-condition))) - (when local-condition - (if (eq local-condition t) - t - (and (consp local-condition) - (eq 'require-snippet-condition (car local-condition)) - (symbolp (cdr local-condition)) - (cdr local-condition))))))) - -(defun yas--template-can-expand-p (condition requirement) - "Evaluates CONDITION and REQUIREMENT and returns a boolean" - (let* ((result (or (null condition) - (yas--eval-condition condition)))) - (cond ((eq requirement t) - result) - (t - (eq requirement result))))) - -(defun yas--all-parents (mode) - "Returns a list of all parent modes of MODE" - (let ((parents (gethash mode yas--parents))) - (append parents - (mapcan #'yas--all-parents parents)))) - -(defun yas--table-templates (table) - (when table - (let ((acc (list))) - (maphash #'(lambda (key namehash) - (maphash #'(lambda (name template) - (push (cons name template) acc)) - namehash)) - (yas--table-hash table)) - (yas--filter-templates-by-condition acc)))) - -(defun yas--current-key () - "Get the key under current position. A key is used to find -the template of a snippet in the current snippet-table." - (let ((start (point)) - (end (point)) - (syntaxes yas-key-syntaxes) - syntax - done - templates) - (while (and (not done) syntaxes) - (setq syntax (car syntaxes)) - (setq syntaxes (cdr syntaxes)) - (save-excursion - (skip-syntax-backward syntax) - (setq start (point))) - (setq templates - (mapcan #'(lambda (table) - (yas--fetch table (buffer-substring-no-properties start end))) - (yas--get-snippet-tables))) - (if templates - (setq done t) - (setq start end))) - (list templates - start - end))) - - -(defun yas--table-all-keys (table) - (when table - (let ((acc)) - (maphash #'(lambda (key namehash) - (when (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash)) - (push key acc))) - (yas--table-hash table)) - acc))) - -(defun yas--table-mode (table) - (intern (yas--table-name table))) - - -;;; Internal functions: - -(defun yas--real-mode? (mode) - "Try to find out if MODE is a real mode. The MODE bound to -a function (like `c-mode') is considered real mode. Other well -known mode like `ruby-mode' which is not part of Emacs might -not bound to a function until it is loaded. So yasnippet keeps -a list of modes like this to help the judgement." - (or (fboundp mode) - (find mode yas--known-modes))) - -(defun yas--eval-lisp (form) - "Evaluate FORM and convert the result to string." - (let ((retval (catch 'yas--exception - (condition-case err - (save-excursion - (save-restriction - (save-match-data - (widen) - (let ((result (eval form))) - (when result - (format "%s" result)))))) - (error (if yas-good-grace - (yas--format "elisp error! %s" (error-message-string err)) - (error (yas--format "elisp error: %s" - (error-message-string err))))))))) - (when (and (consp retval) - (eq 'yas--exception (car retval))) - (error (cdr retval))) - retval)) - -(defun yas--eval-lisp-no-saves (form) - (condition-case err - (eval form) - (error (if yas-good-grace - (yas--format "elisp error! %s" (error-message-string err)) - (error (yas--format "elisp error: %s" - (error-message-string err))))))) - -(defun yas--read-lisp (string &optional nil-on-error) - "Read STRING as a elisp expression and return it. - -In case STRING in an invalid expression and NIL-ON-ERROR is nil, -return an expression that when evaluated will issue an error." - (condition-case err - (read string) - (error (and (not nil-on-error) - `(error (error-message-string ,err)))))) - -(defun yas--read-keybinding (keybinding) - "Read KEYBINDING as a snippet keybinding, return a vector." - (when (and keybinding - (not (string-match "keybinding" keybinding))) - (condition-case err - (let ((res (or (and (string-match "^\\[.*\\]$" keybinding) - (read keybinding)) - (read-kbd-macro keybinding 'need-vector)))) - res) - (error - (yas--message 3 "warning: keybinding \"%s\" invalid since %s." - keybinding (error-message-string err)) - nil)))) - -(defvar yas-extra-modes nil - "If non-nil, also lookup snippets for this/these modes. - -Can be a symbol or a list of symbols. - -This variable probably makes more sense as buffer-local, so -ensure your use `make-local-variable' when you set it.") -(defun yas-extra-modes () - (if (listp yas-extra-modes) yas-extra-modes (list yas-extra-modes))) -(defvaralias 'yas/mode-symbol 'yas-extra-modes) - -(defun yas--table-get-create (mode) - "Get or create the snippet table corresponding to MODE." - (let ((table (gethash mode - yas--tables))) - (unless table - (setq table (yas--make-snippet-table (symbol-name mode))) - (puthash mode table yas--tables) - (push (cons (intern (format "yas--direct-%s" mode)) - (yas--table-direct-keymap table)) - yas--direct-keymaps)) - table)) - -(defun yas--get-snippet-tables () - "Get snippet tables for current buffer. - -Return a list of `yas--table' objects. The list of modes to -consider is returned by `yas--modes-to-activate'" - (remove nil - (mapcar #'(lambda (mode-name) - (gethash mode-name yas--tables)) - (yas--modes-to-activate)))) - -(defun yas--menu-keymap-get-create (mode &optional parents) - "Get or create the menu keymap for MODE and its PARENTS. - -This may very well create a plethora of menu keymaps and arrange -them all in `yas--menu-table'" - (let* ((menu-keymap (or (gethash mode yas--menu-table) - (puthash mode (make-sparse-keymap) yas--menu-table)))) - (mapc #'yas--menu-keymap-get-create parents) - (define-key yas--minor-mode-menu (vector mode) - `(menu-item ,(symbol-name mode) ,menu-keymap - :visible (yas--show-menu-p ',mode))) - menu-keymap)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Template-related and snippet loading functions - -(defun yas--parse-template (&optional file) - "Parse the template in the current buffer. - -Optional FILE is the absolute file name of the file being -parsed. - -Optional GROUP is the group where the template is to go, -otherwise we attempt to calculate it from FILE. - -Return a snippet-definition, i.e. a list - - (KEY TEMPLATE NAME CONDITION GROUP VARS FILE KEYBINDING UUID) - -If the buffer contains a line of \"# --\" then the contents above -this line are ignored. Directives can set most of these with the syntax: - -# directive-name : directive-value - -Here's a list of currently recognized directives: - - * type - * name - * contributor - * condition - * group - * key - * expand-env - * binding - * uuid" - (goto-char (point-min)) - (let* ((type 'snippet) - (name (and file - (file-name-nondirectory file))) - (key nil) - template - bound - condition - (group (and file - (yas--calculate-group file))) - expand-env - binding - uuid) - (if (re-search-forward "^# --\n" nil t) - (progn (setq template - (buffer-substring-no-properties (point) - (point-max))) - (setq bound (point)) - (goto-char (point-min)) - (while (re-search-forward "^# *\\([^ ]+?\\) *: *\\(.*\\)$" bound t) - (when (string= "uuid" (match-string-no-properties 1)) - (setq uuid (match-string-no-properties 2))) - (when (string= "type" (match-string-no-properties 1)) - (setq type (if (string= "command" (match-string-no-properties 2)) - 'command - 'snippet))) - (when (string= "key" (match-string-no-properties 1)) - (setq key (match-string-no-properties 2))) - (when (string= "name" (match-string-no-properties 1)) - (setq name (match-string-no-properties 2))) - (when (string= "condition" (match-string-no-properties 1)) - (setq condition (yas--read-lisp (match-string-no-properties 2)))) - (when (string= "group" (match-string-no-properties 1)) - (setq group (match-string-no-properties 2))) - (when (string= "expand-env" (match-string-no-properties 1)) - (setq expand-env (yas--read-lisp (match-string-no-properties 2) - 'nil-on-error))) - (when (string= "binding" (match-string-no-properties 1)) - (setq binding (match-string-no-properties 2))))) - (setq template - (buffer-substring-no-properties (point-min) (point-max)))) - (unless (or key binding) - (setq key (and file (file-name-nondirectory file)))) - (when (eq type 'command) - (setq template (yas--read-lisp (concat "(progn" template ")")))) - (when group - (setq group (split-string group "\\."))) - (list key template name condition group expand-env file binding uuid))) - -(defun yas--calculate-group (file) - "Calculate the group for snippet file path FILE." - (let* ((dominating-dir (locate-dominating-file file - ".yas-make-groups")) - (extra-path (and dominating-dir - (replace-regexp-in-string (concat "^" - (expand-file-name dominating-dir)) - "" - (expand-file-name file)))) - (extra-dir (and extra-path - (file-name-directory extra-path))) - (group (and extra-dir - (replace-regexp-in-string "/" - "." - (directory-file-name extra-dir))))) - group)) - -(defun yas--subdirs (directory &optional filep) - "Return subdirs or files of DIRECTORY according to FILEP." - (remove-if (lambda (file) - (or (string-match "^\\." - (file-name-nondirectory file)) - (string-match "^#.*#$" - (file-name-nondirectory file)) - (string-match "~$" - (file-name-nondirectory file)) - (if filep - (file-directory-p file) - (not (file-directory-p file))))) - (directory-files directory t))) - -(defun yas--make-menu-binding (template) - (let ((mode (yas--table-mode (yas--template-table template)))) - `(lambda () (interactive) (yas--expand-or-visit-from-menu ',mode ,(yas--template-uuid template))))) - -(defun yas--expand-or-visit-from-menu (mode uuid) - (let* ((table (yas--table-get-create mode)) - (yas--current-template (and table - (gethash uuid (yas--table-uuidhash table))))) - (when yas--current-template - (if yas-visit-from-menu - (yas--visit-snippet-file-1 yas--current-template) - (let ((where (if (region-active-p) - (cons (region-beginning) (region-end)) - (cons (point) (point))))) - (yas-expand-snippet (yas--template-content yas--current-template) - (car where) - (cdr where) - (yas--template-expand-env yas--current-template))))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Popping up for keys and templates -;; -(defvar yas--x-pretty-prompt-templates nil - "If non-nil, attempt to prompt for templates like TextMate.") - - -(defun yas--prompt-for-template (templates &optional prompt) - "Interactively choose a template from the list TEMPLATES. - -TEMPLATES is a list of `yas--template'." - (when templates - (setq templates - (sort templates #'(lambda (t1 t2) - (< (length (yas--template-name t1)) - (length (yas--template-name t2)))))) - (if yas--x-pretty-prompt-templates - (yas--x-pretty-prompt-templates "Choose a snippet" templates) - (some #'(lambda (fn) - (funcall fn (or prompt "Choose a snippet: ") - templates - #'yas--template-name)) - yas-prompt-functions)))) - -(defun yas--prompt-for-keys (keys &optional prompt) - "Interactively choose a template key from the list KEYS." - (when keys - (some #'(lambda (fn) - (funcall fn (or prompt "Choose a snippet key: ") keys)) - yas-prompt-functions))) - -(defun yas--prompt-for-table (tables &optional prompt) - (when tables - (some #'(lambda (fn) - (funcall fn (or prompt "Choose a snippet table: ") - tables - #'yas--table-name)) - yas-prompt-functions))) - -(defun yas-x-prompt (prompt choices &optional display-fn) - "Display choices in a x-window prompt." - ;; FIXME: HACK: if we notice that one of the objects in choices is - ;; actually a `yas--template', defer to `yas--x-prompt-pretty-templates' - ;; - ;; This would be better implemented by passing CHOICES as a - ;; strucutred tree rather than a list. Modifications would go as far - ;; up as `yas--all-templates' I think. - ;; - (when (and window-system choices) - (let ((chosen - (let (menu d) ;; d for display - (dolist (c choices) - (setq d (or (and display-fn (funcall display-fn c)) - c)) - (cond ((stringp d) - (push (cons (concat " " d) c) menu)) - ((listp d) - (push (car d) menu)))) - (setq menu (list prompt (push "title" menu))) - (x-popup-menu (if (fboundp 'posn-at-point) - (let ((x-y (posn-x-y (posn-at-point (point))))) - (list (list (+ (car x-y) 10) - (+ (cdr x-y) 20)) - (selected-window))) - t) - menu)))) - (or chosen - (keyboard-quit))))) - -(defun yas--x-pretty-prompt-templates (prompt templates) - "Display TEMPLATES, grouping neatly by table name." - (let ((organized (make-hash-table :test #'equal)) - menu - more-than-one-table - prefix) - (dolist (tl templates) - (puthash (yas--template-table tl) - (cons tl - (gethash (yas--template-table tl) organized)) - organized)) - (setq more-than-one-table (> (hash-table-count organized) 1)) - (setq prefix (if more-than-one-table - " " "")) - (if more-than-one-table - (maphash #'(lambda (table templates) - (push (yas--table-name table) menu) - (dolist (tl templates) - (push (cons (concat prefix (yas--template-name tl)) tl) menu))) organized) - (setq menu (mapcar #'(lambda (tl) (cons (concat prefix (yas--template-name tl)) tl)) templates))) - - (setq menu (nreverse menu)) - (or (x-popup-menu (if (fboundp 'posn-at-point) - (let ((x-y (posn-x-y (posn-at-point (point))))) - (list (list (+ (car x-y) 10) - (+ (cdr x-y) 20)) - (selected-window))) - t) - (list prompt (push "title" menu))) - (keyboard-quit)))) - -(defun yas-ido-prompt (prompt choices &optional display-fn) - (when (and (fboundp 'ido-completing-read) - (or (>= emacs-major-version 24) - ido-mode)) - (yas-completing-prompt prompt choices display-fn #'ido-completing-read))) - -(eval-when-compile (require 'dropdown-list nil t)) -(defun yas-dropdown-prompt (prompt choices &optional display-fn) - (when (featurep 'dropdown-list) - (let (formatted-choices - filtered-choices - d - n) - (dolist (choice choices) - (setq d (or (and display-fn (funcall display-fn choice)) - choice)) - (when (stringp d) - (push d formatted-choices) - (push choice filtered-choices))) - - (setq n (and formatted-choices (dropdown-list formatted-choices))) - (if n - (nth n filtered-choices) - (keyboard-quit))))) - -(defun yas-completing-prompt (prompt choices &optional display-fn completion-fn) - (let (formatted-choices - filtered-choices - chosen - d - (completion-fn (or completion-fn - #'completing-read))) - (dolist (choice choices) - (setq d (or (and display-fn (funcall display-fn choice)) - choice)) - (when (stringp d) - (push d formatted-choices) - (push choice filtered-choices))) - (setq chosen (and formatted-choices - (funcall completion-fn prompt - formatted-choices - nil - 'require-match - nil - nil))) - (let ((position (or (and chosen - (position chosen formatted-choices :test #'string=)) - 0))) - (nth position filtered-choices)))) - -(defun yas-no-prompt (prompt choices &optional display-fn) - (first choices)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Loading snippets from files -;; -(defun yas--load-yas-setup-file (file) - (load file 'noerror)) - -(defun yas-load-directory (top-level-dir &optional use-jit) - "Load snippets in directory hierarchy TOP-LEVEL-DIR. - -Below TOP-LEVEL-DIR each directory should be a mode name. - -Optional USE-JIT use jit-loading of snippets." - (interactive "DSelect the root directory: ") - (unless yas-snippet-dirs - (setq yas-snippet-dirs top-level-dir)) - (dolist (dir (yas--subdirs top-level-dir)) - (let* ((major-mode-and-parents (yas--compute-major-mode-and-parents - (concat dir "/dummy"))) - (mode-sym (car major-mode-and-parents)) - (parents (cdr major-mode-and-parents))) - ;; Attention: The parents and the menus are already defined - ;; here, even if the snippets are later jit-loaded. - ;; - ;; * We need to know the parents at this point since entering a - ;; given mode should jit load for its parents - ;; immediately. This could be reviewed, the parents could be - ;; discovered just-in-time-as well - ;; - ;; * We need to create the menus here to support the `full' - ;; option to `yas-use-menu' (all known snippet menus are shown to the user) - ;; - (yas--define-parents mode-sym parents) - (yas--menu-keymap-get-create mode-sym) - (let ((form `(yas--load-directory-1 ,dir - ',mode-sym - ',parents))) - (if use-jit - (yas--schedule-jit mode-sym form) - (eval form))))) - (when (interactive-p) - (yas--message 3 "Loaded snippets from %s." top-level-dir))) - -(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) - (progn (yas--message 2 "Loading compiled snippets from %s" directory) t) - (load (expand-file-name ".yas-compiled-snippets" directory) 'noerror (<= yas-verbosity 3))) - (yas--message 2 "Loading snippet files from %s" directory) - (yas--load-directory-2 directory mode-sym)))) - -(defun yas--load-directory-2 (directory mode-sym) - ;; 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)))) - -(defun yas--load-snippet-dirs (&optional nojit) - "Reload the directories listed in `yas-snippet-dirs' or - prompt the user to select one." - (let (errors) - (if yas-snippet-dirs - (dolist (directory (reverse (yas-snippet-dirs))) - (cond ((file-directory-p directory) - (yas-load-directory directory (not nojit)) - (if nojit - (yas--message 3 "Loaded %s" directory) - (yas--message 3 "Prepared just-in-time loading for %s" directory))) - (t - (push (yas--message 0 "Check your `yas-snippet-dirs': %s is not a directory" directory) errors)))) - (call-interactively 'yas-load-directory)) - errors)) - -(defun yas-reload-all (&optional interactive) - "Reload all snippets and rebuild the YASnippet menu. - -When called interactively force immediate reload of all known -snippets under `yas-snippet-dirs', otherwise use just-in-time -loading." - (interactive "p") - (catch 'abort - (let ((errors) - (snippet-editing-buffers - (remove-if-not #'(lambda (buffer) - (with-current-buffer buffer yas--editing-template)) - (buffer-list)))) - ;; Warn if there are buffers visiting snippets, since reloading will break - ;; any on-line editing of those buffers. - ;; - (when snippet-editing-buffers - (if interactive - (if (y-or-n-p "Some buffers editing live snippets, close them and proceed with reload?") - (mapc #'kill-buffer snippet-editing-buffers) - (yas--message 1 "Aborted reload...") - (throw 'abort nil)) - ;; in a non-interactive use, at least set - ;; `yas--editing-template' to nil, make it guess it next time around - (mapc #'(lambda (buffer) (setq yas--editing-template nil)) (buffer-list)))) - - ;; Empty all snippet tables, parenting info and all menu tables - ;; - (setq yas--tables (make-hash-table)) - (setq yas--parents (make-hash-table)) - (setq yas--menu-table (make-hash-table)) - - ;; Cancel all pending 'yas--scheduled-jit-loads' - ;; - (setq yas--scheduled-jit-loads (make-hash-table)) - - ;; Init the `yas-minor-mode-map', taking care not to break the - ;; menu.... - ;; - (setcdr yas-minor-mode-map (cdr (yas--init-minor-keymap))) - - ;; Reload the directories listed in `yas-snippet-dirs' or prompt - ;; the user to select one. - ;; - (setq errors (yas--load-snippet-dirs interactive)) - ;; Reload the direct keybindings - ;; - (yas-direct-keymaps-reload) - ;; Reload the trigger-key (shoudn't be needed, but see issue #237) - ;; - (yas--trigger-key-reload) - - (yas--message 3 "Reloaded everything%s...%s." - (if interactive "" " (snippets will load just-in-time)") - (if errors " (some errors, check *Messages*)" ""))))) - -(defun yas--load-pending-jits () - (when yas-minor-mode - (dolist (mode (yas--modes-to-activate)) - (let ((forms (gethash mode yas--scheduled-jit-loads))) - (dolist (form forms) - (yas--message 3 "Loading for `%s', just-in-time: %s!" mode form) - (eval form)) - (remhash mode yas--scheduled-jit-loads))))) - -;; (when (<= emacs-major-version 22) -;; (add-hook 'after-change-major-mode-hook 'yas--load-pending-jits)) - -(defun yas--quote-string (string) - "Escape and quote STRING. -foo\"bar\\! -> \"foo\\\"bar\\\\!\"" - (concat "\"" - (replace-regexp-in-string "[\\\"]" - "\\\\\\&" - string - t) - "\"")) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Snippet compilation function - -(defun yas--initialize () - "For backward compatibility, enable `yas-minor-mode' globally" - (yas-global-mode 1)) - -(defun yas-compile-directory (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?") - (flet ((yas--load-yas-setup-file - (file) - (let ((elfile (concat file ".el"))) - (when (file-exists-p elfile) - (insert ";;; .yas-setup.el support file if any:\n;;;\n") - (insert-file-contents elfile) - (end-of-buffer) - ))) - (yas-define-snippets - (mode snippets) - (insert ";;; Snippet definitions:\n;;;\n") - (let ((literal-snippets (list)) - (print-length nil)) - (dolist (snippet snippets) - (let ((key (first snippet)) - (template-content (second snippet)) - (name (third snippet)) - (condition (fourth snippet)) - (group (fifth snippet)) - (expand-env (sixth snippet)) - (file nil) ;; (seventh snippet)) ;; omit on purpose - (binding (eighth snippet)) - (uuid (ninth snippet))) - (push `(,key - ,template-content - ,name - ,condition - ,group - ,expand-env - ,file - ,binding - ,uuid) - literal-snippets))) - (insert (pp-to-string `(yas-define-snippets ',mode ',literal-snippets))) - (insert "\n\n"))) - (yas--load-directory-1 - (dir mode parents &rest ignore) - (let ((output-file (concat (file-name-as-directory dir) ".yas-compiled-snippets.el"))) - (with-temp-file output-file - (insert (format ";;; Compiled snippets and support files for `%s'\n" mode)) - (yas--load-directory-2 dir mode) - (insert (format ";;; Do not edit! File generated at %s\n" (current-time-string))))))) - (yas-load-directory top-level-dir nil))) - -(defun yas-recompile-all () - "Compile every dir in `yas-snippet-dirs'." - (interactive) - (mapc #'yas-compile-directory (yas-snippet-dirs))) - - -;;; JIT loading -;;; - -(defvar yas--scheduled-jit-loads (make-hash-table) - "Alist of mode-symbols to forms to be evaled when `yas-minor-mode' kicks in.") - -(defun yas--schedule-jit (mode form) - (puthash mode - (cons form - (gethash mode yas--scheduled-jit-loads)) - yas--scheduled-jit-loads)) - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Some user level functions -;;; - -(defun yas-about () - (interactive) - (message (concat "yasnippet (version " - yas--version - ") -- 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 (remove-duplicates - (append parents - (gethash mode yas--parents))) - yas--parents)) - -(defun yas-define-snippets (mode snippets) - "Define SNIPPETS for MODE. - -SNIPPETS is a list of snippet definitions, each taking the -following form - - (KEY TEMPLATE NAME CONDITION GROUP EXPAND-ENV FILE KEYBINDING UUID) - -Within these, only KEY and TEMPLATE are actually mandatory. - -TEMPLATE might be a lisp form or a string, depending on whether -this is a snippet or a snippet-command. - -CONDITION, EXPAND-ENV and KEYBINDING are lisp forms, they have -been `yas--read-lisp'-ed and will eventually be -`yas--eval-lisp'-ed. - -The remaining elements are strings. - -FILE is probably of very little use if you're programatically -defining snippets. - -UUID is the snippets \"unique-id\". Loading a second snippet file -with the same uuid replaced the previous snippet. - -You can use `yas--parse-template' to return such lists based on -the current buffers contents." - (let ((snippet-table (yas--table-get-create mode)) - (template nil)) - (dolist (snippet snippets) - (setq template (yas-define-snippets-1 snippet - snippet-table))) - template)) - -(defun yas-define-snippets-1 (snippet snippet-table) - "Helper for `yas-define-snippets'." - ;; X) Calculate some more defaults on the values returned by - ;; `yas--parse-template'. - ;; - (let* ((file (seventh snippet)) - (key (car snippet)) - (name (or (third snippet) - (and file - (file-name-directory file)))) - (condition (fourth snippet)) - (group (fifth snippet)) - (keybinding (yas--read-keybinding (eighth snippet))) - (uuid (or (ninth snippet) - name)) - (template (or (gethash uuid (yas--table-uuidhash snippet-table)) - (yas--make-blank-template)))) - ;; X) populate the template object - ;; - (yas--populate-template template - :table snippet-table - :key key - :content (second snippet) - :name (or name key) - :group group - :condition condition - :expand-env (sixth snippet) - :file (seventh snippet) - :keybinding keybinding - :uuid uuid) - ;; X) Update this template in the appropriate table. This step - ;; also will take care of adding the key indicators in the - ;; templates menu entry, if any - ;; - (yas--update-template snippet-table template) - ;; X) Return the template - ;; - ;; - template)) - - -;;; Apropos snippet menu: -;; -;; The snippet menu keymaps are store by mode in hash table called -;; `yas--menu-table'. They are linked to the main menu in -;; `yas--menu-keymap-get-create' and are initially created empty, -;; reflecting the table hierarchy. -;; -;; They can be populated in two mutually exclusive ways: (1) by -;; reading `yas--template-group', which in turn is populated by the "# -;; group:" directives of the snippets or the ".yas-make-groups" file -;; or (2) by using a separate `yas-define-menu' call, which declares a -;; menu structure based on snippets uuids. -;; -;; Both situations are handled in `yas--update-template-menu', which -;; uses the predicate `yas--template-menu-managed-by-yas-define-menu' -;; that can tell between the two situations. -;; -;; Note: -;; -;; * if `yas-define-menu' is used it must run before -;; `yas-define-snippets' and the UUIDS must match, otherwise we get -;; duplicate entries. The `yas--template' objects are created in -;; `yas-define-menu', holding nothing but the menu entry, -;; represented by a pair of ((menu-item NAME :keys KEYS) TYPE) and -;; stored in `yas--template-menu-binding-pair'. The (menu-item ...) -;; part is then stored in the menu keymap itself which make the item -;; appear to the user. These limitations could probably be revised. -;; -;; * The `yas--template-perm-group' slot is only used in -;; `yas-describe-tables'. -;; -(defun yas--template-menu-binding-pair-get-create (template &optional type) - "Get TEMPLATE's menu binding or assign it a new one. - -TYPE may be `:stay', signalling this menu binding should be -static in the menu." - (or (yas--template-menu-binding-pair template) - (let ((key (yas--template-key template)) - (keybinding (yas--template-keybinding template))) - (setf (yas--template-menu-binding-pair template) - (cons `(menu-item ,(or (yas--template-name template) - (yas--template-uuid template)) - ,(yas--make-menu-binding template) - :keys ,nil) - type))))) -(defun yas--template-menu-managed-by-yas-define-menu (template) - "Non-nil if TEMPLATE's menu entry was included in a `yas-define-menu' call." - (cdr (yas--template-menu-binding-pair template))) - - -(defun yas--show-menu-p (mode) - (cond ((eq yas-use-menu 'abbreviate) - (find mode - (mapcar #'(lambda (table) - (yas--table-mode table)) - (yas--get-snippet-tables)))) - ((eq yas-use-menu 'full) - t) - ((eq yas-use-menu t) - t))) - -(defun yas--delete-from-keymap (keymap uuid) - "Recursively delete items with UUID from KEYMAP and its submenus." - - ;; XXX: This used to skip any submenus named \"parent mode\" - ;; - ;; First of all, recursively enter submenus, i.e. the tree is - ;; searched depth first so that stale submenus can be found in the - ;; higher passes. - ;; - (mapc #'(lambda (item) - (when (and (listp (cdr item)) - (keymapp (third (cdr item)))) - (yas--delete-from-keymap (third (cdr item)) uuid))) - (rest keymap)) - ;; Set the uuid entry to nil - ;; - (define-key keymap (vector (make-symbol uuid)) nil) - ;; Destructively modify keymap - ;; - (setcdr keymap (delete-if #'(lambda (item) - (or (null (cdr item)) - (and (keymapp (third (cdr item))) - (null (cdr (third (cdr item))))))) - (rest keymap)))) - -(defun yas-define-menu (mode menu &optional omit-items) - "Define a snippet menu for MODE according to MENU, ommitting OMIT-ITEMS. - -MENU is a list, its elements can be: - -- (yas-item UUID) : Creates an entry the snippet identified with - UUID. The menu entry for a snippet thus identified is - permanent, i.e. it will never move (be reordered) in the menu. - -- (yas-separator) : Creates a separator - -- (yas-submenu NAME SUBMENU) : Creates a submenu with NAME, - SUBMENU has the same form as MENU. NAME is also added to the - list of groups of the snippets defined thereafter. - -OMIT-ITEMS is a list of snippet uuid's that will always be -ommited from MODE's menu, even if they're manually loaded. - -This function does nothing if `yas-use-menu' is nil. -" - (when yas-use-menu - (let* ((table (yas--table-get-create mode)) - (hash (yas--table-uuidhash table))) - (yas--define-menu-1 table - (yas--menu-keymap-get-create mode) - menu - hash) - (dolist (uuid omit-items) - (let ((template (or (gethash uuid hash) - (yas--populate-template (puthash uuid - (yas--make-blank-template) - hash) - :table table - :uuid uuid)))) - (setf (yas--template-menu-binding-pair template) (cons nil :none))))))) - -(defun yas--define-menu-1 (table menu-keymap menu uuidhash &optional group-list) - (dolist (e (reverse menu)) - (cond ((eq (first e) 'yas-item) - (let ((template (or (gethash (second e) uuidhash) - (yas--populate-template (puthash (second e) - (yas--make-blank-template) - uuidhash) - :table table - :perm-group group-list - :uuid (second e))))) - (define-key menu-keymap (vector (gensym)) - (car (yas--template-menu-binding-pair-get-create template :stay))))) - ((eq (first e) 'yas-submenu) - (let ((subkeymap (make-sparse-keymap))) - (define-key menu-keymap (vector (gensym)) - `(menu-item ,(second e) ,subkeymap)) - (yas--define-menu-1 table - subkeymap - (third e) - uuidhash - (append group-list (list (second e)))))) - ((eq (first e) 'yas-separator) - (define-key menu-keymap (vector (gensym)) - '(menu-item "----"))) - (t - (yas--message 3 "Don't know anything about menu entry %s" (first e)))))) - -(defun yas--define (mode key template &optional name condition group) - "Define a snippet. Expanding KEY into TEMPLATE. - -NAME is a description to this template. Also update the menu if -`yas-use-menu' is t. CONDITION is the condition attached to -this snippet. If you attach a condition to a snippet, then it -will only be expanded when the condition evaluated to non-nil." - (yas-define-snippets mode - (list (list key template name condition group)))) - -(defun yas-hippie-try-expand (first-time?) - "Integrate with hippie expand. Just put this function in -`hippie-expand-try-functions-list'." - (when yas-minor-mode - (if (not first-time?) - (let ((yas-fallback-behavior 'return-nil)) - (yas-expand)) - (undo 1) - nil))) - - -;;; Apropos condition-cache: -;;; -;;; -;;; -;;; -(defvar yas--condition-cache-timestamp nil) -(defmacro yas-define-condition-cache (func doc &rest body) - "Define a function FUNC with doc DOC and body BODY, BODY is -executed at most once every snippet expansion attempt, to check -expansion conditions. - -It doesn't make any sense to call FUNC programatically." - `(defun ,func () ,(if (and doc - (stringp doc)) - (concat doc -"\n\nFor use in snippets' conditions. Within each -snippet-expansion routine like `yas-expand', computes actual -value for the first time then always returns a cached value.") - (setq body (cons doc body)) - nil) - (let ((timestamp-and-value (get ',func 'yas--condition-cache))) - (if (equal (car timestamp-and-value) yas--condition-cache-timestamp) - (cdr timestamp-and-value) - (let ((new-value (progn - ,@body - ))) - (put ',func 'yas--condition-cache (cons yas--condition-cache-timestamp new-value)) - new-value))))) - -(defalias 'yas-expand 'yas-expand-from-trigger-key) -(defun yas-expand-from-trigger-key (&optional field) - "Expand a snippet before point. - -If no snippet expansion is possible, fall back to the behaviour -defined in `yas-fallback-behavior'. - -Optional argument FIELD is for non-interactive use and is an -object satisfying `yas--field-p' to restrict the expansion to." - (interactive) - (setq yas--condition-cache-timestamp (current-time)) - (let (templates-and-pos) - (unless (and yas-expand-only-for-last-commands - (not (member last-command yas-expand-only-for-last-commands))) - (setq templates-and-pos (if field - (save-restriction - (narrow-to-region (yas--field-start field) - (yas--field-end field)) - (yas--current-key)) - (yas--current-key)))) - (if (and templates-and-pos - (first templates-and-pos)) - (yas--expand-or-prompt-for-template (first templates-and-pos) - (second templates-and-pos) - (third templates-and-pos)) - (yas--fallback 'trigger-key)))) - -(defun yas-expand-from-keymap () - "Directly expand some snippets, searching `yas--direct-keymaps'. - -If expansion fails, execute the previous binding for this key" - (interactive) - (setq yas--condition-cache-timestamp (current-time)) - (let* ((yas--prefix current-prefix-arg) - (vec (subseq (this-command-keys-vector) (if current-prefix-arg - universal-argument-num-events - 0))) - (templates (mapcan #'(lambda (table) - (yas--fetch table vec)) - (yas--get-snippet-tables)))) - (if templates - (yas--expand-or-prompt-for-template templates) - (let ((yas-fallback-behavior 'call-other-command)) - (yas--fallback))))) - -(defun yas--expand-or-prompt-for-template (templates &optional start end) - "Expand one of TEMPLATES from START to END. - -Prompt the user if TEMPLATES has more than one element, else -expand immediately. Common gateway for -`yas-expand-from-trigger-key' and `yas-expand-from-keymap'." - (let ((yas--current-template (or (and (rest templates) ;; more than one - (yas--prompt-for-template (mapcar #'cdr templates))) - (cdar templates)))) - (when yas--current-template - (yas-expand-snippet (yas--template-content yas--current-template) - start - end - (yas--template-expand-env yas--current-template))))) - -(defun yas--fallback (&optional from-trigger-key-p) - "Fallback after expansion has failed. - -Common gateway for `yas-expand-from-trigger-key' and -`yas-expand-from-keymap'." - (cond ((eq yas-fallback-behavior 'return-nil) - ;; return nil - nil) - ((eq yas-fallback-behavior 'call-other-command) - (let* ((yas-minor-mode nil) - (yas--direct-keymaps nil) - (keys-1 (this-command-keys-vector)) - (keys-2 (and yas-trigger-key - from-trigger-key-p - (stringp yas-trigger-key) - (read-kbd-macro yas-trigger-key))) - (command-1 (and keys-1 (key-binding keys-1))) - (command-2 (and keys-2 (key-binding keys-2))) - ;; An (ugly) safety: prevents infinite recursion of - ;; yas-expand* calls. - (command (or (and (symbolp command-1) - (not (string-match "yas-expand" (symbol-name command-1))) - command-1) - (and (symbolp command-2) - command-2)))) - (when (and (commandp command) - (not (string-match "yas-expand" (symbol-name command)))) - (setq this-command command) - (call-interactively command)))) - ((and (listp yas-fallback-behavior) - (cdr yas-fallback-behavior) - (eq 'apply (car yas-fallback-behavior))) - (if (cddr yas-fallback-behavior) - (apply (cadr yas-fallback-behavior) - (cddr yas-fallback-behavior)) - (when (commandp (cadr yas-fallback-behavior)) - (setq this-command (cadr yas-fallback-behavior)) - (call-interactively (cadr yas-fallback-behavior))))) - (t - ;; also return nil if all the other fallbacks have failed - nil))) - - - -;;; Utils for snippet development: - -(defun yas--all-templates (tables) - "Return all snippet tables applicable for the current buffer. - -Honours `yas-choose-tables-first', `yas-choose-keys-first' and -`yas-buffer-local-condition'" - (when yas-choose-tables-first - (setq tables (list (yas--prompt-for-table tables)))) - (mapcar #'cdr - (if yas-choose-keys-first - (let ((key (yas--prompt-for-keys - (mapcan #'yas--table-all-keys tables)))) - (when key - (mapcan #'(lambda (table) - (yas--fetch table key)) - tables))) - (remove-duplicates (mapcan #'yas--table-templates tables) - :test #'equal)))) - -(defun yas-insert-snippet (&optional no-condition) - "Choose a snippet to expand, pop-up a list of choices according -to `yas--prompt-function'. - -With prefix argument NO-CONDITION, bypass filtering of snippets -by condition." - (interactive "P") - (setq yas--condition-cache-timestamp (current-time)) - (let* ((yas-buffer-local-condition (or (and no-condition - 'always) - yas-buffer-local-condition)) - (templates (yas--all-templates (yas--get-snippet-tables))) - (yas--current-template (and templates - (or (and (rest templates) ;; more than one template for same key - (yas--prompt-for-template templates)) - (car templates)))) - (where (if (region-active-p) - (cons (region-beginning) (region-end)) - (cons (point) (point))))) - (if yas--current-template - (yas-expand-snippet (yas--template-content yas--current-template) - (car where) - (cdr where) - (yas--template-expand-env yas--current-template)) - (yas--message 3 "No snippets can be inserted here!")))) - -(defun yas-visit-snippet-file () - "Choose a snippet to edit, selection like `yas-insert-snippet'. - -Only success if selected snippet was loaded from a file. Put the -visited file in `snippet-mode'." - (interactive) - (let* ((yas-buffer-local-condition 'always) - (templates (yas--all-templates (yas--get-snippet-tables))) - (yas-prompt-functions '(yas-ido-prompt yas-completing-prompt)) - (template (and templates - (or (yas--prompt-for-template templates - "Choose a snippet template to edit: ") - (car templates))))) - - (if template - (yas--visit-snippet-file-1 template) - (message "No snippets tables active!")))) - -(defun yas--visit-snippet-file-1 (template) - (let ((file (yas--template-file template))) - (cond ((and file (file-readable-p file)) - (find-file-other-window file) - (snippet-mode) - (set (make-local-variable 'yas--editing-template) template)) - (file - (message "Original file %s no longer exists!" file)) - (t - (switch-to-buffer (format "*%s*"(yas--template-name template))) - (let ((type 'snippet)) - (when (listp (yas--template-content template)) - (insert (format "# type: command\n")) - (setq type 'command)) - (insert (format "# key: %s\n" (yas--template-key template))) - (insert (format "# name: %s\n" (yas--template-name template))) - (when (yas--template-keybinding template) - (insert (format "# binding: %s\n" (yas--template-keybinding template)))) - (when (yas--template-expand-env template) - (insert (format "# expand-env: %s\n" (yas--template-expand-env template)))) - (when (yas--template-condition template) - (insert (format "# condition: %s\n" (yas--template-condition template)))) - (insert "# --\n") - (insert (if (eq type 'command) - (pp-to-string (yas--template-content template)) - (yas--template-content template)))) - (snippet-mode) - (set (make-local-variable 'yas--editing-template) template))))) - -(defun yas--guess-snippet-directories-1 (table) - "Guesses possible snippet subdirectories for TABLE." - (cons (yas--table-name table) - (mapcan #'(lambda (parent) - (yas--guess-snippet-directories-1 - parent)) - (yas--table-parents table)))) - -(defun yas--guess-snippet-directories (&optional table) - "Try to guess suitable directories based on the current active -tables (or optional TABLE). - -Returns a list of elemts (TABLE . DIRS) where TABLE is a -`yas--table' object and DIRS is a list of all possible directories -where snippets of table might exist." - (let ((main-dir (replace-regexp-in-string - "/+$" "" - (or (first (or (yas-snippet-dirs) - (setq yas-snippet-dirs '("~/.emacs.d/snippets"))))))) - (tables (or (and table - (list table)) - (yas--get-snippet-tables)))) - ;; HACK! the snippet table created here is actually registered! - ;; - (unless (or table (gethash major-mode yas--tables)) - (push (yas--table-get-create major-mode) - tables)) - - (mapcar #'(lambda (table) - (cons table - (mapcar #'(lambda (subdir) - (concat main-dir "/" subdir)) - (yas--guess-snippet-directories-1 table)))) - tables))) - -(defun yas--make-directory-maybe (table-and-dirs &optional main-table-string) - "Returns a dir inside TABLE-AND-DIRS, prompts for creation if none exists." - (or (some #'(lambda (dir) (when (file-directory-p dir) dir)) (cdr table-and-dirs)) - (let ((candidate (first (cdr table-and-dirs)))) - (unless (file-writable-p (file-name-directory candidate)) - (error (yas--format "%s is not writable." candidate))) - (if (y-or-n-p (format "Guessed directory (%s) for%s%s table \"%s\" does not exist! Create? " - candidate - (if (gethash (yas--table-mode (car table-and-dirs)) - yas--tables) - "" - " brand new") - (or main-table-string - "") - (yas--table-name (car table-and-dirs)))) - (progn - (make-directory candidate 'also-make-parents) - ;; create the .yas-parents file here... - candidate))))) - -(defun yas-new-snippet (&optional no-template) - "Pops a new buffer for writing a snippet. - -Expands a snippet-writing snippet, unless the optional prefix arg -NO-TEMPLATE is non-nil." - (interactive "P") - (let ((guessed-directories (yas--guess-snippet-directories))) - - (switch-to-buffer "*new snippet*") - (erase-buffer) - (kill-all-local-variables) - (snippet-mode) - (yas-minor-mode 1) - (set (make-local-variable 'yas--guessed-modes) (mapcar #'(lambda (d) - (yas--table-mode (car d))) - guessed-directories)) - (unless no-template (yas-expand-snippet "\ -# -*- mode: snippet -*- -# name: $1 -# key: ${2:${1:$(replace-regexp-in-string \"\\\\\\\\(\\\\\\\\w+\\\\\\\\).*\" \"\\\\\\\\1\" yas-text)}}${3: -# binding: ${4:direct-keybinding}}${5: -# expand-env: ((${6:some-var} ${7:some-value}))}${8: -# type: command} -# -- -$0")))) - -(defun yas--compute-major-mode-and-parents (file) - "Given FILE, find the nearest snippet directory for a given -mode, then return a list (MODE-SYM PARENTS), the mode's symbol and a list -representing one or more of the mode's parents. - -Note that MODE-SYM need not be the symbol of a real major mode, -neither do the elements of PARENTS." - (let* ((file-dir (and file - (directory-file-name (or (some #'(lambda (special) - (locate-dominating-file file special)) - '(".yas-setup.el" - ".yas-make-groups" - ".yas-parents")) - (directory-file-name (file-name-directory file)))))) - (parents-file-name (concat file-dir "/.yas-parents")) - (major-mode-name (and file-dir - (file-name-nondirectory file-dir))) - (major-mode-sym (or (and major-mode-name - (intern major-mode-name)))) - (parents (when (file-readable-p parents-file-name) - (mapcar #'intern - (split-string - (with-temp-buffer - (insert-file-contents parents-file-name) - (buffer-substring-no-properties (point-min) - (point-max)))))))) - (when major-mode-sym - (cons major-mode-sym parents)))) - -(defvar yas--editing-template nil - "Supporting variable for `yas-load-snippet-buffer' and `yas--visit-snippet'") - -(defvar yas--current-template nil - "Holds the current template being expanded into a snippet.") - -(defvar yas--guessed-modes nil - "List of guessed modes supporting `yas-load-snippet-buffer'.") - -(defun yas-load-snippet-buffer (&optional kill) - "Parse and load current buffer's snippet definition. - -With optional prefix argument KILL quit the window and buffer." - (interactive "P") - (cond - ;; We have `yas--editing-template', this buffer's - ;; content comes from a template which is already loaded and - ;; neatly positioned,... - ;; - (yas--editing-template - (yas-define-snippets-1 (yas--parse-template (yas--template-file yas--editing-template)) - (yas--template-table yas--editing-template))) - ;; Try to use `yas--guessed-modes'. If we don't have that use the - ;; value from `yas--compute-major-mode-and-parents' - ;; - (t - (unless yas--guessed-modes - (set (make-local-variable 'yas--guessed-modes) (or (yas--compute-major-mode-and-parents buffer-file-name)))) - (let* ((prompt (if (and (featurep 'ido) - ido-mode) - 'ido-completing-read 'completing-read)) - (table (yas--table-get-create - (intern - (funcall prompt (format "Choose or enter a table (yas guesses %s): " - (if yas--guessed-modes - (first yas--guessed-modes) - "nothing")) - (mapcar #'symbol-name yas--guessed-modes) - nil - nil - nil - nil - (if (first yas--guessed-modes) - (symbol-name (first yas--guessed-modes)))))))) - (set (make-local-variable 'yas--editing-template) - (yas-define-snippets-1 (yas--parse-template buffer-file-name) - table))))) - ;; Now, offer to save this iff: - ;; - ;; 1) `yas-snippet-dirs' is a list and its first element does not - ;; match this template's file (i.e. this is a library snippet, not - ;; a user snippet) OR - ;; - ;; 2) yas--editing-template comes from a file that we cannot write to... - ;; - (when (or (not (yas--template-file yas--editing-template)) - (not (file-writable-p (yas--template-file yas--editing-template))) - (and (listp yas-snippet-dirs) - (second yas-snippet-dirs) - (not (string-match (expand-file-name (first yas-snippet-dirs)) - (yas--template-file yas--editing-template))))) - - (when (y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? ")) - (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 (yas--template-file yas--editing-template) - (file-name-nondirectory (yas--template-file yas--editing-template))) - (yas--template-name yas--editing-template)))) - (write-file (concat chosen "/" - (read-from-minibuffer (format "File name to create in %s? " chosen) - default-file-name))) - (setf (yas--template-file yas--editing-template) buffer-file-name)))))) - (when kill - (quit-window kill)) - (yas--message 3 "Snippet \"%s\" loaded for %s." - (yas--template-name yas--editing-template) - (yas--table-name (yas--template-table yas--editing-template)))) - - -(defun yas-tryout-snippet (&optional debug) - "Test current buffers's snippet template in other buffer." - (interactive "P") - (let* ((major-mode-and-parent (yas--compute-major-mode-and-parents buffer-file-name)) - (parsed (yas--parse-template)) - (test-mode (or (and (car major-mode-and-parent) - (fboundp (car major-mode-and-parent)) - (car major-mode-and-parent)) - (first yas--guessed-modes) - (intern (read-from-minibuffer (yas--format "Please input a mode: "))))) - (yas--current-template - (and parsed - (fboundp test-mode) - (yas--populate-template (yas--make-blank-template) - :table nil ;; no tables for ephemeral snippets - :key (first parsed) - :content (second parsed) - :name (third parsed) - :expand-env (sixth parsed))))) - (cond (yas--current-template - (let ((buffer-name (format "*testing snippet: %s*" (yas--template-name yas--current-template)))) - (kill-buffer (get-buffer-create buffer-name)) - (switch-to-buffer (get-buffer-create buffer-name)) - (setq buffer-undo-list nil) - (condition-case nil (funcall test-mode) (error nil)) - (setq buffer-read-only nil) - (yas-expand-snippet (yas--template-content yas--current-template) - (point-min) - (point-max) - (yas--template-expand-env yas--current-template)) - (when (and debug - (require 'yasnippet-debug nil t)) - (add-hook 'post-command-hook 'yas-debug-snippet-vars nil t)))) - (t - (yas--message 3 "Cannot test snippet for unknown major mode"))))) - -(defun yas--template-fine-group (template) - (car (last (or (yas--template-group template) - (yas--template-perm-group template))))) - -(defun yas-describe-tables (&optional choose) - "Display snippets for each table." - (interactive "P") - (let* ((by-name-hash (and choose - (y-or-n-p "Show by namehash? "))) - (buffer (get-buffer-create "*YASnippet tables*")) - (active-tables (yas--get-snippet-tables)) - (remain-tables (let ((all)) - (maphash #'(lambda (k v) - (unless (find v active-tables) - (push v all))) - yas--tables) - all)) - (table-lists (list active-tables remain-tables)) - (original-buffer (current-buffer)) - (continue t) - (yas--condition-cache-timestamp (current-time))) - (with-current-buffer buffer - (setq buffer-read-only nil) - (erase-buffer) - (cond ((not by-name-hash) - (insert "YASnippet tables: \n") - (while (and table-lists - continue) - (dolist (table (car table-lists)) - (yas--describe-pretty-table table original-buffer)) - (setq table-lists (cdr table-lists)) - (when table-lists - (yas--create-snippet-xrefs) - (display-buffer buffer) - (setq continue (and choose (y-or-n-p "Show also non-active tables? "))))) - (yas--create-snippet-xrefs) - (help-mode) - (goto-char 1)) - (t - (insert "\n\nYASnippet tables by NAMEHASH: \n") - (dolist (table (append active-tables remain-tables)) - (insert (format "\nSnippet table `%s':\n\n" (yas--table-name table))) - (let ((keys)) - (maphash #'(lambda (k v) - (push k keys)) - (yas--table-hash table)) - (dolist (key keys) - (insert (format " key %s maps snippets: %s\n" key - (let ((names)) - (maphash #'(lambda (k v) - (push k names)) - (gethash key (yas--table-hash table))) - names)))))))) - (goto-char 1) - (setq buffer-read-only t)) - (display-buffer buffer))) - -(defun yas--describe-pretty-table (table &optional original-buffer) - (insert (format "\nSnippet table `%s'" - (yas--table-name table))) - (if (yas--table-parents table) - (insert (format " parents: %s\n" - (mapcar #'yas--table-name - (yas--table-parents table)))) - (insert "\n")) - (insert (make-string 100 ?-) "\n") - (insert "group state name key binding\n") - (let ((groups-hash (make-hash-table :test #'equal))) - (maphash #'(lambda (k v) - (let ((group (or (yas--template-fine-group v) - "(top level)"))) - (when (yas--template-name v) - (puthash group - (cons v (gethash group groups-hash)) - groups-hash)))) - (yas--table-uuidhash table)) - (maphash - #'(lambda (group templates) - (setq group (truncate-string-to-width group 25 0 ? "...")) - (insert (make-string 100 ?-) "\n") - (dolist (p templates) - (let ((name (truncate-string-to-width (propertize (format "\\\\snippet `%s'" (yas--template-name p)) - 'yasnippet p) - 50 0 ? "...")) - (group (prog1 group - (setq group (make-string (length group) ? )))) - (condition-string (let ((condition (yas--template-condition p))) - (if (and condition - original-buffer) - (with-current-buffer original-buffer - (if (yas--eval-condition condition) - "(y)" - "(s)")) - "(a)")))) - (insert group " ") - (insert condition-string " ") - (insert name - (if (string-match "\\.\\.\\.$" name) - "'" - " ") - " ") - (insert (truncate-string-to-width (or (yas--template-key p) "") - 15 0 ? "...") " ") - (insert (truncate-string-to-width (key-description (yas--template-keybinding p)) - 15 0 ? "...") " ") - (insert "\n")))) - groups-hash))) - - - -;;; User convenience functions, for using in snippet definitions - -(defvar yas-modified-p nil - "Non-nil if field has been modified by user or transformation.") - -(defvar yas-moving-away-p nil - "Non-nil if user is about to exit field.") - -(defvar yas-text nil - "Contains current field text.") - -(defun yas-substr (str pattern &optional subexp) - "Search PATTERN in STR and return SUBEXPth match. - -If found, the content of subexp group SUBEXP (default 0) is - returned, or else the original STR will be returned." - (let ((grp (or subexp 0))) - (save-match-data - (if (string-match pattern str) - (match-string-no-properties grp str) - str)))) - -(defun yas-choose-value (possibilities) - "Prompt for a string in the list POSSIBILITIES and return it." - (unless (or yas-moving-away-p - yas-modified-p) - (some #'(lambda (fn) - (funcall fn "Choose: " possibilities)) - yas-prompt-functions))) - -(defun yas-key-to-value (alist) - "Prompt for a string in the list POSSIBILITIES and return it." - (unless (or yas-moving-away-p - yas-modified-p) - (let ((key (read-key-sequence ""))) - (when (stringp key) - (or (cdr (find key alist :key #'car :test #'string=)) - key))))) - -(defun yas-throw (text) - "Throw a yas--exception with TEXT as the reason." - (throw 'yas--exception (cons 'yas--exception text))) - -(defun yas-verify-value (possibilities) - "Verify that the current field value is in POSSIBILITIES - -Otherwise throw exception." - (when (and yas-moving-away-p (notany #'(lambda (pos) (string= pos yas-text)) possibilities)) - (yas-throw (yas--format "Field only allows %s" possibilities)))) - -(defun yas-field-value (number) - "Get the string for field with NUMBER. - -Use this in primary and mirror transformations to tget." - (let* ((snippet (car (yas--snippets-at-point))) - (field (and snippet - (yas--snippet-find-field snippet number)))) - (when field - (yas--field-text-for-display field)))) - -(defun yas-text () - "Return `yas-text' if that exists and is non-empty, else nil." - (if (and yas-text - (not (string= "" yas-text))) - yas-text)) - -;; (defun yas-selected-text () -;; "Return `yas-selected-text' if that exists and is non-empty, else nil." -;; (if (and yas-selected-text -;; (not (string= "" yas-selected-text))) -;; yas-selected-text)) - -(defun yas--get-field-once (number &optional transform-fn) - (unless yas-modified-p - (if transform-fn - (funcall transform-fn (yas-field-value number)) - (yas-field-value number)))) - -(defun yas-default-from-field (number) - (unless yas-modified-p - (yas-field-value number))) - -(defun yas-inside-string () - (equal 'font-lock-string-face (get-char-property (1- (point)) 'face))) - -(defun yas-unimplemented (&optional missing-feature) - (if yas--current-template - (if (y-or-n-p (format "This snippet is unimplemented (missing %s) Visit the snippet definition? " - (or missing-feature - "something"))) - (yas--visit-snippet-file-1 yas--current-template)) - (message "No implementation. Missing %s" (or missing-feature "something")))) - - -;;; Snippet expansion and field management - -(defvar yas--active-field-overlay nil - "Overlays the currently active field.") - -(defvar yas--field-protection-overlays nil - "Two overlays protect the current active field ") - -(defconst yas--prefix nil - "A prefix argument for expansion direct from keybindings") - -(defvar yas-selected-text nil - "The selected region deleted on the last snippet expansion.") - -(defvar yas--start-column nil - "The column where the snippet expansion started.") - -(make-variable-buffer-local 'yas--active-field-overlay) -(make-variable-buffer-local 'yas--field-protection-overlays) -(put 'yas--active-field-overlay 'permanent-local t) -(put 'yas--field-protection-overlays 'permanent-local t) - -(defstruct (yas--snippet (:constructor yas--make-snippet ())) - "A snippet. - -..." - (fields '()) - (exit nil) - (id (yas--snippet-next-id) :read-only t) - (control-overlay nil) - active-field - ;; stacked expansion: the `previous-active-field' slot saves the - ;; active field where the child expansion took place - previous-active-field - force-exit) - -(defstruct (yas--field (:constructor yas--make-field (number start end parent-field))) - "A field." - number - start end - parent-field - (mirrors '()) - (transform nil) - (modified-p nil) - next) - -(defstruct (yas--mirror (:constructor yas--make-mirror (start end transform))) - "A mirror." - start end - (transform nil) - parent-field - next) - -(defstruct (yas--exit (:constructor yas--make-exit (marker))) - marker - next) - -(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p) - "Calculate transformed string for FIELD-OR-MIRROR from FIELD. - -If there is no transform for ht field, return nil. - -If there is a transform but it returns nil, return the empty -string iff EMPTY-ON-NIL-P is true." - (let* ((yas-text (yas--field-text-for-display field)) - (text yas-text) - (yas-modified-p (yas--field-modified-p field)) - (yas-moving-away-p nil) - (transform (if (yas--mirror-p field-or-mirror) - (yas--mirror-transform field-or-mirror) - (yas--field-transform field-or-mirror))) - (start-point (if (yas--mirror-p field-or-mirror) - (yas--mirror-start field-or-mirror) - (yas--field-start field-or-mirror))) - (transformed (and transform - (save-excursion - (goto-char start-point) - (let ((ret (yas--eval-lisp transform))) - (or ret (and empty-on-nil-p ""))))))) - transformed)) - -(defsubst yas--replace-all (from to &optional text) - "Replace all occurance from FROM to TO. - -With optional string TEXT do it in that string." - (if text - (replace-regexp-in-string (regexp-quote from) to text t t) - (goto-char (point-min)) - (while (search-forward from nil t) - (replace-match to t t text)))) - -(defun yas--snippet-find-field (snippet number) - (find-if #'(lambda (field) - (eq number (yas--field-number field))) - (yas--snippet-fields snippet))) - -(defun yas--snippet-sort-fields (snippet) - "Sort the fields of SNIPPET in navigation order." - (setf (yas--snippet-fields snippet) - (sort (yas--snippet-fields snippet) - #'yas--snippet-field-compare))) - -(defun yas--snippet-field-compare (field1 field2) - "Compare two fields. The field with a number is sorted first. -If they both have a number, compare through the number. If neither -have, compare through the field's start point" - (let ((n1 (yas--field-number field1)) - (n2 (yas--field-number field2))) - (if n1 - (if n2 - (or (zerop n2) (and (not (zerop n1)) - (< n1 n2))) - (not (zerop n1))) - (if n2 - (zerop n2) - (< (yas--field-start field1) - (yas--field-start field2)))))) - -(defun yas--field-probably-deleted-p (snippet field) - "Guess if SNIPPET's FIELD should be skipped." - (and - ;; field must be zero lentgh - ;; - (zerop (- (yas--field-start field) (yas--field-end field))) - ;; skip if: - (or - ;; 1) is a nested field and it's been modified - ;; - (and (yas--field-parent-field field) - (yas--field-modified-p field)) - ;; 2) ends just before the snippet end - ;; - (and (eq field (car (last (yas--snippet-fields snippet)))) - (= (yas--field-start field) (overlay-end (yas--snippet-control-overlay snippet))))) - ;; the field numbered 0, just before the exit marker, should - ;; never be skipped - ;; - (not (zerop (yas--field-number field))))) - -(defun yas--snippets-at-point (&optional all-snippets) - "Return a sorted list of snippets at point, most recently -inserted first." - (sort - (remove nil (remove-duplicates (mapcar #'(lambda (ov) - (overlay-get ov 'yas--snippet)) - (if all-snippets - (overlays-in (point-min) (point-max)) - (nconc (overlays-at (point)) (overlays-at (1- (point)))))))) - #'(lambda (s1 s2) - (<= (yas--snippet-id s2) (yas--snippet-id s1))))) - -(defun yas-next-field-or-maybe-expand () - "Try to expand a snippet at a key before point, otherwise -delegate to `yas-next-field'." - (interactive) - (if yas-triggers-in-field - (let ((yas-fallback-behavior 'return-nil) - (active-field (overlay-get yas--active-field-overlay 'yas--field))) - (when active-field - (unless (yas-expand-from-trigger-key active-field) - (yas-next-field)))) - (yas-next-field))) - -(defun yas-next-field (&optional arg) - "Navigate to next field. If there's none, exit the snippet." - (interactive) - (let* ((arg (or arg - 1)) - (snippet (first (yas--snippets-at-point))) - (active-field (overlay-get yas--active-field-overlay 'yas--field)) - (live-fields (remove-if #'(lambda (field) - (and (not (eq field active-field)) - (yas--field-probably-deleted-p snippet field))) - (yas--snippet-fields snippet))) - (active-field-pos (position active-field live-fields)) - (target-pos (and active-field-pos (+ arg active-field-pos))) - (target-field (and target-pos (nth target-pos live-fields)))) - ;; First check if we're moving out of a field with a transform - ;; - (when (and active-field - (yas--field-transform active-field)) - (let* ((yas-moving-away-p t) - (yas-text (yas--field-text-for-display active-field)) - (text yas-text) - (yas-modified-p (yas--field-modified-p active-field))) - ;; primary field transform: exit call to field-transform - (yas--eval-lisp (yas--field-transform active-field)))) - ;; Now actually move... - (cond ((and target-pos (>= target-pos (length live-fields))) - (yas-exit-snippet snippet)) - (target-field - (yas--move-to-field snippet target-field)) - (t - nil)))) - -(defun yas--place-overlays (snippet field) - "Correctly place overlays for SNIPPET's FIELD" - (yas--make-move-field-protection-overlays snippet field) - (yas--make-move-active-field-overlay snippet field)) - -(defun yas--move-to-field (snippet field) - "Update SNIPPET to move to field FIELD. - -Also create some protection overlays" - (goto-char (yas--field-start field)) - (yas--place-overlays snippet field) - (overlay-put yas--active-field-overlay 'yas--field field) - (let ((number (yas--field-number field))) - ;; check for the special ${0: ...} field - (if (and number (zerop number)) - (progn - (set-mark (yas--field-end field)) - (setf (yas--snippet-force-exit snippet) - (or (yas--field-transform field) - t))) - ;; make this field active - (setf (yas--snippet-active-field snippet) field) - ;; primary field transform: first call to snippet transform - (unless (yas--field-modified-p field) - (if (yas--field-update-display field snippet) - (yas--update-mirrors snippet) - (setf (yas--field-modified-p field) nil)))))) - -(defun yas-prev-field () - "Navigate to prev field. If there's none, exit the snippet." - (interactive) - (yas-next-field -1)) - -(defun yas-abort-snippet (&optional snippet) - (interactive) - (let ((snippet (or snippet - (car (yas--snippets-at-point))))) - (when snippet - (setf (yas--snippet-force-exit snippet) t)))) - -(defun yas-exit-snippet (snippet) - "Goto exit-marker of SNIPPET." - (interactive (list (first (yas--snippets-at-point)))) - (when snippet - (setf (yas--snippet-force-exit snippet) t) - (goto-char (if (yas--snippet-exit snippet) - (yas--exit-marker (yas--snippet-exit snippet)) - (overlay-end (yas--snippet-control-overlay snippet)))))) - -(defun yas-exit-all-snippets () - "Exit all snippets." - (interactive) - (mapc #'(lambda (snippet) - (yas-exit-snippet snippet) - (yas--check-commit-snippet)) - (yas--snippets-at-point 'all-snippets))) - - -;;; Some low level snippet-routines: - -(defmacro yas--inhibit-overlay-hooks (&rest body) - "Run BODY with `yas--inhibit-overlay-hooks' set to t." - (declare (indent 0)) - `(let ((yas--inhibit-overlay-hooks t)) - (progn ,@body))) - -(defvar yas-snippet-beg nil "Beginning position of the last snippet commited.") -(defvar yas-snippet-end nil "End position of the last snippet commited.") - -(defun yas--commit-snippet (snippet) - "Commit SNIPPET, but leave point as it is. This renders the -snippet as ordinary text." - - (let ((control-overlay (yas--snippet-control-overlay snippet))) - ;; - ;; Save the end of the moribund snippet in case we need to revive it - ;; its original expansion. - ;; - (when (and control-overlay - (overlay-buffer control-overlay)) - (setq yas-snippet-beg (overlay-start control-overlay)) - (setq yas-snippet-end (overlay-end control-overlay)) - (delete-overlay control-overlay)) - - (yas--inhibit-overlay-hooks - (when yas--active-field-overlay - (delete-overlay yas--active-field-overlay)) - (when yas--field-protection-overlays - (mapc #'delete-overlay yas--field-protection-overlays))) - - ;; stacked expansion: if the original expansion took place from a - ;; field, make sure we advance it here at least to - ;; `yas-snippet-end'... - ;; - (let ((previous-field (yas--snippet-previous-active-field snippet))) - (when (and yas-snippet-end previous-field) - (yas--advance-end-maybe previous-field yas-snippet-end))) - - ;; Convert all markers to points, - ;; - (yas--markers-to-points snippet) - - ;; Take care of snippet revival - ;; - (if yas-snippet-revival - (push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end ,snippet) - buffer-undo-list) - ;; Dismember the snippet... this is useful if we get called - ;; again from `yas--take-care-of-redo'.... - (setf (yas--snippet-fields snippet) nil))) - - (yas--message 3 "Snippet %s exited." (yas--snippet-id snippet))) - -(defun yas--safely-run-hooks (hook-var) - (condition-case error - (run-hooks hook-var) - (error - (yas--message 3 "%s error: %s" hook-var (error-message-string error))))) - - -(defun yas--check-commit-snippet () - "Checks if point exited the currently active field of the -snippet, if so cleans up the whole snippet up." - (let* ((snippets (yas--snippets-at-point 'all-snippets)) - (snippets-left snippets) - (snippet-exit-transform)) - (dolist (snippet snippets) - (let ((active-field (yas--snippet-active-field snippet))) - (setq snippet-exit-transform (yas--snippet-force-exit snippet)) - (cond ((or snippet-exit-transform - (not (and active-field (yas--field-contains-point-p active-field)))) - (setq snippets-left (delete snippet snippets-left)) - (setf (yas--snippet-force-exit snippet) nil) - (yas--commit-snippet snippet)) - ((and active-field - (or (not yas--active-field-overlay) - (not (overlay-buffer yas--active-field-overlay)))) - ;; - ;; stacked expansion: this case is mainly for recent - ;; snippet exits that place us back int the field of - ;; another snippet - ;; - (save-excursion - (yas--move-to-field snippet active-field) - (yas--update-mirrors snippet))) - (t - nil)))) - (unless (or (null snippets) snippets-left) - (if snippet-exit-transform - (yas--eval-lisp-no-saves snippet-exit-transform)) - (yas--safely-run-hooks 'yas-after-exit-snippet-hook)))) - -;; Apropos markers-to-points: -;; -;; This was found useful for performance reasons, so that an -;; excessive number of live markers aren't kept around in the -;; `buffer-undo-list'. However, in `markers-to-points', the -;; set-to-nil markers can't simply be discarded and replaced with -;; fresh ones in `points-to-markers'. The original marker that was -;; just set to nil has to be reused. -;; -;; This shouldn't bring horrible problems with undo/redo, but it -;; you never know -;; -(defun yas--markers-to-points (snippet) - "Convert all markers in SNIPPET to a cons (POINT . MARKER) -where POINT is the original position of the marker and MARKER is -the original marker object with the position set to nil." - (dolist (field (yas--snippet-fields snippet)) - (let ((start (marker-position (yas--field-start field))) - (end (marker-position (yas--field-end field)))) - (set-marker (yas--field-start field) nil) - (set-marker (yas--field-end field) nil) - (setf (yas--field-start field) (cons start (yas--field-start field))) - (setf (yas--field-end field) (cons end (yas--field-end field)))) - (dolist (mirror (yas--field-mirrors field)) - (let ((start (marker-position (yas--mirror-start mirror))) - (end (marker-position (yas--mirror-end mirror)))) - (set-marker (yas--mirror-start mirror) nil) - (set-marker (yas--mirror-end mirror) nil) - (setf (yas--mirror-start mirror) (cons start (yas--mirror-start mirror))) - (setf (yas--mirror-end mirror) (cons end (yas--mirror-end mirror)))))) - (let ((snippet-exit (yas--snippet-exit snippet))) - (when snippet-exit - (let ((exit (marker-position (yas--exit-marker snippet-exit)))) - (set-marker (yas--exit-marker snippet-exit) nil) - (setf (yas--exit-marker snippet-exit) (cons exit (yas--exit-marker snippet-exit))))))) - -(defun yas--points-to-markers (snippet) - "Convert all cons (POINT . MARKER) in SNIPPET to markers. This -is done by setting MARKER to POINT with `set-marker'." - (dolist (field (yas--snippet-fields snippet)) - (setf (yas--field-start field) (set-marker (cdr (yas--field-start field)) - (car (yas--field-start field)))) - (setf (yas--field-end field) (set-marker (cdr (yas--field-end field)) - (car (yas--field-end field)))) - (dolist (mirror (yas--field-mirrors field)) - (setf (yas--mirror-start mirror) (set-marker (cdr (yas--mirror-start mirror)) - (car (yas--mirror-start mirror)))) - (setf (yas--mirror-end mirror) (set-marker (cdr (yas--mirror-end mirror)) - (car (yas--mirror-end mirror)))))) - (let ((snippet-exit (yas--snippet-exit snippet))) - (when snippet-exit - (setf (yas--exit-marker snippet-exit) (set-marker (cdr (yas--exit-marker snippet-exit)) - (car (yas--exit-marker snippet-exit))))))) - -(defun yas--field-contains-point-p (field &optional point) - (let ((point (or point - (point)))) - (and (>= point (yas--field-start field)) - (<= point (yas--field-end field))))) - -(defun yas--field-text-for-display (field) - "Return the propertized display text for field FIELD. " - (buffer-substring (yas--field-start field) (yas--field-end field))) - -(defun yas--undo-in-progress () - "True if some kind of undo is in progress" - (or undo-in-progress - (eq this-command 'undo) - (eq this-command 'redo))) - -(defun yas--make-control-overlay (snippet start end) - "Creates the control overlay that surrounds the snippet and -holds the keymap." - (let ((overlay (make-overlay start - end - nil - nil - t))) - (overlay-put overlay 'keymap yas-keymap) - (overlay-put overlay 'priority 100) - (overlay-put overlay 'yas--snippet snippet) - overlay)) - -(defun yas-skip-and-clear-or-delete-char (&optional field) - "Clears unmodified field if at field start, skips to next tab. - -Otherwise deletes a character normally by calling `delete-char'." - (interactive) - (let ((field (or field - (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field))))) - (cond ((and field - (not (yas--field-modified-p field)) - (eq (point) (marker-position (yas--field-start field)))) - (yas--skip-and-clear field) - (yas-next-field 1)) - (t - (call-interactively 'delete-char))))) - -(defun yas--skip-and-clear (field) - "Deletes the region of FIELD and sets it modified state to t" - ;; Just before skipping-and-clearing the field, mark its children - ;; fields as modified, too. If the childen have mirrors-in-fields - ;; this prevents them from updating erroneously (we're skipping and - ;; deleting!). - ;; - (yas--mark-this-and-children-modified field) - (delete-region (yas--field-start field) (yas--field-end field))) - -(defun yas--mark-this-and-children-modified (field) - (setf (yas--field-modified-p field) t) - (let ((fom (yas--field-next field))) - (while (and fom - (yas--fom-parent-field fom)) - (when (and (eq (yas--fom-parent-field fom) field) - (yas--field-p fom)) - (yas--mark-this-and-children-modified fom)) - (setq fom (yas--fom-next fom))))) - -(defun yas--make-move-active-field-overlay (snippet field) - "Place the active field overlay in SNIPPET's FIELD. - -Move the overlay, or create it if it does not exit." - (if (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay)) - (move-overlay yas--active-field-overlay - (yas--field-start field) - (yas--field-end field)) - (setq yas--active-field-overlay - (make-overlay (yas--field-start field) - (yas--field-end field) - nil nil t)) - (overlay-put yas--active-field-overlay 'priority 100) - (overlay-put yas--active-field-overlay 'face 'yas-field-highlight-face) - (overlay-put yas--active-field-overlay 'yas--snippet snippet) - (overlay-put yas--active-field-overlay 'modification-hooks '(yas--on-field-overlay-modification)) - (overlay-put yas--active-field-overlay 'insert-in-front-hooks - '(yas--on-field-overlay-modification)) - (overlay-put yas--active-field-overlay 'insert-behind-hooks - '(yas--on-field-overlay-modification)))) - -(defvar yas--inhibit-overlay-hooks nil - "Bind this temporarity to non-nil to prevent running `yas--on-*-modification'.") - -(defun yas--on-field-overlay-modification (overlay after? beg end &optional length) - "Clears the field and updates mirrors, conditionally. - -Only clears the field if it hasn't been modified and it point it -at field start. This hook doesn't do anything if an undo is in -progress." - (unless (or yas--inhibit-overlay-hooks - (yas--undo-in-progress)) - (let* ((field (overlay-get overlay 'yas--field)) - (number (and field (yas--field-number field))) - (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) - (cond (after? - (yas--advance-end-maybe field (overlay-end overlay)) - (save-excursion - (yas--field-update-display field snippet)) - (yas--update-mirrors snippet)) - (field - (when (and (not after?) - (not (yas--field-modified-p field)) - (eq (point) (if (markerp (yas--field-start field)) - (marker-position (yas--field-start field)) - (yas--field-start field)))) - (yas--skip-and-clear field)) - (setf (yas--field-modified-p field) t)))))) - -;;; Apropos protection overlays: -;; -;; These exist for nasty users who will try to delete parts of the -;; snippet outside the active field. Actual protection happens in -;; `yas--on-protection-overlay-modification'. -;; -;; Currently this signals an error which inhibits the command. For -;; commands that move point (like `kill-line'), point is restored in -;; the `yas--post-command-handler' using a global -;; `yas--protection-violation' variable. -;; -;; Alternatively, I've experimented with an implementation that -;; commits the snippet before actually calling `this-command' -;; interactively, and then signals an eror, which is ignored. but -;; blocks all other million modification hooks. This presented some -;; problems with stacked expansion. -;; -(defun yas--make-move-field-protection-overlays (snippet field) - "Place protection overlays surrounding SNIPPET's FIELD. - -Move the overlays, or create them if they do not exit." - (let ((start (yas--field-start field)) - (end (yas--field-end field))) - ;; First check if the (1+ end) is contained in the buffer, - ;; otherwise we'll have to do a bit of cheating and silently - ;; insert a newline. the `(1+ (buffer-size))' should prevent this - ;; when using stacked expansion - ;; - (when (< (buffer-size) end) - (save-excursion - (yas--inhibit-overlay-hooks - (goto-char (point-max)) - (newline)))) - ;; go on to normal overlay creation/moving - ;; - (cond ((and yas--field-protection-overlays - (every #'overlay-buffer yas--field-protection-overlays)) - (move-overlay (first yas--field-protection-overlays) (1- start) start) - (move-overlay (second yas--field-protection-overlays) end (1+ end))) - (t - (setq yas--field-protection-overlays - (list (make-overlay (1- start) start nil t nil) - (make-overlay end (1+ end) nil t nil))) - (dolist (ov yas--field-protection-overlays) - (overlay-put ov 'face 'yas--field-debug-face) - (overlay-put ov 'yas--snippet snippet) - ;; (overlay-put ov 'evaporate t) - (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification))))))) - -(defvar yas--protection-violation nil - "When non-nil, signals attempts to erronesly exit or modify the snippet. - -Functions in the `post-command-hook', for example -`yas--post-command-handler' can check it and reset its value to -nil. The variables value is the point where the violation -originated") - -(defun yas--on-protection-overlay-modification (overlay after? beg end &optional length) - "Signals a snippet violation, then issues error. - -The error should be ignored in `debug-ignored-errors'" - (unless yas--inhibit-overlay-hooks - (cond ((not (or after? - (yas--undo-in-progress))) - (setq yas--protection-violation (point)) - (error "Exit the snippet first!"))))) - -(add-to-list 'debug-ignored-errors "^Exit the snippet first!$") - - -;; Snippet expansion and "stacked" expansion: -;; -;; Stacked expansion is when you try to expand a snippet when already -;; inside a snippet expansion. -;; -;; The parent snippet does not run its fields modification hooks -;; (`yas--on-field-overlay-modification' and -;; `yas--on-protection-overlay-modification') while the child snippet -;; is active. This means, among other things, that the mirrors of the -;; parent snippet are not updated, this only happening when one exits -;; the child snippet. -;; -;; Unfortunately, this also puts some ugly (and not fully-tested) -;; bits of code in `yas-expand-snippet' and -;; `yas--commit-snippet'. I've tried to mark them with "stacked -;; expansion:". -;; -;; This was thought to be safer in in an undo/redo perpective, but -;; maybe the correct implementation is to make the globals -;; `yas--active-field-overlay' and `yas--field-protection-overlays' be -;; snippet-local and be active even while the child snippet is -;; running. This would mean a lot of overlay modification hooks -;; running, but if managed correctly (including overlay priorities) -;; they should account for all situations... -;; -(defun yas-expand-snippet (content &optional start end expand-env) - "Expand snippet CONTENT at current point. - -Text between START and END will be deleted before inserting -template. EXPAND-ENV is are let-style variable to value bindings -considered when expanding the snippet." - (run-hooks 'yas-before-expand-snippet-hook) - - ;; If a region is active, set `yas-selected-text' - (setq yas-selected-text - (when (region-active-p) - (prog1 (buffer-substring-no-properties (region-beginning) - (region-end)) - (unless start (setq start (region-beginning)) - (unless end (setq end (region-end))))))) - - (when start - (goto-char start)) - - ;; - (let ((to-delete (and start end (buffer-substring-no-properties start end))) - (start (or start (point))) - (end (or end (point))) - snippet) - (setq yas--indent-original-column (current-column)) - ;; Delete the region to delete, this *does* get undo-recorded. - ;; - (when (and to-delete - (> end start)) - (delete-region start end)) - - (cond ((listp content) - ;; x) This is a snippet-command - ;; - (yas--eval-lisp-no-saves content)) - (t - ;; x) This is a snippet-snippet :-) - ;; - ;; Narrow the region down to the content, shoosh the - ;; `buffer-undo-list', and create the snippet, the new - ;; snippet updates its mirrors once, so we are left with - ;; some plain text. The undo action for deleting this - ;; 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 - (insert content) - (yas--snippet-create (point-min) (point-max)))) - (insert content) - (yas--snippet-create (point-min) (point-max))))))) - - ;; stacked-expansion: This checks for stacked expansion, save the - ;; `yas--previous-active-field' and advance its boudary. - ;; - (let ((existing-field (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field)))) - (when existing-field - (setf (yas--snippet-previous-active-field snippet) existing-field) - (yas--advance-end-maybe existing-field (overlay-end yas--active-field-overlay)))) - - ;; Exit the snippet immediately if no fields - ;; - (unless (yas--snippet-fields snippet) - (yas-exit-snippet snippet)) - - ;; Push two undo actions: the deletion of the inserted contents of - ;; the new snippet (without the "key") followed by an apply of - ;; `yas--take-care-of-redo' on the newly inserted snippet boundaries - ;; - ;; A small exception, if `yas-also-auto-indent-first-line' - ;; is t and `yas--indent' decides to indent the line to a - ;; point before the actual expansion point, undo would be - ;; messed up. We call the early point "newstart"". case, - ;; and attempt to fix undo. - ;; - (let ((newstart (overlay-start (yas--snippet-control-overlay snippet))) - (end (overlay-end (yas--snippet-control-overlay snippet)))) - (when (< newstart start) - (push (cons (make-string (- start newstart) ? ) newstart) buffer-undo-list)) - (push (cons newstart end) buffer-undo-list) - (push `(apply yas--take-care-of-redo ,start ,end ,snippet) - buffer-undo-list)) - ;; Now, schedule a move to the first field - ;; - (let ((first-field (car (yas--snippet-fields snippet)))) - (when first-field - (sit-for 0) ;; fix issue 125 - (yas--move-to-field snippet first-field))) - (yas--message 3 "snippet expanded.") - t)))) - -(defun yas--take-care-of-redo (beg end snippet) - "Commits SNIPPET, which in turn pushes an undo action for -reviving it. - -Meant to exit in the `buffer-undo-list'." - ;; slightly optimize: this action is only needed for snippets with - ;; at least one field - (when (yas--snippet-fields snippet) - (yas--commit-snippet snippet))) - -(defun yas--snippet-revive (beg end snippet) - "Revives the SNIPPET and creates a control overlay from BEG to -END. - -BEG and END are, we hope, the original snippets boudaries. All -the markers/points exiting existing inside SNIPPET should point -to their correct locations *at the time the snippet is revived*. - -After revival, push the `yas--take-care-of-redo' in the -`buffer-undo-list'" - ;; Reconvert all the points to markers - ;; - (yas--points-to-markers snippet) - ;; When at least one editable field existed in the zombie snippet, - ;; try to revive the whole thing... - ;; - (let ((target-field (or (yas--snippet-active-field snippet) - (car (yas--snippet-fields snippet))))) - (when target-field - (setf (yas--snippet-control-overlay snippet) (yas--make-control-overlay snippet beg end)) - (overlay-put (yas--snippet-control-overlay snippet) 'yas--snippet snippet) - - (yas--move-to-field snippet target-field) - - (push `(apply yas--take-care-of-redo ,beg ,end ,snippet) - buffer-undo-list)))) - -(defun yas--snippet-create (begin end) - "Creates a snippet from an template inserted between BEGIN and END. - -Returns the newly created snippet." - (let ((snippet (yas--make-snippet))) - (goto-char begin) - (yas--snippet-parse-create 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))) - - ;; Move to end - (goto-char (point-max)) - - snippet)) - - -;;; Apropos adjacencies and "fom's": -;; -;; Once the $-constructs bits like "$n" and "${:n" are deleted in the -;; recently expanded snippet, we might actually have many fields, -;; mirrors (and the snippet exit) in the very same position in the -;; buffer. Therefore we need to single-link the -;; fields-or-mirrors-or-exit (which I have abbreviated to "fom") -;; according to their original positions in the buffer. -;; -;; Then we have operation `yas--advance-end-maybe' and -;; `yas--advance-start-maybe', which conditionally push the starts and -;; ends of these foms down the chain. -;; -;; This allows for like the printf with the magic ",": -;; -;; printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")} \ -;; $2${1:$(if (string-match "%" text) "\);" "")}$0 -;; -(defun yas--fom-start (fom) - (cond ((yas--field-p fom) - (yas--field-start fom)) - ((yas--mirror-p fom) - (yas--mirror-start fom)) - (t - (yas--exit-marker fom)))) - -(defun yas--fom-end (fom) - (cond ((yas--field-p fom) - (yas--field-end fom)) - ((yas--mirror-p fom) - (yas--mirror-end fom)) - (t - (yas--exit-marker fom)))) - -(defun yas--fom-next (fom) - (cond ((yas--field-p fom) - (yas--field-next fom)) - ((yas--mirror-p fom) - (yas--mirror-next fom)) - (t - (yas--exit-next fom)))) - -(defun yas--fom-parent-field (fom) - (cond ((yas--field-p fom) - (yas--field-parent-field fom)) - ((yas--mirror-p fom) - (yas--mirror-parent-field fom)) - (t - nil))) - -(defun yas--calculate-adjacencies (snippet) - "Calculate adjacencies for fields or mirrors of SNIPPET. - -This is according to their relative positions in the buffer, and -has to be called before the $-constructs are deleted." - (flet ((yas--fom-set-next-fom (fom nextfom) - (cond ((yas--field-p fom) - (setf (yas--field-next fom) nextfom)) - ((yas--mirror-p fom) - (setf (yas--mirror-next fom) nextfom)) - (t - (setf (yas--exit-next fom) nextfom)))) - (yas--compare-fom-begs (fom1 fom2) - (if (= (yas--fom-start fom2) (yas--fom-start fom1)) - (yas--mirror-p fom2) - (>= (yas--fom-start fom2) (yas--fom-start fom1)))) - (yas--link-foms (fom1 fom2) - (yas--fom-set-next-fom fom1 fom2))) - ;; make some yas--field, yas--mirror and yas--exit soup - (let ((soup)) - (when (yas--snippet-exit snippet) - (push (yas--snippet-exit snippet) soup)) - (dolist (field (yas--snippet-fields snippet)) - (push field soup) - (dolist (mirror (yas--field-mirrors field)) - (push mirror soup))) - (setq soup - (sort soup - #'yas--compare-fom-begs)) - (when soup - (reduce #'yas--link-foms soup))))) - -(defun yas--calculate-mirrors-in-fields (snippet mirror) - "Attempt to assign a parent field of SNIPPET to the mirror MIRROR. - -Use the tighest containing field if more than one field contains -the mirror. Intended to be called *before* the dollar-regions are -deleted." - (let ((min (point-min)) - (max (point-max))) - (dolist (field (yas--snippet-fields snippet)) - (when (and (<= (yas--field-start field) (yas--mirror-start mirror)) - (<= (yas--mirror-end mirror) (yas--field-end field)) - (< min (yas--field-start field)) - (< (yas--field-end field) max)) - (setq min (yas--field-start field) - max (yas--field-end field)) - (setf (yas--mirror-parent-field mirror) field))))) - -(defun yas--advance-end-maybe (fom newend) - "Maybe advance FOM's end to NEWEND if it needs it. - -If it does, also: - -* call `yas--advance-start-maybe' on FOM's next fom. - -* in case FOM is field call `yas--advance-end-maybe' on its parent - field - -Also, if FOM is an exit-marker, always call -`yas--advance-start-maybe' on its next fom. This is beacuse -exit-marker have identical start and end markers. - -" - (cond ((and fom (< (yas--fom-end fom) newend)) - (set-marker (yas--fom-end fom) newend) - (yas--advance-start-maybe (yas--fom-next fom) newend) - (yas--advance-end-of-parents-maybe (yas--fom-parent-field fom) newend)) - ((yas--exit-p fom) - (yas--advance-start-maybe (yas--fom-next fom) newend)))) - -(defun yas--advance-start-maybe (fom newstart) - "Maybe advance FOM's start to NEWSTART if it needs it. - -If it does, also call `yas--advance-end-maybe' on FOM." - (when (and fom (< (yas--fom-start fom) newstart)) - (set-marker (yas--fom-start fom) newstart) - (yas--advance-end-maybe fom newstart))) - -(defun yas--advance-end-of-parents-maybe (field newend) - "Like `yas--advance-end-maybe' but for parent fields. - -Only works for fields and doesn't care about the start of the -next FOM. Works its way up recursively for parents of parents." - (when (and field - (< (yas--field-end field) newend)) - (set-marker (yas--field-end field) newend) - (yas--advance-end-of-parents-maybe (yas--field-parent-field field) newend))) - -(defvar yas--dollar-regions nil - "When expanding the snippet the \"parse-create\" functions add - cons cells to this var") - -(defun yas--snippet-parse-create (snippet) - "Parse a recently inserted snippet template, creating all -necessary fields, mirrors and exit points. - -Meant to be called in a narrowed buffer, does various passes" - (let ((parse-start (point))) - ;; Reset the yas--dollar-regions - ;; - (setq yas--dollar-regions nil) - ;; protect escaped quote, backquotes and backslashes - ;; - (yas--protect-escapes nil `(?\\ ?` ?')) - ;; replace all backquoted expressions - ;; - (goto-char parse-start) - (yas--replace-backquotes) - ;; protect escapes again since previous steps might have generated - ;; more characters needing escaping - ;; - (goto-char parse-start) - (yas--protect-escapes) - ;; parse fields with {} - ;; - (goto-char parse-start) - (yas--field-parse-create snippet) - ;; parse simple mirrors and fields - ;; - (goto-char parse-start) - (yas--simple-mirror-parse-create snippet) - ;; parse mirror transforms - ;; - (goto-char parse-start) - (yas--transform-mirror-parse-create snippet) - ;; calculate adjacencies of fields and mirrors - ;; - (yas--calculate-adjacencies snippet) - ;; Delete $-constructs - ;; - (yas--delete-regions yas--dollar-regions) - ;; restore escapes - ;; - (goto-char parse-start) - (yas--restore-escapes) - ;; update mirrors for the first time - ;; - (yas--update-mirrors snippet) - ;; indent the best we can - ;; - (goto-char parse-start) - (yas--indent snippet))) - -(defun yas--indent-according-to-mode (snippet-markers) - "Indent current line according to mode, preserving -SNIPPET-MARKERS." - ;;; Apropos indenting problems.... - ;; - ;; `indent-according-to-mode' uses whatever `indent-line-function' - ;; is available. Some implementations of these functions delete text - ;; before they insert. If there happens to be a marker just after - ;; the text being deleted, the insertion actually happens after the - ;; marker, which misplaces it. - ;; - ;; This would also happen if we had used overlays with the - ;; `front-advance' property set to nil. - ;; - ;; This is why I have these `trouble-markers', they are the ones at - ;; they are the ones at the first non-whitespace char at the line - ;; (i.e. at `yas--real-line-beginning'. After indentation takes place - ;; we should be at the correct to restore them to. All other - ;; non-trouble-markers have been *pushed* and don't need special - ;; attention. - ;; - (goto-char (yas--real-line-beginning)) - (let ((trouble-markers (remove-if-not #'(lambda (marker) - (= marker (point))) - snippet-markers))) - (save-restriction - (widen) - (condition-case err - (indent-according-to-mode) - (error (yas--message 3 "Warning: `yas--indent-according-to-mode' having problems running %s" indent-line-function) - nil))) - (mapc #'(lambda (marker) - (set-marker marker (point))) - trouble-markers))) - -(defvar yas--indent-original-column nil) -(defun yas--indent (snippet) - (let ((snippet-markers (yas--collect-snippet-markers snippet))) - ;; Look for those $> - (save-excursion - (while (re-search-forward "$>" nil t) - (delete-region (match-beginning 0) (match-end 0)) - (when (not (eq yas-indent-line 'auto)) - (yas--indent-according-to-mode snippet-markers)))) - ;; Now do stuff for 'fixed and 'auto - (save-excursion - (cond ((eq yas-indent-line 'fixed) - (while (and (zerop (forward-line)) - (zerop (current-column))) - (indent-to-column yas--indent-original-column))) - ((eq yas-indent-line 'auto) - (let ((end (set-marker (make-marker) (point-max))) - (indent-first-line-p yas-also-auto-indent-first-line)) - (while (and (zerop (if indent-first-line-p - (prog1 - (forward-line 0) - (setq indent-first-line-p nil)) - (forward-line 1))) - (not (eobp)) - (<= (point) end)) - (yas--indent-according-to-mode snippet-markers)))) - (t - nil))))) - -(defun yas--collect-snippet-markers (snippet) - "Make a list of all the markers used by SNIPPET." - (let (markers) - (dolist (field (yas--snippet-fields snippet)) - (push (yas--field-start field) markers) - (push (yas--field-end field) markers) - (dolist (mirror (yas--field-mirrors field)) - (push (yas--mirror-start mirror) markers) - (push (yas--mirror-end mirror) markers))) - (let ((snippet-exit (yas--snippet-exit snippet))) - (when (and snippet-exit - (marker-buffer (yas--exit-marker snippet-exit))) - (push (yas--exit-marker snippet-exit) markers))) - markers)) - -(defun yas--real-line-beginning () - (let ((c (char-after (line-beginning-position))) - (n (line-beginning-position))) - (while (or (eql c ?\ ) - (eql c ?\t)) - (incf n) - (setq c (char-after n))) - n)) - -(defun yas--escape-string (escaped) - (concat "YASESCAPE" (format "%d" escaped) "PROTECTGUARD")) - -(defun yas--protect-escapes (&optional text escaped) - "Protect all escaped characters with their numeric ASCII value. - -With optional string TEXT do it in string instead of buffer." - (let ((changed-text text) - (text-provided-p text)) - (mapc #'(lambda (escaped) - (setq changed-text - (yas--replace-all (concat "\\" (char-to-string escaped)) - (yas--escape-string escaped) - (when text-provided-p changed-text)))) - (or escaped yas--escaped-characters)) - changed-text)) - -(defun yas--restore-escapes (&optional text escaped) - "Restore all escaped characters from their numeric ASCII value. - -With optional string TEXT do it in string instead of the buffer." - (let ((changed-text text) - (text-provided-p text)) - (mapc #'(lambda (escaped) - (setq changed-text - (yas--replace-all (yas--escape-string escaped) - (char-to-string escaped) - (when text-provided-p changed-text)))) - (or escaped yas--escaped-characters)) - changed-text)) - -(defun yas--replace-backquotes () - "Replace all the \"`(lisp-expression)`\"-style expression - with their evaluated value" - (while (re-search-forward yas--backquote-lisp-expression-regexp nil t) - (let ((current-string (match-string 1)) transformed) - (delete-region (match-beginning 0) (match-end 0)) - (setq transformed (yas--eval-lisp (yas--read-lisp (yas--restore-escapes current-string)))) - (goto-char (match-beginning 0)) - (when transformed (insert transformed))))) - -(defun yas--scan-sexps (from count) - (condition-case err - (with-syntax-table (standard-syntax-table) - (scan-sexps from count)) - (error - nil))) - -(defun yas--make-marker (pos) - "Create a marker at POS with `nil' `marker-insertion-type'" - (let ((marker (set-marker (make-marker) pos))) - (set-marker-insertion-type marker nil) - marker)) - -(defun yas--field-parse-create (snippet &optional parent-field) - "Parse most field expressions, except for the simple one \"$n\". - -The following count as a field: - -* \"${n: text}\", for a numbered field with default text, as long as N is not 0; - -* \"${n: text$(expression)}, the same with a lisp expression; - this is caught with the curiously named `yas--multi-dollar-lisp-expression-regexp' - -* the same as above but unnumbered, (no N:) and number is calculated automatically. - -When multiple expressions are found, only the last one counts." - ;; - (save-excursion - (while (re-search-forward yas--field-regexp nil t) - (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) - (number (and (match-string-no-properties 1) - (string-to-number (match-string-no-properties 1)))) - (brand-new-field (and real-match-end-0 - ;; break if on "$(" immediately - ;; after the ":", this will be - ;; caught as a mirror with - ;; transform later. - (not (save-match-data - (eq (string-match "$[ \t\n]*(" - (match-string-no-properties 2)) 0))) - ;; allow ${0: some exit text} - ;; (not (and number (zerop number))) - (yas--make-field number - (yas--make-marker (match-beginning 2)) - (yas--make-marker (1- real-match-end-0)) - parent-field)))) - (when brand-new-field - (goto-char real-match-end-0) - (push (cons (1- real-match-end-0) real-match-end-0) - yas--dollar-regions) - (push (cons (match-beginning 0) (match-beginning 2)) - yas--dollar-regions) - (push brand-new-field (yas--snippet-fields snippet)) - (save-excursion - (save-restriction - (narrow-to-region (yas--field-start brand-new-field) (yas--field-end brand-new-field)) - (goto-char (point-min)) - (yas--field-parse-create snippet brand-new-field))))))) - ;; if we entered from a parent field, now search for the - ;; `yas--multi-dollar-lisp-expression-regexp'. THis is used for - ;; primary field transformations - ;; - (when parent-field - (save-excursion - (while (re-search-forward yas--multi-dollar-lisp-expression-regexp nil t) - (let* ((real-match-end-1 (yas--scan-sexps (match-beginning 1) 1))) - ;; commit the primary field transformation if: - ;; - ;; 1. we don't find it in yas--dollar-regions (a subnested - ;; field) might have already caught it. - ;; - ;; 2. we really make sure we have either two '$' or some - ;; text and a '$' after the colon ':'. This is a FIXME: work - ;; my regular expressions and end these ugly hacks. - ;; - (when (and real-match-end-1 - (not (member (cons (match-beginning 0) - real-match-end-1) - yas--dollar-regions)) - (not (eq ?: - (char-before (1- (match-beginning 1)))))) - (let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) - real-match-end-1))) - (setf (yas--field-transform parent-field) - (yas--read-lisp (yas--restore-escapes lisp-expression-string)))) - (push (cons (match-beginning 0) real-match-end-1) - yas--dollar-regions))))))) - -(defun yas--transform-mirror-parse-create (snippet) - "Parse the \"${n:$(lisp-expression)}\" mirror transformations." - (while (re-search-forward yas--transform-mirror-regexp nil t) - (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) - (number (string-to-number (match-string-no-properties 1))) - (field (and number - (not (zerop number)) - (yas--snippet-find-field snippet number))) - (brand-new-mirror - (and real-match-end-0 - field - (yas--make-mirror (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - (yas--read-lisp - (yas--restore-escapes - (buffer-substring-no-properties (match-beginning 2) - (1- real-match-end-0)))))))) - (when brand-new-mirror - (push brand-new-mirror - (yas--field-mirrors field)) - (yas--calculate-mirrors-in-fields snippet brand-new-mirror) - (push (cons (match-beginning 0) real-match-end-0) yas--dollar-regions))))) - -(defun yas--simple-mirror-parse-create (snippet) - "Parse the simple \"$n\" fields/mirrors/exitmarkers." - (while (re-search-forward yas--simple-mirror-regexp nil t) - (let ((number (string-to-number (match-string-no-properties 1)))) - (cond ((zerop number) - - (setf (yas--snippet-exit snippet) - (yas--make-exit (yas--make-marker (match-end 0)))) - (save-excursion - (goto-char (match-beginning 0)) - (when yas-wrap-around-region - (cond (yas-selected-text - (insert yas-selected-text)) - ((and (eq yas-wrap-around-region 'cua) - cua-mode - (get-register ?0)) - (insert (prog1 (get-register ?0) - (set-register ?0 nil)))))) - (push (cons (point) (yas--exit-marker (yas--snippet-exit snippet))) - yas--dollar-regions))) - (t - (let ((field (yas--snippet-find-field snippet number))) - (if field - (let ((brand-new-mirror (yas--make-mirror - (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - nil))) - (push brand-new-mirror - (yas--field-mirrors field)) - (yas--calculate-mirrors-in-fields snippet brand-new-mirror)) - (push (yas--make-field number - (yas--make-marker (match-beginning 0)) - (yas--make-marker (match-beginning 0)) - nil) - (yas--snippet-fields snippet)))) - (push (cons (match-beginning 0) (match-end 0)) - yas--dollar-regions)))))) - -(defun yas--delete-regions (regions) - "Sort disjuct REGIONS by start point, then delete from the back." - (mapc #'(lambda (reg) - (delete-region (car reg) (cdr reg))) - (sort regions - #'(lambda (r1 r2) - (>= (car r1) (car r2)))))) - -(defun yas--update-mirrors (snippet) - "Updates all the mirrors of SNIPPET." - (save-excursion - (let* ((fields (copy-list (yas--snippet-fields snippet))) - (field (car fields))) - (while field - (dolist (mirror (yas--field-mirrors field)) - (let ((mirror-parent-field (yas--mirror-parent-field mirror))) - ;; updatte this mirror - ;; - (yas--mirror-update-display mirror field) - ;; for mirrors-in-fields: schedule a possible - ;; parent field for reupdting later on - ;; - (when mirror-parent-field - (add-to-list 'fields mirror-parent-field 'append #'eq)) - ;; `yas--place-overlays' is needed if the active field and - ;; protected overlays have been changed because of insertions - ;; in `yas--mirror-update-display' - ;; - (when (eq field (yas--snippet-active-field snippet)) - (yas--place-overlays snippet field)))) - (setq fields (cdr fields)) - (setq field (car fields)))))) - -(defun yas--mirror-update-display (mirror field) - "Update MIRROR according to FIELD (and mirror transform)." - - (let* ((mirror-parent-field (yas--mirror-parent-field mirror)) - (reflection (and (not (and mirror-parent-field - (yas--field-modified-p mirror-parent-field))) - (or (yas--apply-transform mirror field 'empty-on-nil) - (yas--field-text-for-display field))))) - (when (and reflection - (not (string= reflection (buffer-substring-no-properties (yas--mirror-start mirror) - (yas--mirror-end mirror))))) - (goto-char (yas--mirror-start mirror)) - (yas--inhibit-overlay-hooks - (insert reflection)) - (if (> (yas--mirror-end mirror) (point)) - (delete-region (point) (yas--mirror-end mirror)) - (set-marker (yas--mirror-end mirror) (point)) - (yas--advance-start-maybe (yas--mirror-next mirror) (point)) - ;; super-special advance - (yas--advance-end-of-parents-maybe mirror-parent-field (point)))))) - -(defun yas--field-update-display (field snippet) - "Much like `yas--mirror-update-display', but for fields" - (when (yas--field-transform field) - (let ((transformed (and (not (eq (yas--field-number field) 0)) - (yas--apply-transform field field))) - (point (point))) - (when (and transformed - (not (string= transformed (buffer-substring-no-properties (yas--field-start field) - (yas--field-end field))))) - (setf (yas--field-modified-p field) t) - (goto-char (yas--field-start field)) - (yas--inhibit-overlay-hooks - (insert transformed) - (if (> (yas--field-end field) (point)) - (delete-region (point) (yas--field-end field)) - (set-marker (yas--field-end field) (point)) - (yas--advance-start-maybe (yas--field-next field) (point))) - t))))) - - -;;; Post-command hook: - -(defun yas--post-command-handler () - "Handles various yasnippet conditions after each command." - (cond (yas--protection-violation - (goto-char yas--protection-violation) - (setq yas--protection-violation nil)) - ((eq 'undo this-command) - ;; - ;; After undo revival the correct field is sometimes not - ;; restored correctly, this condition handles that - ;; - (let* ((snippet (car (yas--snippets-at-point))) - (target-field (and snippet - (find-if-not #'(lambda (field) - (yas--field-probably-deleted-p snippet field)) - (remove nil - (cons (yas--snippet-active-field snippet) - (yas--snippet-fields snippet))))))) - (when target-field - (yas--move-to-field snippet target-field)))) - ((not (yas--undo-in-progress)) - ;; When not in an undo, check if we must commit the snippet - ;; (user exited it). - (yas--check-commit-snippet)))) - -;;; Fancy docs: -;; -;; The docstrings for some functions are generated dynamically -;; depending on the context. -;; -(put 'yas-expand 'function-documentation - '(yas--expand-from-trigger-key-doc)) -(defun yas--expand-from-trigger-key-doc () - "A doc synthethizer for `yas--expand-from-trigger-key-doc'." - (let ((fallback-description - (cond ((eq yas-fallback-behavior 'call-other-command) - (let* ((yas-minor-mode nil) - (fallback (key-binding (read-kbd-macro yas-trigger-key)))) - (or (and fallback - (format " call command `%s'." (pp-to-string fallback))) - " do nothing."))) - ((eq yas-fallback-behavior 'return-nil) - ", do nothing.") - (t - ", defer to `yas--fallback-behaviour' :-)")))) - (concat "Expand a snippet before point. If no snippet -expansion is possible," - fallback-description - "\n\nOptional argument FIELD is for non-interactive use and is an -object satisfying `yas--field-p' to restrict the expansion to."))) - -(put 'yas-expand-from-keymap 'function-documentation '(yas--expand-from-keymap-doc)) -(defun yas--expand-from-keymap-doc () - "A doc synthethizer for `yas--expand-from-keymap-doc'." - (add-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce) - (concat "Expand/run snippets from keymaps, possibly falling back to original binding.\n" - (when (eq this-command 'describe-key) - (let* ((vec (this-single-command-keys)) - (templates (mapcan #'(lambda (table) - (yas--fetch table vec)) - (yas--get-snippet-tables))) - (yas--direct-keymaps nil) - (fallback (key-binding vec))) - (concat "In this case, " - (when templates - (concat "these snippets are bound to this key:\n" - (yas--template-pretty-list templates) - "\n\nIf none of these expands, ")) - (or (and fallback - (format "fallback `%s' will be called." (pp-to-string fallback))) - "no fallback keybinding is called.")))))) - -(defun yas--template-pretty-list (templates) - (let ((acc) - (yas-buffer-local-condition 'always)) - (dolist (plate templates) - (setq acc (concat acc "\n*) " - (propertize (concat "\\\\snippet `" (car plate) "'") - 'yasnippet (cdr plate))))) - acc)) - -(define-button-type 'help-snippet-def - :supertype 'help-xref - 'help-function (lambda (template) (yas--visit-snippet-file-1 template)) - 'help-echo (purecopy "mouse-2, RET: find snippets's definition")) - -(defun yas--snippet-description-finish-runonce () - "Final adjustments for the help buffer when snippets are concerned." - (yas--create-snippet-xrefs) - (remove-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce)) - -(defun yas--create-snippet-xrefs () - (save-excursion - (goto-char (point-min)) - (while (search-forward-regexp "\\\\\\\\snippet[ \s\t]+`\\([^']+\\)'" nil t) - (let ((template (get-text-property (match-beginning 1) - 'yasnippet))) - (when template - (help-xref-button 1 'help-snippet-def template) - (kill-region (match-end 1) (match-end 0)) - (kill-region (match-beginning 0) (match-beginning 1))))))) - -(defun yas--expand-uuid (mode-symbol uuid &optional start end expand-env) - "Expand a snippet registered in MODE-SYMBOL's table with UUID. - -Remaining args as in `yas-expand-snippet'." - (let* ((table (gethash mode-symbol yas--tables)) - (yas--current-template (and table - (gethash uuid (yas--table-uuidhash table))))) - (when yas--current-template - (yas-expand-snippet (yas--template-content yas--current-template))))) - -;;; Utils - -(defvar yas-verbosity 4 - "Log level for `yas--message' 4 means trace most anything, 0 means nothing.") - -(defun yas--message (level message &rest args) - (when (> yas-verbosity level) - (message (apply #'yas--format message args)))) - -(defun yas--format (format-control &rest format-args) - (apply #'format (concat "[yas] " format-control) format-args)) - - -;;; Some hacks: -;; -;; The functions -;; -;; `locate-dominating-file' -;; `region-active-p' -;; -;; added for compatibility in emacsen < 23 -(unless (>= emacs-major-version 23) - (unless (fboundp 'region-active-p) - (defun region-active-p () (and transient-mark-mode mark-active))) - - (unless (fboundp 'locate-dominating-file) - (defvar locate-dominating-stop-dir-regexp - "\\`\\(?:[\\/][\\/][^\\/]+[\\/]\\|/\\(?:net\\|afs\\|\\.\\.\\.\\)/\\)\\'" - "Regexp of directory names which stop the search in `locate-dominating-file'. -Any directory whose name matches this regexp will be treated like -a kind of root directory by `locate-dominating-file' which will stop its search -when it bumps into it. -The default regexp prevents fruitless and time-consuming attempts to find -special files in directories in which filenames are interpreted as hostnames, -or mount points potentially requiring authentication as a different user.") - - (defun locate-dominating-file (file name) - "Look up the directory hierarchy from FILE for a file named NAME. -Stop at the first parent directory containing a file NAME, -and return the directory. Return nil if not found." - ;; We used to use the above locate-dominating-files code, but the - ;; directory-files call is very costly, so we're much better off doing - ;; multiple calls using the code in here. - ;; - ;; Represent /home/luser/foo as ~/foo so that we don't try to look for - ;; `name' in /home or in /. - (setq file (abbreviate-file-name file)) - (let ((root nil) - (prev-file file) - ;; `user' is not initialized outside the loop because - ;; `file' may not exist, so we may have to walk up part of the - ;; hierarchy before we find the "initial UUID". - (user nil) - try) - (while (not (or root - (null file) - ;; FIXME: Disabled this heuristic because it is sometimes - ;; inappropriate. - ;; As a heuristic, we stop looking up the hierarchy of - ;; directories as soon as we find a directory belonging - ;; to another user. This should save us from looking in - ;; things like /net and /afs. This assumes that all the - ;; files inside a project belong to the same user. - ;; (let ((prev-user user)) - ;; (setq user (nth 2 (file-attributes file))) - ;; (and prev-user (not (equal user prev-user)))) - (string-match locate-dominating-stop-dir-regexp file))) - (setq try (file-exists-p (expand-file-name name file))) - (cond (try (setq root file)) - ((equal file (setq prev-file file - file (file-name-directory - (directory-file-name file)))) - (setq file nil)))) - root)))) - -;; `c-neutralize-syntax-in-CPP` sometimes fires "End of Buffer" error -;; (when it execute forward-char) and interrupt the after change -;; hook. Thus prevent the insert-behind hook of yasnippet to be -;; invoked. Here's a way to reproduce it: - -;; # open a *new* Emacs. -;; # load yasnippet. -;; # open a *new* .cpp file. -;; # input "inc" and press TAB to expand the snippet. -;; # select the `#include <...>` snippet. -;; # type inside `<>` - -(defadvice c-neutralize-syntax-in-CPP - (around yas--mp/c-neutralize-syntax-in-CPP activate) - "Adviced `c-neutralize-syntax-in-CPP' to properly -handle the end-of-buffer error fired in it by calling -`forward-char' at the end of buffer." - (condition-case err - ad-do-it - (error (message (error-message-string err))))) - -;; disable c-electric-* serial command in YAS fields -(add-hook 'c-mode-common-hook - '(lambda () - (dolist (k '(":" ">" ";" "<" "{" "}")) - (define-key (symbol-value (make-local-variable 'yas-keymap)) - k 'self-insert-command)))) - -;;; Backward compatibility to to yasnippet <= 0.7 -(defvar yas--exported-syms '(;; `defcustom's - ;; - yas-snippet-dirs - yas-prompt-functions - yas-indent-line - yas-also-auto-indent-first-line - yas-snippet-revival - yas-trigger-key - yas-next-field-key - yas-prev-field-key - yas-skip-and-clear-key - yas-triggers-in-field - yas-fallback-behavior - yas-choose-keys-first - yas-choose-tables-first - yas-use-menu - yas-trigger-symbol - yas-wrap-around-region - yas-good-grace - yas-visit-from-menu - yas-expand-only-for-last-commands - yas-field-highlight-face - - ;; these vars can be customized as well - ;; - yas-keymap - yas-verbosity - yas-extra-modes - yas-key-syntaxes - yas-after-exit-snippet-hook - yas-before-expand-snippet-hook - yas-buffer-local-condition - - ;; prompting functions - ;; - yas-x-prompt - yas-ido-prompt - yas-no-prompt - yas-completing-prompt - yas-dropdown-prompt - - ;; interactive functions - ;; - yas-expand - yas-minor-mode - yas-global-mode - yas-direct-keymaps-reload - yas-minor-mode-on - yas-load-directory - yas-reload-all - yas-compile-directory - yas-recompile-all - yas-about - yas-expand-from-trigger-key - yas-expand-from-keymap - yas-insert-snippet - yas-visit-snippet-file - yas-new-snippet - yas-load-snippet-buffer - yas-tryout-snippet - yas-describe-tables - yas-next-field-or-maybe-expand - yas-next-field - yas-prev-field - yas-abort-snippet - yas-exit-snippet - yas-exit-all-snippets - yas-skip-and-clear-or-delete-char - - ;; symbols that I "exported" for use - ;; in snippets and hookage - ;; - yas-expand-snippet - yas-define-snippets - yas-define-menu - yas-snippet-beg - yas-snippet-end - yas-modified-p - yas-moving-away-p - yas-text - yas-substr - yas-choose-value - yas-key-to-value - yas-throw - yas-verify-value - yas-field-value - yas-text - yas-selected-text - yas-default-from-field - yas-inside-string - yas-unimplemented - yas-define-condition-cache - yas-hippie-try-expand - - ;; debug definitions - ;; yas-debug-snippet-vars - ;; yas-exterminate-package - ;; yas-debug-test - - ;; testing definitions - ;; yas-should-expand - ;; yas-should-not-expand - ;; yas-mock-insert - ;; yas-make-file-or-dirs - ;; yas-variables - ;; yas-saving-variables - ;; yas-call-with-snippet-dirs - ;; yas-with-snippet-dirs -)) - -(dolist (sym yas--exported-syms) - (let ((backported (intern (replace-regexp-in-string "^yas-" "yas/" (symbol-name sym))))) - (when (boundp sym) - (make-obsolete-variable backported sym "yasnippet 0.8") - (defvaralias backported sym)) - (when (fboundp sym) - (make-obsolete backported sym "yasnippet 0.8") - (defalias backported sym)))) - - -(provide 'yasnippet) - -;;; yasnippet.el ends here -;; Local Variables: -;; coding: utf-8 -;; End:
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1.signed @@ -0,0 +1,1 @@ +Good signature from 474F05837FBDEF9B GNU ELPA Signing Agent <elpasign@elpa.gnu.org> (trust undefined) created at 2016-04-04T05:05:02-0400 using DSA \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/.gitmodules @@ -0,0 +1,7 @@ +[submodule "snippets"] + path = snippets + url = https://github.com/AndreaCrotti/yasnippet-snippets.git + branch = master +[submodule "yasmate"] + path = yasmate + url = https://github.com/capitaomorte/yasmate.git
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/.travis.yml @@ -0,0 +1,24 @@ +language: emacs + +env: + - "EMACS=emacs23" + - "EMACS=emacs24" + +install: + - if [ "$EMACS" = "emacs23" ]; then + sudo apt-get -qq update && + sudo apt-get -qq -f install && + sudo apt-get -qq install emacs23-nox && + curl -LO https://raw.githubusercontent.com/ohler/ert/c619b56c5bc6a866e33787489545b87d79973205/lisp/emacs-lisp/ert.el && + curl -LO https://raw.githubusercontent.com/ohler/ert/c619b56c5bc6a866e33787489545b87d79973205/lisp/emacs-lisp/ert-x.el && + curl -Lo cl-lib.el http://elpa.gnu.org/packages/cl-lib-0.5.el; + fi + - if [ "$EMACS" = "emacs24" ]; then + sudo add-apt-repository -y ppa:cassou/emacs && + sudo apt-get -qq update && + sudo apt-get -qq -f install && + sudo apt-get -qq install emacs24-nox; + fi + +script: + - rake compile; rake tests
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Submitting Bug Reports + +Please read [Important note regarding bug reporting][bugnote]. + +# Contributing to Yasnippet + +## Copyright Assignment + +Yasnippet is part of GNU ELPA, so it falls under the same copyright +assignment policy as the rest of Emacs (see "Copyright Assignment" in +https://www.gnu.org/software/emacs/CONTRIBUTE). A copyright assignment +for Emacs also covers Yasnippet. + +## Commit message format + +The commit message format roughly follows Emacs conventions, although +there is no separate Changelog file. + + The commit message's first sentence should be capitalized, no period + + It may be followed by a paragraph with a longer explanation. The + changelog style entry goes at the end of the message. + + * foo.el (a-function): Terse summary of per-function changes. + +For trivial changes, a message consisting of just the changelog entry +(the `* foo.el ...` part) is fine. + +[bugnote]: https://github.com/capitaomorte/yasnippet#important-note-regarding-bug-reporting
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/ChangeLog @@ -0,0 +1,693 @@ +2016-04-03 Noam Postavsky <npostavs@users.sourceforge.net> + + packages/yasnippet: subtree pull from external + + packages/yasnippet/snippets is left untouched in GNU ELPA. The upstream + version uses a submodule pointing to a snippets repo which lives at + https://github.com/AndreaCrotti/yasnippet-snippets.git + +2016-03-07 João Távora <joaotavora@gmail.com> + + Update packages/yasnippet by subtree-merging from its github-based + upstream + + packages/yasnippet/snippets is left untouched in GNU ELPA. The upstream + version uses a submodule pointing to a snippets repo which lives at + https://github.com/AndreaCrotti/yasnippet-snippets.git + + Conflicts: packages/yasnippet/snippets + +2016-01-23 João Távora <joaotavora@gmail.com> + + Fix previous merge bundler in packages/yasnippet/doc dir + +2016-01-21 João Távora <joaotavora@gmail.com> + + Update packages/yasnippet by subtree-merging from its external upstream + + Again, packages/yasnippet/snippets is left untouched in GNU ELPA. The + upstream version uses a submodule pointing to a snippets repo which + lives at https://github.com/AndreaCrotti/yasnippet-snippets.git + + Conflicts: packages/yasnippet/snippets + +2015-03-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * packages/yasnippet/yasnippet-tests.el: Silence byte-compiler. + + (yas-saving-variables, yas-with-snippet-dirs): Move macros before their + use. + (yas--barbaz, yas--foobarbaz): Declare. + (yas--phony-c-mode, yas--test-mode, yas--another-test-mode): Move out of + deftest, so the byte-compiler understands they're defined. + +2015-03-28 João Távora <joaotavora@gmail.com> + + Update packages/yasnippet by merging from its external upstream subtree + + The snippet collection and the "yasmate" tool, realized in the upstream + as git submodules, are removed in the merge result. The "old" snippet + collection is however still in place in packages/yasnippet/snippets. + + Conflicts: + .gitignore + packages/yasnippet/doc/manual.mdown + packages/yasnippet/extras/bundles/html-tmbundle + packages/yasnippet/extras/bundles/rails-tmbundle + packages/yasnippet/extras/bundles/ruby-tmbundle + packages/yasnippet/extras/imported/html-mode/.yas-setup.el + packages/yasnippet/extras/imported/objc-mode/.yas-setup.el + packages/yasnippet/extras/imported/objc-mode/Support/alldefs.txt + packages/yasnippet/extras/imported/rails-mode/.yas-setup.el + packages/yasnippet/extras/imported/ruby-mode/.yas-setup.el + packages/yasnippet/extras/textmate_import.rb + packages/yasnippet/snippets/c++-mode/.yas-parents + packages/yasnippet/snippets/c++-mode/beginend + packages/yasnippet/snippets/c++-mode/class + packages/yasnippet/snippets/c++-mode/ns + packages/yasnippet/snippets/c++-mode/template + packages/yasnippet/snippets/c++-mode/using + packages/yasnippet/snippets/c-mode/.yas-parents + packages/yasnippet/snippets/c-mode/fopen + packages/yasnippet/snippets/c-mode/printf + packages/yasnippet/snippets/cc-mode/.yas-parents + packages/yasnippet/snippets/cc-mode/do + packages/yasnippet/snippets/cc-mode/for + packages/yasnippet/snippets/cc-mode/if + packages/yasnippet/snippets/cc-mode/inc + packages/yasnippet/snippets/cc-mode/inc.1 + packages/yasnippet/snippets/cc-mode/main + packages/yasnippet/snippets/cc-mode/once + packages/yasnippet/snippets/cc-mode/struct + packages/yasnippet/snippets/cperl-mode/.yas-parents + packages/yasnippet/snippets/csharp-mode/.yas-parents + packages/yasnippet/snippets/csharp-mode/attrib + packages/yasnippet/snippets/csharp-mode/attrib.1 + packages/yasnippet/snippets/csharp-mode/attrib.2 + packages/yasnippet/snippets/csharp-mode/class + packages/yasnippet/snippets/csharp-mode/comment + packages/yasnippet/snippets/csharp-mode/comment.1 + packages/yasnippet/snippets/csharp-mode/comment.2 + packages/yasnippet/snippets/csharp-mode/comment.3 + packages/yasnippet/snippets/csharp-mode/method + packages/yasnippet/snippets/csharp-mode/namespace + packages/yasnippet/snippets/csharp-mode/prop + packages/yasnippet/snippets/csharp-mode/region + packages/yasnippet/snippets/csharp-mode/using + packages/yasnippet/snippets/csharp-mode/using.1 + packages/yasnippet/snippets/csharp-mode/using.2 + packages/yasnippet/snippets/css-mode/.yas-parents + packages/yasnippet/snippets/css-mode/bg + packages/yasnippet/snippets/css-mode/bg.1 + packages/yasnippet/snippets/css-mode/bor + packages/yasnippet/snippets/css-mode/cl + packages/yasnippet/snippets/css-mode/disp.block + packages/yasnippet/snippets/css-mode/disp.inline + packages/yasnippet/snippets/css-mode/disp.none + packages/yasnippet/snippets/css-mode/ff + packages/yasnippet/snippets/css-mode/fs + packages/yasnippet/snippets/css-mode/mar.bottom + packages/yasnippet/snippets/css-mode/mar.left + packages/yasnippet/snippets/css-mode/mar.mar + packages/yasnippet/snippets/css-mode/mar.margin + packages/yasnippet/snippets/css-mode/mar.right + packages/yasnippet/snippets/css-mode/mar.top + packages/yasnippet/snippets/css-mode/pad.bottom + packages/yasnippet/snippets/css-mode/pad.left + packages/yasnippet/snippets/css-mode/pad.pad + packages/yasnippet/snippets/css-mode/pad.padding + packages/yasnippet/snippets/css-mode/pad.right + packages/yasnippet/snippets/css-mode/pad.top + packages/yasnippet/snippets/emacs-lisp-mode/.read_me + packages/yasnippet/snippets/emacs-lisp-mode/.yas-parents + packages/yasnippet/snippets/emacs-lisp-mode/add-hook.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/and.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/append.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/apply.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/aref.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/aset.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/assq.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/autoload.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/backward-char.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/beginning-of-line.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/buffer-file-name.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/buffer-substring.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/car.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/cdr.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/concat.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/cond.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/condition-case.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/cons.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/consp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/copy-directory.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/copy-file.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/current-buffer.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/custom-autoload.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/defalias.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/defcustom.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/define-key.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/defsubst.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/defun.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/defvar.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/delete-char.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/delete-directory.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/delete-file.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/delete-region.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/directory-files.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/dolist.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/end-of-line.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/eq.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/equal.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/error.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/expand-file-name.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/f.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/fboundp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/file-name-directory.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/file-name-extension.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/file-relative-name.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/find-file.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/format.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/forward-char.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/forward-line.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/funcall.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/function.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/get.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/global-set-key.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/goto-char.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/if.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/insert-file-contents.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/insert.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/interactive.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/kbd.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/kill-buffer.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/lambda.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/length.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/let.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/line-beginning-position.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/line-end-position.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/list.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/looking-at.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/make-directory.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/make-local-variable.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/mapc.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/mapcar.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/match-beginning.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/match-end.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/match-string.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/memq.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/message.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/not.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/nth.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/null.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/number-to-string.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/or.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/point-max.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/point-min.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/point.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/princ.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/print.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/progn.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/push.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/put.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/re-search-backward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/re-search-forward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/region-active-p.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/region-beginning.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/region-end.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/rename-file.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/repeat.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/replace-regexp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/require.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/save-buffer.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/save-excursion.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/search-backward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/search-forward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/set-buffer.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/set-file-modes.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/set-mark.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/set.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/setq.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/split-string.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/string-match.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/string-to-number.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/string.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/string=.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/stringp.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/substring.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/thing-at-point.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/unless.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/vector.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/when.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/while.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/widget-get.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/with-current-buffer.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-file.process.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-find-replace.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-grabstring.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-grabthing.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/x-word-or-region.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/y-or-n-p.yasnippet + packages/yasnippet/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet + packages/yasnippet/snippets/erlang-mode/.yas-parents + packages/yasnippet/snippets/erlang-mode/after + packages/yasnippet/snippets/erlang-mode/begin + packages/yasnippet/snippets/erlang-mode/beh + packages/yasnippet/snippets/erlang-mode/case + packages/yasnippet/snippets/erlang-mode/compile + packages/yasnippet/snippets/erlang-mode/def + packages/yasnippet/snippets/erlang-mode/exp + packages/yasnippet/snippets/erlang-mode/fun + packages/yasnippet/snippets/erlang-mode/if + packages/yasnippet/snippets/erlang-mode/ifdef + packages/yasnippet/snippets/erlang-mode/ifndef + packages/yasnippet/snippets/erlang-mode/imp + packages/yasnippet/snippets/erlang-mode/inc + packages/yasnippet/snippets/erlang-mode/inc.lib + packages/yasnippet/snippets/erlang-mode/loop + packages/yasnippet/snippets/erlang-mode/mod + packages/yasnippet/snippets/erlang-mode/rcv + packages/yasnippet/snippets/erlang-mode/rcv.after + packages/yasnippet/snippets/erlang-mode/rec + packages/yasnippet/snippets/erlang-mode/try + packages/yasnippet/snippets/erlang-mode/undef + packages/yasnippet/snippets/f90-mode/.yas-parents + packages/yasnippet/snippets/f90-mode/au + packages/yasnippet/snippets/f90-mode/bd + packages/yasnippet/snippets/f90-mode/c + packages/yasnippet/snippets/f90-mode/ch + packages/yasnippet/snippets/f90-mode/cx + packages/yasnippet/snippets/f90-mode/dc + packages/yasnippet/snippets/f90-mode/do + packages/yasnippet/snippets/f90-mode/dp + packages/yasnippet/snippets/f90-mode/eq + packages/yasnippet/snippets/f90-mode/ib + packages/yasnippet/snippets/f90-mode/ic + packages/yasnippet/snippets/f90-mode/ich + packages/yasnippet/snippets/f90-mode/if + packages/yasnippet/snippets/f90-mode/ii + packages/yasnippet/snippets/f90-mode/il + packages/yasnippet/snippets/f90-mode/in + packages/yasnippet/snippets/f90-mode/inc + packages/yasnippet/snippets/f90-mode/intr + packages/yasnippet/snippets/f90-mode/ir + packages/yasnippet/snippets/f90-mode/l + packages/yasnippet/snippets/f90-mode/pa + packages/yasnippet/snippets/f90-mode/pr + packages/yasnippet/snippets/f90-mode/re + packages/yasnippet/snippets/f90-mode/st + packages/yasnippet/snippets/f90-mode/su + packages/yasnippet/snippets/f90-mode/wr + packages/yasnippet/snippets/html-mode/.yas-parents + packages/yasnippet/snippets/html-mode/b.yasnippet + packages/yasnippet/snippets/html-mode/body + packages/yasnippet/snippets/html-mode/br + packages/yasnippet/snippets/html-mode/code + packages/yasnippet/snippets/html-mode/code.class + packages/yasnippet/snippets/html-mode/div + packages/yasnippet/snippets/html-mode/div.class + packages/yasnippet/snippets/html-mode/div.id + packages/yasnippet/snippets/html-mode/div.id-class + packages/yasnippet/snippets/html-mode/dov + packages/yasnippet/snippets/html-mode/form + packages/yasnippet/snippets/html-mode/head + packages/yasnippet/snippets/html-mode/header/h1 + packages/yasnippet/snippets/html-mode/header/h2 + packages/yasnippet/snippets/html-mode/header/h3 + packages/yasnippet/snippets/html-mode/header/h4 + packages/yasnippet/snippets/html-mode/header/h5 + packages/yasnippet/snippets/html-mode/header/h6 + packages/yasnippet/snippets/html-mode/hr + packages/yasnippet/snippets/html-mode/href + packages/yasnippet/snippets/html-mode/html + packages/yasnippet/snippets/html-mode/html.xmlns + packages/yasnippet/snippets/html-mode/i.yasnippet + packages/yasnippet/snippets/html-mode/img + packages/yasnippet/snippets/html-mode/input + packages/yasnippet/snippets/html-mode/link.stylesheet + packages/yasnippet/snippets/html-mode/link.stylesheet-ie + packages/yasnippet/snippets/html-mode/list/dd + packages/yasnippet/snippets/html-mode/list/dl + packages/yasnippet/snippets/html-mode/list/dl.id + packages/yasnippet/snippets/html-mode/list/dt + packages/yasnippet/snippets/html-mode/list/li + packages/yasnippet/snippets/html-mode/list/li.class + packages/yasnippet/snippets/html-mode/list/ol + packages/yasnippet/snippets/html-mode/list/ol.class + packages/yasnippet/snippets/html-mode/list/ol.id + packages/yasnippet/snippets/html-mode/list/ul + packages/yasnippet/snippets/html-mode/list/ul.class + packages/yasnippet/snippets/html-mode/list/ul.id + packages/yasnippet/snippets/html-mode/mailto + packages/yasnippet/snippets/html-mode/meta/doctype + packages/yasnippet/snippets/html-mode/meta/doctype.xhml1 + packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_1 + packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_strict + packages/yasnippet/snippets/html-mode/meta/doctype.xhtml1_transitional + packages/yasnippet/snippets/html-mode/meta/meta + packages/yasnippet/snippets/html-mode/meta/meta.http-equiv + packages/yasnippet/snippets/html-mode/p + packages/yasnippet/snippets/html-mode/pre + packages/yasnippet/snippets/html-mode/q.yasnippet + packages/yasnippet/snippets/html-mode/quote + packages/yasnippet/snippets/html-mode/script.javascript + packages/yasnippet/snippets/html-mode/script.javascript-src + packages/yasnippet/snippets/html-mode/span + packages/yasnippet/snippets/html-mode/span.class + packages/yasnippet/snippets/html-mode/span.id + packages/yasnippet/snippets/html-mode/style + packages/yasnippet/snippets/html-mode/table/table + packages/yasnippet/snippets/html-mode/table/td + packages/yasnippet/snippets/html-mode/table/th + packages/yasnippet/snippets/html-mode/table/tr + packages/yasnippet/snippets/html-mode/textarea + packages/yasnippet/snippets/html-mode/title + packages/yasnippet/snippets/js-mode/assert.yasnippet + packages/yasnippet/snippets/js-mode/cb.yasnippet + packages/yasnippet/snippets/js-mode/com.yasnippet + packages/yasnippet/snippets/js-mode/describe.yasnippet + packages/yasnippet/snippets/js-mode/err.snippet + packages/yasnippet/snippets/js-mode/error.snippet + packages/yasnippet/snippets/js-mode/expect.yasnippet + packages/yasnippet/snippets/js-mode/exports.yasnippet + packages/yasnippet/snippets/js-mode/fn.yasnippet + packages/yasnippet/snippets/js-mode/for.yasnippet + packages/yasnippet/snippets/js-mode/id.yasnippet + packages/yasnippet/snippets/js-mode/if.yasnippet + packages/yasnippet/snippets/js-mode/invoc.yasnippet + packages/yasnippet/snippets/js-mode/it.yasnippet + packages/yasnippet/snippets/js-mode/log.yasnippet + packages/yasnippet/snippets/js-mode/method.yasnippet + packages/yasnippet/snippets/js-mode/mod.yasnippet + packages/yasnippet/snippets/js-mode/prop.yasnippet + packages/yasnippet/snippets/js-mode/proto.yasnippet + packages/yasnippet/snippets/js-mode/rq.yasnippet + packages/yasnippet/snippets/js-mode/rt.yasnippet + packages/yasnippet/snippets/js-mode/slice.yasnippet + packages/yasnippet/snippets/js-mode/super.yasnippet + packages/yasnippet/snippets/js-mode/switch.yasnippet + packages/yasnippet/snippets/js-mode/throw.yasnippet + packages/yasnippet/snippets/js-mode/try.yasnippet + packages/yasnippet/snippets/js-mode/var.yasnippet + packages/yasnippet/snippets/js-mode/wh.yasnippet + packages/yasnippet/snippets/js-mode/while.yasnippet + packages/yasnippet/snippets/latex-mode/.yas-parents + packages/yasnippet/snippets/latex-mode/begin + packages/yasnippet/snippets/markdown-mode/+ + packages/yasnippet/snippets/markdown-mode/- + packages/yasnippet/snippets/markdown-mode/.yas-parents + packages/yasnippet/snippets/markdown-mode/_ + packages/yasnippet/snippets/markdown-mode/__ + packages/yasnippet/snippets/markdown-mode/` + packages/yasnippet/snippets/markdown-mode/h1.1 + packages/yasnippet/snippets/markdown-mode/h1.2 + packages/yasnippet/snippets/markdown-mode/h2.1 + packages/yasnippet/snippets/markdown-mode/h2.2 + packages/yasnippet/snippets/markdown-mode/h3 + packages/yasnippet/snippets/markdown-mode/h4 + packages/yasnippet/snippets/markdown-mode/h5 + packages/yasnippet/snippets/markdown-mode/h6 + packages/yasnippet/snippets/markdown-mode/hr.1 + packages/yasnippet/snippets/markdown-mode/hr.2 + packages/yasnippet/snippets/markdown-mode/img + packages/yasnippet/snippets/markdown-mode/link + packages/yasnippet/snippets/markdown-mode/ol + packages/yasnippet/snippets/markdown-mode/rimg + packages/yasnippet/snippets/markdown-mode/rlb + packages/yasnippet/snippets/markdown-mode/rlink + packages/yasnippet/snippets/nxml-mode/.yas-parents + packages/yasnippet/snippets/nxml-mode/body + packages/yasnippet/snippets/nxml-mode/br + packages/yasnippet/snippets/nxml-mode/code + packages/yasnippet/snippets/nxml-mode/div + packages/yasnippet/snippets/nxml-mode/form + packages/yasnippet/snippets/nxml-mode/head + packages/yasnippet/snippets/nxml-mode/header/h1 + packages/yasnippet/snippets/nxml-mode/header/h2 + packages/yasnippet/snippets/nxml-mode/header/h3 + packages/yasnippet/snippets/nxml-mode/header/h4 + packages/yasnippet/snippets/nxml-mode/header/h5 + packages/yasnippet/snippets/nxml-mode/header/h6 + packages/yasnippet/snippets/nxml-mode/hr + packages/yasnippet/snippets/nxml-mode/href + packages/yasnippet/snippets/nxml-mode/html + packages/yasnippet/snippets/nxml-mode/img + packages/yasnippet/snippets/nxml-mode/input + packages/yasnippet/snippets/nxml-mode/li + packages/yasnippet/snippets/nxml-mode/link + packages/yasnippet/snippets/nxml-mode/meta/doctype + packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_strict + packages/yasnippet/snippets/nxml-mode/meta/doctype.xhtml1_transitional + packages/yasnippet/snippets/nxml-mode/meta/meta + packages/yasnippet/snippets/nxml-mode/name + packages/yasnippet/snippets/nxml-mode/ol + packages/yasnippet/snippets/nxml-mode/p + packages/yasnippet/snippets/nxml-mode/pre + packages/yasnippet/snippets/nxml-mode/quote + packages/yasnippet/snippets/nxml-mode/span + packages/yasnippet/snippets/nxml-mode/style + packages/yasnippet/snippets/nxml-mode/table + packages/yasnippet/snippets/nxml-mode/tag.1l + packages/yasnippet/snippets/nxml-mode/tag.2l + packages/yasnippet/snippets/nxml-mode/td + packages/yasnippet/snippets/nxml-mode/th + packages/yasnippet/snippets/nxml-mode/title + packages/yasnippet/snippets/nxml-mode/tr + packages/yasnippet/snippets/nxml-mode/ul + packages/yasnippet/snippets/objc-mode/.yas-parents + packages/yasnippet/snippets/objc-mode/prop + packages/yasnippet/snippets/perl-mode/.yas-parents + packages/yasnippet/snippets/perl-mode/eval + packages/yasnippet/snippets/perl-mode/for + packages/yasnippet/snippets/perl-mode/fore + packages/yasnippet/snippets/perl-mode/if + packages/yasnippet/snippets/perl-mode/ife + packages/yasnippet/snippets/perl-mode/ifee + packages/yasnippet/snippets/perl-mode/sub + packages/yasnippet/snippets/perl-mode/unless + packages/yasnippet/snippets/perl-mode/while + packages/yasnippet/snippets/perl-mode/xfore + packages/yasnippet/snippets/perl-mode/xif + packages/yasnippet/snippets/perl-mode/xunless + packages/yasnippet/snippets/perl-mode/xwhile + packages/yasnippet/snippets/python-mode/.yas-parents + packages/yasnippet/snippets/python-mode/__ + packages/yasnippet/snippets/python-mode/class + packages/yasnippet/snippets/python-mode/def + packages/yasnippet/snippets/python-mode/defm + packages/yasnippet/snippets/python-mode/for + packages/yasnippet/snippets/python-mode/ifmain + packages/yasnippet/snippets/python-mode/prop + packages/yasnippet/snippets/python-mode/propg + packages/yasnippet/snippets/python-mode/propsg + packages/yasnippet/snippets/python-mode/while + packages/yasnippet/snippets/rst-mode/.yas-parents + packages/yasnippet/snippets/rst-mode/chap + packages/yasnippet/snippets/rst-mode/sec + packages/yasnippet/snippets/rst-mode/tit + packages/yasnippet/snippets/ruby-mode/.yas-parents + packages/yasnippet/snippets/ruby-mode/collections/all + packages/yasnippet/snippets/ruby-mode/collections/any + packages/yasnippet/snippets/ruby-mode/collections/classify + packages/yasnippet/snippets/ruby-mode/collections/collect + packages/yasnippet/snippets/ruby-mode/collections/deli + packages/yasnippet/snippets/ruby-mode/collections/det + packages/yasnippet/snippets/ruby-mode/collections/ea + packages/yasnippet/snippets/ruby-mode/collections/eac + packages/yasnippet/snippets/ruby-mode/collections/eai + packages/yasnippet/snippets/ruby-mode/collections/eav + packages/yasnippet/snippets/ruby-mode/collections/eawi + packages/yasnippet/snippets/ruby-mode/collections/inject + packages/yasnippet/snippets/ruby-mode/collections/reject + packages/yasnippet/snippets/ruby-mode/collections/select + packages/yasnippet/snippets/ruby-mode/collections/zip + packages/yasnippet/snippets/ruby-mode/control structure/forin + packages/yasnippet/snippets/ruby-mode/control structure/if + packages/yasnippet/snippets/ruby-mode/control structure/ife + packages/yasnippet/snippets/ruby-mode/control structure/tim + packages/yasnippet/snippets/ruby-mode/control structure/until + packages/yasnippet/snippets/ruby-mode/control structure/upt + packages/yasnippet/snippets/ruby-mode/control structure/when + packages/yasnippet/snippets/ruby-mode/control structure/while + packages/yasnippet/snippets/ruby-mode/definitions/Comp + packages/yasnippet/snippets/ruby-mode/definitions/am + packages/yasnippet/snippets/ruby-mode/definitions/cla + packages/yasnippet/snippets/ruby-mode/definitions/cls + packages/yasnippet/snippets/ruby-mode/definitions/mm + packages/yasnippet/snippets/ruby-mode/definitions/mod + packages/yasnippet/snippets/ruby-mode/definitions/r + packages/yasnippet/snippets/ruby-mode/definitions/rw + packages/yasnippet/snippets/ruby-mode/definitions/w + packages/yasnippet/snippets/ruby-mode/general/# + packages/yasnippet/snippets/ruby-mode/general/=b + packages/yasnippet/snippets/ruby-mode/general/app + packages/yasnippet/snippets/ruby-mode/general/bm + packages/yasnippet/snippets/ruby-mode/general/case + packages/yasnippet/snippets/ruby-mode/general/dee + packages/yasnippet/snippets/ruby-mode/general/rb + packages/yasnippet/snippets/ruby-mode/general/req + packages/yasnippet/snippets/ruby-mode/general/rreq + packages/yasnippet/snippets/ruby-mode/general/y + packages/yasnippet/snippets/scala-mode/.yas-parents + packages/yasnippet/snippets/scala-mode/act + packages/yasnippet/snippets/scala-mode/act.arg + packages/yasnippet/snippets/scala-mode/actor + packages/yasnippet/snippets/scala-mode/ano + packages/yasnippet/snippets/scala-mode/app + packages/yasnippet/snippets/scala-mode/arr.new + packages/yasnippet/snippets/scala-mode/arr.val-new + packages/yasnippet/snippets/scala-mode/asof + packages/yasnippet/snippets/scala-mode/ass + packages/yasnippet/snippets/scala-mode/ass.true + packages/yasnippet/snippets/scala-mode/at.author + packages/yasnippet/snippets/scala-mode/at.param + packages/yasnippet/snippets/scala-mode/at.return + packages/yasnippet/snippets/scala-mode/at.version + packages/yasnippet/snippets/scala-mode/bang + packages/yasnippet/snippets/scala-mode/case + packages/yasnippet/snippets/scala-mode/case.match-all + packages/yasnippet/snippets/scala-mode/cast + packages/yasnippet/snippets/scala-mode/cc + packages/yasnippet/snippets/scala-mode/cl + packages/yasnippet/snippets/scala-mode/cl.abs + packages/yasnippet/snippets/scala-mode/cl.abs-arg + packages/yasnippet/snippets/scala-mode/cl.arg + packages/yasnippet/snippets/scala-mode/clof + packages/yasnippet/snippets/scala-mode/co + packages/yasnippet/snippets/scala-mode/cons + packages/yasnippet/snippets/scala-mode/cons.nil + packages/yasnippet/snippets/scala-mode/def.arg + packages/yasnippet/snippets/scala-mode/def.arg-body + packages/yasnippet/snippets/scala-mode/def.arg-ret + packages/yasnippet/snippets/scala-mode/def.arg-ret-body + packages/yasnippet/snippets/scala-mode/def.body + packages/yasnippet/snippets/scala-mode/def.ret + packages/yasnippet/snippets/scala-mode/def.ret-body + packages/yasnippet/snippets/scala-mode/def.simple + packages/yasnippet/snippets/scala-mode/doc.class + packages/yasnippet/snippets/scala-mode/doc.def + packages/yasnippet/snippets/scala-mode/doc.file + packages/yasnippet/snippets/scala-mode/doc.file-scala + packages/yasnippet/snippets/scala-mode/doc.file-scala-api + packages/yasnippet/snippets/scala-mode/doc.scaladoc + packages/yasnippet/snippets/scala-mode/expect + packages/yasnippet/snippets/scala-mode/ext + packages/yasnippet/snippets/scala-mode/for.extract + packages/yasnippet/snippets/scala-mode/for.if + packages/yasnippet/snippets/scala-mode/for.loop + packages/yasnippet/snippets/scala-mode/for.multi + packages/yasnippet/snippets/scala-mode/foreach + packages/yasnippet/snippets/scala-mode/hmap.new + packages/yasnippet/snippets/scala-mode/hmap.val-new + packages/yasnippet/snippets/scala-mode/hset.new + packages/yasnippet/snippets/scala-mode/hset.val-new + packages/yasnippet/snippets/scala-mode/if + packages/yasnippet/snippets/scala-mode/if.else + packages/yasnippet/snippets/scala-mode/imp + packages/yasnippet/snippets/scala-mode/intercept + packages/yasnippet/snippets/scala-mode/isof + packages/yasnippet/snippets/scala-mode/ls.new + packages/yasnippet/snippets/scala-mode/ls.val-new + packages/yasnippet/snippets/scala-mode/main + packages/yasnippet/snippets/scala-mode/map + packages/yasnippet/snippets/scala-mode/map.new + packages/yasnippet/snippets/scala-mode/match + packages/yasnippet/snippets/scala-mode/match.can + packages/yasnippet/snippets/scala-mode/match.option + packages/yasnippet/snippets/scala-mode/mix + packages/yasnippet/snippets/scala-mode/ob + packages/yasnippet/snippets/scala-mode/pac + packages/yasnippet/snippets/scala-mode/pr.newline + packages/yasnippet/snippets/scala-mode/pr.simple + packages/yasnippet/snippets/scala-mode/pr.string + packages/yasnippet/snippets/scala-mode/pr.trace + packages/yasnippet/snippets/scala-mode/pri + packages/yasnippet/snippets/scala-mode/pri.param + packages/yasnippet/snippets/scala-mode/pro + packages/yasnippet/snippets/scala-mode/pro.param + packages/yasnippet/snippets/scala-mode/suite + packages/yasnippet/snippets/scala-mode/test + packages/yasnippet/snippets/scala-mode/throw + packages/yasnippet/snippets/scala-mode/tr + packages/yasnippet/snippets/scala-mode/tr.ext + packages/yasnippet/snippets/scala-mode/tr.ext-with + packages/yasnippet/snippets/scala-mode/tr.with + packages/yasnippet/snippets/scala-mode/try + packages/yasnippet/snippets/scala-mode/try.catch-finally + packages/yasnippet/snippets/scala-mode/try.finally + packages/yasnippet/snippets/scala-mode/tup.arrow + packages/yasnippet/snippets/scala-mode/tup.paren + packages/yasnippet/snippets/scala-mode/val + packages/yasnippet/snippets/scala-mode/val.new + packages/yasnippet/snippets/scala-mode/val.ret + packages/yasnippet/snippets/scala-mode/var + packages/yasnippet/snippets/scala-mode/var.new + packages/yasnippet/snippets/scala-mode/var.ret + packages/yasnippet/snippets/scala-mode/whi + packages/yasnippet/snippets/scala-mode/with + packages/yasnippet/snippets/snippet-mode/.yas-parents + packages/yasnippet/snippets/snippet-mode/field + packages/yasnippet/snippets/snippet-mode/mirror + packages/yasnippet/snippets/snippet-mode/vars + packages/yasnippet/snippets/sql-mode/.yas-parents + packages/yasnippet/snippets/sql-mode/column + packages/yasnippet/snippets/sql-mode/constraint + packages/yasnippet/snippets/sql-mode/constraint.1 + packages/yasnippet/snippets/sql-mode/create + packages/yasnippet/snippets/sql-mode/create.1 + packages/yasnippet/snippets/sql-mode/references + packages/yasnippet/snippets/text-mode/email + packages/yasnippet/snippets/text-mode/time + packages/yasnippet/yasnippet-tests.el + +2014-11-26 Stefan Monnier <monnier@iro.umontreal.ca> + + * packages/yasnippet: Fix lexical-binding cookie; and require cl. + + * packages/yasnippet/yasnippet-tests.el: Fix lexical-binding cookie. + * packages/yasnippet/yasnippet-debug.el: Require cl. + +2013-08-29 Stefan Monnier <monnier@iro.umontreal.ca> + + Sync with yasnippet/master + +2013-08-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * packages/yasnippet: Fix up copyright headers. + +2013-08-28 Stefan Monnier <monnier@iro.umontreal.ca> + + Sync with yasnippet/master + +2013-08-28 Stefan Monnier <monnier@iro.umontreal.ca> + + Add YAsnippet metadata. + +2013-08-22 Stefan Monnier <monnier@iro.umontreal.ca> + + Only keep the strictly necessary *-pkg.el files + +2012-09-24 Chong Yidong <cyd@gnu.org> + + Add missing file yasnippet-pkg.el + +2012-09-24 Chong Yidong <cyd@gnu.org> + + Add README file for yasnippet. + +2012-09-24 João Távora <joaotavora@gmail.com> + + Add yasnippet. +
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/NEWS @@ -0,0 +1,216 @@ +Yasnippet NEWS -- history of user-visible changes. + +Copyright (C) 2016 Free Software Foundation, Inc. +See the end of the file for license conditions. + + +* 0.9.1 (est. March 2016) + +** Changes and New Features + +*** Noam Postavsky is now the official yasnippet maintainer. + +*** `yas-visit-snippet-file' now works for compiled snippets (see Github #597). + +*** New function `yas-lookup-snippet' (see Github #595, #596). + +*** .emacs.d/snippets directory is now created automatically. +If that value is present in `yas-snippet-dirs' (see Github #648). + +*** Default value for `yas-snippet-dirs' now uses `user-emacs-directory' +instead of hardcoding "~/emacs.d" (see Github #632). + +*** `yas-visit-snippet-file' no longer overrides `yas-prompt-functions', +see Github #576. + +*** The defaults for prompting have changed. +`yas-x-prompt' is no longer present in the default value of +`yas-prompt-functions'. + +The new function `yas-maybe-ido-prompt' (which performs ido prompting +if `ido-mode' is enabled) replaces `yas-ido-prompt' (which always +performs ido prompting). Previously the behaviour was dependent on +the Emacs version being used. + +*** The default value of `yas-buffer-local-condition' now works for `yas-insert-snippet' too. +See Github #305. + +*** The default value of `yas-new-snippet-default' no longer inserts `require-final-newline: nil'. +It was redundant, since `mode: snippet' already accomplishes the same. +`binding: ${4:direct-keybinding}}' is also removed, as it is hardly +ever wanted. + +*** Snippet fields are only cleared by commands with `delete-selection' property, +See Github #515, #644. + +*** `yas-initialize' (and backward compat alias `yas/initialize') are restored, +but marked obsolete, use (yas-global-mode +1) instead. See Github +#546, #569. + +*** `yas-key-syntaxes' is much more powerful and accepts functions. +Enables use cases when discovering keys based on buffer syntax is not +good enough. See issue #497. + +*** Documentation rewritten in org-mode and updated. +A tremendous effort by Noam Postavsky. Hopefully easier to maintain +and navigate. Available at <http://capitaomorte.github.io/yasnippet>. + +*** Snippets are now maintained in their own repo. +Snippets live in Andrea Crotti's +<https://github.com/andreacrotti/yasnippet-snippets>. See README.md +for more details. + +*** Textmate snippet importer moved to separate `yasmate' repo. +URL is <https://github.com/capitaomorte/yasmate>. See README.md for +more details. + +*** `yas-snippet-dirs' now allows symbols as aliases to directories. +The added level of indirection should allow more esoteric +configurations (see Github #495). + +*** `yas-reload-all' can now jit-load when called interactively. + +*** New `yas-after-reload-hook' run after `yas-reload-all'. +See <https://github.com/pezra/rspec-mode/pull/75> for the discussion +leading up to this change. + +*** New functions `yas-activate-extra-mode' and `yas-deactivate-extra-mode'. +These are preferable to setting `yas-extra-modes' directly in the mode +hook (see issue #420 for more information). + +*** New variable `yas-new-snippet-default'. +The default snippet suggested on `yas-new-snippet' can now be +customized. + +** Fixed bugs + +*** `yas-expand' now sets `this-command' when falling back to another command. +Previously it was setting `this-original-command', which does not +match the documented semantics. See Github #587. + +*** Github #537: Be lenient to extensions operating on snippet fields. + +*** Github #619: Parents of extra modes are now activated too. + +*** Github #549: `yas-verbosity' is now applied to `load' calls too. + +*** Github #607; avoid obscure Emacs bug triggered by overlays in *Messages* buffer. +It was triggered by yasnippet+flycheck+highlight-parentheses. See +also <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=21824> + +*** Github #617; fix x prompt when snippet inserts many lines. + +*** Github #618; avoid breakage if `scan-sexp' modifies match data. +Which it does in Emacs 25. + +*** Github #562: Deleting inner numberless snippet caused an error. + +*** Github #418, #536: Fix navigation to zero-length fields at snippet end. + +*** Github #527, #525 and #526: Attempt to prevent "fallback loops" +when interactiing with other extensions that use similar fallback +mechanisms. + + +* 0.8.0 (August 2012) + +** Changes and New Features + +*** All YASnippet symbols now prefixed with `yas-'. Keep old `yas/' versions as aliases. + +*** Yasnippet is now Free Software Foundation's copyright. + +*** `yas-dont-activate' can be a list of functions. + +*** Snippets are loaded just-in-time . +Thanks to Matthew Fidler for a lot of input with the implementation. + +*** yasnippet-bundle.el is no longer available. +Use `yas-compile-directory' instead if you need the speed advantage. + +*** New functions `yas-compile-directory' and `yas-recompile-all'. +This feature is still undocumented. Generate a +.yas-compiled-snippets.el file in the directory passed where snippets +are compiled into emacs-lisp code. + +*** New `yas-verbosity' variable. + +*** Interactively calling `yas-exit-snippet' exits most recently inserted snippet. + +*** Using filenames as snippet triggers is deprecated. + +*** Default value of `yas-show-menu-p' is `abbreviate'. + +*** `yas-visit-snippet' ignores `yas-prompt-functions'. + +*** `yas-buffer-local-condition' restricted to trigger-key expansions by default. + +*** `yas-load-snippet-buffer' (`C-c C-c') in `snippet-mode' has been much improved. + +*** New variable `yas-expand-only-for-last-commands', thanks Erik Postma. + +*** New variable `yas-extra-modes' aliases old `yas/mode-symbol'. + +*** New `yas-describe-tables' command. + +*** New `yas-define-condition-cache' macro. +This defines an optimised function for placing in a `# condition:' +directive that will run at most once per snippet-expansion attempt. + +*** Mirrors can occur inside fields. + +*** New `# type: command' directive. +This feature is still largely undocumented. + +*** A hidden .yas-setup.el is loaded if found in a snippet directory. + +*** `yas-wrap-around-region' can now also be `cua' (undocumented feature). + +*** Make menu groups automatically using new .yas-make-groups file. + +*** Per-snippet keybindings using `# keybinding:' directive. + +*** More friendly `yas-expand-snippet' calling convention. +This breaks backward compatibility. + +*** The `# env:' directive is now `# expand-env:'. + +*** Setup multiple parent modes using new .yas-parents file. + +** Fixed bugs + +*** Github #281: jit-load snippets in the correct order. + +*** Github #245: primary field transformations work inside nested fields. + +*** Github #242: stop using the deprecated `assoc' library. + +*** Github #233: show direct snippet keybindings in the menu. + +*** Github #194, Googlecode 192: Compatibility with `fci-mode'. + +*** Github #147, Googlecode 145: Snippets comments were getting inserted. + +*** Github #141, Googlecode 139: searching buffer in embedded elisp works slightly better. +Issue is still open for analysis, though + +*** Github #95, Googlecode 193: no more stack overflow in org-mode. + + +---------------------------------------------------------------------- +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at +your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + + +Local variables: +coding: utf-8 +mode: outline +paragraph-separate: "[ ]*$" +end:
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/README.mdown @@ -0,0 +1,171 @@ +[](https://travis-ci.org/capitaomorte/yasnippet) + +# Intro + +**YASnippet** is a template system for Emacs. It allows you to +type an abbreviation and automatically expand it into function +templates. Bundled language templates include: C, C++, C#, Perl, +Python, Ruby, SQL, LaTeX, HTML, CSS and more. The snippet syntax +is inspired from [TextMate's][textmate-snippets] syntax, you can +even [import](#import) most TextMate templates to +YASnippet. Watch [a demo on YouTube][youtube-demo]. + +[textmate-snippets]: http://manual.macromates.com/en/snippets +[youtube-demo]: http://www.youtube.com/watch?v=ZCGmZK4V7Sg + +# Installation + +## Install the most recent version + +Clone this repository somewhere + + $ cd ~/.emacs.d/plugins + $ git clone --recursive https://github.com/capitaomorte/yasnippet + +Add the following in your `.emacs` file: + + (add-to-list 'load-path + "~/.emacs.d/plugins/yasnippet") + (require 'yasnippet) + (yas-global-mode 1) + +Add your own snippets to `~/.emacs.d/snippets` by placing files there or invoking `yas-new-snippet`. + +## Install with `package-install` + +In a recent emacs `M-x list-packages` is the recommended way to list and install packages. +[MELPA][melpa] keeps a very recent snapshot of YASnippet, see http://melpa.org/#installing. + +## Install with el-get + +El-get is a nice way to get the most recent version, too. See +https://github.com/dimitri/el-get for instructions. + +## Use `yas-minor-mode` on a per-buffer basis + +To use YASnippet as a non-global minor mode, don't call +`yas-global-mode`; instead call `yas-reload-all` to load the snippet +tables and then call `yas-minor-mode` from the hooks of major-modes +where you want YASnippet enabled. + + (yas-reload-all) + (add-hook 'prog-mode-hook #'yas-minor-mode) + +# Where are the snippets? + +<a name="import"></a> + +Yasnippet no longer bundles snippets directly, but it's very easy to +get some! + +If you git-cloned yasnippet with the `--recursive` option you'll also +download "git submodules" and find two subdirs under the main tree. + +1. `snippets/` + + Points to [yasnippet-snippets] the snippet collection of + [AndreaCrotti](https://github.com/AndreaCrotti). + + The default configuraiton already points to this dir, so to use + them, just make sure the submodule really was downloaded + (i.e. there are some files under `snippets/`) + +2. `yasmate/` + + Points to a github repo of the [yasmate] tool, which is dedicated + to converting textmate bundles into yasnippet snippets. + + To use these snippets you have to run the tool first, so + [see its doc][yasmate]), and then point the `yas-snippet-dirs` + variable to the `.../yasmate/snippets` subdir. + + If you have a working ruby environment, you can probably get lucky + directly with `rake convert-bundles`. + +3. [textmate-to-yas.el] + + This is another textmate bundle converting tool using Elisp + instead of Ruby. + +Naturally, you can point `yas-snippet-dirs` to good snippet collections out +there. If you have created snippets for a mode, or multiple modes, +consider creating a repository to host them, then tell users that it +should be added like this to `yas-snippet-dirs`: + + (setq yas-snippet-dirs + '("~/.emacs.d/snippets" ;; personal snippets + "/path/to/some/collection/" ;; foo-mode and bar-mode snippet collection + "/path/to/yasnippet/yasmate/snippets" ;; the yasmate collection + "/path/to/yasnippet/snippets" ;; the default collection + )) + + (yas-global-mode 1) ;; or M-x yas-reload-all if you've started YASnippet already. + +# Manual, issues etc + +Please refer to the comprehensive [documentation][docs] for full +customisation and support. If you find a bug in the code or in the +documentation, please report it on [the GitHub issue tracker][issues]. + +## Important note regarding bug reporting + +Your bug reports are very valuable. + +The most important thing when reporting bugs is making sure that we have +a way to reproduce the problem exactly like it happened to you. + +To do this, we need to rule out interference from external factors +like other Emacs extensions or your own customisations. + +Here's an example report that "sandboxes" an Emacs session just for +reproducing a bug. + +``` +$ emacs --version +Emacs 24.3 +$ cd /tmp/ +$ git clone https://github.com/capitaomorte/yasnippet.git yasnippet-bug +$ cd yasnippet-bug +$ git log -1 --oneline +6053db0 Closes #527: Unbreak case where yas-fallback-behaviour is a list +$ HOME=$PWD emacs -L . # This "sandboxes" your emacs, melpa configuration, etc + +(require 'yasnippet) +(yas-global-mode 1) + +When I open a foo-mode file I don't see foo-mode under the "YASnippet" menu! +OR +When loading yasnippet I see "Error: failed to frobnicate"! +``` + +Using `emacs -Q` or temporarily moving your `.emacs` init file to the side +is another way to achieve good reproducibility. + +Here's a +[another example](https://github.com/capitaomorte/yasnippet/issues/318) +of a bug report. It has everything needed for a successful analysis +and speedy resolution. + +Also, don't forget to state the Emacs version (use `M-x emacs-version`) and +the yasnippet version you are using (if using the latest from github, +do `git log -1` in the dir). + +Any more info is welcome, but don't just paste a backtrace or an error +message string you got, unless we ask for it. + +There is also a [YASnippet google group][forum]. I will keep the group +open for reference and for discussion among users. Unfortunately I +can't guarantee a timely response, so maybe it's better to create a +github issue clearly marking your intent (user support/bug/feature +request). + +Finally, thank you very much for using YASnippet! + +[docs]: http://capitaomorte.github.com/yasnippet/ +[issues]: https://github.com/capitaomorte/yasnippet/issues +[googlecode tracker]: http://code.google.com/p/yasnippet/issues/list +[forum]: http://groups.google.com/group/smart-snippet +[melpa]: http://melpa.milkbox.net/ +[yasmate]: http://github.com/capitaomorte/yasmate +[textmate-to-yas.el]: https://github.com/mattfidler/textmate-to-yas.el +[yasnippet-snippets]: http://github.com/AndreaCrotti/yasnippet-snippets
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/Rakefile @@ -0,0 +1,107 @@ +# -*- Ruby -*- + +require 'fileutils' + +$EMACS = ENV["EMACS"] +if not $EMACS or $EMACS == 't' + $EMACS = "emacs" +end + +def find_version + File.read("yasnippet.el", :encoding => "UTF-8") =~ /;; Package-version: *([0-9.]+?) *$/ + $version = $1 +end +find_version +FileUtils.mkdir_p('pkg') + +desc "run tests in batch mode" +task :tests do + sh "#{$EMACS} -Q -L . -l yasnippet-tests.el" + + " --batch -f ert-run-tests-batch-and-exit" +end + +desc "create a release package" +task :package do + release_dir = "pkg/yasnippet-#{$version}" + FileUtils.mkdir_p(release_dir) + files = ['snippets', 'yasnippet.el'] + FileUtils.cp_r files, release_dir + File.open(File.join(release_dir,'yasnippet-pkg.el'), 'w') do |file| + file.puts <<END +(define-package "yasnippet" + "#{$version}" + "A template system for Emacs") +END + end + sh "git clean -f snippets" + FileUtils.cd 'pkg' do + sh "tar cf yasnippet-#{$version}.tar yasnippet-#{$version}" + end +end + +desc "create a release package and upload it to google code" +task :release => [:package, 'doc:archive'] do + raise "Not implemented for github yet!" +end + +desc "Generate document" +task :doc do + sh "#{$EMACS} -Q -L . --batch -l doc/yas-doc-helper.el" + + " -f yas--generate-html-batch" +end + +namespace :doc do + task :archive do + release_dir = "pkg/yasnippet-#{$version}" + FileUtils.mkdir_p(release_dir) + sh "tar cjf pkg/yasnippet-doc-#{$version}.tar.bz2 " + + "--exclude=doc/.svn --exclude=doc/images/.svn doc/*.html doc/images" + end + + task :upload do + if File.exists? 'doc/gh-pages' + Dir.chdir 'doc/gh-pages' do + sh "git checkout gh-pages" + end + Dir.glob("doc/*.{html,css}").each do |file| + FileUtils.cp file, 'doc/gh-pages' + end + Dir.glob("doc/images/*").each do |file| + FileUtils.cp file, 'doc/gh-pages/images' + end + Dir.glob("doc/stylesheets/*.css").each do |file| + FileUtils.cp file, 'doc/gh-pages/stylesheets' + end + curRev = `git rev-parse --verify HEAD`.chomp() + expRev = IO.read('doc/html-revision').chomp() + if curRev != expRev + raise ("The HTML rev: #{expRev},\n" + + "current rev: #{curRev}!\n") + end + if !system "git diff-index --quiet HEAD" + system "git status --untracked-files=no" + raise "You have uncommitted changes!" + end + Dir.chdir 'doc/gh-pages' do + sh "git commit -a -m 'Automatic documentation update.\n\n" + + "From #{curRev.chomp()}'" + sh "git push" + end + end + end +end + +desc "Compile yasnippet.el into yasnippet.elc" + +rule '.elc' => '.el' do |t| + sh "#{$EMACS} --batch -L . --eval \"(byte-compile-file \\\"#{t.source}\\\")\"" +end +task :compile => FileList["yasnippet.el"].ext('elc') + +task :default => :doc + +desc "use yasmate to convert textmate bundles" +task :convert_bundles do + cd "yasmate" + sh "rake convert_bundles" + end
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/faq.org @@ -0,0 +1,158 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: Frequently Asked Questions + +* Why is there an extra newline? + +If you have a newline at the end of the snippet definition file, then +YASnippet will add a newline when you expanding a snippet. Please don't +add a newline at the end if you don't want it when you saving the +snippet file. + +Note some editors will automatically add a newline for you. In Emacs, if +you set =require-final-newline= to =t=, it will add the final newline +for you automatically. + +* Why doesn't TAB expand a snippet? + +First check the mode line to see if there's =yas=. If not, then try +=M-x yas-minor-mode= to manually turn on the minor mode and try to +expand the snippet again. If it works, then, you can add the following +code to your =.emacs= /before/ loading YASnippet: + +#+BEGIN_SRC emacs-lisp + (add-hook 'the-major-mode-hook 'yas-minor-mode-on) +#+END_SRC + +where =the-major-mode= is the major mode in which [[sym:yas-minor-mode][=yas-minor-mode=]] isn't +enabled by default. + +From YASnippet 0.6 you can also use the command =M-x yas-global-mode= to +turn on YASnippet automatically for /all/ major modes. + +If [[sym:yas-minor-mode][=yas-minor-mode=]] is on but the snippet still not expanded. Then try +to see what command is bound to the =TAB= key: press =C-h k= and then +press =TAB=. Emacs will show you the result. + +You'll see a buffer prompted by Emacs saying that +=TAB runs the command ...=. Alternatively, you might see +=<tab> runs the command ...=, note the difference between =TAB= and +=<tab>= where the latter has priority. If you see =<tab>= bound to a +command other than [[sym:yas-expand][=yas-expand=]], (e.g. in =org-mode=) you can try the +following code to work around: + +#+BEGIN_SRC emacs-lisp + (add-hook 'org-mode-hook + (let ((original-command (lookup-key org-mode-map [tab]))) + `(lambda () + (setq yas-fallback-behavior + '(apply ,original-command)) + (local-set-key [tab] 'yas-expand)))) +#+END_SRC + +replace =org-mode-hook= and =org-mode-map= with the major mode hook you +are dealing with (Use =C-h m= to see what major mode you are in). + +As an alternative, you can also try + +#+BEGIN_SRC emacs-lisp + (defun yas-advise-indent-function (function-symbol) + (eval `(defadvice ,function-symbol (around yas-try-expand-first activate) + ,(format + "Try to expand a snippet before point, then call `%s' as usual" + function-symbol) + (let ((yas-fallback-behavior nil)) + (unless (and (interactive-p) + (yas-expand)) + ad-do-it))))) + + (yas-advise-indent-function 'ruby-indent-line) +#+END_SRC + +To /advise/ the modes indentation function bound to TAB, (in this case +=ruby-indent-line=) to first try to run [[sym:yas-expand][=yas-expand=]]. + +If the output of =C-h k RET <tab>= tells you that =<tab>= is indeed +bound to [[sym:yas-expand][=yas-expand=]] but YASnippet still doesn't work, check your +configuration and you may also ask for help on the [[http://groups.google.com/group/smart-snippet][discussion group]]. +See this particular [[http://code.google.com/p/yasnippet/issues/detail?id=93&can=1][thread]] for quite some solutions and alternatives. + +Don't forget to attach the information on what command is bound to TAB +as well as the mode information (Can be obtained by =C-h m=). + +* Why doesn't TAB navigation work with flyspell + +A workaround is to inhibit flyspell overlays while the snippet is +active: + +#+BEGIN_SRC emacs-lisp + (add-hook 'flyspell-incorrect-hook + #'(lambda (dummy1 dummy2 dymmy3) + (and yas-active-field-overlay + (overlay-buffer yas-active-field-overlay)))) +#+END_SRC + +This is apparently related to overlay priorities. For some reason, the +=keymap= property of flyspell's overlays always takes priority over the +same property in YASnippet's overlays, even if one sets the latter's +=priority= property to something big. If you know emacs-lisp and can +solve this problem, drop a line in the +[[http://groups.google.com/group/smart-snippet][discussion group]]. + +* How to I use alternative keys, i.e. not TAB? + +Edit the keymaps [[sym:yas-minor-mode-map][=yas-minor-mode-map=]] and +[[sym:yas-keymap][=yas-keymap=]] as you would any other keymap: + +#+begin_src emacs-lisp :exports code + (define-key yas-minor-mode-map (kbd "<tab>") nil) + (define-key yas-minor-mode-map (kbd "TAB") nil) + (define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand) + + ;;keys for navigation + (define-key yas-keymap [(tab)] nil) + (define-key yas-keymap (kbd "TAB") nil) + (define-key yas-keymap [(shift tab)] nil) + (define-key yas-keymap [backtab] nil) + (define-key yas-keymap (kbd "<new-next-field-key>") 'yas-next-field-or-maybe-expand) + (define-key yas-keymap (kbd "<new-prev-field-key>") 'yas-prev) +#+end_src + +* How do I turn off the minor mode where in some buffers? + +The best way, since version 0.6.1c, is to set the default value of the +variable [[sym:yas-dont-activate][=yas-dont-activate=]] to a lambda function like so: + +#+BEGIN_SRC emacs-lisp + (set-default 'yas-dont-activate + #'(lambda () + (and yas-root-directory + (null (yas-get-snippet-tables))))) +#+END_SRC + +This is also the default value starting for that version. It skips the +minor mode in buffers where it is not applicable (no snippet tables), +but only once you have setup your yas-root-directory. + +* How do I define an abbrev key containing characters not supported by the filesystem? + +- *Note*: This question applies if you're still defining snippets + whose key /is/ the filename. This is behavior still provided by + version 0.6 for backward compatibilty, but is somewhat + deprecated... + +For example, you want to define a snippet by the key =<= which is not a +valid character for filename on Windows. This means you can't use the +filename as a trigger key in this case. + +You should rather use the =# key:= directive to specify the key of the +defined snippet explicitly and name your snippet with an arbitrary valid +filename, =lt.YASnippet= for example, using =<= for the =# key:= +directive: + +#+BEGIN_SRC snippet + # key: < + # name: <...></...> + # -- + <${1:div}>$0</$1> +#+END_SRC
new file mode 100644 index 0000000000000000000000000000000000000000..a64b346e650cecd1fec5ccb082fbf14c757670ce GIT binary patch literal 3275 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 JPDHLkV1lz2WQG6$
new file mode 100644 index 0000000000000000000000000000000000000000..f07ebb5cdef30d8c8d942d07981d23c7edf6aef9 GIT binary patch literal 3169 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 Hu0mjfx7Q4M
new file mode 100644 index 0000000000000000000000000000000000000000..d55828ed2277055f51b88ba8ee1259a0b0dea10c GIT binary patch literal 485 zc$@*{0UG{^P)<h;3K|Lk000e1NJLTq000L70077c0ssI2tB!2t00053Nkl<ZSi|j= zO>WyT5QV>I%&Nx-&^zP`IZ)5ktMnLMX3=dD#F6;ApnfQdhAl%zHsZpdMx&YcLyqI+ z_g^ezEHDywfCN|wER01sVGLjpfD)0C^P`hNIsruYW#(mifulPo=MOCloCI+`drllz ze10YXJ7)tj@$ug0oyiyyKE<D3KUuAKeeWC5&KY}&j+lCjnPBAS2~^&Pip1$f&{|Q5 zHEcZP=4Vyi+7)WNzSONmI^(S<0O7$~vK|6(<kueaJl53`g;+5jGNK?neWX~zpDU=W zShHwzyF2QoE~@k`f5R?q8@NPDl^X`4@4P-H(e=*vX~;B)NL>OgYdfBwel+m@dpmFB zR%sks9w_anq^Hu;J}c=0gD+P&UA-*}Zdud83FX{;Vzp%4?p8@N>QLA)U4a0tEZ(M$ z^qBK|fyK(;&E2%Vnq@cL&7y(0VxfCj=mvEfQ(0Fk-0Q`z9_zZ2x74lXQ8ec4K8$xz zQu|`CkyaJPsqw9D=Kp{?O`AQ|-m|2kq`vE3=!UxOX|LO-(T*%Oc>Jhyc0`Zp5j~<u b^uf{ptg@vTFnA0$00000NkvXXu0mjfJ}~9h
new file mode 100644 index 0000000000000000000000000000000000000000..c783d718b7b2887ac752ed4febedd3d370be44aa GIT binary patch literal 441 zc$@*b0Y?6bP)<h;3K|Lk000e1NJLTq000pH000aK0ssI23rE4|0004iNkl<ZC>52E z%`1da6vpp8=iK{#%sb<yM#=v~Huj3Fg_R9uVJGqjjEp3ugr%~OB5Kk^BS}&|Liq}> z8RNOHScrvlPxo}|`90^HOZEQ;HFwVEJ7!zj3cClF>hIV;zG-bQ<U5MclVm((&6u9C z_4~)<SL*5ct!s4cjSYuROq})749*^Fed8OyG6NHvCwEoO1rqy`^+|HRH25|SZJb#t zT}>}neqhDb!^Q0ji6dxC6mWwj2}MH7IgcAdY03;Q>>r)oe`A%?yP>(V<U@%AiY!M~ zd_ziW#YDpFu|zhp(mS=4RNsNUB(?6zt*URFX~1knkw)TDgp0NIn0$d#<@R-Ct_)_d zP&$4{U_^mv!_W{zu1G1315C4K%Mu9Z?99%2e{pZAd~LFpL&1j;X3?bTKu{d%!eN3| zETNH%ES9esKw!zT7DAKMA5lkjsM`upK@u5Z42gywb|7tp1m0g!Pxnco&k->(L!r>n j5O`<7a8AF<9ald9pL~pm_5^2200000NkvXXu0mjfHd4op
new file mode 100644 index 0000000000000000000000000000000000000000..d2452ac4f22e3e954c9a15b899a4cc75b0d73ce7 GIT binary patch literal 502 zc$@+D0SW$zP)<h;3K|Lk000e1NJLTq000pH000aK0ssI23rE4|0005KNkl<ZC{vY@ zJ!q3*6ot>Z_rBlTFHL{Yw$LdkI_M^XIw=G@sFQ;ZF1m<=gA{aeD=6qBg6@Jt6;Y82 ziXe1Qhti=!8=cHhp>1@q4bmjv&vi%#ar4aQJi~d+-SMBXiStiA%dN;>-#xX~&O5z= zz(1H^vVS6-nx5;4F$A;0=$RJVxO``R{^8l#PpjWHe*ZnFjaM$7sMW8&%rt14ND@p( zqIVUEe&5`lzW3qUrNhn54heUFAaLx!*!BA#n_IaJr;-K+vrru<W3Ju2pw2C|j(=W1 zb7=By<0t3<Pahm_EVrI7tcTHx4n-L-31(6;$+Zj$(_k|5?902`lSlTBF0O7Jt&NNY zx$tBq?5^5yl+-jT6(&Tfl*9m_@NVH(9xS}MRo`g$PVU<^b@P25)vBhcN+J*fG>{ZH zz(lohIKKYs%*-yItM9q-XsOxGv>GKf289ZR0IdHjNr)gZ1!#P{xYi+FHGb$&(5MVb zRSHPD!vK;Fl5jV12{e_Ye6iB9!N5M-RK!8T0lEQz69hy^M*)hu3%zs-NeD&Y+|fnA s`Vt%<;3SoVmrg>6z9ND<Z4eIr0c8J`29iTXI{*Lx07*qoM6N<$f*^k7Bme*a
new file mode 100644 index 0000000000000000000000000000000000000000..18b9559de682b2004880080943a45df9d2c3730e GIT binary patch literal 104 zc%17D@N?(olHy`uVBq!ia0vp^oItF~!2~4b=Z1hJ^gUf1Lo9le_k4L{%*=PdW8Iyj z>GRoo@3by&c7OM0@<PS(yp9udYyT8RoSwUIy$nN!eBxKl2M)J@S{XcD{an^LB{Ts5 D;7=oD
new file mode 100644 index 0000000000000000000000000000000000000000..b361e7b38058f271a77df9f99f6e84e4aed19da5 GIT binary patch literal 712 zc$@*q0yq7MP)<h;3K|Lk000e1NJLTq000F5009^X0ssI28#1dy0007yNkl<ZSi{|w zO>!MX41~WHs!)&xJMP9ExeKSr1z12TF5E2iGvjPh;KVjOSNYYv(TrN%Esbn*ef0A$ zzuxQ2_wSyre|qOfKwyH*AHN5{AmfZ5z605oWII3@A+V$X5E4j&sH>>cD5d=c`P#38 zfpo)7xdQ~oDdEWggs<a>>{#{v$;oG=)Wp}pJbQJYya|LzYa<ZX{Q_AbNsCYfa+N3$ zN+Hu|-F!@mLbY};q46yVQ80Q}N`wlNX?{Ce04WJdo>K4xAQ7E@2+RPterWj6Cdl40 zlDzmvQysnP#$5EpS7-_f8n3Jsky!E+KqM!DB@cfzN4wuqxpx@}qVs$FfwrLaqfp64 zr1nBfD!e`g1=Np|uWW^cu|}U_FUo%&NQ-xqxbS)mp%|w%2`LMCT^|JM|IKgzsrT1T z5-23sR}m5$sn75j3x%cy)&A?$ZQ5w#wNpt6d^9S4?*6;f0iqgZ3(SFIP(Th<oia7u zQ2BGs>(O%+W%{LicJg~A-F{oghfZxqO1jbI!{;HS{Ke_{P}#SSwX4f^1mtvTapF*0 z&Bs40nO*)Fw@4S>)-$G78HwW0JJrT--6D>Ad|dN)ehCy;`!#S+N|G~cglC>y^ZA}9 zJ<ok8&uje7JgTPyu$((-m){+~7Mp)O8uz$qeRiekKXLT~!cj$`p4T%mkDvR7I7fvb zxA$$3bDO*MdwAgRf%4<0$7yI|@{d0stM!a!<;PDRt&y#VzaBHrla;@H`2Bu=gQuU* z*Qxux`*Qqq*ZJf*{`UEvkN2zBuQ!J0mCye(|9ypgFIw+&`|DridsTnFHT~YYKmY%J ud|CcqTaUN)KE5=6|F!q@t@+_geE$tgB%jdIM1C{?0000<MNUMnLSTY|r(iGu
new file mode 100644 index 0000000000000000000000000000000000000000..b10827fcca631b671c46fa407d0ea62e38fb94bf GIT binary patch literal 60007 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 JO58Z`e*ohHbzA@d
new file mode 100644 index 0000000000000000000000000000000000000000..57d482e5eefe37bc395efc5e8eec876aecd8fb33 GIT binary patch literal 31811 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
new file mode 100644 index 0000000000000000000000000000000000000000..419c06fb960b0b665791c90044a78621616a4cb8 GIT binary patch literal 165 zc%17D@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&i3a$DxTeiKV?6WB%rpNP(#|lX z{f7XTR~%D;3fN16{DL7O3{u|AZa^UmPZ!4!iE!1^jzSC$EX<BdumAhsJ17$(uQF>7 z>#2$@InOtpuqyg8<+R}9g-+|v&13&5`dCp`{|95_8^+nQkC>(b&0z3!^>bP0l+XkK DO07OF
new file mode 100644 index 0000000000000000000000000000000000000000..df392c5ce789c7dc93b017251876eeb8b7e416c2 GIT binary patch literal 58102 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
new file mode 100644 index 0000000000000000000000000000000000000000..d2e6a5180d31e22c4a2b43b87227db08c8c7160c GIT binary patch literal 68953 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ʹkA5Y>gR&pALFCB{|q<@$0(>Z>T>i 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 P!1JGqj&g;PRp|c*q&kgr
new file mode 100644 index 0000000000000000000000000000000000000000..abb8a72f3080e174d2c957688686bbef9732aad1 GIT binary patch literal 60421 zc$_R+bzBtR*Is%_mk^ea?vf4(>26rMTe=%1R&wcvMY@&-X~d;Fq>*kUq(ndweth50 zduQg(Id}fLXU_AS^L%DvwKNp*aVT&A006$SlAI0zfcl?(21I?HwL`}UpKsV6N=DuQ z050)=7YZO34h8^FR^G|VYH2yT`?z~Mx_i(n%gWMvc)8oZbFl*e0>0O#e03)F1P{I4 z6f475sR5V7dqjpu#6ru_BY_6N5Oz#euaArxKg{0uuHUqW=)RO6P{(>gYopznRjxD< zGNY0sJYg@URr0KqP4*T^k}B%FL*f?P8g1N$nrj{A^_;VYos1TG-52Xu3xBS1Em!tV z7x+=Wa7(7IU)NOcx5)t5ILPfe*Al<Byj5jxd`I<Xp4vQMcrydf=>{`~Gx=Dq2Cb?k zMxEAI_79O9nUc|ZIsOhoGXBIEeN2T^6Y(W!vT6L?%jC6&H$($iwC5`lFVf#_!Pk#X z3Xj6<Zn?<P=`7oScH)m2ST0_nVISjpbn3f1ejAIN_ISjuoEqqQ4-(Rp4)WWv>*>Ah zy4cwsSQU*048*Sf^RprVc<uqz7WyuR8I-!Am$y7r^-<gP4ux*LtXB9D32y_jFDV`u z6onNfx>I=1hPAl?dsZT-#O=lXHm~^JZZCuDepqhEvXSh>@uAad3yyV^>3rLIJMN2l ziT6@u?MlBIiN~`^zzwnfIcmpmj{v8SHp<0XKj?;C35jD_`aJDUZ5TEA>Y{Si{cVdd zui$9G*z`9xa$RYjvTx}K=^1dx1ApwWqd{qSe)F_8N;>KQfU`9K;3EV8{8j@1!hb#c z%>clUTL6Hk3jiP|xp0pndiKke<)rljzMq=;!%5_Se}F8k6AK-hks8jXdXu7~py5P> zRa%m2fA|#l$w<7P{O5!y99vJW7oEL0j8>UZdFox($4O6n7T-$5CXFEfDzTptNJ8^4 z^uo=rysNXT^ElMv{ZVb(Mg(|}Re?878zzH2Tu%FcmNiLa^#8BoQCpLg{AX9Fq~5=P zCR>3!>lmOKt|C(%lTPyBfA5%qD6_t1&e_CJ5d8GPgZiFrM@GpMf8Z(p$=W9<)_aQl z5UFWJPK*9X_My0Kn*0!cdE~yL`LwUR1y|&hhk_J<xq<HDJXr~KhffD-LjQ^z+Z#83 zZ45kkJxRJvHQm<}(}C&MSjE9nDY?11`T3JzF?l=m-B2uoKyh=}6Jt=U6<Bn|s6%uG z#tQ}6L`k!iz`P0Yt2JxT=ZyD&bX!#DnU<%UT%fhrK!Da3I^!MoA)I$AdyA|0#%@O& z^njUDN7cjgq2M2uk}1wdK+c_HYS$;=t4YOw3YuX&nZT5n%Je$T+9&{!EZl2|wIrQy zZZ#<gmDw<r(I`ckWC2b&KO@-B!+QAewdoU~Og6|U#a5Z`t0;l#lCPQYgC?0Pgl>)% zY@<vcM{h&oTj6ac?9*SE?u8k4SO303JCMVDnV7i>$4U;EvVZhC*URZ>o(FFzd--#v zl^Ok<<79^e$$k%rRtn4@$I}NC@fac}c8*e9uj-ENa9ixY9IB}7@M0cnuWMaA^UE>v zANlp8bEC;_yht|sF?XrmYV}jGja?Jxljv5_#{Ti*mqR0md<+1UPjt!9woi}*qK+Kq zHHJas0DyVhXXfz?K`o7#NjVx>Q)@uQBZkaC8zj(bAPh{!x}V!Cuy7F|xKMpB-Z@=O zk=x5^lm6F2+&u)6O-4nenv3SKg&GASo2>!xxLF^viU_?hOMP5mY>3CAgE2_;j^~iQ zaaz^`0499+sX$k<N@!$!we}>PO@smuV<k;YVYC*ck-|VbR@=7AnfyqAjctp`9G{MH zn`;Vn!Qul(AzFL;lD5TprEll)v4lp_!HxF%mcZCgCiE2|mv^E+YF7`+Rbo?0AY$x^ z)NFMK#LfM$un0n-G%5|ZEQYi-WS%6Um2Kn5DEVmZ_q|r7QJ__>B?;AAa~(Z>i*r67 zhO0O*9Uj<9j<I+|C&b#+UPECVPKB*Bzlx};Wn*Wrs;Ps7vhS<aj7HrKPONEPIFRrb z^-i~M+b92s9ei#5kq!Xmp@pRkmY0@S>>ad>e6En&$Tsn(dCgtVS$!2C4$~QuJ~ide z6jKam8lv6%cfqO~r`7*n1_0!d2@4yMYc#6y%d1g>>r7T7Br_<|`EfYg2M7<#&xR@W z{likAkE9s9eH&tNJsMispXY$5mZ<HLr++<s%F-WI-Xs1S6*V8AKOBy})}~Y;%HL4{ z=9dhX^bD3noy^>lj_2?qwTH3`q`d)&VX;gyJap))O^h6=)=Ze7{83U{X)14gG-fKg z#N^&&d!7ROJMrA5lAtxjQc0D$x-LFKcS?lJdl{)6*k3GAUmn#)BZaaR!_Yi2B^?7b z^#~-kA=qcLMnfZ@XnSz@*x*Uf>&vx4pjgxuqv$Bcg8PCs?h~O~;VynR=0|ZCk^le_ zeRanLbBSoy1^ZG6cRBC<IY}kf=b(b6ZJ&jOH?LZJr#gd@=4u1Gqnvmm71pg|EKMRN zRRx(e8e1BckwnF@UM*8b2Kwga`o{Y=h=k<=3SvBM1|oani?E5xI9^or)&NQ-P9_dz zP36oY>8R?P`OJ(A8nO3lKRmSifiNg)6Hn$#a&IU|pM;Hj!>Lh)2n7>UE*h(U*LP`g zJ|iQeYu!x+Un<)&)>8q02)ql6^^N3Zmg|e*QDDec*u4OSh`1Q506{Y73?^{1!zc+R z?r+o%7=z;UX#Ga#HHaEcF0R^oe_fTFhUUw#nn6NmP<MccxCcp}Yl?FC#V#=|tO05l z&uQ{fhNog;#z%GzybE%g!>uF+0v>|%{|bAEI0|6ANSXOK5uwfcNw7HFb1TfYG}<V% zbZ%PfUmB=MhulW80AWZH3-XLPo@0z1X&MmKQVEq@aB5K@BDIDV>6$HJ(?wYsa>g+# zYrizFUt-~C0$;c34z2(ElY2ayI!omLMG*o~U&0?_-Ib#klD`c4f&|dHH5%^hxKP(C zrp7Q58>QHNR3cSwwPYlWUaehriCb{vDI~#Df#m-Q>0Bxalt3JR6DX)Vi7Mh(A@`6H zM{;ZHF6Me%VtP&mT7FYdu^o9WtB^H8C{-CtBL9W;YM0pQG)n7e)@8yzlHwlYqgx*j zP<kfJyW1*0%4`BAfHD-$;{kBe8uCGMB8?};h|4T1*Dkac&h+y&lKQv3L`}IX#&^A( z%_nDk-N10K`54+LfObBDx?uIkZ`*d)CYQv=Eg0Vz)GwCMdNMUc>ofTQp$p&DR#a9z zZ(Sv8e0;p7l1e&bv7xPesut^<PnU#bebO<e$F?~!e>{%@5uIPxzq`g_L1%rp&DP0n zpVHD&xS-cvg0RIVU$dP}Tdm>CYBO!yQN<WW<=i?0{Y)BBACJwRFN4ELq9?Cljd$(s zHK(NcZ+w3)H>xTGWiB|)`6fg=6N#@WMu&N802RRGQQ<rU+zEwkk=|2yDx&x%WO%G) zQAoPxBbuP_Es|nZgCsrLh!Y-Ki02qS#38*H>5N61QNaLxpm-w#_m%=;wCpH-lsq1H zb*d6rV_-%{>-)x-ORHpQ%VRm@j{D+$MY1xVHH?XQ=*97-!*oyN%?)>B@84gi`no3~ z<~ng8MiwT5SK^k#bzi3b1j)n{k+ZQWOLY0WrsP8oYc@XzIz!aeOUY9_g<M9E5q-sR zh+_r3!pSdI>Ps)>6Q`mH5#IB!xZW6>oCpX+>Zp)AAhGF&6JK#~vYxKiC#~CO*jCjP zpI-FJ9)1#*(P5-lP30u~2qGuWY46_1`V{EByyB1`{^VkiuR2$$x$vB?C*L6T<@Y|a zWl_B%Xxm|csehzJN@aP`;3%04+>JueMbrXC!)uJ3R-@1M+s<!&R0W(q>=zA%d%S{2 z|5c%wU=II6LZ2>QvvToGi-dHvL|JG1U>&n8l23)4pH+|*!v(MvHZaM`gO8U~*BK(& zHg|%!Z9o2UqtQ0Jf7ub*sVNB6-Z&@T!EYleE~gz3nQfmwyPoe7ck}mZN(d7SaEDPw zwTqXf>kQ?l<7g9?J5b|W2d2NndnkS9<m+p<`ui1;?#{<ulssnLGV`ptGtVwTb(?um z2o8hVb16}=mg)Ompg;NPpPRn@K}-sRm$B`_;^Jdd;PqZS_rImDkD=?nOY(wtCY-60 z2-Y~;7Q-ZJuC<28isu{@J$5qLJ7}G7U6K4MAv1D#lbMw@S@4unY>4@Sf-m5rq1APj z64MSA#htCy0~4W3oj$w?kWf}0eIJQMbOC@{so*<l_4D94dBoBIo8;X*WS7`vCa8y5 z1$|Wh(Tndch@^N@tr5Y!S1QI3Neob4g)mmZVr=@6*I^7_&B$%=kZk)(FPuii|IqK_ zi=|?jCKTbmJ+^l9@DtuC1bXUN!^ElmeSI-@spQFo27hj?kdLxq`#D*!SI|%!hN*3O zsLu_Xd6=JMcF?@P>YyJFtTi_0d$;ysBVQIjj)!8tetIvKtmpc1ZQ-r!XI8$HQdQ=} z_@t!O=36Oq^Xh)Z#LP?sTBvqqf_lYg_j77r->KOq6<TfeNR~StJV)(xjaREQ;(C^M z-y|Or0>nRk|Nf?Jm~19iRME28==a(B-^(@4PQPGwCc!BuU4r_zcMsR~iFrQMnN0M` zN`2X&#AKA^-35R5&4R4WmF-^;$kN~L+~c`tLVMR)M=`NAVTrQ%Gb>TF0rSM6{gOq` z0T>>=)hW9TUPgY_PP+gN{iXC*k6vFG?L&KT3J?ju6&q0cnEb&`X9#adL<=1+3{4B) zCwkh%;M{M%BcGsc^@nGd1j6LzUe8K#2k!Zm26&(GVIC+>%Y#=}g&01&Y+rY>?tVoK zzy_f3<da8jx2f<Ay+;d(DJGzYvX;s985!l2l?|uPrPT=K6_2z_*M2iIZ(H5}-5EMx z7=zYpm}wh7=+taH$3H9VX8hJ+>ePE$!r>tD#joR)zj^Yw!)7AeBipi?690aM-mYh* zr;EIs9ZcEKHcH_XQZ<GD8>ad2;Iy43uZW99KqX+kw-V^O%FI&6u8%9TJfm09?|FLn zE#c(D<90NS-}#21*ItM0G*vi=NQtU5lOmli@;JW7JUKPj@8?mYdBHH=i!hPvXhN<0 zA0&8ev{)WnnEWvViByXYUr(A@<%GjPYHV$WrC6%wO**e}j|OorA|s<n2&jrHoy^R* z1YzmvdP9aJ5(}jP41l(A4B*br&O=a0<%>MURat3UVAke)32|CEUwz{swVOa!A<DyU ztLq{Vah)`I#e9-qLN6K})cdDb2Z?;6At$|$VrprjLj*df=)t+{cDU|P12#2CriI{; z%;I&A&(23xgBrFs=Hh?Wn%{5SjTc3f=*QEm>MU`;TBp{Wb~6)l+xU4Ic<pWS**WcY z?8C-ti^B&e6+SvS(~&~GR3M!kM6l@7^y85(WC0+}gVfNreQxq2tzkSvFkV<Ar)qAw z?uR2n2B;wysrs`jzzSP~*Qm0X-(69jiyoV$)R9ePmy?@A7JL{SJ;<tOoFJ*GX|;YU z)>$roY?9wTrNg1MaypEO4dZA1P*(jsE3GV({?xr2#J*h%<mEz?2BhHl`VS)~gOm&n zcGEXNyhAq%b$jf)Vx_dycd;M8HwTt>C&|>lE_zt1e<KiuIGAQO$|zyxCRZ1;$G0|! z48M`%WuL_J+FAP*P`QmlNOmNJZ|}h{BIv_IW$qss=qhid?&|ubdSmyxGOAp6-4fH8 zC+%wJC)US%WJj-{x^5_9y22^SUY9c*jDjHVbOXyE%3xlkn8DqIVnoot8~rOp?rNmg zuxI+JC@%*bDvyq)$|LIP(o3mR=`j*3-c*`rt)BeWS*Ham$62=+pZW#MgoLO#;T)c> zx_>=huG*z^|B{&rM*$Q}Jz1Y-U!HyU57^Hzh>MFe5BgEI-5*_E;eY~WW<g<rGBUBe z7kav0Y2Iiw=Jen6enR#-@I)OSQw87ttgWoHgqM|<wmPkJs%Cxq67>5O?+)CkdBeP6 zOSfP;__wGH*rsTDkgzY65rr0V&24mbmNcG~`0DMquSBAU$OjcR1sU1vCp0vyt#DM~ z%5a|buHm^B-K>a+PHzSKdJBt{H?M!TEd8Fy3wE~-iSal?RK3;Og*6YKZ*-K@)&1E~ zt-A;kk1F!UOqBx-!TI}n03haU5GoL_|1R+CIDLNpF>)F(#3m?mNR+}egcP+=YtTAw zbF-Qvw}FGO83w|2`=x;VV~ol~M6Ha3fEi!3Fk;yAGqfQ&^fzNo=wT5DO(Xk}psRp& za6p@zM2(QxVLBQpLKLf?2guw+PZ>2O$}?1TfNc{-_pol=NF@>E^ZRs#QrJyRMdi=m z%_qrsv!x#%c4=OT`N4%;zkiYlcI&x6a3~1%+d_sHg#KQ64)*z%+l>*x;z*^_REONi zYm>GDVW+zWe$1cCUswd0?0&<iNsNlqTix><8V!34+wY2T6)Vb_I}*EIX;fH&&BXS} zNMGFseQDw};T+qGA9{0QHmV$(FV<?&@%!*Rvu*%v7PwMMV^F`^8M;*29OXCWZlP-; zT<EUZHvD%Z`Wh#Z)J)_Lyt_NoyuRKb$qfQopqcph`ExNJm!REj`}Or|TWuvG=lasY zcj^ye|I~<UiuX0XLA`PF`yX)&LV1Fxo~$-ez2FicfDQ>Hjv&ERBI*MUvKSMka*}q@ zn=k^Th=f3oM_)8EIZZLqEqMPS_!aQ#t2`+wyhX)*Ayb+TANFnnz=vXOF7M{*`pXQ= zxW-i?`Po6d=rXPNxNd@7FX=OY#4Nj(ar_aib;k1^`jv;ZYym(Bs>~LOyp2vmY`-{k z>5}J{Q)0i6HPYiYYgC1Kptn$e9O@fu1t3@(#>?tA(bYE4Ha0Ri(fL9l$m)OxKD0j= zr@RJVkBF!`X~`}LLYDAUUb3T*7D*%Q9do&5*hP0?moth7-yWvL<8)b6vQ?IWk8gPu z-o0bn-?xJ%H_htgtuNL(yoi@)2Hul_!JT!-h$(!h6ec#h4X2i&;bA7m=Y#pP^OE2C zA74eB#EHkP_0M~FfLBr~YH9;uG)MjFo1b0h?T>$+Ry%#iI}Q_3iq8N18>FH`2V)XY zi=R$dk-^9da`L^mklVf|`tA>bX0EO+jH5ssb;$0{PVnsy;gGu#jr=#$@cR*#f{7oS z9{^>&$jz`p5>F>^nH>|nU-ND4T4N|Ktrp4nCke6RW2fL>rwqUGWsoS?uZ7ECd@AAO zk7Y>myIU_EzQEhb$bVR+AvZTEcLDE~xHYr5v0Dlz3~GXs$JqfrLT5&K1aSU><C~yv z`HvXBiJgnJtF*BAxWu6DpL?b06E!YF*-N{k@4JCkYxHdy<tK=8Ww|$|9z0xJlWs}X ztgq|q>f(};G}Tm^h6fiG^oEBA`G-O!3l{9tUY2!sHZ|37GI7<~xmEY|MNA(|{t&aA zNv3n~oWf0{Lftxh<5L=?ZD8;W0$_@1UC@7pXfYz9U$S19LyU!v?pqSbN{BSE+dOH~ zO&DBV>uu;Nq^6|qI+>d>E?j4^RBraSs9(X>)_%oB2y$ZtOlmWl=-{NgNKQ`X`S2J5 zohg=&Cw*-ma=Y%|=Dyh@8%=;q#{C~=XUkNDUB7?!+8+x?!{Rn<u>5uOO*@U!kT&3L zUqTJ{pZE7=#IH}6+J+6{GuzkPl<5)W_{W=V4HwH}Ehkg21Zx!AxS7gczRZBc_dIPQ zs>lvoM{=G9mmq?IarDpj&&>38k8iWGia0EZVo!(oCI}}dlh%<|quNgC-QCmmP9M`& z>zgi`sji1q>_eFN_1p8Q*!bobr>nt_Sr+bV-L8LHbf>BKj+#Hlb5n&TT5D5>oaS)6 z&J*x_$ToQ7cm7w-wch1>f06c@oxS>{JVBTDkcbV;69>tQsVtKUWh6Ip9k5PAR99Pk zxIeoa5aCQI!5H@KPd>vg_|UW!J;*`xVgCmgW$Q#>u!fhh&<>PB@5Yh3q76|~d>8Od zK8^YI{H^6w@VVRSXU~}&1_5<^J2!DXnHP<BP&uZY9F7;ngM>Rp=D5_>N;~3u?~?>9 zJOCmo`LTH|Sk!}M6O=b)(LuU>yJ-}c-IvU09g#_qGH?MP0Cbc058nxl$qyhVFrBMh zs_r`Z;#M(iaxUl-SwQPr_wJVroL{BN3LNEj)LHI{#sCHQ)H!#SBT#8s%hIoh0ALEM zKkCt}a-#V<)MR7@d8=1<mo`yFZLXWLt*lLQJg5XDC>}H9{EQL1XZr9@YB3}<G-O#| zvI0=OVQIl)?LV*HEb6S_+bId7A1mu!{#cgL1g|(b*EY-5Spb@c)b}mEEm#CJ;<u)S zmgtL2q|RhE={Xsq*S*mM)a-_T{@spea!Km@d{&(P<bd}oH6=xwr>?3>^!@2w6#j{y z%jTP7__s(b{EqD?6LtjRIRC~zI=sPYeo4$CVB3NyB}NWN2eeUn=cUtUVDUZ|4*%Y% zPA!PHtu2h_6!V1FzlAAn==d+)v)?kxjdq|KVI~{pW875Qu9%dbOTk4ay^R)?Jda7k zj4FkxRWRnV?9@mt($Lnkp{;E$`3$UPg-^}<S@;VJ5RD3(oq_QtZ*Q^?(aj$ohP8{= z!{&_RUdG0MKADO2{0r*+OzFnW#r0^vO$OebolX5I5v0*+JND2)qxNOTIBB@+-R`t( zbbcA-pJ&((4i9E!WodNoc`2HiS#1-dR|emjcln<!cLlT941uOA%_aVF{`oVGf;K(k zx)3yZ{8A$5*X4b;#p?%7evU&JU4Lq7Dqdt%jQYqxN;oCvoNwsiZ!S6JVE^;)J$B7j z;Kbb0VurtIL`1cuxC{7+{TQDvx}#w**k~F{o7?)IC`z|%iQwN&cH?#JJ8@(dA&srA zekY5yS!RAK&-(88xpg5JMuwwNUQ1{VDal!K*o3V9Hakq9sAHWiw`k=b^2vYZCI2z^ zx4}OvAdr?-|DO^zmS36P*3iotcUt?(+ugJnsP!EFehR*yG=eM$0vvBT6E?a2^0IJT z|5uvJ$}-a-THh@PxY)R!oG$t5r?YZCy?^Xr0QG@)L$O|Pne_~9`y8~mi59xo!#;m@ zGkZh*n){XKLGpZhdQA-;R7<^9cIjp()hlUO7KmN``tIx<%ySBOpoE%ZX+)R$tp3@A zVwDV2mEBGjV`F2%#ESVZwjA^4+TKsvD<;@n8f<1{rDwc)E!usn<mTo)mR(1QKzLfN z2mLw~_Nhc5)`M?WzWPsZZ8LyNw%<p1@CWrT6<t{B&_*DlEG`moUWjM+1*Tri0Mp*Q z3y7g;jH5X0OCinHg<=(br$o6Xkb(2M9YxiV=h`3TO5^A2kXrS=6%CMj#N}0BTVS*6 z)BvE&`pDkAlZ4C(<WuMwV!sy@m-Cd5YDa+D*WK!uRDnb2OI^p_>6}K)VPG^gG_68# z<YalN1LIt}+#tP)tNx(9Hi>-S)pi8h_1i}hx?dZ?%~MoD*%68179lH86ZbDRvrNQw z?e+-8Ym_h)lCU3z3{qea;N{rs6rSG7&ho{Ro71(9mb$v%nI`ThtNxZ=PPrG{mavoj z#D7@7Lw;>z<q18`H#^k#V_?AeprAv6d8cR*hqxM$OtMn>cHxO}#nd`cS}Ht|V#<Vn zNG>Kf`@=d9-eloC50ErILdVT9$_gwfxIyWD)Dsdon&V*q?@HCzt<Lpw$L1Vw+j0hE zHzNhJ9?G@?lg7J_y_`#Y#dUXetr>+!F6s8L7tz;``xWkgH1jw+yAyYH^>tH_m~QVT zP^84!pjHZK7V=~NGB$QI^sldq%JDPy?hmS`Uz~3Ci_R}B9?uuf&xDw(LzZexzaf0{ zIO@9nM*ZV^?ys7w>$=z^7`*!iv&cIekE&lQz{HpK{kR^i&CfUf<=+rMbVUzy5qt`& zs_~-8Wl!R{IerN@vOW=ZaoR0Rn{;x_g}3m3q=!^iRAglJf4lGVJ2yOUC%8;n??TL{ z$Pc%7dPp*VC1+;Zx2=Bs#?HV{(%LG-!cqaL)<6IH^gblyVL!{_@u(zes^INcyYb9g zlQuVWY7sk_!hr;BrGIeZ%PecCxFpTc^2s$m#S9Av{~3ZUjk_R3TSg{C#mid5PygE` zk<7?J?P^k1`Ud}Q`L{#(&834y72?=q-bSWD&XFe!80Muwz7PMamjR+5ZyG*SRf!?9 zw<*vZL?>3hy4UNPWFO_DTdw{CC_;-)s@d$8PX)?=G4O;^+SJ+lvpMu9*p!I0Z6jVr zFv4tO=|AOWdJX=nA~zxr8+}%-Z7v)7M&`R-olHjhX2x(qtF_YjG$P%#8@DNu5*P)E z4PMOrq6nTDSxy}M8k9yOd?^B)o+Q}UC^DoWeBhu@2>?p*I99F`4q#AItBy@(;%~HL zf#q9FF?MwG7BT5Ts2>~e6c_?E;jBnXB4Jc>N|JdhbnGOE)>P?x8}x*WGU3V0juq2r z5G@kLfanme(_aV_QIsq=xIsu3Ae?ixY*0U`&W|uEX8+KFN`Ir8o>LN+R#z9K8?kR@ zVrI(Bq;_8yQq%?>rsLRv9Kw<p>{INp0WpkLv6eCbZz-4Wf=e`9;*Z}s+{K?}=R$*T zZ>1#;c|yPcYJIg@Z`kAYcjL=nzn`ia8g418O`qPdF4)lvFcH>9f)wH)nReD~s}&kw zWKxx^b(}msNBio(vWt6V^X8`IKR0Sy1h3vm@LU(=em9P1n%ccY@Axn>i#a9A$jC?w zTXTC+L4q=p`q1B0CRtyhd&rH@ym96ZV-*}l=?oW9Kw^jk6Q=C5mZ*M_o2~@TnAE2g zt7N8RIk^~XFlFS3lzgL4+Hd7$)rGW}brFmzvoW<RX{R@(rn-~8rsDGnuvZXbE-h{n z7Zn{WOsD7sLHvI%FE-h6bV+F3Ah-=e{WR(jh*7pGn5RnBpi>49uaB8<rPWMsE+R3% zbADl=#d*{72Jtegh#2ZCi&c*WDy?uhXmQ=F_J0e3yd0z-=POa0gRIX?gWs&#w|)J0 zFz!G=<2y8Cg+Ry{X4kP|M5YvxN7WI-HUmy1@+SYxeHSeFAY_qRnn1a@F7WRd_jPW1 zPL3<B91pgMG~GoZ>)5mG^FQB^2)Vm>7TsoDe(Jdb*Z@pC@WoF2>kY4QuFyZfMn^^h zwm*`&b)B`gx3@FTQ3sT2q5|Z`8npOCY$E^M-n*@gF^wA#(*Nl6d)j;w^6_};(<Eb! za{>R_+V1-ojbm)<pprTu3WCZ1h_$?Pp>2VB69`pj@E&+|h<%=X?vRh>E#c3#jy$U9 zo$+dG?eU3Oi?1(1^xVvkLyORO-qw{GV7MFjSz60TLRyS!x5+8tHW4m<qdct4=!B?H z4;brkx=p|3@HpZGqQUl>qgu$P|7>1YXEy2d?R>NQ)924V^-G6!{$0l>gRXpItov?R zxD2R;&ncLiHrF@flY%nbZ`Q)<5)G&Q_V(AJHqXS+gmWZzF;G4}Ebf!~w-_xNu6-`f zm)v{?+;M@gBBYkvOEMIpXN5y+?Ar7eqCC*-t*7_nk%@!{RM00r@cf>pJnW}R?ACYj zHSAu|z8Jyzpe>{vIVp~0!SQ8)1a*D+aXO|hQtMhxA%T`N$tN6oNI5vTGB?XVHl}jw zdD$9Z;%mnw#WK|)%_j30pu&02e=k3ThK32#ogwFSYv1ooaY#B6YxkG%261+UZm>_T zmpR<(yRK4mu)p8GUovTRT0yAirCwb@Me-JkL241A#9{4>R`HMnxRI-8dQ(E4&}81< zp5a|(b@f3o4Hu_jm*2iTG4l&a8%MZA@3s%7b!H#U;!L2m%+85>cLK<`^H<ljWd8Z@ zcKrUMnWE4(H#5L!=P-jcCHYk}cdQordLhbd+zQME{MvGJu?pc&-_+&NwU3$5J<CT` z;De!rJMioclq!Tx27$&7NGAC9bglc{zs3@bl@%@mnhgu%kcpX_@82on7liI${BJ*r zIS;p5#K;+ccC4y8p695qMz9v#Oi>z`hla+Ja^d0<xc{}=UBZ<-N#2arJ@)OoJzwqm zaQ-PSjxTTFdztgCV09)-MJcCAQ@i@=Z@(_H)R7{zzkhyHE+Zi3%A=QV5<$c=fb8-= zIEhr;B3_P9Jra>qV13gNPA&-vu?qRi%MutqHq;dBbKnO*^enp-qw~V~WX917-TDIx zuLGmA?=2RM)`4AquCJ-yKF$=OLgr$iv2p>#-_dM1#l-%u`)}6P*8clZQ4sX&DDd(A z5H}!TCzj>v>gv=l*v)NRQ}TWf#y{nluGo0ggEd8NGvU-|sRp(|l>48oHL9PiO_PS0 z7@O0nrq)rO2)U7a9u&HY-QvAk`&wGFX5aGrcw@gAV>9T>#$7-cqbj`}C!Hh#og7<y ze48o}p^Sx}{h!iHGD|4t?{kT#cz3)>9-k8R6MZrZfgx+{Am5WW&QlL#h}`L~kMF-{ zWNieF|B6F6K^A%}dJyfUpAnsY&#Ujh1g!L+MZaVcm`vqkq#I@D#RtjYF%TeGhu`>j zK%z@}rnYUi1bvPxeML{GUY0@7Fbh0wpTdPLf*M2L_muxY!+g=Qy4&rRReldX1m0~& z{{8wCByDHcF?=TJeZ`uzG)|7c^a54ctq3nQ?^i4^5ABc;+rIp}5_6s^tL}cnp1J%a z7w{NMypxzhChd;0uZ@xech1mO!)936%6bQcAkG;c4*O_gycKQ*23rmFf-a=+RX)zD zib8Y8Wv+^}l&1WEBJ>}wUiBAW5y`}OYv5y23FHTUkxW|M_5JGu;m6ZXD&rj)P(L;y zj5VebJQz~|GBGj+u2By;Dl2=&XNs-|`^kbSqk4IX{K3f_AfQ19%_19M32*(A<4Lf> z`Io=9AO3thWSDxj&>D(`Y;P+5gWN##-VA-336H#;>i$~3Xyt)cA^=V1<o$3dBL&k| zOLj@IHA2)@UH^IR5pp*hZ4Nce{`@}CWPJCuAwelzr>Uai(_xz4baAmZBVXq9eabAD za0>-3ikXqI=lXY^Tbr1K#Ogl6f3XXMS@`~?UiuJDP*@lPU`Rw5ufO6x1iliN#N@U~ zNLmWcl#WJmlwns@`zFA}!NI~I=CJ-fBbDC5<59#&o4uN&&1Ge+$@ded^5rEqgF=4W zyWKa?nZT0aR+kmy)P3(M$`VA+?r>bt?_&cK-Ddlnq>heSJqVNB&vk!fD_7p^EdMl^ z5AJ=mQvJ1m`|kavaICWOVM0%`(p4dU)Y)oVm*!^pE_ZJCL-hH3!{4s@`WoZ<wZXUK z4bF$H(1Frs1-L__vH$tn`@0!wqs+hf;{64aHdDvAF0?Yh11$sHTEkib#a95m^sKV7 zQq#bNmZ_lOT)`7Yqi5iPx|l@8#i!P|H0C~Yn{~FY|6Hgx*x&oye%hpJ(&~bNbar+o z<9={DUFOZnF~WL5z1-^hx80M>xOUO8$oK9iR)L7AVX54r=?+rlWKoocuG?V~C2}^C z%gf8V$?tT7<+#XeDvg-9%l9nc^HD%n;w$5}sePFHX2)&TnHcZTmtddTni_7-H*RgK ze{O#?I-iH<=63Q&<B6Dh{5tx!o5qrOw(w;<N`1AdnV*1)efigTYfx73cSx3><EG#E zV*ZaGRbqZ;tBt|+K+7NVjiFDH5`+;97{fvjO$plHnd=t{A47kiz5N`xN<cV8$yi`O z>7!7w&CvBXgaT`z-NVCk%yYD{X;(3Eztwdbg}igSrjG43x7$kVmqBZ7iJuZ;tzsv~ zI{dRHZR1&Xst}__2|8Y0(VLU$1Ldaqp3vx^Xoj!OZS%j>>X+iRe4@|lq0tS<Pr!h! zgzQIcM^*_qyEs&yDQB6R@1>-(KEQeI0yO4O(uX#r-zCV!Q3f&hb8}PBDK^UlI&A%R z+_w{y|HxD}`0{6v@XJL9>LLySO6nLGaoUczv0clQb4pH*Q=18ojCp}MWM9NwFQ}$+ z-Uw20g6RNLRQ@2iG%A9BK|60@lxbGi2`z1xmc?vw%*cULxog{QGi{|ffl#@rVvu-a zzL6BLXZ7tr^oxAHP~z{e&%=WYi}OFfw-VE33xx(PQA<FMomV>L<JTtkO3~vvV;TAA zj62ph#%7O8Fqq29GH!0T^A>V*Q&E9gnHk5JuHWbtnM<d(E33U_O1o!AimhQSE;+$> z7d=f)V+60djyj_}c}9~MB5H)3jTOAcyGcbwbFi`f)Ic^czW$11?uxGVv7Dx-3sFU! zz%+YV^ai~|6Q{;ia$+M|`d70jHy#8+U9YS-#~l8INXl!=Wr#k9n-^uPvu^dwPgWQz zsH~q}Ya;aT^TBYQ`<FDGINoizcI3NU%or0_p$P25wOvo|DK64@&T;BCN-LL^6%egT z)$nesacwH2_ZCcBeU2oaUYYOE^yVJVsc=RwdkZ?+G~m<H&>(dbe-J|n1Ena_mVfjg zo1Pw<;K3{5-9&3POmCi+41Tz~l=c?{l$MsFdod(DJS5)Vzd~URBkUCv2}6aW>}orE z6T#YkF5?6A<K;6;cL&Q9agx5*=#yNeEzU1;n=}p;k6;nJWNl(pp*5@}om%d^$zxL1 zAu)n1*uAZ5G2&|C<g&O=d)_kvw2m@9tIiV60H|J|7m1iY`Fp%t2J?iaOxnK`z3uva zy4mPlz=OVAqc1bk+mG>=fJ(=9#i{WkMvr8uL!m?SFrDAbp;JRJ10iXqz4ONJOj{RH zLXOE_IZ3_QVo=ce-8gI9wZ#ZC2~3CcN|Z`N;hlMONC5(o>jVyx(V0aSF;o==hnQ!L zCxARGSs9P#Xe!7)Spia{@9-b7Npk9$@5tRbGs1-F2lCbcaABgO=@P53sz+GIBF&3S z2sFx0c)-c?sYG!bhn0xEm}L<IrpL;cM*+5zkp=}~0YMJp;O)Ljiz64JOp5)!-oq4I z8DI)y1TU#MQ)J|HMd!L()_84D=;NDmby0&EW&Kk*^{ys1K^<LPla_bNjD(Zpcuuqw z#|=Od8!IXiemn*Fu=3&RK=Gctfl@My(EDhn@x>Zbh`w=VN{Z*>JsBQ#NK~m|98Nru zF40LowPw?_TMH37I&n%k65Nlpi)D?IV}y$MzsZ*@nBMl`Hh*ZD+Xnl88x&pP@==f1 z;fof&>J-HaD=xO-@?N#IYptxSW&rb#MY>a=lt)Qd6;b9Qs+wM)$>i2mBMvVA9KYf= z$geJ54BQK-D$m=HY4=Pd1}OUBswU?1m%l@>wI-t}x*3F4f_~ftO7ud_F3VQ;uS|wa z-^j4Ch&fCw$FI4Ol?Ws^o_}E1+!{eTQWuZ`Kw8JMH&N%I<^XpOnQm%^S?s8Yj}oXQ z&bbs0&9_Gj{8}?i^Adz3w+B=t*t#W`#T3Psf&eTnI>rKh;V<-D-;Zs3eMcVz1q0>> z-WEZC{TxF|4ZE1+<aBupr~skr0(DhVdV&T+5}+O)$*`8nAQn`+_nVD*fu{DJRQFpJ zD3yp$X%k||x&;WwvrlAgqS}M(s2Zip9hlh~Q|(R^uAP){x7ATbA+*&61t3e1ey!)Y z!0%7i-yseV{x&d?ux9{wm`Ym_qtsW`qD=8-UWxhYb1q&r>8QMG=tNK26A?$G33Ypk z;MC!5WH-JM_#`NI<!-LrPP~XG9896*c%{H7PK$i(JOE<7afrc_nlkK9_!vkQv2WeJ za)wDLn8IMws5N7VY;T~}Rv{Mz?;y$VcC(>2oph^joig$iOc^Sr=Lga0(Bov}?pP1k zW^$yTnZb9VYn{7ox|#yh4kl>sQ2Q=GDk1toh#DA%v~J_GEG}iWq0(kI=i+B-)JoZr z&8a(){O>c0ICcH_zVAYCH#N<U<4CfV13nEl6?xS5Wq=dHdHp92C$W{Vch{FoPrn>m z+KJc9JX4}9L`{Z_M)W|2sgBj%*rcQak!@=g-(b_!;oV+VcJQ^rSt3&OaR24YY|s;_ zP<0EEtt{6*;EU6j@mlgX3sndw>ZGN!-<>DxZWXIs9G}cXvwH&=Bn7vN8PcuPZMGq< z0eYTgRrntP;5Or0p<sC3J75uTl`YAhc|W1YfrPM_NN-%!sR4u@$Jr&pUBHepo)o)0 z3_`(2IZOsS=yF1@6`IRMFBKJ29253(m9AeHtJ*2k(+jNNC5d;U?EOm4Pd4kiJzH*B zf)D0{95$O=$qr3Z8Lv2UHI<;Wv{B(c3C<KtdiF;!CpdW+Kv`}_B>inkA;`UMm~ui{ z3M~rH4%TrZk;?cneS|<cfq<9kqdc*v?z{?!8uX$*b+~_hp%<q*p;vZZ&60qM!fZ_3 zumi8Jxj(=$@Jx!!Q!V*xF;@zSav#`}Af5NWzXt|_`KZa$h+X>oWvv>mdV2L_*~XeJ zVbAPutxYmm%o@kYmI@WwZ(`(VdUoU+wK(|ks(MXO68MrTyGZGhZP~bcGt=Se>2MMn z8iy7``4qt|B<ms7xZFY9#fRpZ@48k1kG@Wxo!^GLf1nnQvS3E#RK^u*2TdiVhLtnY z_y`c-5D!fJa#ge#?mgy%2n>x{+V$@GkG^)jf=wk0Rx7G<izo#t?DW8ca{ojc3~LPg z_)@~-jlE((%9#{9Sv)C@;+ksuX;jn&28uvj@YKjes$B;H@!h^z!6vFw`9*riMAYdA z9o<-QBW)mEx>voyoSv+%V1dC+P`7!K=1o<U0(PN@C0+?@OXI&Qe9}Cc_MJ^`xZ>r4 zAjc<eOSu66731i4feLpKfrn5`_Wdo7f1r55MUV55ul<w=_iQv`LYbmozegVbL|(Ts z!CKa_ZzUhy`~}PAKNCi}U=@J^Q?ahXB3flI0VZv(uWKvQnAWoQ?kNR=-`UUaR+(n= zR#tME|Gid8Qq+YIUKe{0iQo&IVK=T9JM!LHs-Vcjc|RymVEzPkUiH~NUW^onsWzif ziyUqbJ<NC*P}3h3SNdiI>_(_n7Id)v5LC+$-~c^(;3(6_ahi}k*EB;C`BbJY(>b4{ z;ls;&J@pE>0#wc_%>y04O2^x)7s1gN8bLo!%b=FL;HEyVHaa>vGNqxZ5tjwDf(5Q^ z#9bYy?p$5XQuu!v<}qZDIl;cZ0oX8dc**FP>T4)eca#43!KR<rM}8O5b4=lIdD%3( zyPs&BWw9$@G8G_z6+CC2&q}`gjVlI7w?fZS!EASE-|CW|my+Vrq69{BK!)=IFtgFh zVZnmy`(9!vW;ec5L5g37_pds-b2aA#^R<WAcB#TJpeP$!PfOO#<@V*D9W&DM^K)~l z9JEWr(qmce%#)0b^mTnce=hF+{=?@-6ai4g2F~!o+|?!n{XSM)i*6I$*`0Qjer4zE zQu$Ip4_^fG1u<RigeZ6Jv;xDuwEq&(qs0f#O++d}y|V2xXZXG!px$Y_efcrQOZfUt zH@8)L63WN33(KP*q|&;juagKYvg*9-SXVI-yisCe0D+YBM>38sEI>YD1oJS9C&y9) zvI^zM_T=%Y83~UPQuGchyPl@LmX+J_IY|-U44^&@gWrC$nhZnRfZzR^G5%N?i20HL zNVl#f2-$yZswldVDHaHk`AUj5X@tXCj5AbEx1qEIpmrKNOex1Bp@x319AxMwC@_kC zxu40a049WeoK`|ozM$}b*uRz4D@xYvlzvV1Hihz&!iJrp8X_mhlgNQapyuoJ5>Z;= zhXM#>vDT<(MceFEt)AEQNyy#n{JbS*x=9_=@+<@Dekg#pO>y;e;8M{#mQ?y#9Q~E> z;&@T)$<EN<C%JEo$wa~rYgSDO^9$+E`WE3eAlm4NSyf&Cy1tT|o2{CijTdh2<l*Ls zjQs8C)M;vyM~t@htF@zFkw7Cci?9L+1d5RY9Kv$+^z=Tvo!JkGmt)Bhw#QR^@E|$+ zn7he`o3Dn4jz-1<Rx8;mI=_YD^J{?Z9NyzH{@VZ4&`j)PN)nG}hAYYZ`y~Hynvk4c z=3XkL@uejqhH1ic?fhDv3V^l{<affUEJ67ZYbd+eaCUZ<@R<<lhD34wzV1<Bz~8fK zb%5w#BD-)(Ac{w<_R&I#b5M|evz_;tZ1C3$T|In_2F;n+RqH~)ugeDOPSyz7k0MYF zv%z=lDixy44kF~&o9D_YQ-^6zC-cc7{Uvx6?}AKCyT_GLi0AmPS>b7UxKAiN<)B~{ zl^|mU9P4xx;>8z3jPZj6S~N#4#7A_!<jGR6`6t2{wtynerT|;)(W=O3Jg0(!$!r3k zC(<z0Y;XaRK`_(njxC*nZ(fWVaFO2}Q=5olQ`k*NYm2h+jYmUAM<<#fklaXl0AR0$ zW1g5D&Gy%ydZpR9prmQ+;!bJ_RX7X{jw0<Smai~?Lx7avrb%&qN1mg0iz<r;-l4!s zWEzcQn#^f=%hb{I{eu5Bj3S#BH%gKLpsl>PMjMW%5H@g)gURAT$>{L{FPU`@1ppR7 z9RRd{h)WhVMHO6@p*(#Jlw(N-F@1`TAqNW%#G+Ffg+<=>13(^laJ2I6U_$x5X!<ov zzI{$TvfVHc&$mEstsEMLv}SS?9&{jsx4fTyVgY}K?Y{JrX(0{9@3wxB1UFk&qix&Z zFw5ZT?taZ_azmNYCYn;Jt#(auPuWZs<ydk_lvf$72+4Oi0YIknMy1%cjCGb{;gAb8 zKK<iFTFhr(r_GWU$A4F6-DaLvpK~O(#)$w%gCFV%pU!E~a2CKwnrm`M5^h_>eIs2^ zzs+0mJ0nIu{ux@L!mu)MI4hA9`i{+Z7yt<*tTt1~_MGC$d>N0S$~dr}fZF4E8NSQI z#Yh3t1*|nY96o4tEcbzyL79Y^;8YwO|2G`Y0KyNr3||Rz1b;$=`2FWv9{l@IKmzlh zl75x#TCyzDT9(?E+Lkh}ysTl6O~qE!XWZ@&ju)zbTrtt5VegKwwvn0`STZccPhTm5 zs?B`VYisK)=l&Y1iYXa^jfD*+eI!L?WDpaS;3{hBM9{6|@k`OK(1TNA!_jztCdmPJ zSckWX<x&4Bit>dsU}^wBv^$y+NJ8&5OEdZM3n7ADYt{FD4sMb$52kI>Z-(D*oLTUp zOYyjFe+DAGJ+LtnX7ID2|9(P2nh{}8q-*@^*eA<vjUgZ%GF$~%Nk@y$FpzSDY5(2D zzBWd{Fi3<2Y~t!UI*KitW0aF)<f*LBScR=D<kX<B9nS04V%fFcC->JD3AUOd2NB?* z6~Aw$+(nWQ;2{fPbmStS0Th%bcA`FD#HDURu1LFRC5=W;uUqBFK*<#g$&Mi2y@bju zUvzvyO-f$Mf4({I`L&8rh}vTckVO{&?eF4ptTx3hI9O94XFaEjbB?{F0#Y#?jE^Ea zw^JZ=^m}q)Vy#|L%;FIt6Dm49&>#{-PvRNnh<0+wi6j77q9em>q-07Cq&y?>dkegg zD6Dkt{^!&TQMZjusCKl39D{Lm${1KlKUZ3#-${Nw-g>P)D6`VIVk)H`^43wU5Jg&$ zHNaYmlZOBRvIL269t|-*ev6rJQjeccmqRzF*BwfMx=?xeDtEM%;~<Hgnxx7TbqF`y z2a1Zk@>ZzO^%mGU##x<fSvwgS@Pwvnsd$k@m`qH<Wv=h@`lFMa(owS>*aAe5Orltf zC`w4M2M!R6LQD6py+_&}_b1+?HIihu4eg8HyuaJ_w?v9VBeY&e!~qEe5776{3;!0- zZ{dM3kw`-{W6SM0tM_aJ1;#PGYuO5{9B{#{P+1p@>wdHsHD#86-wdEal0P11*=V53 zWL8FT7&lsfu*XG(@$SU%CpH|ZLzBOjG{i7~hRM;l1M-+8B$yZ^o`;~|T-|^Pm}g6^ z;thdjZX(Q-K6Q{@cT8?x$N`R~Ag7i+;K<`l$sZ@G$Vc>JhRS;@jL}GeC3S|O^VcPD zp-fD|xB0EI#{Nkr#bTqVKFSfH5!`Mz#TA-pj*_>_XN8zzsYfe6maGWl<POU{zV>=1 z%K2dIBsjX5D&_Z5*e*{S21*UHFssII70002r+!@BRSt=eBi|+AK(`r9O|Qi0%tm+B z5m~kafKe^!DTFOUtx=3%XkY*<FI(A%O>>8YqpV!=bN=o=WqD4Wz<is1&9@6#2HB_y zhG8wSDUG8pu0jbIq8LshvukApjZs6@_)HYBPiVMCjhT0MLartzXMBP_s8Zx9OkJxb z1_tw3cVhSn<@jyt7^X+dF2leKHA1c0n#$!LJ}pz~8OeP)A3X=!QDSHT*xTIs*KID# zM*5HykA5mN(l}J-m`-Hzb(6AcKWK(X3n=3OC=6rcp#tb`AR&Y0zr`9o9KR^p=DL!k z`clj%gI-+PqKjhhAOmPE0C{8CC7>k*o|%!;F@nVbfx~@TDlG;z3U-{<`Ing@dz-}X zF^32bkfJg`si9?yCz_P7v5|+Q2~n&mTY8gSm#V7ETI05<$w?)(CM6=?_M!GHda_+O z+G4wt2ZM`^!mn#-!<3hC9Wj|#{-tza*4;3X9V*XDToyR*KsXu;08Wla$4CgvH5jYu zIF_*-I`#W|Sn$Ez=X5zic!SkigM!#nHslwf2(k4zjwSlgUY>go8yk1e{lQoAsNVah zh*v+p5)iTW#gKSN{(Zs;ebIdxjRdQvp1#&&L8l@4l=Z4u96OSez>SWGLRcm&uiYVX zZv-stb6~f|p(+%`7$N8B2$M0*Vphe)<sl?BHIEP`2atrZH?5VaW=T8X9nDv@xRl^k zlg4Lg&va;;n6%lC9;fCjs&&E8JZPC024X1qK_L5or>Vj`&ael;m$Js#7$Ud?LDuT* z1Q(_0dlRPuNIc~*!fg`OrX8;?j<IT#J!FaqdJcs-1+HC6YJkTa3O>JuiJ1w+WV11p zx*X1H?Ez2#JAkc_0)kv@Vk})Xh&NkrgqqFv+PYK1c<6${F#FX+0e1LOOz_Re#5nOn ziLg<eXtgmd+4Qn16A~xOx$YF(EK5o`k`a@a)>sNsDB#=vkVrfVo_LJcuNJ3pBigNh z+gW}c@BQ%UUJm(46RAN^<b5HfAWjPdSpp^q<$)-c1L5Q(VdJDsbllt$TpbX%co=CF z+dH8_w_T+Lf#{@r9uVfdmao~81o!lIzoL$^xj8AXBf|v}1;`v{&5JiCIxM1P4+D%q z$+Nx32(c1HghA3Un-7}AKbNXN%#(+lj~fkC7^`anzTz^gt*-x__;VE{4cxv(t+?}* zs6;tV2kuV^yc?~)CqLJ_-1B&4Z9f+?r^G*b;z=9{Q|1&H+VDur6yj0J6iNOl|J*<; z)NWe$CHVH{=o^Eir1_j4!2$E-w+0G2P*EDQF8vD}cM<SdUwGc>2oMcq)MTlg(g00H z2l5W^0)}+tOi6LF92}8)7__Oft8J6y0;T6+kD<FnXKyeu-|%DrP+hJ&%-+_owL9+% zZQ)4~#N?oOi!#&s&h^#F4>T^HN7_XMTc`DB=AmoOTM`we^r!%k?{eP#U>lXAk6{Ns zC#a3FxskcaA#e>09lF@^h_pcS$|k9q2{8n?+&P+k!EAadwTonehTEW;W&(MjyIfqx z`!1Wlh1&`A-d$R~JAwT-Mj$S9gF*bF+{aN{lq3wNm{IIRm#|G=s2U*->%_IYkZf~| zusb`DMh?h78_D*)AbWT(r8b9tO;x&*N1m!MtOAP;+OT;Zj;#OsM?IIyCKe5=oMG>E zK_b*BgLlXmTUB{fxvEN8l#B1$_|UezVubWmmKuqef<!tY4vM3ua`tMj^)et3h<=b+ zU8hsUB1E=`%~~fLpW22o)?8=VeTY!H8rV>3IV5@*!^e45!m9}XA4_Ke71j5C{XvkF z4hL!JuXH!k0s<n^4bt7+NDd+)U4qnrgLH|Mgro>acXxNaXMX?J#ab#%+;h(J?7ctt zp1II<lNW>&;sr-BJkDuU-;fC-i{z3H7D5ewFPFfG1#u6GS9@QpC#%DU&%mpk$ng8^ zn?5Y>*xQLpJ@)oIW8}w|<+LC#1>KjJQ!V74%Zeoo7sv1eH2vjaA(z0QIGZeY6ts1A zCF{s5`|C*VsyB#&X;AI$gNR{xW&{QaDRmw>p^~Wrfg=3dx4VnhTxv1zKdZl!L_BxD z?qp2T8@y7D%B+ZW`9rXI@M!qM2Pu2vfoDH53}nw^dzK(*Y0nG16_q}5)4_PSzVi<~ z*Hz~_C!~9cVi*$n0i7EX5j^8?K9Hr=((JV_`rXYjlMG5f{)Zrur2LH`#v%_?tHV`; z*stD6Ur*0)$#WE)LJ*bgySGX88r|6E^$Xj@?t(M|2x@2uPQY^=v4jt3lMsyO7OO@2 z%X{Gj9|_DzP%U&gS%nck+bY+ebV*GJ5#E-eF|-UOhcdd02HDzL<IVi9-Z1F$q)A~p zV^f;`5@tC{!84p@Ld-2X|3mG4saqn9iDDHP{|IOD6D!()FC~{e4C0K3ZbA=rBoIow zS@7<Bv>r&Me2M-hxFu%1^O0vl1eSnRa0GfQ4@7Z5!0vD#^Yh~YOGUDLZ#uF!QaZs_ zkF)Hg#>vtVQE&3%gym`BpXg2660A|;2sRckzF)R?8V9FykNg>PtS%~KT(7fEpJ3u- z6(6!xsQO^j)Fa0qQ6f!XI<R-FmHbZ#Zfj>pRXctLpD=0q$oLButTPS;5+qKordY{b z5`6S>hwUg(2%2S%mc}h}$tbh}i~ZyQ34ih8MX6M#C1K#KY#?zpgCgdawf>ZrqxDRQ z+=C&}1F?%)H<U%mhpXY@lMVc5Vmj){w;!o0es2HQ9*+4OjZou?6%CTe)^fA&m;d~v zI5)s|aD3v4q}^pFzIZu&TLxcptkzCD`jv7Do6pIhU|CrivucL>sEQzKj5OE%?a8ol z(A^mxmB?lj$8R2~SBYQMB(C27^E<GxvXZ>22&%Om|F7z=Jh9R7D0>V2WhWuF29@fj zz3uA@?0p7l2I<2hl}v0L9EEs^gANyS(y4rMU#?O?66&bepBU&EzOpYxqCtq>>r3H> z95P@?qY4u|kx1PxKYETJEJ7(tR4McN$E#$ad+ryH_2}8DYx?AKY1ZiIJ-wRkv069J z=9DdRR$7WRO^>Xwp)@o|)OHh2uwpPl7>D7BXpOD5(YxBC)a;vhGIH35nC+0P1%gUJ zljg%7mnzI?T6axa!q?H#U8dCnZT7#h(zjTLny!7rT)8k!p)T=XQd5%qpr{Elq>p*^ z-xH3@azQXgNb^u82hIp}Y}$`HLKDfhJl|VO3m3O>V}xVUk?CiNv$IdFoL!<|We%`P zn;!4rvdNZq^d1D7U=k3t1s6gJdT<59P{|%lRG#*sV7$!>TNk3d)cD1DneN)QG=N%H zz6etiTcp7Jmxy^8LSQSDR&7$48eBq1P$h&nXw4hubeR8K<TvMHV#EiG^(<#f`>{|I z2%S7ZdrUb)Awzxd;P0W=YN|Dp_GD9V>&0&umks)YB?#UaDEz3g>_u6h(#|$KD*_&U ztOO-UAZ>$8I<eV_xkf)@Ep0Sxa{s5|k(Vz^;|f_!ej8Mv(k**q(5>UD)L5<~*C9vz z0VSN5imnaXU**5p77`?RHl`vtH-<254i86@?wxIPGY-63!=Ul!qN6kIhLJxt_CFfe zHvAyRMA}`&)=x-kDri6Z-F~ZTYqWw!)N)t+VwQJ%SKTUJ#P4?^W5ti#zUG6U&7OPH z<h+&!;FZMv&ixldFvJ`$!tf;;T*u*l`z;sqe)~2vb$fgD3liRkCXh?Vqh)O)@ZePA z`{h_p>MY@tf_RBgWA&t!VI?N|w<mwTu=+uXD#pz!$HvD8GX;Z&bHp`@RR{a+!W0`Q zqELIQPXAGG7JmIoAkD=TP5|TXP9uPE$)ki?YXzXuUcb5ipi;>!Y~Z%VH>5U}jEf@w z>UlT;76I2#crXcKDEgSL_u);O6p6<*XJfTcht6|`HZ%%HkH1qILN_W|MzYVL3S&fg zTt8Wfi}~K&II+EIh#u(go-RI?CtA-q5fYnz5ODEJU>0ckBh04}EW)4ghD|^^s#k_U zeTlG(_$32TR6Yw`$T|c<+kf01hM}yiJXjdrp?qwUp{1cQBl|D30nzJ-E8r#gNRGwM z)|T8HcRy7gcNH@oj!h)Jy}f<DHzR1;fi_a+cz=7fk>xftu5FA9SqQkG5_Aw&OgukW zXtn4kQ%wAI5pZ+9_vZ_$x&7f{JHGho_x?5CyR!+-XI>*~+6El`$GcP2D2rtkKl=s; zTORIj*vXU?6@P<d>H}mV;C{*q72`?6T8cizWar<vnR+LTV0_72t`{%**IWyWi-$A# z!9TisdfYVR8k4vfvrW>EA3UsuuvmmlAC>BSOhkiF2s-}9${KJwqEJ;;)xkiD)<$^j z+d>xm0gVNMFYC=Cz4+yb-ya@Nq6ayu8T#iGMbx^V5VY5I?|gDp%s52hr6eGHl*m9H zL3r-jL7ytylg#2GMK_Hq*olh!=1rVX>9<a(-NMhiQ8mfCHdOrE%awS}meaSbfp>5? zJUm))Hj!1Dh%P)PCMNK52_v@ad16y_b+xGbCM_W=C#M>vQ}xub=z8qR;~rLa_Pxo< zg3Yx*O&)gLX`M?f931=L8&F|uDR?<NKcdq6$SikQ&|~|ZQfbtYxJNFRNPFxPl-EO< z)d>Uqj+w2RY7SQS*MzD<hL(3Sqc!E_<wq-=ua%Ur{m$CY@^+evY@{VjU|8V<*sSKS zX=Py=zgXm%<r2#EW5iw^UMGcO1eF<ihQ8nGMt={>4!XaRiFneu6hT4lvzj0mOSZPY zPDV-^jVea1_T8ma$a}0r-73e&^3!9q(0_E^9z%_vM7oY3pVHGCJ$AGVCoFU&d{0@B zmzh^LHl99x8mmEx7YXI!rI(pF16U%_OBPn``7B-4d{9fxG;4ifT#<_M454ZozMe#2 zbbY$T>#>~-n)XBOqQF9QNryw=jpg03V9Rf4*Jg#x+jo|8lzVhhxKfX${W0s9?bpc| z!%4`<0`IRj=;dLr6crWK)G&fa3KS&oFIV<v>b*p=%d{(gF2}rpv~8R;8gRJ83|iu# zipTe?#JexgE;(bKe}ThCw^p;%GWcw^{uXlnIFzn;oSXOE`St?Q@SL69VIYk=iAlwG z>BH0ax;ea7L*Gq1AtpeNv<*GRPlhFf{^?qMPEO7WIG?g~zE-I{G;!-$&xLx%_zX1) z`(7~gI7w?@`BfKNsInAN#}}()3M4Tbi`h?d$*B+EupW>6@{Q$t{`f2cDu!H@;&}yg zy!W#WF6-YMYxVX#n<ul>qdySgp1PCLWT{#KwIL=V%5XB1#%!G1_c>V)0RHOZ<Ks2& zV`XM$*7K2y3a=-I^aYql`nJU%Cqr&Rlv`U{s2F&%m{@#fA<uF#zhq=&fcZV!ol4@? z($wVlzdWp|;j5o<sGf?zqnZW~A>c60rqgg(oEzA5xg2}Yu!1N3O4YM&-1g3Ns;c4g z(hkwcL{D%2Cr=8zbGC@bHBibFPUC&oM){AFr7TKsgv8^BYSQoIEE<^k@&qGEGn(16 zA1&D5ZxxHNcdS@Iug@lo7mC$#Y3CJ&;&s|#l|bmbC^HGBc^jAN%t;EM{7I0uJ<l6| z3Hz8|SX=yqP~}&zUa6@$eRTO<E`n*1>t^)!t?ORx#QOSrPV#3(Y!x@&Co)15UAYs6 zUWWeuxBZ;0Y(H)6-*ZQCy}=9%GljNuc2;zxeYc~R?%<&E{3;neZ9x5BGCsPb0_oq( zLzXn3snT}T@O2tK&uFd{omE^u4L^bt8lSRO`4EDF$JrRBA2&-hzU*AP4U4B{W-4QX z)SUP=FJ2D~r^_FoJ7(lJ5#3kN_dkEmKfzarDXTQ3(s!o(Y9Es=wsa?(W%f4YZkXK8 z7WE=4`dUQSv+Io+D3JU76Ds{L)Nho+=2>rLU+MU~F`Nhs94Z;$`;Q3i%7Z{PpQp4a zy;Ml>wF)84vu5j2YZ5GbW<HU08sR5TIzGZg-a*|z#8I9db=lcU%kjoLLA&E6?~$LS zm7h)x-R{B)OGV!CiQkmjnuIzd$^g4VhJdaEraa<XE|~h9^FI#vo4tB^jp9vX{>LE_ zq#@Gnln`j4$$yUtlcO?EXcNdjzuG59=TccwG1vL~tKHP#o`e!L4tMetQ(ZIC^0|ha zBhz-f**KN3>#rqe1_p-kX!>^YsCF5cnR~{Pl=D*3ICW?@<I#rA#RB$=6C3D1HkaIg zHVz#`M8ChP_Oht4H<Y9^6}%$d_=@m;>(stWWW7tIeo&0nr7Zg&K9$HjP0h@~e}4p7 z@;sJ$2O5xfu3~;}`a@W1KJ5DdANv5dH>L=6$1Ooz^muE|!+jqif$Y|1=b*9t%5<F1 zvuDkM(ot;v8Abf2sqxnq?~+tUhpBD0+X=De)z6~4BjWflKH!oH1QKj_eCp0BClF)m zt)i#l;t4H_-uTR513WAF?NSMW3wHZVtPOI3OUa#7?G1P^igO642WSZg{H&*i4((nU za1X=>5YZBr6Us!j{wa?>%6gL$-{;t|dmoceDdfBe1dm!W&>ytsyHSiR7F2{ytCt&| z<0I*3Coi%N^9h_)1Ql$eeuR8-j*7CwDs7GaU=@fXk?XWS+qjYA=V)nJ<Sdz1yYfG6 zD1NDqds&<>9{zb0Gb1fSwf_E$sYu(%$6^9u==AfdC@NO6R@fw~*^nbP|B{}*u~mX3 z{9iy+4l7mr8h!fi7n#U;@0GX&dWE8*q70dc=h@?fS5@3MYVS_ojXtT|LdgtzJvvGJ z`<lL(<?rKfJH8GM4&eRsSu%>Uof%;if~u6{d}6LcSaj{q=uw3dNVUSkXFeB48xOVY z2-EezY${iayTOo*owYovcog0pM<M9C`ie4->lKdH9Ctji01ssBo%X}c!b6TkfN$|o zwuhkt;Ut02R^Csd8q4sxZ&z%wT||6K(boNorV0L%wl8hXr2{5e2h}>PecRS)+^|!l zu78+f^j8@e81T5Q4{)0U6?T)dwY7CdJZq*w?z2i^P<(}DT3620(fz;TM?oGSU-l^h z7QU%Fwk4xtqUZjsu+<P{e2?4Nxc0@tLQrP}Zed{|P%@f;Q}u)S7Nm=ZzX5{>j1K+_ zO0fp$tkyR@cAf9EqM|n$b_hjfWuU9Z0cV;OMlC<Dw_kK}A)5D_fOI|&$D@(BUC(rS z)b_1@ej0#^&&fvX&AcB_=1eY^Wq{4}d(8Uvj^ZF~f^}O6yxBuRMK^HiBBcR2;Ukr3 zk!tpIu^J6sZs6@v53sHwkdJ^DgAhX?4PL|#G_CLkD=TY$6*0tHEC(t45BGPe2Clz_ zH?qv}w&Q<oCoLbVm<OIb{beIrgjFv^OivIRAaMXn@u%O#ek{i`P6Hfues%7TJ}r+w zFPAha!@yKozGYx;Z=Ly^(H611ysSVI@GfPI!?0<y=_5Cg?cDvQ9Yhbc-|LC9NN}9s zrI^CmjDB1W3NHMDJ|!hJ^qTXiXuWSj><mlX>{bs;!~$zMtDAAW*^qqLau;be_>Oc; z=*sc&@z!YZjC~z2A-{u`37{N|j3CD`7k_17W{xfEM<K$}0&y=_BH$W?L7Q4V<h0m~ z7JV~puFK0?%<<bN%!v;IMFe7(dn_5dfYZGHxTdyn_7F&?Gmgy;E8TJI`gI01)(ItK zR?zNFe90d!E8W1-#17j~XX+g6rtLa9Gt#s6eeMJ1k69P+>3%uZgV_2|J7E-bF?Rt> zHjU#_!FwL$4NkeYX}bo-#>N^NVb5HoV?MoUJ#Q1Xf}wY&uoNb1X=%mmR<HLvVt#3A zY69YJ<bTwaY8>cusQRSSdo@A9_hLU_wKsuLIRysgeq_#;(ZJoEn3Qw?u*9gv7nfS> za;rF}=_1DukY4QC^$wsI&)u`pqBwF<<XC5%TECT+HiD_g#=&M%%ke+m95L;TsCAsX zPE_U)2J;Ls-^Ha84wrru7aQB(-;X*p`uDG6%h^A$a^=RY^BX63VE%=@4;L?wR?6UT zcf(wMzjJzgNq<oLAezNPxy?Z25y*4^VSOR!A)r__`|s#zZs4^I8gftT6{y|o?XtU@ ziw98B>w}pS&0YsdqyuWP?hl#&eJyt3f_&He)`Z~HtJ!P|K?Ox%Woc=t!}0adMEjkV zUY2S!!E;3hYX=hD(fs~Ld}U6Cpw#FkovhgS`T5JK-|CE7qGeG;eBq<pK=<W~xqbHw z`X&ZSypU&I_*B(fKU>tJ2_V3J>%;x$7upiXhn<b=`mRGar(2^13iuEZ_6WV$GEh(; z1$@PFv7kdyUiRGj=fcUz$m*OHBv@HXWg_vQD`f0?ptcTXnlHdCs1^g^NQYIPQ;A@% z6a8>EG@MiBY;oV6<kn3IkT3=fPvgCa@{&bRuwFTpWBD&C`V%ljtuoCNi|{v!iqR7* z!YeRd2rc-zVY4S#uUD$7j$p}Hn5k)K)VSoKPg9c{3=nD?!w(=8k;s8S8m%jqfy$fw zHn!{U&j8Uf&C}1)2^jPvj3g@&Mqe=LMyzFP=wQG%RkZ}J?2;Uz?Ff~TrS?6~TyC&% zbTS#DUrpb1{^3^{_0SwGK|CcRWn^YPvBZ#i1X(diTmw~dH^4ib1;lV5omcYmP$ryP z(5LZ^W6*@1Djc)BLu=*8x5dcGz+a3u9M$+)^1pxMU7+K7dWs7RTW*j0JLa-;aspR- z3A>?8Xb>JAp8KoeAaoR&l(mKiAzttNmmFT-Th#sif5^TvG^Bz+BbHnn|Ni|89_VgZ z48yYfY)zPun8ntA90%aNR$p+@;FP4JvfFKhMTlJ@w?eZ_3z>J_H{XP;CGbXY=LF7q zfChc{zx_@5uM!!QiQXnd8Ib<=dS~L>%y*yaLEAVy{CrO)$V>V`*|4+A&|1DHoqs$G zpB|b(&p4iDecfdeLlgDd7222udF*0#uGtIc?j?Q=$6pUaXJ;37)6hv!r`KmY!$K>t z`gz|nwOk1*5qD>iYzqsE{!~t<sj4;6gC9xBpSVogf=_E|z+-l94t{3(UabKukjUkv z7dK4&Iw$IdN5vznPNFU;hK69l?bh0kAVkAg8RgR)93DOxsontidcBOpiTvC?kY)-| zPqxCEA3ywuFle4U<J(NP%J~9w84~r{pDj>`kC(XK?0RYh2?utyys~0GEo1(y6tR=Y zppxc1^7tw2ckipnC^oU`^2KxSth2Kiwihwal@kvsepj(6-8^<HHYcViu-q;$K3vO< zd#^iMLoCa2cO5tXhpKAIZTrZZI%qi>!*a-e0x<_9?+FBieqd?KM*6k3pR==ZA-cM{ z9l@Q#!vh1ii(&YdLs{wR=~vrj6@66$P-PVrL%^*-*?XaWD}#a#0{RnxfIwIPlE3>| z+gL^E_3f~}lgIAlQHs8!4=^S>Tf45>4i-lKTEO|sZbn8%^77~q7Bb}?)$AyS-&MEM zb`^Jb2SJiIS#Au9zJSh7PELe31i_2Oa<+_Bn)e`gB!fxIr#lBe;I)zMmBViqKIe!O zen1B_GfC>v1X;Pck`{dych_gJvq`ui@T^!`%letU6YrAzH=SJXb<t>I^U$LSNM1}o zD@b~4M7SKn`1FZlszqbvX;CXdXa<h&&AVE!c<N3Cn2^QZlC}CsaC=yi##_}TEj|?u zl0spHz=ykwi+R6;VaW&kN}bT9mtg$?EEzPqS^%%0XD2eMn3$F7HMqDL>)klfRnddW zDo<dB=33`b6=)<1b|f7tD=Fd8h^1v^y~a!!*ek-4!Xyl*P2mSWeoKGr!wd6incppE zD;uBIsZEnCJpb;y*5@GVrHATr)f#es_@X3z5(05?arvfSUzD67Bgd#{JAt6$TR!J9 zN0oI?6MBr@i5}HkjPv#hMW8rW_-79hyVc&w+h3dY`aa{IKNnh9fRz;})BGyZ{`(#A z<>;TS2#j!s=-YpSAYm+mp>c9^kK9_w%Xk0qISD8KPd<nzeJC7i;N2SvaS|{`SBn}n zf&~utDfbVIdCcv3;;4&EO08B{S|qC8q;OP}xcZDQxMOp7$Bb(k>5?WYM0^^g*4EXe z>d(3!Ex}uN^vXirfVq{Fm%ma`iBnOB1!`1H?HSdJPL^F(Y=sC79-64Hrq26U{L@ua z^+GFlgtmP^+3;GshjDl2Rk3y1Pdz;L$Mj!?M7ewvvdXjj>17-=lFuSm^a6}<jIN=y zN_ngf#_cUMrGo3?DQZzH*(NFaB8kAjz5H_GGD!`Ef{2)?if1(TW2&rtK-Xq{WTZ)1 zF8YU#jn2cJ_u<R``vXdfZ=K`XX0B<j*%PEv4rXTN^Z)Mif29!yN9Gw{S7?plJdoX7 z*AN%h7*|lsVBj8J``>yos7zGzj`n1E)y-LwdJLJLQV^QIp78k6?>3bFAj)xnWa44M zbe;b2AFk`!_V~l~MC+`h*O>8w&qnrCwIyA6;M9++z84kc6&3NmI=Z@3?Dex%Aj$NO z()jIGLcQ*C6)=KLcr({)cwjd8gPB@Gs&zZ48wL}&umntbB2JlCo*6~vp;*#YY^*W) z@c%Xpo&zoF<btlmELU7s*fiz$COD}kQ!t~&ej$+?;m>~iU%%_0ScFZJ6fW$0elOG< z?Irmr-{8h5bVHzw5js?6^UUIP%6r`uGyTn)Po{rn$#kC@IuA`Ou(J#4vANE^zJBD~ zEtD1#e&6@vtr8WUg1H2ov-Q?>+GE1db*u2~>`bobBR|=yW%U#~9`sX63OYpc;r1j1 z6$8<@{tUAD=ZnmHgazy#^Ym<D!G5Oh3?ya3Ee+=PO6x>pmf@E>LUe(s)I9}WwT{dD zEHQtp<WyVwKhHdG&acXF<4|_B@e!6Uamds<<M7h-z%_rZIiAueJSXDu9|yarfpd+f zBVNKQ7e#VuOak})v8Bl)GnLWKX;fhCT{C-l#nt+$s%xa5G4M#;cmD{8v!AssJu0rI zru%B+J0k$P%O2R)#ja@HmdM7eZRP3q{A0RumMX_h=`bnGv(10P?EGhKU+68?NLwXD z1mvZ27PBt4=E~F#jB*1jP1dH*IO=B{>v@^lLU@P3S1=0d&{k<(ma9lMFqBk=(xM_J zXzDIVx_9UL&4U7#15jOc0ms<}y9tEDOg*t;B15TFJhedPAQucAjOWh3J&+VjOH0Xx zUEiCT<&WF$fz+#~m(joGyAmgOzBgl4JtZGcot>LYGp3xSx{=7J>~1J|GQbPifqhpG zECx{c7upDWBt-lS=t=-jU-;qU=IFTJxRE7ewzFMNS25A-I5+&^g95YKPj3)JP22Yq z{C{JTs6^Qs#I$#^Mq9$v`!Z<6-@l>fXY@J#g~Q4}%W?3Rw9MD@ATcF_$8N}9F_8%- z9<+0AxN!Hqqs#{M54GD+$v<{|CML$)jTT|@Et`#8w|~5xty@RlqF#NuT%M<PPOZaG z-iZk_Se;Xn*O8ogo&8LDPEJa8dS&2f$}HK`mQAU6vsb`HnA*E>LGPCfl?B6y61b|0 z;{JT?Nlz~OYF2#n;w&OtWM9&~K~9xSdXkI9oXfvA?`ME-(_Bu-o$v7d=ID0Dvv4#1 z<iNAgFR-_gJ*}t9(ctiOPw%P*^}U#xm@ea92L_u2QVnsbqR;?1*#CL650U~tg@FCu zbnWlozsX_?5eP?sC15gZYiq&xFDF_bTKp~?BReY{W(4AA4BzTC`HsUo3KRk)7O1>t zN0>PAO@9E0I@_6$yjo5A{P{DlW9!|QNb2p03S(1KQ%%kBzRxcr@o6Od&UeEw@BzC- zf(MNjt7&VFTUNK642dG~5=o7B=Q9@zL6VY^t#x(hy$STW{>O^()Z!`Z`scuwEx#69 zy|>Ka_itcF$8W`rp4V`!ziGL!bO398y!!j<>MBl&J%lN3J>ogRw8F7kJXvvOGaaVZ zl_Q6`C6rB=wRBTwYqv3Xf6D7kA_J`QGJ)U;CW{61<!BA#3$50}YyA&$JrQ{Otu7~8 zWrNdS3`Of_cpH$n&W>*|$cdP|fb1+m$hxZR4(=!BGxm^cyUX<u>m+gSE_EZ|<C)1m z<k)(6TV20Dc{V+B&?<RR?Pw_CIpnlZ<k5d0;5T?@-|j~<G}GWiAs@w^lAP?k-)pL@ zT^@M1cR{{_dUK|w8P~NrL2Qx5|BBeK+5P9<Ly;QP53ex7^o=}up@9x2t`e?Nsgzp# z+4uLq6UWQ6TW|K8)x^)nHb)BhRaUZwb0r@Da)2=J16XFm|8yjwGqR#_Jp;7Pf^#P> z=a0+ffQvb+>KQpX7nM;lqXQ5)ZVo%~ISrd?^79{=m)m5RLP0t=?}ly7HDByhwB}@I z@16N}u{!-Y>Q10n0JwAUn>qLE*RQuHxep|-Hx8FNpBi~D0X9y~%xrdEl7{Hi*^^6e zw&+&p_->c>y7xn~jh=_I#8kPg6j|j4I3Cr<X8xfriSF1{=H6Qx`-2kBNyzVqq0vn! z&0%#{N7Y<rXWK6M$Q-88=N`t>N4^&RDSw3#`4Ov_ALbMDrZVU*Xw4VYo1@h;_hFH4 z`m6qjM;lsYYs*I)#f3$0yWi{nC!%#c=+!T@VL?htA>hOe9T(olj*W?@;zU7fGNpaF zwPk~Kgq0aMWxCn@6E#w)uWzRIx0_J5hsQ_y#|j={DaoHTx>?p(S$_jekwHJFnk?3q z_BY6yQ)M-0OEEtxi&KV0vStcoveQZA@XD8#aC7de-CNcc3v2)#+WS{)SC246`J$RF za(6na)`S4~)C`Aj4~ZVQi)0@i9WfRb?oHP}J*y&+CW~c+GAXd$%`DufBqfc)HDAc7 z|1hc;w`B~+yi(^yguZtn!>eIv^cu_?kIczd~#>!)h}>1V)=>d#BFa2F$^9F{xL zrTp0YgY`_#ABP=QIX*=|Un?1pL`w+62_id}>>2i7E}|ADyL^-hz+aXbxNwFeB7^z! zrh0gX$k!;%+o0UtT#vdNzhCOJ#|S}C@?kvk+=-;R@(^hIbzG}~=h5YfJZ@QeIU8pM zS4rh=Pi?*hfpqVN20+8_-zmD&P~UWOOF`)%Lk%VZlyoLpbm3gI-Dy&|b9u?!pkT?R zquk_i;S}A&6!q`4G?l~0gm)}-m$SMAW-5%h2E^hD3oVR64{YZO{6`jB($NE5x%XN- z5cj~=PO#9e)S)$z#q*?d7%dtEYO~}n;vkU8(#3*cp{09Y7NvJI(qx#PnUX2TNbQ^y z^<5CM2#LwxjQGN$^j)v>(-#@wJu}F}Ue(W$DeC1ooFi^twp`C=`8HQ=@6VUJaIB}e z6awWV7UWR|kHSMyJc9TSPMsk5PoSdF=g(j$R*>F@khlBgUiFT1JVVqI6<+b44kucO z`*iL<9xaA5|FE#4p;8Aqb00~_gtPZMAImj4!kQPerf34TotxOm)+UeszUik`ST+*k zLI=IcwSMqi29s69NYBtv)Z3)>E)u)RW5{Xbxm9~UqfxGJyN{LE(82eEKMA1Hv9apE z*32%I4BL&no=xLot|YHAj07^tx9a%?)6(2K{>E1h)X{ur@Qmi^aKp>TCRsPxqf&cI zs~)#fVdw!@YpMEm_P_i3G9-h3z99t0dAC=;;47Zf9)^J$42P@qi^tt1CuQF`C@M~x z77R(;WY;fv3Q=Mm9pR9%ZI0G+279M`B2ets0Z}}bjC~$txWKz>0F5j_eyPYKq%a%3 z|Na`;h#%_fv%U7vP+~PF;Bv>wrY{n|6>(lqu1bn}T?~6W6#h7bCxUyvDnPqcLY(^N z!#QdsHg-I<0#sdIQ$?FCg#wZNS440^*Z5)ZLec~#PJM7b=U2t^*XuwOGm3Wz<wGs? z396(82>};gTlhg%jLP<ruf(<el4h!k@Ak-zgXd0sS<rO#11N}zeQ`kpzpKg>M$OvV zCIo7zNU_^Lg_DX5o>GN+3=hMF?>0O6g)frjkKtzSL^u)ZiivP|nbmOm#YvF^l-Mt8 zE>E78T-78r%DNDiZDz6)MM&S|zQtqn_bUo2I$(1a>_Yc}G;T1l={z2`{VD7k8X7b= z8<Nc)2Z7jOxo$(k2R|?77u&-?3UpJ>TU=8SoU1YK`KVqXuNeNduo!s-E_5eNjpRd5 z>*aDR0ALnY)>6RY0QQXR6>mL#WikaE?hhUuw}HO9mD5T?O(6u|xzR~~w#Ja|pOT$& zRIubWJKLyaCw*F1eU8zFsf)bp>WB3q;rQ5C<=0UarQaUoQ8pB9xwv@3u;_%iB@jQV zrgzSWq*)46Rex|XGH#7O{BWw(drp^)+MCFroY=GTIJ}$;$NcpuAFOiFmQ>L*`EPjm zC9LLMeUHAbCVO3l>?=>LqTynZELGhUO-)iFS$}^6OZldW9k+iIel0(BsLyQP2%=zi z$2=F!K70NjN*hh_FO*-@YfNf&i0k!XA7-6T+zbi)hnizJS3l-aG4P9ui-B5SzvJiT zR?pIZ^X83)1~NE&PG^0g<lx|7V33v1GR8%Tr=Vo}pR<v+_S4)?wEa~jV@!yBcac5M z<`O;w4a0!j%cGCkA}-zTO2ouO;Uin1zmorY?oD^~^q>Y$?2PlVv$A4Aws&^8yFm$a zq?VPGV47#8rcSumSik~tulyytb$DN}q>?;+N-2_zyo9CxUY9SENR=rF<w{alEn%TB zPmm}F!<}baa&30)D5{YR?$y%2R$g%tNr6fmzHR6@f?eBGL<SVE2*$|B<k{!+aCRXH zc{Cq&U15{)-?pjq{*f;VgkF}s%&Sp$!#3QdrGKy7D>@g=Z3MSq)4P)Eom~?LY!K5t zbw=Yr1UrOwQ|GF6wBT3+-i)i5LNUPkW9b3yEv9nP!o0iE``W2cPl{O9mnHw(*I0*p zpH8%?CC$Lf&#tnlqLhc3$JXC5^90h45BZdlvMvd2`}cii)p4#V{h-~l`Y{SE9i5ba zRD68A&(|Ofk*N|cM_1w7$DJvQg4-9tsy}PJpm+t4Ovg8!VGDfz@lQH+F8BW4Vc_YL zJmxpIeh<Hey;d??U3=b&^+<DI=`gdLoKo(D*oYo2%k3p33U!%M=vQ(b^ln|rfmUm1 zfxh>hw2-wzh@{_krw!*OE=PUykS=G!LZ`I$hC3OxD1rsM8)_DMn`>?L2(t3z_8;Rv zf{8xpxF#L_uX!)P%=uF9Fq3g3bWC<C=yKuWcf&WtL`nClt6Je~z$Vs7W{85&><^iR zoLgg+Cva_{8HiGN(T=a8OXc(aN^R1D1;xn4Th150Ip?ACV%&6e+}uk+it>3i4Gj$z z{V74EY2go8;g}JU(1<TK8E|+;k?`_v(EBNsiL>LXs+t-;{qpGDTnKc)b=BC3NL5ni z{caGOMtMWSWjBQr8#{ZPL$oA`03XR5S3+ylI*oU6N^0tY-$KBQ*KSlxpCpDfUo!Un zj!*G};Od%OEE$!U_o3jkSuWV!&Baaz*$n;zI~)%8J?cuuqmg(L^vZYvu31)RKlOJY zj9*36`!KJ6&Gz~`P0+0iSn6VbWygBI`5!*{4H~cvMSwWILFYHr@yr6G56XuoP<aQ3 zZ$&l=@zkW6*6^}2uiZ&?9UV*vXsCFx<KEE6I3H;wsWti4HEZkY{&B%%BJn<_rlP)d zaM-)QyJ<0UI!x>9>oaWjBz^icQ%ww{3;+dlj`een_~<;E@80dsHjXYi|03%-kcY#8 zfW@nc9j$hJz>$;hcS0kQlamwm+-3RiKcdIHvyK<@Eq?e^A|zsY2!yJpW@M+!;i6P! zAZS8k@B1r!$=f%S>z?4ny$lWKK%o4^YGGl~?72sTgZ~Io{z|5>b7>OL#uu4LmO_ry zoyLuvOkS&xFJ)8v*F2l;?Cfx`v7dC7z~O&A3|}jIczArTQ?Rkw`bZ`Ek%Yt=-V`uX zhha4|``uK=!lJNETV)jTa>C;X*Ss7KkKxwR(a|w9WZ(A(A%HPtcfXaEN;1%Y{`Lw? z(k8;N*(?(w?B0Z`ucmnQ9|y-h@|s*u4)UV<grS$k`}bl1ZhGQr4#rAHk$b2>0uQ)3 zM{d&r6f*C35EmPZBN{N*<S{IMVF1#CfYZEzv2oBr%LT%q@wkU3h*H>f6?wz*>M5-X zqr1g0{1{6KuQ`v2u~H2blckOiU~ZgMRaJqf7;>a;N}Tp{whm+oS2s0@2nt@r3C{Np z4#u%3EXcfS*GaLcn7A2Ha07VD?XjH<hA%BUUSKSfQPgriZFjOU4B%V4!bnZx>g&W# z%gRSlu>J_U>9k67n!rm_>E42PiEY<Lp^Z#ICu*Mey|J7>8?1(Na*>;gf`U|329ejZ zwu*BD&!?<xY;0hajcywpMn5i(dT5@y{KXeP{d2XEOG7&O--{Oq4J#j~r}bjHc<la_ z2l!neH!>=Gq%1`skY^DkuQv-o?K3hlP4Ar}Z@UbjFKF$vc9Z8G_?n(D^4t4XKi@Yn zkR|9e561f%(`Ke<kRGhZncxBmm8j=Jz=aC%!|58EBxbe1?b2d&eCi({-nQQDIUyYu zRB$q@2Kwp21DH0!IrmWjjmX<KgC^5Z0`&MBl-NCKdNu>0G&T-SuJ8614u??C?qucq zz-Q>4OPn$&J=aEqVX>0|@Jz|eMbx3I41T*DzkT7MD~nXae}&4aqWcXi0Fz@gj!Jf} z0g9Gu?Ud_Q>($zNT+DeH`yX{Vfs6^<y53=?Xy<xRa6!!f@(?J@96&9vS(hFVw{`$& zH|_lIs6mi=#`8W34u_hzb26!BHTaxZ>ZUAsuf$DWUuH{5t0x0tf7mg8xIgaa6sI1x zc|xXBY1S2nFX0Uet6Z<~I6;A0QB@VB48LsEja1`6VY~BP<jMMKHAzyQd(iA0O`G`- zKd#pQ7Akw~&k8%Y1y>J=*mZ<snTcQe{{$n-0WpQM_4atAK*6cy>>sN}5u0J1J(!jH zg+M<KkJ?xHcm)+dui@XnJ0C4~Ra*|m#K$AA27Wi~WKzjEowlop=1yhPb!~tARP1KA z8uI4t+vhbHxx?D(>U4^KLGL;OT2xG8x<l^&0+`aT^^K!>w+hT1lJGT(RV`qjQ&M6= z)#31z&!4gOzLb~SKZKwn@#R-Eac;oAaB6?8?Ku2*5;O8-S{(n|yU`@;tCy^Iw<nxA zLH8flXP%fJ9vagt*+@%wJlrijM9+?Z$m=lq-E@5*U8_v<hiU@cwtj|C8mWIZHlvPB zTSXLrVb5orFd#!dj*j~<a$ZnXqrgT%iF|y<4_8j*0OYG$T%DJfS6AnGeF_4U3#huG z-d-Kh&Oi}8408n>GT8b-oKsO$Ot5Io%UcBGz4Pyz-(m>HM{053%|Bn#94;=H%f{bo zYSx-{#RCcB>*xd(CE~FUbk$oirMjxh-{>F$mjcnUp0T^T3!Vjg#&0`PzYtR>WV8J1 zXr%|Al8=Rvu@C^cseSznF%glh<`bZ#_%wlo{1ab`i=8IFqnP`5k!t_y=~2rR7~DDA zpKlR`pZ@_twyLU1->F5@z49|@7xEs2Oz1t7+-AQtwGBTfCWaDVYuU9yV`G*x1sq}V z@vX;wFD!IbhkL*4eZ#`SiphU(Wi?|j(4E$pCB#jN2`aX^$?M=F_r1;DG#K>V3e5v@ zDu8D^EZ1q6LT1726{%#Ji|%{zab)Mq#mv~((Q>AV`MCP}UJs=6PJGiB1Qj?tYcTRr z=2ql=FThbcC1&hc0&_MF4%P3jh7)q)lyt96VZdy<%m}Ye^Os}baEV+_9d-p0eR<4i zGH!9dbNkUEm5cqklamwkFNjv&Quu$0fB$@uDSn-vn4Vsm{nHyoQ!^<kF_iP&s7JSs zS)!yAGdFi79InLH1seb_j$LI_o!o}pE|r%|B<(MeJ7`I41V|gih~b^MXR|yei)|lp zp3ZwM1awB=>Nhx>7OQ3tn7a-oB__%?*1vqp_FSuitK#Y%zl6kmdFo~pHJcd6zET#E z)~1|}8M%2A0(paK@CC%bc|F7KEh@kCeJBGQ!N|<4mc?Z{d+AcCa-k53!9_Y{1#6t! zC#07z*RMzD*E>=O*r)N?B(n9Z7Hd!n`<`x=RERaa7(llh@(B$5Ik98d;(G>U$n$Wq z9hkPq-gGT^5=W}t-St@*2ENfx|HjTGt|tXRBY{qXh;Y36yM5GLdDTlF0@48|r_<@? z33Bhcbd;x_`S0tq9cB?}uY>vQw;5?^X-P>Zb6yK^<h=3|XCP=CAx}*!L~uJIuU|hB z>mbvgKp4LG??2CjY2<#mvz>{F@$t2d4TW*)ELE#`YH>17BM@p9NndEWZ;$=9t;MEs zbsmY~URhaTEyRoL-1Fqr`QEnW-d8o->~+x5(Sf{#4kG)bCL&^DO-+yHxvj0Od@%zR zl{ix<@=PE2hmQ^lFUTR{?wfyr5<HH%9hS?@<@oC%Gg>1NaQ!+<=*tbO=0;q5XAsJ8 zwyKr0{t)P`akwVvT)?GJfTobwX<SR`Ryo{H%t3#XX-Ku_F|4_Zbj4hFi<v1$acgSE z#m5I7wqxXaFGm9{beyT%1A->L0^`M`v&s!PU;UjFiAM!ziRoDx;bZ6JJ&9({X#g${ z);K34V;cOG>Da_t0`J+Zr%yQZ1RD4{gO8h;S)t}iyd@RNYdOG}#BA&~$RBWhS~;_a zbjwjSagP}oIdWSPh%7S#4vq~==n&`Tx#x!oZUAT=%Nh!K?uuW`D`O(>k*BGNi~cQ! z)U{`?{(^?f1gtf3Z^y}W4JeS3(XBBVJL(_+_sG2o^70XLjx^k6Xb@QQVFw1aKY{t} z0Pir6`NcGHa`FQCxTdT1OuvhLL%p}i`?IcW&9~f$gF*-99CR`$m~{f&tpNNS9Bkw5 zaX*dsVh9fB59a}(?1ycrAW2+Y`L}Psl-?xl9Lf?tiJ)+Viu=0vsAiXw^#h+yOin)4 z*0%&5%gue1QC9IR;NDtTE2dRgt6^0C&&~h8xQNQnnW<=0;kEEH0GJzT2pR@HwLxoO z3l~p~<D4GX-CBRDa-#cw<AxGp+_asoEs)Y_ARTh*vc9sQ4d8IU^WES5{lvbfAS0je z&mlzz05uk43j*PIb-b2Q6bA$x<a*E?kGw&!sI?hol70o=&iuIRpw0;g2M379hrvHt z1k7YQTy}aBXF$$yX(Ys~ZEOOi4z91S!6BrkB)e}-d;H0hLhk+eNJSxN9~B=fx-sj< z%fkaP0SZJWxAiG^7<#joYCK(Mla!P2#cq0=-%d$c3DI!ex6%_oF*bI(JEdWuZA}e^ z2x9X|6d^q(9T+-@oZzsOx%WZ~6yhCqTIcsX@ySJMfEP-m>eTvr$mvdzY8&Z-gnHoa zc`zaa(**`%KUFm_FaVM%Knt&}zg=dP(59beT`@okY8@sVdq2^Ey6@`hdZAUm3C#ZC z{thH$?Q$Ku{^LJ%G9VE@fpWc^s4)(_DzvM2Z13A(WMl;F;NEO-MJ0+yC34EyOQWo; z3;+PcpbWReBl8}--MN`63uVPbwir+^4B#vJu-HWEKvM0f(E4%91HmCd0rW#Uc@U0w zlsYU!joUl;;dA-c|NTDAk%QOV$Z!AemufE3{oilfJl%-EAjG(ej2R|gD>7I9Pae_+ zJ@FQ+Y}*8nS!#W$T6_XrS@5aGO~t4(XUi!FnLR1*V30)}^$`#bpS{3)Rsa>dRefh{ z+zPUix`Kx0IFOvNfB)`X9Gy<q2SIT}vzKb1-c+>SUk|_AYF~0@)30MIQn~+Py)k51 zriF+Z?93&mMs9L*TOWvt!B$7@G^><l4?>T7cWwW($jMQN`buLpwWHgjQfHuYHE8PB zm_}G6$W%9=_h)Ntc%?T5Rpem)oazhjc#T`GUY)>Yp!#fNBsi6K^dtYi>F4_0U!@xP zmgeU_7od3HJ$z$eAZFeTLpJ>OSgE-0>E&vY8f0<1tiq_yK3!-L$Zo*#Z)W7lASB@d zp#s`iiahNLLf8s;n8e8dZ<qqoAqLX8Q8Dm-tZ$daQ;DKOlvCImw~8`<UM|P-g47Bu znpazaD+#d!Uhx9?NdXWNPj@DednG|tG%SYVbjQ=QIxR@FKQ;=wJEN0{cmmcPU=>b^ zw=YmZ3_MC?uA~(Aeb*KSSOEy#&DjoeTfGZDw`~S;6ILOJIiJB$K(405i)8CBu3seG z@CPs&hK}2G9P<L1Y;O*l)k?m&Z48Nn10NRIDgXRJ`_W5N(<J~mPk~K1&Nhr}WY-7W zc)IKZuJHY*YX#cx7921Nq?3y}@N%g*$9MaBry^)2POz`P-|6SoIxsFL;AdbC;#&Sl zGO@;(LA$rd?H;a%djLR@zG%2=MZwP~`UdC<@Cs<a7Yeyv^VP!=`dWG!$!VAE7&KAF z3w{SJgjU)7wqqqj*`f=6!{VU-{_({T9D_GgOXD&HO$5fDRb<oik*XQYtnbCXxYZD) z%BbUyCG?7k9oI(7;hYwrDGD?J?x4d!!P&tAklR?ho*Gk%xNp|%ATnKU_Q2Th05KwL zrU4v47L(K@d;qRc16ySV-Ug6_crDx5Z?6{MPzyLzAQqfBHS__?(abS1F=Xs|$%%=_ zljiYVV^Qk_(y!D>3@2J|_HO_-nt^wWFwK(RLVkWZ=c)}=+c@CNJYF(z^>7K7LeLBb zK<{oDARL&l`Z>>;Y_IvPGv5y*$7d79t!qv}{R4fzM_o@*OwP8)k)a>CJHLm@OYH7+ z6i7!RgTrit3#b;5d@{v+cnaKs{sGx{nuC89Vw4Zkk&;bD3*4&}M4tTx2i>#&73;d- zo&9IVEd<CFcE6$k-c%S>TaK;|A~&*pjpam?mCgL{sUEbX@Lf*_RH*ps)#iMGf~%`5 zU~<F`uhmc%pUqoez3F(#`%QNd!E)mYyXlsT*`%z*<F<ix^X`vx^-eV1LXwgXxevEi zW@gJ^#Ei43pb!jeZ9j9pRaa7odp2I6fS)_;b$2#_T*Zx{?9z%Kt~=lA&$mXcKwgv% z&l2_8mwRgHJ|w&WY5S^}Bmqc*oY&GHJcF27m6GQ@CM3&eJsp#-ex}9$>KJcthEu<8 zVB_Qta2H-AJ!6Xe{A-)X=CNH>K@ay{^MMyj3e<p9$0!sRC3W?h+-*Sae>ix!k0)@Q zN@hLyd4oXg0J!6MVh-NEwzl@ehYvuR6qS{$r|jd!&vjY@@BS-;gJQyklxcl~my}Fa znk#5(jsyJg+?`Cw%<LCx-L2|Jw4Cd4-`7qU0ZG==)C8_W;TIp|{|OQ-7yGjiz2&S< z-<<dugvsVP4mRGZd}xHax)C?%FBlBQsGL%6)Zz;kl%T|xyynmqxzFkegz{w~gOZJp zoSc@Yr-8p1WODEPvO#DhgO8C>?p;m-1M8&Q$eL?3QD1~<6gO+3uC6X*@#ISOtcG^@ z5u|u@3a<I$NCk`*dFyTD4xkr5`B+E~^WbntC@Cqau&^*tO1tt)?Gr_k6~N|uAh4#S zq<B6X531-%%1)xc3@zHhq(gp)=MzI|QB%{<Qo}}$A0QPF#TgWV6~$a|VEbd4YunhA zB6dI(nS%f(v>{NYnQTM!w;RNazsSXgcgM6n94WFCS;ar&clrBk(*Aa235D+KR@1}= zYH-Z)aYjZ)Ru&}$ltaf#ykt&7P9Ugr%=LZH4WfFNsB#(@N4kk$J@;m4B>X{GXaK1h zED}g$?0PjN2n1e+S9lWyf{G4Y)8u6@uJto%mfm=l!sYV36>dR6FR-l3C)c<XZ{NP< z>i(u*PZnS&POWBPVR3W5mz0#Gp`lUD!;3umuqdZS&DG^_=esDbvU1DuJQNOhaXF%w zhoy;KEuWsctM~7?$1M~)EqpH1A|)YVU}SXAY0cqg>URZ`E9fwd{7@)X!XwD}?o_An z#5+<VqENZ@ljCDPmFD~Fovy0zm(7nW^@KJ!TQ1F%l=^_wTuql%#GDcIdtaIp6^?D3 zSXfyhyJD;)A>mBi{FI^%bt4$-S5L@zAogq&!Lnzw)nJCEk&%Sc{EwdjH#yv^Pr$6* z=SNceTDJwGNJ}4#l_s(EBhQMQZjAzBh1=Pp-TdMER#eozae_<DR}$13h|Hv%z+iN% zEmg8bYC)2*`-i~oZvEG65P^`frmCm)gO`;N?<*NjfK<}8?girRqH8yde8SLcjyPU& z2t~kQ_VRR84F}Q;y63&_dKLiNFIK}jG5NEBH+vUzUb)s|jD$R<%fG_I!;_Y`0ue)M ze5oole{NmwA%C-G_V!1Mhm-p`cIJR3{V1NW;<carj`YDqWsa?d)(0@O#H1uFI&EW* zaUdZcdma;U6oNy0p2qGYa?q7Lv89u%?d@%-InaY!U<XLk!6If7qWoBC-cx5cF|_0y zH6BV}J6g9_zYur>Y#Cu#y}lTN+%a9P_icQ9ocq(IOv1#@<Cg{UAG3Holze@C?WI)* z(m%{GSyTTW>g%%`MbDT`7kk;>m+{10Pra`-ZLI{}yEnRETaB_Y$eE=JiUy=SaHM2U zpKh$Kid`;-O-)UKh-6%CIY_E)Fj8%$28oJ|-TB*i0%%*W)^@y9qxfrhxKtPhGXuk` z#N^D(nKG|~)zwwrNL*1Pf8@zcU=;V+K@ZLOEQt)YfJ*`KK}>4({7yGVzQ{zDJbUf$ z@Be^;>RMHeMF-yP?&hL?W)B!W@Gt;h4uGe?iwN3JE&}r#NOJ**19=G)mY9g>Bc(9U z^^X&dABP=4Xh6&^0_$$r<UUnvH&L0Nuk}s;Vtah&YdFa~?K$eBF%~O)S8Df;c7kj3 z9Rf@#dHHS-Bu0uHD7uBLo(P41<5p+TsX6NH@5e!J6{t3|16rTPZO+5P)BTaEA1WGn zdzs9tk(ii-+&~Wivc>Owa%K7YY%en_D=Q~Q!uk)bZVIWc;|#(O=p^XDNPHS2Ev-7Y z4b`&o>DHj2k?A@xe9+#I;Q1C`uwb8)lR==Orx!P@)VV(0O3Fy&asHE+=6{W0<{1uZ zeW!{wRn9?|MqahJx(WUtH#ea<8=*92d%M!N5WR0f@R)Dml<aJ5WhGn{lcVqcWWKFM zq&OM}xo_p8#7m^kemPNW?*vnf{7p9##(pgi!S_-QXmmPN?|-*G+#RS%-thsTBw^en zerELi%5n_F=LAm_*B6RbuoI>npNZIb;4C4}BOo2}hvH8Py&<rAbK=4{ZK|$jziv91 z>EC^;409V|;bkG+>F0W4II3wlUaP^jX{f7vHL51*u{V9T*dFG!;5JMJ>J^Acmyjjw zS%Hq!L3f<8loPxynrj0N4>1j92rCappjzbFn8b%wGq<hdE}rF}*`Y(wj*hU9pNJ42 znh(Z>WF7te%QNCOY0oZ&vK|%M=}f%y1jY(AFL=u<h_yxeh3mKYEyZYRNeChRN7~g) z0=(!qoz>x}eZR|D@K6NsDbw$9ZeauU??s--DeyRoBncK~@R<<dhmlfSbUzxk_N@%L z;?Aa!P@P<LbEM|JT)Yp0M14SHCGiFwXN!6brSnF*1p)+C%asuCMlmNTC{m2c-_XFG z2}DmNp7shMb9gyna)W;8OUp>*Pkrc{=f)YO9B!^)av<=Dr1xN{2g~rWl3GJp80&8- zj)c$IXTw4FNhf(S_*hui8Fq-HYD(hVB{m3zuJiDdQ)olTn|J-9f|ZId1I2jayH%ch zL*l$q_0Qb|s6A;=V2f>G@mN1l3PR%p&Ft{8!=l;>KRvWAieElpOR{b2h&>_mITc-6 zzgj{G#>~tm=qfS|q%{kqy}sr9@n-euB_TFMT+oz6FgH#*c=bICsDUq$)G-d1(5_AG zwy<&Z*7AsNJ5q_JC(jz*i@aa&n0bf@q0c*{Whf3A#;Mi(6C}iT3)ww-qm8P7*Vagk zV$S7mJ&w2QqC##ggsJ{1Q~0UfB3ocx7zC?k5oIUDr18n^b5Wf7N;DtKPad=+CZEMR zt_eHt9_{wHYe%6-Gco-Np@)#!K3xia^dtSTto;$LVC)_fdVg3Jo{UC^XfS!UP#Ou- zd-+K8UQFz16jYK6{bcXX%tc6B+pbnel%N<Iw&`lZN#|=ax&av)VpX$1?=-#6u2jpH zct0boPY412ZMLG~N8nM3N?nA2Dr>Ch+&88z=CA1uv)d2WrupE;^l0U~>ErTyylMAv z7i}p++#iP!5}FTMdm%1={88!!Y-ODm#blkG4BiWz5I81U>xPd}2BW<uc$AkM2`vrf zVZ*O=l0E+QrYu!gdJTd`Z}QSd$mydkmmSw2+ER4nv?mm@-lk^KbQ*@^{1NpD%~kCS zUbGv08OqmqF$9kPEwW3y@v^Gno`eNgFXqM#s3l`;(78S+4ytVyzp)@gl@8{jg?xMv z40Q*UCrK|x@W`X~a8zot5{rSnFTPW50s^6BYv5$TE_wEfsDbjkIkEi$1Qymzz3aJ1 zi5bzyb9kk?CLhjBA;(>o$K~_y*TJXsI9i?WCSQhkGJUU-(Zjj)&1qTQ-E<vVzxD0) zP$3R8@;xf#1$f414dKst(J6oCoXd7q9R5Lw<5{^u2xc&P*CT%Pn%QzxDNKDw|G<I$ zNAqLm$JPWh16NYe4^lkXw|1A8%`Esd!`T$MpSXZ{^4tB}ooT*kvKdtsIPK+v0n$iL zCdnKmTjAus&Mo@$L`|Qv{1*Mc{>7yU({<%Pjrg0kn0_WtgiyQb=*Wj!(e{I|_JdFm zEyT-7A<u%j3I58q5%Ektc@v(S68Y-vixNgWfu9U6ey9aPuhw-6|NoJ6mSItSUmG48 z0SO)HE<r#kr3R4h6zP-(>F$OfEg;<;(h|}oARR+UcS)Ck)Vt^Z&cz2V;>6x-J?pv8 zjw6?UqMoq!>VVaR6g!ppQ-Opppu`8yCrq20CDP->0#Ai_MIj2IuBVc5p<#+WPu9b` zM=k9!P&I8=g`pYQ<47t!x?%TkI2ZoV9=&+Wu$R7rL385S3T!loGwILpoQDA9M_;Oc zN4Lis720SJ00j4rYode|7k2cPY3l0gjJ5W%va*Q52T<qxQiiCaW##0sv9La!+n1df z?v7VtU&BrwB2NbVR)6U~zP|K?K)m%0p-gB}Z=;A&Fx<KXl)4Ux40|<lN^>;*QQQ|5 z2Hd4lt!X<k+5M}@AP{7E{60)H(O!H}Ou8r(1N0y0abK>(IFM2QqZY-dk%n@1Vur_~ zGX;yKB7Y5vFR?TU{^^6n_@DFxQjjVeBj$5dh&b&}Z!&s&FGg08xV6l#W3<@kO3?~e zaNb*-nr>sbQtpfwJdTN6k`~Sw*cd>HtWSV!68hxPjq!*zh9i?$0nSB(gPU+CMnlK? z9VNG{tjzCjBbR5{dqZ=ALzMmBaq1WG&OA+S)D5#T76j1V9<{vvh~|HAZ~y?l(4fPY zWBW`hpUPMBVKwLx5sf7c`1uLJ7}-S4mm#MbA`6P+6>k>*F<tPXKvw@Obg>&wx_nt8 z)vgcW_&`mA)~AoFcl-W!)P9s+dMt3#_~c^AA2M01XsFtWOo9LRJ5?v~3#vEmz|Kj= zQVJUPMU|EP$@cxXSJAlq57?(Sson$kS1ZTPGuZkt^HC||{;15GPWiB&01n5g>3hVW zm(kprb!C&;Y~_+FHH0XD%0EzA#lYb4=X0gc3k`=^UPn#fK(U16dX2VAQ$xiFsMD{~ zU@xt=o<ZzTf!GcMFmvFOZcG)~Y>$6)ryFnnjrlE4x}XrS;wS)vLm~W-2aeKM)QoN< zylaHRM5+T7;R`H{C>C;vCyltne#>qk+=s45AR@V9FY(=h@l2dm9~Ou|0ttEbk!h3V zd2@KbxXOzks~o)UMgf0+a|<((zx$8gVN|1B^K|(8*lVp?DBYb-oi}0_8{9X)=fy5! z<sfw9-)?^F>!!{4Z<WnffaxbzP(&fszW4tS551cAE3sW)!W=h$*#L%L`(1Oj>}3bw zkZTO~-LNarx~lCjxUCC!m|PMoGYc~kq-yqdm}@MGO4t`T>VA~MrEG9hAm3q^Qy&ly z2*!jTS=#{!Zbb7e^8zUVUGlmw(U(pYTG(7<Hk!eQuv7sk7@wXy#-C8L@_F3Y&k*nO z;h*upH^YYb-`RHZ)g59woZ@F=9`Xl`Veh5d_sy|y>i)8Q(u^KHU_TelZie;yV5FH7 z3#+)Kx$NKBQ1Q`H%T>dIEg7Jz5wj)WX%U|1nD7lHuf^)!&H0M=`BRAdV-Vi5-{U=* zUGwQ`ZV*5hR0uJ;&)sRizV}`TIKtNECO3URDmO}3z@qKdVv`eMg!%8`JYVLhOv1~N zw71rVj{%4g*I3~PCe6;e{VD(}=X2)S_dlP<c3d5K`LC81XZ_nuh^=ZplWknkQ??hU z9tDke)`dZ}c;UxGNJuDjf4~)0<6rpeGY=M87&VL3%j)LqRCfzpsrQq3FMh@ih=x$B z$%v>ZiFd)3d+?$Io<~H*JQXHLy+^@EO&sr$XPW+f2SM&6UO4;<Fm~>{x$xsUHbY@y zabv?$R}e<Ad}?0VpQr`feRy$f@24B!Jk9~=WD9#bgQNt%rL|%RiDMlCbl!SCD$pNI zHrwp7uVdR3!lACBFJw7MFQvDHh#mXY_rS=0)2JFA9*)bGbQvD2`c`poKbjGkFNK6y z_o;O;!jo*^+cb2T#pzN8-$V7s6S_A1|LNQ6-(0qbQ)%(;z>ObFf16#gZEq^Y87IEy z7sX_*EoT~>saVMJ{Igfp{_oYyVZCL1UMI?X_nEru53~0qvY|+r0Y<0~d!2mJSSF3A zmlo7N&gc(N$ariP>pafq>#YIx?l(G;NZQ&S$-U_?sn@o7x4^UF?X+Lf=nHeR1&jom z2He&=zlS@-(0?tfR>cfr1l+hk2F)K*9O`rXmx6_Vn}^J3>YMo+QA|+_;K&h=OhrYz zg(-cn<HD#cr<<qevuA8q+I@g+N4(Vz_<Tx_O(RH2Y2}UmXxN7$`BdTK1c3+Nox)^& zWQc+9P1CO?_s9FWRFc$E=F&`lm%Fo}H^<HAqo4`Vne~I|(DDKlbJNf`cO+8oc9@0- zI#mkFCh#k#uEUYearu#CCFb-3o|By)p=P3zck6CGz3$3y8dpIP*v_cZu15@sZx3Tk z!r@996EnS$L>eDI3WCILYHEVKXZE?ubSqNK^t`{=gH$_i4Z1CR>}(|);6~Etho0^g zXFHA}R`I5!TqBmX@;h5>4JP*X_73@7)37Nw7W+Lul$Mqf={c*|+S(c!<(71<+Vc{! zYO?RQT}c9>`(0z~b@`{>ey#gkRXZs}GMe;qGeHTFbluo*$}1|SxhtBR=hy6Ug!jw0 zr@a1~sH&sVW+ja6=K?k$K7KOY?xEv%1~(a{VkWOLR<WAo;qF8}1-~=EFD}2-)HtIW zO-K&lKQuJ7w{PFRPToJs6+=9o1~LRrEwR>cadB~XcUO(XW4GM;sTV7XV@Ef>Ambq8 z;NbJ9N0ojX#NT1L)L3dFh(<F#x1^**YAkErX-r=*gl;~k4isxZ5ex$cb2=ZVL6CNC zoZ^tZ8~!vX!lQLd7ENV^E0nWc{dwy1=yHZ#TCCo7Y;Njo3Eu|Yhi<959%nrz85t6e z_444K!EnvQV{k!jo|m!;3NQTlGZh>A>1I$M&igYJbp`aQzY7qnkY{FR$I^MK+S`2( ze%G9yo=QkafP0meRm7znAm&O=lfpELij0UjaBb1di0GZHw9%RH?z5`LrQnAmFPRHc zDt%M0$Z}r~PvtTPlD-K9hJx4LFpA^8=qKN-OB)E{AoQpFrSMNDCk8o-i-^^Xh}XXt z7QX%5^#1fPFON2TB<br{6Tq2&4{xjd?jt!E320elwX{;1ATQpnf^g+`SpT`IUqAOb zF)=al^14t|mgH)7pHM}`($bP4U`9nMhCDnn)_S3`V#&6ugo((&Dov6Z1=6y#3=k7k zIs)F8@zA!FO9Ofs)!QFwO6zfCeDNHT%=`28`=-fyAV)Q1OD#qnv`ZuuM*-IzIW~#6 zT8fGy)6f(5tJ-f$S8Fz=hU1IICnRujab<h2KcSU*MibE+pO&VrrnY(N`CK8yow?A= z@5v5~g$sV@n*24X!FnZ&%k|*;v~FsO+AeT>@tDK74~Lk2b=m9KXE!&j{o&ufeJY(~ z@e5)TElL5zUv8w8EDX{yX;N^Oe0oT=dc9`Ri}`?GA&35y^lNtZ<J1SG!^Nia+vAR^ zZ{NOavI0@mZFN5_Qb;!&%Mt`l1U}!Yn*Siy^xmD1#Zm|~m<|zU&qm^xRaM~)rU+## zO=+q_8D774ZK0qMCvj@hMV5Bfb8A`p^cqGPJGO)3&r;RuxHKm02dWH6wl!cuvbil) zwY9Z@t{~p|&LEcryBHS(K9evsX1}t<79=J%(QBB#ZmUrb`bz1R$6eF=b&YNs<Kg|w zzTRFvufw-^u#@+|gXHBsROOzJ2^%C85b3)c0eN5Xdu$uqN#`^j1jTE%T#M@}Ki2i& zx5L&)jnvtoB1_8HFzHF43i_(5XM-$NU%!6+Jl9-bTYFYJ^jc0@+8s2a>*3<fw1z>` z(h*3lsMD(zzhiq|-W}UU9eCYvc{%8P#P|=$D4&0&#h{tJ)<Phwj!mdA_CDR$$@DV) zu@vb%c3C}ZAhqRWWg{+Q|3yo~x%Flj>aDL<hcPN!j^;~#<9{V05XHnkHf2Y?#nZpO zzBt}MJksEhWi}sPv)^p^Y$-Spob%(y53Vp=y>{;#P(yWfb-ib_%qd{*)j2txYxct+ zJARRv!>(ifm?CIl5meqMT|5SU6=i?MxyHWI@BLcq*@>mh{Q4CY!oa|gnwlDfffv(? zI(^yQ-R(5W_ww!A`l6yxCn3j8X{{t|Y-|uO2-^gbu%NiG?RMFVMZFyHI9JbYNdj{Z z)GH9v9gh#U*rUQ761J7QunABbudlCxo~)+ZwU>VTM#k|;+!>8la)j~Y$H(lpecZ_P zKg(|O?_86Yzd;je|3jWsgL)CMSbe^cKVV3+h+weFlYFjo=Nq18!EJSbW-L~dERH6Q zB%+KY!vA??uS2-<v$}Y`<kRfY+mq`~egOe4uVas6zN?I@shOD=sz;;rcLb;bVrxg{ z*q-TS(^(&CrkA^rBp<I1=JIFv^YikWT@ST&b?@Lx!ltICBR3atN<q&~-s0qB4InVD zSXiC}S}ZhFeE;rbXt+A6*YfvZ&I#1GlN0+lZ>s+L@4o`EFxTT{J)pt4Vi-h3MB(DK zH^~OAFu}IgR=_&6baa`SnV{ApMv6Yq)k=Juey!8MN=*%cd`V9ydqJ|dw<V!61)AOS z@(=iCrb5SWx$a3%HSjEAZ@rMJ$ia~n6=Oghb#QU9sosd(BSIC4kdvi^LjUVsmkR8{ z=~0GCz@Z9osDuhsMrBh6HOBOqh*15bM!G;(mGpRekxaxVlA@eyb{Oa6AF4)m{U*n) zJ$Nx51wVb%p4<36PcbTQ=jtN8OnlKEP{nh$?41G(B;+iP%|G{waA#j%Avri_Do#@O z`zLmq`@u84U%xb36c`b^UjDmWT+}`9wWT}!xW2i$xxYW;L{95`^n&_*r}Z{Eykp$O zkhpJod3j3ijv_$qRYfw+r1TyQ4Nb06wh%H8rUm}9aAJ|*8k*G?IU>UE>1mz$DItcO z$;W{S|2Aiw=?XDwG+F8GFx}^=6<Zvzy}H^Emt}^hkX|ZHLA85{9*60t9=_hf(HAWF z1Nou9(_t}<%CE@suT6F?=3+#@!`)%?hhQVEtQ`mP+hn_;a&s9y`zI&<D3A#YZWW^n z+HUO*<qswSl%xcppA!-iFrJcL@He-ao0xn}O6u$H@4!8!LVCnc!eZ!gjJBFTgFRaD zydnv8adT;CXc%sDN;XUJb39A_(V*cgV0P8(?$JENX2R!ols1ds%3;1%rBt3D*3m%a zp0$Alfki;V#ZmRk@?rfBpqx~RlNS~hZLf9(A(l{177V1X9=>dkd|ZRrs;Eo=$9R+W zljwtDrgn#~;C%#?0u@HaIwUHXx0AgSjRWba*6`A!m+|B|{VzJ=J;&77?ORR_bV#Vt zo4<rveiMx_;V8-4)NCa+apDMSyEC$NUPabtxtO20Ngq9Hj;OxB9Cn2D*N{KfzMZ_i zIyL~6nkAL!Riaf_Ae!6JqQ}zn>VksJwyR|UufOHGul?j&!!&e0>SRl+d<`Z2fUGYJ zsJ-Lb+qUE3p5G;+vAX*D7L9Z)^`bt@uWp<>$cRY-?vDZbwx2y_M<)K0Cc1=jjb@Y) zQ@;bf3<0X5>Q_zrZihwbc<zx^V#c`tR8WmHlZr^l`=ui!Az!3_lK0PP>bO~uxm;f} zx9Pu(la{BFo!}ljWs3MhFM%H{ElwOw-|z6LhPa=@{i9_3CT|wCeT_6~vK@EN7y42j zV&1HNWoT%MMJP=)eIV_#a8$3OuTRs8GRY}E(e~g`@EOs|glo#fab)5#BcvIgK_#?e z=wwuB3B}Mz>11dz*S8PIUrhWtIsJehq(W<Hh+S>FOhYdbE`ch7kDed5;~p-K(`FO1 z5k)^xOCFm0tOiwrz@39$V(&sSYeNP4w(t#EG(Dbsji&r+)dabv%fF*c{@>ax@k$22 zMmma>ned%v1A;0XsZLS*Ysqgp17FwI*8>joOMYYUVAX0OCs(L?gFaYRUS7^9pP~#D zT}8!+GRhKqk)!_Yjb8IqflPv2^6QTuKRzYp#{Bc9RIMzUjE6M3Zz5l+rMVe=Lnjpz z91=ny=vikvlq6etMv|AMQK{SIKrS&+P*9L1=oK0gVgsb8Q1vM#?Dxb30lzIMRTbss zQL(XhEA4{b8os^{m3l1)hlfLhgFioUWK@EvxVfA)prD|Tilt;@Dr&>cVbcCqb`Q#= z?Nakxl|e^mXQz49lKlSq&JH>Y3yYh^PT8M7{@V&3F^^nt+tdpizQ_il+%GNamVL9f zT^yd=b0&0*9AC`|%)`i~5z%TqUTiV=&B<Hh@gciAZ@n%`hhAY}PP3(%SD2Lz8~5TR z^Q*V_MavczRL=>>D3BnIZ1<8ALGe<B4X|VQ&*u`#X+_%T7^XXm14A7v@AyS&k`0u` zN<Nl)WF-$2P%QK_y@<#VxY25KQh|n`3$}igu8_4URUXIbIfqH8ydG6lS*xh?>?stk zjHADSagZ=!JtHEUW`up+_+f2Hf)*kH{v;0kiS`os6S63D9kP8hUm;79#wf{WJvF=k z%`_fwN(F~CM22r7{YZ4VRebRIWwL#mTI9QoGeV0=O8)y!(oEe*#i74p;#1A8_CJMs zNo<L*g?@29zIkwmEoq)X8@y>|x_TMiqCqULzHK>@h{0iF2~blT)45VHof_%8oy)q( zvxwP#eDWcDR7#2$B#U{ym2DWW9~`1l{`-%5mBImr2N`qvLJ1kFRrWiVsBt^i*U*?% zuh0guQdm%M@n>4@RpR#c_Hvt7qtnhPaj2=8+0op0jQ-P~KgI3r>>!=@w^x82%GF*0 z;sud9I5=2o&~dc3=CIZs^3G-+906PQ=?fwvVDIybip)Cwkr?+>pT|%NrU86u_qo+? z^F)HEe)#YdJ*d9^ax_z5V`BqYnnqy8<KyFL#6o{GHK{;d9`0_2lHaf-4ubQhbjZbT zCe*Y`ir@iRJl`Jq@G9});o+rHR;%;g<ePLJIn&zHjeZs=R?G%45kX>MxR&+vXxN0E z%}3+o<K|;uKuiM-#Up0VX)Q<0k){xE<tE1Av0Vh_N~g`UUbc|*-RBf(`m^&(K%0Lu z_?(_Se|`+83}CmWwsv1%AEl7@@0Aq;`e$3)+lp!2r4o^ZvsDITBO{3E42B~H&&5Eg zwVtiq*;zRR2IqLWO`LWD?);WF$yn>}P0tLy%$%0a)iJ!Sxw)uW@&)<t#pO}g+ana! zaBg0voPs*mJeQI})tcjR6)CB(t|x8BFQ8U$o5`GAzkSIWrC8Y7S~*_KWedzPf1}?} zU$eK;(jr??R#s-Yy&q)c?l`FBPt7`H#2X3;Hq}aT9<Lda!5jP9xG~t~4uj`3c zlN)BBy@R8(W1T^VM@ynAhuKg3&Y;P&Gm(2w#%%R0A-}naQM2ou2kxH5fexZ)P-QJW zV{X;IuC6`kmn_U|ZZ0kkj@2uzHbgPci&}PgN6YJ98@x1mw0MNP8eAnF9goUy^I6aF zWneHp8qp;`IDBWfPzc}4r|Z_upz!;*)!5$F{O<g`9oR=&|1Dnf9%a;!g<sngD+JId zPq1*TNix!WKUkI$^En&ZF6)u^FD+%*l-o4iHH1;05ClDkEiE~oANBQ0wzM>VzPHK# z_H6^)m3Bo;-Y)gyHeQ6BbbP~?0rZPKBs(Mf4t=u5ha&i%0o<0V=Zu|2=5-^nfR(%Z z{&=?EeMN1VI{h=GWmflo2iO=K=iD(3F=xD{rUv2<94(*IcAfRC;;Y0gVLx9$0(#BP zO>W1_tsdt9n_1b|>b2RTzQmGn0knCyx3_n7yn-0y1xaB(mStmYz0mBk|Mzgg@84eW zvvBc3)sbvr16IP8mX;oMhV5%0kA4p~JHLMY0>Sx(p3kt;AD{zZqIVn|Di!L88Lfcb zr}r<Lnwm&RNILG$<UBlXKxiKx9K=uvBxPrJ01F5{y^%zXmhd9*wM~->(gHJZ_wpY= z48M!r2>>*t0<NFcU0rQ#4yV6q03#KhXQ8S2`{sN{OiWBGDLOnllgm6tlT}ecA>^1r zrWRBLRjPgm$EL->L9B?T(X_X6wnl4I_|yplNvv9qyW_b4t{@P^3>V;l95zCAb2S0o zX&Cq<rlkC^o_$@f-DW;UX>D!&(dKYOr;#}HX0JFqX9_V^T%wY1Hk_iOq@~`;60G)W z+NvJ#!LPyLG;Yhh#QKjxfy<X)CmwvaemSuA6A-)pJJ_<e<e3i+`+KxJ&^6jnP<J=G z@|Tl!s76<Fe^u`mR}4EoE6(L6cAr};mPBaR)mDG9CV{qwsYqczQscoyOOd9L*W=&f z0DK4I@BWKto7s+kyD#g~MIJ_!GWb8J>&xJy>bg6U$3n!5;Z(vdir?UD|2`4+JEprG zS-qJ2^nQgB;;+sYw4|HSarduf@K2g=Tg%_wNsg_9-tjMlvW4pl_4`ywNo&O08;59+ zXU|DujDH98^b0QPGPXW0*KES^h6auB{Wsj3bQuZ5<!>vkqLYj$3tdQ}O|<*ivKh0a z5|lL5KjM)s;vxNdD9B&dr`+hn5pX>l4vL>V^ulcw=5#Q8%z99`|I0wZR#h@QI%0RU z<3+orEAg>jjkc!xOP3Easz{WisyTb75}!A1$i|OegW;+Dr(U>};n7&flQk3(Ia#*0 zM!8)pRVx{p>9e#sHyFmDR01CFT1_z(@zWcQ%SuXWtH1F5UQpqtSj=m(dp`DPyEs^V z@D)$$mglm?{zj=(?M%BhOlmD(%7Oq|eK9nqQE|_~#X}`VfP2(rKkl>2o8)tMLi8Ko z#mOniAUJ#{C-6-~9vT`Nh`ux~b47P|-n%L)zq>foImGf<Ha45<leI{qH+>GRz|wvn z6XH^8Rw-3Weyx`#;AZ>j(|ST~GKf_G9L^wwwJTgV`l6pac>;luk)?wuZ)$15Kt*N8 z`3}M#7#oE&?g2w~K((w|wZR*_JUoryf5q-o(6`XY&;;$t%}dqL(a<A$KM4y9$4NWy zj8fEVSIqA3jAY8GeoaqLpRfqlSov<QbRLgcs+Q)lKQn1MG-dS`c()+L+?D4q6-|g4 zxw)qX2A;@Xh)YPw6siKh;vNqyP)JC~zzZzM`!HOJceaZq>feAHq97&33Te0bY(s#` zK^h(MzYk)byo-wq&<1YOXv3cdSB9PJQ}cbKFHedkzO1tP(s)837TnG8lbrEISXflj z^v{}fN6)u%Y1lx0U)0UO#4*=O+Hp@Sg4>#r%1lnG<|_a4Npp`T;Seva9w&<;@2A5o zDJdBoZqJ94O_M%_Ktz;(T$^ZRZMm0Me!=>KCCudEe&rj`mZ{*PV6(h*OIo2=3>UM} zCNl5u#^|-GAf%RdRn+&sZJ1G4SB!~~=w*0Y|0;BAN}FQroH$~BUXz(EQ4IZ}=8Ftf zQetH9rzBG&lW9Zh7U$1o(D94{CI}>EL%{XWPg6a>$busF3<hBx$|bfkwgGO0&skZx zN&a7Toi6J$I>_eMim=<-*?+kx4fhRiUh+_h5P++M@W#B9DGLwtY8-WVR+F;DOAt_O zYLdn0M<OwP8zLcr7onFy!Sc=ecyncT?}9%wYsVvLBO`-6nm#ezji|r+V9`6ipcS@w zczB476**<a*2At{F}gfMD1uLB&C;a1T;W6>V}wrkWaR<t<KjNNXQQXIwpP||{2Vq` z+gT?va!NjS%6iM0jHJO<w50c8m#p6br$;(IDk|y#M3bl}Vi^;#80E@Lwco$9ym|#> z%!r$GX=y21lCFoHl9F<5ZEf2Na&&a`9GGxHufIT)cSbX@dp7V*O-)Iow|~Xa0f+I! z@3Fn3Ls*UP?CR?3;=)90rni@YpI@6XfjLnYr)Sj%u@+xYP*6Z1z4Sa`od3S7@5kHd zPsFUwc}%j!@NjY3QZ*}MV=lX8Sj^57ayMtkz@nz*Su<|Z`?Pm@4WCJ(-krdzl$mnK zPMOLycX$J(?gQ~5{+g`s3I|K3twN3L$s6nHxZ5ztARV)v{{BG9Ex1Wj)vR7}pL=Gq z6Gx4XD*F7ph>47(!(6wtw0zTi)p-iTb5GjfOWM+kp~gh+w@izPjSP>*S^2lHJXw2& zdzi<UwV@zbt@6{5{S4;EBCxZbXibaE6AxW{vWgTt^Y-Tk(wGD5XU|^_<m@f%n&uym zIgK7+lqdc>7HLWU^|B5*va%3_v*S#Y;qbR9GA5kBq~Opohw2^F9(z;M7cEy*N&iXU z^jL6fr)Z%<@WcO$)Tq>#8}esP#SEM(Q?sY-%v9&y^2plIjM?}RKRGFQn*b0*fs3?) zutzygdUI_}T}^j=`$!Z&c-gQdQo#W=CK1NERR89Qh_WV<AvfvVOVtPkHY_7wCW$zv zi2uZCgSwa+zZepi&F){Kw~4cEd&HO#$L!!kjWk0GEGqP`ZficAh`rU$9C+%v<<Bfz zB&?Lh|J`YYrhb%~kbv=~Uuqd;RqM#~FQqc{<EuoF|FPuiNg<5-`4hy^l1ZkfoO6vU zz6-fxVOrnK;^><UyO2}mx3{*?bVwt`X)!Ru?(V#Q=%~MG=QJJs3S9JX%Kx^21=!DH zK!pN9$0h$=tV9)&2Mmaj+RWlVk@P1O*=nzr+PtpvBqC?ZwVsocx0;QlnbULdMEq38 z=>gX8wO%u-<x`O_zySl7ZOxsQP^@@!ef@iGZUTx{uRL5#RUlNOc>vr52xJh&Yimf! zkILL9D!*%v^iJ3iv#q?$O-yu~93`q|?dI#4Sy|;76C|Xh4BEYKx<jxLP9}*>M;V$Z zO%MD}M^;)|X5!ZVK1-amzCq=b0Pgii*ZrAGp!J6{73tEfzLMFzM-$?{%T!4lBx&^x z>Ykp>&wrFCXj*)9QIIf=E^e`wvGjOoLw<wDld2Z6L7TLtf{I2Cf#tzT?98@<QPJ$l zA9D(DPB6z%vZRzzP5H7+`TTQ$ttB7-^OPxcUQ>q)$NHfO^Sv_ER4Z%49V+2L*=ZS> z%M|n6l7};sf+C&gGU30%nh6^$Y^tfLGN3G1XZBZi+eFZD*t_PZ{SK1x%}K63OVe{p z(}gEpV)=2B_&8Y!8}5)VY1$(_lM$0=gWxO7^aXUJ8=t@bl>B|2wqU@<yBT%Qw$neC zI7&PkMCLnr7<e)fk}6R}b6HFLr!dWbhkk-fi=M8L7%<h3-)g@Me8pnuM?#TFOw>qB z`uH_TBPr?QR9QVMMk9~%51+_9%zl)lEhG$OXfHb}%PsDZqfI_7J5HoEkpkCn#e&<} z@e5$2PtQ+nNywouCP@G43=FhkyN^$e71z~?=1&+i;Vxy)p7zv|>y9SFysx)rS$rQ{ zVr8wNYqT*NTDY&t++#4vFOan!wgTmV?fpWzxVVUq8nAYHxj!q$^-)(hBPnU-n?@DF zaV91rK|=AUa5YXr%_W#t$!|*J!h0<tE>6$L*gf->kyk*V(R$Vv;0|nz$8s{*h&Umm z(9%rA(|-m}Vj`W#uKCB0pFe+^n3)kmp`COJQIor^7+E_N6%}Jyf?k`y;%aMao1AvK zDRuTikns3D{JY$*U}Ym>(<dh;-rd|Zkv#`KdUSMDNlw4Ep*Bz|kLl0uE++gb!?W;& zgy%!G4h|04qp4iJckZYnu*Id>ay{%Gb>Qa_D|8kbY|`J^tkNk;OEWPsrSMwDgT!oX zyqYYO+p;SV-^xTDJFl#)q?5#njfx6pjvZSjHt~q@IbDrcEVg?-Q>)`GfYZ}(D5R;a zp5%BmnX(qtap%2V$TEB9o$h>0?zUxRRUzA3jWbk39CNhj$LnC2tpyh<V0!g<bRVtb zHpyK$W5JZR?XhggZN;ta?;plsI{Sg^fy-*w&I?aZp$(~@zTbhrO`rAIslU0Vdf^PQ z44wRJ>BmwP=tyg3%kjy?RVd>L%%DQmX1N`sXFNT1u2C$oFNQoV+3n5okzlxHRNk-Y zDKb~rh8~P7vfqtTrXMfuZsVu4M+~|!HfsVIV|M=NQv2sgi>RDNr_WKvP}I2Wv=3=i zY3b;+^Kcv4KkC0oOk8lKsBUPuuv~9?*fEHdlk;1u_xs%`<fkt;)}ismb7T7lM|fBa zeRh+*gvpE_^0Qd=VlkDA37=AKsEngOkMdX9!fp5VvLe^>hNYl?m!FBqWZ)M?25uzL zeRX6!VmheaysqxRYuGLeW?>M=EVmg{oAxgw`FPevhO-m@x|iv%EY^6JB6};_M=Zuw zteCyj&Qsc~&5#)305#`J+VQ|`Cd_EkWIuQ0sGP``Qp)7N><YrLwY8;_ipk)2c{MEb zikZ2K9kHuJ51ueRX7}u@+r!-r#NT$Qc?5*u+2#Oe>hS!$=he~Dv+$o26E*r{cy0QR zfKmQjdP+(4dz^1i>*&1EYra6Nsh=#2lxN&uZo9p^IR|m7u*6DEL19$O%bkML(|Wb+ zrBSIH{@;Jn($bi?xcY6LmvxqKa&mI|XEK7J7SO<D4-XH-0@QYIkM#dA+eh^Rb1a*S ziuwj8Rq3C#o&9mmR5WKN{^NpHT2@|H+fbP-WW-Kfr(IDI{WKykuwZPzD8d}ubEU)2 z@AknMdXF6PQ!<}}o7dv^s_$c?gSCso(;jx{NDgMVLxv`8pR$@Ad&Cohh+N5dZX(-t zzL=c=QQIyQLv~_$UzUq2j}JO7Sv$P?xz#xqX+;(%?s~5SsbisJ!v=mAuN7(I{_72v z%-?X|H3F6S1y+;3or&i5L?{hRl{HD4UOO|!EB6F@>>Tz+<Cjc)9&^Nw$N70@i~r;= zSbx{r)9-GZSbUcBspuZf%g;-^bc?(;H33=66h3QPeh=ry5;KBTsr{<=M2SL4Kf>;J z2obG>?`b9Z__#>^r!`F*VRSN7fz2=2_q5thVWH%ts{O9}E47Bf{QjQt@$N)^YHBJl z&w*xb`mbO^wWQH~gXPabQKFY=)3>v<3>W&ICsC+6uys~!>e}_YrMo<6?R)No1r!TS zLd6~*88VtJoSl?prvC%Z)QUmgPeD#DPCJp{6Aa3QyUm*KZ^g>x$cCqvU*cs8Cy5Rm z=vV6<e?@*|rNvZ$Th*hZA2|g2f2WX8i6~gzEVjTJcPS!={G{*nheRuy*WzCaprpiz z6GW?rO@$m%QJh`J`R^#0mv|A$#?!M(25mn>@|VJ|m$V+F4^VZ$jELtpEhtIe(+Z^~ zg+C$qc?a9Z!N3m=TH`uz<i5V%Um}7?-xmi=;)s>Lt==ImxrHXq`2;l6X~ldi{n&P- z|CybSh#C{ivh+w*L@$?j@hxXnv2PPzL~LwW7apWD!Bn+c(58(j`$GWqouC(KRyOf) zEKgOFbwL*c5m7Q?gXy^g4S&dqyOhB-c270VIkF2LQ{XZS)BMGL<zN{p1V70rr1)Ru z8+M4lAcv6%d4Fx}-y*G;4c<^At?#Ro*l{2l&Mq%~1hQ1~b1>qhP1bdgkpDP{`NY4+ z$LY7v@)H%s@sKnLFiVNAbwuueLV$!?3JsuyjGY5Y*y8I%!WH4o665=d#u|u>(_@&i zLlH}d9k`54`i6yjmui)`!D>KPK)@@;n7}_J4F<`b2=d=4#>fh5;>YQ6WF4x;5#!=k zNT8RQaJI2wLvezx9MXien;P7J<fanxzUEg{RG9*`%RpLFt&`=HY`6^rDnSz3<bC>V zsFo?>ls#}H9sT`Mc6aQ_xwo)Ow|6IZj4~iK9QM;X8mWt>&mr&eqH$S!Shat!^YPud zWVALEZReA4ot>Sb_S`dSb-~I}?|rPT_k|y>=@|H$ii*%rU=ew%Do*Y{>uz7&VG55u zh$urvR3I3!TJ88fwXYIi(FwMx7kV}!dEcCEfgX5Q#^-XrJ+cQcPX79}72d@_=|4Cq zo2hukuNY&bsil>wOnAkwtc}=|F-;^0J+uKUgmJlmTFveQDa6po$jID0IW^Ve>PQdT z^M#);v*S!@xMc_%fBXvu<iiwx%CC!SOk+*;{ORWArZ(NEwRF375-zjh^wvzol0=`| zzn6b|zLk~zJz5fQ-c>GCWlk9I_V(5nC2mz2N0C8PMNkGC?N;6q<A9TWs`*h+fOzSL zL?j^u5^4lwbh_4bC?WzYs0&<-!{K~A;^~*=B)y<uTXPX3EsR_?a~1WpZqcYs-#}Ay zcVolpXpv7&Zm7DtdVPI;czBqQO*<vN=xDJiAvJYxef=2$fsv=Nm6er@45;D>;;-J4 zFqa5Yl95^82TD*PXQB2xXw7L2X_W8I*UMGuw;dcD4BNB}u=zKeVFpSwJd=}?V<J9b z%3c!3b7>0yubO~nH8sG3H;?iuJ6swCl2f8a>rvjiD)S<)7_qqndH>}e9OJ>`^3Qa4 zx2S+X%dcP3p+;C(SZQyqLydm-gyFgHXI52J$riq1VR3SHZuPvha(DkBTL{Dfpd9N^ zXmBubbRWD}DN;P|#}8h2K|Vgd*RNlLb}K9_1nyb3kn`nB^S#MJP+|7xzMHG5P37}q z4Q25<e448@#SHw}+uPLC<g!1bP^#8lOY`z&F#y>%{gp~RfqHG9({%|uyJO(q->P~t zF*B#aJZjt81Qp-_9<NV&@XUu(RJ67E9XEdgEbZ^_e{@@F-Y+ffxH}ta_qlaF_)UP1 z4+%#M#UZwCG*efvq7)>2t$lHj7oU-l0n8T?3c3ln4Rce43~pvRx{bew3$lfd09CO< z)=$=YunAf19UZ})%SlV8ytM}W41AMLv$LhWJ$tB;b_HQfHn?)c<8z4#Hl2pgi$6~1 zZhj$Wz03*T;0>e>!(~`%PUN#+?fmuY9cJKrgQp(Pm?CmZm>YwuzV)s1;i|hJaS@68 z`@ifbGth8B3j0#ZiSiI`loF1jZ;@EzcDxLDr*nmfO}ox~EDN*(bK+oUXXoAB9rK5x z448*%sTyJzmDwtT6+k=n*0Vx)Cq2MB625qWST(v|)$#h(t7nnDOU*9lr>8fY2})<@ z=Wj_BiWM^nU+ZE*h=qM&2i}PB_}$%I@b6}(riqD(nL<9KJ?u`NKO8nBB_w(Qm}O*U zT3cBOfdf?NG!B~7g0q9f3>VJ>PWbP^+y~k?-B$MrL-x-L4I{18l>`$g5qY52<Kp73 zc%P4yekh&+y$O0ly+S*hglqeJOc=0a%hkbLwGj%W(}H_@X9r<<PuF`X1Y8$8{2oJ} zl1;+lM68<ZF7w<@G(G6aCE&tb|NiaxybQCMuS@)<e)zk63D}hn#fl&~Z6^x`4(7gx zF);f6n=^l@nBo3-f3*PasO;mnoAVvNiwUXcFBRqaT!4d-<BcIAB&^h|Szql60y2q* zjSVt?-0QgQrF@eHa=5r7aO@zQR)%-kEl#MLbZsY(Bu4_MnL<;sO6A`UFq(_zU?7c2 z;9(-O^ih3735!>Kv*okg?js;1L<#v4A75*~){TOJi&!XMH7iGtcrr$UgMQrvgg08! zqMwC@1^lGV{q$3asEVp;9(=F;{;!Uo-(xnQ#=%4uqSv}iuV2SRMv@77)-^UZf&?PQ z0baeVyqp{;I&fYsZpW0w#Jr##0#Gp0UW?H`0}6k9u?LSNdV~Aq37^{$`JDx-NJK=$ z;?fc#7Z5usOcux>JU^e)_IR#XLVWycA`ic(q1MdI%wOTho7m!Fb0ESVS+jf2Nl8gu z=A-g*3JTKFzgsOofS>2e5tEZIwt2Zh{M&-WI@*2OT3bO@aNq>RE<i;==R0_M^2cm& zD+uuO1E5Z(#$;jn_GF`9j{ccBQF6-eE>M*uQ{Wg~`1M3Y0u+n)7pefVgWh&_a%yqd z2o=rEu_SGd$gR-U($vI9jf;!Rowk}S*N=W4tY77KvKqj?qEBN_4zBLT?U)nCSk~_C zDRQV0acC}asF+Jav*qyYDQdak_P&e|CjJSppno&wX1?EkD{5us^t(?DFHdL59$!n! zszB8|emHJLw6u7E91qYstYbEmz(>8yG}S5@MU76ErvEdMAJ)+!459wt)E%?!;Z*Gk zbyh+mDAe7{3rJjzasR*D+vKFAh~7^X>ej}_K}IQ>td&FpG?>T{5ovzhL$#p&g3zBj zIv_qzaB+`jtEfcq0j7~g7sX+D_Us_r#THq@-STJmwUR1|6;0<2*Z6QBa1a06Th39D z-dz!X{TlaAiwylU9i4?RJgT&q0OW|1jhtI#l({0Q&z!GSOQDoNBV_y~Xyb55ID_%S z<tdQRTAy`B7b<4*Gtgf&*3{%$&R>iOZNGnijO6pRMvds5Zvjp~%5OyED&=E1RXjgQ z#>J9%a&M~Tg#xe0ERXM5>w{d!J}ys&6Y5EXQiV~0ohnMUwYGM;7DhEQH6@?QS!f9_ zIx)03wM+}8>T<}iq%n<oX=<PVLoz6~Oryq3m~jh=yXlK>Qd8=pT0WdL@UyYDZn2)N z1eG15-h$xSGi1u_^Rbjiq<{b=$6I6L?t?a*p6l!DUt4E@R!~t<b(<UutE<`R>3^=Q zP)PusiH#xVSO*81-gAaZgoK6BVV;4U<uL9?hWz5MlIRpBhoA@1@cxhh>S3hsZ#mw> zhw>873^_)a7U%q{I(*n~XI~EuHui<90$HIipn_{%2|YQ>Ts$N=7)nHh0^xVwt+trR z11AEyuaQ3?P5%sJXQrZtmX?;9+6B;0p}9BBS$e=u3VUC(gMj6ChM3huw^eJ$%XKt0 z-@kBh>hvw_3oVBmv&m#N1zWK$qbR@`DT8pu2Z8J<X2INdzXS#K^hOfBlurTL5J-)w zSIj5}=l<#wYR99p4zJ5Gl5=}bl`{WioZE(*)aLW&Bv!4n-koeJVc*stKit=Uh7%AF zpo&C+mH-4cU-!R!d=i+$G&nJF3e1ew5Bs&h6aqg#otCKNqdz63mv8U`nZb@j#%uo` zD0`x8;SITeOr{JiSr0pTKL>f3&YV4IzDpJwdxF#p&SX@WuwXSghCp8~E4G9QRYj43 zJrszv8K6YZwszoUfT(1FGSuv{&yJ(h;p<~)XlP+!0i4I({k@SA&j;Axg{#x~G*IEG zsj1*#R09KpCf$c#B7?fmbCZj^Dp0hSqhDym2;b;uWM|vy+pX>IlaY}Lcwe6Ywrpx? z5yQSID158Xi9TYMkAG2Q*_@Zx-Pb2c8wYF!FoM9Q&(CYe(;E#kE2xA>NGPOnPgvD^ zwk;0~Jb|2?tchV`V;8Dga+3lR2Vm5J-0%7%H$=Dcvvlhh`hl}rP98TmRFSf8-?Tz& z-0W99+6xMP4h~|;HWEUin~Uv->wo?nALA{(4>g*EPZB5DOyo(}*Z`$sb3Qs+Zqu=U zY}d^_IY0MO4OHoj#Pv^0BXzRW{}3yjP}{g?kU!!6Fihel&>~eCtTpu{#l;@FE7G|# z88lENQryKo3gC6Bo3`D_9KJsP`EkvzZ~EWmK66AG%!3oM3Sy3dfdQ~OxFs4)(L&X& z?QMR3{`rLk>w0Z3FR!33<qsb=*4L3&bW~Jm2qV|9o{R<pyLWcxXl`z<q@+};rme00 zDtTzjk*|k+YisN8-@m9L>^M%he{Ir=#Kgo#s>G{ii;IiB+}(M3dDS#D7Ut$?FjZAl zj4Umg6J;+w+q5fOot?$;Q5(|RJ<iRntjatdCWqiCW9QFG>&j}MasCv}Ma&tCLQRuh z99|IaoStcd7gHP@=DswVkLXl}rkK`Zk12P4|A7RXxATvt%n>o>i!mks9WU}Kp|`ic z169z1J1r_IDkUZ5vB}&KnB0qt3ytw(BoTms-(8oQ!#Db^>*r_1kNg<uu)p6^^cXK` z{IOa$<c3(|GhuzuQ(;OqoM9DlPeINi*C^U$(EYD75o6FnT5n0Lhb3x<T^#r{zc@0| zpF_ujhD?8sjvgG@t{$>ThXvZsV4qa&2;JA0(uWys{j*Rrnu%jJh(kAcZD}!o;05GK zFS*utK1I%YS1Io`G0xGe{MA(J>xLl@J$e5`GyT-g71^>7EQC_NsX!^5GyLZ#veeJJ zCu@mgU!*E#xxO8Vq$|y#vkBR?=jv<VM?yODOWxxiPm#Zyel4gSXGom!n^B1UP|cV) z)Hp@P1BD<@4*7xc-RZAios#cypnJx|zolRFJDiI)xw*2gU1p_<)0UQ%@jIQ-Lvnmt zTwO;;l{irYjer;UVW7Oa{b&9a_Y^GbswN?|J&d2xe~b*4)n#R+Z=v{V`}pmpf%r(v zWm>?-4-gt;Wa-70ilx(5X+<_RHe@?)@8b((3v27^eYA<@+>*$$rY=JFD%k%Ep51B^ z<v|Wg#Q#DWe29VMCxsXL%v~9pv_*$wJb6runFlDRp=@w)=I@(O_m<2FbgyqfyRFZG z7O1JK_nqGzOU1B0{9z#?B06y&eIA&{*VI(3s#;lGWM*o@EsuAi;z*7WnV7SU6bOm& zD%XD^f)Cv?TAA%9=@x&+$aTt{`8HAZt>t6^Kq)j-RBrbT;A=()25z>~?MQd795?!+ z-&)U<Yu67}=DwRn{=<h48#6Y0G4*2(9Tk~}X8129DyI88pj}}p2V{Zv<o&0uYOl6< zkJdx5Cu|n97k;<W84sv&%(4rD0+ZR|rZcd0i%SlH;84KaAKQHriWDoP@W>_F9=kBY z#X_BT7jH<s@Vxc91`O1fr;Zk3KTyNhPM^7=LWpfcccg}&5oV(*!1wm{NTatcF+lm) z+1`FPZ--XIKduzM(S}`8RyN;aZU-un-jZ&1L2$=cJo#5E;}Y*xaC(%<{nVZyHBzB^ z;-7f?r#@f~Ihv(^gvE%RZyp`_K0e%YF*7@c1n%&n+v+=!8(a<1J-_mNXYh#Dj@tP? z{!;CRG9O_3H*2f;X`2>|Mhg|a5Aap(n3;W+Z)Fc=y%@qTJn@t|7$J}`hk^;F!~sB$ zyfNRuf6upUZfzw`qO&KL;)*J(jnA_Lvclvb5>FqI$E~pM%#SJ}A5W*eKlqjR4k#&3 z4`v{HtU#BmBXI7@rQtgsrD|9ZcG763hzN1otet2{I@Z910h3pW5qV5rUbp5a&vE|K zP*;Bi#R4LnsaQN=ad3F3a7qhm&V<ER*}}c~94&g8cq3wWBz&Mx<o#XVn{Fm~q|tq1 zGBTx>mMG}-z<DF}pT5kOXIvo|HNkNd%XI!G^BG0#kruNH8Ot5ru$RF<7aQUZvHx%+ zH1vshdwo4`dQUpOKsw$?D=kkm#+bP8tMPr~$NonhT>e0i)kShB7o83ng@vZ-W{h`S zTmk}<<%a=H2Je5FG&D4z#ysat)hzbPV&wZT)!eXMD>~1@$Y?D?N%->gFNi+yNfq>R zwY1zzV$%Vj1(0Ry&!1+mt0O_LtEA*4Pj~lnoyO70!9R%C+WI}fMDTfI{O&Jj$IIc| zf)3rm>J>Ul8N6|MB_OO1S2~25m@o-PM9!`Or^QkU$52Z<J72^z$i)M;kB@JEeDH!w zNJW!w9UpfXb_IeA@Vz}m%r47>c{qxT{{#r*=;Tx^pL&-4cvsw|BjERN=eFWQL`ms; zckKZBApH4DN|^fzF#m}C@~RDy0;vJrX<u(8(@V${PKIC;HP|c=LaKoeGaX85`tgHl z(-AT5xx;IF`}a`z?j)$oP+DI8ZZ|(Ri%sR>oq}4NwAzOc-yJrTK&<zKK6P?&@rkDy zUXLqbUV8BmNE?eRXC_ZG9^`M{1-*H%nIwfztS!QUv&IYUQI4U*6lF{Z#|%u8wnz(Q zAoxOV*bdi`#6yoSu$cE=he_h`SGX#Rb^~i98AIIVM80|><Z~PNvh}4J{d|MVe(HDg z4{*5oNXkT^)6PtVwu;i<<sg#XA|Jn!MD(jXg)yiE5(G9>R9r~%G_=WS=V<QxP7t1u zX0yov=q<$bHelsM8D<ORl6d*~8|-F}#2wFaM1tzH4*_1zROrk$Dp6SovE$tS+pqd) zbqNR`2?Dxy3Ap-7y%t~}6ap87?=Rq>G=tv33?zQ{`8PmF$@Z(|Ks0QSR?hrO;Jn<V zPZi*$vsD@z8Ug|W#YII)iHV5q=$o3F01^8hw_W8NtKvZ=?jLTCZ5A4q07+k;ZXjMB zvNe=^b-3U*_>~#RTY_xiMt|(%Ne>=~fXkj(;TS66hgji<lJfElKwzy+P8c}kKfG_w zgsb%HtE;8u<aFw-rU4t9sP0v-^#E(o-QB$$*Mx;l3V~=;-o<76xpn#nyV@*-GkiLK z4>wLTEut>aN~cEk_<SW&?T?)GoEQRw*ozIRg@zju2W*VzvcKtB|MRY{OGiyJh#K=o z-20ZplRe(VVkn7XW5Z8LRur;3Q~xcp_~k0E^3DMrEEedj!(UfdwxA&6{Cr@Rf%mvI zf#8aKX?|+H{5dc03k{`Reb-s5IBhDYsVp#x`uh6cixfbhiHXvmU0ehQ<dl?@EHv6t z@i_(;Ffj>9sHo}cA{KH&ATM6LKou$1ZK|!Vw(pOj02~Dyd&$7i+uJL$^liD#%b?l$ z3B-Q2Gr;%$9~v4O5(KeXuG{hQn9%L;<m4G>xg6#);8?j8c6N4(iwe8?NP)l+3kwMe zE%)}C_C~y59opXBwq0)3s+u(>mQ+z|aXkc<Ssd>C{(a|H<_{*EselZ{#l@3f>jB3o zL96od<3|~pCq3-&A_Y3kPkk4AWHVJAF8k{G`dRXfWc<!0;;#;u+Yni3k)|l8z{bSH zYrhH+gBKPS^4KoAyX|(N)@UMDm8^Dl0Vzq{?aH8kuZJgHN0VZ;izo-5Q&_mqVX-JD z8eH?uv}ET;bwGo0f@)bcUY-nhNL={mF<EiX$US!L&p8Kmt!^INJz!A5JVS~iBO?`R z=(2X6#QmC^Ym%F-)N6Lb!0F+Pk}dSK^4e);(7$JbKVM0ZXAJ6If=V#6u>tG98D&ho zdNU^U2&1FhxUVs0V`E#Jb|N=7Ha4b=ea*^RURfDxWSwLRtYJ%w0IWmi7H-I%GN}Ww zL^>W7^7H4<I}p<E-n|2HyV78z<LKyUX2z&yNE9xP8xxbGh!bO~6(Wjw=;kIw9O~fW z5b*d-?Ue$H?(dl?L-x+z|FkOzBYRJdHXZpy@JXX3t7aGG=eu`M@>9wCEnWBvRrj{H z(IE(}G{X6liM*JNXT9Y4`^4zYeBtFlmSZ3q^yG7prc%pP-GRRl>fLPXA)m9-2%VhW zQ$a&B?RBMGjPI7(SC7|=Z#r7Nt||w<+}_+&tW*a~?T;|rJlv>pGcb!-V|S22AW^^U z=4wrkm)q6|2!=Gu+1t<t3p!&%)3M0jeFl2C*y2_t&lnjM1#>+h?ysen(Qos7F)0bq zODS9E9>5I*0$6)%?Fbj~3alOwzR1YP+au}8iHY^5Lxccue#ZsvcrYDU#Rs{#x>9m{ z5)UG>^Sv*6{6x&i#8lGU%r7X|1{4`6eUPA;DW{f)hlh$vTy{2<d`rAEeLz5fRXsqi znejc3;s{@ltl9m`(b3V<(^H>+7rx;Qd&sD*y2^#iXWc*Xx5Kl>87hXfJ<0Zvdf1^` z*^!jP!wX~S@233}s{HCT`f5Mh*s$sH#nWr)=wKUYe4EzJ#O<v%8%Y~U=c$sgXYY5A zk&yuiPA{Wcp`JeM;Nns*PK(&~2sBR^9@WFpn+|$<dhf^kD{yiLH#d*~grAEzfH_<1 z35%r^B$b#Da62m3YaxW-laOd>Ym?&R8yXoAym;}}X?wV;;~!QQVqm~i5vK=0h_DTl zGV~+3l1Cy>^pi3msu!L<&d$!CKCK6bKhMw48_g8BTK*LWsHmo~@#^G+nAhI$v%I{% zZ@YdKXa)`r4#Z2Az}0}0%BxJRb_M0<=dXk?53)yf8SehB*~k$=X=`moO=nnr$`w4o zwYp!M;ts*g;@P*2NjsKrHC=>ka1)144{`Q-ULD=fvYKkWl#)_<Q`O&)&o_F}^PP2! zy*1VOTT>e2n8T~Y!RZl&Pf0~LF#O0~#53NBJj5Kfif9EB6O#l+1$@-g%gd+O*xwr) zV`CyjmAQF&-MfRIsH>}sh=>5?iL;r1?_wKBtsNSSijJ<WrRB1>s8y==&Te^eZjO(U z5xuASU0mD;MkU+nvc#5_mWm3*ds(Ng>VtxMqW0iDJv~OK%$%H@G&EiR`_R04RVEcn z$^L!{F}tNgd*B6DsTwH(!9=UaIXZSaAlHRD%Z>g0$h?x+Sf%uLHspxmJ(Zy(AlX3x zl!36aCCbLrgOdnYu8ZUJfL}U0*NNty{5>V%u|@3c4igjv0U3r%0SaQhc12Z{orOh7 zVc}K_yYQ1hOdOoug~qXSD7quL+vBoei0ElBEtT243x1#+vVL~}`_+qUep`RKLGHdk zNParhgyB|iNh{Q?DL+|3?-7=rMq^{R^uz1XQCiGE|C^EOrb_0vkBBF#l5K3ep3SG@ z?KQC-s&+%9tr7%=fz-A;+l0d27Wyv1*!klA5TxVU6+?a7@Tq#7fcJbcTfCa@F~pSY zSOovWMD|%jtZ)LSSdi(SlKq+SO1|U7CAEBUBeiNf=GP-k@IP^-BSFjy>i7QsZfP$J zk$xI9Rk%bK=Xka<Uzp^fez00!sC&!yEPR;Dhm1h5(^f(0aD0lllO1PX*{T|Xg#1uU zf?NT=K##r3;(R=R^R&G`ZKBoYLixB?QUuS`)D)O33L)=nIJAijg>X1~rO<lT^>F@4 zf~>!P<CE>QSiqrvX_{SiwZ21VT90{Qk}X#`(^kL<B3>6tEeM4|bC|4N1w1r<$;eo& z)8Y!C)Q3Z^&trw@=;%xdIoB*P-Ft9@!y%MUeh9T2=#5#rv*=+!AfX#d=yoTPXHUDz zf1*FSjikMeiHSjM4&O0c>5{gFtj}j<ZLLwMJq@gkND#WH1S=BqGP@XrEA=V7qsRv{ z;XMkDSevQk|F!kq@mRh8|A%Dc4smB^lp=&snIYXpq>Q&cx|6q&k;u#l5wfzk2+3aA zk&!pD_g)Fvd-HvrK9ApjzvG{CKknN(*Lhvn>p9N3&h=72zV_eibkgY#Xd64)9=4M8 z#>{u6wosnzxFPNek$e__m`g*&=+cf?uTDC;ZvE-a&(D|r`!)axGEijN{WDsKeQD)z zsRWQsvK4t4B``VHnF6A08PalVp?_y(oRyVT%J2s!{K07iE*6fctgJj*{z}|-j_P%! zQhKb|D>HM&pBnyjU{B;IdwY9nIF&Gzl!;Pqx794DS08EcfrsA(<f=ZfoB^E{a4%(5 zk*E^y?V$Z3GlPx7Qu2<_enfBmqzDD$&_0f-_ZAVEV_%jQdUxH=s@i3Dl^x6G=kFgY zg7+va+(0WzFAn4fFx?Up7rmxk^ezo8wtzmJf<^(0XR7B01_W5F{<@d4wm4V_X`~=0 zx4O2*06ZTpWPIgejO|pt@2_9akeULcmamqhphZ8px*W8{i3(l5d>UCDG)_!SPtVn^ z8p@Opotk<|?;j^<<foD`0zV%tG`?ju#;cgEL5Rg&ruJ1z2VrzF)!+}_?c-25LSQvO zB$=^fqVE?Z!N+#ehX`{Bcf6z4`IsIN6}1b%7dN6CVI(9dSZ=rUXKrq8d6|Wonh+VN zu;=&2GcYiaB0w)Z{QNtco4QqIy+5@IAz+am)ozN47-Ry@qot+QalKw33k*k|{8%Ha z+eo4Dqj)9zwXW3D<g}VPIx8b(8-T}{y2X()oApofe{X7A%llBSfVJV{TmCQP5?T>m z6Ws>(w-(4e9ClYHQxzhAyk~J)=)1<;2&20(fQgeRUO$^DB*eP#%ga_cvBi@4TjPrp z24up$2N!B}EjBD-w_dy&GnprFWiYs=|C&cgNQ}E#qHF*=-)&Y*?fdIT027z@S=QSl zclbz<`i2HPz1{Dh(Js#0H6?25YQJV?WSnZOEA=Yu1f$>2I#N<nB1oM;!t(NCJW~!K z*hQ}9)EwF9$Vd$fi|l(TlOk=y!^6UY0+`I4oZlijrJuZ#=WA+e^78WRA82fy<vqvc z_tM^mNznG)oeV0LckVxaPk+1AGcY$tP?r}sT;jI7);LbdYS~x0x3kdqo!@g>ge%sM z?OlBQ1#i4R9skYh&=vI@3<gt_pTGCAGx?uPbppg`XTG~d(Tu7tub@EialaCR)Z}G3 z7INlm@`gVsEGXFDoUgMUfstKTTl?!}nMy{b&8(89W)!fVi7;=An5gKa2+M^Fl4d<z z_^*{Op8_92`uY0G;x{w^_743`u$#!~s;hnlkGUQbiH5|zKCCATfA9*93*FvWUvEB; z$1W-gob&JcuO@V532`g^*mv)ShKAT>z2m@e?j%UYx*h{NeYF}N>+iRRk^Sg{L|DJ~ zq<Ko`XO#@L>z{kgveo^kcfro|yPQ;IW<IyG`>LJIB4*3wjgJ?5rCs_04?qZ_Ur8xY zJ+ru^g!P754>(q10s6(IMeG?|<F13vIUWN3TZpZg9?0%sc27XJw<H&(rBgHuPO6gZ zWyz~Fc;;F+D&;uNP*U!!Zx)plin~qTDg3vUn1UG{_5%Y0Nl8i2?)UHC!?1^r1L<W@ z{(}A5wTD+ift{fV=(>R5y&j}?^*5$Nz%O1*mSLsB1rH2prm8e;R902FI5>y|PUq<b z0Z%UUWnWgAU#UK66Zn~K^ZRaNJ%Zf1bEmnbMMy}9#)kr3GZ22Gr>pza(C|7&+<AL3 zzOwSl*cb>k50N>kbdn4;v44Ngfv7rK`tFfbf)M0ha#DS9;%e$xw)a$nYLj+Vidd#Y z$K73n(nG}lx8i<lEcKef*|E1_Oekkjbs%5|fSG`1BuW47yaBd^otl%Ik|3LM4XTfi ztDN~=yy2?iMQwiH&>I7!g5>0Ue;z%;=4zTU7<bd|G>_Ul8+7<o!lN+eFHQr+&-=>? zjSaeIP@@8=SF7phlEn4r_~<~IONx$7I?0Fg4VzrmlwiUv`Z!%*|5&%=P4YzXWx<>4 zH|?wlAO=!<&$a<5H{%T8x(LS*Mujqd87i=AJnC6oe0&KKjs-zM?Pz@;t8slD9r2gH z{sVOkba7ei%D?T)qY~}y(URgvKLWs<y_)Nov}(A<<u_DjlO7q_zcgHut5>nzd7sty zZZg<oXD276I1%NKj}hcUXejVv)5amlYsG&mz^tJQ#yorW>H8Cb-od4Te8ZFDBcPA& z^hb0e)90xLaH@bz#^Y_v-RVIcHuCPscjw&}v0#p}XHC?_55l9P%S<{iCd^h<Re_-) zJawunR`?^=pKiFcm){8$Qr96mpl}C^pGW5AuD}O$)d-iD-gtm@u~&b3Knt4*$J}<= z&(h4VZS8#po=e>A;4Bgx7AEYnZ_Cfm|L9TsxjG+%Z{Sn&08`6sX1|(tdry~c%(k~Y z6GUp@OhwkyKOpw3;&y07(%L!4a6_cwnc!fR^N!o@WaG*4PBoC8N8d+;z+(rYBFf0g zf%vZXWT*m?qV;C}H+>mW07Ea3WMpE3!=3iVgL-Ecc!GE&gFw|Peep3ndkM7p$>BzO zO^tMS#sdX~jrH{;MxHtW=z@Q^!-+jV>XcZ5ol$uBaH%JwyW^uQI<rAp%W<zc{Nz2; z&UBE}z56(qwFWxG{pZi0EB)EzLGK2jBZApw(;mhWBO*4xL2f_M+D=b&_4D;5J9B1z zV`CUd4O;q^VAG79)?YMG+-}hU2Gj`ux4f_CnpaMfI+V=6!PDQr-`JO}BYTRS+E+8; z2AKnb{JmZ2X>kR2F~rBmCp-HZB7HIBMNo?@Q1H=e9p!^mY9y)C1kwve-Q~!Z*jrW< zqgYN(&Vf#C-G1hx%B(CfW~)mdKYqM=^(wgb%a<>+v$L<_<Zfbd;o;$<m5w$L?wOgH zkdTnHV-G@oc9R%&F6`ta{;98~10&d}g-wLa-AHTI;XplbT2aO=VfG=(i$@xm_ka(6 zeu6g=3iI;V<hwR$<wUpIE`>ZGU-*y)Is#e@ZS?e%1=rN{gaCQLOy}S5zsf3UrrH-n zNJm!92yRrlxVX^J_<S`VRB>QKlNGMmvlD!1O98Rxn_0(vP4nl^V?TVDnw@RjsMOE( z>5EG<Rpo!``5mz+=``_@WKVh!yVoTDL6|Y%adYgnNR>V%!@FcI_#T-XuRa0%Ll<N2 z-h^I9ClG|lO-)Uy=jhJQ&PK+^yMV$03ZNmn{<Qubz(>Q6AN#wzSX$bzCY^WYXm-93 zyLXy|walC%p_uDR&Ah`-m*9)y5Q4a?aiiX*pnwnoH2_^hLnK30f1lN*$b3+coZKIX zqrSc#$R9yQMn@kiw5Vrmmz9<xh=-?Vtgva<MALQ5^TC4D!a^ZLnmzJ94kvTGy0ulD zpHF}&MhoInIu#RdU%&-7g>q7|-eyJw>=p+A)InLH>s&X7UESW^M%;s>j-&8VfNTH} zySommoANbM7v74n(9+%n+34ox2FjSKLvB@yZO($_DK(okz%AQE@3fm*ht32s3XZ#U z=DDk+fAQ2^nv(GEPSRhqK($KSQ3pb-`e0c+RPLUI#ZqYFoNal()7ibfy>z8`YVWrY z3L;@zr`^5T#Ojk{XJcby!bS**7=RNf9WO604-Y~IME(PqUEiP}FwF-*;s)JDx<G~v ze&;=g+L?&aclXb<%b=*vSmR5>33w6~6*c$gkC<^=93(^fr%$D2We*`3>P1JZZYOB3 z9oGAvyL3-6L1J%9i$;@&bK+rgQIYLX&wLZ-htnUZ*pk+gl*1b0C7sdgOez^Yqoe4I zn7q6fO&>15EPLJaSs9FSTU#3i26K3{Gd_OO?#3J54B!J?a$8ii46UG*z|F(spJqxV z14KecLqo&J7!wwzrma1cYapdLM2yHODJcPXtgX$1;QJYqos%<GXiOP64H!l3OT=<d zxo3H_qNTZ+nwq+@veGMmeczo;&eU-}XrbSD<mX&}ZX%=)2y{}aIRXR$?0QdJSLZ_s zwlW|fpwpyY0E0Yv{=7v%5ykPeha1adTN@jvkO`6HiHR4}KLUv7CxP(6#`*;WWM^j# zesggKNz`eg_~=pftA#$eZ~}C>@u31E1vRyv@25!G5~Zrmdb#73ZaHn5eBek)Nmk<E ztotn`(T*;UL&+jR<$HIwJ<*`TE;}|hRzO#uRRBxldl!=CXKU-yXoY<ci=>wm9dx-9 zqE}&S3K9<*fEM)7*8ZZ#ZNE5h-KaUturV+^B4S-4S0zK!`%N;VNMN1O?M7?HfFDJV z+^0)*`DPvU)4N-vg&Kbhl^edU)K3Su(hM}<_P74YKcpV7H(GCjn{ZyK+OZrdJqNA` za`W);Fe@u-p+8qgTidUG3Y?a#5BjbY<aT~Z2}Du~#@M@am%Jv|%h|&pfc&~?G4vXQ zi7(9+?rY(-Lg&~f;?qcoaOa5LWa2nE(}7TddJooTT0oM?$jCrD-Gk)SgQi7NRWiEg z)0E=1RaHT~)(K>57i;G|A$Zu`+1Uvk(K~OeuC5+mVXMp?4m(6L!5ms@nt&@}c8jEl z$xu;7Ny!dyH^8>6tn9UG*9efDoSeLLQ%g%r$RP~_7aSE)tAO-CmaFH4C`H{1ws%h< z={imskn9>CY%lTamOkNVs;#ZX*LmMC?Yet0WMFVGJS>cen0Q^n;GchHCMQ2W=K9^9 z*j~W<{`7ZmO9bKiYRE@P5hO!(mp3GsgREFj8QZ(CMep4-^U}tJ<ukbgmDk(14Ov=+ z*fXam95pmF@L81vb6dpD&J|--POs*N8j8p`!1}wL4!B&|Vjb5M#uRW5(|C=S_uIj8 z#p>!R@ESGIIXb!$<8~IL1`MN?zWx}xKDB#ENl9X2Vs373Vj^qN#P3ly#aS=@m&~&( zD^`XURW1j1h_s4|%BxqeY;A276@P-$RYhNbZ`xZb8GrIy<@IX`Z#-n%*3ORAP!_|* z`tJrpnh~j7Uu1nsA4$b`r(3bUVS*H?^tr#_LQYQpx$vQK4_XZ&CdLmR<>S-X9L_UI z0Qxru+;L;zg|ozU$#2OoFf%hsglqD8TM|idnr{-9T%I_|(W=-6>c0JA0>LSd^XmMb zpa0*S((6wqY9iR#6IfWD=0~9hDQKlX=V)=G9SrDu{D8-4^72;;S1^(NB_etG`3$#T zYl7UG(71xeYh3UawTzWtvH-@DOu?*JOiF6Jxw*N!?o@-ohT%&an+q2%JiPklkq4eW zVfvj|8oE-3a^SQ{46W~7fp?#J%~~EPSS&3*@gYNyhut8}&y?w!nl=f%Z@ObzJOt95 z2Q~!-Oyk?h^_ZHC$~{B3n?y2J1cdsMjMST!yjR*Q8)8*5FlWzNtkMry?rV(&N1wYD zPlHp=ACzpFd0CdbGX2O~U?w|;>1vrS#V7?q?yw6s4sf55$t$=V`HS*%GVXtOHvcEF ziJTndKdXHiiDTZss<UQA-_X#ovph;eoci~>-5qoyZ~N^7#oYeLhzLH-ya|9uFy`jN zU(cSACHo(XoCw;Aje1U@Z+|NNs*XLYrK+l`uD(s-N)9r^pO&w!`6u<2PY6K(NdQ-* zl%%9yZoiM0m-Kv9ZS5Tr5}$*el?B^!fc`>W=cS<=&d$#08WQf`pOm_txEdLy!kCj^ z^GKUVUr^Lv`Sa(@jGn)r-||SAp_LUY7Tc3Fe_vURgZetg(85B}?3bJ~2?;7EN-W2+ zGP2(`3}|PoXRGssH!m)lm+3CAteh0-aPjbj%5kg?X&0H`@%WI4h%3~-goj7?(Hl5r z7zaHITL2M#uX@>?s%}e4j@H%^)(NP(rfX*d1wf*cV=%85?z7hkXyod(R)r21qD8Wt zxWYZC6H&F$qveCnLmVj!H5v>K4hC}|m)f;6=FE@Y@BZ@V-n}15GM=Q&QqIe|I9$V5 zi(ydU?Fo_x<0r>-eHGXA%7ul6)w0#wqpn{P5&{^y&cX3)vi2<?v%Ax%tE=mHj;2gh zxO$JLCNCd1cZ>kO7EtCqh!{}RvOW}(BDdMt@xMMR!#`+#dtH{8Xkcl%3=oA@$Oe%@ z++O&s>BH32Q;0oSbmG&e!HVF4t#LRU`R{gCffq>+Qez+t;XE1~PxF7)PE{}T-B{bs z$;gNXZwx#rCnslSW_H&>1W8IxehRi4gk^DYvBB##92{nRS($W!h29&K{0i{D4~Bu7 znVDBniGc7}PuOpwD}d=1bashZ@0W46lOsUnykQ%8d3j~!&g2Gv5CLUQTV`)n$^cC0 z=pywh><AEukA~~cC`h{SGYvqqz;qh9w{7P-tg4UDifIf&|00Op@`yZDeP_!3NIpHk z=zk1unIzDAXJlu;O`Tx6X^xib0`{UI#<(wrCnlmbSS_lL(KTDoGTr>#`-iw)RZA;6 zGV<2HKcfs>_hxF|oMK>LkUHKq9RKE0Vm^8X8TjUM5OV4MP0JC7-BmncBiKOI2qOqn zTy%7FSlA{YTzP4!05b`qS!@=ro+;^ixa&nmL(8kV8u%VZBvb!X*=~DjrbWYi{HtDW zH~EIDySx3UbE(V0Hn3`6u0ar+8~~@jJ_{nv9Ue%3y|%x<Bq^z;p~0x@le|cvvx7rV zPtRX@nX6m24s8M1W&OgI2#EvR>0Dx&m(BEk*w!!T#N_u+`OquZw2S1fgr3J@dG*R+ zG#SzpkA^+Ey;qO5zC%T%Lh6mbAZEL}SlHfUwgm=~0Fh{~C@sZY5L3%gqkykw+u|7m z(z3G5+u}q8DAIb(XsD_0y{CUO?Ev4@)z)H&JqrsrRwwH~Y=Mu2CJ`c~w(}~ednz&^ zK;)Qjny*bYz{r3uogc{vMU^ibH#avYCkgUmc|_D3kCLvgii)!G-*<8v#04+nE-G7C zSZHf&@34#-(F)@I&QNt|&P|4VxhW%YrNRr3;0W4d^?y0)Uy1C#m!h4rH%lj@92Oq_ zPl@FysmC0M7HMfjK($stV|r4A;vPF1e4r24)$b&&3wDGefizNl8-pbVQX02P+NDk^ zfr`ZKmy1eDSOuSv;*=jFBW-QVO+4_wGQpr2NKT)2Ioj$sH8p+SpEKjAe=$V*?F+<R zDgBasS5wox)X5%Y&uWtCP=7z&%lGn{9f$i5eWJ4}<v2XLK-m1Zpf7CNTEIIDOzh=F zl&vmqwEk?ZyY8tK!~1(Fn!L+HsVx)ip4kSvWeNbrxgji{ROS=i4!^6Yso4s<_npD< zv^4YSmiLqy-jBXRph=6k)6~B?I)H#5y>`JzCb)S72UB@|2b~G<lf;m1%-3pEZq2Nb zp@yoo(iiND;%CqAgHAywu!lb|GBwTUG~s<#5HmECmzM{c3a&3TJst2~oR2RDFDC47 zg&@s5-1h<)jQ~oWx6S3$0KuUP`}+F8O;S)$fC4)6HraV+`O%pF9$9OvB*G>vyxDKy zmYtnl3{JpyE;uqW5=@}2?dC^WpWA!8hT+=rad9JATHt#W&CQ!LR4s;zLLQ|4o^|y9 zjygQ6zAP<h!t~S-xe%npz5A409!NyIz$>$6Uz&)UH{GWvzD@3*Wdg}Ob~14)!RTWH zFE6+Dj@ya7$%$)9=Po7xMG=wRLSU(1p^wm|p^0RE1YQ_Uxlak+(ANh~U!`xQt@p=P zELCN&SRoRAXAbB4dh;e+#sx{I&G!sKU0q!erh!lLH1_s8RvKBT!wF)QvNSSfz+$m9 zG~E;T>q2Gs-&C(kNZI|QFVoFY&uk1}BC(1{{_ME%n*f0W(DLb;7#eOAHSo)S=opx{ z6*K8Gjq#S`_z}nu8WV$-xnt59UN0zMb=@UsTm$oAHIT>7$Jf^19+b?ryDeI1Jl@u3 z*`I^HWTMMwP;7So{nM)KC-mOarGPx(0*Cwh)T1K6fe{Py&c%y3yts3xHtC}*D=w7u zX=7hDr>aU{mc9jh=yl;%>p1ny3&OT@hy342$;diQgijuKFd@MS39g*C`oDKxXJe}w z8@tWP+1S+C+130Yr4vg>ck6i{MkY8p`63plr>D2&bo7>-4toao<jKTVrbg_+fp|r! ziEs=#9bbp=Xpw0*7;PzsRkll)PBpG|babSfx@Y$OSzmt%+#Qn!(hZJbB&Y?ctc?Gd zl46+Imrdp&;;=g5cb*3#^|{w%L{dWgtN9*~F)uF%Y3<-(w9%k=Sy_U<zDh<BI_2(b zUt=Q)@>o^X22?@3`tX-m&nYP>cXQBrDwVG?eIp}*ij~qgHaETK?B=^Jf8dZD8I{%k zdUyPf>s>4kY)N@Vh18=_U$(hx(lwd)Wj)5ucGtBn4WlcInzqo=NQPl)mEt7!GI9Qd zo}LUT=YF(S@9#fnk@@YmhI4e>lS=ow=MRMHa<Eha86~{sL$$h6&WPTYTqU0SIC;bL z+1<NiqZMvPtp$86ECSi2Y^0b3x%w%0clX1?*M}A>p)}0Q5{5r88-eHkI_$m_e2b-# z5l*?sz|DraMu54o)&Ao-j4BtFL;l;Azc4>Pe-u9tD$G_W7`ItiA|h%7TZ7#32;!Ig z)4ALl10-dN$A6bhIK1>%zKv-+iP#^%Cb!98#kRIK*IJKscAi_6KoA+KOY;AYR5D=c z2jqJ4PDBB&wX=Vp{z`*B^GolngCVuQy+r;KGt(5x3A$BMLUONs_rrtK^7Tem$?{j8 zTCr9H6c;4W<%p_pm~*0M%l*KDeYv+nLLtD*#B|{-&jb=E#l<^fKOr5IqlZ(u+HQ>? zcR0|@oSmNT2Gnb`yLud{{8%$8BxH@RC+WsbATaZTSI#)cx2s%4q$U!dt8Z8cFv`}} zx{em$c*AdhiTPKHDRuqi+sRntaBQxQmXNUIvktcBOtBhsV!@x3b8k@*v4=K2#v0Mz zOX++^dgos}K`3@h?1H?qVDzG?{N2ajJdCt7#YhkVdW=MS>`Ka<t(Z3+e9##qU_JEC z85PlY>yg(sxb*IP-r?X<Val45KG#F0>L+vd#}Cb}QtsYwoZH&JAZ~ZKHp}WsO!3ZQ zSp7fw^K41iohXGLR+N>AmX#57UyPYGdRb;5jXa=AdqLA^ecT#5tf^D|rPvMtuF7dE zFer#s+-?zwotuZpSTS*|_<4VZYP!0b8iE9}O5J|;Uoa@f!ve>RZl(33o$*Hr5{?ai z=kxRP!Q7NPtWAN}9WH)uKT$*APy-5aY8u^8y;RVp;?9Ptd%ZJi55HDTQ&f@{y&NL< zn1}%3xO{nQt}_KJd8S78lqdy^1NfV8tT|P)F)^rv4KO~L66N0wxAENLe^l|M-0(5> zoG&glHT7i2O$wdWaQ=Ka|Nfh&*ZuJS6|#uGK?q5Rww+eu*;tM$uS>LZ-gd+s($o== zb4@r_ktEELsh+C~Jw;JRg^@+19a)UE0*$N#Y5W`Vh<!=iaa5Q(4t{;s7c0x7u15!; zWeq_{6yLbf#>Y4AvZJ>gFAj_%7T@;$I{~uVt6^~Y%9X$i;_B($l1mamIy%7Um5v)} ziEe=l9g|~62du48)`FsrO<k!+`&$(+CTo8+p*O_`lX3nadjk%hjC_=pm-qPqY*J|2 z-A+L8CgpxWmx=Jjd=YV;=i7^e5R-zE5~dGP^f266&aKS}CD`Z<J494lxn4e&NZj4M z{xl>i%@m8f8Ypf(^($K^x{liCtJ@v6h0fpx>w#PHcd0Ih$SG32EaSNJaCR~^&pw3E z-NT#vXC`Y`e~y~Gk;!n*&D^yy@)h^@nKic%VXHmwgl*3Xwk7Id9S@2}R%cYgNV;;7 zx0l~#ivJ!tSJRR7iZ>6-p-9xz%8SX2jM|`=d`Fu6xpa4NuyEq)Z30Tsdd$dl$Gq(< zzb=(zEc>5p+~<CQh6OS>OHQuv@F9-smy$k9qjg9~2uKuq@0nk}f;kvyX|IGo$knSL z_LMuDFwoa$*Bo}0kB{%(2WCkp+b2(w<T%!Mc5-vFQGVCfX2cFvxSbq>+~qg;_8P)e zv9k>F5B${Z>?|dt#O`sGvvGSumHmo7=<52X`AX?4<JE3XPUT}yOdPI_1YiBNR}G`e zFm5k$CTez#QeRwWm48u`{T(oSFLzH*s3%8;%`88?yvlkh5x<0FqfP3}j9CD2g8&wH z9UCsUy1Bp@c`+j;l-|$ljnmpy?A5Enx+kia!;^*o^}*-PvL|u<*G^oL^Txv`N%8bp z%@tZd4`<PdALrRhh$?Y)27G=V6(ur1Sfwq=9QIN)l+uwH;v4s#%o2IE-XuT}>@}C& z$D5@Zt5Khc7yV?rH@n}Hu6uoabETt4h(K1ED|efa)^C=~<1u%*S#eC7>F2N4LYo9I z-DbtXK~zM_+~JQ`DOfrte2oMdWT^5qg2Kbkn+pFqOB^D{5!z(-{CTQMh9<9ihMGis z-T0*c#Sqfpg%46y;@E`EZoDRc-MLwIRw~px=hO1{)ppbT#QiXXk+yG)XZDQ0)hXmL z`Xz4(lW0ZUU<^2m;UHo|zLR;(ihK+7aSWtWc<eo?>1`!a*?7uBnnNXQ+Fif#+t>Rw zr|w|tsil?Og)7Ob17_dI!KWH)>0FmFLkAX3E`-p%6QL(26_+IZvnUWa{kw1L`u}^F m#^Q*rz4ZTou+}nlLV`s1{&B)Ssx?GllgBCD&AIc$<NpBdBn9#S
new file mode 100644 index 0000000000000000000000000000000000000000..fcedda8998393a625fe27f12dcd40b9a53d7f728 GIT binary patch literal 84358 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¨IpJp0A<n@OOxpvaVIe&h>Hdj~w)Vmn) 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
new file mode 100644 index 0000000000000000000000000000000000000000..f0fa10c7da24d0772d8d841e57a28c3934b342f7 GIT binary patch literal 73275 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
new file mode 100644 index 0000000000000000000000000000000000000000..3743455982a397cd2f62ede024960abb8223d8eb GIT binary patch literal 5940 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 L3^j|@?VkT1Js-Qn
new file mode 100644 index 0000000000000000000000000000000000000000..3bc9a155fbb4ce668f733a80486c66828e512c5a GIT binary patch literal 34263 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 N`klN)iP%T~{{uk1Xj}jQ
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/index.org @@ -0,0 +1,47 @@ +#+SETUPFILE: org-setup.inc +#+TITLE: Yet another snippet extension + +The YASnippet documentation has been split into separate parts: + +0. [[https://github.com/capitaomorte/yasnippet/blob/master/README.mdown][README]] + + Contains an introduction, installation instructions and other important + notes. + +1. [[file:snippet-organization.org][Organizing Snippets]] + + Describes ways to organize your snippets in the hard disk. + +2. [[file:snippet-expansion.org][Expanding Snippets]] + + Describes how YASnippet chooses snippets for expansion at point. + + Maybe, you'll want some snippets to be expanded in a particular mode, + or only under certain conditions, or be prompted using =ido=, etc... + +3. [[file:snippet-development.org][Writing Snippets]] + + Describes the YASnippet definition syntax, which is very close (but + not equivalent) to Textmate's. Includes a section about converting + TextMate snippets. + +4. [[file:snippet-menu.org][The YASnippet menu]] + + Explains how to use the YASnippet menu to explore, learn and modify + snippets. + +5. [[file:faq.org][Frequently asked questions]] + + Answers to frequently asked questions. + +6. [[file:snippet-reference.org][YASnippet Symbol Reference]] + + An automatically generated listing of all YASnippet commands, + (customization) variables, and functions. + + +# Local Variables: +# mode: org +# fill-column: 80 +# coding: utf-8 +# End:
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/nav-menu.html.inc @@ -0,0 +1,16 @@ +<nav> + <ul class="center"> + <li> <a href="index.html">Overview</a> + <li> <a href="https://github.com/capitaomorte/yasnippet/blob/master/README.mdown"> + Intro and Tutorial</a> + <li class="center">Snippet + <ul> + <li> <a href="snippet-organization.html">Organization</a> + <li> <a href="snippet-expansion.html">Expansion</a> + <li> <a href="snippet-development.html">Development</a> + <li> <a href="snippet-menu.html">Menu</a> + </ul> + <li> <a href="faq.html">FAQ</a> + <li> <a href="snippet-reference.html">Reference</a> + </ul> +</nav>
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/org-setup.inc @@ -0,0 +1,11 @@ +# -*- mode: org -*- + +#+STARTUP: showall + +#+LINK: sym file:snippet-reference.org::#%s + +#+OPTIONS: author:nil num:nil +#+AUTHOR: +# org < 8.0 use +STYLE, after use +HTML_HEAD +#+STYLE: <link rel="stylesheet" type="text/css" href="stylesheets/manual.css" /> +#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="stylesheets/manual.css" />
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/snippet-development.org @@ -0,0 +1,424 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: Writing snippets + +* Snippet development + +** Quickly finding snippets + +There are some ways you can quickly find a snippet file or create a new one: + +- =M-x yas-new-snippet= + + Creates a new buffer with a template for making a new snippet. + The buffer is in =snippet-mode= (see below). When you are done + editing the new snippet, use =C-c C-c= to save it. This will + prompt for a directory two steps: first, the snippet table + (with a default based on the major mode you started in), and then + then snippet collection directory (defaults to the first directory + in =yas-snippet-dirs=. (See [[file:snippet-organization.org][Organizing Snippets]] + for more detail on how snippets are organized.) + +- =M-x yas-find-snippets= + + Lets you find the snippet file in the directory the snippet was + loaded from (if it exists) like =find-file-other-window=. The + directory searching logic is similar to =M-x yas-new-snippet=. + +- =M-x yas-visit-snippet-file= + + Prompts you for possible snippet expansions like + [[sym:yas-insert-snippet][=yas-insert-snippet=]], but instead of expanding it, takes you directly + to the snippet definition's file, if it exists. + +Once you find this file it will be set to =snippet-mode= (see ahead) and +you can start editing your snippet. + +** Using the =snippet-mode= major mode + +There is a major mode =snippet-mode= to edit snippets. You can set the +buffer to this mode with =M-x snippet-mode=. It provides reasonably +useful syntax highlighting. + +Two commands are defined in this mode: + +- =M-x yas-load-snippet-buffer= + + When editing a snippet, this loads the snippet into the correct + mode and menu. Bound to =C-c C-c= by default while in + =snippet-mode=. + +- =M-x yas-tryout-snippet= + + When editing a snippet, this opens a new empty buffer, sets it to + the appropriate major mode and inserts the snippet there, so you + can see what it looks like. This is bound to =C-c C-t= while in + =snippet-mode=. + +There are also /snippets for writing snippets/: =vars=, =$f= and =$m= +:-). + +* File content + +A file defining a snippet generally contains the template to be +expanded. + +Optionally, if the file contains a line of =# --=, the lines above it +count as comments, some of which can be /directives/ (or meta data). +Snippet directives look like =# property: value= and tweak certain +snippets properties described below. If no =# --= is found, the whole +file is considered the snippet template. + +Here's a typical example: + +#+BEGIN_SRC snippet + # contributor: pluskid <pluskid@gmail.com> + # name: __...__ + # -- + __${init}__ +#+END_SRC + +Here's a list of currently supported directives: + +** =# key:= snippet abbrev + +This is the probably the most important directive, it's the +abbreviation you type to expand a snippet just before hitting the key +that runs [[sym:yas-expand][=yas-expand=]]. If you don't specify this +the snippet will not be expandable through the trigger mechanism. + +** =# name:= snippet name + +This is a one-line description of the snippet. It will be displayed in +the menu. It's a good idea to select a descriptive name for a snippet -- +especially distinguishable among similar snippets. + +If you omit this name it will default to the file name the snippet was +loaded from. + +** =# condition:= snippet condition + +This is a piece of Emacs-lisp code. If a snippet has a condition, then +it will only be expanded when the condition code evaluate to some +non-nil value. + +See also [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] in +[[./snippet-expansion.org][Expanding snippets]] + +** =# group:= snippet menu grouping + +When expanding/visiting snippets from the menu-bar menu, snippets for a +given mode can be grouped into sub-menus . This is useful if one has too +many snippets for a mode which will make the menu too long. + +The =# group:= property only affect menu construction (See +[[./snippet-menu.org][the YASnippet menu]]) and the same effect can be +achieved by grouping snippets into sub-directories and using the +=.yas-make-groups= special file (for this see +[[./snippet-organization.org][Organizing Snippets]] + +Refer to the bundled snippets for =ruby-mode= for examples on the +=# group:= directive. Group can also be nested, e.g. +=control structure.loops= tells that the snippet is under the =loops= +group which is under the =control structure= group. + +** =# expand-env:= expand environment + +This is another piece of Emacs-lisp code in the form of a =let= /varlist +form/, i.e. a list of lists assigning values to variables. It can be +used to override variable values while the snippet is being expanded. + +Interesting variables to override are [[sym:yas-wrap-around-region][=yas-wrap-around-region=]] and +[[sym:yas-indent-line][=yas-indent-line=]] (see [[./snippet-expansion.org][Expanding Snippets]]). + +As an example, you might normally have [[sym:yas-indent-line][=yas-indent-line=]] set to '=auto= +and [[sym:yas-wrap-around-region][=yas-wrap-around-region=]] set to =t=, but for this particularly +brilliant piece of ASCII art these values would mess up your hard work. +You can then use: + +#+BEGIN_SRC snippet + # name: ASCII home + # expand-env: ((yas-indent-line 'fixed) (yas-wrap-around-region 'nil)) + # -- + welcome to my + X humble + / \ home, + / \ $0 + / \ + /-------\ + | | + | +-+ | + | | | | + +--+-+--+ +#+END_SRC + +** =# binding:= direct keybinding + +You can use this directive to expand a snippet directly from a normal +Emacs keybinding. The keybinding will be registered in the Emacs keymap +named after the major mode the snippet is active for. + +Additionally a variable [[sym:yas-prefix][=yas-prefix=]] is set to to the prefix argument +you normally use for a command. This allows for small variations on the +same snippet, for example in this "html-mode" snippet. + +#+BEGIN_SRC snippet + # name: <p>...</p> + # binding: C-c C-c C-m + # -- + <p>`(when yas-prefix "\n")`$0`(when yas-prefix "\n")`</p> +#+END_SRC + +This binding will be recorded in the keymap =html-mode-map=. To expand a +paragraph tag newlines, just press =C-u C-c C-c C-m=. Omitting the =C-u= +will expand the paragraph tag without newlines. + +** =# type:= =snippet= or =command= + +If the =type= directive is set to =command=, the body of the snippet +is interpreted as lisp code to be evaluated when the snippet is +triggered. + +If it's =snippet= (the default when there is no =type= directive), the +snippet body will be parsed according to the [[Template Syntax]], +described below. + +** =# uuid:= unique identifier + +This provides to a way to identify a snippet, independent of its name. +Loading a second snippet file with the same uuid would replace the +previous snippet. + +** =# contributor:= snippet author + +This is optional and has no effect whatsoever on snippet functionality, +but it looks nice. + +* <<Template syntax>> + +The syntax of the snippet template is simple but powerful, very similar +to TextMate's. + +** Plain Text + +Arbitrary text can be included as the content of a template. They are +usually interpreted as plain text, except =$= and =`=. You need to +use =\= to escape them: =\$= and =\`=. The =\= itself may also needed to be +escaped as =\\= sometimes. + +** Embedded Emacs-lisp code + +Emacs-Lisp code can be embedded inside the template, written inside +back-quotes (=`=). The lisp forms are evaluated when the snippet is +being expanded. The evaluation is done in the same buffer as the +snippet being expanded. + +Here's an example for c-mode` to calculate the header file guard +dynamically: + +#+BEGIN_SRC snippet + #ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_} + #define $1 + + $0 + + #endif /* $1 */ +#+END_SRC + +From version 0.6, snippets expansions are run with some special +Emacs-lisp variables bound. One of this is [[sym:yas-selected-text][=yas-selected-text=]]. You can +therefore define a snippet like: + +#+BEGIN_SRC snippet + for ($1;$2;$3) { + `yas-selected-text`$0 + } +#+END_SRC + +to "wrap" the selected region inside your recently inserted snippet. +Alternatively, you can also customize the variable +[[sym:yas-wrap-around-region][=yas-wrap-around-region=]] to =t= which will do this automatically. + +** Tab stop fields + +Tab stops are fields that you can navigate back and forth by =TAB= and +=S-TAB=. They are written by =$= followed with a number. =$0= has the +special meaning of the /exit point/ of a snippet. That is the last place +to go when you've traveled all the fields. Here's a typical example: + +#+BEGIN_SRC snippet + <div$1> + $0 + </div> +#+END_SRC +** Placeholder fields + +Tab stops can have default values -- a.k.a placeholders. The syntax is +like this: + +#+BEGIN_SRC snippet + ${N:default value} +#+END_SRC + +They acts as the default value for a tab stop. But when you firstly +type at a tab stop, the default value will be replaced by your typing. +The number can be omitted if you don't want to create [[mirrors]] or +[[transformations]] for this field. + +** <<Mirrors>> + +We refer the tab stops with placeholders as a /field/. A field can have +mirrors. Its mirrors will get updated when you change the text of a +field. Here's an example: + +#+BEGIN_SRC snippet + \begin{${1:enumerate}} + $0 + \end{$1} +#+END_SRC + +When you type "document" at =${1:enumerate}=, the word "document" will +also be inserted at =\end{$1}=. The best explanation is to see the +screencast([[http://www.youtube.com/watch?v=vOj7btx3ATg][YouTube]] or [[http://yasnippet.googlecode.com/files/yasnippet.avi][avi video]]). + +The tab stops with the same number to the field act as its mirrors. If +none of the tab stops has an initial value, the first one is selected as +the field and others mirrors. + +** Mirrors with <<transformations>> + +If the value of an =${n:=-construct starts with and contains =$(=, +then it is interpreted as a mirror for field =n= with a +transformation. The mirror's text content is calculated according to +this transformation, which is Emacs-lisp code that gets evaluated in +an environment where the variable [[sym:yas-text][=yas-text=]] is bound to the text +content (string) contained in the field =n=. Here's an example for +Objective-C: + +#+BEGIN_SRC snippet + - (${1:id})${2:foo} + { + return $2; + } + + - (void)set${2:$(capitalize yas-text)}:($1)aValue + { + [$2 autorelease]; + $2 = [aValue retain]; + } + $0 +#+END_SRC + +Look at =${2:$(capitalize yas-text)}=, it is a mirror with +transformation instead of a field. The actual field is at the first +line: =${2:foo}=. When you type text in =${2:foo}=, the transformation +will be evaluated and the result will be placed there as the +transformed text. So in this example, if you type "baz" in the field, +the transformed text will be "Baz". This example is also available in +the screencast. + +Another example is for =rst-mode=. In reStructuredText, the document +title can be some text surrounded by "===" below and above. The "===" +should be at least as long as the text. So + +#+BEGIN_SRC rst + ===== + Title + ===== +#+END_SRC + +is a valid title but + +#+BEGIN_SRC rst + === + Title + === +#+END_SRC + +is not. Here's an snippet for rst title: + +#+BEGIN_SRC snippet + ${1:$(make-string (string-width yas-text) ?\=)} + ${1:Title} + ${1:$(make-string (string-width yas-text) ?\=)} + + $0 +#+END_SRC + +** Fields with transformations + +From version 0.6 on, you can also have lisp transformation inside +fields. These work mostly mirror transformations but are evaluated when +you first enter the field, after each change you make to the field and +also just before you exit the field. + +The syntax is also a tiny bit different, so that the parser can +distinguish between fields and mirrors. In the following example + +: #define "${1:mydefine$(upcase yas-text)}" + +=mydefine= gets automatically upcased to =MYDEFINE= once you enter the +field. As you type text, it gets filtered through the transformation +every time. + +Note that to tell this kind of expression from a mirror with a +transformation, YASnippet needs extra text between the =:= and the +transformation's =$=. If you don't want this extra-text, you can use two +=$='s instead. + +: #define "${1:$$(upcase yas-text)}" + +Please note that as soon as a transformation takes place, it changes the +value of the field and sets it its internal modification state to +=true=. As a consequence, the auto-deletion behaviour of normal fields +does not take place. This is by design. + +** Choosing fields value from a list and other tricks + +As mentioned, the field transformation is invoked just after you enter +the field, and with some useful variables bound, notably +[[sym:yas-modified-p][=yas-modified-p=]] and [[sym:yas-moving-away-p][=yas-moving-away-p=]]. Because of this feature you +can place a transformation in the primary field that lets you select +default values for it. + +The [[sym:yas-choose-value][=yas-choose-value=]] does this work for you. For example: + +#+BEGIN_SRC snippet + <div align="${2:$$(yas-choose-value '("right" "center" "left"))}"> + $0 + </div> +#+END_SRC + +See the definition of [[sym:yas-choose-value][=yas-choose-value=]] to see how it was written using +the two variables. + +Here's another use, for LaTeX-mode, which calls reftex-label just as you +enter snippet field 2. This one makes use of [[sym:yas-modified-p][=yas-modified-p=]] directly. + +#+BEGIN_SRC snippet + \section{${1:"Titel der Tour"}}% + \index{$1}% + \label{{2:"waiting for reftex-label call..."$(unless yas-modified-p (reftex-label nil 'dont- + insert))}}% +#+END_SRC + +The function [[sym:yas-verify-value][=yas-verify-value=]] has another neat trick, and makes use +of [[sym:yas-moving-away-p][=yas-moving-away-p=]]. Try it and see! Also, check out this [[http://groups.google.com/group/smart-snippet/browse_thread/thread/282a90a118e1b662][thread]] + +** Nested placeholder fields + +From version 0.6 on, you can also have nested placeholders of the type: + +#+BEGIN_SRC snippet + <div${1: id="${2:some_id}"}>$0</div> +#+END_SRC + +This allows you to choose if you want to give this =div= an =id= +attribute. If you tab forward after expanding it will let you change +"some\_id" to whatever you like. Alternatively, you can just press =C-d= +(which executes [[sym:yas-skip-and-clear-or-delete-char][=yas-skip-and-clear-or-delete-char=]]) and go straight to +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.
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/snippet-expansion.org @@ -0,0 +1,264 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: Expanding snippets + + This section describes how YASnippet chooses snippets for expansion at point. + + Maybe, you'll want some snippets to be expanded in a particular + mode, or only under certain conditions, or be prompted using + +* Triggering expansion + + You can use YASnippet to expand snippets in different ways: + + - When [[sym:yas-minor-mode][=yas-minor-mode=]] is active: + - Type the snippet's *trigger key* then calling [[sym:yas-expand][=yas-expand=]] + (bound to =TAB= by default). + + - Use the snippet's *keybinding*. + + - By expanding directly from the "YASnippet" menu in the menu-bar + + - Using hippie-expand + + - Call [[sym:yas-insert-snippet][=yas-insert-snippet=]] (use =M-x yas-insert-snippet== or its + keybinding =C-c & C-s=). + + - Use m2m's excellent auto-complete + TODO: example for this + + - Expanding from emacs-lisp code + +** Trigger key + +[[sym:yas-expand][=yas-expand=]] tries to expand a /snippet abbrev/ (also known as +/snippet key/) before point. + +When [[sym:yas-minor-mode][=yas-minor-mode=]] is enabled, it binds [[sym:yas-expand][=yas-expand=]] to =TAB= and +=<tab>= by default, however, you can freely set it to some other key: + +#+begin_src emacs-lisp :exports code + (define-key yas-minor-mode-map (kbd "<tab>") nil) + (define-key yas-minor-mode-map (kbd "TAB") nil) + (define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand) +#+end_src + +To enable the YASnippet minor mode in all buffers globally use the +command [[sym:yas-global-mode][=yas-global-mode=]]. This will enable a modeline indicator, +=yas=: + +[[./images/minor-mode-indicator.png]] + +When you use [[sym:yas-global-mode][=yas-global-mode=]] you can also selectively disable +YASnippet in some buffers by setting the buffer-local variable +[[sym:yas-dont-active][=yas-dont-active=]] in the buffer's mode hook. + +*** Fallback behaviour + +[[sym:yas-fallback-behaviour][=yas-fallback-behaviour=]] is a customization variable bound to +'=call-other-command= by default. If [[sym:yas-expand][=yas-expand=]] failed to find any +suitable snippet to expand, it will disable the minor mode temporarily +and find if there's any other command bound to the same key. + +If found, the command will be called. Usually this works very well +--when there's a snippet, expand it, otherwise, call whatever command +originally bind to the trigger key. + +However, you can change this behavior by customizing the +[[sym:yas-fallback-behavior][=yas-fallback-behavior=]] variable. If you set this variable to +'=return-nil=, it will return =nil= instead of trying to call the +/original/ command when no snippet is found. + +** Insert at point + +The command [[#yas-insert-snippet][=yas-insert-snippet=]] lets you insert snippets at point +/for your current major mode/. It prompts you for the snippet key +first, and then for a snippet template if more than one template +exists for the same key. + +The list presented contains the snippets that can be inserted at point, +according to the condition system. If you want to see all applicable +snippets for the major mode, prefix this command with =C-u=. + +The prompting methods used are again controlled by +[[sym:yas-prompt-functions][=yas-prompt-functions=]]. + +** Snippet keybinding + +See the section of the =# binding:= directive in +[[./snippet-development.org][Writing Snippets]]. + +** Expanding from the menu + +See [[./snippet-menu.org][the YASnippet Menu]]. + +** Expanding with =hippie-expand= + +To integrate with =hippie-expand=, just put +[[sym:yas-hippie-try-expand][=yas-hippie-try-expand=]] in +=hippie-expand-try-functions-list=. This probably makes more sense +when placed at the top of the list, but it can be put anywhere you +prefer. + +** Expanding from emacs-lisp code + +Sometimes you might want to expand a snippet directly from your own +elisp code. You should call [[sym:yas-expand-snippet][=yas-expand-snippet=]] instead of +[[sym:yas-expand][=yas-expand=]] in this case. [[sym:yas-expand-snippet][=yas-expand-snippet=]] takes a string in +snippet template syntax, if you want to expand an existing snippet you +can use [[sym:yas-lookup-snippet][=yas-lookup-snippet=]] to find its contents by name. + +As with expanding from the menubar, the condition system and multiple +candidates doesn't affect expansion (the condition system does affect +[[sym:yas-lookup-snippet][=yas-lookup-snippet=]] though). In fact, expanding from the YASnippet +menu has the same effect of evaluating the follow code: + +#+BEGIN_SRC emacs-lisp + (yas-expand-snippet template) +#+END_SRC + +See the internal documentation on [[sym:yas-expand-snippet][=yas-expand-snippet=]] and +[[sym:yas-lookup-snippet][=yas-lookup-snippet=]] for more information. + +* Controlling expansion + +** Eligible snippets + +YASnippet does quite a bit of filtering to find out which snippets are +eligible for expanding at the current cursor position. + +In particular, the following things matter: + +- Currently loaded snippets tables + + These are loaded from a directory hierarchy in your file system. See + [[./snippet-organization.org][Organizing Snippets]]. They are named + after major modes like =html-mode=, =ruby-mode=, etc... + +- Major mode of the current buffer + + If the currrent major mode matches one of the loaded snippet tables, + then all that table's snippets are considered for expansion. Use + =M-x describe-variable RET major-mode RET= to find out which major + mode you are in currently. + +- Parent tables + + Snippet tables defined as the parent of some other eligible table are + also considered. This works recursively, i.e. parents of parents of + eligible tables are also considered. + +- Buffer-local list of extra modes + + Use [[#yas-activate-extra-mode][=yas-activate-extra-mode=]] to + consider snippet tables whose name does not correspond to a major + mode. Typically, you call this from a minor mode hook, for example: + +#+BEGIN_SRC emacs-lisp + ;; When entering rinari-minor-mode, consider also the snippets in the + ;; snippet table "rails-mode" + (add-hook 'rinari-minor-mode-hook + #'(lambda () + (yas-activate-extra-mode 'rails-mode))) +#+END_SRC + +- Buffer-local + [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] + variable + + This variable provides finer grained control over what snippets can + be expanded in the current buffer. The default value won't let you + expand snippets inside comments or string literals for example. See + The condition system\_ for more info. + +** The condition system + +Consider this scenario: you are an old Emacs hacker. You like the +abbrev-way and bind [[sym:yas-expand][=yas-expand=]] to =SPC=. However, you don't want +=if= to be expanded as a snippet when you are typing in a comment +block or a string (e.g. in =python-mode=). + +If you use the =# condition := directive (see +[[./snippet-development.org][Writing Snippets]]) you could just specify +the condition for =if= to be =(not (python-in-string/comment))=. But how +about =while=, =for=, etc. ? Writing the same condition for all the +snippets is just boring. So has a buffer local variable +[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]. You can set this variable to +=(not (python-in-string/comment))= in =python-mode-hook=. + +Then, what if you really want some particular snippet to expand even +inside a comment? Set [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] like this + +#+BEGIN_SRC emacs-lisp + (add-hook 'python-mode-hook + (lambda () + (setq yas-buffer-local-condition + '(if (python-in-string/comment) + '(require-snippet-condition . force-in-comment) + t)))) +#+END_SRC + +... and specify the condition for a snippet that you're going to expand +in comment to be evaluated to the symbol =force-in-comment=. Then it can +be expanded as you expected, while other snippets like =if= still can't +expanded in comment. + +For the full set of possible conditions, see the documentation for +[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]. + +** Multiples snippet with the same key + +The rules outlined [[Eligible%20snippets][above]] can return more than +one snippet to be expanded at point. + +When there are multiple candidates, YASnippet will let you select one. +The UI for selecting multiple candidate can be customized through +[[sym:yas-prompt-functions][=yas-prompt-functions=]] , which defines your preferred methods of being +prompted for snippets. + +You can customize it with +=M-x customize-variable RET yas-prompt-functions RET=. Alternatively you +can put in your emacs-file: + +#+BEGIN_SRC emacs-lisp + (setq yas-prompt-functions '(yas-x-prompt yas-dropdown-prompt)) +#+END_SRC + +Currently there are some alternatives solution with YASnippet. + +*** Use the X window system + +[[./images/x-menu.png]] + +The function [[sym:yas-x-prompt][=yas-x-prompt=]] can be used to show a popup menu for you to +select. This menu will be part of you native window system widget, which +means: + +- It usually looks beautiful. E.g. when you compile Emacs with gtk + support, this menu will be rendered with your gtk theme. +- Your window system may or may not allow to you use =C-n=, =C-p= to + navigate this menu. +- This function can't be used when in a terminal. + +*** Minibuffer prompting + +[[./images/ido-menu.png]] + +You can use functions [[sym:yas-completing-prompt][=yas-completing-prompt=]] for the classic emacs +completion method or [[sym:yas-ido-prompt][=yas-ido-prompt=]] for a much nicer looking method. +The best way is to try it. This works in a terminal. + +*** Use =dropdown-menu.el= + +[[./images/dropdown-menu.png]] + +The function [[sym:yas-dropdown-prompt][=yas-dropdown-prompt=]] can also be placed in the +[[sym:yas-prompt-functions][=yas-prompt-functions=]] list. + +This works in both window system and terminal and is customizable, you +can use =C-n=, =C-p= to navigate, =q= to quit and even press =6= as a +shortcut to select the 6th candidate. + +*** Roll your own + +See the documentation on variable [[sym:yas-prompt-functions][=yas-prompt-functions=]]
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/snippet-menu.org @@ -0,0 +1,68 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: YASnippet menu + +When [[sym:yas-minor-mode][=yas-minor-mode=]] is active, YASnippet will setup a menu just after +the "Buffers" menu in the menubar. + +In this menu, you can find + +- The currently loaded snippet definitions, organized by major mode, + and optional grouping. + +- A rundown of the most common commands, (followed by their + keybindings) including commands to load directories and reload all + snippet definitions. + +- A series of submenus for customizing and exploring YASnippet + behavior. + +[[./images/menu-1.png]] + +* Loading snippets from menu + +Invoking "Load snippets..." from the menu invokes [[sym:yas-load-directory][=yas-load-directory=]] +and prompts you for a snippet directory hierarchy to load. + +Also useful is the "Reload everything" item to invoke [[#yas-reload-all][=yas-reload-all=]] +which uncondionally reloads all the snippets directories defined in +[[sym:yas-snippet-dirs][=yas-snippet-dirs=]] and rebuilds the menus. + +* Snippet menu behavior + +YASnippet will list in this section all the loaded snippet definitions +organized by snippet table name. + +You can use this section to explore currently loaded snippets. If you +click on one of them, the default behavior is to expand it, +unconditionally, inside the current buffer. + +You can however, customize variable [[sym:yas-visit-from-menu][=yas-visit-from-menu=]] to be =t= +which will take you to the snippet definition file when you select it +from the menu. + +If you want the menu show only snippet tables whose name corresponds to +a "real" major mode. You do this by setting [[sym:yas-use-menu][=yas-use-menu=]] to +'=real-modes=. + +Finally, to have the menu show only the tables for the currently active +mode, set [[sym:yas-use-menu][=yas-use-menu=]] to =abbreviate=. + +These customizations can also be found in the menu itself, under the +"Snippet menu behavior" submenu. + +* Controlling indenting + +The "Indenting" submenu contains options to control the values of +[[sym:yas-indent-line][=yas-indent-line=]] and [[sym:yas-also-auto-indent-first-line][=yas-also-auto-indent-first-line=]]. See +[[./snippet-development.org][Writing snippets]]. + +* Prompting method + +The "Prompting method" submenu contains options to control the value of +[[sym:yas-prompt-functions][=yas-prompt-functions=]]. See [[./snippet-expansion.org][Expanding snippets]]. + +* Misc + +The "Misc" submenu contains options to control the values of more +variables.
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/snippet-organization.org @@ -0,0 +1,131 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: Organizing snippets + +* Basic structure + + Snippet collections can be stored in plain text files. They are arranged by + sub-directories naming *snippet tables*. These mostly name Emacs major names. + + #+begin_example + . + |-- c-mode + | `-- printf + |-- java-mode + | `-- println + `-- text-mode + |-- email + `-- time + #+end_example + + The collections are loaded into *snippet tables* which the + triggering mechanism (see [[file:snippet-expansion.org][Expanding Snippets]]) looks up and + (hopefully) causes the right snippet to be expanded for you. + +* Setting up =yas-snippet-dirs= + + The emacs variable [[sym:yas-snippet-dirs][=yas-snippet-dirs=]] tells YASnippet + which collections to consider. It's used when you activate + [[sym:yas-global-mode][=yas-global-mode=]] or call + [[sym:yas-reload-all][=yas-reload-all=]] interactively. + + The default considers: + + - a personal collection that lives in =~/.emacs.d/snippets= + - the bundled collection, taken as a relative path to =yasnippet.el= localtion + + When you come across other snippet collections, do the following to try them + out: + + #+begin_src emacs-lisp :exports code + ;; Develop in ~/emacs.d/mysnippets, but also + ;; try out snippets in ~/Downloads/interesting-snippets + (setq yas-snippet-dirs '("~/emacs.d/mysnippets" + "~/Downloads/interesting-snippets")) + + ;; OR, keeping YASnippet defaults try out ~/Downloads/interesting-snippets + (setq yas-snippet-dirs (append yas-snippet-dirs + '("~/Downloads/interesting-snippets"))) + #+end_src + + Collections appearing earlier in the list override snippets with same names + appearing in collections later in the list. [[sym:yas-new-snippet][=yas-new-snippet=]] always stores + snippets in the first collection. + +* The =.yas-parents= file + + It's very useful to have certain modes share snippets between + themselves. To do this, choose a mode subdirectory and place a + =.yas-parents= containing a whitespace-separated list of other mode + names. When you reload those modes become parents of the original + mode. + + #+begin_example + . + |-- c-mode + | |-- .yas-parents # contains "cc-mode text-mode" + | `-- printf + |-- cc-mode + | |-- for + | `-- while + |-- java-mode + | |-- .yas-parents # contains "cc-mode text-mode" + | `-- println + `-- text-mode + |-- email + `-- time + #+end_example + + +* TODO The =.yas-make-groups= file + + If you place an empty plain text file =.yas-make-groups= inside one + of the mode directories, the names of these sub-directories are + considered groups of snippets and [[snippet-menu.org][the menu]] is organized much more + cleanly: + + [[./images/menu-groups.png]] + + Another way to achieve this is to place a =# group:= directive + inside the snippet definition. See [[./snippet-development.org][Writing Snippets]]. + + #+begin_example + $ tree ruby-mode/ + ruby-mode/ + |-- .yas-make-groups + |-- collections + | |-- each + | `-- ... + |-- control structure + | |-- forin + | `-- ... + |-- definitions + | `-- ... + `-- general + `-- ... + #+end_example + + Yet another way to create a nice snippet menu is to write into + =.yas-make-groups= a menu definition. TODO + +* TODO The =.yas-setup.el= file + +** TODO + +* The =.yas-compiled-snippet.el= file + + You may compile a top-level snippet directory with the + =yas-compile-directory= function, which will create a + =.yas-compiled-snippets.el= file under each mode subdirectory, + which contains definitions for all snippets in the subdirectory. + Compilation helps improve loading time. + + Alternatively, you may compile all directories in the list + =yas-snippet-dirs= with the =yas-recompile-all= function. + +* The =.yas-skip= file + + A =.yas-skip= file in a mode's snippet subdirectory tells YASnippet + not to load snippets from there. + +** TODO
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/snippet-reference.org @@ -0,0 +1,12 @@ +#+SETUPFILE: org-setup.inc + +#+TITLE: Reference + +#+BEGIN_SRC emacs-lisp :exports results :results value raw +(yas--document-symbols 1 `("Interactive functions" . ,#'interactive-form) + `("Customization variables" . ,#'(lambda (sym) + (and (boundp sym) + (get sym 'standard-value)))) + `("Useful functions" . ,#'fboundp) + `("Useful variables" . ,#'boundp)) +#+END_SRC
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/stylesheets/manual.css @@ -0,0 +1,26 @@ +nav > ul > li.center > ul { + padding: 0; +} + +nav li { + vertical-align: top; + + display: inline; + list-style-type: none; + padding: 0.5em; +} + +nav > ul > li { + display: inline-block; +} + +/* match org's css for <pre> */ +code { + background-color: #F3F5F7; + font-family: courier, monospace; +} + +#content { + margin-left: 5%; + margin-right: 10%; +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/stylesheets/styles.css @@ -0,0 +1,93 @@ +@media all +{ + body { + margin: 1em auto; + /*margin: 10px 18% 10px 18%;*/ + font-family: Arial; + /*text-align: justify;*/ + font-size: 14pt; + padding: 10px; + line-height: 1.2em; + max-width: 600pt; + } + + div#table-of-contents { + position: fixed; + left: 0%; + right: 0%; + top: 0px; + z-index: 100; + background: black; + } + + div#table-of-contents h2 { + display: none; + } + + div#table-of-contents a { + text-decoration: none; + color: white; + } + + div#table-of-contents a:visited { + color: white; + } + + div#table-of-contents a:hover { + color: orange; + } + + div.outline-2 h2{ + padding-top: 50px; + } + + div#text-table-of-contents { + text-color: white; + text-align: center; + margin-left: 30%; + margin-right: 30%; + } + + div#text-table-of-contents ul { + height: 2em; + width: 500px; + list-style: none; + margin: auto; + } + + div#text-table-of-contents ul li { + float: left; + margin-left:auto; + margin-right: auto; + padding-left: 10px; + } + + div#postamble{ + position: fixed; + width: 800px; + height: 250px; + left: 50%; + right: 50%; + margin:-75px 0 0 -400px; + bottom: -20px; + font-size: 10pt; + color: grey; + background: url('siscog-bottom-logo.png') no-repeat; + /* background-size: 100% 100%; */ + } + + div#postamble *{ + display: none; + } + + div#postamble p.date{ + position: relative; + bottom: -200px; + text-align: center; + display: block; + } + + + + +} \ No newline at end of file
new file mode 100755 --- /dev/null +++ b/elpa/yasnippet-0.9.1/doc/yas-doc-helper.el @@ -0,0 +1,168 @@ +;;; yas-doc-helper.el --- Help generate documentation for YASnippet + +;; Copyright (C) 2012, 2013 Free Software Foundation, Inc. + +;; Author: João Távora <joaotavora@gmail.com> +;; Keywords: convenience + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Some functions to help generate YASnippet docs + +;;; Code: + +(eval-when-compile + (require 'cl)) +(require 'org) +(or (require 'org-publish nil t) + (require 'ox-publish)) +(require 'yasnippet) ; docstrings must be loaded + +(defun yas--org-raw-html (tag content) + ;; in version 8.0 org-mode changed the export syntax, see + ;; http://orgmode.org/worg/org-8.0.html#sec-8-1 + (format (if (version< org-version "8.0.0") + "@<%s>%s@</%s>" ; old: @<tag> + "@@html:<%s>@@%s@@html:</%s>@@") ; new: @@html:<tag>@@ + tag content tag)) + +(defun yas--document-symbol (symbol level) + (flet ((concat-lines (&rest lines) + (mapconcat #'identity lines "\n"))) + (let* ((stars (make-string level ?*)) + (args (and (fboundp symbol) + (mapcar #'symbol-name (help-function-arglist symbol t)))) + (heading (cond ((fboundp symbol) + (format + "%s =%s= (%s)" stars symbol + (mapconcat (lambda (a) + (format (if (string-prefix-p "&" a) + "/%s/" "=%s=") a)) + args " "))) + (t + (format "%s =%s=\n" stars symbol)))) + (after-heading + (concat-lines ":PROPERTIES:" + (format ":CUSTOM_ID: %s" symbol) + ":END:")) + (body (or (cond ((fboundp symbol) + (let ((doc-synth (car-safe (get symbol 'function-documentation)))) + (if (functionp doc-synth) + (funcall doc-synth nil) + (documentation symbol t)))) + ((boundp symbol) + (documentation-property symbol 'variable-documentation t)) + (t + (format "*WARNING*: no symbol named =%s=" symbol))) + (format "*WARNING*: no doc for symbol =%s=" symbol))) + (case-fold-search nil)) + ;; do some transformations on the body: + ;; ARGxxx becomes @<code>arg@</code>xxx + ;; FOO becomes /foo/ + ;; `bar' becomes [[#bar][=bar=]] + (setq body (replace-regexp-in-string + "\\<\\([A-Z][-A-Z0-9]+\\)\\(\\sw+\\)?\\>" + #'(lambda (match) + (let* ((match1 (match-string 1 match)) + (prefix (downcase match1)) + (suffix (match-string 2 match)) + (fmt (cond + ((member prefix args) + (yas--org-raw-html "code" "%s")) + ((null suffix) "/%s/")))) + (if fmt (format fmt prefix) + match1))) + body t t 1) + body (replace-regexp-in-string + "`\\([a-z-]+\\)'" + #'(lambda (match) + (let* ((name (downcase (match-string 1 match))) + (sym (intern name))) + (if (memq sym yas--exported-syms) + (format "[[#%s][=%s=]]" name name) + (format "=%s=" name)))) + body t)) + ;; output the paragraph + ;; + (concat-lines heading + after-heading + body)))) + +(defun yas--document-symbols (level &rest names-and-predicates) + (let ((sym-lists (make-vector (length names-and-predicates) nil)) + (stars (make-string level ?*))) + (loop for sym in yas--exported-syms + do (loop for test in (mapcar #'cdr names-and-predicates) + for i from 0 + do (when (funcall test sym) + (push sym (aref sym-lists i)) + (return)))) + (loop for slist across sym-lists + for name in (mapcar #'car names-and-predicates) + concat (format "\n%s %s\n" stars name) + concat (mapconcat (lambda (sym) + (yas--document-symbol sym (1+ level))) + slist "\n\n")))) + +(defun yas--internal-link-snippet () + (interactive) + (yas-expand-snippet "[[#$1][=${1:`yas/selected-text`}=]]")) + +(define-key org-mode-map [M-f8] 'yas--internal-link-snippet) + +;; This lets all the org files be exported to HTML with +;; `org-publish-current-project' (C-c C-e P). + +(let* ((dir (if load-file-name (file-name-directory load-file-name) + default-directory)) + (rev (with-temp-file (expand-file-name "html-revision" dir) + (or (when (eq (call-process "git" nil t nil + "rev-parse" "--verify" "HEAD") 0) + (buffer-string)) + (princ yas--version (current-buffer))))) + (proj-plist + `(,@(when (fboundp 'org-html-publish-to-html) + '(:publishing-function org-html-publish-to-html)) + :base-directory ,dir :publishing-directory ,dir + :html-preamble + ,(with-temp-buffer + (insert-file-contents (expand-file-name "nav-menu.html.inc" dir)) + (buffer-string)) + :html-postamble + ,(concat "<hr><p class='creator'>Generated by %c on %d from " + rev "</p>\n" + "<p class='xhtml-validation'>%v</p>\n"))) + (project (assoc "yasnippet" org-publish-project-alist))) + (if project + (setcdr project proj-plist) + (push `("yasnippet" . ,proj-plist) + org-publish-project-alist))) + +(defun yas--generate-html-batch () + (let ((org-publish-use-timestamps-flag nil) + (org-export-copy-to-kill-ring nil) + (org-confirm-babel-evaluate nil) + (make-backup-files nil)) + (org-publish "yasnippet" 'force))) + + + +(provide 'yas-doc-helper) +;; Local Variables: +;; indent-tabs-mode: nil +;; coding: utf-8 +;; End: +;;; yas-doc-helper.el ends here
rename from elpa/yasnippet-0.8.0/snippets/c++-mode/.yas-parents rename to elpa/yasnippet-0.9.1/snippets/c++-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/c++-mode/beginend rename to elpa/yasnippet-0.9.1/snippets/c++-mode/beginend
rename from elpa/yasnippet-0.8.0/snippets/c++-mode/class rename to elpa/yasnippet-0.9.1/snippets/c++-mode/class
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/c++-mode/ns @@ -0,0 +1,4 @@ +# name: namespace ... +# key: ns +# -- +namespace \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/c++-mode/template rename to elpa/yasnippet-0.9.1/snippets/c++-mode/template
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/c++-mode/using @@ -0,0 +1,5 @@ +# name: using namespace ... +# key: using +# -- +using namespace ${std}; +$0 \ No newline at end of file
copy from elpa/yasnippet-0.8.0/snippets/c++-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/c-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/c-mode/fopen rename to elpa/yasnippet-0.9.1/snippets/c-mode/fopen
rename from elpa/yasnippet-0.8.0/snippets/c-mode/printf rename to elpa/yasnippet-0.9.1/snippets/c-mode/printf --- a/elpa/yasnippet-0.8.0/snippets/c-mode/printf +++ b/elpa/yasnippet-0.9.1/snippets/c-mode/printf @@ -1,5 +1,5 @@ # -*- mode: snippet -*- -# name: printf +# name: printf # contributor: joaotavora # key: printf # --
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents rename to elpa/yasnippet-0.9.1/snippets/cc-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/do rename to elpa/yasnippet-0.9.1/snippets/cc-mode/do
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/for rename to elpa/yasnippet-0.9.1/snippets/cc-mode/for
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/if rename to elpa/yasnippet-0.9.1/snippets/cc-mode/if
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/inc rename to elpa/yasnippet-0.9.1/snippets/cc-mode/inc
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/inc.1 rename to elpa/yasnippet-0.9.1/snippets/cc-mode/inc.1
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/main rename to elpa/yasnippet-0.9.1/snippets/cc-mode/main
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/once rename to elpa/yasnippet-0.9.1/snippets/cc-mode/once
rename from elpa/yasnippet-0.8.0/snippets/cc-mode/struct rename to elpa/yasnippet-0.9.1/snippets/cc-mode/struct
rename from elpa/yasnippet-0.8.0/snippets/cperl-mode/.yas-parents rename to elpa/yasnippet-0.9.1/snippets/cperl-mode/.yas-parents
copy from elpa/yasnippet-0.8.0/snippets/c++-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/csharp-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/attrib rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/attrib
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/attrib.1 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/attrib.1
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/attrib.2 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/attrib.2
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/class rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/class --- a/elpa/yasnippet-0.8.0/snippets/csharp-mode/class +++ b/elpa/yasnippet-0.9.1/snippets/csharp-mode/class @@ -14,7 +14,7 @@ /// <summary> /// ${4:Default Destructor} - /// </summary> + /// </summary> public ~$1() { }
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/comment rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/comment
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/comment.1 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/comment.1
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/comment.2 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/comment.2
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/comment.3 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/comment.3
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/method rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/method
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/namespace rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/namespace
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/prop rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/prop
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/region rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/region
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/using rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/using
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/using.1 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/using.1
rename from elpa/yasnippet-0.8.0/snippets/csharp-mode/using.2 rename to elpa/yasnippet-0.9.1/snippets/csharp-mode/using.2
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/css-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/css-mode/bg rename to elpa/yasnippet-0.9.1/snippets/css-mode/bg
rename from elpa/yasnippet-0.8.0/snippets/css-mode/bg.1 rename to elpa/yasnippet-0.9.1/snippets/css-mode/bg.1
rename from elpa/yasnippet-0.8.0/snippets/css-mode/bor rename to elpa/yasnippet-0.9.1/snippets/css-mode/bor
rename from elpa/yasnippet-0.8.0/snippets/css-mode/cl rename to elpa/yasnippet-0.9.1/snippets/css-mode/cl
rename from elpa/yasnippet-0.8.0/snippets/css-mode/disp.block rename to elpa/yasnippet-0.9.1/snippets/css-mode/disp.block
rename from elpa/yasnippet-0.8.0/snippets/css-mode/disp.inline rename to elpa/yasnippet-0.9.1/snippets/css-mode/disp.inline
rename from elpa/yasnippet-0.8.0/snippets/css-mode/disp.none rename to elpa/yasnippet-0.9.1/snippets/css-mode/disp.none
rename from elpa/yasnippet-0.8.0/snippets/css-mode/ff rename to elpa/yasnippet-0.9.1/snippets/css-mode/ff
rename from elpa/yasnippet-0.8.0/snippets/css-mode/fs rename to elpa/yasnippet-0.9.1/snippets/css-mode/fs
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.bottom rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.bottom
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.left rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.left
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.mar rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.mar
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.margin rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.margin
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.right rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.right
rename from elpa/yasnippet-0.8.0/snippets/css-mode/mar.top rename to elpa/yasnippet-0.9.1/snippets/css-mode/mar.top
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.bottom rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.bottom
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.left rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.left
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.pad rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.pad
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.padding rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.padding
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.right rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.right
rename from elpa/yasnippet-0.8.0/snippets/css-mode/pad.top rename to elpa/yasnippet-0.9.1/snippets/css-mode/pad.top
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/.read_me rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/.read_me
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/add-hook.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/add-hook.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/and.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/and.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/append.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/append.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/apply.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/apply.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/aref.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/aref.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/aset.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/aset.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/assq.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/assq.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/autoload.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/autoload.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/backward-char.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/backward-char.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/beginning-of-line.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/beginning-of-line.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/bounds-of-thing-at-point.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/buffer-file-name.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/buffer-file-name.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/buffer-modified-p.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/buffer-substring-no-properties.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/buffer-substring.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/buffer-substring.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/car.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/car.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/cdr.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/cdr.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/concat.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/concat.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/cond.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/cond.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/condition-case.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/condition-case.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/cons.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/cons.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/consp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/consp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/copy-directory.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/copy-directory.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/copy-file.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/copy-file.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/current-buffer.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/current-buffer.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/custom-autoload.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/custom-autoload.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/defalias.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/defalias.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/defcustom.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/defcustom.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/define-key.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/define-key.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/defsubst.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/defsubst.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/defun.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/defun.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/defvar.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/defvar.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/delete-char.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/delete-char.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/delete-directory.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/delete-directory.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/delete-file.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/delete-file.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/delete-region.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/delete-region.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/directory-files.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/directory-files.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/dolist.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/dolist.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/end-of-line.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/end-of-line.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/eq.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/eq.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/equal.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/equal.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/error.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/error.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/expand-file-name.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/expand-file-name.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/format.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/f.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/fboundp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/fboundp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/file-name-directory.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/file-name-directory.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/file-name-extension.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/file-name-extension.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/file-name-nondirectory.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/file-name-sans-extension.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/file-relative-name.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/file-relative-name.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/find-file.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/find-file.yasnippet
copy from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/format.yasnippet copy to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/format.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/forward-char.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/forward-char.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/forward-line.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/forward-line.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/funcall.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/funcall.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/function.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/function.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/get.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/get.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/global-set-key.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/global-set-key.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/goto-char.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/goto-char.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/if.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/if.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/insert-file-contents.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/insert-file-contents.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/insert.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/insert.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/interactive.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/interactive.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/kbd.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/kbd.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/kill-buffer.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/kill-buffer.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/lambda.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/lambda.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/length.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/length.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/let.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/let.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/line-beginning-position.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/line-beginning-position.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/line-end-position.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/line-end-position.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/list.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/list.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/looking-at.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/looking-at.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/make-directory.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/make-directory.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/make-local-variable.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/make-local-variable.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/mapc.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/mapc.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/mapcar.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/mapcar.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/match-beginning.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/match-beginning.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/match-end.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/match-end.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/match-string.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/match-string.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/memq.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/memq.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/message.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/message.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/not.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/not.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/nth.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/nth.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/null.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/null.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/number-to-string.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/number-to-string.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/or.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/or.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/point-max.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/point-max.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/point-min.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/point-min.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/point.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/point.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/princ.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/princ.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/print.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/print.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/progn.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/progn.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/push.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/push.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/put.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/put.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/re-search-backward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/re-search-backward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/re-search-forward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/re-search-forward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/region-active-p.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/region-active-p.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/region-beginning.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/region-beginning.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/region-end.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/region-end.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/rename-file.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/rename-file.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/repeat.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/repeat.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/replace-regexp-in-string.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/replace-regexp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/replace-regexp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/require.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/require.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/save-buffer.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/save-buffer.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/save-excursion.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/save-excursion.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/search-backward-regexp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/search-backward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/search-backward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/search-forward-regexp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/search-forward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/search-forward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/set-buffer.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/set-buffer.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/set-file-modes.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/set-file-modes.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/set-mark.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/set-mark.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/set.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/set.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/setq.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/setq.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/skip-chars-backward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/skip-chars-forward.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/split-string.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/split-string.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/string-match.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/string-match.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/string-to-number.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/string-to-number.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/string.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/string.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/string=.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/string=.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/stringp.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/stringp.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/substring.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/substring.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/thing-at-point.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/thing-at-point.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/unless.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/unless.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/vector.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/vector.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/when.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/when.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/while.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/while.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/widget-get.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/widget-get.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/with-current-buffer.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/with-current-buffer.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet --- a/elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet +++ b/elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-dired.process_marked.yasnippet @@ -3,7 +3,7 @@ # key: x-dired # -- ;; idiom for processing a list of files in dired's marked files - + ;; suppose myProcessFile is your function that takes a file path ;; and do some processing on the file
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-file.process.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-file.process.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet --- a/elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet +++ b/elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-file.read-lines.yasnippet @@ -10,8 +10,8 @@ (buffer-string) "\n" t)) ) ;; process all lines -(mapc - (lambda (aLine) +(mapc + (lambda (aLine) (message aLine) ; do your stuff here ) (read-lines "inputFilePath")
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-find-replace.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-find-replace.yasnippet --- a/elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-find-replace.yasnippet +++ b/elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-find-replace.yasnippet @@ -6,7 +6,7 @@ "Replace “<†to “<†and other chars in HTML. This works on the current region." (interactive "r") - (save-restriction + (save-restriction (narrow-to-region start end) (goto-char (point-min)) (while (search-forward "&" nil t) (replace-match "&" nil t))
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-grabstring.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-grabstring.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-grabthing.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-grabthing.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-traverse_dir.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/x-word-or-region.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/x-word-or-region.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/y-or-n-p.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/y-or-n-p.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet rename to elpa/yasnippet-0.9.1/snippets/emacs-lisp-mode/yes-or-no-p.yasnippet
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/erlang-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/after rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/after
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/begin rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/begin
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/beh rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/beh
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/case rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/case
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/compile rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/compile
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/def rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/def
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/exp rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/exp
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/fun rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/fun
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/if rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/if
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/ifdef rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/ifdef
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/ifndef rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/ifndef
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/imp rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/imp
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/inc rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/inc
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/inc.lib rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/inc.lib
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/loop rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/loop
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/mod rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/mod
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/rcv rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/rcv
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/rcv.after rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/rcv.after
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/rec rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/rec
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/try rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/try
rename from elpa/yasnippet-0.8.0/snippets/erlang-mode/undef rename to elpa/yasnippet-0.9.1/snippets/erlang-mode/undef
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/f90-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/au rename to elpa/yasnippet-0.9.1/snippets/f90-mode/au --- a/elpa/yasnippet-0.8.0/snippets/f90-mode/au +++ b/elpa/yasnippet-0.9.1/snippets/f90-mode/au @@ -2,4 +2,4 @@ # name: automatic # key: au # -- -automatic $0 \ No newline at end of file +automatic $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/bd rename to elpa/yasnippet-0.9.1/snippets/f90-mode/bd
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/c rename to elpa/yasnippet-0.9.1/snippets/f90-mode/c
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/ch rename to elpa/yasnippet-0.9.1/snippets/f90-mode/ch
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/cx rename to elpa/yasnippet-0.9.1/snippets/f90-mode/cx
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/dc rename to elpa/yasnippet-0.9.1/snippets/f90-mode/dc
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/do rename to elpa/yasnippet-0.9.1/snippets/f90-mode/do
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/dp rename to elpa/yasnippet-0.9.1/snippets/f90-mode/dp
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/eq rename to elpa/yasnippet-0.9.1/snippets/f90-mode/eq
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/ib rename to elpa/yasnippet-0.9.1/snippets/f90-mode/ib
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/ic rename to elpa/yasnippet-0.9.1/snippets/f90-mode/ic
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/ich rename to elpa/yasnippet-0.9.1/snippets/f90-mode/ich
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/if rename to elpa/yasnippet-0.9.1/snippets/f90-mode/if
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/f90-mode/ii @@ -0,0 +1,5 @@ +# contributor: Li Zhu <http://www.zhuli.name> +# name: implicit integer +# key: ii +# -- +implicit integer $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/il rename to elpa/yasnippet-0.9.1/snippets/f90-mode/il
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/in rename to elpa/yasnippet-0.9.1/snippets/f90-mode/in
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/inc rename to elpa/yasnippet-0.9.1/snippets/f90-mode/inc
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/intr rename to elpa/yasnippet-0.9.1/snippets/f90-mode/intr
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/ir rename to elpa/yasnippet-0.9.1/snippets/f90-mode/ir
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/l rename to elpa/yasnippet-0.9.1/snippets/f90-mode/l
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/pa rename to elpa/yasnippet-0.9.1/snippets/f90-mode/pa
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/pr rename to elpa/yasnippet-0.9.1/snippets/f90-mode/pr
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/re rename to elpa/yasnippet-0.9.1/snippets/f90-mode/re
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/st rename to elpa/yasnippet-0.9.1/snippets/f90-mode/st
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/su rename to elpa/yasnippet-0.9.1/snippets/f90-mode/su
rename from elpa/yasnippet-0.8.0/snippets/f90-mode/wr rename to elpa/yasnippet-0.9.1/snippets/f90-mode/wr
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/html-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/html-mode/b.yasnippet rename to elpa/yasnippet-0.9.1/snippets/html-mode/b.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/html-mode/body rename to elpa/yasnippet-0.9.1/snippets/html-mode/body
rename from elpa/yasnippet-0.8.0/snippets/html-mode/br rename to elpa/yasnippet-0.9.1/snippets/html-mode/br
rename from elpa/yasnippet-0.8.0/snippets/html-mode/code rename to elpa/yasnippet-0.9.1/snippets/html-mode/code
rename from elpa/yasnippet-0.8.0/snippets/html-mode/code.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/code.class
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/html-mode/div @@ -0,0 +1,4 @@ +# name: <div...>...</div> +# key: div +# -- +<div${1: id="${2:some_id}"}${3: class="${4:some_class}"}>$0</div> \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/html-mode/div.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/div.class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/div.id rename to elpa/yasnippet-0.9.1/snippets/html-mode/div.id
rename from elpa/yasnippet-0.8.0/snippets/html-mode/div.id-class rename to elpa/yasnippet-0.9.1/snippets/html-mode/div.id-class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/dov rename to elpa/yasnippet-0.9.1/snippets/html-mode/dov
rename from elpa/yasnippet-0.8.0/snippets/html-mode/form rename to elpa/yasnippet-0.9.1/snippets/html-mode/form
rename from elpa/yasnippet-0.8.0/snippets/html-mode/head rename to elpa/yasnippet-0.9.1/snippets/html-mode/head
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h1 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h1
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h2 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h2
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h3 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h3
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h4 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h4
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h5 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h5
rename from elpa/yasnippet-0.8.0/snippets/html-mode/header/h6 rename to elpa/yasnippet-0.9.1/snippets/html-mode/header/h6
rename from elpa/yasnippet-0.8.0/snippets/html-mode/hr rename to elpa/yasnippet-0.9.1/snippets/html-mode/hr
rename from elpa/yasnippet-0.8.0/snippets/html-mode/href rename to elpa/yasnippet-0.9.1/snippets/html-mode/href
rename from elpa/yasnippet-0.8.0/snippets/html-mode/html rename to elpa/yasnippet-0.9.1/snippets/html-mode/html
rename from elpa/yasnippet-0.8.0/snippets/html-mode/html.xmlns rename to elpa/yasnippet-0.9.1/snippets/html-mode/html.xmlns
rename from elpa/yasnippet-0.8.0/snippets/html-mode/i.yasnippet rename to elpa/yasnippet-0.9.1/snippets/html-mode/i.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/html-mode/img rename to elpa/yasnippet-0.9.1/snippets/html-mode/img
rename from elpa/yasnippet-0.8.0/snippets/html-mode/input rename to elpa/yasnippet-0.9.1/snippets/html-mode/input
rename from elpa/yasnippet-0.8.0/snippets/html-mode/link.stylesheet rename to elpa/yasnippet-0.9.1/snippets/html-mode/link.stylesheet
rename from elpa/yasnippet-0.8.0/snippets/html-mode/link.stylesheet-ie rename to elpa/yasnippet-0.9.1/snippets/html-mode/link.stylesheet-ie
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/dd rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/dd
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/dl rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/dl
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/dl.id rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/dl.id
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/dt rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/dt
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/li rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/li
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/li.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/li.class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ol rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ol
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ol.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ol.class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ol.id rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ol.id
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ul rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ul
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ul.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ul.class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/list/ul.id rename to elpa/yasnippet-0.9.1/snippets/html-mode/list/ul.id
rename from elpa/yasnippet-0.8.0/snippets/html-mode/mailto rename to elpa/yasnippet-0.9.1/snippets/html-mode/mailto
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/doctype rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/doctype
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/doctype.xhml1 rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/doctype.xhml1
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/doctype.xhtml1_1 rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/doctype.xhtml1_1
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/doctype.xhtml1_strict rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/doctype.xhtml1_strict
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/doctype.xhtml1_transitional rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/doctype.xhtml1_transitional
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/meta rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/meta
rename from elpa/yasnippet-0.8.0/snippets/html-mode/meta/meta.http-equiv rename to elpa/yasnippet-0.9.1/snippets/html-mode/meta/meta.http-equiv
rename from elpa/yasnippet-0.8.0/snippets/html-mode/p rename to elpa/yasnippet-0.9.1/snippets/html-mode/p
rename from elpa/yasnippet-0.8.0/snippets/html-mode/pre rename to elpa/yasnippet-0.9.1/snippets/html-mode/pre
rename from elpa/yasnippet-0.8.0/snippets/html-mode/q.yasnippet rename to elpa/yasnippet-0.9.1/snippets/html-mode/q.yasnippet
rename from elpa/yasnippet-0.8.0/snippets/html-mode/quote rename to elpa/yasnippet-0.9.1/snippets/html-mode/quote
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/html-mode/script.javascript @@ -0,0 +1,7 @@ +# contributor: Jimmy Wu <frozenthrone88@gmail.com> +#name :<script type="text/javascript">...</script> +# key: script +# -- +<script type="text/javascript"> + $0 +</script> \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/html-mode/script.javascript-src @@ -0,0 +1,5 @@ +# contributor: Jimmy Wu <frozenthrone88@gmail.com> +#name :<script type="text/javascript" src="..."></script> +# key: script +# -- +<script type="text/javascript" src="$1"></script> \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/html-mode/span rename to elpa/yasnippet-0.9.1/snippets/html-mode/span
rename from elpa/yasnippet-0.8.0/snippets/html-mode/span.class rename to elpa/yasnippet-0.9.1/snippets/html-mode/span.class
rename from elpa/yasnippet-0.8.0/snippets/html-mode/span.id rename to elpa/yasnippet-0.9.1/snippets/html-mode/span.id
rename from elpa/yasnippet-0.8.0/snippets/html-mode/style rename to elpa/yasnippet-0.9.1/snippets/html-mode/style
rename from elpa/yasnippet-0.8.0/snippets/html-mode/table/table rename to elpa/yasnippet-0.9.1/snippets/html-mode/table/table
rename from elpa/yasnippet-0.8.0/snippets/html-mode/table/td rename to elpa/yasnippet-0.9.1/snippets/html-mode/table/td
rename from elpa/yasnippet-0.8.0/snippets/html-mode/table/th rename to elpa/yasnippet-0.9.1/snippets/html-mode/table/th
rename from elpa/yasnippet-0.8.0/snippets/html-mode/table/tr rename to elpa/yasnippet-0.9.1/snippets/html-mode/table/tr
rename from elpa/yasnippet-0.8.0/snippets/html-mode/textarea rename to elpa/yasnippet-0.9.1/snippets/html-mode/textarea
rename from elpa/yasnippet-0.8.0/snippets/html-mode/title rename to elpa/yasnippet-0.9.1/snippets/html-mode/title
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/assert.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: assert +# key: assert +# -- +assert.${1:equal}($0);
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/cb.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: cb +# key: cb +# -- +function(error, $1){ +$0 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/com.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# name: com +# key: com +# -- + +/** + * $0 + * @param {${1:String}} $2 + * @return {${3:String}} + */
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/describe.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: desc +# key: desc +# -- +describe('$1', function(){ +$2 +});
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/err.snippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: err +# key: err +# -- +if(${1:error}){ + callback($1); + return; +} +$2
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/error.snippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: error +# key: error +# -- +if(${1:error}){ + callback($1); + return; +} +$2
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/expect.yasnippet @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: expect +# key: expect +# -- +expect($1).to.${2:equal}($3); +$0 \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/exports.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: exports +# key: exports +# -- +module.exports = { +$0 +};
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/fn.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: fn +# key: fn +# -- +function$1($2){ +$0 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/for.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: for +# key: for +# -- +var ${1:i} = ${2:-1}, len = $3.length; + +for(; ++$1 < len;){ + $4 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/id.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: id +# key: id +# -- +document.getElementById('$0');
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/if.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: if +# key: if +# -- +if( ${1} ){ +$0 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/invoc.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: invoc +# key: invoc +# -- +(function($1){ +$0 +})($2);
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/it.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: it +# key: it +# -- +it('$1', function(done){ +$2 +});
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/log.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: log +# key: log +# -- +console.${1:log}( $0 );
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/method.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: method +# key: method +# -- +$1.prototype.$2 = function($3){ +${0} +};
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/mod.yasnippet @@ -0,0 +1,11 @@ +# -*- mode: snippet -*- +# name: mod +# key: mod +# -- +var $1 = require("${2:$1}")$3 + +module.exports = { + $4: $4$5 +}; + +$0
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/prop.yasnippet @@ -0,0 +1,19 @@ +# -*- mode: snippet -*- +# name: prop +# key: prop +# -- + +var $1 = (function(){ + + var value = undefined; + + return function $1(newValue){ + + if( $1.arguments.length > 0 ){ + value = newValue; + } + + return value; + }; + +})();
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/proto.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: proto +# key: proto +# -- +$1.prototype.$2 = $0
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/rq.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: rq +# key: rq +# -- +$1 = require("${2:$1}")$0
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/rt.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: rt +# key: rt +# -- +return$0;
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/slice.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: slice +# key: slice +# -- +Array.prototype.slice.${1:call}($0);
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/super.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: super +# key: super +# -- +$1.prototype.${2:constructor}.${3:call}($0);
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/switch.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: switch +# key: switch +# -- +switch($1){ +$0 +};
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/throw.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: throw +# key: throw +# -- +throw new Error("$1");
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/try.yasnippet @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: try +# key: try +# -- +try { + $1 +} catch(error) { + $0 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/var.yasnippet @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: var +# key: var +# -- +var $1 = $0
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/wh.yasnippet @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: wh +# key: wh +# -- +while($1){ +$0 +}
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/js-mode/while.yasnippet @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# name: while +# key: while +# -- + +var i = $1.length; + +while( i -- ){ + $0 +} \ No newline at end of file
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/latex-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/latex-mode/begin rename to elpa/yasnippet-0.9.1/snippets/latex-mode/begin
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/+ rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/+
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/- rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/-
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/markdown-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/_ rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/_
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/__ rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/__
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/` rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/`
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h1.1 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h1.1
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h1.2 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h1.2
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h2.1 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h2.1
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h2.2 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h2.2
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h3 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h3
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h4 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h4
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h5 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h5
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/h6 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/h6
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/hr.1 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/hr.1
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/hr.2 rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/hr.2
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/img rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/img
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/link rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/link
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/ol rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/ol
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/rimg rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/rimg
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/rlb rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/rlb
rename from elpa/yasnippet-0.8.0/snippets/markdown-mode/rlink rename to elpa/yasnippet-0.9.1/snippets/markdown-mode/rlink
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/nxml-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/body rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/body
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/br rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/br
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/code rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/code
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/div rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/div
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/form rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/form
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/head rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/head
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h1 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h1
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h2 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h2
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h3 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h3
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h4 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h4
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h5 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h5
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/header/h6 rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/header/h6
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/hr rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/hr
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/href rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/href
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/html rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/html
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/img rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/img
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/input rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/input
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/li rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/li
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/link rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/link
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/meta/doctype rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/meta/doctype
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/meta/doctype.xhtml1_strict rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/meta/doctype.xhtml1_strict
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/meta/doctype.xhtml1_transitional rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/meta/doctype.xhtml1_transitional
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/meta/meta rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/meta/meta
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/name rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/name
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/ol rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/ol
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/p rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/p
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/pre rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/pre
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/quote rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/quote
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/span rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/span
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/style rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/style
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/table rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/table
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/tag.1l rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/tag.1l
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/tag.2l rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/tag.2l
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/td rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/td
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/th rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/th
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/title rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/title
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/tr rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/tr
rename from elpa/yasnippet-0.8.0/snippets/nxml-mode/ul rename to elpa/yasnippet-0.9.1/snippets/nxml-mode/ul
copy from elpa/yasnippet-0.8.0/snippets/c++-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/objc-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/objc-mode/prop rename to elpa/yasnippet-0.9.1/snippets/objc-mode/prop
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/perl-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/eval rename to elpa/yasnippet-0.9.1/snippets/perl-mode/eval
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/for rename to elpa/yasnippet-0.9.1/snippets/perl-mode/for
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/fore rename to elpa/yasnippet-0.9.1/snippets/perl-mode/fore
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/if rename to elpa/yasnippet-0.9.1/snippets/perl-mode/if
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/ife rename to elpa/yasnippet-0.9.1/snippets/perl-mode/ife
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/ifee rename to elpa/yasnippet-0.9.1/snippets/perl-mode/ifee
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/sub rename to elpa/yasnippet-0.9.1/snippets/perl-mode/sub
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/unless rename to elpa/yasnippet-0.9.1/snippets/perl-mode/unless
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/while rename to elpa/yasnippet-0.9.1/snippets/perl-mode/while
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/xfore rename to elpa/yasnippet-0.9.1/snippets/perl-mode/xfore
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/xif rename to elpa/yasnippet-0.9.1/snippets/perl-mode/xif
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/xunless rename to elpa/yasnippet-0.9.1/snippets/perl-mode/xunless
rename from elpa/yasnippet-0.8.0/snippets/perl-mode/xwhile rename to elpa/yasnippet-0.9.1/snippets/perl-mode/xwhile
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/python-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/python-mode/__ rename to elpa/yasnippet-0.9.1/snippets/python-mode/__
rename from elpa/yasnippet-0.8.0/snippets/python-mode/class rename to elpa/yasnippet-0.9.1/snippets/python-mode/class
rename from elpa/yasnippet-0.8.0/snippets/python-mode/def rename to elpa/yasnippet-0.9.1/snippets/python-mode/def --- a/elpa/yasnippet-0.8.0/snippets/python-mode/def +++ b/elpa/yasnippet-0.9.1/snippets/python-mode/def @@ -7,7 +7,7 @@ def ${1:name}($2): """$3 ${2:$ - (let* + (let* ((indent (concat "\n" (make-string (current-column) 32))) (args
rename from elpa/yasnippet-0.8.0/snippets/python-mode/defm rename to elpa/yasnippet-0.9.1/snippets/python-mode/defm
rename from elpa/yasnippet-0.8.0/snippets/python-mode/for rename to elpa/yasnippet-0.9.1/snippets/python-mode/for
rename from elpa/yasnippet-0.8.0/snippets/python-mode/ifmain rename to elpa/yasnippet-0.9.1/snippets/python-mode/ifmain
rename from elpa/yasnippet-0.8.0/snippets/python-mode/prop rename to elpa/yasnippet-0.9.1/snippets/python-mode/prop
rename from elpa/yasnippet-0.8.0/snippets/python-mode/propg rename to elpa/yasnippet-0.9.1/snippets/python-mode/propg
rename from elpa/yasnippet-0.8.0/snippets/python-mode/propsg rename to elpa/yasnippet-0.9.1/snippets/python-mode/propsg
rename from elpa/yasnippet-0.8.0/snippets/python-mode/while rename to elpa/yasnippet-0.9.1/snippets/python-mode/while
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/rst-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/rst-mode/chap rename to elpa/yasnippet-0.9.1/snippets/rst-mode/chap
rename from elpa/yasnippet-0.8.0/snippets/rst-mode/sec rename to elpa/yasnippet-0.9.1/snippets/rst-mode/sec
rename from elpa/yasnippet-0.8.0/snippets/rst-mode/tit rename to elpa/yasnippet-0.9.1/snippets/rst-mode/tit
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/ruby-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/all rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/all
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/any rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/any
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/classify rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/classify
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/collect rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/collect
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/deli rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/deli
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/det rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/det
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/ea rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/ea
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/eac rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/eac
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/eai rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/eai
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/eav rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/eav
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/eawi rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/eawi
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/inject rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/inject
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/reject rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/reject
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/collections/select rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/select
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/ruby-mode/collections/zip @@ -0,0 +1,4 @@ +#name : zip(...) { |...| ... } +# key: zip +# -- +zip(${enums}) { |${row}| $0 } \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/forin rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/forin
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/if rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/if
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/ife rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/ife
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/tim rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/tim
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/until rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/until
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/upt rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/upt
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/when rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/when
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/control structure/while rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/control structure/while
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/Comp rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/Comp
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/am rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/am
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/cla rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/cla
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/cls rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/cls
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/mm rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/mm
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/mod @@ -0,0 +1,13 @@ +# name: module ... end +# contributor: hitesh <hitesh.jasani@gmail.com>, jimeh <contact@jimeh.me> +# key: mod +# -- +module ${1:`(let ((fn (capitalize (file-name-nondirectory + (file-name-sans-extension + (or (buffer-file-name) + (buffer-name (current-buffer)))))))) + (cond + ((string-match "_" fn) (replace-match "" nil nil fn)) + (t fn)))`} + $0 +end \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/r rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/r
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/rw rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/rw
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/definitions/w rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/definitions/w
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/# rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/# --- a/elpa/yasnippet-0.8.0/snippets/ruby-mode/general/# +++ b/elpa/yasnippet-0.9.1/snippets/ruby-mode/general/# @@ -1,4 +1,4 @@ # name: # => # key: # # -- -# => \ No newline at end of file +# => \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/=b rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/=b
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/app rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/app
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/bm rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/bm
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/case rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/case
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/dee rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/dee
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/rb rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/rb
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/req rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/req
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/rreq rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/rreq
rename from elpa/yasnippet-0.8.0/snippets/ruby-mode/general/y rename to elpa/yasnippet-0.9.1/snippets/ruby-mode/general/y
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/scala-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/act rename to elpa/yasnippet-0.9.1/snippets/scala-mode/act
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/act.arg rename to elpa/yasnippet-0.9.1/snippets/scala-mode/act.arg
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/actor rename to elpa/yasnippet-0.9.1/snippets/scala-mode/actor
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ano rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ano
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/app rename to elpa/yasnippet-0.9.1/snippets/scala-mode/app
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/arr.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/arr.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/arr.val-new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/arr.val-new
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/asof @@ -0,0 +1,5 @@ +# Author: Jonas Bonèr <jonas@jonasboner.com> +# name: asInstanceOf[T] +# key: asof +# -- +asInstanceOf[${1:type}] $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ass rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ass
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ass.true rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ass.true
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/at.author rename to elpa/yasnippet-0.9.1/snippets/scala-mode/at.author
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/at.param rename to elpa/yasnippet-0.9.1/snippets/scala-mode/at.param
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/at.return rename to elpa/yasnippet-0.9.1/snippets/scala-mode/at.return
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/at.version rename to elpa/yasnippet-0.9.1/snippets/scala-mode/at.version
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/bang rename to elpa/yasnippet-0.9.1/snippets/scala-mode/bang
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/case @@ -0,0 +1,5 @@ +# Author: Jonas Bonèr <jonas@jonasboner.com> +# name: case pattern => +# key: case +# -- +case ${1:pattern} => $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/case.match-all rename to elpa/yasnippet-0.9.1/snippets/scala-mode/case.match-all --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/case.match-all +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/case.match-all @@ -1,5 +1,5 @@ # Author: Jonas Bonèr <jonas@jonasboner.com> -# name: case _ => +# name: case _ => # key: case # -- case _ => $0 \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/cast @@ -0,0 +1,5 @@ +# Author: Jonas Bonèr <jonas@jonasboner.com> +# name: asInstanceOf[T] +# key: cast +# -- +asInstanceOf[${1:type}] $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cc rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cc
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cl rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cl
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cl.abs rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cl.abs
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cl.abs-arg rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cl.abs-arg
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cl.arg rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cl.arg
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/clof rename to elpa/yasnippet-0.9.1/snippets/scala-mode/clof --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/clof +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/clof @@ -1,5 +1,5 @@ # Author: Jonas Bonèr <jonas@jonasboner.com> -# name: classOf[T] +# name: classOf[T] # key: clof # -- classOf[${1:type}] $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/co rename to elpa/yasnippet-0.9.1/snippets/scala-mode/co
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cons rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cons
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/cons.nil rename to elpa/yasnippet-0.9.1/snippets/scala-mode/cons.nil
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.arg rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.arg
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.arg-body rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.arg-body
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.arg-ret rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.arg-ret
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.arg-ret-body rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.arg-ret-body
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.body rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.body
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.ret rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.ret
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.ret-body rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.ret-body
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/def.simple rename to elpa/yasnippet-0.9.1/snippets/scala-mode/def.simple
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.class rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.class --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/doc.class +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/doc.class @@ -2,8 +2,8 @@ # name: /** cls/trt/obj name */ # key: doc # -- -/** +/** * `(scala-mode-find-clstrtobj-name-doc)` * ${1:description} - * $0 + * $0 */ \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.def rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.def --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/doc.def +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/doc.def @@ -2,6 +2,6 @@ # name: /** method name */ # key: doc # -- -/** +/** * `(scala-mode-def-and-args-doc)` - */ \ No newline at end of file + */ \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file @@ -6,5 +6,5 @@ * `(scala-mode-file-doc)` * $0 * @author ${1:name} - * @version ${2:0.1} + * @version ${2:0.1} */ \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file-scala rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file-scala --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file-scala +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file-scala @@ -9,9 +9,9 @@ ** /____/\___/_/ |_/____/_/ | | ** ** |/ ** \* */ -/** +/** * $0 - * @author ${1:name} + * @author ${1:name} * @version ${2:0.1} * $Id$ */ \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file-scala-api rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file-scala-api --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/doc.file-scala-api +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/doc.file-scala-api @@ -9,9 +9,9 @@ ** /____/\___/_/ |_/____/_/ | | ** ** |/ ** \* */ -/** +/** * $0 - * @author ${1:name} + * @author ${1:name} * @version ${2:0.1} * $Id$ */ \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/doc.scaladoc rename to elpa/yasnippet-0.9.1/snippets/scala-mode/doc.scaladoc
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/expect rename to elpa/yasnippet-0.9.1/snippets/scala-mode/expect
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ext rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ext
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/for.extract rename to elpa/yasnippet-0.9.1/snippets/scala-mode/for.extract
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/for.if rename to elpa/yasnippet-0.9.1/snippets/scala-mode/for.if
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/for.loop rename to elpa/yasnippet-0.9.1/snippets/scala-mode/for.loop
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/for.multi rename to elpa/yasnippet-0.9.1/snippets/scala-mode/for.multi
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/foreach rename to elpa/yasnippet-0.9.1/snippets/scala-mode/foreach
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/hmap.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/hmap.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/hmap.val-new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/hmap.val-new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/hset.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/hset.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/hset.val-new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/hset.val-new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/if rename to elpa/yasnippet-0.9.1/snippets/scala-mode/if
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/if.else rename to elpa/yasnippet-0.9.1/snippets/scala-mode/if.else
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/imp rename to elpa/yasnippet-0.9.1/snippets/scala-mode/imp
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/intercept rename to elpa/yasnippet-0.9.1/snippets/scala-mode/intercept
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/isof @@ -0,0 +1,5 @@ +# Author: Jonas Bonèr <jonas@jonasboner.com> +# name: isInstanceOf[T] +# key: isof +# -- +isInstanceOf[${1:type}] $0 \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ls.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ls.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ls.val-new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ls.val-new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/main rename to elpa/yasnippet-0.9.1/snippets/scala-mode/main
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/map rename to elpa/yasnippet-0.9.1/snippets/scala-mode/map
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/map.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/map.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/match rename to elpa/yasnippet-0.9.1/snippets/scala-mode/match
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/match.can @@ -0,0 +1,12 @@ +# Author: Jonas Bonèr <jonas@jonasboner.com> +# name: can match { case Full(res) => .. } +# key: match +# -- +${1:option} match { + case Full(res) => $0 + + case Empty => + + case Failure(msg, _, _) => + +} \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/match.option rename to elpa/yasnippet-0.9.1/snippets/scala-mode/match.option --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/match.option +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/match.option @@ -4,6 +4,6 @@ # -- ${1:option} match { case None => $0 - case Some(res) => + case Some(res) => } \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/mix rename to elpa/yasnippet-0.9.1/snippets/scala-mode/mix
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/ob rename to elpa/yasnippet-0.9.1/snippets/scala-mode/ob
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pac rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pac
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pr.newline rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pr.newline
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pr.simple rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pr.simple
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pr.string rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pr.string
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pr.trace rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pr.trace
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pri rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pri
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pri.param rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pri.param
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pro rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pro
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/pro.param rename to elpa/yasnippet-0.9.1/snippets/scala-mode/pro.param
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/suite rename to elpa/yasnippet-0.9.1/snippets/scala-mode/suite
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/test rename to elpa/yasnippet-0.9.1/snippets/scala-mode/test
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/throw rename to elpa/yasnippet-0.9.1/snippets/scala-mode/throw
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tr rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tr
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tr.ext rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tr.ext
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tr.ext-with rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tr.ext-with
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tr.with rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tr.with
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/try rename to elpa/yasnippet-0.9.1/snippets/scala-mode/try --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/try +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/try @@ -5,6 +5,6 @@ try { $0 } catch { - case ${1:e}: ${2:Exception} => + case ${1:e}: ${2:Exception} => ${1:println(\"ERROR: \" + e) // TODO: handle exception}\n} } \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/try.catch-finally rename to elpa/yasnippet-0.9.1/snippets/scala-mode/try.catch-finally --- a/elpa/yasnippet-0.8.0/snippets/scala-mode/try.catch-finally +++ b/elpa/yasnippet-0.9.1/snippets/scala-mode/try.catch-finally @@ -5,7 +5,7 @@ try { $0 } catch { - case ${1:e}: ${2:Exception} => + case ${1:e}: ${2:Exception} => ${1:println(\"ERROR: \" + e) // TODO: handle exception}\n} } finally {
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/try.finally rename to elpa/yasnippet-0.9.1/snippets/scala-mode/try.finally
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tup.arrow rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tup.arrow
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/tup.paren rename to elpa/yasnippet-0.9.1/snippets/scala-mode/tup.paren
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/val rename to elpa/yasnippet-0.9.1/snippets/scala-mode/val
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/val.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/val.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/val.ret rename to elpa/yasnippet-0.9.1/snippets/scala-mode/val.ret
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/var rename to elpa/yasnippet-0.9.1/snippets/scala-mode/var
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/var.new rename to elpa/yasnippet-0.9.1/snippets/scala-mode/var.new
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/var.ret rename to elpa/yasnippet-0.9.1/snippets/scala-mode/var.ret
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/whi rename to elpa/yasnippet-0.9.1/snippets/scala-mode/whi
rename from elpa/yasnippet-0.8.0/snippets/scala-mode/with rename to elpa/yasnippet-0.9.1/snippets/scala-mode/with
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/snippet-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/snippet-mode/field rename to elpa/yasnippet-0.9.1/snippets/snippet-mode/field
rename from elpa/yasnippet-0.8.0/snippets/snippet-mode/mirror rename to elpa/yasnippet-0.9.1/snippets/snippet-mode/mirror
rename from elpa/yasnippet-0.8.0/snippets/snippet-mode/vars rename to elpa/yasnippet-0.9.1/snippets/snippet-mode/vars
copy from elpa/yasnippet-0.8.0/snippets/ruby-mode/.yas-parents copy to elpa/yasnippet-0.9.1/snippets/sql-mode/.yas-parents
rename from elpa/yasnippet-0.8.0/snippets/sql-mode/column rename to elpa/yasnippet-0.9.1/snippets/sql-mode/column
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/sql-mode/constraint @@ -0,0 +1,5 @@ +# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> +# name: CONSTRAINT [..] PRIMARY KEY ... +# key: constraint +# -- +CONSTRAINT [${1:PK_Name}] PRIMARY KEY ${2:CLUSTERED} ([${3:ColumnName}]) \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/sql-mode/constraint.1 @@ -0,0 +1,5 @@ +# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> +# name: CONSTRAINT [..] FOREIGN KEY ... +# key: constraint +# -- +CONSTRAINT [${1:FK_Name}] FOREIGN KEY ${2:CLUSTERED} ([${3:ColumnName}]) \ No newline at end of file
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/snippets/sql-mode/create @@ -0,0 +1,11 @@ +# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx> +# name: create table ... +# key: create +# -- +CREATE TABLE [${1:dbo}].[${2:TableName}] +( + ${3:Id} ${4:INT IDENTITY(1,1)} ${5:NOT NULL} +$0 + CONSTRAINT [${6:PK_}] PRIMARY KEY ${7:CLUSTERED} ([$3]) +) +GO \ No newline at end of file
rename from elpa/yasnippet-0.8.0/snippets/sql-mode/create.1 rename to elpa/yasnippet-0.9.1/snippets/sql-mode/create.1 --- a/elpa/yasnippet-0.8.0/snippets/sql-mode/create.1 +++ b/elpa/yasnippet-0.9.1/snippets/sql-mode/create.1 @@ -2,7 +2,7 @@ # name: create procedure ... # key: create # -- -CREATE PROCEDURE [${1:dbo}].[${2:Name}] +CREATE PROCEDURE [${1:dbo}].[${2:Name}] ( $3 $4 = ${5:NULL} ${6:OUTPUT} )
rename from elpa/yasnippet-0.8.0/snippets/sql-mode/references rename to elpa/yasnippet-0.9.1/snippets/sql-mode/references
rename from elpa/yasnippet-0.8.0/snippets/text-mode/email rename to elpa/yasnippet-0.9.1/snippets/text-mode/email
rename from elpa/yasnippet-0.8.0/snippets/text-mode/time rename to elpa/yasnippet-0.9.1/snippets/text-mode/time
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/yasnippet-autoloads.el @@ -0,0 +1,59 @@ +;;; yasnippet-autoloads.el --- automatically extracted autoloads +;; +;;; Code: +(add-to-list 'load-path (or (file-name-directory #$) (car load-path))) + +;;;### (autoloads nil "yasnippet" "yasnippet.el" (22294 19770 620363 +;;;;;; 497000)) +;;; Generated autoloads from yasnippet.el + +(autoload 'yas-minor-mode "yasnippet" "\ +Toggle YASnippet mode. + +When YASnippet mode is enabled, `yas-expand', normally bound to +the TAB key, expands snippets of code depending on the major +mode. + +With no argument, this command toggles the mode. +positive prefix argument turns on the mode. +Negative prefix argument turns off the mode. + +Key bindings: +\\{yas-minor-mode-map} + +\(fn &optional ARG)" t nil) + +(defvar yas-global-mode nil "\ +Non-nil if Yas-Global mode is enabled. +See the command `yas-global-mode' for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `yas-global-mode'.") + +(custom-autoload 'yas-global-mode "yasnippet" nil) + +(autoload 'yas-global-mode "yasnippet" "\ +Toggle Yas minor mode in all buffers. +With prefix ARG, enable Yas-Global mode if ARG is positive; +otherwise, disable it. If called from Lisp, enable the mode if +ARG is omitted or nil. + +Yas minor mode is enabled in all buffers where +`yas-minor-mode-on' would do it. +See `yas-minor-mode' for more information on Yas minor mode. + +\(fn &optional ARG)" t nil) + +;;;*** + +;;;### (autoloads nil nil ("yasnippet-debug.el" "yasnippet-pkg.el" +;;;;;; "yasnippet-tests.el") (22294 19775 412426 974000)) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; End: +;;; yasnippet-autoloads.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/yasnippet-debug.el @@ -0,0 +1,133 @@ +;;; yasnippet-debug.el --- debug functions for yasnippet + +;; Copyright (C) 2010, 2013, 2014 Free Software Foundation, Inc. + +;; Author: João Távora +;; Keywords: emulations, convenience + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Just some debug functions + +;;; Code: + +(require 'yasnippet) +(require 'cl) + +(defun yas-debug-snippet-vars () + "Debug snippets, fields, mirrors and the `buffer-undo-list'." + (interactive) + (with-output-to-temp-buffer "*YASnippet trace*" + (princ "Interesting YASnippet vars: \n\n") + + (princ (format "\nPost command hook: %s\n" post-command-hook)) + (princ (format "\nPre command hook: %s\n" pre-command-hook)) + + (princ (format "%s live snippets in total\n" (length (yas--snippets-at-point (quote all-snippets))))) + (princ (format "%s overlays in buffer:\n\n" (length (overlays-in (point-min) (point-max))))) + (princ (format "%s live snippets at point:\n\n" (length (yas--snippets-at-point)))) + + + (dolist (snippet (yas--snippets-at-point)) + (princ (format "\tsid: %d control overlay from %d to %d\n" + (yas--snippet-id snippet) + (overlay-start (yas--snippet-control-overlay snippet)) + (overlay-end (yas--snippet-control-overlay snippet)))) + (princ (format "\tactive field: %s from %s to %s covering \"%s\"\n" + (yas--field-number (yas--snippet-active-field snippet)) + (marker-position (yas--field-start (yas--snippet-active-field snippet))) + (marker-position (yas--field-end (yas--snippet-active-field snippet))) + (buffer-substring-no-properties (yas--field-start (yas--snippet-active-field snippet)) (yas--field-end (yas--snippet-active-field snippet))))) + (when (yas--snippet-exit snippet) + (princ (format "\tsnippet-exit: at %s next: %s\n" + (yas--exit-marker (yas--snippet-exit snippet)) + (yas--exit-next (yas--snippet-exit snippet))))) + (dolist (field (yas--snippet-fields snippet)) + (princ (format "\tfield: %s from %s to %s covering \"%s\" next: %s%s\n" + (yas--field-number field) + (marker-position (yas--field-start field)) + (marker-position (yas--field-end field)) + (buffer-substring-no-properties (yas--field-start field) (yas--field-end field)) + (yas--debug-format-fom-concise (yas--field-next field)) + (if (yas--field-parent-field field) "(has a parent)" ""))) + (dolist (mirror (yas--field-mirrors field)) + (princ (format "\t\tmirror: from %s to %s covering \"%s\" next: %s\n" + (marker-position (yas--mirror-start mirror)) + (marker-position (yas--mirror-end mirror)) + (buffer-substring-no-properties (yas--mirror-start mirror) (yas--mirror-end mirror)) + (yas--debug-format-fom-concise (yas--mirror-next mirror))))))) + + (princ (format "\nUndo is %s and point-max is %s.\n" + (if (eq buffer-undo-list t) + "DISABLED" + "ENABLED") + (point-max))) + (unless (eq buffer-undo-list t) + (princ (format "Undpolist has %s elements. First 10 elements follow:\n" (length buffer-undo-list))) + (let ((first-ten (subseq buffer-undo-list 0 (min 19 + (length buffer-undo-list))))) + (dolist (undo-elem first-ten) + (princ (format "%2s: %s\n" (position undo-elem first-ten) (truncate-string-to-width (format "%s" undo-elem) 70)))))))) + +(defun yas--debug-format-fom-concise (fom) + (when fom + (cond ((yas--field-p fom) + (format "field %s from %d to %d" + (yas--field-number fom) + (marker-position (yas--field-start fom)) + (marker-position (yas--field-end fom)))) + ((yas--mirror-p fom) + (format "mirror from %d to %d" + (marker-position (yas--mirror-start fom)) + (marker-position (yas--mirror-end fom)))) + (t + (format "snippet exit at %d" + (marker-position (yas--fom-start fom))))))) + + +(defun yas-exterminate-package () + (interactive) + (yas-global-mode -1) + (yas-minor-mode -1) + (mapatoms #'(lambda (atom) + (when (string-match "yas[-/]" (symbol-name atom)) + (unintern atom obarray))))) + +(defun yas-debug-test (&optional quiet) + (interactive "P") + (yas-load-directory (or (and (listp yas-snippet-dirs) + (first yas-snippet-dirs)) + yas-snippet-dirs + "~/Source/yasnippet/snippets/")) + (set-buffer (switch-to-buffer "*YAS TEST*")) + (mapc #'yas--commit-snippet (yas--snippets-at-point 'all-snippets)) + (erase-buffer) + (setq buffer-undo-list nil) + (setq undo-in-progress nil) + (snippet-mode) + (yas-minor-mode 1) + (let ((abbrev)) + (setq abbrev "$f") + (insert abbrev)) + (unless quiet + (add-hook 'post-command-hook 'yas-debug-snippet-vars 't 'local))) + +(provide 'yasnippet-debug) +;; Local Variables: +;; indent-tabs-mode: nil +;; byte-compile-warnings: (not cl-functions) +;; End: +;;; yasnippet-debug.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/yasnippet-pkg.el @@ -0,0 +1,2 @@ +;; Generated package description from yasnippet.el +(define-package "yasnippet" "0.9.1" "Yet another snippet extension for Emacs." 'nil :url "http://github.com/capitaomorte/yasnippet" :keywords '("convenience" "emulation"))
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/yasnippet-tests.el @@ -0,0 +1,949 @@ +;;; yasnippet-tests.el --- some yasnippet tests -*- lexical-binding: t -*- + +;; Copyright (C) 2012, 2013, 2014, 2015 Free Software Foundation, Inc. + +;; Author: João Távora <joaot@siscog.pt> +;; Keywords: emulations, convenience + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Test basic snippet mechanics and the loading system + +;;; Code: + +(require 'yasnippet) +(require 'ert) +(require 'ert-x) +(require 'cl) + + +;;; Snippet mechanics + +(defun yas--buffer-contents () + (buffer-substring-no-properties (point-min) (point-max))) + +(ert-deftest field-navigation () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${1:brother} from another ${2:mother}") + (should (string= (yas--buffer-contents) + "brother from another mother")) + + (should (looking-at "brother")) + (ert-simulate-command '(yas-next-field-or-maybe-expand)) + (should (looking-at "mother")) + (ert-simulate-command '(yas-prev-field)) + (should (looking-at "brother")))) + +(ert-deftest simple-mirror () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${1:brother} from another $1") + (should (string= (yas--buffer-contents) + "brother from another brother")) + (yas-mock-insert "bla") + (should (string= (yas--buffer-contents) + "bla from another bla")))) + +(ert-deftest mirror-with-transformation () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${1:brother} from another ${1:$(upcase yas-text)}") + (should (string= (yas--buffer-contents) + "brother from another BROTHER")) + (yas-mock-insert "bla") + (should (string= (yas--buffer-contents) + "bla from another BLA")))) + +(ert-deftest primary-field-transformation () + (with-temp-buffer + (yas-minor-mode 1) + (let ((snippet "${1:$$(upcase yas-text)}${1:$(concat \"bar\" yas-text)}")) + (yas-expand-snippet snippet) + (should (string= (yas--buffer-contents) "bar")) + (yas-mock-insert "foo") + (should (string= (yas--buffer-contents) "FOObarFOO"))))) + +(ert-deftest nested-placeholders-kill-superfield () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "brother from ${2:another ${3:mother}}!") + (should (string= (yas--buffer-contents) + "brother from another mother!")) + (yas-mock-insert "bla") + (should (string= (yas--buffer-contents) + "brother from bla!")))) + +(ert-deftest nested-placeholders-use-subfield () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "brother from ${2:another ${3:mother}}!") + (ert-simulate-command '(yas-next-field-or-maybe-expand)) + (yas-mock-insert "bla") + (should (string= (yas--buffer-contents) + "brother from another bla!")))) + +(ert-deftest mirrors-adjacent-to-fields-with-nested-mirrors () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "<%= f.submit \"${1:Submit}\"${2:$(and (yas-text) \", :disable_with => '\")}${2:$1ing...}${2:$(and (yas-text) \"'\")} %>") + (should (string= (yas--buffer-contents) + "<%= f.submit \"Submit\", :disable_with => 'Submiting...' %>")) + (yas-mock-insert "Send") + (should (string= (yas--buffer-contents) + "<%= f.submit \"Send\", :disable_with => 'Sending...' %>")))) + +(ert-deftest deep-nested-mirroring-issue-351 () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${1:FOOOOOOO}${2:$1}${3:$2}${4:$3}") + (yas-mock-insert "abc") + (should (string= (yas--buffer-contents) "abcabcabcabc")))) + +(ert-deftest delete-numberless-inner-snippet-issue-562 () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${3:${test}bla}$0${2:ble}") + (ert-simulate-command '(yas-next-field-or-maybe-expand)) + (should (looking-at "testblable")) + (ert-simulate-command '(yas-next-field-or-maybe-expand)) + (ert-simulate-command '(yas-skip-and-clear-or-delete-char)) + (should (looking-at "ble")) + (should (null (yas--snippets-at-point))))) + +(ert-deftest ignore-trailing-whitespace () + (should (equal + (with-temp-buffer + (insert "# key: foo\n# --\nfoo") + (yas--parse-template)) + (with-temp-buffer + (insert "# key: foo \n# --\nfoo") + (yas--parse-template))))) + +;; (ert-deftest in-snippet-undo () +;; (with-temp-buffer +;; (yas-minor-mode 1) +;; (yas-expand-snippet "brother from ${2:another ${3:mother}}!") +;; (ert-simulate-command '(yas-next-field-or-maybe-expand)) +;; (yas-mock-insert "bla") +;; (ert-simulate-command '(undo)) +;; (should (string= (yas--buffer-contents) +;; "brother from another mother!")))) + +(ert-deftest dont-clear-on-partial-deletion-issue-515 () + "Ensure fields are not cleared when user doesn't really mean to." + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "my ${1:kid brother} from another ${2:mother}") + + (ert-simulate-command '(kill-word 1)) + (ert-simulate-command '(delete-char 1)) + + (should (string= (yas--buffer-contents) + "my brother from another mother")) + (should (looking-at "brother")) + + (ert-simulate-command '(yas-next-field)) + (should (looking-at "mother")) + (ert-simulate-command '(yas-prev-field)) + (should (looking-at "brother")))) + +(ert-deftest do-clear-on-yank-issue-515 () + "A yank should clear an unmodified field." + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "my ${1:kid brother} from another ${2:mother}") + (yas-mock-yank "little sibling") + (should (string= (yas--buffer-contents) + "my little sibling from another mother")) + (ert-simulate-command '(yas-next-field)) + (ert-simulate-command '(yas-prev-field)) + (should (looking-at "little sibling")))) + + +;;; Snippet expansion and character escaping +;;; Thanks to @zw963 (Billy) for the testing +;;; +(ert-deftest escape-dollar () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "bla\\${1:bla}ble") + (should (string= (yas--buffer-contents) "bla${1:bla}ble")))) + +(ert-deftest escape-closing-brace () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "bla${1:bla\\}}ble") + (should (string= (yas--buffer-contents) "blabla}ble")) + (should (string= (yas-field-value 1) "bla}")))) + +(ert-deftest escape-backslashes () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "bla\\ble") + (should (string= (yas--buffer-contents) "bla\\ble")))) + +(ert-deftest escape-backquotes () + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "bla`(upcase \"foo\\`bar\")`ble") + (should (string= (yas--buffer-contents) "blaFOO`BARble")))) + +(ert-deftest escape-some-elisp-with-strings () + "elisp with strings and unbalance parens inside it" + (with-temp-buffer + (yas-minor-mode 1) + ;; The rules here is: to output a literal `"' you need to escape + ;; it with one backslash. You don't need to escape them in + ;; embedded elisp. + (yas-expand-snippet "soon \\\"`(concat (upcase \"(my arms\")\"\\\" were all around her\")`") + (should (string= (yas--buffer-contents) "soon \"(MY ARMS\" were all around her")))) + +(ert-deftest escape-some-elisp-with-backslashes () + (with-temp-buffer + (yas-minor-mode 1) + ;; And the rule here is: to output a literal `\' inside a string + ;; inside embedded elisp you need a total of six `\' + (yas-expand-snippet "bla`(upcase \"hey\\\\\\yo\")`ble") + (should (string= (yas--buffer-contents) "blaHEY\\YOble")))) + +(ert-deftest be-careful-when-escaping-in-yas-selected-text () + (with-temp-buffer + (yas-minor-mode 1) + (let ((yas-selected-text "He\\\\o world!")) + (yas-expand-snippet "Look ma! `(yas-selected-text)`") + (should (string= (yas--buffer-contents) "Look ma! He\\\\o world!"))) + (yas-exit-all-snippets) + (erase-buffer) + (let ((yas-selected-text "He\"o world!")) + (yas-expand-snippet "Look ma! `(yas-selected-text)`") + (should (string= (yas--buffer-contents) "Look ma! He\"o world!"))) + (yas-exit-all-snippets) + (erase-buffer) + (let ((yas-selected-text "He\"\)\\o world!")) + (yas-expand-snippet "Look ma! `(yas-selected-text)`") + (should (string= (yas--buffer-contents) "Look ma! He\"\)\\o world!"))) + (yas-exit-all-snippets) + (erase-buffer))) + +(ert-deftest be-careful-when-escaping-in-yas-selected-text-2 () + (with-temp-buffer + (yas-minor-mode 1) + (let ((yas-selected-text "He)}o world!")) + (yas-expand-snippet "Look ma! ${1:`(yas-selected-text)`} OK?") + (should (string= (yas--buffer-contents) "Look ma! He)}o world! OK?"))))) + +(ert-deftest example-for-issue-271 () + (with-temp-buffer + (yas-minor-mode 1) + (let ((yas-selected-text "aaa") + (snippet "if ${1:condition}\n`yas-selected-text`\nelse\n$3\nend")) + (yas-expand-snippet snippet) + (yas-next-field) + (yas-mock-insert "bbb") + (should (string= (yas--buffer-contents) "if condition\naaa\nelse\nbbb\nend"))))) + +(defmacro yas--with-font-locked-temp-buffer (&rest body) + "Like `with-temp-buffer', but ensure `font-lock-mode'." + (declare (indent 0) (debug t)) + (let ((temp-buffer (make-symbol "temp-buffer"))) + ;; NOTE: buffer name must not start with a space, otherwise + ;; `font-lock-mode' doesn't turn on. + `(let ((,temp-buffer (generate-new-buffer "*yas-temp*"))) + (with-current-buffer ,temp-buffer + ;; pretend we're interactive so `font-lock-mode' turns on + (let ((noninteractive nil) + ;; turn on font locking after major mode change + (change-major-mode-after-body-hook #'font-lock-mode)) + (unwind-protect + (progn (require 'font-lock) + ;; turn on font locking before major mode change + (font-lock-mode +1) + ,@body) + (and (buffer-name ,temp-buffer) + (kill-buffer ,temp-buffer)))))))) + +(defmacro yas-saving-variables (&rest body) + `(yas-call-with-saving-variables #'(lambda () ,@body))) + +(defmacro yas-with-snippet-dirs (dirs &rest body) + (declare (indent defun)) + `(yas-call-with-snippet-dirs ,dirs + #'(lambda () + ,@body))) + +(ert-deftest example-for-issue-474 () + (yas--with-font-locked-temp-buffer + (c-mode) + (yas-minor-mode 1) + (insert "#include <foo>\n") + (let ((yas-good-grace nil)) (yas-expand-snippet "`\"TODO: \"`")) + (should (string= (yas--buffer-contents) "#include <foo>\nTODO: ")))) + +(ert-deftest example-for-issue-404 () + (yas--with-font-locked-temp-buffer + (c++-mode) + (yas-minor-mode 1) + (insert "#include <foo>\n") + (let ((yas-good-grace nil)) (yas-expand-snippet "main")) + (should (string= (yas--buffer-contents) "#include <foo>\nmain")))) + +(ert-deftest example-for-issue-404-c-mode () + (yas--with-font-locked-temp-buffer + (c-mode) + (yas-minor-mode 1) + (insert "#include <foo>\n") + (let ((yas-good-grace nil)) (yas-expand-snippet "main")) + (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")) + (yas-expand-snippet "-middle-") + (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. + ;; + :expected-result (if noninteractive + :failed + :passed) + (with-temp-buffer + (yas-minor-mode 1) + (let ((snippet "\\${${1:1}:`yas-selected-text`}")) + (insert "aaabbbccc") + (set-mark 4) + (goto-char 7) + (yas-expand-snippet snippet) + (should (string= (yas--buffer-contents) "aaa${1:bbb}ccc"))))) + +(ert-deftest string-match-with-subregexp-in-embedded-elisp () + (with-temp-buffer + (yas-minor-mode 1) + ;; the rule here is: To use regexps in embedded `(elisp)` expressions, write + ;; it like you would normal elisp, i.e. no need to escape the backslashes. + (let ((snippet "`(if (string-match \"foo\\\\(ba+r\\\\)foo\" \"foobaaaaaaaaaarfoo\") + \"ok\" + \"fail\")`")) + (yas-expand-snippet snippet)) + (should (string= (yas--buffer-contents) "ok")))) + +(ert-deftest string-match-with-subregexp-in-mirror-transformations () + (with-temp-buffer + (yas-minor-mode 1) + ;; the rule here is: To use regexps in embedded `(elisp)` expressions, + ;; escape backslashes once, i.e. to use \\( \\) constructs, write \\\\( \\\\). + (let ((snippet "$1${1:$(if (string-match \"foo\\\\\\\\(ba+r\\\\\\\\)baz\" yas-text) + \"ok\" + \"fail\")}")) + (yas-expand-snippet snippet) + (should (string= (yas--buffer-contents) "fail")) + (yas-mock-insert "foobaaar") + (should (string= (yas--buffer-contents) "foobaaarfail")) + (yas-mock-insert "baz") + (should (string= (yas--buffer-contents) "foobaaarbazok"))))) + + +;;; Misc tests +;;; +(ert-deftest protection-overlay-no-cheating () + "Protection overlays at the very end of the buffer are dealt + with by cheatingly inserting a newline! + +TODO: correct this bug!" + :expected-result :failed + (with-temp-buffer + (yas-minor-mode 1) + (yas-expand-snippet "${2:brother} from another ${1:mother}") + (should (string= (yas--buffer-contents) + "brother from another mother") ;; no newline should be here! + ))) + +(defvar yas--barbaz) +(defvar yas--foobarbaz) + +;; See issue #497. To understand this test, follow the example of the +;; `yas-key-syntaxes' docstring. +;; +(ert-deftest complicated-yas-key-syntaxes () + (with-temp-buffer + (yas-saving-variables + (yas-with-snippet-dirs + '((".emacs.d/snippets" + ("emacs-lisp-mode" + ("foo-barbaz" . "# condition: yas--foobarbaz\n# --\nOKfoo-barbazOK") + ("barbaz" . "# condition: yas--barbaz\n# --\nOKbarbazOK") + ("baz" . "OKbazOK") + ("'quote" . "OKquoteOK")))) + (yas-reload-all) + (emacs-lisp-mode) + (yas-minor-mode-on) + (let ((yas-key-syntaxes '("w" "w_"))) + (let ((yas--barbaz t)) + (yas-should-expand '(("foo-barbaz" . "foo-OKbarbazOK") + ("barbaz" . "OKbarbazOK")))) + (let ((yas--foobarbaz t)) + (yas-should-expand '(("foo-barbaz" . "OKfoo-barbazOK")))) + (let ((yas-key-syntaxes + (cons #'(lambda (_start-point) + (unless (looking-back "-") + (backward-char) + 'again)) + yas-key-syntaxes)) + (yas--foobarbaz t)) + (yas-should-expand '(("foo-barbaz" . "foo-barOKbazOK"))))) + (let ((yas-key-syntaxes '(yas-try-key-from-whitespace))) + (yas-should-expand '(("xxx\n'quote" . "xxx\nOKquoteOK") + ("xxx 'quote" . "xxx OKquoteOK")))) + (let ((yas-key-syntaxes '(yas-shortest-key-until-whitespace)) + (yas--foobarbaz t) (yas--barbaz t)) + (yas-should-expand '(("foo-barbaz" . "foo-barOKbazOK"))) + (setq yas-key-syntaxes '(yas-longest-key-from-whitespace)) + (yas-should-expand '(("foo-barbaz" . "OKfoo-barbazOK") + ("foo " . "foo ")))))))) + + +;;; Loading +;;; +(defun yas--call-with-temporary-redefinitions (function + &rest function-names-and-overriding-functions) + (let* ((overrides (remove-if-not #'(lambda (fdef) + (fboundp (first fdef))) + function-names-and-overriding-functions)) + (definition-names (mapcar #'first overrides)) + (overriding-functions (mapcar #'second overrides)) + (saved-functions (mapcar #'symbol-function definition-names))) + ;; saving all definitions before overriding anything ensures FDEFINITION + ;; errors don't cause accidental permanent redefinitions. + ;; + (cl-labels ((set-fdefinitions (names functions) + (loop for name in names + for fn in functions + do (fset name fn)))) + (set-fdefinitions definition-names overriding-functions) + (unwind-protect (funcall function) + (set-fdefinitions definition-names saved-functions))))) + +(defmacro yas--with-temporary-redefinitions (fdefinitions &rest body) + ;; "Temporarily (but globally) redefine each function in FDEFINITIONS. + ;; E.g.: (yas--with-temporary-redefinitions ((foo (x) ...) + ;; (bar (x) ...)) + ;; ;; code that eventually calls foo, bar of (setf foo) + ;; ...)" + ;; FIXME: This is hideous! Better use defadvice (or at least letf). + `(yas--call-with-temporary-redefinitions + (lambda () ,@body) + ,@(mapcar #'(lambda (thingy) + `(list ',(first thingy) + (lambda ,@(rest thingy)))) + fdefinitions))) + +(defmacro yas-with-overriden-buffer-list (&rest body) + (let ((saved-sym (make-symbol "yas--buffer-list"))) + `(let ((,saved-sym (symbol-function 'buffer-list))) + (yas--with-temporary-redefinitions + ((buffer-list () + (remove-if #'(lambda (buf) + (with-current-buffer buf + (eq major-mode 'lisp-interaction-mode))) + (funcall ,saved-sym)))) + ,@body)))) + + +(defmacro yas-with-some-interesting-snippet-dirs (&rest body) + `(yas-saving-variables + (yas-with-overriden-buffer-list + (yas-with-snippet-dirs + '((".emacs.d/snippets" + ("c-mode" + (".yas-parents" . "cc-mode") + ("printf" . "printf($1);")) ;; notice the overriding for issue #281 + ("emacs-lisp-mode" ("ert-deftest" . "(ert-deftest ${1:name} () $0)")) + ("lisp-interaction-mode" (".yas-parents" . "emacs-lisp-mode"))) + ("library/snippets" + ("c-mode" + (".yas-parents" . "c++-mode") + ("printf" . "printf")) + ("cc-mode" ("def" . "# define")) + ("emacs-lisp-mode" ("dolist" . "(dolist)")) + ("lisp-interaction-mode" ("sc" . "brother from another mother")))) + ,@body)))) + +(ert-deftest snippet-lookup () + "Test `yas-lookup-snippet'." + (yas-with-some-interesting-snippet-dirs + (yas-reload-all 'no-jit) + (should (equal (yas-lookup-snippet "printf" 'c-mode) "printf($1);")) + (should (equal (yas-lookup-snippet "def" 'c-mode) "# define")) + (should-not (yas-lookup-snippet "no such snippet" nil 'noerror)) + (should-not (yas-lookup-snippet "printf" 'emacs-lisp-mode 'noerror)))) + +(ert-deftest basic-jit-loading () + "Test basic loading and expansion of snippets" + (yas-with-some-interesting-snippet-dirs + (yas-reload-all) + (yas--basic-jit-loading-1))) + +(ert-deftest basic-jit-loading-with-compiled-snippets () + "Test basic loading and expansion of compiled snippets" + (yas-with-some-interesting-snippet-dirs + (yas-reload-all) + (yas-recompile-all) + (yas--with-temporary-redefinitions ((yas--load-directory-2 + (&rest _dummies) + (ert-fail "yas--load-directory-2 shouldn't be called when snippets have been compiled"))) + (yas-reload-all) + (yas--basic-jit-loading-1)))) + +(ert-deftest visiting-compiled-snippets () + "Test snippet visiting for compiled snippets." + (yas-with-some-interesting-snippet-dirs + (yas-recompile-all) + (yas-reload-all 'no-jit) ; must be loaded for `yas-lookup-snippet' to work. + (yas--with-temporary-redefinitions ((find-file-noselect + (filename &rest _) + (throw 'yas-snippet-file filename))) + (should (string-suffix-p + "cc-mode/def" + (catch 'yas-snippet-file + (yas--visit-snippet-file-1 + (yas--lookup-snippet-1 "def" 'cc-mode)))))))) + +(ert-deftest loading-with-cyclic-parenthood () + "Test loading when cyclic parenthood is setup." + (yas-saving-variables + (yas-with-snippet-dirs '((".emacs.d/snippets" + ("c-mode" + (".yas-parents" . "cc-mode")) + ("cc-mode" + (".yas-parents" . "yet-another-c-mode and-that-one")) + ("yet-another-c-mode" + (".yas-parents" . "c-mode and-also-this-one lisp-interaction-mode")))) + (yas-reload-all) + (with-temp-buffer + (let* ((major-mode 'c-mode) + (expected `(c-mode + cc-mode + yet-another-c-mode + and-also-this-one + and-that-one + ;; prog-mode doesn't exist in emacs 24.3 + ,@(if (fboundp 'prog-mode) + '(prog-mode)) + emacs-lisp-mode + lisp-interaction-mode)) + (observed (yas--modes-to-activate))) + (should (equal major-mode (car observed))) + (should (equal (sort expected #'string<) (sort observed #'string<)))))))) + +(ert-deftest extra-modes-parenthood () + "Test activation of parents of `yas--extra-modes'." + (yas-saving-variables + (yas-with-snippet-dirs '((".emacs.d/snippets" + ("c-mode" + (".yas-parents" . "cc-mode")) + ("yet-another-c-mode" + (".yas-parents" . "c-mode and-also-this-one lisp-interaction-mode")))) + (yas-reload-all) + (with-temp-buffer + (yas-activate-extra-mode 'c-mode) + (yas-activate-extra-mode 'yet-another-c-mode) + (yas-activate-extra-mode 'and-that-one) + (let* ((expected-first `(and-that-one + yet-another-c-mode + c-mode + ,major-mode)) + (expected-rest `(cc-mode + ;; prog-mode doesn't exist in emacs 24.3 + ,@(if (fboundp 'prog-mode) + '(prog-mode)) + emacs-lisp-mode + and-also-this-one + lisp-interaction-mode)) + (observed (yas--modes-to-activate))) + (should (equal expected-first + (cl-subseq observed 0 (length expected-first)))) + (should (equal (sort expected-rest #'string<) + (sort (cl-subseq observed (length expected-first)) #'string<)))))))) + +(defalias 'yas--phony-c-mode 'c-mode) + +(ert-deftest issue-492-and-494 () + (define-derived-mode yas--test-mode yas--phony-c-mode "Just a test mode") + (yas-with-snippet-dirs '((".emacs.d/snippets" + ("yas--test-mode"))) + (yas-reload-all) + (with-temp-buffer + (let* ((major-mode 'yas--test-mode) + (expected `(c-mode + ,@(if (fboundp 'prog-mode) + '(prog-mode)) + yas--phony-c-mode + yas--test-mode)) + (observed (yas--modes-to-activate))) + (should (null (cl-set-exclusive-or expected observed))) + (should (= (length expected) + (length observed))))))) + +(define-derived-mode yas--test-mode c-mode "Just a test mode") +(define-derived-mode yas--another-test-mode c-mode "Another test mode") + +(ert-deftest issue-504-tricky-jit () + (yas-with-snippet-dirs + '((".emacs.d/snippets" + ("yas--another-test-mode" + (".yas-parents" . "yas--test-mode")) + ("yas--test-mode"))) + (let ((b (with-current-buffer (generate-new-buffer "*yas-test*") + (yas--another-test-mode) + (current-buffer)))) + (unwind-protect + (progn + (yas-reload-all) + (should (= 0 (hash-table-count yas--scheduled-jit-loads)))) + (kill-buffer b))))) + +(defun yas--basic-jit-loading-1 () + (with-temp-buffer + (should (= 4 (hash-table-count yas--scheduled-jit-loads))) + (should (= 0 (hash-table-count yas--tables))) + (lisp-interaction-mode) + (yas-minor-mode 1) + (should (= 2 (hash-table-count yas--scheduled-jit-loads))) + (should (= 2 (hash-table-count yas--tables))) + (should (= 1 (hash-table-count (yas--table-uuidhash (gethash 'lisp-interaction-mode yas--tables))))) + (should (= 2 (hash-table-count (yas--table-uuidhash (gethash 'emacs-lisp-mode yas--tables))))) + (yas-should-expand '(("sc" . "brother from another mother") + ("dolist" . "(dolist)") + ("ert-deftest" . "(ert-deftest name () )"))) + (c-mode) + (yas-minor-mode 1) + (should (= 0 (hash-table-count yas--scheduled-jit-loads))) + (should (= 4 (hash-table-count yas--tables))) + (should (= 1 (hash-table-count (yas--table-uuidhash (gethash 'c-mode yas--tables))))) + (should (= 1 (hash-table-count (yas--table-uuidhash (gethash 'cc-mode yas--tables))))) + (yas-should-expand '(("printf" . "printf();") + ("def" . "# define"))) + (yas-should-not-expand '("sc" "dolist" "ert-deftest")))) + + +;;; Menu +;;; +(defmacro yas-with-even-more-interesting-snippet-dirs (&rest body) + `(yas-saving-variables + (yas-with-snippet-dirs + `((".emacs.d/snippets" + ("c-mode" + (".yas-make-groups" . "") + ("printf" . "printf($1);") + ("foo-group-a" + ("fnprintf" . "fprintf($1);") + ("snprintf" . "snprintf($1);")) + ("foo-group-b" + ("strcmp" . "strecmp($1);") + ("strcasecmp" . "strcasecmp($1);"))) + ("lisp-interaction-mode" + ("ert-deftest" . "# group: barbar\n# --\n(ert-deftest ${1:name} () $0)")) + ("fancy-mode" + ("a-guy" . "# uuid: 999\n# --\nyo!") + ("a-sir" . "# uuid: 12345\n# --\nindeed!") + ("a-lady" . "# uuid: 54321\n# --\noh-la-la!") + ("a-beggar" . "# uuid: 0101\n# --\narrrgh!") + ("an-outcast" . "# uuid: 666\n# --\narrrgh!") + (".yas-setup.el" . , (pp-to-string + '(yas-define-menu 'fancy-mode + '((yas-ignore-item "0101") + (yas-item "999") + (yas-submenu "sirs" + ((yas-item "12345"))) + (yas-submenu "ladies" + ((yas-item "54321")))) + '("666"))))))) + ,@body))) + +(ert-deftest test-yas-define-menu () + (let ((yas-use-menu t)) + (yas-with-even-more-interesting-snippet-dirs + (yas-reload-all 'no-jit) + (let ((menu (cdr (gethash 'fancy-mode yas--menu-table)))) + (should (eql 4 (length menu))) + (dolist (item '("a-guy" "a-beggar")) + (should (find item menu :key #'third :test #'string=))) + (should-not (find "an-outcast" menu :key #'third :test #'string=)) + (dolist (submenu '("sirs" "ladies")) + (should (keymapp + (fourth + (find submenu menu :key #'third :test #'string=))))) + )))) + +(ert-deftest test-group-menus () + "Test group-based menus using .yas-make-groups and the group directive" + (let ((yas-use-menu t)) + (yas-with-even-more-interesting-snippet-dirs + (yas-reload-all 'no-jit) + ;; first the subdir-based groups + ;; + (let ((menu (cdr (gethash 'c-mode yas--menu-table)))) + (should (eql 3 (length menu))) + (dolist (item '("printf" "foo-group-a" "foo-group-b")) + (should (find item menu :key #'third :test #'string=))) + (dolist (submenu '("foo-group-a" "foo-group-b")) + (should (keymapp + (fourth + (find submenu menu :key #'third :test #'string=)))))) + ;; now group directives + ;; + (let ((menu (cdr (gethash 'lisp-interaction-mode yas--menu-table)))) + (should (eql 1 (length menu))) + (should (find "barbar" menu :key #'third :test #'string=)) + (should (keymapp + (fourth + (find "barbar" menu :key #'third :test #'string=)))))))) + +(ert-deftest test-group-menus-twisted () + "Same as similarly named test, but be mean. + +TODO: be meaner" + (let ((yas-use-menu t)) + (yas-with-even-more-interesting-snippet-dirs + ;; add a group directive conflicting with the subdir and watch + ;; behaviour + (with-temp-buffer + (insert "# group: foo-group-c\n# --\nstrecmp($1)") + (write-region nil nil (concat (first (yas-snippet-dirs)) + "/c-mode/foo-group-b/strcmp"))) + (yas-reload-all 'no-jit) + (let ((menu (cdr (gethash 'c-mode yas--menu-table)))) + (should (eql 4 (length menu))) + (dolist (item '("printf" "foo-group-a" "foo-group-b" "foo-group-c")) + (should (find item menu :key #'third :test #'string=))) + (dolist (submenu '("foo-group-a" "foo-group-b" "foo-group-c")) + (should (keymapp + (fourth + (find submenu menu :key #'third :test #'string=)))))) + ;; delete the .yas-make-groups file and watch behaviour + ;; + (delete-file (concat (first (yas-snippet-dirs)) + "/c-mode/.yas-make-groups")) + (yas-reload-all 'no-jit) + (let ((menu (cdr (gethash 'c-mode yas--menu-table)))) + (should (eql 5 (length menu)))) + ;; Change a group directive and reload + ;; + (let ((menu (cdr (gethash 'lisp-interaction-mode yas--menu-table)))) + (should (find "barbar" menu :key #'third :test #'string=))) + + (with-temp-buffer + (insert "# group: foofoo\n# --\n(ert-deftest ${1:name} () $0)") + (write-region nil nil (concat (first (yas-snippet-dirs)) + "/lisp-interaction-mode/ert-deftest"))) + (yas-reload-all 'no-jit) + (let ((menu (cdr (gethash 'lisp-interaction-mode yas--menu-table)))) + (should (eql 1 (length menu))) + (should (find "foofoo" menu :key #'third :test #'string=)) + (should (keymapp + (fourth + (find "foofoo" menu :key #'third :test #'string=)))))))) + + +;;; The infamous and problematic tab keybinding +;;; +(ert-deftest test-yas-tab-binding () + (with-temp-buffer + (yas-minor-mode -1) + (should (not (eq (key-binding (yas--read-keybinding "<tab>")) 'yas-expand))) + (yas-minor-mode 1) + (should (eq (key-binding (yas--read-keybinding "<tab>")) 'yas-expand)) + (yas-expand-snippet "$1 $2 $3") + (should (eq (key-binding [(tab)]) 'yas-next-field-or-maybe-expand)) + (should (eq (key-binding (kbd "TAB")) 'yas-next-field-or-maybe-expand)) + (should (eq (key-binding [(shift tab)]) 'yas-prev-field)) + (should (eq (key-binding [backtab]) 'yas-prev-field)))) + +(ert-deftest test-rebindings () + (unwind-protect + (progn + (define-key yas-minor-mode-map [tab] nil) + (define-key yas-minor-mode-map (kbd "TAB") nil) + (define-key yas-minor-mode-map (kbd "SPC") 'yas-expand) + (with-temp-buffer + (yas-minor-mode 1) + (should (not (eq (key-binding (yas--read-keybinding "TAB")) 'yas-expand))) + (should (eq (key-binding (yas--read-keybinding "SPC")) 'yas-expand)) + (yas-reload-all) + (should (not (eq (key-binding (yas--read-keybinding "TAB")) 'yas-expand))) + (should (eq (key-binding (yas--read-keybinding "SPC")) 'yas-expand)))) + ;; FIXME: actually should restore to whatever saved values where there. + ;; + (define-key yas-minor-mode-map [tab] 'yas-expand) + (define-key yas-minor-mode-map (kbd "TAB") 'yas-expand) + (define-key yas-minor-mode-map (kbd "SPC") nil))) + +(ert-deftest test-yas-in-org () + (with-temp-buffer + (org-mode) + (yas-minor-mode 1) + (should (eq (key-binding [(tab)]) 'yas-expand)) + (should (eq (key-binding (kbd "TAB")) 'yas-expand)))) + +(ert-deftest test-yas-activate-extra-modes () + "Given a symbol, `yas-activate-extra-mode' should be able to +add the snippets associated with the given mode." + (with-temp-buffer + (yas-saving-variables + (yas-with-snippet-dirs + '((".emacs.d/snippets" + ("markdown-mode" + ("_" . "_Text_ ")) + ("emacs-lisp-mode" + ("car" . "(car )")))) + (yas-reload-all) + (emacs-lisp-mode) + (yas-minor-mode-on) + (yas-activate-extra-mode 'markdown-mode) + (should (eq 'markdown-mode (car yas--extra-modes))) + (yas-should-expand '(("_" . "_Text_ "))) + (yas-should-expand '(("car" . "(car )"))) + (yas-deactivate-extra-mode 'markdown-mode) + (should-not (eq 'markdown-mode (car yas--extra-modes))) + (yas-should-not-expand '("_")) + (yas-should-expand '(("car" . "(car )"))))))) + + +;;; Helpers +;;; +(defun yas-should-expand (keys-and-expansions) + (dolist (key-and-expansion keys-and-expansions) + (yas-exit-all-snippets) + (narrow-to-region (point) (point)) + (insert (car key-and-expansion)) + (let ((yas-fallback-behavior nil)) + (ert-simulate-command '(yas-expand))) + (unless (string= (yas--buffer-contents) (cdr key-and-expansion)) + (ert-fail (format "\"%s\" should have expanded to \"%s\" but got \"%s\"" + (car key-and-expansion) + (cdr key-and-expansion) + (yas--buffer-contents))))) + (yas-exit-all-snippets)) + +(defun yas-should-not-expand (keys) + (dolist (key keys) + (yas-exit-all-snippets) + (narrow-to-region (point) (point)) + (insert key) + (let ((yas-fallback-behavior nil)) + (ert-simulate-command '(yas-expand))) + (unless (string= (yas--buffer-contents) key) + (ert-fail (format "\"%s\" should have stayed put, but instead expanded to \"%s\"" + key + (yas--buffer-contents)))))) + +(defun yas-mock-insert (string) + (dotimes (i (length string)) + (let ((last-command-event (aref string i))) + (ert-simulate-command '(self-insert-command 1))))) + +(defun yas-mock-yank (string) + (let ((interprogram-paste-function (lambda () string))) + (ert-simulate-command '(yank nil)))) + +(defun yas-make-file-or-dirs (ass) + (let ((file-or-dir-name (car ass)) + (content (cdr ass))) + (cond ((listp content) + (make-directory file-or-dir-name 'parents) + (let ((default-directory (concat default-directory "/" file-or-dir-name))) + (mapc #'yas-make-file-or-dirs content))) + ((stringp content) + (with-temp-buffer + (insert content) + (write-region nil nil file-or-dir-name nil 'nomessage))) + (t + (message "[yas] oops don't know this content"))))) + + +(defun yas-variables () + (let ((syms)) + (mapatoms #'(lambda (sym) + (if (and (string-match "^yas-[^/]" (symbol-name sym)) + (boundp sym)) + (push sym syms)))) + syms)) + +(defun yas-call-with-saving-variables (fn) + (let* ((vars (yas-variables)) + (saved-values (mapcar #'symbol-value vars))) + (unwind-protect + (funcall fn) + (loop for var in vars + for saved in saved-values + do (set var saved))))) + +(defun yas-call-with-snippet-dirs (dirs fn) + (let* ((default-directory (make-temp-file "yasnippet-fixture" t)) + (yas-snippet-dirs (mapcar #'car dirs))) + (with-temp-message "" + (unwind-protect + (progn + (mapc #'yas-make-file-or-dirs dirs) + (funcall fn)) + (when (>= emacs-major-version 24) + (delete-directory default-directory 'recursive)))))) + +;;; Older emacsen +;;; +(unless (fboundp 'special-mode) + ;; FIXME: Why provide this default definition here?!? + (defalias 'special-mode 'fundamental)) + +(unless (fboundp 'string-suffix-p) + ;; introduced in Emacs 24.4 + (defun string-suffix-p (suffix string &optional ignore-case) + "Return non-nil if SUFFIX is a suffix of STRING. +If IGNORE-CASE is non-nil, the comparison is done without paying +attention to case differences." + (let ((start-pos (- (length string) (length suffix)))) + (and (>= start-pos 0) + (eq t (compare-strings suffix nil nil + string start-pos nil ignore-case)))))) + +;;; btw to test this in emacs22 mac osx: +;;; curl -L -O https://github.com/mirrors/emacs/raw/master/lisp/emacs-lisp/ert.el +;;; curl -L -O https://github.com/mirrors/emacs/raw/master/lisp/emacs-lisp/ert-x.el +;;; /usr/bin/emacs -nw -Q -L . -l yasnippet-tests.el --batch -e ert + + +(put 'yas-saving-variables 'edebug-form-spec t) +(put 'yas-with-snippet-dirs 'edebug-form-spec t) +(put 'yas-with-overriden-buffer-list 'edebug-form-spec t) +(put 'yas-with-some-interesting-snippet-dirs 'edebug-form-spec t) + + +(put 'yas--with-temporary-redefinitions 'lisp-indent-function 1) +(put 'yas--with-temporary-redefinitions 'edebug-form-spec '((&rest (defun*)) cl-declarations body)) + + + + +(provide 'yasnippet-tests) +;; Local Variables: +;; indent-tabs-mode: nil +;; byte-compile-warnings: (not cl-functions) +;; End: +;;; yasnippet-tests.el ends here
new file mode 100644 --- /dev/null +++ b/elpa/yasnippet-0.9.1/yasnippet.el @@ -0,0 +1,4596 @@ +;;; yasnippet.el --- Yet another snippet extension for Emacs. + +;; Copyright (C) 2008-2013, 2015 Free Software Foundation, Inc. +;; Authors: pluskid <pluskid@gmail.com>, João Távora <joaotavora@gmail.com>, Noam Postavsky <npostavs@gmail.com> +;; Maintainer: Noam Postavsky <npostavs@gmail.com> +;; Version: 0.9.1 +;; X-URL: http://github.com/capitaomorte/yasnippet +;; Keywords: convenience, emulation +;; URL: http://github.com/capitaomorte/yasnippet +;; EmacsWiki: YaSnippetMode + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Basic steps to setup: +;; +;; (add-to-list 'load-path +;; "~/path-to-yasnippet") +;; (require 'yasnippet) +;; (yas-global-mode 1) +;; +;; +;; Interesting variables are: +;; +;; `yas-snippet-dirs' +;; +;; The directory where user-created snippets are to be +;; stored. Can also be a list of directories. In that case, +;; when used for bulk (re)loading of snippets (at startup or +;; via `yas-reload-all'), directories appearing earlier in +;; the list override other dir's snippets. Also, the first +;; directory is taken as the default for storing the user's +;; new snippets. +;; +;; The deprecated `yas/root-directory' aliases this variable +;; for backward-compatibility. +;; +;; +;; Major commands are: +;; +;; M-x yas-expand +;; +;; Try to expand snippets before point. In `yas-minor-mode', +;; this is normally bound to TAB, but you can customize it in +;; `yas-minor-mode-map'. +;; +;; M-x yas-load-directory +;; +;; Prompts you for a directory hierarchy of snippets to load. +;; +;; M-x yas-activate-extra-mode +;; +;; Prompts you for an extra mode to add snippets for in the +;; current buffer. +;; +;; M-x yas-insert-snippet +;; +;; Prompts you for possible snippet expansion if that is +;; possible according to buffer-local and snippet-local +;; expansion conditions. With prefix argument, ignore these +;; conditions. +;; +;; M-x yas-visit-snippet-file +;; +;; Prompts you for possible snippet expansions like +;; `yas-insert-snippet', but instead of expanding it, takes +;; you directly to the snippet definition's file, if it +;; exists. +;; +;; M-x yas-new-snippet +;; +;; Lets you create a new snippet file in the correct +;; subdirectory of `yas-snippet-dirs', according to the +;; active major mode. +;; +;; M-x yas-load-snippet-buffer +;; +;; When editing a snippet, this loads the snippet. This is +;; bound to "C-c C-c" while in the `snippet-mode' editing +;; mode. +;; +;; M-x yas-tryout-snippet +;; +;; When editing a snippet, this opens a new empty buffer, +;; sets it to the appropriate major mode and inserts the +;; snippet there, so you can see what it looks like. This is +;; bound to "C-c C-t" while in `snippet-mode'. +;; +;; M-x yas-describe-tables +;; +;; Lists known snippets in a separate buffer. User is +;; prompted as to whether only the currently active tables +;; are to be displayed, or all the tables for all major +;; modes. +;; +;; If you have `dropdown-list' installed, you can optionally use it +;; as the preferred "prompting method", putting in your .emacs file, +;; for example: +;; +;; (require 'dropdown-list) +;; (setq yas-prompt-functions '(yas-dropdown-prompt +;; yas-ido-prompt +;; yas-completing-prompt)) +;; +;; Also check out the customization group +;; +;; M-x customize-group RET yasnippet RET +;; +;; If you use the customization group to set variables +;; `yas-snippet-dirs' or `yas-global-mode', make sure the path to +;; "yasnippet.el" is present in the `load-path' *before* the +;; `custom-set-variables' is executed in your .emacs file. +;; +;; For more information and detailed usage, refer to the project page: +;; http://github.com/capitaomorte/yasnippet + +;;; Code: + +(require 'cl) +(require 'cl-lib) +(require 'easymenu) +(require 'help-mode) + +(defvar yas--editing-template) +(defvar yas--guessed-modes) +(defvar yas--indent-original-column) +(defvar yas--scheduled-jit-loads) +(defvar yas-keymap) +(defvar yas-selected-text) +(defvar yas-verbosity) +(defvar yas--current-template) + + +;;; User customizable variables + +(defgroup yasnippet nil + "Yet Another Snippet extension" + :prefix "yas-" + :group 'editing) + +(defvar yas-installed-snippets-dir nil) +(setq yas-installed-snippets-dir + (when load-file-name + (concat (file-name-directory load-file-name) "snippets"))) + +(defconst yas--default-user-snippets-dir + (concat user-emacs-directory "snippets")) + +(defcustom yas-snippet-dirs (remove nil + (list yas--default-user-snippets-dir + 'yas-installed-snippets-dir)) + "List of top-level snippet directories. + +Each element, a string or a symbol whose value is a string, +designates a top-level directory where per-mode snippet +directories can be found. + +Elements appearing earlier in the list override later elements' +snippets. + +The first directory is taken as the default for storing snippet's +created with `yas-new-snippet'. " + :type '(choice (string :tag "Single directory (string)") + (repeat :args (string) :tag "List of directories (strings)")) + :group 'yasnippet + :require 'yasnippet + :set #'(lambda (symbol new) + (let ((old (and (boundp symbol) + (symbol-value symbol)))) + (set-default symbol new) + (unless (or (not (fboundp 'yas-reload-all)) + (equal old new)) + (yas-reload-all))))) + +(defun yas-snippet-dirs () + "Return variable `yas-snippet-dirs' as list of strings." + (cl-loop for e in (if (listp yas-snippet-dirs) + yas-snippet-dirs + (list yas-snippet-dirs)) + collect + (cond ((stringp e) e) + ((and (symbolp e) + (boundp e) + (stringp (symbol-value e))) + (symbol-value e)) + (t + (error "[yas] invalid element %s in `yas-snippet-dirs'" e))))) + +(defvaralias 'yas/root-directory 'yas-snippet-dirs) + +(defcustom yas-new-snippet-default "\ +# -*- mode: snippet -*- +# name: $1 +# key: ${2:${1:$(yas--key-from-desc yas-text)}} +# -- +$0" + "Default snippet to use when creating a new snippet. +If nil, don't use any snippet." + :type 'string + :group 'yasnippet) + +(defcustom yas-prompt-functions '(yas-dropdown-prompt + yas-completing-prompt + yas-maybe-ido-prompt + yas-no-prompt) + "Functions to prompt for keys, templates, etc interactively. + +These functions are called with the following arguments: + +- PROMPT: A string to prompt the user + +- CHOICES: a list of strings or objects. + +- optional DISPLAY-FN : A function that, when applied to each of +the objects in CHOICES will return a string. + +The return value of any function you put here should be one of +the objects in CHOICES, properly formatted with DISPLAY-FN (if +that is passed). + +- To signal that your particular style of prompting is +unavailable at the moment, you can also have the function return +nil. + +- To signal that the user quit the prompting process, you can +signal `quit' with + + (signal 'quit \"user quit!\")." + :type '(repeat function) + :group 'yasnippet) + +(defcustom yas-indent-line 'auto + "Controls indenting applied to a recent snippet expansion. + +The following values are possible: + +- `fixed' Indent the snippet to the current column; + +- `auto' Indent each line of the snippet with `indent-according-to-mode' + +Every other value means don't apply any snippet-side indentation +after expansion (the manual per-line \"$>\" indentation still +applies)." + :type '(choice (const :tag "Nothing" nothing) + (const :tag "Fixed" fixed) + (const :tag "Auto" auto)) + :group 'yasnippet) + +(defcustom yas-also-auto-indent-first-line nil + "Non-nil means also auto indent first line according to mode. + +Naturally this is only valid when `yas-indent-line' is `auto'" + :type 'boolean + :group 'yasnippet) + +(defcustom yas-snippet-revival t + "Non-nil means re-activate snippet fields after undo/redo." + :type 'boolean + :group 'yasnippet) + +(defcustom yas-triggers-in-field nil + "If non-nil, allow stacked expansions (snippets inside snippets). + +Otherwise `yas-next-field-or-maybe-expand' just moves on to the +next field" + :type 'boolean + :group 'yasnippet) + +(defcustom yas-fallback-behavior 'call-other-command + "How to act when `yas-expand' does *not* expand a snippet. + +- `call-other-command' means try to temporarily disable YASnippet + and call the next command bound to whatever key was used to + invoke `yas-expand'. + +- nil or the symbol `return-nil' mean do nothing. (and + `yas-expand' returns nil) + +- A Lisp form (apply COMMAND . ARGS) means interactively call + COMMAND. If ARGS is non-nil, call COMMAND non-interactively + with ARGS as arguments." + :type '(choice (const :tag "Call previous command" call-other-command) + (const :tag "Do nothing" return-nil)) + :group 'yasnippet) + +(defcustom yas-choose-keys-first nil + "If non-nil, prompt for snippet key first, then for template. + +Otherwise prompts for all possible snippet names. + +This affects `yas-insert-snippet' and `yas-visit-snippet-file'." + :type 'boolean + :group 'yasnippet) + +(defcustom yas-choose-tables-first nil + "If non-nil, and multiple eligible snippet tables, prompts user for tables first. + +Otherwise, user chooses between the merging together of all +eligible tables. + +This affects `yas-insert-snippet', `yas-visit-snippet-file'" + :type 'boolean + :group 'yasnippet) + +(defcustom yas-use-menu 'abbreviate + "Display a YASnippet menu in the menu bar. + +When non-nil, submenus for each snippet table will be listed +under the menu \"Yasnippet\". + +- If set to `abbreviate', only the current major-mode +menu and the modes set in `yas--extra-modes' are listed. + +- If set to `full', every submenu is listed + +- If set to `nil', hide the menu. + +Any other non-nil value, every submenu is listed." + :type '(choice (const :tag "Full" full) + (const :tag "Abbreviate" abbreviate) + (const :tag "No menu" nil)) + :group 'yasnippet) + +(defcustom yas-trigger-symbol (or (and (eq window-system 'mac) + (ignore-errors + (char-to-string ?\x21E5))) ;; little ->| sign + " =>") + "The text that will be used in menu to represent the trigger." + :type 'string + :group 'yasnippet) + +(defcustom yas-wrap-around-region nil + "If non-nil, snippet expansion wraps around selected region. + +The wrapping occurs just before the snippet's exit marker. This +can be overridden on a per-snippet basis." + :type 'boolean + :group 'yasnippet) + +(defcustom yas-good-grace t + "If non-nil, don't raise errors in inline elisp evaluation. + +An error string \"[yas] error\" is returned instead." + :type 'boolean + :group 'yasnippet) + +(defcustom yas-visit-from-menu nil + "If non-nil visit snippets's files from menu, instead of expanding them. + +This can only work when snippets are loaded from files." + :type 'boolean + :group 'yasnippet) + +(defcustom yas-expand-only-for-last-commands nil + "List of `last-command' values to restrict tab-triggering to, or nil. + +Leave this set at nil (the default) to be able to trigger an +expansion simply by placing the cursor after a valid tab trigger, +using whichever commands. + +Optionally, set this to something like '(self-insert-command) if +you to wish restrict expansion to only happen when the last +letter of the snippet tab trigger was typed immediately before +the trigger key itself." + :type '(repeat function) + :group 'yasnippet) + +;; Only two faces, and one of them shouldn't even be used... +;; +(defface yas-field-highlight-face + '((t (:inherit 'region))) + "The face used to highlight the currently active field of a snippet" + :group 'yasnippet) + +(defface yas--field-debug-face + '() + "The face used for debugging some overlays normally hidden" + :group 'yasnippet) + + +;;; User-visible variables + +(defvar yas-keymap (let ((map (make-sparse-keymap))) + (define-key map [(tab)] 'yas-next-field-or-maybe-expand) + (define-key map (kbd "TAB") 'yas-next-field-or-maybe-expand) + (define-key map [(shift tab)] 'yas-prev-field) + (define-key map [backtab] 'yas-prev-field) + (define-key map (kbd "C-g") 'yas-abort-snippet) + (define-key map (kbd "C-d") 'yas-skip-and-clear-or-delete-char) + map) + "The active keymap while a snippet expansion is in progress.") + +(defvar yas-key-syntaxes (list "w" "w_" "w_." "w_.()" + #'yas-try-key-from-whitespace) + "Syntaxes and functions to help look for trigger keys before point. + +Each element in this list specifies how to skip buffer positions +backwards and look for the start of a trigger key. + +Each element can be either a string or a function receiving the +original point as an argument. A string element is simply passed +to `skip-syntax-backward' whereas a function element is called +with no arguments and should also place point before the original +position. + +The string between the resulting buffer position and the original +point is matched against the trigger keys in the active snippet +tables. + +If no expandable snippets are found, the next element is the list +is tried, unless a function element returned the symbol `again', +in which case it is called again from the previous position and +may once more reposition point. + +For example, if `yas-key-syntaxes'' value is '(\"w\" \"w_\"), +trigger keys composed exclusively of \"word\"-syntax characters +are looked for first. Failing that, longer keys composed of +\"word\" or \"symbol\" syntax are looked for. Therefore, +triggering after + +foo-bar + +will, according to the \"w\" element first try \"barbaz\". If +that isn't a trigger key, \"foo-barbaz\" is tried, respecting the +second \"w_\" element. Notice that even if \"baz\" is a trigger +key for an active snippet, it won't be expanded, unless a +function is added to `yas-key-syntaxes' that eventually places +point between \"bar\" and \"baz\". + +See also Info node `(elisp) Syntax Descriptors'.") + +(defvar yas-after-exit-snippet-hook + '() + "Hooks to run after a snippet exited. + +The hooks will be run in an environment where some variables bound to +proper values: + +`yas-snippet-beg' : The beginning of the region of the snippet. + +`yas-snippet-end' : Similar to beg. + +Attention: These hooks are not run when exiting nested/stacked snippet expansion!") + +(defvar yas-before-expand-snippet-hook + '() + "Hooks to run just before expanding a snippet.") + +(defvar yas-buffer-local-condition + '(if (and (let ((ppss (syntax-ppss))) + (or (nth 3 ppss) (nth 4 ppss))) + (memq this-command '(yas-expand yas-expand-from-trigger-key + yas-expand-from-keymap))) + '(require-snippet-condition . force-in-comment) + t) + "Snippet expanding condition. + +This variable is a Lisp form which is evaluated every time a +snippet expansion is attempted: + + * If it evaluates to nil, no snippets can be expanded. + + * If it evaluates to the a cons (require-snippet-condition + . REQUIREMENT) + + * Snippets bearing no \"# condition:\" directive are not + considered + + * Snippets bearing conditions that evaluate to nil (or + produce an error) won't be considered. + + * If the snippet has a condition that evaluates to non-nil + RESULT: + + * If REQUIREMENT is t, the snippet is considered + + * If REQUIREMENT is `eq' RESULT, the snippet is + considered + + * Otherwise, the snippet is not considered. + + * If it evaluates to the symbol 'always, all snippets are + considered for expansion, regardless of any conditions. + + * If it evaluates to t or some other non-nil value + + * Snippet bearing no conditions, or conditions that + evaluate to non-nil, are considered for expansion. + + * Otherwise, the snippet is not considered. + +Here's an example preventing snippets from being expanded from +inside comments, in `python-mode' only, with the exception of +snippets returning the symbol 'force-in-comment in their +conditions. + + (add-hook 'python-mode-hook + '(lambda () + (setq yas-buffer-local-condition + '(if (python-in-string/comment) + '(require-snippet-condition . force-in-comment) + t)))) + +The default value is similar, it filters out potential snippet +expansions inside comments and string literals, unless the +snippet itself contains a condition that returns the symbol +`force-in-comment'.") + + +;;; Internal variables + +(defvar yas--version "0.9.1") + +(defvar yas--menu-table (make-hash-table) + "A hash table of MAJOR-MODE symbols to menu keymaps.") + +(defvar yas--escaped-characters + '(?\\ ?` ?\" ?' ?$ ?} ?{ ?\( ?\)) + "List of characters which *might* need to be escaped.") + +(defconst yas--field-regexp + "${\\([0-9]+:\\)?\\([^}]*\\)}" + "A regexp to *almost* recognize a field.") + +(defconst yas--multi-dollar-lisp-expression-regexp + "$+[ \t\n]*\\(([^)]*)\\)" + "A regexp to *almost* recognize a \"$(...)\" expression.") + +(defconst yas--backquote-lisp-expression-regexp + "`\\([^`]*\\)`" + "A regexp to recognize a \"`lisp-expression`\" expression." ) + +(defconst yas--transform-mirror-regexp + "${\\(?:\\([0-9]+\\):\\)?$\\([ \t\n]*([^}]*\\)" + "A regexp to *almost* recognize a mirror with a transform.") + +(defconst yas--simple-mirror-regexp + "$\\([0-9]+\\)" + "A regexp to recognize a simple mirror.") + +(defvar yas--snippet-id-seed 0 + "Contains the next id for a snippet.") + +(defun yas--snippet-next-id () + (let ((id yas--snippet-id-seed)) + (cl-incf yas--snippet-id-seed) + id)) + + +;;; Minor mode stuff + +;; XXX: `last-buffer-undo-list' is somehow needed in Carbon Emacs for MacOSX +(defvar last-buffer-undo-list nil) + +(defvar yas--minor-mode-menu nil + "Holds the YASnippet menu.") + +(defvar yas-minor-mode-map + (let ((map (make-sparse-keymap))) + (define-key map [(tab)] 'yas-expand) + (define-key map (kbd "TAB") 'yas-expand) + (define-key map "\C-c&\C-s" 'yas-insert-snippet) + (define-key map "\C-c&\C-n" 'yas-new-snippet) + (define-key map "\C-c&\C-v" 'yas-visit-snippet-file) + map) + "The keymap used when `yas-minor-mode' is active.") + +(easy-menu-define yas--minor-mode-menu + yas-minor-mode-map + "Menu used when `yas-minor-mode' is active." + '("YASnippet" :visible yas-use-menu + "----" + ["Expand trigger" yas-expand + :help "Possibly expand tab trigger before point"] + ["Insert at point..." yas-insert-snippet + :help "Prompt for an expandable snippet and expand it at point"] + ["New snippet..." yas-new-snippet + :help "Create a new snippet in an appropriate directory"] + ["Visit snippet file..." yas-visit-snippet-file + :help "Prompt for an expandable snippet and find its file"] + "----" + ("Snippet menu behaviour" + ["Visit snippets" (setq yas-visit-from-menu t) + :help "Visit snippets from the menu" + :active t :style radio :selected yas-visit-from-menu] + ["Expand snippets" (setq yas-visit-from-menu nil) + :help "Expand snippets from the menu" + :active t :style radio :selected (not yas-visit-from-menu)] + "----" + ["Show all known modes" (setq yas-use-menu 'full) + :help "Show one snippet submenu for each loaded table" + :active t :style radio :selected (eq yas-use-menu 'full)] + ["Abbreviate according to current mode" (setq yas-use-menu 'abbreviate) + :help "Show only snippet submenus for the current active modes" + :active t :style radio :selected (eq yas-use-menu 'abbreviate)]) + ("Indenting" + ["Auto" (setq yas-indent-line 'auto) + :help "Indent each line of the snippet with `indent-according-to-mode'" + :active t :style radio :selected (eq yas-indent-line 'auto)] + ["Fixed" (setq yas-indent-line 'fixed) + :help "Indent the snippet to the current column" + :active t :style radio :selected (eq yas-indent-line 'fixed)] + ["None" (setq yas-indent-line 'none) + :help "Don't apply any particular snippet indentation after expansion" + :active t :style radio :selected (not (member yas-indent-line '(fixed auto)))] + "----" + ["Also auto indent first line" (setq yas-also-auto-indent-first-line + (not yas-also-auto-indent-first-line)) + :help "When auto-indenting also, auto indent the first line menu" + :active (eq yas-indent-line 'auto) + :style toggle :selected yas-also-auto-indent-first-line] + ) + ("Prompting method" + ["System X-widget" (setq yas-prompt-functions + (cons 'yas-x-prompt + (remove 'yas-x-prompt + yas-prompt-functions))) + :help "Use your windowing system's (gtk, mac, windows, etc...) default menu" + :active t :style radio :selected (eq (car yas-prompt-functions) + 'yas-x-prompt)] + ["Dropdown-list" (setq yas-prompt-functions + (cons 'yas-dropdown-prompt + (remove 'yas-dropdown-prompt + yas-prompt-functions))) + :help "Use a special dropdown list" + :active t :style radio :selected (eq (car yas-prompt-functions) + 'yas-dropdown-prompt)] + ["Ido" (setq yas-prompt-functions + (cons 'yas-ido-prompt + (remove 'yas-ido-prompt + yas-prompt-functions))) + :help "Use an ido-style minibuffer prompt" + :active t :style radio :selected (eq (car yas-prompt-functions) + 'yas-ido-prompt)] + ["Completing read" (setq yas-prompt-functions + (cons 'yas-completing-prompt + (remove 'yas-completing-prompt + yas-prompt-functions))) + :help "Use a normal minibuffer prompt" + :active t :style radio :selected (eq (car yas-prompt-functions) + 'yas-completing-prompt)] + ) + ("Misc" + ["Wrap region in exit marker" + (setq yas-wrap-around-region + (not yas-wrap-around-region)) + :help "If non-nil automatically wrap the selected text in the $0 snippet exit" + :style toggle :selected yas-wrap-around-region] + ["Allow stacked expansions " + (setq yas-triggers-in-field + (not yas-triggers-in-field)) + :help "If non-nil allow snippets to be triggered inside other snippet fields" + :style toggle :selected yas-triggers-in-field] + ["Revive snippets on undo " + (setq yas-snippet-revival + (not yas-snippet-revival)) + :help "If non-nil allow snippets to become active again after undo" + :style toggle :selected yas-snippet-revival] + ["Good grace " + (setq yas-good-grace + (not yas-good-grace)) + :help "If non-nil don't raise errors in bad embedded elisp in snippets" + :style toggle :selected yas-good-grace] + ) + "----" + ["Load snippets..." yas-load-directory + :help "Load snippets from a specific directory"] + ["Reload everything" yas-reload-all + :help "Cleanup stuff, reload snippets, rebuild menus"] + ["About" yas-about + :help "Display some information about YASnippet"])) + +(defvar yas--extra-modes nil + "An internal list of modes for which to also lookup snippets. + +This variable probably makes more sense as buffer-local, so +ensure your use `make-local-variable' when you set it.") +(define-obsolete-variable-alias 'yas-extra-modes 'yas--extra-modes "0.9.1") + +(defvar yas--tables (make-hash-table) + "A hash table of mode symbols to `yas--table' objects.") + +(defvar yas--parents (make-hash-table) + "A hash table of mode symbols do lists of direct parent mode symbols. + +This list is populated when reading the \".yas-parents\" files +found when traversing snippet directories with +`yas-load-directory'. + +There might be additional parenting information stored in the +`derived-mode-parent' property of some mode symbols, but that is +not recorded here.") + +(defvar yas--direct-keymaps (list) + "Keymap alist supporting direct snippet keybindings. + +This variable is placed in `emulation-mode-map-alists'. + +Its elements looks like (TABLE-NAME . KEYMAP). They're +instantiated on `yas-reload-all' but KEYMAP is added to only when +loading snippets. `yas--direct-TABLE-NAME' is then a variable set +buffer-locally when entering `yas-minor-mode'. KEYMAP binds all +defined direct keybindings to the command +`yas-expand-from-keymap' which then which snippet to expand.") + +(defun yas-direct-keymaps-reload () + "Force reload the direct keybinding for active snippet tables." + (interactive) + (setq yas--direct-keymaps nil) + (maphash #'(lambda (name table) + (push (cons (intern (format "yas--direct-%s" name)) + (yas--table-direct-keymap table)) + yas--direct-keymaps)) + yas--tables)) + +(defun yas--modes-to-activate (&optional mode) + "Compute list of mode symbols that are active for `yas-expand' +and friends." + (let* ((explored (if mode (list mode) ; Building up list in reverse. + (cons major-mode (reverse yas--extra-modes)))) + (dfs + (lambda (mode) + (cl-loop for neighbour + in (cl-list* (get mode 'derived-mode-parent) + (ignore-errors (symbol-function mode)) + (gethash mode yas--parents)) + when (and neighbour + (not (memq neighbour explored)) + (symbolp neighbour)) + do (push neighbour explored) + (funcall dfs neighbour))))) + (mapcar dfs explored) + (nreverse explored))) + +(defvar yas-minor-mode-hook nil + "Hook run when `yas-minor-mode' is turned on.") + +;;;###autoload +(define-minor-mode yas-minor-mode + "Toggle YASnippet mode. + +When YASnippet mode is enabled, `yas-expand', normally bound to +the TAB key, expands snippets of code depending on the major +mode. + +With no argument, this command toggles the mode. +positive prefix argument turns on the mode. +Negative prefix argument turns off the mode. + +Key bindings: +\\{yas-minor-mode-map}" + nil + ;; The indicator for the mode line. + " yas" + :group 'yasnippet + (cond (yas-minor-mode + ;; Install the direct keymaps in `emulation-mode-map-alists' + ;; (we use `add-hook' even though it's not technically a hook, + ;; but it works). Then define variables named after modes to + ;; index `yas--direct-keymaps'. + ;; + ;; Also install the post-command-hook. + ;; + (add-hook 'emulation-mode-map-alists 'yas--direct-keymaps) + (add-hook 'post-command-hook 'yas--post-command-handler nil t) + ;; Set the `yas--direct-%s' vars for direct keymap expansion + ;; + (dolist (mode (yas--modes-to-activate)) + (let ((name (intern (format "yas--direct-%s" mode)))) + (set-default name nil) + (set (make-local-variable name) t))) + ;; Perform JIT loads + ;; + (yas--load-pending-jits)) + (t + ;; Uninstall the direct keymaps and the post-command hook + ;; + (remove-hook 'post-command-hook 'yas--post-command-handler t) + (remove-hook 'emulation-mode-map-alists 'yas--direct-keymaps)))) + +(defun yas-activate-extra-mode (mode) + "Activates the snippets for the given `mode' in the buffer. + +The function can be called in the hook of a minor mode to +activate snippets associated with that mode." + (interactive + (let (modes + symbol) + (maphash (lambda (k _) + (setq modes (cons (list k) modes))) + yas--parents) + (setq symbol (completing-read + "Activate mode: " modes nil t)) + (list + (when (not (string= "" symbol)) + (intern symbol))))) + (when mode + (add-to-list (make-local-variable 'yas--extra-modes) mode) + (yas--load-pending-jits))) + +(defun yas-deactivate-extra-mode (mode) + "Deactivates the snippets for the given `mode' in the buffer." + (interactive + (list (intern + (completing-read + "Deactivate mode: " (mapcar #'list yas--extra-modes) nil t)))) + (set (make-local-variable 'yas--extra-modes) + (remove mode + yas--extra-modes))) + +(defvar yas-dont-activate '(minibufferp) + "If non-nil don't let `yas-global-mode' affect some buffers. + +If a function of zero arguments, then its result is used. + +If a list of functions, then all functions must return nil to +activate yas for this buffer. + +In Emacsen <= 23, this variable is buffer-local. Because +`yas-minor-mode-on' is called by `yas-global-mode' after +executing the buffer's major mode hook, setting this variable +there is an effective way to define exceptions to the \"global\" +activation behaviour. + +In Emacsen > 23, only the global value is used. To define +per-mode exceptions to the \"global\" activation behaviour, call +`yas-minor-mode' with a negative argument directily in the major +mode's hook.") +(unless (> emacs-major-version 23) + (with-no-warnings + (make-variable-buffer-local 'yas-dont-activate))) + + +(defun yas-minor-mode-on () + "Turn on YASnippet minor mode. + +Honour `yas-dont-activate', which see." + (interactive) + ;; Check `yas-dont-activate' + (unless (cond ((functionp yas-dont-activate) + (funcall yas-dont-activate)) + ((consp yas-dont-activate) + (some #'funcall yas-dont-activate)) + (yas-dont-activate)) + (yas-minor-mode 1))) + +;;;###autoload +(define-globalized-minor-mode yas-global-mode yas-minor-mode yas-minor-mode-on + :group 'yasnippet + :require 'yasnippet) + +(defun yas--global-mode-reload-with-jit-maybe () + "Run `yas-reload-all' when `yas-global-mode' is on." + (when yas-global-mode (yas-reload-all))) + +(add-hook 'yas-global-mode-hook 'yas--global-mode-reload-with-jit-maybe) + + +;;; Major mode stuff + +(defvar yas--font-lock-keywords + (append '(("^#.*$" . font-lock-comment-face)) + lisp-font-lock-keywords-2 + '(("$\\([0-9]+\\)" + (0 font-lock-keyword-face) + (1 font-lock-string-face t)) + ("${\\([0-9]+\\):?" + (0 font-lock-keyword-face) + (1 font-lock-warning-face t)) + ("${" . font-lock-keyword-face) + ("$[0-9]+?" . font-lock-preprocessor-face) + ("\\(\\$(\\)" 1 font-lock-preprocessor-face) + ("}" + (0 font-lock-keyword-face))))) + +(defvar snippet-mode-map + (let ((map (make-sparse-keymap))) + (easy-menu-define nil + map + "Menu used when snippet-mode is active." + (cons "Snippet" + (mapcar #'(lambda (ent) + (when (third ent) + (define-key map (third ent) (second ent))) + (vector (first ent) (second ent) t)) + '(("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"))))) + map) + "The keymap used when `snippet-mode' is active.") + + +(define-derived-mode snippet-mode text-mode "Snippet" + "A mode for editing yasnippets" + (setq font-lock-defaults '(yas--font-lock-keywords)) + (set (make-local-variable 'require-final-newline) nil) + (set (make-local-variable 'comment-start) "#") + (set (make-local-variable 'comment-start-skip) "#+[\t ]*")) + + + +;;; Internal structs for template management + +(cl-defstruct (yas--template + (:constructor yas--make-template) + ;; Handles `yas-define-snippets' format, plus the + ;; initial TABLE argument. + (:constructor + yas--define-snippets-2 + (table + key content + &optional xname condition group + expand-env load-file xkeybinding xuuid save-file + &aux + (name (or xname + ;; A little redundant: we always get a name + ;; from `yas--parse-template' except when + ;; there isn't a file. + (and load-file (file-name-nondirectory load-file)) + (and save-file (file-name-nondirectory save-file)) + key)) + (keybinding (yas--read-keybinding xkeybinding)) + (uuid (or xuuid name)) + (old (gethash uuid (yas--table-uuidhash table))) + (menu-binding-pair + (and old (yas--template-menu-binding-pair old))) + (perm-group + (and old (yas--template-perm-group old)))))) + "A template for a snippet." + key + content + name + condition + expand-env + load-file + save-file + keybinding + uuid + menu-binding-pair + group ;; as dictated by the #group: directive or .yas-make-groups + perm-group ;; as dictated by `yas-define-menu' + table + ) + +(defstruct (yas--table (:constructor yas--make-snippet-table (name))) + "A table to store snippets for a particular mode. + +Has the following fields: + +`yas--table-name' + + A symbol name normally corresponding to a major mode, but can + also be a pseudo major-mode to be used in + `yas-activate-extra-mode', for example. + +`yas--table-hash' + + A hash table (KEY . NAMEHASH), known as the \"keyhash\". KEY is + a string or a vector, where the former is the snippet's trigger + and the latter means it's a direct keybinding. NAMEHASH is yet + another hash of (NAME . TEMPLATE) where NAME is the snippet's + name and TEMPLATE is a `yas--template' object. + +`yas--table-direct-keymap' + + A keymap for the snippets in this table that have direct + keybindings. This is kept in sync with the keyhash, i.e., all + the elements of the keyhash that are vectors appear here as + bindings to `yas-expand-from-keymap'. + +`yas--table-uuidhash' + + A hash table mapping snippets uuid's to the same `yas--template' + objects. A snippet uuid defaults to the snippet's name." + name + (hash (make-hash-table :test 'equal)) + (uuidhash (make-hash-table :test 'equal)) + (parents nil) + (direct-keymap (make-sparse-keymap))) + +(defun yas--get-template-by-uuid (mode uuid) + "Find the snippet template in MODE by its UUID." + (let* ((table (gethash mode yas--tables mode))) + (when table + (gethash uuid (yas--table-uuidhash table))))) + +;; Apropos storing/updating in TABLE, this works in two steps: +;; +;; 1. `yas--remove-template-by-uuid' removes any +;; keyhash-namehash-template mappings from TABLE, grabbing the +;; snippet by its uuid. Also removes mappings from TABLE's +;; `yas--table-direct-keymap' (FIXME: and should probably take care +;; of potentially stale menu bindings right?.) +;; +;; 2. `yas--add-template' adds this all over again. +;; +;; Create a new or add to an existing keyhash-namehash mapping. +;; +;; For reference on understanding this, consider three snippet +;; definitions: +;; +;; A: # name: The Foo +;; # key: foo +;; # binding: C-c M-l +;; +;; B: # name: Mrs Foo +;; # key: foo +;; +;; C: # name: The Bar +;; # binding: C-c M-l +;; +;; D: # name: Baz +;; # key: baz +;; +;; keyhash namehashes(3) yas--template structs(4) +;; ----------------------------------------------------- +;; __________ +;; / \ +;; "foo" ---> "The Foo" ---> [yas--template A] | +;; "Mrs Foo" ---> [yas--template B] | +;; | +;; [C-c M-l] ---> "The Foo" -------------------------/ +;; "The Bar" ---> [yas--template C] +;; +;; "baz" ---> "Baz" ---> [yas--template D] +;; +;; Additionally, since uuid defaults to the name, we have a +;; `yas--table-uuidhash' for TABLE +;; +;; uuidhash yas--template structs +;; ------------------------------- +;; "The Foo" ---> [yas--template A] +;; "Mrs Foo" ---> [yas--template B] +;; "The Bar" ---> [yas--template C] +;; "Baz" ---> [yas--template D] +;; +;; FIXME: the more I look at this data-structure the more I think I'm +;; stupid. There has to be an easier way (but beware lots of code +;; depends on this). +;; +(defun yas--remove-template-by-uuid (table uuid) + "Remove from TABLE a template identified by UUID." + (let ((template (gethash uuid (yas--table-uuidhash table)))) + (when template + (let* ((name (yas--template-name template)) + (empty-keys nil)) + ;; Remove the name from each of the targeted namehashes + ;; + (maphash #'(lambda (k v) + (let ((template (gethash name v))) + (when (and template + (eq uuid (yas--template-uuid template))) + (remhash name v) + (when (zerop (hash-table-count v)) + (push k empty-keys))))) + (yas--table-hash table)) + ;; Remove the namehash themselves if they've become empty + ;; + (dolist (key empty-keys) + (when (vectorp key) + (define-key (yas--table-direct-keymap table) key nil)) + (remhash key (yas--table-hash table))) + + ;; Finally, remove the uuid from the uuidhash + ;; + (remhash uuid (yas--table-uuidhash table)))))) + +(defun yas--add-template (table template) + "Store in TABLE the snippet template TEMPLATE. + +KEY can be a string (trigger key) of a vector (direct +keybinding)." + (let ((name (yas--template-name template)) + (key (yas--template-key template)) + (keybinding (yas--template-keybinding template)) + (_menu-binding-pair (yas--template-menu-binding-pair-get-create template))) + (dolist (k (remove nil (list key keybinding))) + (puthash name + template + (or (gethash k + (yas--table-hash table)) + (puthash k + (make-hash-table :test 'equal) + (yas--table-hash table)))) + (when (vectorp k) + (define-key (yas--table-direct-keymap table) k 'yas-expand-from-keymap))) + + ;; Update TABLE's `yas--table-uuidhash' + (puthash (yas--template-uuid template) + template + (yas--table-uuidhash table)))) + +(defun yas--update-template (table template) + "Add or update TEMPLATE in TABLE. + +Also takes care of adding and updating to the associated menu. +Return TEMPLATE." + ;; Remove from table by uuid + ;; + (yas--remove-template-by-uuid table (yas--template-uuid template)) + ;; Add to table again + ;; + (yas--add-template table template) + ;; Take care of the menu + ;; + (yas--update-template-menu table template) + template) + +(defun yas--update-template-menu (table template) + "Update every menu-related for TEMPLATE." + (let ((menu-binding-pair (yas--template-menu-binding-pair-get-create template)) + (key (yas--template-key template)) + (keybinding (yas--template-keybinding template))) + ;; The snippet might have changed name or keys, so update + ;; user-visible strings + ;; + (unless (eq (cdr menu-binding-pair) :none) + ;; the menu item name + ;; + (setf (cadar menu-binding-pair) (yas--template-name template)) + ;; the :keys information (also visible to the user) + (setf (getf (cdr (car menu-binding-pair)) :keys) + (or (and keybinding (key-description keybinding)) + (and key (concat key yas-trigger-symbol)))))) + (unless (yas--template-menu-managed-by-yas-define-menu template) + (let ((menu-keymap + (yas--menu-keymap-get-create (yas--table-mode table) + (mapcar #'yas--table-mode + (yas--table-parents table)))) + (group (yas--template-group template))) + ;; Remove from menu keymap + ;; + (assert menu-keymap) + (yas--delete-from-keymap menu-keymap (yas--template-uuid template)) + + ;; Add necessary subgroups as necessary. + ;; + (dolist (subgroup group) + (let ((subgroup-keymap (lookup-key menu-keymap (vector (make-symbol subgroup))))) + (unless (and subgroup-keymap + (keymapp subgroup-keymap)) + (setq subgroup-keymap (make-sparse-keymap)) + (define-key menu-keymap (vector (make-symbol subgroup)) + `(menu-item ,subgroup ,subgroup-keymap))) + (setq menu-keymap subgroup-keymap))) + + ;; Add this entry to the keymap + ;; + (define-key menu-keymap + (vector (make-symbol (yas--template-uuid template))) + (car (yas--template-menu-binding-pair template)))))) + +(defun yas--namehash-templates-alist (namehash) + "Return NAMEHASH as an alist." + (let (alist) + (maphash #'(lambda (k v) + (push (cons k v) alist)) + namehash) + alist)) + +(defun yas--fetch (table key) + "Fetch templates in TABLE by KEY. + +Return a list of cons (NAME . TEMPLATE) where NAME is a +string and TEMPLATE is a `yas--template' structure." + (let* ((keyhash (yas--table-hash table)) + (namehash (and keyhash (gethash key keyhash)))) + (when namehash + (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash))))) + + +;;; Filtering/condition logic + +(defun yas--eval-condition (condition) + (condition-case err + (save-excursion + (save-restriction + (save-match-data + (eval condition)))) + (error (progn + (yas--message 1 "Error in condition evaluation: %s" (error-message-string err)) + nil)))) + + +(defun yas--filter-templates-by-condition (templates) + "Filter the templates using the applicable condition. + +TEMPLATES is a list of cons (NAME . TEMPLATE) where NAME is a +string and TEMPLATE is a `yas--template' structure. + +This function implements the rules described in +`yas-buffer-local-condition'. See that variables documentation." + (let ((requirement (yas--require-template-specific-condition-p))) + (if (eq requirement 'always) + templates + (remove-if-not #'(lambda (pair) + (yas--template-can-expand-p + (yas--template-condition (cdr pair)) requirement)) + templates)))) + +(defun yas--require-template-specific-condition-p () + "Decide if this buffer requests/requires snippet-specific +conditions to filter out potential expansions." + (if (eq 'always yas-buffer-local-condition) + 'always + (let ((local-condition (or (and (consp yas-buffer-local-condition) + (yas--eval-condition yas-buffer-local-condition)) + yas-buffer-local-condition))) + (when local-condition + (if (eq local-condition t) + t + (and (consp local-condition) + (eq 'require-snippet-condition (car local-condition)) + (symbolp (cdr local-condition)) + (cdr local-condition))))))) + +(defun yas--template-can-expand-p (condition requirement) + "Evaluate CONDITION and REQUIREMENT and return a boolean." + (let* ((result (or (null condition) + (yas--eval-condition condition)))) + (cond ((eq requirement t) + result) + (t + (eq requirement result))))) + +(defun yas--table-templates (table) + (when table + (let ((acc (list))) + (maphash #'(lambda (_key namehash) + (maphash #'(lambda (name template) + (push (cons name template) acc)) + namehash)) + (yas--table-hash table)) + (yas--filter-templates-by-condition acc)))) + +(defun yas--templates-for-key-at-point () + "Find `yas--template' objects for any trigger keys preceding point. +Returns (TEMPLATES START END). This function respects +`yas-key-syntaxes', which see." + (save-excursion + (let ((original (point)) + (methods yas-key-syntaxes) + (templates) + (method)) + (while (and methods + (not templates)) + (unless (eq method (car methods)) + ;; TRICKY: `eq'-ness test means we can only be here if + ;; `method' is a function that returned `again', and hence + ;; don't revert back to original position as per + ;; `yas-key-syntaxes'. + (goto-char original)) + (setq method (car methods)) + (cond ((stringp method) + (skip-syntax-backward method) + (setq methods (cdr methods))) + ((functionp method) + (unless (eq (funcall method original) + 'again) + (setq methods (cdr methods)))) + (t + (setq methods (cdr methods)) + (yas--warning "Invalid element `%s' in `yas-key-syntaxes'" method))) + (let ((possible-key (buffer-substring-no-properties (point) original))) + (save-excursion + (goto-char original) + (setq templates + (mapcan #'(lambda (table) + (yas--fetch table possible-key)) + (yas--get-snippet-tables)))))) + (when templates + (list templates (point) original))))) + +(defun yas--table-all-keys (table) + "Get trigger keys of all active snippets in TABLE." + (let ((acc)) + (maphash #'(lambda (key namehash) + (when (yas--filter-templates-by-condition (yas--namehash-templates-alist namehash)) + (push key acc))) + (yas--table-hash table)) + acc)) + +(defun yas--table-mode (table) + (intern (yas--table-name table))) + + +;;; Internal functions and macros: + +(defun yas--handle-error (err) + "Handle error depending on value of `yas-good-grace'." + (let ((msg (yas--format "elisp error: %s" (error-message-string err)))) + (if yas-good-grace msg + (error "%s" msg)))) + +(defun yas--eval-lisp (form) + "Evaluate FORM and convert the result to string." + (let ((retval (catch 'yas--exception + (condition-case err + (save-excursion + (save-restriction + (save-match-data + (widen) + (let ((result (eval form))) + (when result + (format "%s" result)))))) + (error (yas--handle-error err)))))) + (when (and (consp retval) + (eq 'yas--exception (car retval))) + (error (cdr retval))) + retval)) + +(defun yas--eval-lisp-no-saves (form) + (condition-case err + (eval form) + (error (message "%s" (yas--handle-error err))))) + +(defun yas--read-lisp (string &optional nil-on-error) + "Read STRING as a elisp expression and return it. + +In case STRING in an invalid expression and NIL-ON-ERROR is nil, +return an expression that when evaluated will issue an error." + (condition-case err + (read string) + (error (and (not nil-on-error) + `(error (error-message-string ,err)))))) + +(defun yas--read-keybinding (keybinding) + "Read KEYBINDING as a snippet keybinding, return a vector." + (when (and keybinding + (not (string-match "keybinding" keybinding))) + (condition-case err + (let ((res (or (and (string-match "^\\[.*\\]$" keybinding) + (read keybinding)) + (read-kbd-macro keybinding 'need-vector)))) + res) + (error + (yas--message 3 "warning: keybinding \"%s\" invalid since %s." + keybinding (error-message-string err)) + nil)))) + +(defun yas--table-get-create (mode) + "Get or create the snippet table corresponding to MODE." + (let ((table (gethash mode + yas--tables))) + (unless table + (setq table (yas--make-snippet-table (symbol-name mode))) + (puthash mode table yas--tables) + (push (cons (intern (format "yas--direct-%s" mode)) + (yas--table-direct-keymap table)) + yas--direct-keymaps)) + table)) + +(defun yas--get-snippet-tables (&optional mode) + "Get snippet tables for MODE. + +MODE defaults to the current buffer's `major-mode'. + +Return a list of `yas--table' objects. The list of modes to +consider is returned by `yas--modes-to-activate'" + (remove nil + (mapcar #'(lambda (name) + (gethash name yas--tables)) + (yas--modes-to-activate mode)))) + +(defun yas--menu-keymap-get-create (mode &optional parents) + "Get or create the menu keymap for MODE and its PARENTS. + +This may very well create a plethora of menu keymaps and arrange +them all in `yas--menu-table'" + (let* ((menu-keymap (or (gethash mode yas--menu-table) + (puthash mode (make-sparse-keymap) yas--menu-table)))) + (mapc #'yas--menu-keymap-get-create parents) + (define-key yas--minor-mode-menu (vector mode) + `(menu-item ,(symbol-name mode) ,menu-keymap + :visible (yas--show-menu-p ',mode))) + menu-keymap)) + + +;;; Template-related and snippet loading functions + +(defun yas--parse-template (&optional file) + "Parse the template in the current buffer. + +Optional FILE is the absolute file name of the file being +parsed. + +Optional GROUP is the group where the template is to go, +otherwise we attempt to calculate it from FILE. + +Return a snippet-definition, i.e. a list + + (KEY TEMPLATE NAME CONDITION GROUP VARS LOAD-FILE KEYBINDING UUID) + +If the buffer contains a line of \"# --\" then the contents above +this line are ignored. Directives can set most of these with the syntax: + +# directive-name : directive-value + +Here's a list of currently recognized directives: + + * type + * name + * contributor + * condition + * group + * key + * expand-env + * binding + * uuid" + (goto-char (point-min)) + (let* ((type 'snippet) + (name (and file + (file-name-nondirectory file))) + (key nil) + template + bound + condition + (group (and file + (yas--calculate-group file))) + expand-env + binding + uuid) + (if (re-search-forward "^# --\n" nil t) + (progn (setq template + (buffer-substring-no-properties (point) + (point-max))) + (setq bound (point)) + (goto-char (point-min)) + (while (re-search-forward "^# *\\([^ ]+?\\) *: *\\(.*?\\)[[:space:]]*$" bound t) + (when (string= "uuid" (match-string-no-properties 1)) + (setq uuid (match-string-no-properties 2))) + (when (string= "type" (match-string-no-properties 1)) + (setq type (if (string= "command" (match-string-no-properties 2)) + 'command + 'snippet))) + (when (string= "key" (match-string-no-properties 1)) + (setq key (match-string-no-properties 2))) + (when (string= "name" (match-string-no-properties 1)) + (setq name (match-string-no-properties 2))) + (when (string= "condition" (match-string-no-properties 1)) + (setq condition (yas--read-lisp (match-string-no-properties 2)))) + (when (string= "group" (match-string-no-properties 1)) + (setq group (match-string-no-properties 2))) + (when (string= "expand-env" (match-string-no-properties 1)) + (setq expand-env (yas--read-lisp (match-string-no-properties 2) + 'nil-on-error))) + (when (string= "binding" (match-string-no-properties 1)) + (setq binding (match-string-no-properties 2))))) + (setq template + (buffer-substring-no-properties (point-min) (point-max)))) + (unless (or key binding) + (setq key (and file (file-name-nondirectory file)))) + (when (eq type 'command) + (setq template (yas--read-lisp (concat "(progn" template ")")))) + (when group + (setq group (split-string group "\\."))) + (list key template name condition group expand-env file binding uuid))) + +(defun yas--calculate-group (file) + "Calculate the group for snippet file path FILE." + (let* ((dominating-dir (locate-dominating-file file + ".yas-make-groups")) + (extra-path (and dominating-dir + (replace-regexp-in-string (concat "^" + (expand-file-name dominating-dir)) + "" + (expand-file-name file)))) + (extra-dir (and extra-path + (file-name-directory extra-path))) + (group (and extra-dir + (replace-regexp-in-string "/" + "." + (directory-file-name extra-dir))))) + group)) + +(defun yas--subdirs (directory &optional filep) + "Return subdirs or files of DIRECTORY according to FILEP." + (remove-if (lambda (file) + (or (string-match "^\\." + (file-name-nondirectory file)) + (string-match "^#.*#$" + (file-name-nondirectory file)) + (string-match "~$" + (file-name-nondirectory file)) + (if filep + (file-directory-p file) + (not (file-directory-p file))))) + (directory-files directory t))) + +(defun yas--make-menu-binding (template) + (let ((mode (yas--table-mode (yas--template-table template)))) + `(lambda () (interactive) (yas--expand-or-visit-from-menu ',mode ,(yas--template-uuid template))))) + +(defun yas--expand-or-visit-from-menu (mode uuid) + (let* ((table (yas--table-get-create mode)) + (yas--current-template (and table + (gethash uuid (yas--table-uuidhash table))))) + (when yas--current-template + (if yas-visit-from-menu + (yas--visit-snippet-file-1 yas--current-template) + (let ((where (if (region-active-p) + (cons (region-beginning) (region-end)) + (cons (point) (point))))) + (yas-expand-snippet (yas--template-content yas--current-template) + (car where) + (cdr where) + (yas--template-expand-env yas--current-template))))))) + +(defun yas--key-from-desc (text) + "Return a yasnippet key from a description string TEXT." + (replace-regexp-in-string "\\(\\w+\\).*" "\\1" text)) + + +;;; Popping up for keys and templates + +(defun yas--prompt-for-template (templates &optional prompt) + "Interactively choose a template from the list TEMPLATES. + +TEMPLATES is a list of `yas--template'. + +Optional PROMPT sets the prompt to use." + (when templates + (setq templates + (sort templates #'(lambda (t1 t2) + (< (length (yas--template-name t1)) + (length (yas--template-name t2)))))) + (some #'(lambda (fn) + (funcall fn (or prompt "Choose a snippet: ") + templates + #'yas--template-name)) + yas-prompt-functions))) + +(defun yas--prompt-for-keys (keys &optional prompt) + "Interactively choose a template key from the list KEYS. + +Optional PROMPT sets the prompt to use." + (when keys + (some #'(lambda (fn) + (funcall fn (or prompt "Choose a snippet key: ") keys)) + yas-prompt-functions))) + +(defun yas--prompt-for-table (tables &optional prompt) + "Interactively choose a table from the list TABLES. + +Optional PROMPT sets the prompt to use." + (when tables + (some #'(lambda (fn) + (funcall fn (or prompt "Choose a snippet table: ") + tables + #'yas--table-name)) + yas-prompt-functions))) + +(defun yas-x-prompt (prompt choices &optional display-fn) + "Display choices in a x-window prompt." + (when (and window-system choices) + ;; Let window position be recalculated to ensure that + ;; `posn-at-point' returns non-nil. + (redisplay) + (or + (x-popup-menu + (if (fboundp 'posn-at-point) + (let ((x-y (posn-x-y (posn-at-point (point))))) + (list (list (+ (car x-y) 10) + (+ (cdr x-y) 20)) + (selected-window))) + t) + `(,prompt ("title" + ,@(mapcar* (lambda (c d) `(,(concat " " d) . ,c)) + choices + (if display-fn (mapcar display-fn choices) choices))))) + (keyboard-quit)))) + +(defun yas-maybe-ido-prompt (prompt choices &optional display-fn) + (when (bound-and-true-p ido-mode) + (yas-ido-prompt prompt choices display-fn))) + +(defun yas-ido-prompt (prompt choices &optional display-fn) + (require 'ido) + (yas-completing-prompt prompt choices display-fn #'ido-completing-read)) + +(defun yas-dropdown-prompt (_prompt choices &optional display-fn) + (when (fboundp 'dropdown-list) + (let* ((formatted-choices + (if display-fn (mapcar display-fn choices) choices)) + (n (dropdown-list formatted-choices))) + (if n (nth n choices) + (keyboard-quit))))) + +(defun yas-completing-prompt (prompt choices &optional display-fn completion-fn) + (let* ((formatted-choices + (if display-fn (mapcar display-fn choices) choices)) + (chosen (funcall (or completion-fn #'completing-read) + prompt formatted-choices + nil 'require-match nil nil))) + (if (eq choices formatted-choices) + chosen + (nth (or (position chosen formatted-choices :test #'string=) 0) + choices)))) + +(defun yas-no-prompt (_prompt choices &optional _display-fn) + (first choices)) + + +;;; Defining snippets +;; This consists of creating and registering `yas--template' objects in the +;; correct tables. +;; + +(defvar yas--creating-compiled-snippets nil) + +(defun yas--define-snippets-1 (snippet snippet-table) + "Helper for `yas-define-snippets'." + ;; Update the appropriate table. Also takes care of adding the + ;; key indicators in the templates menu entry, if any. + (yas--update-template + snippet-table (apply #'yas--define-snippets-2 snippet-table snippet))) + +(defun yas-define-snippets (mode snippets) + "Define SNIPPETS for MODE. + +SNIPPETS is a list of snippet definitions, each taking the +following form + + (KEY TEMPLATE NAME CONDITION GROUP EXPAND-ENV LOAD-FILE KEYBINDING UUID SAVE-FILE) + +Within these, only KEY and TEMPLATE are actually mandatory. + +TEMPLATE might be a Lisp form or a string, depending on whether +this is a snippet or a snippet-command. + +CONDITION, EXPAND-ENV and KEYBINDING are Lisp forms, they have +been `yas--read-lisp'-ed and will eventually be +`yas--eval-lisp'-ed. + +The remaining elements are strings. + +FILE is probably of very little use if you're programatically +defining snippets. + +UUID is the snippet's \"unique-id\". Loading a second snippet +file with the same uuid would replace the previous snippet. + +You can use `yas--parse-template' to return such lists based on +the current buffers contents." + (if yas--creating-compiled-snippets + (let ((print-length nil)) + (insert ";;; Snippet definitions:\n;;;\n") + (dolist (snippet snippets) + ;; Fill in missing elements with nil. + (setq snippet (append snippet (make-list (- 10 (length snippet)) nil))) + ;; Move LOAD-FILE to SAVE-FILE because we will load from the + ;; compiled file, not LOAD-FILE. + (let ((load-file (nth 6 snippet))) + (setcar (nthcdr 6 snippet) nil) + (setcar (nthcdr 9 snippet) load-file))) + (insert (pp-to-string + `(yas-define-snippets ',mode ',snippets))) + (insert "\n\n")) + ;; Normal case. + (let ((snippet-table (yas--table-get-create mode)) + (template nil)) + (dolist (snippet snippets) + (setq template (yas--define-snippets-1 snippet + snippet-table))) + template))) + + +;;; Loading snippets from files + +(defun yas--template-get-file (template) + "Return TEMPLATE's LOAD-FILE or SAVE-FILE." + (or (yas--template-load-file template) + (let ((file (yas--template-save-file template))) + (when file + (yas--message 2 "%s has no load file, use save file, %s, instead." + (yas--template-name template) file)) + file))) + +(defun yas--load-yas-setup-file (file) + (if (not yas--creating-compiled-snippets) + ;; Normal case. + (load file 'noerror (<= yas-verbosity 2)) + (let ((elfile (concat file ".el"))) + (when (file-exists-p elfile) + (insert ";;; contents of the .yas-setup.el support file:\n;;;\n") + (insert-file-contents elfile) + (goto-char (point-max)))))) + +(defun yas--define-parents (mode parents) + "Add PARENTS to the list of MODE's parents." + (puthash mode (remove-duplicates + (append parents + (gethash mode yas--parents))) + yas--parents)) + +(defun yas-load-directory (top-level-dir &optional use-jit interactive) + "Load snippets in directory hierarchy TOP-LEVEL-DIR. + +Below TOP-LEVEL-DIR each directory should be a mode name. + +With prefix argument USE-JIT do jit-loading of snippets." + (interactive + (list (read-directory-name "Select the root directory: " nil nil t) + current-prefix-arg t)) + (unless yas-snippet-dirs + (setq yas-snippet-dirs top-level-dir)) + (let ((impatient-buffers)) + (dolist (dir (yas--subdirs top-level-dir)) + (let* ((major-mode-and-parents (yas--compute-major-mode-and-parents + (concat dir "/dummy"))) + (mode-sym (car major-mode-and-parents)) + (parents (cdr major-mode-and-parents))) + ;; Attention: The parents and the menus are already defined + ;; here, even if the snippets are later jit-loaded. + ;; + ;; * We need to know the parents at this point since entering a + ;; given mode should jit load for its parents + ;; immediately. This could be reviewed, the parents could be + ;; discovered just-in-time-as well + ;; + ;; * We need to create the menus here to support the `full' + ;; option to `yas-use-menu' (all known snippet menus are shown to the user) + ;; + (yas--define-parents mode-sym parents) + (yas--menu-keymap-get-create mode-sym) + (let ((fun `(lambda () ;; FIXME: Simulating lexical-binding. + (yas--load-directory-1 ',dir ',mode-sym)))) + (if use-jit + (yas--schedule-jit mode-sym fun) + (funcall fun))) + ;; Look for buffers that are already in `mode-sym', and so + ;; need the new snippets immediately... + ;; + (when use-jit + (cl-loop for buffer in (buffer-list) + do (with-current-buffer buffer + (when (eq major-mode mode-sym) + (yas--message 3 "Discovered there was already %s in %s" buffer mode-sym) + (push buffer impatient-buffers))))))) + ;; ...after TOP-LEVEL-DIR has been completely loaded, call + ;; `yas--load-pending-jits' in these impatient buffers. + ;; + (cl-loop for buffer in impatient-buffers + do (with-current-buffer buffer (yas--load-pending-jits)))) + (when interactive + (yas--message 3 "Loaded snippets from %s." top-level-dir))) + +(defun yas--load-directory-1 (directory mode-sym) + "Recursively load snippet templates from DIRECTORY." + (if yas--creating-compiled-snippets + (let ((output-file (expand-file-name ".yas-compiled-snippets.el" + directory))) + (with-temp-file output-file + (insert (format ";;; Compiled snippets and support files for `%s'\n" + mode-sym)) + (yas--load-directory-2 directory mode-sym) + (insert (format ";;; Do not edit! File generated at %s\n" + (current-time-string))))) + ;; Normal case. + (unless (file-exists-p (concat directory "/" ".yas-skip")) + (unless (and (load (expand-file-name ".yas-compiled-snippets" directory) 'noerror (<= yas-verbosity 3)) + (progn (yas--message 2 "Loaded compiled snippets from %s" directory) t)) + (yas--message 2 "Loading snippet files from %s" directory) + (yas--load-directory-2 directory mode-sym))))) + +(defun yas--load-directory-2 (directory mode-sym) + ;; 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)))) + +(defun yas--load-snippet-dirs (&optional nojit) + "Reload the directories listed in `yas-snippet-dirs' or +prompt the user to select one." + (let (errors) + (if (null yas-snippet-dirs) + (call-interactively 'yas-load-directory) + (when (member yas--default-user-snippets-dir yas-snippet-dirs) + (make-directory yas--default-user-snippets-dir t)) + (dolist (directory (reverse (yas-snippet-dirs))) + (cond ((file-directory-p directory) + (yas-load-directory directory (not nojit)) + (if nojit + (yas--message 3 "Loaded %s" directory) + (yas--message 3 "Prepared just-in-time loading for %s" directory))) + (t + (push (yas--message 0 "Check your `yas-snippet-dirs': %s is not a directory" directory) errors))))) + errors)) + +(defun yas-reload-all (&optional no-jit interactive) + "Reload all snippets and rebuild the YASnippet menu. + +When NO-JIT is non-nil force immediate reload of all known +snippets under `yas-snippet-dirs', otherwise use just-in-time +loading. + +When called interactively, use just-in-time loading when given a +prefix argument." + (interactive (list (not current-prefix-arg) t)) + (catch 'abort + (let ((errors) + (snippet-editing-buffers + (remove-if-not #'(lambda (buffer) + (with-current-buffer buffer yas--editing-template)) + (buffer-list)))) + ;; Warn if there are buffers visiting snippets, since reloading will break + ;; any on-line editing of those buffers. + ;; + (when snippet-editing-buffers + (if interactive + (if (y-or-n-p "Some buffers editing live snippets, close them and proceed with reload? ") + (mapc #'kill-buffer snippet-editing-buffers) + (yas--message 1 "Aborted reload...") + (throw 'abort nil)) + ;; in a non-interactive use, at least set + ;; `yas--editing-template' to nil, make it guess it next time around + (mapc #'(lambda (buffer) + (with-current-buffer buffer + (kill-local-variable 'yas--editing-template))) + (buffer-list)))) + + ;; Empty all snippet tables and parenting info + ;; + (setq yas--tables (make-hash-table)) + (setq yas--parents (make-hash-table)) + + ;; Before killing `yas--menu-table' use its keys to cleanup the + ;; mode menu parts of `yas--minor-mode-menu' (thus also cleaning + ;; up `yas-minor-mode-map', which points to it) + ;; + (maphash #'(lambda (menu-symbol _keymap) + (define-key yas--minor-mode-menu (vector menu-symbol) nil)) + yas--menu-table) + ;; Now empty `yas--menu-table' as well + (setq yas--menu-table (make-hash-table)) + + ;; Cancel all pending 'yas--scheduled-jit-loads' + ;; + (setq yas--scheduled-jit-loads (make-hash-table)) + + ;; Reload the directories listed in `yas-snippet-dirs' or prompt + ;; the user to select one. + ;; + (setq errors (yas--load-snippet-dirs no-jit)) + ;; Reload the direct keybindings + ;; + (yas-direct-keymaps-reload) + + (run-hooks 'yas-after-reload-hook) + (yas--message 3 "Reloaded everything%s...%s." + (if no-jit "" " (snippets will load just-in-time)") + (if errors " (some errors, check *Messages*)" ""))))) + +(defvar yas-after-reload-hook nil + "Hooks run after `yas-reload-all'.") + +(defun yas--load-pending-jits () + (dolist (mode (yas--modes-to-activate)) + (let ((funs (reverse (gethash mode yas--scheduled-jit-loads)))) + ;; must reverse to maintain coherence with `yas-snippet-dirs' + (dolist (fun funs) + (yas--message 3 "Loading for `%s', just-in-time: %s!" mode fun) + (funcall fun)) + (remhash mode yas--scheduled-jit-loads)))) + +;; (when (<= emacs-major-version 22) +;; (add-hook 'after-change-major-mode-hook 'yas--load-pending-jits)) + +(defun yas--quote-string (string) + "Escape and quote STRING. +foo\"bar\\! -> \"foo\\\"bar\\\\!\"" + (concat "\"" + (replace-regexp-in-string "[\\\"]" + "\\\\\\&" + string + t) + "\"")) + +;;; Snippet compilation function + +(defun yas-compile-directory (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?") + (let ((yas--creating-compiled-snippets t)) + (yas-load-directory top-level-dir nil))) + +(defun yas-recompile-all () + "Compile every dir in `yas-snippet-dirs'." + (interactive) + (mapc #'yas-compile-directory (yas-snippet-dirs))) + + +;;; JIT loading +;;; + +(defvar yas--scheduled-jit-loads (make-hash-table) + "Alist of mode-symbols to forms to be evaled when `yas-minor-mode' kicks in.") + +(defun yas--schedule-jit (mode fun) + (push fun (gethash mode yas--scheduled-jit-loads))) + + + +;;; Some user level functions + +(defun yas-about () + (interactive) + (message (concat "yasnippet (version " + yas--version + ") -- pluskid/joaotavora/npostavs"))) + + +;;; Apropos snippet menu: +;; +;; The snippet menu keymaps are store by mode in hash table called +;; `yas--menu-table'. They are linked to the main menu in +;; `yas--menu-keymap-get-create' and are initially created empty, +;; reflecting the table hierarchy. +;; +;; They can be populated in two mutually exclusive ways: (1) by +;; reading `yas--template-group', which in turn is populated by the "# +;; group:" directives of the snippets or the ".yas-make-groups" file +;; or (2) by using a separate `yas-define-menu' call, which declares a +;; menu structure based on snippets uuids. +;; +;; Both situations are handled in `yas--update-template-menu', which +;; uses the predicate `yas--template-menu-managed-by-yas-define-menu' +;; that can tell between the two situations. +;; +;; Note: +;; +;; * if `yas-define-menu' is used it must run before +;; `yas-define-snippets' and the UUIDS must match, otherwise we get +;; duplicate entries. The `yas--template' objects are created in +;; `yas-define-menu', holding nothing but the menu entry, +;; represented by a pair of ((menu-item NAME :keys KEYS) TYPE) and +;; stored in `yas--template-menu-binding-pair'. The (menu-item ...) +;; part is then stored in the menu keymap itself which make the item +;; appear to the user. These limitations could probably be revised. +;; +;; * The `yas--template-perm-group' slot is only used in +;; `yas-describe-tables'. +;; +(defun yas--template-menu-binding-pair-get-create (template &optional type) + "Get TEMPLATE's menu binding or assign it a new one. + +TYPE may be `:stay', signaling this menu binding should be +static in the menu." + (or (yas--template-menu-binding-pair template) + (let (;; (key (yas--template-key template)) + ;; (keybinding (yas--template-keybinding template)) + ) + (setf (yas--template-menu-binding-pair template) + (cons `(menu-item ,(or (yas--template-name template) + (yas--template-uuid template)) + ,(yas--make-menu-binding template) + :keys ,nil) + type))))) +(defun yas--template-menu-managed-by-yas-define-menu (template) + "Non-nil if TEMPLATE's menu entry was included in a `yas-define-menu' call." + (cdr (yas--template-menu-binding-pair template))) + + +(defun yas--show-menu-p (mode) + (cond ((eq yas-use-menu 'abbreviate) + (find mode + (mapcar #'(lambda (table) + (yas--table-mode table)) + (yas--get-snippet-tables)))) + (yas-use-menu t))) + +(defun yas--delete-from-keymap (keymap uuid) + "Recursively delete items with UUID from KEYMAP and its submenus." + + ;; XXX: This used to skip any submenus named \"parent mode\" + ;; + ;; First of all, recursively enter submenus, i.e. the tree is + ;; searched depth first so that stale submenus can be found in the + ;; higher passes. + ;; + (mapc #'(lambda (item) + (when (and (listp (cdr item)) + (keymapp (third (cdr item)))) + (yas--delete-from-keymap (third (cdr item)) uuid))) + (rest keymap)) + ;; Set the uuid entry to nil + ;; + (define-key keymap (vector (make-symbol uuid)) nil) + ;; Destructively modify keymap + ;; + (setcdr keymap (delete-if #'(lambda (item) + (or (null (cdr item)) + (and (keymapp (third (cdr item))) + (null (cdr (third (cdr item))))))) + (rest keymap)))) + +(defun yas-define-menu (mode menu &optional omit-items) + "Define a snippet menu for MODE according to MENU, omitting OMIT-ITEMS. + +MENU is a list, its elements can be: + +- (yas-item UUID) : Creates an entry the snippet identified with + UUID. The menu entry for a snippet thus identified is + permanent, i.e. it will never move (be reordered) in the menu. + +- (yas-separator) : Creates a separator + +- (yas-submenu NAME SUBMENU) : Creates a submenu with NAME, + SUBMENU has the same form as MENU. NAME is also added to the + list of groups of the snippets defined thereafter. + +OMIT-ITEMS is a list of snippet uuid's that will always be +omitted from MODE's menu, even if they're manually loaded." + (let* ((table (yas--table-get-create mode)) + (hash (yas--table-uuidhash table))) + (yas--define-menu-1 table + (yas--menu-keymap-get-create mode) + menu + hash) + (dolist (uuid omit-items) + (let ((template (or (gethash uuid hash) + (puthash uuid + (yas--make-template :table table + :uuid uuid) + hash)))) + (setf (yas--template-menu-binding-pair template) (cons nil :none)))))) + +(defun yas--define-menu-1 (table menu-keymap menu uuidhash &optional group-list) + "Helper for `yas-define-menu'." + (dolist (e (reverse menu)) + (cond ((eq (first e) 'yas-item) + (let ((template (or (gethash (second e) uuidhash) + (puthash (second e) + (yas--make-template + :table table + :perm-group group-list + :uuid (second e)) + uuidhash)))) + (define-key menu-keymap (vector (gensym)) + (car (yas--template-menu-binding-pair-get-create template :stay))))) + ((eq (first e) 'yas-submenu) + (let ((subkeymap (make-sparse-keymap))) + (define-key menu-keymap (vector (gensym)) + `(menu-item ,(second e) ,subkeymap)) + (yas--define-menu-1 table + subkeymap + (third e) + uuidhash + (append group-list (list (second e)))))) + ((eq (first e) 'yas-separator) + (define-key menu-keymap (vector (gensym)) + '(menu-item "----"))) + (t + (yas--message 3 "Don't know anything about menu entry %s" (first e)))))) + +(defun yas--define (mode key template &optional name condition group) + "Define a snippet. Expanding KEY into TEMPLATE. + +NAME is a description to this template. Also update the menu if +`yas-use-menu' is t. CONDITION is the condition attached to +this snippet. If you attach a condition to a snippet, then it +will only be expanded when the condition evaluated to non-nil." + (yas-define-snippets mode + (list (list key template name condition group)))) + +(defun yas-hippie-try-expand (first-time?) + "Integrate with hippie expand. + +Just put this function in `hippie-expand-try-functions-list'." + (when yas-minor-mode + (if (not first-time?) + (let ((yas-fallback-behavior 'return-nil)) + (yas-expand)) + (undo 1) + nil))) + + +;;; Apropos condition-cache: +;;; +;;; +;;; +;;; +(defvar yas--condition-cache-timestamp nil) +(defmacro yas-define-condition-cache (func doc &rest body) + "Define a function FUNC with doc DOC and body BODY. +BODY is executed at most once every snippet expansion attempt, to check +expansion conditions. + +It doesn't make any sense to call FUNC programatically." + `(defun ,func () ,(if (and doc + (stringp doc)) + (concat doc +"\n\nFor use in snippets' conditions. Within each +snippet-expansion routine like `yas-expand', computes actual +value for the first time then always returns a cached value.") + (setq body (cons doc body)) + nil) + (let ((timestamp-and-value (get ',func 'yas--condition-cache))) + (if (equal (car timestamp-and-value) yas--condition-cache-timestamp) + (cdr timestamp-and-value) + (let ((new-value (progn + ,@body + ))) + (put ',func 'yas--condition-cache (cons yas--condition-cache-timestamp new-value)) + new-value))))) + +(defalias 'yas-expand 'yas-expand-from-trigger-key) +(defun yas-expand-from-trigger-key (&optional field) + "Expand a snippet before point. + +If no snippet expansion is possible, fall back to the behaviour +defined in `yas-fallback-behavior'. + +Optional argument FIELD is for non-interactive use and is an +object satisfying `yas--field-p' to restrict the expansion to." + (interactive) + (setq yas--condition-cache-timestamp (current-time)) + (let (templates-and-pos) + (unless (and yas-expand-only-for-last-commands + (not (member last-command yas-expand-only-for-last-commands))) + (setq templates-and-pos (if field + (save-restriction + (narrow-to-region (yas--field-start field) + (yas--field-end field)) + (yas--templates-for-key-at-point)) + (yas--templates-for-key-at-point)))) + (if templates-and-pos + (yas--expand-or-prompt-for-template (first templates-and-pos) + (second templates-and-pos) + (third templates-and-pos)) + (yas--fallback)))) + +(defun yas-expand-from-keymap () + "Directly expand some snippets, searching `yas--direct-keymaps'. + +If expansion fails, execute the previous binding for this key" + (interactive) + (setq yas--condition-cache-timestamp (current-time)) + (let* ((vec (subseq (this-command-keys-vector) (if current-prefix-arg + (length (this-command-keys)) + 0))) + (templates (mapcan #'(lambda (table) + (yas--fetch table vec)) + (yas--get-snippet-tables)))) + (if templates + (yas--expand-or-prompt-for-template templates) + (let ((yas-fallback-behavior 'call-other-command)) + (yas--fallback))))) + +(defun yas--expand-or-prompt-for-template (templates &optional start end) + "Expand one of TEMPLATES from START to END. + +Prompt the user if TEMPLATES has more than one element, else +expand immediately. Common gateway for +`yas-expand-from-trigger-key' and `yas-expand-from-keymap'." + (let ((yas--current-template (or (and (rest templates) ;; more than one + (yas--prompt-for-template (mapcar #'cdr templates))) + (cdar templates)))) + (when yas--current-template + (yas-expand-snippet (yas--template-content yas--current-template) + start + end + (yas--template-expand-env yas--current-template))))) + +;; Apropos the trigger key and the fallback binding: +;; +;; When `yas-minor-mode-map' binds <tab>, that correctly overrides +;; org-mode's <tab>, for example and searching for fallbacks correctly +;; returns `org-cycle'. However, most other modes bind "TAB". TODO, +;; improve this explanation. +;; +(defun yas--fallback () + "Fallback after expansion has failed. + +Common gateway for `yas-expand-from-trigger-key' and +`yas-expand-from-keymap'." + (cond ((eq yas-fallback-behavior 'return-nil) + ;; return nil + nil) + ((eq yas-fallback-behavior 'yas--fallback) + (error (concat "yasnippet fallback loop!\n" + "This can happen when you bind `yas-expand' " + "outside of the `yas-minor-mode-map'."))) + ((eq yas-fallback-behavior 'call-other-command) + (let* ((yas-fallback-behavior 'yas--fallback) + ;; Also bind `yas-minor-mode' to prevent fallback + ;; loops when other extensions use mechanisms similar + ;; to `yas--keybinding-beyond-yasnippet'. (github #525 + ;; and #526) + ;; + (yas-minor-mode nil) + (beyond-yasnippet (yas--keybinding-beyond-yasnippet))) + (yas--message 4 "Falling back to %s" beyond-yasnippet) + (assert (or (null beyond-yasnippet) (commandp beyond-yasnippet))) + (setq this-command beyond-yasnippet) + (when beyond-yasnippet + (call-interactively beyond-yasnippet)))) + ((and (listp yas-fallback-behavior) + (cdr yas-fallback-behavior) + (eq 'apply (car yas-fallback-behavior))) + (let ((command-or-fn (cadr yas-fallback-behavior)) + (args (cddr yas-fallback-behavior)) + (yas-fallback-behavior 'yas--fallback) + (yas-minor-mode nil)) + (if args + (apply command-or-fn args) + (when (commandp command-or-fn) + (setq this-command command-or-fn) + (call-interactively command-or-fn))))) + (t + ;; also return nil if all the other fallbacks have failed + nil))) + +(defun yas--keybinding-beyond-yasnippet () + "Get current keys's binding as if YASsnippet didn't exist." + (let* ((yas-minor-mode nil) + (yas--direct-keymaps nil) + (keys (this-single-command-keys))) + (or (key-binding keys t) + (key-binding (yas--fallback-translate-input keys) t)))) + +(defun yas--fallback-translate-input (keys) + "Emulate `read-key-sequence', at least what I think it does. + +Keys should be an untranslated key vector. Returns a translated +vector of keys. FIXME not thoroughly tested." + (let ((retval []) + (i 0)) + (while (< i (length keys)) + (let ((j i) + (translated local-function-key-map)) + (while (and (< j (length keys)) + translated + (keymapp translated)) + (setq translated (cdr (assoc (aref keys j) (remove 'keymap translated))) + j (1+ j))) + (setq retval (vconcat retval (cond ((symbolp translated) + `[,translated]) + ((vectorp translated) + translated) + (t + (substring keys i j))))) + (setq i j))) + retval)) + + +;;; Utils for snippet development: + +(defun yas--all-templates (tables) + "Get `yas--template' objects in TABLES, applicable for buffer and point. + +Honours `yas-choose-tables-first', `yas-choose-keys-first' and +`yas-buffer-local-condition'" + (when yas-choose-tables-first + (setq tables (list (yas--prompt-for-table tables)))) + (mapcar #'cdr + (if yas-choose-keys-first + (let ((key (yas--prompt-for-keys + (mapcan #'yas--table-all-keys tables)))) + (when key + (mapcan #'(lambda (table) + (yas--fetch table key)) + tables))) + (remove-duplicates (mapcan #'yas--table-templates tables) + :test #'equal)))) + +(defun yas--lookup-snippet-1 (name mode) + "Get the snippet called NAME in MODE's tables." + (let ((yas-choose-tables-first nil) ; avoid prompts + (yas-choose-keys-first nil)) + (cl-find name (yas--all-templates + (yas--get-snippet-tables mode)) + :key #'yas--template-name :test #'string=))) + +(defun yas-lookup-snippet (name &optional mode noerror) + "Get the snippet content for the snippet NAME in MODE's tables. + +MODE defaults to the current buffer's `major-mode'. If NOERROR +is non-nil, then don't signal an error if there isn't any snippet +called NAME. + +Honours `yas-buffer-local-condition'." + (let ((snippet (yas--lookup-snippet-1 name mode))) + (cond + (snippet (yas--template-content snippet)) + (noerror nil) + (t (error "No snippet named: %s" name))))) + +(defun yas-insert-snippet (&optional no-condition) + "Choose a snippet to expand, pop-up a list of choices according +to `yas-prompt-functions'. + +With prefix argument NO-CONDITION, bypass filtering of snippets +by condition." + (interactive "P") + (setq yas--condition-cache-timestamp (current-time)) + (let* ((yas-buffer-local-condition (or (and no-condition + 'always) + yas-buffer-local-condition)) + (templates (yas--all-templates (yas--get-snippet-tables))) + (yas--current-template (and templates + (or (and (rest templates) ;; more than one template for same key + (yas--prompt-for-template templates)) + (car templates)))) + (where (if (region-active-p) + (cons (region-beginning) (region-end)) + (cons (point) (point))))) + (if yas--current-template + (yas-expand-snippet (yas--template-content yas--current-template) + (car where) + (cdr where) + (yas--template-expand-env yas--current-template)) + (yas--message 3 "No snippets can be inserted here!")))) + +(defun yas-visit-snippet-file () + "Choose a snippet to edit, selection like `yas-insert-snippet'. + +Only success if selected snippet was loaded from a file. Put the +visited file in `snippet-mode'." + (interactive) + (let* ((yas-buffer-local-condition 'always) + (templates (yas--all-templates (yas--get-snippet-tables))) + (template (and templates + (or (yas--prompt-for-template templates + "Choose a snippet template to edit: ") + (car templates))))) + + (if template + (yas--visit-snippet-file-1 template) + (message "No snippets tables active!")))) + +(defun yas--visit-snippet-file-1 (template) + "Helper for `yas-visit-snippet-file'." + (let ((file (yas--template-get-file template))) + (cond ((and file (file-readable-p file)) + (find-file-other-window file) + (snippet-mode) + (set (make-local-variable 'yas--editing-template) template)) + (file + (message "Original file %s no longer exists!" file)) + (t + (switch-to-buffer (format "*%s*"(yas--template-name template))) + (let ((type 'snippet)) + (when (listp (yas--template-content template)) + (insert (format "# type: command\n")) + (setq type 'command)) + (insert (format "# key: %s\n" (yas--template-key template))) + (insert (format "# name: %s\n" (yas--template-name template))) + (when (yas--template-keybinding template) + (insert (format "# binding: %s\n" (yas--template-keybinding template)))) + (when (yas--template-expand-env template) + (insert (format "# expand-env: %s\n" (yas--template-expand-env template)))) + (when (yas--template-condition template) + (insert (format "# condition: %s\n" (yas--template-condition template)))) + (insert "# --\n") + (insert (if (eq type 'command) + (pp-to-string (yas--template-content template)) + (yas--template-content template)))) + (snippet-mode) + (set (make-local-variable 'yas--editing-template) template))))) + +(defun yas--guess-snippet-directories-1 (table) + "Guess possible snippet subdirectories for TABLE." + (cons (yas--table-name table) + (mapcan #'(lambda (parent) + (yas--guess-snippet-directories-1 + parent)) + (yas--table-parents table)))) + +(defun yas--guess-snippet-directories (&optional table) + "Try to guess suitable directories based on the current active +tables (or optional TABLE). + +Returns a list of elements (TABLE . DIRS) where TABLE is a +`yas--table' object and DIRS is a list of all possible directories +where snippets of table might exist." + (let ((main-dir (replace-regexp-in-string + "/+$" "" + (or (first (or (yas-snippet-dirs) + (setq yas-snippet-dirs (list yas--default-user-snippets-dir))))))) + (tables (or (and table + (list table)) + (yas--get-snippet-tables)))) + ;; HACK! the snippet table created here is actually registered! + ;; + (unless (or table (gethash major-mode yas--tables)) + (push (yas--table-get-create major-mode) + tables)) + + (mapcar #'(lambda (table) + (cons table + (mapcar #'(lambda (subdir) + (concat main-dir "/" subdir)) + (yas--guess-snippet-directories-1 table)))) + tables))) + +(defun yas--make-directory-maybe (table-and-dirs &optional main-table-string) + "Return a dir inside TABLE-AND-DIRS, prompts for creation if none exists." + (or (some #'(lambda (dir) (when (file-directory-p dir) dir)) (cdr table-and-dirs)) + (let ((candidate (first (cdr table-and-dirs)))) + (unless (file-writable-p (file-name-directory candidate)) + (error (yas--format "%s is not writable." candidate))) + (if (y-or-n-p (format "Guessed directory (%s) for%s%s table \"%s\" does not exist! Create? " + candidate + (if (gethash (yas--table-mode (car table-and-dirs)) + yas--tables) + "" + " brand new") + (or main-table-string + "") + (yas--table-name (car table-and-dirs)))) + (progn + (make-directory candidate 'also-make-parents) + ;; create the .yas-parents file here... + candidate))))) + +(defun yas-new-snippet (&optional no-template) + "Pops a new buffer for writing a snippet. + +Expands a snippet-writing snippet, unless the optional prefix arg +NO-TEMPLATE is non-nil." + (interactive "P") + (let ((guessed-directories (yas--guess-snippet-directories))) + + (switch-to-buffer "*new snippet*") + (erase-buffer) + (kill-all-local-variables) + (snippet-mode) + (yas-minor-mode 1) + (set (make-local-variable 'yas--guessed-modes) (mapcar #'(lambda (d) + (yas--table-mode (car d))) + guessed-directories)) + (if (and (not no-template) yas-new-snippet-default) + (yas-expand-snippet yas-new-snippet-default)))) + +(defun yas--compute-major-mode-and-parents (file) + "Given FILE, find the nearest snippet directory for a given mode. + +Returns a list (MODE-SYM PARENTS), the mode's symbol and a list +representing one or more of the mode's parents. + +Note that MODE-SYM need not be the symbol of a real major mode, +neither do the elements of PARENTS." + (let* ((file-dir (and file + (directory-file-name (or (some #'(lambda (special) + (locate-dominating-file file special)) + '(".yas-setup.el" + ".yas-make-groups" + ".yas-parents")) + (directory-file-name (file-name-directory file)))))) + (parents-file-name (concat file-dir "/.yas-parents")) + (major-mode-name (and file-dir + (file-name-nondirectory file-dir))) + (major-mode-sym (or (and major-mode-name + (intern major-mode-name)))) + (parents (when (file-readable-p parents-file-name) + (mapcar #'intern + (split-string + (with-temp-buffer + (insert-file-contents parents-file-name) + (buffer-substring-no-properties (point-min) + (point-max)))))))) + (when major-mode-sym + (cons major-mode-sym (remove major-mode-sym parents))))) + +(defvar yas--editing-template nil + "Supporting variable for `yas-load-snippet-buffer' and `yas--visit-snippet'.") + +(defvar yas--current-template nil + "Holds the current template being expanded into a snippet.") + +(defvar yas--guessed-modes nil + "List of guessed modes supporting `yas-load-snippet-buffer'.") + +(defun yas--read-table () + "Ask user for a snippet table, help with some guessing." + (let ((prompt (if (and (featurep 'ido) + ido-mode) + 'ido-completing-read 'completing-read))) + (unless yas--guessed-modes + (set (make-local-variable 'yas--guessed-modes) + (or (yas--compute-major-mode-and-parents buffer-file-name)))) + (intern + (funcall prompt (format "Choose or enter a table (yas guesses %s): " + (if yas--guessed-modes + (first yas--guessed-modes) + "nothing")) + (mapcar #'symbol-name yas--guessed-modes) + nil + nil + nil + nil + (if (first yas--guessed-modes) + (symbol-name (first yas--guessed-modes))))))) + +(defun yas-load-snippet-buffer (table &optional interactive) + "Parse and load current buffer's snippet definition into TABLE. + +TABLE is a symbol naming a passed to `yas--table-get-create'. + +When called interactively, prompt for the table name." + (interactive (list (yas--read-table) t)) + (cond + ;; We have `yas--editing-template', this buffer's content comes from a + ;; template which is already loaded and neatly positioned,... + ;; + (yas--editing-template + (yas--define-snippets-1 (yas--parse-template (yas--template-load-file yas--editing-template)) + (yas--template-table yas--editing-template))) + ;; Try to use `yas--guessed-modes'. If we don't have that use the + ;; value from `yas--compute-major-mode-and-parents' + ;; + (t + (unless yas--guessed-modes + (set (make-local-variable 'yas--guessed-modes) (or (yas--compute-major-mode-and-parents buffer-file-name)))) + (let* ((table (yas--table-get-create table))) + (set (make-local-variable 'yas--editing-template) + (yas--define-snippets-1 (yas--parse-template buffer-file-name) + table))))) + (when interactive + (yas--message 3 "Snippet \"%s\" loaded for %s." + (yas--template-name yas--editing-template) + (yas--table-name (yas--template-table yas--editing-template))))) + +(defun yas-load-snippet-buffer-and-close (table &optional kill) + "Load the snippet with `yas-load-snippet-buffer', possibly + save, then `quit-window' if saved. + +If the snippet is new, ask the user whether (and where) to save +it. If the snippet already has a file, just save it. + +The prefix argument KILL is passed to `quit-window'. + +Don't use this from a Lisp program, call `yas-load-snippet-buffer' +and `kill-buffer' instead." + (interactive (list (yas--read-table) current-prefix-arg)) + (yas-load-snippet-buffer table t) + (let ((file (yas--template-get-file yas--editing-template))) + (when (and (or + ;; Only offer to save this if it looks like a library or new + ;; snippet (loaded from elisp, from a dir in `yas-snippet-dirs' + ;; which is not the first, or from an unwritable file) + ;; + (not file) + (not (file-writable-p file)) + (and (cdr-safe yas-snippet-dirs) + (not (string-prefix-p (expand-file-name (car yas-snippet-dirs)) file)))) + (y-or-n-p (yas--format "Looks like a library or new snippet. Save to new file? "))) + (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 (concat chosen "/" + (read-from-minibuffer (format "File name to create in %s? " chosen) + default-file-name))) + (setf (yas--template-load-file yas--editing-template) buffer-file-name)))))) + (when buffer-file-name + (save-buffer) + (quit-window kill))) + +(defun yas-tryout-snippet (&optional debug) + "Test current buffer's snippet template in other buffer." + (interactive "P") + (let* ((major-mode-and-parent (yas--compute-major-mode-and-parents buffer-file-name)) + (parsed (yas--parse-template)) + (test-mode (or (and (car major-mode-and-parent) + (fboundp (car major-mode-and-parent)) + (car major-mode-and-parent)) + (first yas--guessed-modes) + (intern (read-from-minibuffer (yas--format "Please input a mode: "))))) + (yas--current-template + (and parsed + (fboundp test-mode) + (yas--make-template :table nil ;; no tables for ephemeral snippets + :key (first parsed) + :content (second parsed) + :name (third parsed) + :expand-env (sixth parsed))))) + (cond (yas--current-template + (let ((buffer-name (format "*testing snippet: %s*" (yas--template-name yas--current-template)))) + (kill-buffer (get-buffer-create buffer-name)) + (switch-to-buffer (get-buffer-create buffer-name)) + (setq buffer-undo-list nil) + (condition-case nil (funcall test-mode) (error nil)) + (yas-minor-mode 1) + (setq buffer-read-only nil) + (yas-expand-snippet (yas--template-content yas--current-template) + (point-min) + (point-max) + (yas--template-expand-env yas--current-template)) + (when (and debug + (require 'yasnippet-debug nil t)) + (add-hook 'post-command-hook 'yas-debug-snippet-vars nil t)))) + (t + (yas--message 3 "Cannot test snippet for unknown major mode"))))) + +(defun yas-active-keys () + "Return all active trigger keys for current buffer and point." + (remove-duplicates + (remove-if-not #'stringp (mapcan #'yas--table-all-keys (yas--get-snippet-tables))) + :test #'string=)) + +(defun yas--template-fine-group (template) + (car (last (or (yas--template-group template) + (yas--template-perm-group template))))) + +(defun yas-describe-tables (&optional choose) + "Display snippets for each table." + (interactive "P") + (let* ((by-name-hash (and choose + (y-or-n-p "Show by namehash? "))) + (buffer (get-buffer-create "*YASnippet tables*")) + (active-tables (yas--get-snippet-tables)) + (remain-tables (let ((all)) + (maphash #'(lambda (_k v) + (unless (find v active-tables) + (push v all))) + yas--tables) + all)) + (table-lists (list active-tables remain-tables)) + (original-buffer (current-buffer)) + (continue t) + (yas--condition-cache-timestamp (current-time))) + (with-current-buffer buffer + (setq buffer-read-only nil) + (erase-buffer) + (cond ((not by-name-hash) + (insert "YASnippet tables:\n") + (while (and table-lists + continue) + (dolist (table (car table-lists)) + (yas--describe-pretty-table table original-buffer)) + (setq table-lists (cdr table-lists)) + (when table-lists + (yas--create-snippet-xrefs) + (display-buffer buffer) + (setq continue (and choose (y-or-n-p "Show also non-active tables? "))))) + (yas--create-snippet-xrefs) + (help-mode) + (goto-char 1)) + (t + (insert "\n\nYASnippet tables by NAMEHASH: \n") + (dolist (table (append active-tables remain-tables)) + (insert (format "\nSnippet table `%s':\n\n" (yas--table-name table))) + (let ((keys)) + (maphash #'(lambda (k _v) + (push k keys)) + (yas--table-hash table)) + (dolist (key keys) + (insert (format " key %s maps snippets: %s\n" key + (let ((names)) + (maphash #'(lambda (k _v) + (push k names)) + (gethash key (yas--table-hash table))) + names)))))))) + (goto-char 1) + (setq buffer-read-only t)) + (display-buffer buffer))) + +(defun yas--describe-pretty-table (table &optional original-buffer) + (insert (format "\nSnippet table `%s'" + (yas--table-name table))) + (if (yas--table-parents table) + (insert (format " parents: %s\n" + (mapcar #'yas--table-name + (yas--table-parents table)))) + (insert "\n")) + (insert (make-string 100 ?-) "\n") + (insert "group state name key binding\n") + (let ((groups-hash (make-hash-table :test #'equal))) + (maphash #'(lambda (_k v) + (let ((group (or (yas--template-fine-group v) + "(top level)"))) + (when (yas--template-name v) + (puthash group + (cons v (gethash group groups-hash)) + groups-hash)))) + (yas--table-uuidhash table)) + (maphash + #'(lambda (group templates) + (setq group (truncate-string-to-width group 25 0 ? "...")) + (insert (make-string 100 ?-) "\n") + (dolist (p templates) + (let* ((name (truncate-string-to-width (propertize (format "\\\\snippet `%s'" (yas--template-name p)) + 'yasnippet p) + 50 0 ? "...")) + (group (prog1 group + (setq group (make-string (length group) ? )))) + (condition-string (let ((condition (yas--template-condition p))) + (if (and condition + original-buffer) + (with-current-buffer original-buffer + (if (yas--eval-condition condition) + "(y)" + "(s)")) + "(a)"))) + (key-description-string (key-description (yas--template-keybinding p))) + (template-key-padding (if (string= key-description-string "") nil ? ))) + (insert group " " + condition-string " " + name (if (string-match "\\.\\.\\.$" name) + "'" " ") + " " + (truncate-string-to-width (or (yas--template-key p) "") + 15 0 template-key-padding "...") + (or template-key-padding "") + (truncate-string-to-width key-description-string + 15 0 nil "...") + "\n")))) + groups-hash))) + + + +;;; User convenience functions, for using in `yas-key-syntaxes' + +(defun yas-try-key-from-whitespace (_start-point) + "As `yas-key-syntaxes' element, look for whitespace delimited key. + +A newline will be considered whitespace even if the mode syntax +marks it as something else (typically comment ender)." + (skip-chars-backward "^[:space:]\n")) + +(defun yas-shortest-key-until-whitespace (_start-point) + "Like `yas-longest-key-from-whitespace' but take the shortest key." + (when (/= (skip-chars-backward "^[:space:]\n" (1- (point))) 0) + 'again)) + +(defun yas-longest-key-from-whitespace (start-point) + "As `yas-key-syntaxes' element, look for longest key between point and whitespace. + +A newline will be considered whitespace even if the mode syntax +marks it as something else (typically comment ender)." + (if (= (point) start-point) + (yas-try-key-from-whitespace start-point) + (forward-char)) + (unless (<= start-point (1+ (point))) + 'again)) + + + +;;; User convenience functions, for using in snippet definitions + +(defvar yas-modified-p nil + "Non-nil if field has been modified by user or transformation.") + +(defvar yas-moving-away-p nil + "Non-nil if user is about to exit field.") + +(defvar yas-text nil + "Contains current field text.") + +(defun yas-substr (str pattern &optional subexp) + "Search PATTERN in STR and return SUBEXPth match. + +If found, the content of subexp group SUBEXP (default 0) is + returned, or else the original STR will be returned." + (let ((grp (or subexp 0))) + (save-match-data + (if (string-match pattern str) + (match-string-no-properties grp str) + str)))) + +(defun yas-choose-value (&rest possibilities) + "Prompt for a string in POSSIBILITIES and return it. + +The last element of POSSIBILITIES may be a list of strings." + (unless (or yas-moving-away-p + yas-modified-p) + (let* ((last-link (last possibilities)) + (last-elem (car last-link))) + (when (listp last-elem) + (setcar last-link (car last-elem)) + (setcdr last-link (cdr last-elem)))) + (some #'(lambda (fn) + (funcall fn "Choose: " possibilities)) + yas-prompt-functions))) + +(defun yas-key-to-value (alist) + (unless (or yas-moving-away-p + yas-modified-p) + (let ((key (read-key-sequence ""))) + (when (stringp key) + (or (cdr (find key alist :key #'car :test #'string=)) + key))))) + +(defun yas-throw (text) + "Throw a yas--exception with TEXT as the reason." + (throw 'yas--exception (cons 'yas--exception text))) + +(defun yas-verify-value (possibilities) + "Verify that the current field value is in POSSIBILITIES. + +Otherwise throw exception." + (when (and yas-moving-away-p (notany #'(lambda (pos) (string= pos yas-text)) possibilities)) + (yas-throw (yas--format "Field only allows %s" possibilities)))) + +(defun yas-field-value (number) + "Get the string for field with NUMBER. + +Use this in primary and mirror transformations to tget." + (let* ((snippet (car (yas--snippets-at-point))) + (field (and snippet + (yas--snippet-find-field snippet number)))) + (when field + (yas--field-text-for-display field)))) + +(defun yas-text () + "Return `yas-text' if that exists and is non-empty, else nil." + (if (and yas-text + (not (string= "" yas-text))) + yas-text)) + +(defun yas-selected-text () + "Return `yas-selected-text' if that exists and is non-empty, else nil." + (if (and yas-selected-text + (not (string= "" yas-selected-text))) + yas-selected-text)) + +(defun yas--get-field-once (number &optional transform-fn) + (unless yas-modified-p + (if transform-fn + (funcall transform-fn (yas-field-value number)) + (yas-field-value number)))) + +(defun yas-default-from-field (number) + (unless yas-modified-p + (yas-field-value number))) + +(defun yas-inside-string () + "Return non-nil if the point is inside a string according to font-lock." + (equal 'font-lock-string-face (get-char-property (1- (point)) 'face))) + +(defun yas-unimplemented (&optional missing-feature) + (if yas--current-template + (if (y-or-n-p (format "This snippet is unimplemented (missing %s) Visit the snippet definition? " + (or missing-feature + "something"))) + (yas--visit-snippet-file-1 yas--current-template)) + (message "No implementation. Missing %s" (or missing-feature "something")))) + + +;;; Snippet expansion and field management + +(defvar yas--active-field-overlay nil + "Overlays the currently active field.") + +(defvar yas--field-protection-overlays nil + "Two overlays protect the current active field.") + +(defvar yas-selected-text nil + "The selected region deleted on the last snippet expansion.") + +(defvar yas--start-column nil + "The column where the snippet expansion started.") + +(make-variable-buffer-local 'yas--active-field-overlay) +(make-variable-buffer-local 'yas--field-protection-overlays) +(put 'yas--active-field-overlay 'permanent-local t) +(put 'yas--field-protection-overlays 'permanent-local t) + +(defstruct (yas--snippet (:constructor yas--make-snippet ())) + "A snippet. + +..." + (fields '()) + (exit nil) + (id (yas--snippet-next-id) :read-only t) + (control-overlay nil) + active-field + ;; stacked expansion: the `previous-active-field' slot saves the + ;; active field where the child expansion took place + previous-active-field + force-exit) + +(defstruct (yas--field (:constructor yas--make-field (number start end parent-field))) + "A field. + +NUMBER is the field number. +START and END are mostly buffer markers, but see \"apropos markers-to-points\". +PARENT-FIELD is a `yas--field' this field is nested under, or nil. +MIRRORS is a list of `yas--mirror's +TRANSFORM is a lisp form. +MODIFIED-P is a boolean set to true once user inputs text. +NEXT is another `yas--field' or `yas--mirror' or `yas--exit'. +" + number + start end + parent-field + (mirrors '()) + (transform nil) + (modified-p nil) + next) + + +(defstruct (yas--mirror (:constructor yas--make-mirror (start end transform))) + "A mirror. + +START and END are mostly buffer markers, but see \"apropos markers-to-points\". +TRANSFORM is a lisp form. +PARENT-FIELD is a `yas--field' this mirror is nested under, or nil. +NEXT is another `yas--field' or `yas--mirror' or `yas--exit' +DEPTH is a count of how many nested mirrors can affect this mirror" + start end + (transform nil) + parent-field + next + depth) + +(defstruct (yas--exit (:constructor yas--make-exit (marker))) + marker + next) + +(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p) + "Calculate transformed string for FIELD-OR-MIRROR from FIELD. + +If there is no transform for ht field, return nil. + +If there is a transform but it returns nil, return the empty +string iff EMPTY-ON-NIL-P is true." + (let* ((yas-text (yas--field-text-for-display field)) + (yas-modified-p (yas--field-modified-p field)) + (yas-moving-away-p nil) + (transform (if (yas--mirror-p field-or-mirror) + (yas--mirror-transform field-or-mirror) + (yas--field-transform field-or-mirror))) + (start-point (if (yas--mirror-p field-or-mirror) + (yas--mirror-start field-or-mirror) + (yas--field-start field-or-mirror))) + (transformed (and transform + (save-excursion + (goto-char start-point) + (let ((ret (yas--eval-lisp transform))) + (or ret (and empty-on-nil-p ""))))))) + transformed)) + +(defsubst yas--replace-all (from to &optional text) + "Replace all occurrences from FROM to TO. + +With optional string TEXT do it in that string." + (if text + (replace-regexp-in-string (regexp-quote from) to text t t) + (goto-char (point-min)) + (while (search-forward from nil t) + (replace-match to t t text)))) + +(defun yas--snippet-find-field (snippet number) + (find-if #'(lambda (field) + (eq number (yas--field-number field))) + (yas--snippet-fields snippet))) + +(defun yas--snippet-sort-fields (snippet) + "Sort the fields of SNIPPET in navigation order." + (setf (yas--snippet-fields snippet) + (sort (yas--snippet-fields snippet) + #'yas--snippet-field-compare))) + +(defun yas--snippet-field-compare (field1 field2) + "Compare FIELD1 and FIELD2. + +The field with a number is sorted first. If they both have a +number, compare through the number. If neither have, compare +through the field's start point" + (let ((n1 (yas--field-number field1)) + (n2 (yas--field-number field2))) + (if n1 + (if n2 + (or (zerop n2) (and (not (zerop n1)) + (< n1 n2))) + (not (zerop n1))) + (if n2 + (zerop n2) + (< (yas--field-start field1) + (yas--field-start field2)))))) + +(defun yas--field-probably-deleted-p (snippet field) + "Guess if SNIPPET's FIELD should be skipped." + (and + ;; field must be zero length + ;; + (zerop (- (yas--field-start field) (yas--field-end field))) + ;; field must have been modified + ;; + (yas--field-modified-p field) + ;; either: + (or + ;; 1) it's a nested field + ;; + (yas--field-parent-field field) + ;; 2) ends just before the snippet end + ;; + (and (eq field (car (last (yas--snippet-fields snippet)))) + (= (yas--field-start field) (overlay-end (yas--snippet-control-overlay snippet))))) + ;; the field numbered 0, just before the exit marker, should + ;; never be skipped + ;; + (not (and (yas--field-number field) + (zerop (yas--field-number field)))))) + +(defun yas--snippets-at-point (&optional all-snippets) + "Return a sorted list of snippets at point. + +The most recently-inserted snippets are returned first." + (sort + (delq nil (delete-dups + (mapcar (lambda (ov) (overlay-get ov 'yas--snippet)) + (if all-snippets (overlays-in (point-min) (point-max)) + (nconc (overlays-at (point)) + (overlays-at (1- (point)))))))) + #'(lambda (s1 s2) + (<= (yas--snippet-id s2) (yas--snippet-id s1))))) + +(defun yas-next-field-or-maybe-expand () + "Try to expand a snippet at a key before point. + +Otherwise delegate to `yas-next-field'." + (interactive) + (if yas-triggers-in-field + (let ((yas-fallback-behavior 'return-nil) + (active-field (overlay-get yas--active-field-overlay 'yas--field))) + (when active-field + (unless (yas-expand-from-trigger-key active-field) + (yas-next-field)))) + (yas-next-field))) + +(defun yas-next-field (&optional arg) + "Navigate to the ARGth next field. + +If there's none, exit the snippet." + (interactive) + (let* ((arg (or arg + 1)) + (snippet (first (yas--snippets-at-point))) + (active-field (overlay-get yas--active-field-overlay 'yas--field)) + (live-fields (remove-if #'(lambda (field) + (and (not (eq field active-field)) + (yas--field-probably-deleted-p snippet field))) + (yas--snippet-fields snippet))) + (active-field-pos (position active-field live-fields)) + (target-pos (and active-field-pos (+ arg active-field-pos))) + (target-field (and target-pos (nth target-pos live-fields)))) + ;; First check if we're moving out of a field with a transform + ;; + (when (and active-field + (yas--field-transform active-field)) + (let* ((yas-moving-away-p t) + (yas-text (yas--field-text-for-display active-field)) + (yas-modified-p (yas--field-modified-p active-field))) + ;; primary field transform: exit call to field-transform + (yas--eval-lisp (yas--field-transform active-field)))) + ;; Now actually move... + (cond ((and target-pos (>= target-pos (length live-fields))) + (yas-exit-snippet snippet)) + (target-field + (yas--move-to-field snippet target-field)) + (t + nil)))) + +(defun yas--place-overlays (snippet field) + "Correctly place overlays for SNIPPET's FIELD." + (yas--make-move-field-protection-overlays snippet field) + (yas--make-move-active-field-overlay snippet field)) + +(defun yas--move-to-field (snippet field) + "Update SNIPPET to move to field FIELD. + +Also create some protection overlays" + (goto-char (yas--field-start field)) + (yas--place-overlays snippet field) + (overlay-put yas--active-field-overlay 'yas--field field) + (let ((number (yas--field-number field))) + ;; check for the special ${0: ...} field + (if (and number (zerop number)) + (progn + (set-mark (yas--field-end field)) + (setf (yas--snippet-force-exit snippet) + (or (yas--field-transform field) + t))) + ;; make this field active + (setf (yas--snippet-active-field snippet) field) + ;; primary field transform: first call to snippet transform + (unless (yas--field-modified-p field) + (if (yas--field-update-display field) + (yas--update-mirrors snippet) + (setf (yas--field-modified-p field) nil)))))) + +(defun yas-prev-field () + "Navigate to prev field. If there's none, exit the snippet." + (interactive) + (yas-next-field -1)) + +(defun yas-abort-snippet (&optional snippet) + (interactive) + (let ((snippet (or snippet + (car (yas--snippets-at-point))))) + (when snippet + (setf (yas--snippet-force-exit snippet) t)))) + +(defun yas-exit-snippet (snippet) + "Goto exit-marker of SNIPPET." + (interactive (list (first (yas--snippets-at-point)))) + (when snippet + (setf (yas--snippet-force-exit snippet) t) + (goto-char (if (yas--snippet-exit snippet) + (yas--exit-marker (yas--snippet-exit snippet)) + (overlay-end (yas--snippet-control-overlay snippet)))))) + +(defun yas-exit-all-snippets () + "Exit all snippets." + (interactive) + (mapc #'(lambda (snippet) + (yas-exit-snippet snippet) + (yas--check-commit-snippet)) + (yas--snippets-at-point 'all-snippets))) + + +;;; Some low level snippet-routines: + +(defvar yas--inhibit-overlay-hooks nil + "Bind this temporarily to non-nil to prevent running `yas--on-*-modification'.") + +(defvar yas-snippet-beg nil "Beginning position of the last snippet committed.") +(defvar yas-snippet-end nil "End position of the last snippet committed.") + +(defun yas--commit-snippet (snippet) + "Commit SNIPPET, but leave point as it is. + +This renders the snippet as ordinary text." + + (let ((control-overlay (yas--snippet-control-overlay snippet))) + ;; + ;; Save the end of the moribund snippet in case we need to revive it + ;; its original expansion. + ;; + (when (and control-overlay + (overlay-buffer control-overlay)) + (setq yas-snippet-beg (overlay-start control-overlay)) + (setq yas-snippet-end (overlay-end control-overlay)) + (delete-overlay control-overlay)) + + (let ((yas--inhibit-overlay-hooks t)) + (when yas--active-field-overlay + (delete-overlay yas--active-field-overlay)) + (when yas--field-protection-overlays + (mapc #'delete-overlay yas--field-protection-overlays))) + + ;; stacked expansion: if the original expansion took place from a + ;; field, make sure we advance it here at least to + ;; `yas-snippet-end'... + ;; + (let ((previous-field (yas--snippet-previous-active-field snippet))) + (when (and yas-snippet-end previous-field) + (yas--advance-end-maybe previous-field yas-snippet-end))) + + ;; Convert all markers to points, + ;; + (yas--markers-to-points snippet) + + ;; Take care of snippet revival + ;; + (if yas-snippet-revival + (push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end ,snippet) + buffer-undo-list) + ;; Dismember the snippet... this is useful if we get called + ;; again from `yas--take-care-of-redo'.... + (setf (yas--snippet-fields snippet) nil))) + + (yas--message 3 "Snippet %s exited." (yas--snippet-id snippet))) + +(defun yas--safely-run-hooks (hook-var) + (condition-case error + (run-hooks hook-var) + (error + (yas--message 3 "%s error: %s" hook-var (error-message-string error))))) + + +(defun yas--check-commit-snippet () + "Check if point exited the currently active field of the snippet. + +If so cleans up the whole snippet up." + (let* ((snippets (yas--snippets-at-point 'all-snippets)) + (snippets-left snippets) + (snippet-exit-transform)) + (dolist (snippet snippets) + (let ((active-field (yas--snippet-active-field snippet))) + (setq snippet-exit-transform (yas--snippet-force-exit snippet)) + (cond ((or snippet-exit-transform + (not (and active-field (yas--field-contains-point-p active-field)))) + (setq snippets-left (delete snippet snippets-left)) + (setf (yas--snippet-force-exit snippet) nil) + (yas--commit-snippet snippet)) + ((and active-field + (or (not yas--active-field-overlay) + (not (overlay-buffer yas--active-field-overlay)))) + ;; + ;; stacked expansion: this case is mainly for recent + ;; snippet exits that place us back int the field of + ;; another snippet + ;; + (save-excursion + (yas--move-to-field snippet active-field) + (yas--update-mirrors snippet))) + (t + nil)))) + (unless (or (null snippets) snippets-left) + (if snippet-exit-transform + (yas--eval-lisp-no-saves snippet-exit-transform)) + (yas--safely-run-hooks 'yas-after-exit-snippet-hook)))) + +;; Apropos markers-to-points: +;; +;; This was found useful for performance reasons, so that an +;; excessive number of live markers aren't kept around in the +;; `buffer-undo-list'. However, in `markers-to-points', the +;; set-to-nil markers can't simply be discarded and replaced with +;; fresh ones in `points-to-markers'. The original marker that was +;; just set to nil has to be reused. +;; +;; This shouldn't bring horrible problems with undo/redo, but it +;; you never know +;; +(defun yas--markers-to-points (snippet) + "Convert all markers in SNIPPET to a cons (POINT . MARKER) +where POINT is the original position of the marker and MARKER is +the original marker object with the position set to nil." + (dolist (field (yas--snippet-fields snippet)) + (let ((start (marker-position (yas--field-start field))) + (end (marker-position (yas--field-end field)))) + (set-marker (yas--field-start field) nil) + (set-marker (yas--field-end field) nil) + (setf (yas--field-start field) (cons start (yas--field-start field))) + (setf (yas--field-end field) (cons end (yas--field-end field)))) + (dolist (mirror (yas--field-mirrors field)) + (let ((start (marker-position (yas--mirror-start mirror))) + (end (marker-position (yas--mirror-end mirror)))) + (set-marker (yas--mirror-start mirror) nil) + (set-marker (yas--mirror-end mirror) nil) + (setf (yas--mirror-start mirror) (cons start (yas--mirror-start mirror))) + (setf (yas--mirror-end mirror) (cons end (yas--mirror-end mirror)))))) + (let ((snippet-exit (yas--snippet-exit snippet))) + (when snippet-exit + (let ((exit (marker-position (yas--exit-marker snippet-exit)))) + (set-marker (yas--exit-marker snippet-exit) nil) + (setf (yas--exit-marker snippet-exit) (cons exit (yas--exit-marker snippet-exit))))))) + +(defun yas--points-to-markers (snippet) + "Convert all cons (POINT . MARKER) in SNIPPET to markers. + +This is done by setting MARKER to POINT with `set-marker'." + (dolist (field (yas--snippet-fields snippet)) + (setf (yas--field-start field) (set-marker (cdr (yas--field-start field)) + (car (yas--field-start field)))) + (setf (yas--field-end field) (set-marker (cdr (yas--field-end field)) + (car (yas--field-end field)))) + (dolist (mirror (yas--field-mirrors field)) + (setf (yas--mirror-start mirror) (set-marker (cdr (yas--mirror-start mirror)) + (car (yas--mirror-start mirror)))) + (setf (yas--mirror-end mirror) (set-marker (cdr (yas--mirror-end mirror)) + (car (yas--mirror-end mirror)))))) + (let ((snippet-exit (yas--snippet-exit snippet))) + (when snippet-exit + (setf (yas--exit-marker snippet-exit) (set-marker (cdr (yas--exit-marker snippet-exit)) + (car (yas--exit-marker snippet-exit))))))) + +(defun yas--field-contains-point-p (field &optional point) + (let ((point (or point + (point)))) + (and (>= point (yas--field-start field)) + (<= point (yas--field-end field))))) + +(defun yas--field-text-for-display (field) + "Return the propertized display text for field FIELD." + (buffer-substring (yas--field-start field) (yas--field-end field))) + +(defun yas--undo-in-progress () + "True if some kind of undo is in progress." + (or undo-in-progress + (eq this-command 'undo) + (eq this-command 'redo))) + +(defun yas--make-control-overlay (snippet start end) + "Create the control overlay that surrounds the snippet and +holds the keymap." + (let ((overlay (make-overlay start + end + nil + nil + t))) + (overlay-put overlay 'keymap yas-keymap) + (overlay-put overlay 'priority 100) + (overlay-put overlay 'yas--snippet snippet) + overlay)) + +(defun yas-skip-and-clear-or-delete-char (&optional field) + "Clears unmodified field if at field start, skips to next tab. + +Otherwise deletes a character normally by calling `delete-char'." + (interactive) + (let ((field (or field + (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field))))) + (cond ((and field + (not (yas--field-modified-p field)) + (eq (point) (marker-position (yas--field-start field)))) + (yas--skip-and-clear field) + (yas-next-field 1)) + (t + (call-interactively 'delete-char))))) + +(defun yas--skip-and-clear (field) + "Deletes the region of FIELD and sets it's modified state to t." + ;; Just before skipping-and-clearing the field, mark its children + ;; fields as modified, too. If the children have mirrors-in-fields + ;; this prevents them from updating erroneously (we're skipping and + ;; deleting!). + ;; + (yas--mark-this-and-children-modified field) + (delete-region (yas--field-start field) (yas--field-end field))) + +(defun yas--mark-this-and-children-modified (field) + (setf (yas--field-modified-p field) t) + (let ((fom (yas--field-next field))) + (while (and fom + (yas--fom-parent-field fom)) + (when (and (eq (yas--fom-parent-field fom) field) + (yas--field-p fom)) + (yas--mark-this-and-children-modified fom)) + (setq fom (yas--fom-next fom))))) + +(defun yas--make-move-active-field-overlay (snippet field) + "Place the active field overlay in SNIPPET's FIELD. + +Move the overlay, or create it if it does not exit." + (if (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay)) + (move-overlay yas--active-field-overlay + (yas--field-start field) + (yas--field-end field)) + (setq yas--active-field-overlay + (make-overlay (yas--field-start field) + (yas--field-end field) + nil nil t)) + (overlay-put yas--active-field-overlay 'priority 100) + (overlay-put yas--active-field-overlay 'face 'yas-field-highlight-face) + (overlay-put yas--active-field-overlay 'yas--snippet snippet) + (overlay-put yas--active-field-overlay 'modification-hooks '(yas--on-field-overlay-modification)) + (overlay-put yas--active-field-overlay 'insert-in-front-hooks + '(yas--on-field-overlay-modification)) + (overlay-put yas--active-field-overlay 'insert-behind-hooks + '(yas--on-field-overlay-modification)))) + +(defun yas--skip-and-clear-field-p (field _beg _end &optional _length) + "Tell if newly modified FIELD should be cleared and skipped. +BEG, END and LENGTH like overlay modification hooks." + (and (not (yas--field-modified-p field)) + (= (point) (yas--field-start field)) + (require 'delsel) + ;; `yank' sets `this-command' to t during execution. + (let* ((command (if (commandp this-command) this-command + this-original-command)) + (clearp (if (symbolp command) (get command 'delete-selection)))) + (when (and (not (memq clearp '(yank supersede kill))) + (functionp clearp)) + (setq clearp (funcall clearp))) + clearp))) + +(defun yas--on-field-overlay-modification (overlay after? beg end &optional length) + "Clears the field and updates mirrors, conditionally. + +Only clears the field if it hasn't been modified and point is at +field start. This hook does nothing if an undo is in progress." + (unless (or yas--inhibit-overlay-hooks + (not (overlayp yas--active-field-overlay)) ; Avoid Emacs bug #21824. + (yas--undo-in-progress)) + (let* ((field (overlay-get overlay 'yas--field)) + (snippet (overlay-get yas--active-field-overlay 'yas--snippet))) + (cond (after? + (yas--advance-end-maybe field (overlay-end overlay)) + (save-excursion + (yas--field-update-display field)) + (yas--update-mirrors snippet)) + (field + (when (yas--skip-and-clear-field-p field beg end) + (yas--skip-and-clear field)) + (setf (yas--field-modified-p field) t)))))) + +;;; Apropos protection overlays: +;; +;; These exist for nasty users who will try to delete parts of the +;; snippet outside the active field. Actual protection happens in +;; `yas--on-protection-overlay-modification'. +;; +;; As of github #537 this no longer inhibits the command by issuing an +;; error: all the snippets at point, including nested snippets, are +;; automatically commited and the current command can proceed. +;; +(defun yas--make-move-field-protection-overlays (snippet field) + "Place protection overlays surrounding SNIPPET's FIELD. + +Move the overlays, or create them if they do not exit." + (let ((start (yas--field-start field)) + (end (yas--field-end field))) + ;; First check if the (1+ end) is contained in the buffer, + ;; otherwise we'll have to do a bit of cheating and silently + ;; insert a newline. the `(1+ (buffer-size))' should prevent this + ;; when using stacked expansion + ;; + (when (< (buffer-size) end) + (save-excursion + (let ((yas--inhibit-overlay-hooks t)) + (goto-char (point-max)) + (newline)))) + ;; go on to normal overlay creation/moving + ;; + (cond ((and yas--field-protection-overlays + (every #'overlay-buffer yas--field-protection-overlays)) + (move-overlay (first yas--field-protection-overlays) (1- start) start) + (move-overlay (second yas--field-protection-overlays) end (1+ end))) + (t + (setq yas--field-protection-overlays + (list (make-overlay (1- start) start nil t nil) + (make-overlay end (1+ end) nil t nil))) + (dolist (ov yas--field-protection-overlays) + (overlay-put ov 'face 'yas--field-debug-face) + (overlay-put ov 'yas--snippet snippet) + ;; (overlay-put ov 'evaporate t) + (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification))))))) + +(defun yas--on-protection-overlay-modification (_overlay after? _beg _end &optional _length) + "Signals a snippet violation, then issues error. + +The error should be ignored in `debug-ignored-errors'" + (unless (or yas--inhibit-overlay-hooks + after? + (yas--undo-in-progress)) + (let ((snippets (yas--snippets-at-point))) + (yas--message 3 "Comitting snippets. Action would destroy a protection overlay.") + (cl-loop for snippet in snippets + do (yas--commit-snippet snippet))))) + +(add-to-list 'debug-ignored-errors "^Exit the snippet first!$") + + +;;; Snippet expansion and "stacked" expansion: +;; +;; Stacked expansion is when you try to expand a snippet when already +;; inside a snippet expansion. +;; +;; The parent snippet does not run its fields modification hooks +;; (`yas--on-field-overlay-modification' and +;; `yas--on-protection-overlay-modification') while the child snippet +;; is active. This means, among other things, that the mirrors of the +;; parent snippet are not updated, this only happening when one exits +;; the child snippet. +;; +;; Unfortunately, this also puts some ugly (and not fully-tested) +;; bits of code in `yas-expand-snippet' and +;; `yas--commit-snippet'. I've tried to mark them with "stacked +;; expansion:". +;; +;; This was thought to be safer in an undo/redo perspective, but +;; maybe the correct implementation is to make the globals +;; `yas--active-field-overlay' and `yas--field-protection-overlays' be +;; snippet-local and be active even while the child snippet is +;; running. This would mean a lot of overlay modification hooks +;; running, but if managed correctly (including overlay priorities) +;; they should account for all situations... +;; +(defun yas-expand-snippet (content &optional start end expand-env) + "Expand snippet CONTENT at current point. + +Text between START and END will be deleted before inserting +template. EXPAND-ENV is a list of (SYM VALUE) let-style dynamic bindings +considered when expanding the snippet." + (cl-assert (and yas-minor-mode + (memq 'yas--post-command-handler post-command-hook)) + nil + "[yas] `yas-expand-snippet' needs properly setup `yas-minor-mode'") + (run-hooks 'yas-before-expand-snippet-hook) + + ;; + (let* ((yas-selected-text (or yas-selected-text + (and (region-active-p) + (buffer-substring-no-properties (region-beginning) + (region-end))))) + (start (or start + (and (region-active-p) + (region-beginning)) + (point))) + (end (or end + (and (region-active-p) + (region-end)) + (point))) + (to-delete (and start + end + (buffer-substring-no-properties start end))) + snippet) + (goto-char start) + (setq yas--indent-original-column (current-column)) + ;; Delete the region to delete, this *does* get undo-recorded. + ;; + (when (and to-delete + (> end start)) + (delete-region start end)) + + (cond ((listp content) + ;; x) This is a snippet-command + ;; + (yas--eval-lisp-no-saves content)) + (t + ;; x) This is a snippet-snippet :-) + ;; + ;; Narrow the region down to the content, shoosh the + ;; `buffer-undo-list', and create the snippet, the new + ;; snippet updates its mirrors once, so we are left with + ;; some plain text. The undo action for deleting this + ;; plain text will get recorded at the end. + ;; + ;; stacked expansion: also shoosh the overlay modification hooks + (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)) + (let ((yas--inhibit-overlay-hooks t)) + (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. + ;; + (let ((existing-field (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field)))) + (when existing-field + (setf (yas--snippet-previous-active-field snippet) existing-field) + (yas--advance-end-maybe existing-field (overlay-end yas--active-field-overlay)))) + + ;; Exit the snippet immediately if no fields + ;; + (unless (yas--snippet-fields snippet) + (yas-exit-snippet snippet)) + + ;; Push two undo actions: the deletion of the inserted contents of + ;; the new snippet (without the "key") followed by an apply of + ;; `yas--take-care-of-redo' on the newly inserted snippet boundaries + ;; + ;; A small exception, if `yas-also-auto-indent-first-line' + ;; is t and `yas--indent' decides to indent the line to a + ;; point before the actual expansion point, undo would be + ;; messed up. We call the early point "newstart"". case, + ;; and attempt to fix undo. + ;; + (let ((newstart (overlay-start (yas--snippet-control-overlay snippet))) + (end (overlay-end (yas--snippet-control-overlay snippet)))) + (when (< newstart start) + (push (cons (make-string (- start newstart) ? ) newstart) buffer-undo-list)) + (push (cons newstart end) buffer-undo-list) + (push `(apply yas--take-care-of-redo ,start ,end ,snippet) + buffer-undo-list)) + ;; Now, schedule a move to the first field + ;; + (let ((first-field (car (yas--snippet-fields snippet)))) + (when first-field + (sit-for 0) ;; fix issue 125 + (yas--move-to-field snippet first-field))) + (yas--message 3 "snippet expanded.") + t)))) + +(defun yas--take-care-of-redo (_beg _end snippet) + "Commits SNIPPET, which in turn pushes an undo action for reviving it. + +Meant to exit in the `buffer-undo-list'." + ;; slightly optimize: this action is only needed for snippets with + ;; at least one field + (when (yas--snippet-fields snippet) + (yas--commit-snippet snippet))) + +(defun yas--snippet-revive (beg end snippet) + "Revives SNIPPET and creates a control overlay from BEG to END. + +BEG and END are, we hope, the original snippets boundaries. +All the markers/points exiting existing inside SNIPPET should point +to their correct locations *at the time the snippet is revived*. + +After revival, push the `yas--take-care-of-redo' in the +`buffer-undo-list'" + ;; Reconvert all the points to markers + ;; + (yas--points-to-markers snippet) + ;; When at least one editable field existed in the zombie snippet, + ;; try to revive the whole thing... + ;; + (let ((target-field (or (yas--snippet-active-field snippet) + (car (yas--snippet-fields snippet))))) + (when target-field + (setf (yas--snippet-control-overlay snippet) (yas--make-control-overlay snippet beg end)) + (overlay-put (yas--snippet-control-overlay snippet) 'yas--snippet snippet) + + (yas--move-to-field snippet target-field) + + (push `(apply yas--take-care-of-redo ,beg ,end ,snippet) + buffer-undo-list)))) + +(defun yas--snippet-create (begin end) + "Create a snippet from a template inserted at BEGIN to END. + +Returns the newly created 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) + + ;; 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)) + + snippet))) + + +;;; Apropos adjacencies and "fom's": +;; +;; Once the $-constructs bits like "$n" and "${:n" are deleted in the +;; recently expanded snippet, we might actually have many fields, +;; mirrors (and the snippet exit) in the very same position in the +;; buffer. Therefore we need to single-link the +;; fields-or-mirrors-or-exit (which I have abbreviated to "fom") +;; according to their original positions in the buffer. +;; +;; Then we have operation `yas--advance-end-maybe' and +;; `yas--advance-start-maybe', which conditionally push the starts and +;; ends of these foms down the chain. +;; +;; This allows for like the printf with the magic ",": +;; +;; printf ("${1:%s}\\n"${1:$(if (string-match "%" text) "," "\);")} \ +;; $2${1:$(if (string-match "%" text) "\);" "")}$0 +;; +(defun yas--fom-start (fom) + (cond ((yas--field-p fom) + (yas--field-start fom)) + ((yas--mirror-p fom) + (yas--mirror-start fom)) + (t + (yas--exit-marker fom)))) + +(defun yas--fom-end (fom) + (cond ((yas--field-p fom) + (yas--field-end fom)) + ((yas--mirror-p fom) + (yas--mirror-end fom)) + (t + (yas--exit-marker fom)))) + +(defun yas--fom-next (fom) + (cond ((yas--field-p fom) + (yas--field-next fom)) + ((yas--mirror-p fom) + (yas--mirror-next fom)) + (t + (yas--exit-next fom)))) + +(defun yas--fom-parent-field (fom) + (cond ((yas--field-p fom) + (yas--field-parent-field fom)) + ((yas--mirror-p fom) + (yas--mirror-parent-field fom)) + (t + nil))) + +(defun yas--calculate-adjacencies (snippet) + "Calculate adjacencies for fields or mirrors of SNIPPET. + +This is according to their relative positions in the buffer, and +has to be called before the $-constructs are deleted." + (let* ((fom-set-next-fom + (lambda (fom nextfom) + (cond ((yas--field-p fom) + (setf (yas--field-next fom) nextfom)) + ((yas--mirror-p fom) + (setf (yas--mirror-next fom) nextfom)) + (t + (setf (yas--exit-next fom) nextfom))))) + (compare-fom-begs + (lambda (fom1 fom2) + (if (= (yas--fom-start fom2) (yas--fom-start fom1)) + (yas--mirror-p fom2) + (>= (yas--fom-start fom2) (yas--fom-start fom1))))) + (link-foms fom-set-next-fom)) + ;; make some yas--field, yas--mirror and yas--exit soup + (let ((soup)) + (when (yas--snippet-exit snippet) + (push (yas--snippet-exit snippet) soup)) + (dolist (field (yas--snippet-fields snippet)) + (push field soup) + (dolist (mirror (yas--field-mirrors field)) + (push mirror soup))) + (setq soup + (sort soup compare-fom-begs)) + (when soup + (reduce link-foms soup))))) + +(defun yas--calculate-mirrors-in-fields (snippet mirror) + "Attempt to assign a parent field of SNIPPET to the mirror MIRROR. + +Use the tightest containing field if more than one field contains +the mirror. Intended to be called *before* the dollar-regions are +deleted." + (let ((min (point-min)) + (max (point-max))) + (dolist (field (yas--snippet-fields snippet)) + (when (and (<= (yas--field-start field) (yas--mirror-start mirror)) + (<= (yas--mirror-end mirror) (yas--field-end field)) + (< min (yas--field-start field)) + (< (yas--field-end field) max)) + (setq min (yas--field-start field) + max (yas--field-end field)) + (setf (yas--mirror-parent-field mirror) field))))) + +(defun yas--advance-end-maybe (fom newend) + "Maybe advance FOM's end to NEWEND if it needs it. + +If it does, also: + +* call `yas--advance-start-maybe' on FOM's next fom. + +* in case FOM is field call `yas--advance-end-maybe' on its parent + field + +Also, if FOM is an exit-marker, always call +`yas--advance-start-maybe' on its next fom. This is because +exit-marker have identical start and end markers." + (cond ((and fom (< (yas--fom-end fom) newend)) + (set-marker (yas--fom-end fom) newend) + (yas--advance-start-maybe (yas--fom-next fom) newend) + (yas--advance-end-of-parents-maybe (yas--fom-parent-field fom) newend)) + ((yas--exit-p fom) + (yas--advance-start-maybe (yas--fom-next fom) newend)))) + +(defun yas--advance-start-maybe (fom newstart) + "Maybe advance FOM's start to NEWSTART if it needs it. + +If it does, also call `yas--advance-end-maybe' on FOM." + (when (and fom (< (yas--fom-start fom) newstart)) + (set-marker (yas--fom-start fom) newstart) + (yas--advance-end-maybe fom newstart))) + +(defun yas--advance-end-of-parents-maybe (field newend) + "Like `yas--advance-end-maybe' but for parent fields. + +Only works for fields and doesn't care about the start of the +next FOM. Works its way up recursively for parents of parents." + (when (and field + (< (yas--field-end field) newend)) + (set-marker (yas--field-end field) newend) + (yas--advance-end-of-parents-maybe (yas--field-parent-field field) newend))) + +(defvar yas--dollar-regions nil + "When expanding the snippet the \"parse-create\" functions add +cons cells to this var.") + +(defvar yas--backquote-markers-and-strings nil + "List of (MARKER . STRING) marking where the values from +backquoted Lisp expressions should be inserted at the end of +expansion.") + +(defun yas--snippet-parse-create (snippet) + "Parse a recently inserted snippet template, creating all +necessary fields, mirrors and exit points. + +Meant to be called in a narrowed buffer, does various passes" + (let ((parse-start (point))) + ;; Reset the yas--dollar-regions + ;; + (setq yas--dollar-regions nil) + ;; protect just the backquotes + ;; + (yas--protect-escapes nil '(?`)) + ;; replace all backquoted expressions + ;; + (goto-char parse-start) + (yas--save-backquotes) + ;; protect escaped characters + ;; + (yas--protect-escapes) + ;; parse fields with {} + ;; + (goto-char parse-start) + (yas--field-parse-create snippet) + ;; parse simple mirrors and fields + ;; + (goto-char parse-start) + (yas--simple-mirror-parse-create snippet) + ;; parse mirror transforms + ;; + (goto-char parse-start) + (yas--transform-mirror-parse-create snippet) + ;; calculate adjacencies of fields and mirrors + ;; + (yas--calculate-adjacencies snippet) + ;; Delete $-constructs + ;; + (save-restriction (widen) (yas--delete-regions yas--dollar-regions)) + ;; restore backquoted expression values + ;; + (yas--restore-backquotes) + ;; restore escapes + ;; + (goto-char parse-start) + (yas--restore-escapes) + ;; update mirrors for the first time + ;; + (yas--update-mirrors snippet) + ;; indent the best we can + ;; + (goto-char parse-start) + (yas--indent snippet))) + +(defun yas--indent-according-to-mode (snippet-markers) + "Indent current line according to mode, preserving SNIPPET-MARKERS." + ;;; Apropos indenting problems.... + ;; + ;; `indent-according-to-mode' uses whatever `indent-line-function' + ;; is available. Some implementations of these functions delete text + ;; before they insert. If there happens to be a marker just after + ;; the text being deleted, the insertion actually happens after the + ;; marker, which misplaces it. + ;; + ;; This would also happen if we had used overlays with the + ;; `front-advance' property set to nil. + ;; + ;; This is why I have these `trouble-markers', they are the ones at + ;; they are the ones at the first non-whitespace char at the line + ;; (i.e. at `yas--real-line-beginning'. After indentation takes place + ;; we should be at the correct to restore them to. All other + ;; non-trouble-markers have been *pushed* and don't need special + ;; attention. + ;; + (goto-char (yas--real-line-beginning)) + (let ((trouble-markers (remove-if-not #'(lambda (marker) + (= marker (point))) + snippet-markers))) + (save-restriction + (widen) + (condition-case _ + (indent-according-to-mode) + (error (yas--message 3 "Warning: `yas--indent-according-to-mode' having problems running %s" indent-line-function) + nil))) + (mapc #'(lambda (marker) + (set-marker marker (point))) + trouble-markers))) + +(defvar yas--indent-original-column nil) +(defun yas--indent (snippet) + (let ((snippet-markers (yas--collect-snippet-markers snippet))) + ;; Look for those $> + (save-excursion + (while (re-search-forward "$>" nil t) + (delete-region (match-beginning 0) (match-end 0)) + (when (not (eq yas-indent-line 'auto)) + (yas--indent-according-to-mode snippet-markers)))) + ;; Now do stuff for 'fixed and 'auto + (save-excursion + (cond ((eq yas-indent-line 'fixed) + (while (and (zerop (forward-line)) + (zerop (current-column))) + (indent-to-column yas--indent-original-column))) + ((eq yas-indent-line 'auto) + (let ((end (set-marker (make-marker) (point-max))) + (indent-first-line-p yas-also-auto-indent-first-line)) + (while (and (zerop (if indent-first-line-p + (prog1 + (forward-line 0) + (setq indent-first-line-p nil)) + (forward-line 1))) + (not (eobp)) + (<= (point) end)) + (yas--indent-according-to-mode snippet-markers)))) + (t + nil))))) + +(defun yas--collect-snippet-markers (snippet) + "Make a list of all the markers used by SNIPPET." + (let (markers) + (dolist (field (yas--snippet-fields snippet)) + (push (yas--field-start field) markers) + (push (yas--field-end field) markers) + (dolist (mirror (yas--field-mirrors field)) + (push (yas--mirror-start mirror) markers) + (push (yas--mirror-end mirror) markers))) + (let ((snippet-exit (yas--snippet-exit snippet))) + (when (and snippet-exit + (marker-buffer (yas--exit-marker snippet-exit))) + (push (yas--exit-marker snippet-exit) markers))) + markers)) + +(defun yas--real-line-beginning () + (let ((c (char-after (line-beginning-position))) + (n (line-beginning-position))) + (while (or (eql c ?\ ) + (eql c ?\t)) + (cl-incf n) + (setq c (char-after n))) + n)) + +(defun yas--escape-string (escaped) + (concat "YASESCAPE" (format "%d" escaped) "PROTECTGUARD")) + +(defun yas--protect-escapes (&optional text escaped) + "Protect all escaped characters with their numeric ASCII value. + +With optional string TEXT do it in string instead of buffer." + (let ((changed-text text) + (text-provided-p text)) + (mapc #'(lambda (escaped) + (setq changed-text + (yas--replace-all (concat "\\" (char-to-string escaped)) + (yas--escape-string escaped) + (when text-provided-p changed-text)))) + (or escaped yas--escaped-characters)) + changed-text)) + +(defun yas--restore-escapes (&optional text escaped) + "Restore all escaped characters from their numeric ASCII value. + +With optional string TEXT do it in string instead of the buffer." + (let ((changed-text text) + (text-provided-p text)) + (mapc #'(lambda (escaped) + (setq changed-text + (yas--replace-all (yas--escape-string escaped) + (char-to-string escaped) + (when text-provided-p changed-text)))) + (or escaped yas--escaped-characters)) + changed-text)) + +(defun yas--save-backquotes () + "Save all the \"`(lisp-expression)`\"-style expressions +with their evaluated value into `yas--backquote-markers-and-strings'." + (while (re-search-forward yas--backquote-lisp-expression-regexp nil t) + (let ((current-string (match-string-no-properties 1)) transformed) + (save-restriction (widen) + (delete-region (match-beginning 0) (match-end 0))) + (setq transformed (yas--eval-lisp (yas--read-lisp (yas--restore-escapes current-string '(?`))))) + (goto-char (match-beginning 0)) + (when transformed + (let ((marker (make-marker))) + (save-restriction + (widen) + (insert "Y") ;; quite horrendous, I love it :) + (set-marker marker (point)) + (insert "Y")) + (push (cons marker transformed) yas--backquote-markers-and-strings)))))) + +(defun yas--restore-backquotes () + "Replace markers in `yas--backquote-markers-and-strings' with their values." + (while yas--backquote-markers-and-strings + (let* ((marker-and-string (pop yas--backquote-markers-and-strings)) + (marker (car marker-and-string)) + (string (cdr marker-and-string))) + (save-excursion + (goto-char marker) + (save-restriction + (widen) + (delete-char -1) + (insert string) + (delete-char 1)) + (set-marker marker nil))))) + +(defun yas--scan-sexps (from count) + (ignore-errors + (save-match-data ; `scan-sexps' may modify match data. + (with-syntax-table (standard-syntax-table) + (scan-sexps from count))))) + +(defun yas--make-marker (pos) + "Create a marker at POS with nil `marker-insertion-type'." + (let ((marker (set-marker (make-marker) pos))) + (set-marker-insertion-type marker nil) + marker)) + +(defun yas--field-parse-create (snippet &optional parent-field) + "Parse most field expressions in SNIPPET, except for the simple one \"$n\". + +The following count as a field: + +* \"${n: text}\", for a numbered field with default text, as long as N is not 0; + +* \"${n: text$(expression)}, the same with a Lisp expression; + this is caught with the curiously named `yas--multi-dollar-lisp-expression-regexp' + +* the same as above but unnumbered, (no N:) and number is calculated automatically. + +When multiple expressions are found, only the last one counts." + ;; + (save-excursion + (while (re-search-forward yas--field-regexp nil t) + (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) + (number (and (match-string-no-properties 1) + (string-to-number (match-string-no-properties 1)))) + (brand-new-field (and real-match-end-0 + ;; break if on "$(" immediately + ;; after the ":", this will be + ;; caught as a mirror with + ;; transform later. + (not (string-match-p "\\`\\$[ \t\n]*(" + (match-string-no-properties 2))) + ;; allow ${0: some exit text} + ;; (not (and number (zerop number))) + (yas--make-field number + (yas--make-marker (match-beginning 2)) + (yas--make-marker (1- real-match-end-0)) + parent-field)))) + (when brand-new-field + (goto-char real-match-end-0) + (push (cons (1- real-match-end-0) real-match-end-0) + yas--dollar-regions) + (push (cons (match-beginning 0) (match-beginning 2)) + yas--dollar-regions) + (push brand-new-field (yas--snippet-fields snippet)) + (save-excursion + (save-restriction + (narrow-to-region (yas--field-start brand-new-field) (yas--field-end brand-new-field)) + (goto-char (point-min)) + (yas--field-parse-create snippet brand-new-field))))))) + ;; if we entered from a parent field, now search for the + ;; `yas--multi-dollar-lisp-expression-regexp'. This is used for + ;; primary field transformations + ;; + (when parent-field + (save-excursion + (while (re-search-forward yas--multi-dollar-lisp-expression-regexp nil t) + (let* ((real-match-end-1 (yas--scan-sexps (match-beginning 1) 1))) + ;; commit the primary field transformation if: + ;; + ;; 1. we don't find it in yas--dollar-regions (a subnested + ;; field) might have already caught it. + ;; + ;; 2. we really make sure we have either two '$' or some + ;; text and a '$' after the colon ':'. This is a FIXME: work + ;; my regular expressions and end these ugly hacks. + ;; + (when (and real-match-end-1 + (not (member (cons (match-beginning 0) + real-match-end-1) + yas--dollar-regions)) + (not (eq ?: + (char-before (1- (match-beginning 1)))))) + (let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1) + real-match-end-1))) + (setf (yas--field-transform parent-field) + (yas--read-lisp (yas--restore-escapes lisp-expression-string)))) + (push (cons (match-beginning 0) real-match-end-1) + yas--dollar-regions))))))) + +(defun yas--transform-mirror-parse-create (snippet) + "Parse the \"${n:$(lisp-expression)}\" mirror transformations in SNIPPET." + (while (re-search-forward yas--transform-mirror-regexp nil t) + (let* ((real-match-end-0 (yas--scan-sexps (1+ (match-beginning 0)) 1)) + (number (string-to-number (match-string-no-properties 1))) + (field (and number + (not (zerop number)) + (yas--snippet-find-field snippet number))) + (brand-new-mirror + (and real-match-end-0 + field + (yas--make-mirror (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + (yas--read-lisp + (yas--restore-escapes + (buffer-substring-no-properties (match-beginning 2) + (1- real-match-end-0)))))))) + (when brand-new-mirror + (push brand-new-mirror + (yas--field-mirrors field)) + (yas--calculate-mirrors-in-fields snippet brand-new-mirror) + (push (cons (match-beginning 0) real-match-end-0) yas--dollar-regions))))) + +(defun yas--simple-mirror-parse-create (snippet) + "Parse the simple \"$n\" fields/mirrors/exitmarkers in SNIPPET." + (while (re-search-forward yas--simple-mirror-regexp nil t) + (let ((number (string-to-number (match-string-no-properties 1)))) + (cond ((zerop number) + + (setf (yas--snippet-exit snippet) + (yas--make-exit (yas--make-marker (match-end 0)))) + (save-excursion + (goto-char (match-beginning 0)) + (when yas-wrap-around-region + (cond (yas-selected-text + (insert yas-selected-text)) + ((and (eq yas-wrap-around-region 'cua) + cua-mode + (get-register ?0)) + (insert (prog1 (get-register ?0) + (set-register ?0 nil)))))) + (push (cons (point) (yas--exit-marker (yas--snippet-exit snippet))) + yas--dollar-regions))) + (t + (let ((field (yas--snippet-find-field snippet number))) + (if field + (let ((brand-new-mirror (yas--make-mirror + (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + nil))) + (push brand-new-mirror + (yas--field-mirrors field)) + (yas--calculate-mirrors-in-fields snippet brand-new-mirror)) + (push (yas--make-field number + (yas--make-marker (match-beginning 0)) + (yas--make-marker (match-beginning 0)) + nil) + (yas--snippet-fields snippet)))) + (push (cons (match-beginning 0) (match-end 0)) + yas--dollar-regions)))))) + +(defun yas--delete-regions (regions) + "Sort disjuct REGIONS by start point, then delete from the back." + (mapc #'(lambda (reg) + (delete-region (car reg) (cdr reg))) + (sort regions + #'(lambda (r1 r2) + (>= (car r1) (car r2)))))) + +(defun yas--calculate-mirror-depth (mirror &optional traversed) + (let* ((parent (yas--mirror-parent-field mirror)) + (parents-mirrors (and parent + (yas--field-mirrors parent)))) + (or (yas--mirror-depth mirror) + (setf (yas--mirror-depth mirror) + (cond ((memq mirror traversed) + 0) + ((and parent parents-mirrors) + (1+ (reduce #'max + (mapcar #'(lambda (m) + (yas--calculate-mirror-depth m + (cons mirror + traversed))) + parents-mirrors)))) + (parent + 1) + (t + 0)))))) + +(defun yas--update-mirrors (snippet) + "Update all the mirrors of SNIPPET." + (save-excursion + (dolist (field-and-mirror (sort + ;; make a list of ((F1 . M1) (F1 . M2) (F2 . M3) (F2 . M4) ...) + ;; where F is the field that M is mirroring + ;; + (mapcan #'(lambda (field) + (mapcar #'(lambda (mirror) + (cons field mirror)) + (yas--field-mirrors field))) + (yas--snippet-fields snippet)) + ;; then sort this list so that entries with mirrors with parent + ;; fields appear before. This was important for fixing #290, and + ;; luckily also handles the case where a mirror in a field causes + ;; another mirror to need reupdating + ;; + #'(lambda (field-and-mirror1 field-and-mirror2) + (> (yas--calculate-mirror-depth (cdr field-and-mirror1)) + (yas--calculate-mirror-depth (cdr field-and-mirror2)))))) + (let* ((field (car field-and-mirror)) + (mirror (cdr field-and-mirror)) + (parent-field (yas--mirror-parent-field mirror))) + ;; before updating a mirror with a parent-field, maybe advance + ;; its start (#290) + ;; + (when parent-field + (yas--advance-start-maybe mirror (yas--fom-start parent-field))) + ;; update this mirror + ;; + (yas--mirror-update-display mirror field) + ;; `yas--place-overlays' is needed if the active field and + ;; protected overlays have been changed because of insertions + ;; in `yas--mirror-update-display' + ;; + (when (eq field (yas--snippet-active-field snippet)) + (yas--place-overlays snippet field)))))) + +(defun yas--mirror-update-display (mirror field) + "Update MIRROR according to FIELD (and mirror transform)." + + (let* ((mirror-parent-field (yas--mirror-parent-field mirror)) + (reflection (and (not (and mirror-parent-field + (yas--field-modified-p mirror-parent-field))) + (or (yas--apply-transform mirror field 'empty-on-nil) + (yas--field-text-for-display field))))) + (when (and reflection + (not (string= reflection (buffer-substring-no-properties (yas--mirror-start mirror) + (yas--mirror-end mirror))))) + (goto-char (yas--mirror-start mirror)) + (let ((yas--inhibit-overlay-hooks t)) + (insert reflection)) + (if (> (yas--mirror-end mirror) (point)) + (delete-region (point) (yas--mirror-end mirror)) + (set-marker (yas--mirror-end mirror) (point)) + (yas--advance-start-maybe (yas--mirror-next mirror) (point)) + ;; super-special advance + (yas--advance-end-of-parents-maybe mirror-parent-field (point)))))) + +(defun yas--field-update-display (field) + "Much like `yas--mirror-update-display', but for fields." + (when (yas--field-transform field) + (let ((transformed (and (not (eq (yas--field-number field) 0)) + (yas--apply-transform field field)))) + (when (and transformed + (not (string= transformed (buffer-substring-no-properties (yas--field-start field) + (yas--field-end field))))) + (setf (yas--field-modified-p field) t) + (goto-char (yas--field-start field)) + (let ((yas--inhibit-overlay-hooks t)) + (insert transformed) + (if (> (yas--field-end field) (point)) + (delete-region (point) (yas--field-end field)) + (set-marker (yas--field-end field) (point)) + (yas--advance-start-maybe (yas--field-next field) (point))) + t))))) + + +;;; Post-command hook: +;; +(defun yas--post-command-handler () + "Handles various yasnippet conditions after each command." + (cond ((eq 'undo this-command) + ;; + ;; After undo revival the correct field is sometimes not + ;; restored correctly, this condition handles that + ;; + (let* ((snippet (car (yas--snippets-at-point))) + (target-field (and snippet + (find-if-not #'(lambda (field) + (yas--field-probably-deleted-p snippet field)) + (remove nil + (cons (yas--snippet-active-field snippet) + (yas--snippet-fields snippet))))))) + (when target-field + (yas--move-to-field snippet target-field)))) + ((not (yas--undo-in-progress)) + ;; When not in an undo, check if we must commit the snippet + ;; (user exited it). + (yas--check-commit-snippet)))) + +;;; Fancy docs: +;; +;; The docstrings for some functions are generated dynamically +;; depending on the context. +;; +(put 'yas-expand 'function-documentation + '(yas--expand-from-trigger-key-doc t)) +(defun yas--expand-from-trigger-key-doc (context) + "A doc synthesizer for `yas--expand-from-trigger-key-doc'." + (let* ((yas-fallback-behavior (and context yas-fallback-behavior)) + (fallback-description + (cond ((eq yas-fallback-behavior 'call-other-command) + (let* ((fallback (yas--keybinding-beyond-yasnippet))) + (or (and fallback + (format "call command `%s'." + (pp-to-string fallback))) + "do nothing (`yas-expand' doesn't override\nanything)."))) + ((eq yas-fallback-behavior 'return-nil) + "do nothing.") + (t "defer to `yas-fallback-behavior' (which see).")))) + (concat "Expand a snippet before point. If no snippet +expansion is possible, " + fallback-description + "\n\nOptional argument FIELD is for non-interactive use and is an +object satisfying `yas--field-p' to restrict the expansion to."))) + +(put 'yas-expand-from-keymap 'function-documentation + '(yas--expand-from-keymap-doc t)) +(defun yas--expand-from-keymap-doc (context) + "A doc synthesizer for `yas--expand-from-keymap-doc'." + (add-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce) + (concat "Expand/run snippets from keymaps, possibly falling back to original binding.\n" + (when (and context (eq this-command 'describe-key)) + (let* ((vec (this-single-command-keys)) + (templates (mapcan #'(lambda (table) + (yas--fetch table vec)) + (yas--get-snippet-tables))) + (yas--direct-keymaps nil) + (fallback (key-binding vec))) + (concat "In this case, " + (when templates + (concat "these snippets are bound to this key:\n" + (yas--template-pretty-list templates) + "\n\nIf none of these expands, ")) + (or (and fallback + (format "fallback `%s' will be called." (pp-to-string fallback))) + "no fallback keybinding is called.")))))) + +(defun yas--template-pretty-list (templates) + (let ((acc) + (yas-buffer-local-condition 'always)) + (dolist (plate templates) + (setq acc (concat acc "\n*) " + (propertize (concat "\\\\snippet `" (car plate) "'") + 'yasnippet (cdr plate))))) + acc)) + +(define-button-type 'help-snippet-def + :supertype 'help-xref + 'help-function (lambda (template) (yas--visit-snippet-file-1 template)) + 'help-echo (purecopy "mouse-2, RET: find snippets's definition")) + +(defun yas--snippet-description-finish-runonce () + "Final adjustments for the help buffer when snippets are concerned." + (yas--create-snippet-xrefs) + (remove-hook 'temp-buffer-show-hook 'yas--snippet-description-finish-runonce)) + +(defun yas--create-snippet-xrefs () + (save-excursion + (goto-char (point-min)) + (while (search-forward-regexp "\\\\\\\\snippet[ \s\t]+`\\([^']+\\)'" nil t) + (let ((template (get-text-property (match-beginning 1) + 'yasnippet))) + (when template + (help-xref-button 1 'help-snippet-def template) + (kill-region (match-end 1) (match-end 0)) + (kill-region (match-beginning 0) (match-beginning 1))))))) + +;;; Utils + +(defvar yas-verbosity 4 + "Log level for `yas--message' 4 means trace most anything, 0 means nothing.") + +(defun yas--message (level message &rest args) + "When LEVEL is above `yas-verbosity-level', log MESSAGE and ARGS." + (when (> yas-verbosity level) + (message "%s" (apply #'yas--format message args)))) + +(defun yas--warning (format-control &rest format-args) + (let ((msg (apply #'format format-control format-args))) + (display-warning 'yasnippet msg :warning) + (yas--message 1 msg))) + +(defun yas--format (format-control &rest format-args) + (apply #'format (concat "[yas] " format-control) format-args)) + + +;;; Some hacks: +;; +;; The functions +;; +;; `locate-dominating-file' +;; `region-active-p' +;; +;; added for compatibility in emacsen < 23 +(unless (>= emacs-major-version 23) + (unless (fboundp 'region-active-p) + (defun region-active-p () (and transient-mark-mode mark-active))) + + (unless (fboundp 'locate-dominating-file) + (defvar locate-dominating-stop-dir-regexp + "\\`\\(?:[\\/][\\/][^\\/]+[\\/]\\|/\\(?:net\\|afs\\|\\.\\.\\.\\)/\\)\\'" + "Regexp of directory names which stop the search in `locate-dominating-file'. +Any directory whose name matches this regexp will be treated like +a kind of root directory by `locate-dominating-file' which will stop its search +when it bumps into it. +The default regexp prevents fruitless and time-consuming attempts to find +special files in directories in which filenames are interpreted as hostnames, +or mount points potentially requiring authentication as a different user.") + + (defun locate-dominating-file (file name) + "Look up the directory hierarchy from FILE for a file named NAME. +Stop at the first parent directory containing a file NAME, +and return the directory. Return nil if not found." + ;; We used to use the above locate-dominating-files code, but the + ;; directory-files call is very costly, so we're much better off doing + ;; multiple calls using the code in here. + ;; + ;; Represent /home/luser/foo as ~/foo so that we don't try to look for + ;; `name' in /home or in /. + (setq file (abbreviate-file-name file)) + (let ((root nil) + try) + (while (not (or root + (null file) + ;; FIXME: Disabled this heuristic because it is sometimes + ;; inappropriate. + ;; As a heuristic, we stop looking up the hierarchy of + ;; directories as soon as we find a directory belonging + ;; to another user. This should save us from looking in + ;; things like /net and /afs. This assumes that all the + ;; files inside a project belong to the same user. + ;; (let ((prev-user user)) + ;; (setq user (nth 2 (file-attributes file))) + ;; (and prev-user (not (equal user prev-user)))) + (string-match locate-dominating-stop-dir-regexp file))) + (setq try (file-exists-p (expand-file-name name file))) + (cond (try (setq root file)) + ((equal file (setq file (file-name-directory + (directory-file-name file)))) + (setq file nil)))) + root)))) + + +;;; Backward compatibility to yasnippet <= 0.7 + +(defun yas-initialize () + "For backward compatibility, enable `yas-minor-mode' globally." + (declare (obsolete "Use (yas-global-mode 1) instead." "0.8")) + (yas-global-mode 1)) + +(defvar yas--backported-syms '(;; `defcustom's + ;; + yas-snippet-dirs + yas-prompt-functions + yas-indent-line + yas-also-auto-indent-first-line + yas-snippet-revival + yas-triggers-in-field + yas-fallback-behavior + yas-choose-keys-first + yas-choose-tables-first + yas-use-menu + yas-trigger-symbol + yas-wrap-around-region + yas-good-grace + yas-visit-from-menu + yas-expand-only-for-last-commands + yas-field-highlight-face + + ;; these vars can be customized as well + ;; + yas-keymap + yas-verbosity + yas-extra-modes + yas-key-syntaxes + yas-after-exit-snippet-hook + yas-before-expand-snippet-hook + yas-buffer-local-condition + yas-dont-activate + + ;; prompting functions + ;; + yas-x-prompt + yas-ido-prompt + yas-no-prompt + yas-completing-prompt + yas-dropdown-prompt + + ;; interactive functions + ;; + yas-expand + yas-minor-mode + yas-global-mode + yas-direct-keymaps-reload + yas-minor-mode-on + yas-load-directory + yas-reload-all + yas-compile-directory + yas-recompile-all + yas-about + yas-expand-from-trigger-key + yas-expand-from-keymap + yas-insert-snippet + yas-visit-snippet-file + yas-new-snippet + yas-load-snippet-buffer + yas-tryout-snippet + yas-describe-tables + yas-next-field-or-maybe-expand + yas-next-field + yas-prev-field + yas-abort-snippet + yas-exit-snippet + yas-exit-all-snippets + yas-skip-and-clear-or-delete-char + yas-initialize + + ;; symbols that I "exported" for use + ;; in snippets and hookage + ;; + yas-expand-snippet + yas-define-snippets + yas-define-menu + yas-snippet-beg + yas-snippet-end + yas-modified-p + yas-moving-away-p + yas-substr + yas-choose-value + yas-key-to-value + yas-throw + yas-verify-value + yas-field-value + yas-text + yas-selected-text + yas-default-from-field + yas-inside-string + yas-unimplemented + yas-define-condition-cache + yas-hippie-try-expand + + ;; debug definitions + ;; yas-debug-snippet-vars + ;; yas-exterminate-package + ;; yas-debug-test + + ;; testing definitions + ;; yas-should-expand + ;; yas-should-not-expand + ;; yas-mock-insert + ;; yas-make-file-or-dirs + ;; yas-variables + ;; yas-saving-variables + ;; yas-call-with-snippet-dirs + ;; yas-with-snippet-dirs +) + "Backported yasnippet symbols. + +They are mapped to \"yas/*\" variants.") + +(dolist (sym yas--backported-syms) + (let ((backported (intern (replace-regexp-in-string "^yas-" "yas/" (symbol-name sym))))) + (when (boundp sym) + (make-obsolete-variable backported sym "yasnippet 0.8") + (defvaralias backported sym)) + (when (fboundp sym) + (make-obsolete backported sym "yasnippet 0.8") + (defalias backported sym)))) + +(defvar yas--exported-syms + (let (exported) + (mapatoms (lambda (atom) + (if (and (or (and (boundp atom) + (not (get atom 'byte-obsolete-variable))) + (and (fboundp atom) + (not (get atom 'byte-obsolete-info)))) + (string-match-p "^yas-[^-]" (symbol-name atom))) + (push atom exported)))) + exported) + "Exported yasnippet symbols. + +i.e. the ones with \"yas-\" single dash prefix. I will try to +keep them in future yasnippet versions and other elisp libraries +can more or less safely rely upon them.") + + +(provide 'yasnippet) +;; Local Variables: +;; coding: utf-8 +;; indent-tabs-mode: nil +;; byte-compile-warnings: (not cl-functions) +;; End: +;;; yasnippet.el ends here