回答:
私は最初のテストで問題なく動作するように見えるものを見つけました:基本的にに再バインド<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-point
(pcomplete-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
。
(add-hook 'eshell-mode-hook '(lambda ()
必要があります。