From: Leo Liu <sdl.web@gmail.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: "John Eaton" <jwe@octave.org>,
"Jordi Gutiérrez Hermoso" <jordigh@octave.org>,
14285@debbugs.gnu.org
Subject: bug#14285: 24.3; New octave feature: octave-update-function-file-comment
Date: Sat, 27 Apr 2013 21:35:57 +0800 [thread overview]
Message-ID: <m1d2tg5c5e.fsf@gmail.com> (raw)
In-Reply-To: <jwv61z8unf5.fsf-monnier+emacs@gnu.org> (Stefan Monnier's message of "Sat, 27 Apr 2013 09:19:30 -0400")
Thank you, Stefan, for the comments. Patch updated.
lisp/files.el | 3 +-
lisp/progmodes/octave.el | 115 +++++++++++++++++++++++++++++++++++++++--------
2 files changed, 99 insertions(+), 19 deletions(-)
diff --git a/lisp/files.el b/lisp/files.el
index 80166961..3af27bde 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -4540,7 +4540,8 @@ (defun basic-save-buffer ()
(insert ?\n))))
;; Support VC version backups.
(vc-before-save)
- (run-hooks 'before-save-hook)
+ ;; Don't let errors prevent saving the buffer.
+ (with-demoted-errors (run-hooks 'before-save-hook))
(or (run-hook-with-args-until-success 'write-contents-functions)
(run-hook-with-args-until-success 'local-write-file-hooks)
(run-hook-with-args-until-success 'write-file-functions)
diff --git a/lisp/progmodes/octave.el b/lisp/progmodes/octave.el
index f8b9e4f6..ebdcb8b1 100644
--- a/lisp/progmodes/octave.el
+++ b/lisp/progmodes/octave.el
@@ -1010,25 +1010,103 @@ (defun octave-maybe-insert-continuation-string ()
(delete-horizontal-space)
(insert (concat " " octave-continuation-string))))
+(defun octave-function-file-p ()
+ "Return non-nil if the first token is \"function\".
+The value is (START END NAME-START NAME-END) of the function."
+ (save-excursion
+ (goto-char (point-min))
+ (when (equal (funcall smie-forward-token-function) "function")
+ (forward-word -1)
+ (let* ((start (point))
+ (end (progn (forward-sexp 1) (point)))
+ (name (when (progn
+ (goto-char start)
+ (re-search-forward octave-function-header-regexp
+ end t))
+ (list (match-beginning 3) (match-end 3)))))
+ (cons start (cons end name))))))
+
+;; Like forward-comment but stop at non-comment blank
+(defun octave-skip-comment-forward (limit)
+ (let ((ppss (syntax-ppss)))
+ (if (nth 4 ppss)
+ (goto-char (nth 8 ppss))
+ (goto-char (or (comment-search-forward limit t) (point)))))
+ (while (and (< (point) limit) (looking-at-p "\\s<"))
+ (forward-comment 1)))
+
+;;; First non-copyright comment block
+(defun octave-function-file-comment ()
+ "Beginnning and end positions of the function file comment."
+ (save-excursion
+ (goto-char (point-min))
+ (let ((bound (progn (forward-comment (point-max)) (point))))
+ (goto-char (point-min))
+ ;; Copyright block: octave/libinterp/parse-tree/lex.ll around line 1634
+ (when (save-excursion
+ (comment-search-forward bound t)
+ (when (eq (char-after) ?\{) ; case of block comment
+ (forward-char 1))
+ (skip-syntax-forward "-")
+ (let ((case-fold-search t))
+ (looking-at-p "\\(?:copyright\\|author\\)\\_>")))
+ (octave-skip-comment-forward bound))
+ (let ((beg (comment-search-forward bound t)))
+ (when beg
+ (goto-char beg)
+ (octave-skip-comment-forward bound)
+ (list beg (point)))))))
+
(defun octave-sync-function-file-names ()
"Ensure function name agree with function file name.
See Info node `(octave)Function Files'."
(interactive)
+ (when buffer-file-name
+ (pcase-let ((`(,start ,_end ,name-start ,name-end)
+ (octave-function-file-p)))
+ (when (and start name-start)
+ (let ((func (buffer-substring name-start name-end))
+ (file (file-name-sans-extension
+ (file-name-nondirectory buffer-file-name))))
+ (save-excursion
+ (when (and (not (equal file func))
+ (progn
+ (goto-char name-start)
+ (yes-or-no-p
+ "Function name different from file name. Fix? ")))
+ (delete-region name-start name-end)
+ (insert file))))))))
+
+(defun octave-update-function-file-comment (beg end &optional no-query)
+ "Update function file comment between BEG and END."
+ (interactive
+ (progn
+ (barf-if-buffer-read-only)
+ (if (use-region-p)
+ (list (region-beginning) (region-end) current-prefix-arg)
+ (append (or (octave-function-file-comment)
+ (error "No function file comment found"))
+ (list current-prefix-arg)))))
(save-excursion
- (when (and buffer-file-name
- (prog2
- (goto-char (point-min))
- (equal (funcall smie-forward-token-function) "function")
- (forward-word -1)))
- (let ((file (file-name-sans-extension
- (file-name-nondirectory buffer-file-name)))
- (func (and (re-search-forward octave-function-header-regexp nil t)
- (match-string 3))))
- (when (and func
- (not (equal file func))
- (yes-or-no-p
- "Function name different from file name. Fix? "))
- (replace-match file nil nil nil 3))))))
+ (let* ((bounds (or (octave-function-file-p)
+ (error "Not in a function file buffer")))
+ (func (if (cddr bounds)
+ (apply #'buffer-substring (cddr bounds))
+ (error "Function name not found")))
+ (old-func (progn
+ (goto-char beg)
+ (when (and (re-search-forward "usage:\\|@deftypefn" end t)
+ (re-search-forward
+ "[=}]\\s-*\\(\\(?:\\sw\\|\\s_\\)+\\)\\s-*("
+ (line-end-position) t))
+ (match-string 1))))
+ (old-func (read-string
+ (format (if old-func "From (default %s): " "From: ")
+ old-func)
+ nil nil old-func)))
+ (when (and func old-func (not (equal func old-func)))
+ (perform-replace old-func func
+ (not no-query) nil 'delimited nil nil beg end)))))
\f
;;; Indentation
@@ -1356,10 +1434,11 @@ (define-skeleton octave-insert-defun
(t (concat vals " = ")))
name
args))
- \n "function " > str \n \n
- octave-block-comment-start "usage: " str \n
- octave-block-comment-start \n octave-block-comment-start
- \n _ \n
+ \n octave-block-comment-start "usage: " str \n
+ octave-block-comment-start \n
+ octave-block-comment-start \n
+ "function " > str \n
+ _ \n
"endfunction" > \n)
\f
;;; Communication with the inferior Octave process
--
1.8.2
next prev parent reply other threads:[~2013-04-27 13:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-27 8:14 bug#14285: 24.3; New octave feature: octave-update-function-file-comment Leo Liu
2013-04-27 13:19 ` Stefan Monnier
2013-04-27 13:35 ` Leo Liu [this message]
2013-04-27 17:50 ` Leo Liu
2013-05-02 7:20 ` Leo Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m1d2tg5c5e.fsf@gmail.com \
--to=sdl.web@gmail.com \
--cc=14285@debbugs.gnu.org \
--cc=jordigh@octave.org \
--cc=jwe@octave.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).