2

大規模なプロジェクトには、いくつかのレベルの深さのディレクトリがある場合があります。Emacsのデフォルトのコンパイルコマンドは"make -k"、特定のソースコードを変更してから入力すると、ソースコードが存在するディレクトリの下で"M-x compile RET RET"実行されます。"make -k"

Makefileが現在のディレクトリの下に存在するかどうかを判断する関数を作成できると思います。存在する場合は、最上位のディレクトリが見つかるまで親ディレクトリの下を検索し続けてから、buildコマンドを実行します。これは私の期待どおりです。

しかし、私はどのように始めるのかはっきりしていません、誰かが私に始めるためのいくつかのヒントを教えてもらえますか?私が遭遇するかもしれない関数や変数のように。ありがとう。

4

4 に答える 4

4

次のようなものを使用してみてください。

(setq compile-command
      '(let ((mf (locate-dominating-file default-directory "Makefile")))
         (if mf (setq mf (file-name-directory mf)))
         (concat (if (and mf (not (equal mf default-directory)))
                     (format "cd %s; "
                             (shell-quote-argument
                              (file-relative-name
                               (directory-file-name mf)))))
                 "make -k ")))
于 2012-07-04T15:39:46.623 に答える
3

マーマレードにはよりスマートなコンパイルがあります。

ドキュメントから....必要に応じて、それぞれがのような短所セルのリストを指定できます(TEST . COMMAND)

COMMANDはcompile-command、TESTが成功したときに使用されます。

TESTは次のようになります。

  • 文字列。この場合、正規表現として使用され、バッファに関連付けられているファイル名と照合されます。正規表現が一致すると、TESTは成功します。

  • メジャーモードを表すシンボル。この場合、バッファがそのメジャーモードを使用すると、TESTは成功します。

  • \"-mode\"で終わらない名前の関数を表すシンボル。この場合、関数が呼び出され、nil以外が返された場合、TESTは成功します。

  • フォームのリスト。この場合、フォームは評価され、戻り値がnil以外の場合、TESTは成功します。

したがって、親ディレクトリ内のmakefileをスキャンする関数を作成し、それをテストとして使用できます。

ドキュメントによると、コマンドがnilの場合、パッケージはTESTの結果をコンパイルコマンドとして使用します。つまり、必要な関数は1つだけで、適切なディレクトリにあるmakefileを参照するmakeコマンドを返します。

于 2012-07-07T21:16:15.713 に答える
1

見てください:http://emacswiki.org/emacs/CompileCommand

emacsから直接「Chvcompile-command」。

于 2012-07-04T09:25:50.887 に答える
1

これは、EmacsLispよりもbashスクリプトを好む人のためのソリューションです。私の.emacsでは、すべてのバッファーを保存し、プロジェクトをコンパイルするbashスクリプトを実行するコマンドを定義しています。

(defun save-all-and-compile () (interactive)
 (save-some-buffers 1)
 (shell-command "make-and-run.sh &"))
(add-hook 'c-mode-common-hook (lambda ()
 (local-set-key (kbd "<f5>") 'save-all-and-compile)))

小さなプロジェクトの場合、スクリプトは次のように単純にすることができます

#!/bin/bash
make -j && ./<main>

ここで、「main」は実行可能ファイルの名前です。大規模なプロジェクトの場合、最初にルートディレクトリを見つける必要があります。同様に、プログラムをビルドして実行するために、さまざまなスクリプト(さまざまなキーにバインド)を使用できます。次に、プロジェクトのさまざまな部分をテストするためのスクリプトをいくつか追加します。しかし、これらは自分で理解できる詳細にすぎません。

スクリプトが「&」を使用して非同期で実行されていることを確認してください。このようにして、非同期シェルコマンドバッファがmakeとプロジェクトからの出力で開き、開いたままになります。

編集

以下の議論に基づいて、私は最初にそれを考え抜いたようであり、解決策は非常に単純です。通常の「make」または「make-k」をcompile-commandに渡す代わりに、最初にプロジェクトのルートディレクトリとビルドに移動するシェルスクリプトを使用できます。

(setq compile-command "script.sh")
于 2013-06-18T12:11:39.503 に答える