Открыть оболочку в emacs с заданным рабочим каталогом
Я хочу иметь команду make-shells
в emacs, которая откроет несколько буферов emacs-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? Или что-то вроде CEDET (и меньше полагаться на режимы оболочки и emacs) - намного лучшее решение для этого?
Ответы
Ответ 1
У меня возникли аналогичные проблемы с текущим отслеживанием каталогов, предоставляемым Emacs, поэтому я написал тот, который решает проблему раз и навсегда.
Отметьте здесь.
Короткий вариант того, что он делает, заключается в том, что вы изменяете приглашение оболочки, чтобы включить полный путь к текущему каталогу (только при работе внутри Emacs), и буфер оболочки Emacs будет использовать это.
Это означает, что вам больше не придется делать M-x dirs.
Там также пакет dirtrack
(поставляется с Emacs), который делает то же самое.
Мне нравится моя версия лучше, потому что она удаляет путь из подсказки. Я не хочу видеть весь путь в моем приглашении, так как мой текущий каталог часто очень длинный.
Как только вы используете одно из двух вышеупомянутых решений, вы можете упростить свою подпрограмму shell-dir
:
(defun shell-dir (name dir)
(interactive "sShell name: \nDDirectory: ")
(let ((default-directory dir))
(shell name)))
Ответ 2
Еще один ответ... Я нашел способ (в Linux), чтобы Emacs правильно вычислил текущий каталог, используя файловую систему /proc.
http://www.emacswiki.org/emacs/ShellDirtrackByProcfs
Таким образом, вам просто нужно запустить оболочку в любой директории, и Emacs автоматически определит ее и получит право на вкладку и т.д. правильно.