Рекурсивно піднімайтеся вгору, щоб знайти Makefile та компілювати


9

Проблема M-x compileполягає в тому, що якщо його Makefileнемає в поточному каталозі, він виходить з ладу.

Я хотів би мати функцію, яка рекурсивно піднімається до пошуку Makefileта запуску makeіз цього каталогу.

Я бачив це питання , але це конкретний шлях, і це те, що я повинен думати про біг.


Якщо ви використовуєте projectile, є способи компілювати з projectile-project-root. Наприклад, github.com/abo-abo/helm-make
abo-abo

@ Або-Або я не пробував снаряд! Здається, що projectile-compile-projectробить те, що я хочу. Але я хотів би мати щось без цієї залежності, якщо це можливо.
Флоріан Маргаїн

спасибі, проект-компіляція-проект працює для мене
netawater

Відповіді:


15

Ви шукаєте функцію locate-dominating-file. Ось документація на emacs для цієї функції:

(locate-dominating-file FILE NAME)

Знайдіть ієрархію каталогів FILEдля каталогу, що містить NAME. Зупиніться на першому батьківському каталозі, що містить файл NAME, і поверніть каталог. Повернути, nilякщо не знайдено. Замість рядка NAMEтакож може бути предикат, який бере один аргумент (каталог) і повертає значення, що не має нуля, якщо цей каталог є тим, для якого ми шукаємо.

Використовуючи це, відповідь або-або можна скоротити до

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (when (locate-dominating-file default-directory "Makefile")
  (with-temp-buffer
    (cd (locate-dominating-file default-directory "Makefile"))
    (compile "make -k"))))

Приємно! Ця функція робить аналогічну моїй петлі, але чітко задокументованою та обробкою краєм. Я обов’язково додам його до мого списку рецептів, дякую.
або-або

Приємно! vim має аналогічну функцію з назвою findfile, я був здивований, що у Emacs її не було.
Флоріан Маргаїн

Чи не є щось подібне до lisp's let? Ти біжиш locate-dominating-fileдвічі.
Флоріан Маргайн

@FlorianMargaine Так, ви можете використовувати let. Я вводив відповідь безпосередньо, не тестуючи, і вважав, що це менша ймовірність помилки в дужках :)
Прадхан

Я б хотів, щоб я міг проголосувати цю відповідь більше. Дякую.
Ерік

6

Рекурсивна компіляція, не додаються залежності:

(defun desperately-compile ()
  "Traveling up the path, find a Makefile and `compile'."
  (interactive)
  (with-temp-buffer
    (while (and (not (file-exists-p "Makefile"))
                (not (equal "/" default-directory)))
      (cd ".."))
    (when (file-exists-p "Makefile")
      (compile "make -k"))))

Дивовижно! Це саме те, що я хотів.
Флоріан Маргайн

Гаразд, будьте обережні з кінцевим станом петлі. Якщо ви перебуваєте в Windows, ви можете отримати нескінченний цикл.
або-або

Побічне запитання: для чого ви використовуєте with-temp-buffer?
Флоріан Маргайн

Так, я не дбаю про вікна, але дякую, що згадуєте про це.
Флоріан Маргайн

Я використовую with-temp-buffer, тому що default-directoryбуферно-локальний. Я не хочу змінювати його для поточного файлу.
або-або
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.