5

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

当我在空命令行上按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-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 的答案 - 如果您自己的函数没有这样的选项,您不一定需要将通用参数传递给该函数......显然,到目前为止,您对此没有用处,这是不必要的。

于 2012-08-14T07:15:08.437 回答
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))
于 2012-08-14T12:29:56.323 回答