当我开始处理emacs中的项目时,我使用M-x cd进入项目根目录。但每次我使用C-x C-f在其中一个子目录(如app / model / Store.rb)中打开文件时,emacs会将当前目录更改为该文件的目录。有没有办法让emacs留在根源?
答案 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
添加一个功能,将默认目录重置为您想要的任何内容。