タブ補完にivyを使用するようにeshellをセットアップするにはどうすればよいですか?


16

私はivy完了が非常に好きで、Emacsが何らかの種類の完了を使用するほぼすべての場所(ivy-mode 1)を取得するのに単純なもので十分であるivyことを愛しています(これはオーバーライドすることで達成されますcompleteing-read)。しかし、これはタブ補完eshellに使用するようには設定されていませんivyeshellの補完候補のリストは気に入っていますが、ivyUIの中から選択することを好みます。eshell完了候補を生成し、それを「ivy」に渡すために行うことを再利用する方法はありますか?

回答:


11

これはうまくいくはずです:

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

上記がデフォルトではない理由はわかりません。しかしshell-modeterm-modeとにかくだけを使用します。


3
おそらくそれを追加する(add-hook 'eshell-mode-hook '(lambda ()必要があります。
ティム

おかげで、それは私が持っていたものよりも少しきれいです。これがデフォルトではない理由は、おそらく過去のある時点で誰かpcompleteが標準の補完UIよりも好んだからでしょう。
オマー

6

私は最初のテストで問題なく動作するように見えるものを見つけました:基本的にに再バインド<tab>しますpcomplete-std-completeが、その関数は何らかの理由でインタラクティブではないので、ラップする必要があります:

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

pcompete-std-complete試行は、のために書かれた補完を使用するにはpcomplete、標準的な完了UI、とivyデフォルトでは無効になります(非常に最近のアップデートで、彼らは近くのポイントをバッファESHELL!での素敵なオーバーレイ右側に表示されます)。

pcomplete-completions-at-pointpcomplete-std-complete依存する)のソースコード内のコメントは、いくつかの潜在的な問題に言及しています。

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

<tab>は入力行の最後を除いて押すことはないと思うので、最初のものは私に影響を与えないと思います。これまでのところ、2番目の問題の表面も見ていません。

編集:eshellの癖に慣れていない人(これはe曲表現です)については、上記で提案したようにeshellのキーを再バインドするためにそれを追加して、initファイルにこれを配置する必要があります:

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

無駄なキーバインドインフックアンチパターンについて私に怒鳴る前に、eshellがそのキーマップを宣言(defvar eshell-mode-map nil)してから(setq-local eshell-mode-map (sparse-keymap))内部で行うことを説明しましょうeshell-mode!(コードには便利な機能があります;; FIXME: What the hell!?。)つまり、eshell-mode実行後までキーを再バインドすることはできません!したがって、フック。


また、私はそれをテストしてhelmいませんがeshell、タブ補完への道をまだ暗示していない場合、この修正はにも適用されると思いますhelm
オマー

これはかなりきれいです:)ヒントをありがとう
チャクラヴァルシーラグナナンダン

その「彼は何だ!?」というコメントは私の一日でした:)また、これはヘルムのような他の補完フレームワークでも機能するはずです。
GergelyPolonkai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.