emacsシェルでTABをその中で実行されているreadlineコマンドに渡す方法はありますか?


8

例えば。PerlやRuby REPLなどの優れた機能を実行している場合は、GNU Readlineを介してコード/コマンド補完を公開します。私がやりたいことは、そのようなプログラムに入る/終了するときにshell-mode、TABキーをそれらのプログラムに渡したいことを示すために、elisp / env変数を設定することです。

C-q TABも機能しないことに注意してください。Readlineも無視していると思いますがTERM=dumb、たとえばに設定します。vt100もトリックを行わないため、を調べている可能性もありますEMACS=t


3
コミントはそのようには機能しません。で行が送信されるのを待ってからRET、プロンプトを認識するまで出力を受け取ります。したがって、完了はその側で解決する必要があります。
wasamasa 2016

readlineに依存するのではなく、Emacs側のelispで補完が直接処理される方法を確認するには、ESSまたは草モードを見てください。
タイラー

これは、プロローグモードでも役立ちます。タブを押すと、インタープリターが次のソリューションを生成するように求められます。
wvxvw 2016

@Tyler事柄は、知識が他の場所(たとえば、実行中のインタープリター)に存在する場所です。私は、lispから完了を委任できるようなある種のreadlineプロキシを作成できると思います-多くの作業のようです:)
Mark Aufflick

@MarkAufflick ESSは、elispを介して提供されるほとんどの補完で、私が思うようなことをしますが、いくつかの特別なケース/状況がRプロセスに渡されます。特殊なケースでは、完了が非常に遅くなる可能性があります。
タイラー

回答:


2

M-x shell一度に1行ずつ動作します。Retキーを押すと、外部シェルプロセスに入力行を渡します。

M-x termC-cおよびを除いて、すべてのキーストロークを外部シェルプロセスに渡しますEsc。押すTabと、外部シェルプロセスによって表示および解釈されます。


2

@ user20119が指摘したM-x termように、これは適切なオプションである可能性があります。これは、「ラインモード」への動的な切り替えもサポートしていますM-x shell

M-x eshell また、2つの動作の組み合わせを提供しようとします。

またC-q TAB、(サブプロセスにTABを送信するのではなく)バッファーにTAB文字を挿入するだけなので、機能しなかったことも指摘しておきます。さらに、現在の行のテキストがまだプロセスに送信されていないため、基になるプロセスにTAB文字を送信するだけでは十分ではないため、次のようなものが必要になる場合があります。

(defun my-comint-tab ()
  (interactive)
  (let* ((proc (get-buffer-process (current-buffer)))
         (str (buffer-substring (process-mark proc) (point))))
    (process-send-string proc (concat str "\t"))))

確かにM-x shell、に別の設定を使用するように説得する必要もあります$TERM

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.