从 elisp 调用 Emacs 的 eshell-previous-matching-input-from-input



我想让我的向上箭头键从 eshell 中成为 eshell-previous-matching-input-from-input,因为它是,当点在点最大时,但否则是前一行。 我写过

(defun my-up-arrow-in-eshell(( (interactive( (如果 (= (点( (最大点数(( (eshell-previous-matching-input-from-input( ;还 (上一行( ) ) (add-hook 'eshell-mode-hook (λ (( (define-key eshell-mode-map (kbd "&ltup>"( 'my-up-arrow-in-eshell(((

但这是不对的,因为 eshell-previous-matching-input-from-input 需要一个参数。 我可以将其硬编码为 0,但这适用于按向上箭头键(在最大点时(。 我希望它像开箱即用一样工作,当最大点时。 我该为这个论点给出什么?

eshell-previous-matching-input-from-input

的实现方式依赖于last-command来正确浏览输入历史记录。因此,绑定然后调用eshell-previous-matching-input-from-input的新函数在当前实现中无法按预期工作。

如果您不想完全重新实现eshell-previous-matching-input-from-input您还可以建议现有函数,如下所示:

(advice-add 'eshell-previous-matching-input-from-input
:before-until
(lambda (&rest r)
(when (and (eq this-command 'eshell-previous-matching-input-from-input)
(/= (point) (point-max)))
(previous-line) t)))

您可以使用(call-interactively #'eshell-previous-matching-input-from-input)根据其interactive形式解释参数,例如。

(defun my-up-arrow-in-eshell ()
(interactive) 
(if (/= (point) (point-max))
(previous-line)
(setq this-command 'eshell-previous-matching-input-from-input)
(call-interactively #'eshell-previous-matching-input-from-input)))

或者,您可以添加自己的参数并将其传递,例如。

(defun my-up-arrow-in-eshell (arg)
(interactive "p") 
(if (= (point) (point-max)) 
(progn
(setq this-command 'eshell-previous-matching-input-from-input)
(eshell-previous-matching-input-from-input arg))
(previous-line arg)))

最后一个选项可能是条件绑定(请参阅(elisp(扩展菜单项(,当点位于point-max时,eshell-previous-matching-input-from-input绑定

(define-key eshell-hist-mode-map (kbd "<up>")
'(menu-item "maybe-hist"
nil
:filter
(lambda (&optional _)
(when (= (point) (point-max))
'eshell-previous-matching-input-from-input))))

相关内容

  • 没有找到相关文章

最新更新