如何设置eshell以使用常春藤完成制表符?


16

我非常喜欢ivy完成功能,我喜欢一个简单的(ivy-mode 1)方法足以让ivyEmacs使用某种完成功能的任何地方(completeing-read我相信它是通过覆盖实现的)。但这并不安装eshell到使用ivy的标签完成。我喜欢eshell的完成候选人列表,但希望ivy用户界面在其中选择。是否有某种方法可以重用eshell所做的任何事情来产生候选候选人并将其交给“常春藤”?

Answers:


11

这应该工作正常:

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

我不知道为什么以上不是默认设置。但我只用shell-modeterm-mode反正。


3
您可能应该添加(add-hook 'eshell-mode-hook '(lambda ()需要包装的内容。
Timm

谢谢,这比我的要整洁。它不是默认值的原因可能是过去某个时候某个人更喜欢pcomplete标准完成UI。
Omar

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>除了输入行的末尾,我什么都不会按。到目前为止,我也没有看到第二个问题。

编辑:对于那些不熟悉eshell的怪癖(这是委婉的说法)的人,也许我应该添加它来重新绑定eshell的密钥,如上面所建议的,您应该将其放在您的init文件中:

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

在您对我的钩子反模式浪费键大吼大叫之前,让我解释一下eshell声明其keymap,(defvar eshell-mode-map nil)然后在(setq-local eshell-mode-map (sparse-keymap))内部进行eshell-mode!(该代码有帮助;; FIXME: What the hell!?。)这意味着您必须在eshell-mode运行后才能重新绑定键!因此,钩。


另外,我还没有进行测试,但是我想如果helm尚未暗示其进入eshell制表符完成的功能,则此修复程序也适用于helm
奥马尔

这非常好:)感谢您的提示
Chakravarthy Raghunandan '16

那条“他将要做什么!?”的评论使我很高兴:)另外,我想指出的是,这也应适用于其他完成框架,例如掌舵。
GergelyPolonkai '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.