From: Jonas Bernoulli Date: Wed, 19 Dec 2012 19:51:40 +0000 (-0500) Subject: * lisp/emacs-lisp/lisp-mnt.el (lm-section-end): Always end before the X-Git-Tag: emacs-24.3.90~173^2~7^2~552 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ee3c0aeca4e1e31e2b171a4753782a37076e7457;p=emacs.git * lisp/emacs-lisp/lisp-mnt.el (lm-section-end): Always end before the following non-comment text. (lm-header-multiline): Continuation lines need to be indented more than the first line. (lm-homepage): New function. (lm-with-file): Don't be confused if narrowing is in effect. * doc/lispref/tips.texi (Library Headers): New header keyword `Homepage'. Make continuation lines syntax more precise. Fixes: debbugs:13207 --- diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index a0bbafb116f..d8a825374ed 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,8 @@ +2012-12-19 Jonas Bernoulli + + * tips.texi (Library Headers): New header keyword `Homepage'. + Make continuation lines syntax more precise. + 2012-12-17 Eli Zaretskii * files.texi (File Attributes, Changing Files): Update to include diff --git a/doc/lispref/tips.texi b/doc/lispref/tips.texi index d54d91b238a..854ce8f124f 100644 --- a/doc/lispref/tips.texi +++ b/doc/lispref/tips.texi @@ -942,6 +942,7 @@ explains these conventions, starting with an example: ;; Created: 14 Jul 2010 @group ;; Keywords: languages +;; Homepage: http://example.com/foo ;; This file is not part of GNU Emacs. @@ -980,8 +981,7 @@ the conventional possibilities for @var{header-name}: @item Author This line states the name and email address of at least the principal author of the library. If there are multiple authors, list them on -continuation lines led by @code{;;} and whitespace (this is easier -for tools to parse than having more than one author on one line). +continuation lines led by @code{;;} and a tab or at least two spaces. We recommend including a contact email address, of the form @samp{<@dots{}>}. For example: @@ -1028,6 +1028,9 @@ The name of this field is unfortunate, since people often assume it is the place to write arbitrary keywords that describe their package, rather than just the relevant Finder keywords. +@item Homepage +This line states the homepage of the library. + @item Package-Version If @samp{Version} is not suitable for use by the package manager, then a package can define @samp{Package-Version}; it will be used instead. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 3fd8b363546..f61eb7b2bfd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,4 +1,11 @@ -2012-12-19 Stefan Monnier +2012-12-19 Jonas Bernoulli + + * emacs-lisp/lisp-mnt.el (lm-section-end): Always end before the + following non-comment text (bug#13207). + (lm-header-multiline): Continuation lines need to be indented more than + the first line. + (lm-homepage): New function. + (lm-with-file): Don't be confused if narrowing is in effect. * vc/diff-mode.el (diff-post-command-hook): Don't ignore changes at the very beginning of a hunk (e.g. killing the first line). diff --git a/lisp/emacs-lisp/lisp-mnt.el b/lisp/emacs-lisp/lisp-mnt.el index f9a1c5dbf83..807b4d2eb86 100644 --- a/lisp/emacs-lisp/lisp-mnt.el +++ b/lisp/emacs-lisp/lisp-mnt.el @@ -208,10 +208,10 @@ If the given section does not exist, return nil." The HEADER is the section string marking the beginning of the section. If the given section does not exist, return nil. -The end of the section is defined as the beginning of the next -section of the same level or lower. The function -`lisp-outline-level' is used to compute the level of a section. -If no such section exists, return the end of the buffer." +The section ends before the first non-comment text or the next +section of the same level or lower; whatever comes first. The +function `lisp-outline-level' is used to compute the level of +a section." (require 'outline) ;; for outline-regexp. (let ((start (lm-section-start header))) (when start @@ -229,9 +229,15 @@ If no such section exists, return the end of the buffer." (beginning-of-line) (lisp-outline-level)) level))) - (if next-section-found - (line-beginning-position) - (point-max))))))) + (min (if next-section-found + (progn (beginning-of-line 0) + (unless (looking-at " ") + (beginning-of-line 2)) + (point)) + (point-max)) + (progn (goto-char start) + (while (forward-comment 1)) + (point)))))))) (defsubst lm-code-start () "Return the buffer location of the `Code' start marker." @@ -282,13 +288,8 @@ The returned value is a list of strings, one per line." (when res (setq res (list res)) (forward-line 1) - (while (and (or (looking-at (concat lm-header-prefix "[\t ]+")) - (and (not (looking-at - (lm-get-header-re "\\sw\\(\\sw\\|\\s_\\)*"))) - (looking-at lm-header-prefix))) - (goto-char (match-end 0)) - (looking-at ".+")) - (setq res (cons (match-string-no-properties 0) res)) + (while (looking-at "^;+\\(\t\\|[\t\s]\\{2,\\}\\)\\(.+\\)") + (push (match-string-no-properties 2) res) (forward-line 1))) (nreverse res)))) @@ -306,10 +307,13 @@ If FILE is nil, execute BODY in the current buffer." (emacs-lisp-mode) ,@body) (save-excursion - ;; Switching major modes is too drastic, so just switch - ;; temporarily to the Emacs Lisp mode syntax table. - (with-syntax-table emacs-lisp-mode-syntax-table - ,@body)))))) + (save-restriction + (widen) + (goto-char (point-min)) + ;; Switching major modes is too drastic, so just switch + ;; temporarily to the Emacs Lisp mode syntax table. + (with-syntax-table emacs-lisp-mode-syntax-table + ,@body))))))) ;; Fixme: Probably this should be amalgamated with copyright.el; also ;; we need a check for ranges in copyright years. @@ -489,6 +493,14 @@ absent, return nil." (when start (buffer-substring-no-properties start (lm-commentary-end)))))) +(defun lm-homepage (&optional file) + "Return the homepage in file FILE, or current buffer if FILE is nil." + (let ((page (lm-with-file file + (lm-header "\\(?:x-\\)?\\(?:homepage\\|url\\)")))) + (if (and page (string-match "^<.+>$" page)) + (substring page 1 -1) + page))) + ;;; Verification and synopses (defun lm-insert-at-column (col &rest strings)