如何使emacs保持在当前目录中

时间:2010-04-13 04:26:46

标签: emacs

当我开始处理emacs中的项目时,我使用M-x cd进入项目根目录。但每次我使用C-x C-f在其中一个子目录(如app / model / Store.rb)中打开文件时,emacs会将当前目录更改为该文件的目录。有没有办法让emacs留在根源?

5 个答案:

答案 0 :(得分:3)

这个怎么样?它用你自己的常规find-file命令替换,它总是从一些“root”目录开始(自定义find-file-root-dir变量):

(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)

答案 1 :(得分:3)

假设您希望在执行 find-file 之前将文件的工作目录设置为的工作目录,您可以尝试以下操作:< / p>

(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))))

使用此宏,搜索设置变量default-directory的操作: M-x查找库文件; Mx发生(setq default-directory 。经过一些调查,您发现所需的函数被称为find-file-noselect-1。此外,看起来set-visited-file-name也是候选函数。所以:

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

注意

请注意,(disallow-cd-in-function find-file)可以正常使用,但如果您切换到ido-mode,则会使用ido-find-file而不是find-file打开文件。这两个函数最终都使用find-file-noselect-1,所以使用宏来解决这个问题是一个更加普遍的解决方案。

答案 2 :(得分:1)

  

有没有办法让emacs留在root?

不,没有。 C-x C-f始终从您正在访问的缓冲区的默认目录开始访问。默认情况下,默认目录与文件位于同一目录中。您可以使用M-x cd更改这些(针对每个缓冲区单独更改)。

但那不是你想要的。您应该做的是C-x b*scratch*(其默认目录与您从中创建Emacs的位置相同 - 在您的单词“root”中),然后访问一个新文件。如果您需要经常这样做,只需在那里打开一个dired并按照您的方式工作。

答案 3 :(得分:1)

我很感激我没有直接回答你的问题,但我注意到你在一条评论中对你的要求更具体:“我不使用编译或重新编译,我只是倾向于关闭我不工作的文件on,因为再次打开文件需要更少的击键次数“。

你有没有开启缓冲区切换的ido?如果暂时排除目录事物,则使用ido切换文件或缓冲区的键击次数相同(C-x C-f vs C-x b,后跟文件名中的几个字符)。如果你包含目录,那么切换文件就更加棘手了。坚持使用缓冲区要容易得多。

更进一步,在'anything.el'的帮助下,很容易抽象出给定文件是在缓冲区中还是在使用文件缓存的文件中。例如,如果您执行以下操作:

(file-cache-add-directory-recursively "/my/ruby/project") ".*\\.rb$")

并运行'anything-for-files'(我将它绑定到C-x f)列出了所有打开的缓冲区,以及刚刚添加到文件缓存中的所有文件;隔离给定文件通常只需要一两个字符。

项目中的任何文件都是4或5键按下,它们所在的目录或它们是否在缓冲区中变得无关紧要。

希望这有用......

答案 4 :(得分:0)

很抱歉,我没有详细说明,但您可以向find-file-hook添加一个功能,将默认目录重置为您想要的任何内容。