Saya menemukan sesuatu yang tampaknya berfungsi dengan baik pada pengujian awal: pada dasarnya rebind <tab>
ke pcomplete-std-complete
, tetapi karena fungsi itu tidak interaktif karena beberapa alasan, Anda perlu membungkusnya:
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))
The pcompete-std-complete
mencoba untuk menggunakan penyelesaian ditulis untuk pcomplete
dengan UI selesai standar, yang ivy
secara default akan menimpa (dengan update yang sangat baru-baru ini, mereka muncul di nice overlay tepat di eshell penyangga titik dekat!).
Komentar dalam kode sumber pcomplete-completions-at-point
(yang pcomplete-std-complete
tergantung pada) menyebutkan beberapa masalah potensial:
;; 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.
Saya pikir yang pertama tidak akan mempengaruhi saya, karena saya tidak berpikir saya pernah menekan <tab>
kecuali pada akhir baris input. Saya belum melihat permukaan masalah kedua, sejauh ini.
EDIT: Bagi mereka yang tidak terbiasa dengan kebiasaan eshell (ini adalah eufemisme), mungkin saya harus menambahkan itu ke rebind kunci eshell seperti yang disarankan di atas Anda harus meletakkan ini di file init Anda:
(add-hook 'eshell-mode-hook
(lambda ()
(define-key eshell-mode-map (kbd "<tab>")
(lambda () (interactive) (pcomplete-std-complete)))))
Sebelum Anda meneriaki saya tentang antipattern keybind-bor-in-a-hook yang boros, izinkan saya menjelaskan bahwa eshell menyatakan keymap-nya dengan (defvar eshell-mode-map nil)
dan kemudian melakukannya (setq-local eshell-mode-map (sparse-keymap))
di dalam eshell-mode
! (Kode ini sangat membantu ;; FIXME: What the hell!?
.) Itu berarti Anda tidak dapat memutar ulang kunci hingga setelah eshell-mode
berjalan! Oleh karena itu, kail.
(add-hook 'eshell-mode-hook '(lambda ()
perlu dililitkan.