|
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 2.0.0.17 (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? Thanks, Brett
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.) -ap ------------%<--------------------- (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 (cond (project-directory-commands-mode (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))) (t (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) 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 (intern (completing-read (concat (cond ((eq '- current-prefix-arg) "- ") ((equal current-prefix-arg '(4)) "C-u ") (current-prefix-arg (format "%d " (prefix-numeric-value current-prefix-arg)))) "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) ------------%<---------------------
[Prev in Thread] | Current Thread | [Next in Thread] |