Bagaimana saya bisa mengatur eshell untuk menggunakan ivy untuk penyelesaian tab?

16

Saya sangat suka ivypenyelesaian dan suka bahwa sederhana (ivy-mode 1)cukup untuk mendapatkan ivyhampir di mana-mana bahwa Emacs menggunakan semacam penyelesaian (yang dilakukan dengan mengesampingkan completeing-read, saya percaya). Tetapi ini tidak diatur eshelluntuk digunakan ivyuntuk melengkapi tab. Saya memang suka eshelldaftar kandidat yang selesai, tetapi akan lebih memilih ivyUI untuk memilih di antara mereka. Apakah ada cara untuk menggunakan kembali apa pun eshelluntuk menghasilkan kandidat yang lulus dan menyerahkannya kepada `ivy '?

Omar
sumber

Jawaban:

11

Ini seharusnya bekerja dengan baik:

(define-key eshell-mode-map (kbd "<tab>") 'completion-at-point)

Saya tidak tahu mengapa di atas bukan default. Tapi saya hanya menggunakan shell-modedan term-modetetap.

abo-abo
sumber
3
Anda mungkin harus menambahkan yang (add-hook 'eshell-mode-hook '(lambda ()perlu dililitkan.
Timm
Terima kasih, itu sedikit lebih rapi daripada yang saya miliki. Alasannya bukan default mungkin hanya karena seseorang di beberapa titik di masa lalu pcompletelebih disukai daripada UI penyelesaian standar.
Omar
6

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-completemencoba untuk menggunakan penyelesaian ditulis untuk pcompletedengan UI selesai standar, yang ivysecara 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-completetergantung 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-modeberjalan! Oleh karena itu, kail.

Omar
sumber
Juga, saya belum mengujinya, tetapi saya akan menebak bahwa jika helmbelum menyamar sebagai eshellpenyelesaian tab, perbaikan ini juga berlaku untuk helm.
Omar
Ini cukup rapi :) Terima kasih atas tipnya
Chakravarthy Raghunandan
Komentar “Apa yang akan dia lakukan !?” membuat hari saya :) Juga, saya ingin mencatat ini juga harus bekerja untuk kerangka penyelesaian lainnya, seperti helm.
GergelyPolonkai