From 49c7a608f9952607552aa512ea775b36659acd2a Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 3 Oct 2006 20:44:26 +0000 Subject: [PATCH] (sh-prev-thing): Massage to untangle the control flow a bit, simplify another bit, and add comments. --- lisp/ChangeLog | 5 ++ lisp/progmodes/sh-script.el | 92 +++++++++++++++++-------------------- 2 files changed, 48 insertions(+), 49 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 582bf3f93b2..6c00cbada7a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2006-10-03 Stefan Monnier + + * progmodes/sh-script.el (sh-prev-thing): Massage to untangle the + control flow a bit, simplify another bit, and add comments. + 2006-10-03 David Kastrup * help.el (describe-mode): For clicks on mode-line, use "@" diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 089715b4836..e1c17548959 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -2460,55 +2460,49 @@ we go to the end of the previous line and do not check for continuations." ;; (if (bolp) nil - (let (c min-point - (start (point))) - (save-restriction - (narrow-to-region - (if (sh-this-is-a-continuation) - (setq min-point (sh-prev-line nil)) - (save-excursion - (beginning-of-line) - (setq min-point (point)))) - (point)) - (skip-chars-backward " \t;") - (unless (looking-at "\\s-*;;") - (skip-chars-backward "^)}];\"'`({[") - (setq c (char-before))) - (sh-debug "stopping at %d c is %s start=%d min-point=%d" - (point) c start min-point) - (if (< (point) min-point) - (error "point %d < min-point %d" (point) min-point)) - (cond - ((looking-at "\\s-*;;") - ;; (message "Found ;; !") - ";;") - ((or (eq c ?\n) - (eq c nil) - (eq c ?\;)) - (let (done kwd next - (boundary (point))) - (skip-chars-forward " \t\n\\\\") - (while (and (not done) (not (eobp))) - (if next (setq boundary next)) - ;; skip forward over white space newline and \ at eol - (sh-debug "Now at %d start=%d" (point) start) - (if (>= (point) start) - (progn - (sh-debug "point: %d >= start: %d" (point) start) - nil) - (setq kwd (sh-get-word)) - (unless (eobp) (forward-char 1)) - (if (member kwd (sh-feature sh-leading-keywords)) - (setq next (point)) - (setq done t))) - (skip-chars-forward " \t\n\\\\")) - (goto-char boundary) - kwd)) - (t - ;; c -- return a string - (char-to-string c) - )) - )))) + (let ((start (point)) + (min-point (if (sh-this-is-a-continuation) + (sh-prev-line nil) + (line-beginning-position)))) + (skip-chars-backward " \t;" min-point) + (if (looking-at "\\s-*;;") + ;; (message "Found ;; !") + ";;" + (skip-chars-backward "^)}];\"'`({[" min-point) + (let ((c (if (> (point) min-point) (char-before)))) + (sh-debug "stopping at %d c is %s start=%d min-point=%d" + (point) c start min-point) + (if (not (memq c '(?\n nil ?\;))) + ;; c -- return a string + (char-to-string c) + ;; Return the leading keyword of the "command" we supposedly + ;; skipped over. Maybe we skipped too far (e.g. past a `do' or + ;; `then' that precedes the actual command), so check whether + ;; we're looking at such a keyword and if so, move back forward. + (let ((boundary (point)) + kwd next) + (while + (progn + ;; Skip forward over white space newline and \ at eol. + (skip-chars-forward " \t\n\\\\" start) + (if (>= (point) start) + (progn + (sh-debug "point: %d >= start: %d" (point) start) + nil) + (if next (setq boundary next)) + (sh-debug "Now at %d start=%d" (point) start) + (setq kwd (sh-get-word)) + ;; The reason for this next line is unclear. + ;; says "the need for this was + ;; expermientally determined". --Stef + (when (< (point) start) (forward-char 1)) + (if (member kwd (sh-feature sh-leading-keywords)) + (progn + (setq next (point)) + t) + nil)))) + (goto-char boundary) + kwd))))))) (defun sh-this-is-a-continuation () -- 2.39.2