 will be marked from the beginning up to this point (that is, up
 to and including character (1- go-mode-mark-cs-end)).")
 (make-variable-buffer-local 'go-mode-mark-cs-end)
+
+(defvar go-mode-mark-string-end 1
+  "The point at which the string cache ends.  The buffer
+will be marked from the beginning up to this point (that is, up
+to and including character (1- go-mode-mark-string-end)).")
+(make-variable-buffer-local 'go-mode-mark-string-end)
+
+(defvar go-mode-mark-comment-end 1
+  "The point at which the comment cache ends.  The buffer
+will be marked from the beginning up to this point (that is, up
+to and including character (1- go-mode-mark-comment-end)).")
+(make-variable-buffer-local 'go-mode-mark-comment-end)
 
 (defvar go-mode-mark-nesting-end 1
   "The point at which the nesting cache ends.  The buffer will be

	     (setq pos end)))))
       (setq go-mode-mark-cs-end pos)))))



(defun go-mode-font-lock-cs (limit comment)
  "Helper function for highlighting comment/strings.  If COMMENT is t,

       (when (/= (skip-chars-backward "[:word:]_") 0)
         (not (looking-at go-mode-non-terminating-keywords-regexp)))))))

(defun go-mode-whitespace-p (char)
  "Is char whitespace in the syntax table for go."
  (eq 32 (char-syntax char)))

(defun go-mode-backward-skip-comments ()
  "Skip backward over comments and whitespace."
  ;; only proceed if point is in a comment or white space
  (if (or (go-mode-in-comment)
	  (go-mode-whitespace-p (char-after (point))))
      (let ((loop-guard t))
	(while (and
		loop-guard
		(not (bobp)))

	  (cond ((go-mode-whitespace-p (char-after (point)))
		 ;; moves point back over any whitespace
		 (re-search-backward "[^[:space:]]"))

		((go-mode-in-comment)
		 ;; move point to char preceeding current comment
		 (goto-char (1- (car (go-mode-in-comment)))))
		
		;; not in a comment or whitespace? we must be done.
		(t (setq loop-guard nil)
		   (forward-char 1)))))))

(defun go-mode-indentation ()
  "Compute the ideal indentation level of the current line.
