我的目的是在按 RET 时为每个提示使用bm.el
可见书签。 我在某种程度上设法实现了这一目标。请在下面评论我的代码,如果它缺少一些重要问题:例如。我不知道我是否需要处理参数,而不仅仅是将它们传递给默认函数。
当我在空命令行上按 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)))
你的代码看起来不错。 如果您阅读 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))
esh-mode
定义了一个变量eshell-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,则发送输入时不带隐含的 final。 换行符。
口音是我的。如果你研究一下 eshel-send-input
的来源 ,你可能会知道它是如何使用的。
反思event_jr的答案 - 如果你自己的函数没有这样的选择,你不一定需要将通用参数传递给这个函数......显然,到目前为止你没有用,这是不必要的。
(回答我自己的问题)...我意识到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))