我想让我的向上箭头键从 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 "<up>"( '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))))