Tôi tìm thấy một cái gì đó mà dường như làm việc OK sau khi thử nghiệm ban đầu: về cơ bản rebind <tab>
tới pcomplete-std-complete
, nhưng vì chức năng đó không phải là tương tác đối với một số lý do, bạn cần phải quấn nó:
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))
Các pcompete-std-complete
cố gắng sử dụng các hoàn thành được viết cho pcomplete
UI hoàn thành tiêu chuẩn, ivy
theo mặc định sẽ ghi đè (với bản cập nhật gần đây, chúng xuất hiện trong một lớp phủ đẹp ngay trong bộ đệm eshell gần điểm!).
Các ý kiến trong mã nguồn của pcomplete-completions-at-point
( pcomplete-std-complete
phụ thuộc vào) đề cập đến một số vấn đề tiềm ẩn:
;; FIXME: it only completes the text before point, whereas the
;; standard UI may also consider text after point.
;; FIXME: the `pcomplete' UI may be used internally during
;; pcomplete-completions and then throw to `pcompleted', thus
;; imposing the pcomplete UI over the standard UI.
Tôi nghĩ rằng cái đầu tiên sẽ không ảnh hưởng đến tôi, vì tôi không nghĩ mình đã từng bấm <tab>
trừ ở cuối dòng đầu vào. Tôi đã không nhìn thấy bề mặt vấn đề thứ hai, cho đến nay.
EDIT: Đối với những người không quen thuộc với các quirks của eshell (đây là một uyển ngữ), có lẽ tôi nên thêm nó để rebind key của eshell như đề xuất ở trên, bạn nên đặt nó trong tệp init của bạn:
(add-hook 'eshell-mode-hook
(lambda ()
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))))
Trước khi bạn la mắng tôi vì các antipotype lãng phí keybindings-in-a-hook, hãy để tôi giải thích rằng eshell tuyên bố sơ đồ phím của nó với (defvar eshell-mode-map nil)
và sau đó thực hiện (setq-local eshell-mode-map (sparse-keymap))
bên trong eshell-mode
! (Mã này có ích ;; FIXME: What the hell!?
.) Điều đó có nghĩa là bạn không thể rebind các khóa cho đến sau khi eshell-mode
chạy! Do đó móc.
(add-hook 'eshell-mode-hook '(lambda ()
cần phải được bao quanh nó.