Открыть оболочку в Emacs с заданным рабочим каталогом - PullRequest
11 голосов
/ 03 февраля 2011

Я хочу иметь команду 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) будет гораздо лучшим решением для этого?

Ответы [ 2 ]

10 голосов
/ 03 февраля 2011

У меня были похожие проблемы с текущим отслеживанием каталогов, предоставляемым Emacs, поэтому я написал такой, который решает проблему раз и навсегда.

Проверьте это здесь .

Короткая версия того, что он делает, заключается в том, что вы модифицируете приглашение оболочки, чтобы включить полный путь к текущему каталогу (только при работе внутри Emacs), и буфер оболочки Emacs будет использовать это.

Это означает, что выбольше никогда не придется Mx dirs .

Также есть пакет dirtrack (поставляется с Emacs), который делает то же самое.

Мне больше нравится моя версия, потому что она удаляет путь из приглашения.Я не хочу видеть весь путь в моем приглашении, так как мой текущий каталог часто очень длинный.

Как только вы используете одно из двух вышеупомянутых решений, вы можете упростить вашу shell-dir процедуру так:1021 *

(defun shell-dir (name dir)
  (interactive "sShell name: \nDDirectory: ")
  (let ((default-directory dir))
    (shell name)))
1 голос
/ 08 марта 2013

Еще один ответ ... Я обнаружил, что есть способ (в Linux) заставить Emacs правильно определить текущий каталог, используя файловую систему / proc.

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

Таким образом, вам просто нужно запустить оболочку в любом каталоге, и Emacs автоматически выяснит это и получит правильное завершение табуляции и т. Д.

...