Emacs eshell。如何在按RET时读取命令行的内容

时间:2012-08-14 05:12:59

标签: emacs command-line elisp eshell

我的目的是在按 RET 时为每个提示使用bm.el Visible Bookmarks 。我已经设法在某种程度上实现了这一点。如果缺少一些重要问题,请在下面评论我的代码:例如。我不知道我是否需要处理args而不仅仅是将它们传递给默认函数。

当我在空命令行上按 RET 时,我不想为该行添加书签。在将contol传递给默认函数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)))

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

esh-mode定义了一个变量eshell-last-output-end,每次打印输出时它都会更新。因此,您可以通过执行类似(buffer-substring eshell-last-output-end (point-max))之类的操作来获取要发送到shell的字符串。

编辑:引用eshel-send-input上的文档:

  

“将收到的输入发送到Eshell进行解析和处理。之后   eshell-last-output-end,将该标记的所有文本发送到指向   输入。在该标记之前,调用`eshell-get-old-input'进行检索   旧输入,将其复制到缓冲区的末尾,然后发送它。

     

如果USE-REGION为非零,则为当前区域(点与标记之间)   将用作输入。

     

如果QUEUE-P为非零,则输入将排队,直到下一个提示,   而不是发送到当前活动的进程。如果没有进程,那么   输入立即处理。

     

如果NO-NEWLINE为非零,则输入将在没有隐含最终结果的情况下发送   换行“。

口音是我的。如果你查看eshel-send-input的来源,你可能会知道如何使用它。

要反思event_jr的答案 - 如果您自己的函数没有这样的选项,则不一定需要将通用参数传递给此函数...显然,到目前为止您没有使用它,这是不必要的。 / p>

答案 2 :(得分:0)

(回答我自己的问题)......我意识到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))