2012-08-14 60 views
5

我的意圖是使用bm.elVisible Bookmarks爲每個提示,因爲我按RET。我已經設法在一定程度上達到這個目標。請在下面評論我的代碼,如果它缺少一些重要問題:例如。我不知道是否需要處理參數,而不僅僅是將它們傳遞給默認函數。Emacs eshell。如何閱讀命令行的內容按下RET

當我在空白命令行上按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

你的代碼看起來不錯。如果您閱讀eshell-send-input的代碼,您將看到如何獲取當前輸入。

也讀了interactive的論點。需要"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)) 
+0

它工作的很好,謝謝你清除霧......在所有的幫助下,我逐漸破解這個* elisp * nut :) – 2012-08-14 18:09:06

1

esh-mode定義一個變量eshell-last-output-end每次打印輸出時間,其它更新。所以,你可以通過做一些類似於(buffer-substring eshell-last-output-end (point-max))的東西來獲取要發送到shell的字符串。

編輯:報價從eshel-send-input文檔:

「發送輸入接收ESHELL用於分析和處理後 ESHELL,最後輸出端,並將從該標記的所有文本點作爲 輸入。該標記之前,調用'ESHELL,讓老輸入」檢索 舊的輸入,將其複製到緩衝區的末尾,並將其發送。

如果USE-地區是非零,當前區域(點和標記之間)將使用作爲輸入。

如果QUEUE-P非零,輸入將排隊,直到下一個提示 而不是發送到當前活動進程。如果沒有進程,則立即處理 輸入。

如果NO-NEWLINE是非零,輸入而不暗示最終 換行符發送。」

口音是我的。如果你考慮的eshel-send-input源代碼,你可以得到的想法它是如何使用

爲了反映event_jr的答案 - 你不一定需要通用參數傳遞給這個函數,如果你自己的函數有沒有這樣的選擇......很顯然,到目前爲止您有沒有用該,這是不必要的。

+0

我一直沒有能夠從'eshell-last-output-end'運行任何東西。它的文檔說:*沒有記錄爲變量。* – 2012-08-14 12:32:07

+0

Mhh ..'esh-mode'和'eshel-'部分有點令人費解,但似乎每個名稱的連字符段都有自己的完成。 。我似乎有一些太多的* bash *先入之見....(現在就讀這一切... – 2012-08-14 13:09:32

+0

感謝您的良好參考..我已經學習了幾個新點..(ond那裏在elisp中,一般情況下是相當多的:) – 2012-08-14 18:06:27

0

(Ans wering我自己的問題)...我意識到,eshell是其核心只是一個emacs緩衝區,所以,考慮到這一點,我想出了這種方法,這工作,但也許可以做得更好。也許有些事情我還沒有意識到,所以我仍然樂於接受建議。

(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))