Менять режим компиляции текущего каталога автоматически?

16

В настоящее время моя команда компиляции выглядит следующим образом:

cd ~/somedir && ./somescript.sh

Это не позволяет emacs найти файл, в котором произошла ошибка (и открыть его).

Конечно, я могу запустить M-x cdвручную, но есть ли способ указать буферу, чтобы он изменял свой текущий каталог программно?

Томас Мулард
источник
1
Это то, что я тоже пытался сделать. В идеале, было бы что-то, что вы можете поместить в .dir-locals.el в базовом каталоге, чтобы это работало (хаки, которые я видел, чтобы установить там каталог по умолчанию, вызывают нежелательные побочные эффекты, и установка его только для режима компиляции не не похоже на работу).
Джулиан Сквайрс

Ответы:

7

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

Вместо этого я использую добавленный каталог сборки compilation-search-path

(add-to-list 'compilation-search-path "/path/to/build")

Нашел по этому вопросу: Как настроить путь, который Emacs 'compile-goto-error получает из буфера компиляции?

Вопрос также объясняет, что средство сопоставления каталогов может автоматически изменять каталог, если генерируются некоторые конкретные строки:

Entering directory `...'
... 
Leaving directory `...'

Это также настраивается, по-видимому.

Томас Мулард
источник
Это выглядит как надежное решение. Если это работает для вас, не стесняйтесь принять это.
Малабарба
Обратите внимание, что это может не сработать, если вам нужна система сборки, в которой находятся некоторые файлы /path/to/build.
Андре Хольцнер,
5

Вы можете просто создать буфер Dired из каталога, в который вы хотите вызвать команду компиляции, чтобы он служил якорем. Когда вы хотите скомпилировать, переключитесь на буфер Dired и выполните команду compile. compileбудет выполнять свою команду в этом каталоге буфера Dired. Преимущество этого состоит в том, что вам не нужно M-x cdперемещаться по каталогам, когда вы хотите скомпилировать.

Если вы используете projectile, у него есть команда с именем, projectile-compileкоторая автоматически запускает команду компиляции в корне проекта, распознаваемом projectile.

Ту До
источник
4

Эта альтернативная команда должна сделать свое дело:

(defun compile-in-dir (dir command)
  (interactive "DCompile in directory: \nsCommand: ")
  (let ((default-directory dir))
    (compile command)))

Кроме того, после того, как вы запустили компиляцию с помощью обычной compileкоманды, вы можете выполнить eval (setq default-directory "~/somedir")в *compilation*буфере. Это должно заставить работать навигацию по ошибкам, но это может помешать recompileи друзьям сделать правильные вещи.

sanityinc
источник