5

私の意図は、RETを押すたびに各プロンプトにbm.el 表示ブックマークを使用することです。私はこれをある程度達成することができました。重要な問題が欠落している場合は、以下の私のコードにコメントしてください。引数をデフォルト関数に渡すだけでなく、引数を処理する必要があるかどうかはわかりません。

空のコマンド ラインでRETを押したときに、その行をブックマークしたくありません。コントロールをデフォルト関数に渡す前に、コマンドラインの内容を傍受するにはどうすればよいeshell-send-inputですか?

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline)
  "eshell-send-input, customized to add bm-bookmark to prompt line"
 (interactive)
  (bm-bookmark-add)
  (eshell-send-input use-region queue-p no-newline))

(add-hook 'eshell-mode-hook
          #'(lambda ()
              (define-key eshell-mode-map
                [return]
                'eshell-send-input-zAp)))
4

3 に答える 3

4

あなたのコードはまともに見えます。のコードを読むとeshell-send-input、現在の入力を取得する方法がわかります。

インタラクティブな引数 についても読んでください。"P"にユーザー領域を渡すために必要ですeshell-send-input

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline)
  "eshell-send-input, customized to add bm-bookmark to prompt line"
  (interactive "*P")
  (unless (string-equal (eshell-get-old-input use-region) "")
    (bm-bookmark-add))
  (eshell-send-input use-region queue-p no-newline))
于 2012-08-14T12:34:36.043 に答える
1

esh-modeeshell-last-output-end出力が印刷されるたびに更新される変数を定義します。(buffer-substring eshell-last-output-end (point-max))したがって、私が信じているようなことを行うことで、シェルに送信される文字列を取得できます。

編集: のドキュメントからの引用eshel-send-input:

「受信した入力を解析および処理のために Eshell に送信します。eshell-last-output-end の後、そのマーカーからポイントへのすべてのテキストを入力として送信します。 そのマーカーの前に、「eshell-get-old-input」を呼び出して古い入力を取得します、それをバッファの最後にコピーして送信します。

USE-REGION が非 nil の場合、現在の領域 (ポイントとマークの間) が入力として使用されます。

QUEUE-P が非 nil の場合、入力は現在アクティブなプロセスに送信されるのではなく、次のプロンプトまでキューに入れられます。プロセスがない場合、入力はすぐに処理されます。

NO-NEWLINE が非 nil の場合、入力は暗黙の最終改行なしで送信されます。"

アクセントは私です。のソースを調べるとeshel-send-input、どのように使用されているかがわかります。

event_jr の答えを反映するには、独自の関数にそのようなオプションがない場合、この関数にユニバーサル引数を渡す必要は必ずしもありません...明らかに、これまでのところそれを使用していないため、不要です。

于 2012-08-14T07:15:08.437 に答える
0

(私自身の質問に答えて)...その核心は単なるemacsバッファーであることに気付きeshellました。それを念頭に置いて、この方法を思いつきました。これは機能しますが、おそらくもっとうまくいく可能性があります。私がまだ気づいていないことがあるかもしれないので、私はまだ提案を受け付けています。

(defun eshell-send-input-zAp (&optional use-region queue-p no-newline)
  "A customized `eshell-send-input`, to add bm-bookmark to prompt line" 
  (interactive)
  (let ((line (buffer-substring-no-properties (point-at-bol) (point-at-eol))))
    (if (string-match eshell-prompt-regexp line)
        (if (> (length (substring line (match-end 0))) 0)
            (bm-bookmark-add))))
  (eshell-send-input use-region queue-p no-newline))
于 2012-08-14T12:29:56.323 に答える