繁体   English   中英

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

[英]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 "&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) 扩展菜单项),其中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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM