Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make emacs stay in the current directory

Tags:

emacs

When I start working on a project in emacs, I use M-x cd to get into the project root directory. But every time I use C-x C-f to open a file in one of the subdirectories (like app/model/Store.rb) emacs changes current directory to that of the file. Is there a way to make emacs stay at the root?

like image 924
Mad Wombat Avatar asked Apr 13 '10 04:04

Mad Wombat


2 Answers

How about this? It replaces the regular find-file command with your own which always starts in some "root" directory (customize the find-file-root-dir variable):

(defvar find-file-root-dir "~/"
  "Directory from which to start all find-file's")
(defun find-file-in-root ()
  "Make find-file always start at some root directory."
  (interactive)
  (let ((default-directory find-file-root-dir))
    (call-interactively 'find-file)))
(global-set-key (kbd "C-x C-f") 'find-file-in-root)
like image 58
Trey Jackson Avatar answered Sep 22 '22 03:09

Trey Jackson


Assuming that you want the working directory of a file to be set to whatever the working directory was before you executed find-file, you could try the following:

(defmacro disallow-cd-in-function (fun)
  "Prevent FUN (or any function that FUN calls) from changing directory."
  `(defadvice ,fun (around dissallow-cd activate)
     (let ((old-dir default-directory) ; Save old directory
           (new-buf ad-do-it)) ; Capture new buffer
       ;; If FUN returns a buffer, operate in that buffer in addition
       ;; to current one.
       (when (bufferp new-buf)
         (set-buffer new-buf)
         (setq default-directory old-dir))
       ;; Set default-directory in the current buffer
       (setq default-directory old-dir))))

Armed with this macro, go search for operations that set the variable default-directory: M-x find-library files; M-x occur (setq default-directory. After some investigation, you discover that the desired function is called find-file-noselect-1. Also, it looks like set-visited-file-name is also a candidate. So:

(disallow-cd-in-function find-file-noselect-1)
(disallow-cd-in-function set-visited-file-name)

Note

Note that (disallow-cd-in-function find-file) would work just fine, but then if you switched to ido-mode, you'd be opening files with ido-find-file instead of find-file. Both of these functions ultimately use find-file-noselect-1, so hitting that with the macro is a more univeral solution.

like image 35
Ryan C. Thompson Avatar answered Sep 22 '22 03:09

Ryan C. Thompson