11

Emacs を外部プロセスと統合するアプリケーションはたくさんあります。GDBは頭に浮かぶものです。Emacs から GDB を制御し、画面にフィードバックを得ることができます。

私は自分のアプリケーションでその方向に何かしたいと思っています。

ここに私が欲しいものがあります:

  • 私と emacs の間の接続を確立します。おそらく、新しい emacs プロセスを開始して、それを自分の GUI に丸呑みするでしょう。
  • ファイルを表示するように emacs に指示します。(emacsclient で簡単)
  • emacs にスクロールして特定の行番号を中心にハイライトするか、そこにカーソルを移動するように指示します。
    • おそらく本当の問題は、emacs を実行するために外部アプリから任意の elisp コードを送信する方法です。
    • 私は elisp を話せませんが、これは学ぶための素晴らしい口実になるでしょう
  • トリガーされたときにアプリにメッセージを送り返す、emacs バッファー内のいくつかのクリック可能な領域を提供します。
    • クリック可能性が不足していても、メッセージを送信するキー バインディングが出発点となります。(しかし、クリック可能なことが可能であることは知っているので、私は尋ねています)

これがすべて可能であることは知っていますが (emacs では何が不可能なのですか?)、どこからグーグル検索を開始すればよいかわかりません。

4

7 に答える 7

5

クリック可能な領域

ウィジェットライブラリを使用すると、バッファの一部をボタン(ラジオボックス、チェックボックス、リスト)にでき、クリックするとelispが実行されます。例えば:

    (require 'widget)

(defun simple-widget-example ()
   (interactive)
  (switch-to-buffer "*Simple widget example*")

  (let ((inhibit-read-only t))
    (erase-buffer))

  (let ((all (overlay-lists)))
    ;; Delete all the overlays.
    (mapcar 'delete-overlay (car all))
    (mapcar 'delete-overlay (cdr all)))

  (widget-insert "Sample button\n")
  (widget-create 'push-button
         :notify (lambda (&rest ignore) 
               (message "Poop! Ha Ha!"))
         "Press Me")

  (use-local-map widget-keymap)

  (widget-setup))

Emacsウィジェットライブラリを参照してください

于 2009-03-31T04:37:45.943 に答える
5

それはあなたが物事をどのように設定したいかに依存します。間違いなく、プロセスに関するマニュアルの部分は読む価値があります。'comintパッケージのコードを読むことから始めるのが良いでしょう。

公開したい機能のかなり限定されたセットをリストしましたが、これは直接接続によって解決できます。'net-utils(Mx find-library net-utils RET)で提供されているものを調べることで、役立つユーティリティ関数を見つけることができます。

接続しようとしているアプリケーションにインタプリタ言語がある場合は、アプリ側でカスタムパーサーを作成するのではなく、それに接続します。

アプリからEmacsを起動する

あなたはアプリからEmacsを起動しているので(他の方法(この仕事を簡単にしたかもしれません)とは対照的に)、これはおそらく私がすることです:

  • 小さなperlスクリプトを記述して、ソケットを開き、読み取り/書き込みを行います
  • インタプリタで'(read(eval(print)))ループを設定し(またはカスタムループを書き込み)、ソケット/ポートに接続します
  • ソケットを指定する関数呼び出し(--evalまたは--execute)でEmacsを起動します
  • perlスクリプトをサブプロセスおよびポートとして開始します( perform-lispまたはperform-tclがどのように実行するかを参照してください)

その時点で、Emacsからのすべてがperlサブプロセス('comint-send-string)に送信され、REPLに渡され、そこで目的の効果が得られる可能性があります。同様に、文字列を送信するだけでコマンドをemacsに送り返し、comint-output-filter-functionsでスタックした関数でコマンドを解析することができます。

次に、2つの小さなライブラリを作成します。1つはAPPインタプリタ言語で、もう1つはEmacsで、意味のある機能を実行します。emacsライブラリは、ファイルの内容に応じて、メジャー(またはマイナー)モードとしてパッケージ化する必要があります。それらがアプリでのみ使用される場合、メジャーモード、(たとえば)C ++ファイルの場合、おそらくc ++モードを活用したいのであれば、マイナーモードの方が適しています。

私は、elispではなくperlで小さなperlスクリプトを記述します。単純に、comintと対話する方法を知っています。小さなperlスクリプトをelispのチャンクに置き換えることができ、それでもcomintを使用する利点がある場合、それは追加のボーナスになります。

Tcl / Tkのセットアップはほぼ同じですが、接続関連のものだけがTkのsendコマンドによって処理されます。それは本当にうまくいきます。

Emacsからアプリを起動する

代わりに、Emacsからアプリを起動できる場合は、上記が引き続き適用されます。小さなperlスクリプトを削除して、'comintインターフェイスを介して対話できるのはあなただけです。ソケットは必要ありません。

  • 'replループが必要です(アプリがstdin/stdoutをインタープリターに関連付けたままにできない場合
  • ライブラリは同じままです

これははるかに簡単ですが、ユーザーフローによってその方向に進むことができる場合にのみ機能します。(私はあなたがこれをあなたの使用以上のもののために書いているという予感があります。)

そうは言っても、この方法で開発/テストする方が簡単かもしれません(Emacsから起動)。後で拡張機能としてソケット通信を追加できます。どちらがよりやる気を起こさせるか...

于 2009-03-31T03:14:22.963 に答える
3

Emacs と対話する非同期プロセスが必要です。Emacs マニュアルのプロセスに関するセクションを参照してください。開始するのに適した場所は、start-processまたはstart-process-shell-command関数です。

たとえばman、emacs で配布されているコマンドのソース、またはvc-do-command. (ソース コードを表示するには、Ch f と入力してから関数名を入力し、ヘルプ ウィンドウで関数名をクリックします。)

于 2009-03-31T00:08:13.457 に答える
1

一般に、emacs のマニュアルを参照する必要があります。

3 番目の箇条書きとして、emacs のコマンド ライン オプションを見てみましょう。特に --eval と -f。

于 2009-03-30T22:55:23.520 に答える
0

emacs に Lisp コードを実行させるには、インタラクティブな関数を作成するだけで、Mx function-name を使用して呼び出すことができます。以下は、ファイルを再度開く基本的な関数です。

    (defun na-reopen-file ()
  "Reopen file in buffer."
  (interactive)
  (let ((p (point)))
    (progn
      (find-alternate-file buffer-file-name)
      (goto-char p) ) ) )

アプリケーションと対話するために、非同期プロセスを実行し、バッファを使用して通信できます。マニュアルの start-process 関数を確認してください。

クリック可能なリンクを作成するには、次の関数を使用できます

  (make-button beg end 'action 'nmap-clear-buffer 'follow-link t)
  ;;for color
  (put-text-property beg end 'face nmap-active-button )
于 2009-03-30T23:30:43.170 に答える