Subject: bug#4612: 23.1; checkdoc insert ";;; Code" before autoload cookie

From: Kevin Ryde <[email-masked]>
Date: Fri, 02 Oct 2009 10:10:04 +1000

On foo.el below M-x checkdoc inserts ";;; Code" as

    ;;;###autoload
    ;;; Code:
    (defun foo ()

where I hoped it would be before the cookie like say

    ;;; Code:

    ;;;###autoload
    (defun foo ()

generate-file-autoloads etc is happy with either, but the latter reads
better for humans.  I struck this in one of my own .el files which had
an autoload cookie on the first func.

Incidentally, I see the `cont' loop puts ";;; Code" after any initial
`require' forms.  Is that actually usual, or usual any more?  I think
I've only ever seen `require's after ";;; Code".

2009-10-01  Kevin Ryde  <[email-masked]>

	* emacs-lisp/checkdoc.el (checkdoc-file-comments-engine): When
	inserting ";;; Code" put it before any ";;;###autoload" cookie on
	the first form.  And insert a blank line after ";;; Code" since
	that's usual style.

--- checkdoc.el.~1.74.~	2009-09-18 08:22:27.000000000 +1000
+++ checkdoc.el	2009-09-25 18:22:29.000000000 +1000
@@ -2304,15 +2304,18 @@
        (or
 	;; * Code section
 	(if (not (lm-code-mark))
-	    (let ((cont t))
+	    (let ((cont t)
+		  pos)
 	      (goto-char (point-min))
-	      (while (and cont (re-search-forward "^(" nil t))
-		(setq cont (looking-at "require\\s-+")))
+	      ;; matching ";;;###" to keep autoload cookie with the form
+	      (while (and cont (re-search-forward "^\\(;;;###.*\n\\)?(" nil t))
+		(setq pos (match-beginning 0)
+		      cont (looking-at "require\\s-+")))
 	      (if (and (not cont)
 		       (checkdoc-y-or-n-p
 			"There is no ;;; Code: marker.  Insert one? "))
-		  (progn (beginning-of-line)
-			 (insert ";;; Code:\n")
+		  (progn (goto-char pos)
+			 (insert ";;; Code:\n\n")
 			 nil)
 		(checkdoc-create-error
 		 "You should have a section marked \";;; Code:\""

In GNU Emacs 23.1.1 (i486-pc-linux-gnu, GTK+ Version 2.16.5)
 of 2009-09-14 on raven, modified by Debian
configured using `configure  '--build=i486-linux-gnu' '--host=i486-linux-gnu' '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib' '--localstatedir=/var/lib' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-pop=yes' '--enable-locallisppath=/etc/emacs23:/etc/emacs:/usr/local/share/emacs/23.1/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/23.1/site-lisp:/usr/share/emacs/site-lisp:/usr/share/emacs/23.1/leim' '--with-x=yes' '--with-x-toolkit=gtk' '--with-toolkit-scroll-bars' 'build_alias=i486-linux-gnu' 'host_alias=i486-linux-gnu' 'CFLAGS=-DDEBIAN -g -O2' 'LDFLAGS=-g' 'CPPFLAGS=''

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: en_AU
  value of $XMODIFIERS: nil
  locale-coding-system: iso-latin-1-unix
  default-enable-multibyte-characters: t