[英]Calling Emacs' Eshell's eshell-previous-matching-input-from-input from elisp
我想让我的 eshell 中的向上箭头键是 eshell-previous-matching-input-from-input,因为它是,当点位于最大点时,否则是前一行。 我写过
(defun my-up-arrow-in-eshell() (interactive) (if (= (point) (point-max)) (eshell-previous-matching-input-from-input) ; else (previous-line) ) ) (add-hook 'eshell-mode-hook (lambda () (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) 扩展菜单项),其中eshell-previous-matching-input-from-input
在点位于point-max
时被绑定
(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))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.