簡體   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