1

私は一般的にxemacsとLinuxに慣れていないので、私を初心者と考えてください。そして、elispがコマンドまたはコマンドを即座に実行しない理由があるかどうか疑問に思っていました。

init.el に次のコードがあります。

(defun myClear ()
  "Clears console output buffer (F5)"
  (erase-buffer "*Shell Command Output*"))

(defun myMake ()
  "Executes make (F6)"
  (shell-command "make"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (erase-buffer "*Shell Command Output*")
  (shell-command "make"))

これらはキー F5 ~ F7 にバインドされています。F7 を押しても、最初に F5 を押してから F6 を押した場合と同じ結果にはなりません。これは期待どおりに機能します。

代わりに、(erase-buffer ...) ステートメントがスキップされたように見えるか、(shell-command ...) の直前に実行された可能性があります。とにかくシェルコマンドはシェル出力をダンプする前にバッファを消去するため、わかりにくいです。

私が期待したこと: コンソール出力がクリアされます。これは、make がまだ実行されていて、まだ出力が生成されていない間 (私の場合は数秒) に表示されるはずです。

これをさらにテストする方法がわかりません。一般的なタスクのように見えますが、適切なものや類似のものを見つけることができませんでした。また、言及された動作を取得することに興味があるだけでなく、自分が何を間違えたかを理解することにも興味があることを考慮してください。

この動作を説明する elisp の仕組みに関するリンク/ポインタは大歓迎です。ありがとう、タッシェ

4

1 に答える 1

2

まず、私は XEmacs にはあまり慣れていませんが、むしろ Emacs に慣れています...違いがあるかもしれません。しかし、Emacs で問題を再現できるので、Emacs ソリューションが XEmacs でも機能することを願っています。

Emacs はコマンドの実行中に UI を再表示しません。つまり、コマンドを実行するとコマンドが実行され、別の入力を待っている間に表示が再描画され、次にF5コマンドを実行すると実行されます。一方、 をヒットすると、サイクル全体が実行され、再表示されず、効果が見えなくなります。その効果を確認するには、アフターを強制する必要があります。myClearmyMakeF6F7myClearmyMakeerase-bufferredisplayerase-buffer

以下は、提供されたコードに基づく実際の例です。

(defun myClear ()
  "Clears console output buffer (F5)"
  (interactive)
  (with-current-buffer "*Shell Command Output*"
    (erase-buffer)))

(defun myMake ()
  "Executes make (F6)"
  (interactive)
  (shell-command "sleep 2; echo Hello World"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (interactive)
  (myClear)
  (redisplay)
  (myMake))

(global-set-key (kbd "<f5>") 'myClear)
(global-set-key (kbd "<f6>") 'myMake)
(global-set-key (kbd "<f7>") 'myClearMake)

微調整をしなければならなかったことに注意してください (おそらく Emacs/XEmacs の違いによるものでしょうか?)

また、make の実行などを行うためのより良い方法は、 を使用することにあることに注意してくださいM-xcompileRET。特に、これはバッファの消去を処理し、バックグラウンドでプロセスを実行し (例のように Emacs をハングさせることなく)、出力を処理してエラー/警告メッセージを検出します。

于 2013-05-24T12:51:10.990 に答える