【问题标题】:How to force filename completion under oh-my-zsh?如何在 oh-my-zsh 下强制完成文件名?
【发布时间】:2014-10-02 08:09:47
【问题描述】:

问题:

有时,当我尝试在 zsh 中执行操作时,它不会完成我想要的文件名,因为它们不适用于当前上下文。两个例子:

  1. 我想强制添加一个当前在 hg 或 git 中被忽略的文件。 oh-my-zsh 试图通过仅完成未忽略的文件来帮助我,但在这种情况下这是一个障碍。我不得不手动输入文件的完整路径。
  2. 我想使用git diff 来区分我硬盘上的两个任意文件。这些文件不驻留在任何存储库中,但谁在乎呢?! git diff --no-index 是区分任何两个文件的好方法。但因为它们不在 repo 中,zsh 不会完成它们。

建议的解决方案:

可以简单地编辑源代码控制上下文以完成所有文件名,无论它们的源代码控制状态如何。但是有几个限制:

  1. 我不知道该怎么做。
  2. 有一个“逃生舱”可能会很好,我可以强制完成文件,无论上下文如何。

所以,我决定改为绑定一个快捷键来强制正常的、无上下文的文件完成。

我目前所拥有的:

Zsh 显然有一个简单的方法来做到这一点,如this question 中所述。所以我在.zshrc 中添加了以下几行:

zle -C complete complete-word complete-files
bindkey '^[[Z' complete
complete-files () { compadd - $PREFIX* }

这会导致 shift-tab 启动文件完成。它在标准 zsh 中运行良好!但是嘘,由于某种原因,当我获取 oh-my-zsh 时它不起作用。 :-(

那么有没有办法让它与 oh-my-zsh 一起工作,或者有没有我可能会觉得满意的替代解决方案?

【问题讨论】:

  • 在某些时候 oh-my-zsh 可能会删除以前的绑定。您可以使用bindkey | grep '^[[Z' 检查绑定是否仍然存在于正在运行的shell 中。你也可以用zle -lL complete检查zle设置是否正确,用whence -c complete-files检查函数定义是否正确。
  • 你完全正确!只要我 采购oh-my-zsh.sh 之后致电bindkey,一切都很好。 (oh-my-zsh 将其绑定到 reverse-menu-complete)如果您想添加答案,我会将其标记为正确。

标签: autocomplete zsh oh-my-zsh zsh-completion


【解决方案1】:

我这样做的方式(将默认的diff 命令替换为来自git 的命令)非常简单。

将此添加到您的~/.zshrc

diff() {
    git diff --no-index "$@"
}

在我使用别名之前,但由于 zsh 可以“解决”它们,因此它使用了 git diff 中的自动完成功能,这无意中导致了与您相同的问题。

使用函数解决了这个问题,因为 zsh 恢复到经典的“仅文件”完成。

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2023-04-09
    • 2018-01-12
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多