【问题标题】:Make eshell tab completion behave like Bash使 eshell 选项卡完成的行为类似于 Bash
【发布时间】:2013-11-18 19:41:11
【问题描述】:

我怎样才能让 eshell 自动完成功能表现得像 Bash 和 Emacs 一样,即它提供了一个选择列表,而不是为你任意选择一个?

例如,如果我有两个目录“Download”和“Downloads”,当我键入“Down”并点击 TAB 时,我希望会弹出另一个缓冲区并向我显示选择。但是 eshell 只是为我完成了它,即如果我按 TAB,它会完成“下载”;再次点击 TAB,它变为“下载”。

【问题讨论】:

  • 您的自定义代码可能会受到一些干扰。试试emacs -q:它有效。
  • 我尝试了emacs -q,但没有成功。例如,如果我有两个目录“Download”和“Downloads”,当我键入“Down”并点击 TAB 时,我希望会弹出另一个缓冲区并向我显示选择。但是 eshell 只是为我完成它,即如果我按 TAB,它会完成“下载”;再次点击 TAB,它变为“下载”。

标签: emacs eshell


【解决方案1】:

使用这个:

(add-hook
 'eshell-mode-hook
 (lambda ()
   (setq pcomplete-cycle-completions nil)))

【讨论】:

  • 它也不好用。我尝试将它添加到我的初始化文件中,并在我正在运行的 Emacs 中手动修改,然后启动一个新的 eshell。仍然没有产生我的欲望行为。
  • 需要在eshell-mode-hook中设置变量的值(或者使用setq-default)
  • 通常可以自定义变量。但是 EShell 似乎改变了变量,这使得有必要在钩子中更新它。
  • 应该使用setq-local而不是setq
  • @xuhdev:或者按照其他答案和(setq eshell-cmpl-cycle-completions nil)中的建议进行操作@
【解决方案2】:
(add-hook
 'eshell-mode-hook
 (lambda ()
   (setq pcomplete-cycle-completions nil)))

(setq eshell-cmpl-cycle-completions nil)

当我将我的 emacs 运行为“emacs -q”以避免我自己的自定义时,两者都按照您的要求进行操作并显示一个列出完成的缓冲区。这是使用 emacs 23.3,您运行的是旧版本吗?

另请参阅http://www.emacswiki.org/emacs/EshellCompletion,这是我第一次去查看的地方。

试用步骤:

  1. 使用 'emacs -q' 作为命令启动 emacs -- 没有其他参数。
  2. 更改为 *scratch* 缓冲区
  3. 粘贴或输入上述任一代码 sn-ps
  4. 将光标放在 sn-p 的末尾,然后按“C-e”执行代码。
  5. 启动 eshell
  6. 测试
  7. 如果两者都不起作用,请在此处报告您的版本信息和任何其他相关详细信息

【讨论】:

  • 谢谢。我不知道我必须附加到 eshell-mode-hook。事情按预期工作。我正在使用最新的 Emacs。
【解决方案3】:

你只需要下面这行:

(setq eshell-cmpl-cycle-completions nil)

eshell-mode 在本地自动将pcomplete-cycle-completions 设置为eshell-cmpl-cycle-completions 的值。

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多