[sepia] 59/63: Modernized package

Hilko Bengen bengen at moszumanska.debian.org
Sat Aug 8 11:20:39 UTC 2015


This is an automated email from the git hooks/post-receive script.

bengen pushed a commit to branch master
in repository sepia.

commit eb1b5cc117b9a3b2eae94deecd04cbb5f8d11a4f
Author: Hilko Bengen <bengen at debian.org>
Date:   Wed Jul 22 16:48:11 2015 +0200

    Modernized package
    
    - 3.0 (quilt)
    - Bumped Standards-Version
    - Bumped debian/compat
---
 Makefile.PL                                        |   6 +-
 debian/compat                                      |   2 +-
 debian/control                                     |   4 +-
 debian/patches/0001-Fix-POD.patch                  |  25 +
 debian/patches/0002-Add-snippet.el.patch           | 648 +++++++++++++++++++++
 ...all-.elc-files-if-they-haven-t-been-gener.patch |  25 +
 debian/patches/series                              |   3 +
 debian/source/format                               |   1 +
 lib/Sepia/Xref.pm                                  |   2 -
 snippet.el                                         | 633 --------------------
 10 files changed, 710 insertions(+), 639 deletions(-)

diff --git a/Makefile.PL b/Makefile.PL
index 71ad493..a7dfddd 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -48,7 +48,11 @@ sub escape_path
 sub prompt_for_emacs
 {
     # try to compile and install Elisp files, but don't die if we can't.
-    my $emacs = prompt("Where is your emacs? ");
+    my ($sysemacs) = grep { defined && -x }
+        $ENV{EMACS}, glob '/usr/bin{/local,}/emacs';
+    $sysemacs ||= q{emacs};
+
+    my $emacs = prompt("Where is your emacs? ", $sysemacs);
 
     # Make sure emacs is a valid string/program path...
     return undef unless $emacs;
diff --git a/debian/compat b/debian/compat
index 7ed6ff8..ec63514 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-5
+9
diff --git a/debian/control b/debian/control
index 3c9d298..85bb749 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,7 @@
 Source: sepia
 Section: perl
 Priority: optional
-Build-Depends: debhelper (>= 5.0.0)
+Build-Depends: debhelper (>= 9)
 Build-Depends-Indep: texinfo, perl (>= 5.8.8-7),
  libio-stringy-perl,
  libpadwalker-perl,
@@ -16,7 +16,7 @@ Build-Depends-Indep: texinfo, perl (>= 5.8.8-7),
  libtest-expect-perl,
  install-info,
 Maintainer: Hilko Bengen <bengen at debian.org>
-Standards-Version: 3.9.2
+Standards-Version: 3.9.6
 
 Package: sepia
 Architecture: all
diff --git a/debian/patches/0001-Fix-POD.patch b/debian/patches/0001-Fix-POD.patch
new file mode 100644
index 0000000..4ff8414
--- /dev/null
+++ b/debian/patches/0001-Fix-POD.patch
@@ -0,0 +1,25 @@
+From: Hilko Bengen <bengen at debian.org>
+Date: Wed, 22 Jul 2015 16:59:07 +0200
+Subject: Fix POD
+
+---
+ lib/Sepia/Xref.pm | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/Sepia/Xref.pm b/lib/Sepia/Xref.pm
+index b5f1cc8..01334ad 100644
+--- a/lib/Sepia/Xref.pm
++++ b/lib/Sepia/Xref.pm
+@@ -115,10 +115,10 @@ my %code = (intro => "i", used => "",
+ 	    subdef => "s", subused => "&",
+ 	    formdef => "f", meth => "->");
+ 
+-=over 4
+-
+ =head2 Functions
+ 
++=over 4
++
+ =item C<guess_module_file($pack, $ofile)>
+ 
+ XXX: it turns out that rooting around trying to figure out the file
diff --git a/debian/patches/0002-Add-snippet.el.patch b/debian/patches/0002-Add-snippet.el.patch
new file mode 100644
index 0000000..c8102da
--- /dev/null
+++ b/debian/patches/0002-Add-snippet.el.patch
@@ -0,0 +1,648 @@
+From: Hilko Bengen <bengen at debian.org>
+Date: Wed, 22 Jul 2015 17:02:16 +0200
+Subject: Add snippet.el
+
+---
+ snippet.el | 633 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 633 insertions(+)
+ create mode 100644 snippet.el
+
+diff --git a/snippet.el b/snippet.el
+new file mode 100644
+index 0000000..0e44236
+--- /dev/null
++++ b/snippet.el
+@@ -0,0 +1,633 @@
++;;; snippet.el -- insert snippets of text into a buffer
++
++;; Copyright (C) 2005 Pete Kazmier
++
++;; Version: 0.2
++;; Author: Pete Kazmier
++
++;; This file is not part of GNU Emacs, but it is distributed under
++;; the same terms as GNU Emacs.
++
++;; GNU Emacs 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.
++
++;; GNU Emacs 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; see the file COPYING.  If not, write to the
++;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
++;; Boston, MA 02111-1307, USA.
++
++;;; Description:
++
++;; A quick stab at providing a simple template facility like the one
++;; present in TextMate (an OSX editor).  The general idea is that a
++;; snippet of text (called a template) is inserted into a buffer
++;; (perhaps triggered by an abbrev), and while the point is within the
++;; snippet, a special keymap is active to permit the user to cycle the
++;; point to any of the defined fields (placeholders) within the
++;; template via `snippet-next-field' and `snippet-prev-field'.
++
++;; For example, the following template might be a useful while editing
++;; HTML:
++
++;;   <a href="$$">$$</a>
++
++;; This template might be useful for python developers.  In this
++;; example, reasonable defaults have been supplied:
++
++;;   for $${element} in $${sequence}:
++;;       match = $${regexp}.search($${element})
++
++;; When a template is inserted into a buffer (could be triggered by an
++;; abbrev expansion, or simply bound to some key), point is moved to
++;; the first field denoted by the "$$" characters (configurable via
++;; `snippet-field-identifier').  The optional default for a field is
++;; specified by the "{default}" (the delimiters are configurable via
++;; `snippet-field-default-beg-char' and `snippet-field-defaul-end-char'.
++
++;; If present, the default will be inserted and highlighted.  The user
++;; then has the option of accepting the default by simply tabbing over
++;; to the next field (any other key bound to `snippet-next-field' in
++;; `snippet-map' can be used).  Alternatively, the user can start
++;; typing their own value for the field which will cause the default
++;; to be immediately replaced with the user's own input.  If two or
++;; more fields have the same default value, they are linked together
++;; (changing one will change the other dynamically as you type).
++
++;; `snippet-next-field' (bound to <tab> by default) moves the point to
++;; the next field.  `snippet-prev-field' (bound to <S-tab> by default)
++;; moves the point to the previous field.  When the snippet has been
++;; completed, the user simply tabs past the last field which causes
++;; the snippet to revert to plain text in a buffer.  The idea is that
++;; snippets should get out of a user's way as soon as they have been
++;; filled and completed.
++
++;; After tabbing past all of the fields, point is moved to the end of
++;; the snippet, unless the user has specified a place within the
++;; template with the `snippet-exit-identifier' ("$." by default).  For
++;; example: 
++
++;;   if ($${test} {
++;;       $.
++;;   }
++
++;; Indentation can be controlled on a per line basis by including the
++;; `snippet-indent' string within the template.  Most often one would
++;; include this at the beginning of a line; however, there are times
++;; when indentation is better performed in other parts of the line.
++;; The following shows how to use the functionality:
++
++;;   if ($${test}) {
++;;   $>this line would be indented
++;;   this line will be indented after being inserted$>
++;;   }
++
++;;; Usage:
++
++;; Snippets are inserted with the `snippet-insert' function.  This
++;; function inserts the snippet into the current buffer.  It expects a
++;; single argument which is the template that is to be inserted.  For
++;; example:
++
++;;   (snippet-insert "for $${element} in $${sequence}:")
++
++;; `snippet-insert' can be called interactively in which case the user
++;; is prompted for the template to insert.  This is hardly useful at
++;; all unless you are testing the functionality of this code.
++
++;; Snippets are much more effective when they are bound to expansions
++;; for abbreviations.  When binding a snippet to an abbreviation, it
++;; is important that you disable the insertion of the character that
++;; triggered the expansion (typically some form of whitespace).  For
++;; example, this is what you should NOT do:
++
++;;   (define-abbrev python-mode-abbrev-table  ; abbrev table
++;;                  "for"                     ; name
++;;                  ""                        ; expansion
++;;                  '(lambda ()               ; expansion hook
++;;                     (snippet-insert 
++;;                      "for $${element} in $${sequence}:")))
++
++;; The above example does not work as expected because after the
++;; expansion hook is called, the snippet is inserted, and the point is
++;; moved to the first field.  The problem occurs because when the user
++;; typed "f o r <Spc>", the "<Spc>" character is inserted after the
++;; snippet has been inserted.  The point happens to be located at the
++;; first field and thus the "<Spc>" will delete any field default that
++;; was present.
++
++;; Fortunately, this is easy to fix.  According to the documentation
++;; for `define-abbrev', if the hook function is a symbol whose
++;; `no-self-insert' property is non-nil, then hook can control whether
++;; or not the insertion of the character that triggered the abbrev
++;; expansion is inserted.  `insert-snippet' returns non-nil and thus
++;; the proper way of defining the abbrev is as follows:
++
++;;   (defun python-foo-expansion ()
++;;     (snippet-insert "for $${element} in $${sequence}:"))
++
++;;   (put 'python-foo-expansion 'no-self-insert t)
++
++;;   (define-abbrev python-mode-abbrev-table    ; abbrev table
++;;                  "for"                       ; name
++;;                  ""                          ; expansion
++;;                  'python-foo-expansion)      ; expansion hook
++
++;; Unfortunately, this is a lot of work to define what should be a
++;; simple abbrev.  For convenience, this package provides a macro
++;; `snippet-abbrev' that can be used with much less effort:
++
++;;   (snippet-abbrev 'python-mode-abbrev-table            ; table
++;;                   "for"                               ; name
++;;                   "for $${element} in $${sequence}:") ; template
++
++;; For even more convevience, when defining a lot of abbrevs in a
++;; particular abbrev table, the package provides another macro
++;; `snippet-with-abbrev-table':
++
++;;   (snippet-with-abbrev-table 'python-mode-abbrev-table
++;;     ("for" .  "for $${element} in $${sequence}:")
++;;     ("im"  .  "import $$")
++;;     ("if"  .  "if $${True}:")
++;;     ("wh"  .  "while $${True}:"))
++
++;; Be sure that the appropriate abbrev-table is loaded before using
++;; the above otherwise you'll get an error.  I use the above in my
++;; python-mode-hook.
++
++;; Finally, for those running a recent version of Emacs, you can
++;; disable snippet expansion in various parts of the buffer.  I use
++;; this to disable the above "for" expansion while typing comments in
++;; my python code.  Add the following line to your python-mode hook:
++
++;;   (add-hook 'pre-abbrev-expand-hook
++;;             (lambda ()
++;;               (setq local-abbrev-table
++;;                     (if (inside-comment-p)
++;;                         text-mode-abbrev-table
++;;                       python-mode-abbrev-table)))
++;;             nil t)))
++ 
++;;; Implementation Notes:
++
++;; This is my first significant chunk of elisp code.  I have very
++;; little experience coding with elisp; however, I have tried to
++;; document the code for anyone trying to follow along.  Here are some
++;; brief notes on the implementation.
++
++;; When a snippet is inserted, the entire template of text has an
++;; overlay applied.  This overlay is referred to as the "bound"
++;; overlay in the code.  It is used to bold-face the snippet as well
++;; as provide the keymap that is used while the point is located
++;; within the snippet (so users can tab between fields).  This overlay
++;; is actually one character longer than the template.  The reason is
++;; to make sure that our local keymap is still in effect when a user
++;; is typing in a field that happens to be at the end of the
++;; template.
++
++;; In addition, for each field (denoted by snippet-field-identifier),
++;; an overlay is created.  These overlays are used to provide the
++;; highlighting of the field values, the location of where the point
++;; should move when tab is pressed (the start of the overlay is used
++;; for this purpose), as well as the hooks to delete the default value
++;; if a user starts to type their own value (the modification hooks of
++;; the overlay are used for this purpose).
++
++;; Once the user has tabbed out of the snippet, all overlays are
++;; deleted and the snippet then becomes normal text.  Moving the
++;; cursor back into the snippet has no affect (the snippet is not
++;; activated again).  The idea is that the snippet concept should get
++;; out of the users way as quickly as possible.
++
++;;; Comparisons to Other Packages
++
++;; tempo.el
++;;  - Template definition is very lispy (although powerful).  In
++;;    contrast, snippets are simple strings with minimal syntax.
++;;  - Template parameters can be prompted via minibuffer.  In
++;;    contrast, snippets use overlays to visually cue the user for
++;;    parameters.
++;;  + Templates can be wrapped around regions of text.
++;;
++
++;;; Known Limitations:
++
++;; - When one uses something like `dabbrev-expand', when the text is
++;;   inserted, it blows away a lot of the snippet.  Not sure why yet.
++;; - Using 'indent-according-to-mode' does not seem to behave well
++;;   with Python mode.  I have no idea why, the overlays end up
++;;   getting shifted around incorrectly.
++
++;;; Code:
++
++(require 'cl)
++
++(defgroup snippet nil 
++  "Insert a template with fields that con contain optional defaults."
++  :prefix "snippet-"
++  :group 'abbrev
++  :group 'convenience)
++
++(defcustom snippet-bound-face 'bold
++  "*Face used for the body of the snippet."
++  :type 'face
++  :group 'snippet)
++
++(defcustom snippet-field-face 'highlight
++  "*Face used for the fields' default values."
++  :type 'face
++  :group 'snippet)
++
++(defcustom snippet-field-identifier "$$"
++  "*String used to identify field placeholders."
++  :type 'string
++  :group 'snippet)
++
++(defcustom snippet-exit-identifier "$."
++  "*String used to identify the exit point of the snippet."
++  :type 'string
++  :group 'snippet)
++
++(defcustom snippet-field-default-beg-char ?{
++  "*Character used to identify the start of a field's default value."
++  :type 'character
++  :group 'snippet)
++
++(defcustom snippet-field-default-end-char ?}
++  "*Character used to identify the stop of a field's default value."
++  :type 'character
++  :group 'snippet)
++
++(defcustom snippet-indent "$>"
++  "*String used to indicate that a line is to be indented."
++  :type 'character
++  :group 'snippet)
++
++(defcustom snippet-line-terminator "\n"
++  "*String used to indicate the end of line in a snippet template."
++  :type 'string
++  :group 'snippet)
++
++(defvar snippet-map (make-sparse-keymap)
++  "Keymap used while the point is located within a snippet.")
++
++;; Default key bindings
++(define-key snippet-map (kbd "TAB")             'snippet-next-field)
++(define-key snippet-map (kbd "<S-tab>")         'snippet-prev-field)
++(define-key snippet-map (kbd "<S-iso-lefttab>") 'snippet-prev-field)
++
++(defstruct snippet 
++  "Structure containing the overlays used to display a snippet.
++
++The BOUND slot contains an overlay to bound the entire text of the
++template.  This overlay is used to provide a different face
++configurable via `snippet-bound-face' as well as the keymap that
++enables tabbing between fields.
++
++The FIELDS slot contains a list of overlays used to indicate the
++position of each field.  In addition, if a field has a default, the
++field overlay is used to provide a different face configurable via
++`snippet-field-face'.
++
++The EXIT-MARKER slot contains a marker where point should be placed
++after the user has cycled through all available fields."
++  bound fields exit-marker)
++
++(defvar snippet nil
++  "Snippet in the current buffer.
++There is no more than one snippet per buffer.  This variable is buffer
++local.")
++
++(make-variable-buffer-local 'snippet)
++
++(defun snippet-make-bound-overlay ()
++  "Create an overlay to bound a snippet.
++Add the appropriate properties for the overlay to provide: a face used
++to display the snippet, the keymap to use while within the snippet,
++and the modification hooks to clean up the overlay in the event it is
++deleted."
++  (let ((bound (make-overlay (point) (point) (current-buffer) nil nil)))
++    (overlay-put bound 'keymap snippet-map)
++    (overlay-put bound 'face snippet-bound-face)
++    (overlay-put bound 'modification-hooks '(snippet-bound-modified))
++    bound))
++
++(defun snippet-make-field-overlay (&optional name)
++  "Create an overlay for a field in a snippet.  
++Add the appropriate properties for the overlay to provide: a face used
++to display a field's default value, and modification hooks to remove
++the default text if the user starts typing."
++  (let ((field (make-overlay (point) (point) (current-buffer) nil t)))
++    (overlay-put field 'face snippet-field-face)
++    (overlay-put field 'insert-in-front-hooks '(snippet-field-insert
++                                                snippet-field-update))
++    (overlay-put field 'insert-behind-hooks '(snippet-field-modified
++                                              snippet-field-update))
++    (overlay-put field 'modification-hooks '(snippet-field-modified
++                                             snippet-field-update))
++    (overlay-put field 'name (when name (intern name)))
++    field))
++
++(defun snippet-fields-with-name (name)
++  "Return a list of fields whose name property is equal to NAME."
++  (loop for field in (snippet-fields snippet) 
++        when (eq name (overlay-get field 'name))
++        collect field))
++
++(defun snippet-bound-modified (bound after beg end &optional change)
++  "Ensure the overlay that bounds a snippet is cleaned up.
++This modification hook is triggered when the overlay that bounds the
++snippet is modified.  It runs after the change has been made and
++ensures that if the snippet has been deleted by the user, the
++appropriate cleanup occurs."
++  (when (and after (> 2 (- (overlay-end bound) (overlay-start bound))))
++    (snippet-cleanup)))
++
++(defun snippet-field-insert (field after beg end &optional change)
++  "Delete the default field value.
++This insertion hook is triggered when a user starts to type when the
++point is positioned at the beginning of a field (this occurs when the
++user chooses to replace the field default).  In this case, the hook
++deletes the field default."
++  (let ((inhibit-modification-hooks t))
++    (when (not after)
++      (delete-region (overlay-start field) (overlay-end field)))))
++
++(defun snippet-field-modified (field after beg end &optional change)
++  "Shrink the field overlay.
++This modification hook is triggered when a user starts to type when
++the point is positioned in the middle or at the end of a field (this
++occurs when the user chooses to edit the field default).  It is used
++to ensure that the bound overlay always covers the entirety of all
++field overlays, if not, its extends the bound overlay appropriately."
++  (let ((bound (snippet-bound snippet)))
++    (when (and after bound (> (overlay-end field) (overlay-end bound)))
++      (move-overlay bound (overlay-start bound) (overlay-end field)))))
++
++(defun snippet-field-update (field after beg end &optional change)
++  "Update all fields that have the same name.
++This modificition hook is triggered when a user edits any field and is
++responsible for updating all other fields that share a common name."
++  (let ((name (overlay-get field 'name))
++        (value (buffer-substring (overlay-start field) (overlay-end field)))
++        (inhibit-modification-hooks t))
++    (when (and name after)
++      (save-excursion
++        (dolist (like-field (set-difference (snippet-fields-with-name name) 
++                                            (list field)))
++          (goto-char (overlay-start like-field))
++          (delete-region (overlay-start like-field)
++                         (overlay-end like-field))
++          (insert value))))))
++
++(defun snippet-exit-snippet ()
++  "Move point to `snippet-exit-identifier' or end of bound.
++If the snippet has defined `snippet-exit-identifier' in the template,
++move the point to that location.  Otherwise, move it to the end of the
++snippet."
++  (goto-char (snippet-exit-marker snippet))
++  (snippet-cleanup))
++
++(defun snippet-next-field ()
++  "Move point forward to the next field in the `snippet'.
++If there are no more fields in the snippet, point is moved to the end
++of the snippet or the location specified by `snippet-exit-identifier',
++and the snippet reverts to normal text."
++  (interactive)
++  (let* ((bound (snippet-bound snippet))
++         (fields (snippet-fields snippet))
++         (exit (snippet-exit-marker snippet))
++         (next-pos (loop for field in fields
++                         for start = (overlay-start field)
++                         when (< (point) start) return start)))
++    (if (not (null next-pos))
++        (goto-char next-pos)
++      (goto-char exit)
++      (snippet-cleanup))))
++
++(defun snippet-prev-field ()
++  "Move point backward to the previous field in the `snippet'.
++If there are no more fields in the snippet, point is moved to the end
++of the snippet or the location specified by `snippet-exit-identifier',
++and the snippet reverts to normal text."
++  (interactive)
++  (let* ((bound (snippet-bound snippet))
++         (fields (snippet-fields snippet))
++         (exit (snippet-exit-marker snippet))         
++         (prev-pos (loop for field in (reverse fields)
++                         for start = (overlay-start field)
++                         when (> (point) start) return start)))
++    (if (not (null prev-pos))
++        (goto-char prev-pos)
++      (goto-char exit)
++      (snippet-cleanup))))
++
++(defun snippet-cleanup ()
++  "Delete all overlays associated with `snippet'.
++This effectively reverts the snippet to normal text in the buffer."
++  (when snippet
++    (when (snippet-bound snippet)
++      (delete-overlay (snippet-bound snippet)))
++    (dolist (field (snippet-fields snippet))
++      (delete-overlay field))
++    (setq snippet nil)))
++
++(defun snippet-field-regexp ()
++  "Return a regexp that is used to search for fields within a template."
++  (let ((beg (char-to-string snippet-field-default-beg-char))
++        (end (char-to-string snippet-field-default-end-char)))
++    (concat (regexp-quote snippet-field-identifier)
++            "\\("
++            (regexp-quote beg)
++            "\\([^"
++            (regexp-quote end)
++            "]+\\)"
++            (regexp-quote end)
++            "\\)?")))
++
++(defun snippet-split-string (string &optional separators include-separators-p)
++  "Split STRING into substrings and separators at SEPARATORS.
++Return a list of substrings and optional include the separators in the
++list if INCLUDE-SEPARATORS-P is non-nil."
++  (let ((start 0) (list '()))
++    (while (string-match (or separators snippet-line-terminator) string start)
++      (when (< start (match-beginning 0))
++        (push (substring string start (match-beginning 0)) list))
++      (when include-separators-p
++        (push (substring string (match-beginning 0) (match-end 0)) list))
++      (setq start (match-end 0)))
++    (when (< start (length string))
++      (push (substring string start) list))
++    (nreverse list)))
++
++(defun snippet-split-regexp ()
++  "Return a regexp to split the template into component parts."
++  (concat (regexp-quote snippet-line-terminator)
++          "\\|"
++          (regexp-quote snippet-indent)))
++
++(defun snippet-insert (template)
++  "Insert a snippet into the current buffer at point.  
++TEMPLATE is a string that may optionally contain fields which are
++specified by `snippet-field-identifier'.  Fields may optionally also
++include default values delimited by `snippet-field-default-beg-char'
++and `snippet-field-default-end-char'.
++
++For example, the following template specifies two fields which have
++the default values of \"element\" and \"sequence\":
++
++  \"for $${element} in $${sequence}:\"
++
++In the next example, only one field is specified and no default has
++been provided:
++
++  \"import $$\"
++
++This function may be called interactively, in which case, the TEMPLATE
++is prompted for.  However, users do not typically invoke this function
++interactively, rather it is most often called as part of an abbrev
++expansion.  See `snippet-abbrev' and `snippet-with-abbrev-table' for
++more information."
++  (interactive "sSnippet template: ")
++
++  ;; Step 1: Ensure only one snippet exists at a time
++  (snippet-cleanup)
++
++  ;; Step 2: Create a new snippet and add the overlay to bound the
++  ;; template body.  It should be noted that the bounded overlay is
++  ;; sized to be one character larger than the template body text.
++  ;; This enables our keymap to be active when a field happens to be
++  ;; the last item in a template.  We disable abbrev mode to prevent
++  ;; our template from triggering another abbrev expansion (I do not
++  ;; know if the use of `insert' will actually trigger abbrevs).
++  (let ((abbrev-mode nil))
++    (setq snippet (make-snippet :bound (snippet-make-bound-overlay)))
++    (let ((start (point))
++          (count 0))
++      (dolist (line (snippet-split-string template (snippet-split-regexp) t))
++        (cond ((string-equal snippet-line-terminator line)
++               (insert "\n"))
++              ((string-equal snippet-indent line)
++               (indent-according-to-mode))
++              (t
++               (insert line))))
++      (move-overlay (snippet-bound snippet) start (1+ (point))))
++
++
++    ;; Step 3: Insert the exit marker so we know where to move point
++    ;; to when user is done with snippet.  If they did not specify
++    ;; where point should land, set the exit marker to the end of the
++    ;; snippet. 
++    (goto-char (overlay-start (snippet-bound snippet)))
++    (while (re-search-forward (regexp-quote snippet-exit-identifier)
++                              (overlay-end (snippet-bound snippet)) 
++                              t)
++      (replace-match "")
++      (setf (snippet-exit-marker snippet) (point-marker)))
++    
++    (unless (snippet-exit-marker snippet)
++      (let ((end (overlay-end (snippet-bound snippet))))
++        (goto-char (if (= end (point-max)) end (1- end))))
++      (setf (snippet-exit-marker snippet) (point-marker)))
++  
++    (set-marker-insertion-type (snippet-exit-marker snippet) t)
++
++    ;; Step 4: Create field overlays for each field and insert any
++    ;; default values for the field.
++    (goto-char (overlay-start (snippet-bound snippet)))
++    (while (re-search-forward (snippet-field-regexp)
++                              (overlay-end (snippet-bound snippet)) 
++                              t)
++      (let ((field (snippet-make-field-overlay (match-string 2)))
++            (start (match-beginning 0)))
++        (push field (snippet-fields snippet))
++        (replace-match (if (match-beginning 2) "\\2" ""))
++        (move-overlay field start (point))))
++    
++    ;; These are reversed so they are in order of how they appeared in
++    ;; the template as we index into this list when cycling field to
++    ;; field. 
++    (setf (snippet-fields snippet) (reverse (snippet-fields snippet))))
++
++  ;; Step 5: Position the point at the first field or the end of the
++  ;; template body if no fields are present.  We need to take into
++  ;; consideration the special case where the first field is at the
++  ;; start of the snippet (otherwise the call to snippet-next-field
++  ;; will go past it).
++  (let ((bound (snippet-bound snippet))
++        (first (car (snippet-fields snippet))))
++    (if (and first (= (overlay-start bound) (overlay-start first)))
++        (goto-char (overlay-start first))
++      (goto-char (overlay-start (snippet-bound snippet)))
++      (snippet-next-field))))
++
++(defun snippet-strip-abbrev-table-suffix (str)
++  "Strip a suffix of \"-abbrev-table\" if one is present."
++  (if (string-match "^\\(.*\\)-abbrev-table$" str)
++      (match-string 1 str)
++      str))
++
++(defun snippet-make-abbrev-expansion-hook (abbrev-table abbrev-name template)
++  "Define a function with the `no-self-insert' property set non-nil.
++The function name is composed of \"snippet-abbrev-\", the abbrev table
++name, and the name of the abbrev.  If the abbrev table name ends in
++\"-abbrev-table\", it is stripped."
++  (let ((abbrev-expansion (intern
++                           (concat "snippet-abbrev-" 
++                                   (snippet-strip-abbrev-table-suffix
++                                    (symbol-name abbrev-table))
++                                   "-"
++                                   abbrev-name))))
++    (fset abbrev-expansion 
++          `(lambda ()
++             ,(format (concat "Abbrev expansion hook for \"%s\".\n"
++                              "Expands to the following snippet:\n\n%s")
++                      abbrev-name
++                      template)
++             (snippet-insert ,template)))
++    (put abbrev-expansion 'no-self-insert t)
++    abbrev-expansion))
++
++(defmacro snippet-abbrev (abbrev-table abbrev-name template)
++  "Establish an abbrev for a snippet template.
++Set up an abbreviation called ABBREV-NAME in the ABBREV-TABLE (note
++that ABBREV-TABLE must be quoted) that expands into a snippet using
++the specified TEMPLATE string.
++
++This macro facilitates the creation of a function for the expansion
++hook to be used in `define-abbrev'.  In addition, it also sets the
++`no-self-insert' property on the function to prevent `abbrev-mode'
++from inserting the character that triggered the expansion (typically
++whitespace) which would otherwise interfere with the first field of a
++snippet."
++  (let ((name (gensym))
++        (table (gensym)))
++    `(let ((,name ,abbrev-name)
++           (,table ,abbrev-table))
++       (define-abbrev (symbol-value ,table) ,name ""
++         (snippet-make-abbrev-expansion-hook ,table ,name ,template)))))
++
++(defmacro snippet-with-abbrev-table (abbrev-table &rest snippet-alist)
++  "Establish a set of abbrevs for snippet templates.
++Set up a series of snippet abbreviations in the ABBREV-TABLE (note
++that ABBREV-TABLE must be quoted.  The abbrevs are specified in
++SNIPPET-ALIST.  For example:
++
++  (snippet-with-abbrev-table 'python-mode-abbrev-table
++    (\"for\" . \"for $${element} in $${sequence}:\")
++    (\"im\"  . \"import $$\"))
++
++See also `snippet-abbrev."
++  (let ((table (gensym)))
++    `(let ((,table ,abbrev-table))
++       (progn
++         ,@(loop for (name . template) in snippet-alist
++              collect (list 'snippet-abbrev table name template))))))
++
++(provide 'snippet)
diff --git a/debian/patches/0003-Do-not-install-.elc-files-if-they-haven-t-been-gener.patch b/debian/patches/0003-Do-not-install-.elc-files-if-they-haven-t-been-gener.patch
new file mode 100644
index 0000000..2b69135
--- /dev/null
+++ b/debian/patches/0003-Do-not-install-.elc-files-if-they-haven-t-been-gener.patch
@@ -0,0 +1,25 @@
+From: Hilko Bengen <bengen at debian.org>
+Date: Wed, 22 Jul 2015 17:11:20 +0200
+Subject: Do not install .elc files if they haven't been generated
+
+---
+ Makefile.PL | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/Makefile.PL b/Makefile.PL
+index a7dfddd..71ad493 100644
+--- a/Makefile.PL
++++ b/Makefile.PL
+@@ -48,11 +48,7 @@ sub escape_path
+ sub prompt_for_emacs
+ {
+     # try to compile and install Elisp files, but don't die if we can't.
+-    my ($sysemacs) = grep { defined && -x }
+-        $ENV{EMACS}, glob '/usr/bin{/local,}/emacs';
+-    $sysemacs ||= q{emacs};
+-
+-    my $emacs = prompt("Where is your emacs? ", $sysemacs);
++    my $emacs = prompt("Where is your emacs? ");
+ 
+     # Make sure emacs is a valid string/program path...
+     return undef unless $emacs;
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..0df2f07
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,3 @@
+0001-Fix-POD.patch
+0002-Add-snippet.el.patch
+0003-Do-not-install-.elc-files-if-they-haven-t-been-gener.patch
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..46ebe02
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
\ No newline at end of file
diff --git a/lib/Sepia/Xref.pm b/lib/Sepia/Xref.pm
index 94b027f..b5f1cc8 100644
--- a/lib/Sepia/Xref.pm
+++ b/lib/Sepia/Xref.pm
@@ -119,8 +119,6 @@ my %code = (intro => "i", used => "",
 
 =head2 Functions
 
-=over 4
-
 =item C<guess_module_file($pack, $ofile)>
 
 XXX: it turns out that rooting around trying to figure out the file
diff --git a/snippet.el b/snippet.el
deleted file mode 100644
index 0e44236..0000000
--- a/snippet.el
+++ /dev/null
@@ -1,633 +0,0 @@
-;;; snippet.el -- insert snippets of text into a buffer
-
-;; Copyright (C) 2005 Pete Kazmier
-
-;; Version: 0.2
-;; Author: Pete Kazmier
-
-;; This file is not part of GNU Emacs, but it is distributed under
-;; the same terms as GNU Emacs.
-
-;; GNU Emacs 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.
-
-;; GNU Emacs 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; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
-
-;;; Description:
-
-;; A quick stab at providing a simple template facility like the one
-;; present in TextMate (an OSX editor).  The general idea is that a
-;; snippet of text (called a template) is inserted into a buffer
-;; (perhaps triggered by an abbrev), and while the point is within the
-;; snippet, a special keymap is active to permit the user to cycle the
-;; point to any of the defined fields (placeholders) within the
-;; template via `snippet-next-field' and `snippet-prev-field'.
-
-;; For example, the following template might be a useful while editing
-;; HTML:
-
-;;   <a href="$$">$$</a>
-
-;; This template might be useful for python developers.  In this
-;; example, reasonable defaults have been supplied:
-
-;;   for $${element} in $${sequence}:
-;;       match = $${regexp}.search($${element})
-
-;; When a template is inserted into a buffer (could be triggered by an
-;; abbrev expansion, or simply bound to some key), point is moved to
-;; the first field denoted by the "$$" characters (configurable via
-;; `snippet-field-identifier').  The optional default for a field is
-;; specified by the "{default}" (the delimiters are configurable via
-;; `snippet-field-default-beg-char' and `snippet-field-defaul-end-char'.
-
-;; If present, the default will be inserted and highlighted.  The user
-;; then has the option of accepting the default by simply tabbing over
-;; to the next field (any other key bound to `snippet-next-field' in
-;; `snippet-map' can be used).  Alternatively, the user can start
-;; typing their own value for the field which will cause the default
-;; to be immediately replaced with the user's own input.  If two or
-;; more fields have the same default value, they are linked together
-;; (changing one will change the other dynamically as you type).
-
-;; `snippet-next-field' (bound to <tab> by default) moves the point to
-;; the next field.  `snippet-prev-field' (bound to <S-tab> by default)
-;; moves the point to the previous field.  When the snippet has been
-;; completed, the user simply tabs past the last field which causes
-;; the snippet to revert to plain text in a buffer.  The idea is that
-;; snippets should get out of a user's way as soon as they have been
-;; filled and completed.
-
-;; After tabbing past all of the fields, point is moved to the end of
-;; the snippet, unless the user has specified a place within the
-;; template with the `snippet-exit-identifier' ("$." by default).  For
-;; example: 
-
-;;   if ($${test} {
-;;       $.
-;;   }
-
-;; Indentation can be controlled on a per line basis by including the
-;; `snippet-indent' string within the template.  Most often one would
-;; include this at the beginning of a line; however, there are times
-;; when indentation is better performed in other parts of the line.
-;; The following shows how to use the functionality:
-
-;;   if ($${test}) {
-;;   $>this line would be indented
-;;   this line will be indented after being inserted$>
-;;   }
-
-;;; Usage:
-
-;; Snippets are inserted with the `snippet-insert' function.  This
-;; function inserts the snippet into the current buffer.  It expects a
-;; single argument which is the template that is to be inserted.  For
-;; example:
-
-;;   (snippet-insert "for $${element} in $${sequence}:")
-
-;; `snippet-insert' can be called interactively in which case the user
-;; is prompted for the template to insert.  This is hardly useful at
-;; all unless you are testing the functionality of this code.
-
-;; Snippets are much more effective when they are bound to expansions
-;; for abbreviations.  When binding a snippet to an abbreviation, it
-;; is important that you disable the insertion of the character that
-;; triggered the expansion (typically some form of whitespace).  For
-;; example, this is what you should NOT do:
-
-;;   (define-abbrev python-mode-abbrev-table  ; abbrev table
-;;                  "for"                     ; name
-;;                  ""                        ; expansion
-;;                  '(lambda ()               ; expansion hook
-;;                     (snippet-insert 
-;;                      "for $${element} in $${sequence}:")))
-
-;; The above example does not work as expected because after the
-;; expansion hook is called, the snippet is inserted, and the point is
-;; moved to the first field.  The problem occurs because when the user
-;; typed "f o r <Spc>", the "<Spc>" character is inserted after the
-;; snippet has been inserted.  The point happens to be located at the
-;; first field and thus the "<Spc>" will delete any field default that
-;; was present.
-
-;; Fortunately, this is easy to fix.  According to the documentation
-;; for `define-abbrev', if the hook function is a symbol whose
-;; `no-self-insert' property is non-nil, then hook can control whether
-;; or not the insertion of the character that triggered the abbrev
-;; expansion is inserted.  `insert-snippet' returns non-nil and thus
-;; the proper way of defining the abbrev is as follows:
-
-;;   (defun python-foo-expansion ()
-;;     (snippet-insert "for $${element} in $${sequence}:"))
-
-;;   (put 'python-foo-expansion 'no-self-insert t)
-
-;;   (define-abbrev python-mode-abbrev-table    ; abbrev table
-;;                  "for"                       ; name
-;;                  ""                          ; expansion
-;;                  'python-foo-expansion)      ; expansion hook
-
-;; Unfortunately, this is a lot of work to define what should be a
-;; simple abbrev.  For convenience, this package provides a macro
-;; `snippet-abbrev' that can be used with much less effort:
-
-;;   (snippet-abbrev 'python-mode-abbrev-table            ; table
-;;                   "for"                               ; name
-;;                   "for $${element} in $${sequence}:") ; template
-
-;; For even more convevience, when defining a lot of abbrevs in a
-;; particular abbrev table, the package provides another macro
-;; `snippet-with-abbrev-table':
-
-;;   (snippet-with-abbrev-table 'python-mode-abbrev-table
-;;     ("for" .  "for $${element} in $${sequence}:")
-;;     ("im"  .  "import $$")
-;;     ("if"  .  "if $${True}:")
-;;     ("wh"  .  "while $${True}:"))
-
-;; Be sure that the appropriate abbrev-table is loaded before using
-;; the above otherwise you'll get an error.  I use the above in my
-;; python-mode-hook.
-
-;; Finally, for those running a recent version of Emacs, you can
-;; disable snippet expansion in various parts of the buffer.  I use
-;; this to disable the above "for" expansion while typing comments in
-;; my python code.  Add the following line to your python-mode hook:
-
-;;   (add-hook 'pre-abbrev-expand-hook
-;;             (lambda ()
-;;               (setq local-abbrev-table
-;;                     (if (inside-comment-p)
-;;                         text-mode-abbrev-table
-;;                       python-mode-abbrev-table)))
-;;             nil t)))
- 
-;;; Implementation Notes:
-
-;; This is my first significant chunk of elisp code.  I have very
-;; little experience coding with elisp; however, I have tried to
-;; document the code for anyone trying to follow along.  Here are some
-;; brief notes on the implementation.
-
-;; When a snippet is inserted, the entire template of text has an
-;; overlay applied.  This overlay is referred to as the "bound"
-;; overlay in the code.  It is used to bold-face the snippet as well
-;; as provide the keymap that is used while the point is located
-;; within the snippet (so users can tab between fields).  This overlay
-;; is actually one character longer than the template.  The reason is
-;; to make sure that our local keymap is still in effect when a user
-;; is typing in a field that happens to be at the end of the
-;; template.
-
-;; In addition, for each field (denoted by snippet-field-identifier),
-;; an overlay is created.  These overlays are used to provide the
-;; highlighting of the field values, the location of where the point
-;; should move when tab is pressed (the start of the overlay is used
-;; for this purpose), as well as the hooks to delete the default value
-;; if a user starts to type their own value (the modification hooks of
-;; the overlay are used for this purpose).
-
-;; Once the user has tabbed out of the snippet, all overlays are
-;; deleted and the snippet then becomes normal text.  Moving the
-;; cursor back into the snippet has no affect (the snippet is not
-;; activated again).  The idea is that the snippet concept should get
-;; out of the users way as quickly as possible.
-
-;;; Comparisons to Other Packages
-
-;; tempo.el
-;;  - Template definition is very lispy (although powerful).  In
-;;    contrast, snippets are simple strings with minimal syntax.
-;;  - Template parameters can be prompted via minibuffer.  In
-;;    contrast, snippets use overlays to visually cue the user for
-;;    parameters.
-;;  + Templates can be wrapped around regions of text.
-;;
-
-;;; Known Limitations:
-
-;; - When one uses something like `dabbrev-expand', when the text is
-;;   inserted, it blows away a lot of the snippet.  Not sure why yet.
-;; - Using 'indent-according-to-mode' does not seem to behave well
-;;   with Python mode.  I have no idea why, the overlays end up
-;;   getting shifted around incorrectly.
-
-;;; Code:
-
-(require 'cl)
-
-(defgroup snippet nil 
-  "Insert a template with fields that con contain optional defaults."
-  :prefix "snippet-"
-  :group 'abbrev
-  :group 'convenience)
-
-(defcustom snippet-bound-face 'bold
-  "*Face used for the body of the snippet."
-  :type 'face
-  :group 'snippet)
-
-(defcustom snippet-field-face 'highlight
-  "*Face used for the fields' default values."
-  :type 'face
-  :group 'snippet)
-
-(defcustom snippet-field-identifier "$$"
-  "*String used to identify field placeholders."
-  :type 'string
-  :group 'snippet)
-
-(defcustom snippet-exit-identifier "$."
-  "*String used to identify the exit point of the snippet."
-  :type 'string
-  :group 'snippet)
-
-(defcustom snippet-field-default-beg-char ?{
-  "*Character used to identify the start of a field's default value."
-  :type 'character
-  :group 'snippet)
-
-(defcustom snippet-field-default-end-char ?}
-  "*Character used to identify the stop of a field's default value."
-  :type 'character
-  :group 'snippet)
-
-(defcustom snippet-indent "$>"
-  "*String used to indicate that a line is to be indented."
-  :type 'character
-  :group 'snippet)
-
-(defcustom snippet-line-terminator "\n"
-  "*String used to indicate the end of line in a snippet template."
-  :type 'string
-  :group 'snippet)
-
-(defvar snippet-map (make-sparse-keymap)
-  "Keymap used while the point is located within a snippet.")
-
-;; Default key bindings
-(define-key snippet-map (kbd "TAB")             'snippet-next-field)
-(define-key snippet-map (kbd "<S-tab>")         'snippet-prev-field)
-(define-key snippet-map (kbd "<S-iso-lefttab>") 'snippet-prev-field)
-
-(defstruct snippet 
-  "Structure containing the overlays used to display a snippet.
-
-The BOUND slot contains an overlay to bound the entire text of the
-template.  This overlay is used to provide a different face
-configurable via `snippet-bound-face' as well as the keymap that
-enables tabbing between fields.
-
-The FIELDS slot contains a list of overlays used to indicate the
-position of each field.  In addition, if a field has a default, the
-field overlay is used to provide a different face configurable via
-`snippet-field-face'.
-
-The EXIT-MARKER slot contains a marker where point should be placed
-after the user has cycled through all available fields."
-  bound fields exit-marker)
-
-(defvar snippet nil
-  "Snippet in the current buffer.
-There is no more than one snippet per buffer.  This variable is buffer
-local.")
-
-(make-variable-buffer-local 'snippet)
-
-(defun snippet-make-bound-overlay ()
-  "Create an overlay to bound a snippet.
-Add the appropriate properties for the overlay to provide: a face used
-to display the snippet, the keymap to use while within the snippet,
-and the modification hooks to clean up the overlay in the event it is
-deleted."
-  (let ((bound (make-overlay (point) (point) (current-buffer) nil nil)))
-    (overlay-put bound 'keymap snippet-map)
-    (overlay-put bound 'face snippet-bound-face)
-    (overlay-put bound 'modification-hooks '(snippet-bound-modified))
-    bound))
-
-(defun snippet-make-field-overlay (&optional name)
-  "Create an overlay for a field in a snippet.  
-Add the appropriate properties for the overlay to provide: a face used
-to display a field's default value, and modification hooks to remove
-the default text if the user starts typing."
-  (let ((field (make-overlay (point) (point) (current-buffer) nil t)))
-    (overlay-put field 'face snippet-field-face)
-    (overlay-put field 'insert-in-front-hooks '(snippet-field-insert
-                                                snippet-field-update))
-    (overlay-put field 'insert-behind-hooks '(snippet-field-modified
-                                              snippet-field-update))
-    (overlay-put field 'modification-hooks '(snippet-field-modified
-                                             snippet-field-update))
-    (overlay-put field 'name (when name (intern name)))
-    field))
-
-(defun snippet-fields-with-name (name)
-  "Return a list of fields whose name property is equal to NAME."
-  (loop for field in (snippet-fields snippet) 
-        when (eq name (overlay-get field 'name))
-        collect field))
-
-(defun snippet-bound-modified (bound after beg end &optional change)
-  "Ensure the overlay that bounds a snippet is cleaned up.
-This modification hook is triggered when the overlay that bounds the
-snippet is modified.  It runs after the change has been made and
-ensures that if the snippet has been deleted by the user, the
-appropriate cleanup occurs."
-  (when (and after (> 2 (- (overlay-end bound) (overlay-start bound))))
-    (snippet-cleanup)))
-
-(defun snippet-field-insert (field after beg end &optional change)
-  "Delete the default field value.
-This insertion hook is triggered when a user starts to type when the
-point is positioned at the beginning of a field (this occurs when the
-user chooses to replace the field default).  In this case, the hook
-deletes the field default."
-  (let ((inhibit-modification-hooks t))
-    (when (not after)
-      (delete-region (overlay-start field) (overlay-end field)))))
-
-(defun snippet-field-modified (field after beg end &optional change)
-  "Shrink the field overlay.
-This modification hook is triggered when a user starts to type when
-the point is positioned in the middle or at the end of a field (this
-occurs when the user chooses to edit the field default).  It is used
-to ensure that the bound overlay always covers the entirety of all
-field overlays, if not, its extends the bound overlay appropriately."
-  (let ((bound (snippet-bound snippet)))
-    (when (and after bound (> (overlay-end field) (overlay-end bound)))
-      (move-overlay bound (overlay-start bound) (overlay-end field)))))
-
-(defun snippet-field-update (field after beg end &optional change)
-  "Update all fields that have the same name.
-This modificition hook is triggered when a user edits any field and is
-responsible for updating all other fields that share a common name."
-  (let ((name (overlay-get field 'name))
-        (value (buffer-substring (overlay-start field) (overlay-end field)))
-        (inhibit-modification-hooks t))
-    (when (and name after)
-      (save-excursion
-        (dolist (like-field (set-difference (snippet-fields-with-name name) 
-                                            (list field)))
-          (goto-char (overlay-start like-field))
-          (delete-region (overlay-start like-field)
-                         (overlay-end like-field))
-          (insert value))))))
-
-(defun snippet-exit-snippet ()
-  "Move point to `snippet-exit-identifier' or end of bound.
-If the snippet has defined `snippet-exit-identifier' in the template,
-move the point to that location.  Otherwise, move it to the end of the
-snippet."
-  (goto-char (snippet-exit-marker snippet))
-  (snippet-cleanup))
-
-(defun snippet-next-field ()
-  "Move point forward to the next field in the `snippet'.
-If there are no more fields in the snippet, point is moved to the end
-of the snippet or the location specified by `snippet-exit-identifier',
-and the snippet reverts to normal text."
-  (interactive)
-  (let* ((bound (snippet-bound snippet))
-         (fields (snippet-fields snippet))
-         (exit (snippet-exit-marker snippet))
-         (next-pos (loop for field in fields
-                         for start = (overlay-start field)
-                         when (< (point) start) return start)))
-    (if (not (null next-pos))
-        (goto-char next-pos)
-      (goto-char exit)
-      (snippet-cleanup))))
-
-(defun snippet-prev-field ()
-  "Move point backward to the previous field in the `snippet'.
-If there are no more fields in the snippet, point is moved to the end
-of the snippet or the location specified by `snippet-exit-identifier',
-and the snippet reverts to normal text."
-  (interactive)
-  (let* ((bound (snippet-bound snippet))
-         (fields (snippet-fields snippet))
-         (exit (snippet-exit-marker snippet))         
-         (prev-pos (loop for field in (reverse fields)
-                         for start = (overlay-start field)
-                         when (> (point) start) return start)))
-    (if (not (null prev-pos))
-        (goto-char prev-pos)
-      (goto-char exit)
-      (snippet-cleanup))))
-
-(defun snippet-cleanup ()
-  "Delete all overlays associated with `snippet'.
-This effectively reverts the snippet to normal text in the buffer."
-  (when snippet
-    (when (snippet-bound snippet)
-      (delete-overlay (snippet-bound snippet)))
-    (dolist (field (snippet-fields snippet))
-      (delete-overlay field))
-    (setq snippet nil)))
-
-(defun snippet-field-regexp ()
-  "Return a regexp that is used to search for fields within a template."
-  (let ((beg (char-to-string snippet-field-default-beg-char))
-        (end (char-to-string snippet-field-default-end-char)))
-    (concat (regexp-quote snippet-field-identifier)
-            "\\("
-            (regexp-quote beg)
-            "\\([^"
-            (regexp-quote end)
-            "]+\\)"
-            (regexp-quote end)
-            "\\)?")))
-
-(defun snippet-split-string (string &optional separators include-separators-p)
-  "Split STRING into substrings and separators at SEPARATORS.
-Return a list of substrings and optional include the separators in the
-list if INCLUDE-SEPARATORS-P is non-nil."
-  (let ((start 0) (list '()))
-    (while (string-match (or separators snippet-line-terminator) string start)
-      (when (< start (match-beginning 0))
-        (push (substring string start (match-beginning 0)) list))
-      (when include-separators-p
-        (push (substring string (match-beginning 0) (match-end 0)) list))
-      (setq start (match-end 0)))
-    (when (< start (length string))
-      (push (substring string start) list))
-    (nreverse list)))
-
-(defun snippet-split-regexp ()
-  "Return a regexp to split the template into component parts."
-  (concat (regexp-quote snippet-line-terminator)
-          "\\|"
-          (regexp-quote snippet-indent)))
-
-(defun snippet-insert (template)
-  "Insert a snippet into the current buffer at point.  
-TEMPLATE is a string that may optionally contain fields which are
-specified by `snippet-field-identifier'.  Fields may optionally also
-include default values delimited by `snippet-field-default-beg-char'
-and `snippet-field-default-end-char'.
-
-For example, the following template specifies two fields which have
-the default values of \"element\" and \"sequence\":
-
-  \"for $${element} in $${sequence}:\"
-
-In the next example, only one field is specified and no default has
-been provided:
-
-  \"import $$\"
-
-This function may be called interactively, in which case, the TEMPLATE
-is prompted for.  However, users do not typically invoke this function
-interactively, rather it is most often called as part of an abbrev
-expansion.  See `snippet-abbrev' and `snippet-with-abbrev-table' for
-more information."
-  (interactive "sSnippet template: ")
-
-  ;; Step 1: Ensure only one snippet exists at a time
-  (snippet-cleanup)
-
-  ;; Step 2: Create a new snippet and add the overlay to bound the
-  ;; template body.  It should be noted that the bounded overlay is
-  ;; sized to be one character larger than the template body text.
-  ;; This enables our keymap to be active when a field happens to be
-  ;; the last item in a template.  We disable abbrev mode to prevent
-  ;; our template from triggering another abbrev expansion (I do not
-  ;; know if the use of `insert' will actually trigger abbrevs).
-  (let ((abbrev-mode nil))
-    (setq snippet (make-snippet :bound (snippet-make-bound-overlay)))
-    (let ((start (point))
-          (count 0))
-      (dolist (line (snippet-split-string template (snippet-split-regexp) t))
-        (cond ((string-equal snippet-line-terminator line)
-               (insert "\n"))
-              ((string-equal snippet-indent line)
-               (indent-according-to-mode))
-              (t
-               (insert line))))
-      (move-overlay (snippet-bound snippet) start (1+ (point))))
-
-
-    ;; Step 3: Insert the exit marker so we know where to move point
-    ;; to when user is done with snippet.  If they did not specify
-    ;; where point should land, set the exit marker to the end of the
-    ;; snippet. 
-    (goto-char (overlay-start (snippet-bound snippet)))
-    (while (re-search-forward (regexp-quote snippet-exit-identifier)
-                              (overlay-end (snippet-bound snippet)) 
-                              t)
-      (replace-match "")
-      (setf (snippet-exit-marker snippet) (point-marker)))
-    
-    (unless (snippet-exit-marker snippet)
-      (let ((end (overlay-end (snippet-bound snippet))))
-        (goto-char (if (= end (point-max)) end (1- end))))
-      (setf (snippet-exit-marker snippet) (point-marker)))
-  
-    (set-marker-insertion-type (snippet-exit-marker snippet) t)
-
-    ;; Step 4: Create field overlays for each field and insert any
-    ;; default values for the field.
-    (goto-char (overlay-start (snippet-bound snippet)))
-    (while (re-search-forward (snippet-field-regexp)
-                              (overlay-end (snippet-bound snippet)) 
-                              t)
-      (let ((field (snippet-make-field-overlay (match-string 2)))
-            (start (match-beginning 0)))
-        (push field (snippet-fields snippet))
-        (replace-match (if (match-beginning 2) "\\2" ""))
-        (move-overlay field start (point))))
-    
-    ;; These are reversed so they are in order of how they appeared in
-    ;; the template as we index into this list when cycling field to
-    ;; field. 
-    (setf (snippet-fields snippet) (reverse (snippet-fields snippet))))
-
-  ;; Step 5: Position the point at the first field or the end of the
-  ;; template body if no fields are present.  We need to take into
-  ;; consideration the special case where the first field is at the
-  ;; start of the snippet (otherwise the call to snippet-next-field
-  ;; will go past it).
-  (let ((bound (snippet-bound snippet))
-        (first (car (snippet-fields snippet))))
-    (if (and first (= (overlay-start bound) (overlay-start first)))
-        (goto-char (overlay-start first))
-      (goto-char (overlay-start (snippet-bound snippet)))
-      (snippet-next-field))))
-
-(defun snippet-strip-abbrev-table-suffix (str)
-  "Strip a suffix of \"-abbrev-table\" if one is present."
-  (if (string-match "^\\(.*\\)-abbrev-table$" str)
-      (match-string 1 str)
-      str))
-
-(defun snippet-make-abbrev-expansion-hook (abbrev-table abbrev-name template)
-  "Define a function with the `no-self-insert' property set non-nil.
-The function name is composed of \"snippet-abbrev-\", the abbrev table
-name, and the name of the abbrev.  If the abbrev table name ends in
-\"-abbrev-table\", it is stripped."
-  (let ((abbrev-expansion (intern
-                           (concat "snippet-abbrev-" 
-                                   (snippet-strip-abbrev-table-suffix
-                                    (symbol-name abbrev-table))
-                                   "-"
-                                   abbrev-name))))
-    (fset abbrev-expansion 
-          `(lambda ()
-             ,(format (concat "Abbrev expansion hook for \"%s\".\n"
-                              "Expands to the following snippet:\n\n%s")
-                      abbrev-name
-                      template)
-             (snippet-insert ,template)))
-    (put abbrev-expansion 'no-self-insert t)
-    abbrev-expansion))
-
-(defmacro snippet-abbrev (abbrev-table abbrev-name template)
-  "Establish an abbrev for a snippet template.
-Set up an abbreviation called ABBREV-NAME in the ABBREV-TABLE (note
-that ABBREV-TABLE must be quoted) that expands into a snippet using
-the specified TEMPLATE string.
-
-This macro facilitates the creation of a function for the expansion
-hook to be used in `define-abbrev'.  In addition, it also sets the
-`no-self-insert' property on the function to prevent `abbrev-mode'
-from inserting the character that triggered the expansion (typically
-whitespace) which would otherwise interfere with the first field of a
-snippet."
-  (let ((name (gensym))
-        (table (gensym)))
-    `(let ((,name ,abbrev-name)
-           (,table ,abbrev-table))
-       (define-abbrev (symbol-value ,table) ,name ""
-         (snippet-make-abbrev-expansion-hook ,table ,name ,template)))))
-
-(defmacro snippet-with-abbrev-table (abbrev-table &rest snippet-alist)
-  "Establish a set of abbrevs for snippet templates.
-Set up a series of snippet abbreviations in the ABBREV-TABLE (note
-that ABBREV-TABLE must be quoted.  The abbrevs are specified in
-SNIPPET-ALIST.  For example:
-
-  (snippet-with-abbrev-table 'python-mode-abbrev-table
-    (\"for\" . \"for $${element} in $${sequence}:\")
-    (\"im\"  . \"import $$\"))
-
-See also `snippet-abbrev."
-  (let ((table (gensym)))
-    `(let ((,table ,abbrev-table))
-       (progn
-         ,@(loop for (name . template) in snippet-alist
-              collect (list 'snippet-abbrev table name template))))))
-
-(provide 'snippet)

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/sepia.git



More information about the Pkg-perl-cvs-commits mailing list