                  mural-tagfile-to-process))))
 
 (defun mural-get-server (tagfile)
+  "Return the process for the given tagfile, if necessary creating/restarting it"
   (let ((proc (cdr (assoc tagfile mural-tagfile-to-process))))
     (if (or (not proc)
             (not (eq (process-status proc) 'run)))

  "echo server responses to *muralserver* buffer")

(defvar ido-dynamic-match-fn nil)
(defvar mural-tagfile-to-process '())

(defun mural-add-tagfile (tagfile)
  (mural-get-server (expand-file-name tagfile)))

(defun mural-add-tag-process-entry (tagfile process)
  (setq mural-tagfile-to-process
        (cons
         (cons tagfile process)

        rst))))

(defun mural-tagfile-for-filename (filename)
  "Given a source file, return the name of the associated
tagfile.  This matches based on sharing the same parent
directory, so /home/bob/project/foo.c will match the tag file in
/home/bobo/project/TAGS.  If no match is found, return nil"
  (let ((resolved-fname (file-truename filename)))
    (car (filter
          (lambda (tagfile)
            ;; file-truename resolves symlinks so we make sure to
            ;; compare the same thing
            (eq 0 (string-match
                   (file-truename (file-name-directory tagfile))
                   resolved-fname)))
          (mapcar 'car mural-tagfile-to-process)))))

(defun mural-query (query tagfile)
  "Run a fuzzy QUERY against TAGFILE and return the results as
specified in mural-parse-response"
  (if (equal "" query)
      '()
    (let ((proc (mural-get-server tagfile))
