[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Convenient way to set "root of my project"?

From: Andreas Politz
Subject: Re: Convenient way to set "root of my project"?
Date: Wed, 28 Jan 2009 10:03:12 +0100
User-agent: Mozilla-Thunderbird (X11/20081018)

Brett Hoerner wrote:
I'd like for commands like "grep" and "find file" to open at the root
of my "project" (I know emacs has no knowledge of projects).  Does
anyone do / use something similar?

For example, I'm in /foo/bar/blah/doo/woo/file and I M-x grep, it's
based in /foo/bar/blah/doo/woo/ and I don't want to take the time to
change the path every time - 99% of the time I want to search my
current project (let's say /foo) for something.  Ditto for find-file,
changes are the file I want isn't in /foo/bar/blah/doo/woo/, but
somewhere further up the tree (and down another branch), I'd love to
start at /foo.

Ideas?  Or maybe I'm using both of these wrong and someone can tell me
the proper emacs-foo?


Here is some code to play around with. The problem I thinks is,
there is no hook into the post process of M-x commands. By
the time you know which command is running, it is to late to
set up a directory.
The solution I've made is to rebind M-x and artifically trigger
post/pre-command-hooks. I don't know exactly what sideeffects
this has, but I also don't see any other convenient solution.
(For the problem of setting up a special directory for certain
commands, regardless of how (M-x or keys) they where invoked.)


(defvar project-directory-commands-hash nil)
(defvar project-directory-temp nil)
(make-variable-buffer-local 'project-directory-temp)

(defvar project-directory-commands '(rgrep))

(define-minor-mode project-directory-commands-mode
  "Use `project-directory' instead of `default-directory' for
certain commands"
  nil nil nil
  :global t
    (add-hook 'pre-command-hook 'project-directory-pre-command)
    (add-hook 'post-command-hook 'project-directory-post-command)
    (setq project-directory-commands-hash (make-hash-table))
    (global-set-key (kbd "M-x") 'extended-execute-extended-command)
    (dolist (c project-directory-commands)
      (puthash c t project-directory-commands-hash)))

    (global-set-key (kbd "M-x") 'execute-extended-command)
    (remove-hook 'pre-command-hook 'project-directory-pre-command)
    (remove-hook 'post-command-hook 'project-directory-post-command)
    (clrhash project-directory-commands-hash))))

(defun project-directory-pre-command ()
  (when (and (gethash this-command project-directory-commands-hash)
             (boundp 'project-directory)
    (setq project-directory-temp default-directory)
    (setq default-directory project-directory)))

(defun project-directory-post-command ()
  (when project-directory-temp
    (setq default-directory project-directory-temp)
    (setq project-directory-temp nil)))

(defun extended-execute-extended-command (command)
  (interactive (list
                    ((eq '- current-prefix-arg) "- ")
                    ((equal current-prefix-arg '(4)) "C-u ")
                    (current-prefix-arg (format "%d " (prefix-numeric-value 
                   "M-x ")
                  obarray 'commandp t nil 'extended-command-history))))
  (let ((this-command command))
    (run-hooks 'pre-command-hook))
  (condition-case nil
      (command-execute command)
    (error nil))
  (let ((this-command command))
    (run-hooks 'post-command-hook)))

;;(set (make-local-variable 'project-directory) "/")
(provide 'project-directory-commands)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]