11

我想make-shells在 emacs 中有一个命令,它将打开许多 emacs-shell 缓冲区,每个缓冲区都有自己的工作目录。这个想法是,对于我正在处理的每个项目,我都有一个从该项目目录开始的 shell,因此我可以轻松地在它们之间切换。

目前我有这个代码:

(defun shell-dir (name dir)
  (interactive "sShell name: \nDDirectory: ")
  (shell name)
  (switch-to-buffer name)
  (comint-send-string (current-buffer) (concat "cd " dir "\r"))
  (sleep-for 0 10)
  (dirs))

(defun make-shells ()
  (interactive)
  (shell-dir "project1" "~/proj/project1")
  (shell-dir "project2" "~/proj/project2")
  (shell-dir "project3" "~/proj/project3")
  (delete-window))

不过,这非常难看,而且有一半的时间(dirs)没有选择正确的路径,所以制表符完成会中断,直到我手动重新运行它。是否有内置方法来设置 emacs shell 的当前工作目录?或者像CEDET 之类的东西(加上对 shell 和 emacs 模式的依赖更少)会是一个更好的解决方案吗?

4

2 回答 2

12

我在使用 Emacs 提供的当前目录跟踪时遇到了类似的问题,所以我写了一个可以一劳永逸地解决问题的方法。

在这里查看。

它所做的简短版本是您修改您的 shell 提示符以包含当前目录的完整路径(仅当在 Emacs 中运行时),并且 Emacs shell 缓冲区将使用它。

这意味着你永远不必再做M-x dirs一次。

还有dirtrack做同样事情的包(随 Emacs 提供)。

我更喜欢我的版本,因为它从提示中删除了路径。我不想在提示符中看到整个路径,因为我的当前目录通常很长。

使用上述两种解决方案之一后,您可以将shell-dir例程简化为:

(defun shell-dir (name dir)
  (interactive "sShell name: \nDDirectory: ")
  (let ((default-directory dir))
    (shell name)))
于 2011-02-02T21:57:32.233 回答
1

还有一个答案……我发现有一种方法(在 Linux 上)可以通过使用 /proc 文件系统让 Emacs 正确地找出当前目录。

http://www.emacswiki.org/emacs/ShellDirtrackByProcfs

这样,您只需要在任何目录中启动 shell,Emacs 就会自动找出并获得正确的制表符补全等。

于 2013-03-07T22:50:38.767 回答