 		(contextstr (match-string 6 line)))
 	    (put-text-property 0 1 'contextstr contextstr completion)
 	    (put-text-property 0 1 'matchtype matchtype completion)
-	    (push completion completion-results))))
-      completion-results))
+	    (push completion racer-completion-results))))
+      racer-completion-results))
 
-(defun racer--prefix () 
-  (setq tmpfilename (concat (buffer-file-name) ".racertmp"))
-  (racer--write-tmp-file tmpfilename)
-  (setenv "RUST_SRC_PATH" rust-srcpath)
-  (let ((lines (process-lines racer-cmd 
+(defun racer--prefix ()
+  "Run the racer prefix command and process the results."
+  (setq racer-tmp-file-name (concat (buffer-file-name) ".racertmp"))
+  (racer--write-tmp-file racer-tmp-file-name)
+  (setenv "RUST_SRC_PATH" racer-rust-src-path)
+  (let ((lines (process-lines racer-cmd
 			      "prefix"
-			      (number-to-string linenum)
-			      (number-to-string col) 
-			      tmpfilename)))
-    (delete-file tmpfilename)
+			      (number-to-string racer-line-number)
+			      (number-to-string racer-column-number)
+			      racer-tmp-file-name)))
+    (delete-file racer-tmp-file-name)
     (when (string-match "^PREFIX \\(.+\\),\\(.+\\),\\(.*\\)$" (nth 0 lines))
       (match-string 3 (nth 0 lines)))))
 
-
 (defun racer--complete-at-point-fn ()
-  (setq tmpfilename (concat (buffer-file-name) ".racertmp"))
-  (racer--write-tmp-file tmpfilename)
-  (setenv "RUST_SRC_PATH" rust-srcpath)
+  "Run the racer complete command and process the results."
+  (setq racer-tmp-file-name (concat (buffer-file-name) ".racertmp"))
+  (racer--write-tmp-file racer-tmp-file-name)
+  (setenv "RUST_SRC_PATH" racer-rust-src-path)
   (save-excursion
-    (let ((lines (process-lines racer-cmd 
+    (let ((lines (process-lines racer-cmd
 				"complete"
-				(number-to-string linenum)
-				(number-to-string col) 
-				tmpfilename)))
-      (delete-file tmpfilename)
+				(number-to-string racer-line-number)
+				(number-to-string racer-column-number)
+				racer-tmp-file-name)))
+      (delete-file racer-tmp-file-name)
       (dolist (line lines)
 	(when (string-match "^MATCH \\([^,]+\\),\\(.+\\)$" line)
 	  (let ((completion (match-string 1 line)))
-	    (push completion completion-results)))
+	    (push completion racer-completion-results)))
 	
 	(when (string-match "^PREFIX \\(.+\\),\\(.+\\),\\(.*\\)$" line)
-	  (setq start (string-to-number (match-string 1 line)))
-	  (setq end (string-to-number (match-string 2 line))))
+	  (setq racer-start-pos (string-to-number (match-string 1 line)))
+	  (setq racer-end-pos (string-to-number (match-string 2 line))))
 	)
       )
     )
   ;(message "start %s end %s" start end)
-  (list (- (point) (- end start)) (point) completion-results)
+  (list (- (point) (- racer-end-pos racer-start-pos))
+        (point)
+        racer-completion-results)
   )
 
 (defun racer-company-complete (command &optional arg &rest ignored)
+  "Run the racer command for `COMMAND' and format using `ARG'.
+`IGNORED' is unused."
   (interactive)
   ;(message "PHIL racer-company-complete %s %s %s" command arg ignored)
   (when (looking-back "[a-zA-z1-9:.]")
-    (case command
+    (cl-case command
       (prefix (racer--prefix))
       (candidates (racer--candidates))
       (duplicates t)
       (sorted nil)
-      (annotation 
+      (annotation
        (progn
 	 (format "%s %10s : %s"
 		 (make-string (max 0 (- 20 (length arg))) ? )

	     (local-set-key "\t" 'racer--complete-or-indent)
	     (local-set-key "\M-." 'racer-find-definition)
	     (setq company-idle-delay nil)
	     ) 
	  nil)


(provide 'racer)


;; (add-hook 'completion-at-point-functions 'racer-complete nil)

(defun racer--complete-or-indent ()
  "Complete with company-mode or indent."
  (interactive)
  (if (company-manual-begin)
      (company-complete-common)
    (indent-according-to-mode)))

(defun string/ends-with (s ending)
  "Return non-nil if string S ends with ENDING."
  (cond ((>= (length s) (length ending))
         (let ((elength (length ending)))
           (string= (substring s (- 0 elength)) ending)))
        (t nil)))

(defun racer-find-definition ()
  "Run the racer find-definition command and process the results."
  (interactive)
  (setq racer-tmp-file-name (concat (buffer-file-name) ".racertmp"))
  (racer--write-tmp-file racer-tmp-file-name)
  (setenv "RUST_SRC_PATH" racer-rust-src-path)
  (push-mark)
  (let ((lines (process-lines racer-cmd
			      "find-definition"
			      (number-to-string racer-line-number)
			      (number-to-string racer-column-number)
			      racer-tmp-file-name)))
    (delete-file racer-tmp-file-name)
    (dolist (line lines)
      (when (string-match "^MATCH \\([^,]+\\),\\([^,]+\\),\\([^,]+\\),\\([^,]+\\).*$" line)
	(let ((linenum (match-string 2 line))
