[英]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.