Làm cách nào tôi có thể thiết lập eshell để sử dụng ivy để hoàn thành tab?


16

Tôi rất thích ivyhoàn thành và yêu thích rằng một đơn giản (ivy-mode 1)là đủ để có được ivyhầu hết mọi nơi mà Emacs sử dụng một số loại hoàn thành (điều đó được hoàn thành bằng cách ghi đè completeing-read, tôi tin vậy). Nhưng điều này không thiết lập eshellđể sử dụng ivyđể hoàn thành tab. Tôi thích eshelldanh sách các ứng cử viên hoàn thành, nhưng muốn chọn ivyUI trong số đó. Có cách nào để sử dụng lại bất cứ điều gì eshellđể tạo ra các ứng cử viên hoàn thành và trao nó cho 'ivy' không?

Câu trả lời:


11

Điều này sẽ làm việc tốt:

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

Tôi không biết tại sao ở trên không phải là mặc định. Nhưng tôi chỉ sử dụng shell-modeterm-modedù sao đi nữa.


3
Bạn có lẽ nên thêm rằng (add-hook 'eshell-mode-hook '(lambda ()cần phải được bao quanh nó.
Timm

Cảm ơn, đó là một chút gọn gàng hơn những gì tôi đã có. Lý do không phải mặc định có lẽ chỉ là do ai đó ở một thời điểm nào đó trong quá khứ thích pcompletegiao diện người dùng hoàn thành tiêu chuẩn.
Omar

6

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-completecố gắng sử dụng các hoàn thành được viết cho pcompleteUI hoàn thành tiêu chuẩn, ivytheo 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-completephụ 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-modechạy! Do đó móc.


Ngoài ra, tôi chưa thử nghiệm nó, nhưng tôi đoán rằng nếu helmchưa eshellhoàn thành việc hoàn thành tab thì cách khắc phục này cũng được áp dụng helm.
Omar

Điều này khá gọn gàng :) Cảm ơn vì tiền boa
Chakravarthy Raghunandan

Đó là những gì anh ấy sẽ!? Bình luận của tôi đã tạo nên ngày của tôi :) Ngoài ra, tôi muốn lưu ý rằng điều này cũng sẽ hoạt động cho các khung hoàn thành khác, như helm.
GergelyPolonkai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.