Sekmeyi tamamlamak için esvy'yi kullanmak için eshell'i nasıl ayarlayabilirim?


16

ivyTamamlanmaya ve sevgiye , Emacs'in bir çeşit tamamlamayı kullandığı neredeyse her yere (ivy-mode 1)ulaşmak için yeterli olduğunu sevmeye çok seviyorum ivy(bu, geçersiz kılma ile tamamlandı completeing-read, inanıyorum). Ancak bu sekme tamamlama eshelliçin kullanılamaz ivy. eshell'Un tamamlama adayları listesinden hoşlanıyorum , ancak ivykullanıcı arayüzünün aralarından seçim yapmasını tercih ediyorum . eshellTamamlama adayları üretmek ve bunu `` sarmaşık '' a teslim etmek için ne yaparsanız yapın yeniden kullanmanın bir yolu var mı ?

Yanıtlar:


11

Bu iyi çalışmalıdır:

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

Yukarıdakilerin neden varsayılan olmadığını bilmiyorum. Ama sadece shell-modeve term-modeher şekilde kullanıyorum.


3
Muhtemelen (add-hook 'eshell-mode-hook '(lambda ()etrafına sarılması gerektiğini eklemelisiniz .
Timm

Teşekkürler, sahip olduğumdan biraz daha temiz. Bunun varsayılan olmamasının nedeni, muhtemelen sadece geçmişte bir noktada pcompletestandart tamamlama kullanıcı arayüzünü tercih etmesidir.
Omar

6

Ben ilk testlere iş OK görünüyor şey buldum: esasen rebind <tab>için pcomplete-std-complete, ama bu işlev nedense interaktif olmadığından, bunu kaydırmak gerekir:

(define-key eshell-mode-map (kbd "<tab>")
  (lambda () (interactive) (pcomplete-std-complete)))

pcompete-std-completeÇalışır için yazılmış tamamlamaları kullanmak pcompletestandart tamamlanma UI ile ivyvarsayılan olarak geçersiz kılar (çok yeni güncelleme ile, onlar tampon eshell yakın noktasında güzel bir bindirme sağ görünür!).

Kaynak kodundaki pcomplete-completions-at-point(buna pcomplete-std-completebağlı olarak) yorumlar birkaç potansiyel sorundan bahseder:

;; 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.

İlkinin beni etkilemeyeceğini düşünüyorum, çünkü <tab>giriş satırının sonu dışında bastığımı sanmıyorum . Şimdiye kadar ikinci sorun yüzeyini de görmedim.

DÜZENLEME: eshell tuhafları (bu bir örtmece olduğunu) bilmeyenler için, belki de yukarıda önerildiği gibi eshell anahtarını yeniden hatırlatmak için bunu init dosyasına koymak gerekir:

(add-hook 'eshell-mode-hook
  (lambda () 
    (define-key eshell-mode-map (kbd "<tab>")
      (lambda () (interactive) (pcomplete-std-complete)))))

Çengelli çöp anahtarlamalar için bana bağırmadan önce, eshell'in anahtar haritasını ilan ettiğini (defvar eshell-mode-map nil)ve sonra (setq-local eshell-mode-map (sparse-keymap))içeride yaptığını açıklayayım eshell-mode! (Kod yararlıdır ;; FIXME: What the hell!?.) Bu, eshell-modeçalıştırmadan sonra anahtarları yeniden bağlayamayacağınız anlamına gelir ! Dolayısıyla kanca.


Ayrıca, ben test etmedim, ama sekme tamamlama helmyolunu zaten ima etmez eshell, bu düzeltme de geçerlidir sanırım helm.
Omar

Oldukça temiz :) Bahşiş için teşekkürler
Chakravarthy Raghunandan

“Ne olacak !?” yorumu günümü yaptı :) Ayrıca, bunun dümen gibi diğer tamamlama çerçeveleri için de çalışması gerektiğini belirtmek isterim.
GergelyPolonkai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.