Подпроцессы Emacs и пути к файлам в их аргументах - PullRequest
2 голосов
/ 11 февраля 2011

Я пытаюсь создать несколько сочетаний клавиш для запуска и остановки команды «paster serve», используемой в проектах пирамид. Вот мой код elisp:

(defun search-for-file (file dir)
  "Recursively searches up the directory tree for a given filename"
  (if (equal "/" dir)
      nil
    (if (member file (directory-files dir))
        (concat (file-name-as-directory dir) file)
      (progn
        (cd-absolute dir)
        (cd "..")
        (search-for-file file default-directory)))))

(defun paster-serve-start ()
  (interactive)
  (progn
    (start-process
     "paster-serve" "server"
     "paster" "serve" (search-for-file "development.ini" ".") "--reload" "-v")
    (switch-to-buffer "server")))

(defun paster-serve-stop ()
  (interactive)
  (progn
    (setq proc (get-process "paster-serve"))
    (setq buf (get-buffer "server"))
    (quit-process proc)
    (kill-buffer buf)))

(define-prefix-command 'paster-map)
(global-set-key (kbd "C-p") 'paster-map)
(define-key paster-map (kbd "s") 'paster-serve-start)
(define-key paster-map (kbd "e") 'paster-serve-stop)

Эти функции работают, как я ожидаю, из буфера, в котором default-directory установлено, где существует development.ini (например, ~ / myproject); Тем не менее, я надеялся, что эта работа будет работать, когда я находился в каталоге под базовым каталогом проекта (например, ~ / myproject / myproject / templates) - когда я пытаюсь запустить процесс из каталога ниже, где находится файл development.ini, я эта ошибка:

IOError: File '/home/myuser/myproject/~/myproject/development.ini' not found

Есть ли просвещенные мастера Emacs, которые могут пролить свет на то, что я здесь делаю неправильно?

1 Ответ

2 голосов
/ 11 февраля 2011

Я немного настороженно отношусь ко всем этим cd функциям. Попробуйте это альтернативное определение search-for-file, основанное на аналогичной функции в project-local-variables.el:

(defun search-for-file (file dir)
  "Look up the file in and above `dir'."
 (let ((f (expand-file-name file dir))
       (parent (file-truename (expand-file-name ".." dir))))
   (cond ((string= dir parent) nil)
         ((file-exists-p f) f)
         (t (search-for-file file parent)))))
...