我的目的是在按 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)))
答案 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))