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



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

相关内容

  • 没有找到相关文章

最新更新