如何在 oh-my-zsh 下强制完成文件名?

Nei*_*aft 5 zsh autocomplete zsh-completion oh-my-zsh

问题:

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

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

建议的解决方案:

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

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

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

到目前为止我所拥有的:

Zsh 显然有一种简单的方法可以做到这一点,如本问题所述。所以我在我的中添加了以下几行.zshrc

zle -C complete complete-word complete-files
bindkey '^[[Z' complete
complete-files () { compadd - $PREFIX* }
Run Code Online (Sandbox Code Playgroud)

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

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

Ant*_*lvy 1

我的做法(diff用来自 的命令替换默认命令git)非常简单。

将其添加到您的~/.zshrc

diff() {
    git diff --no-index "$@"
}
Run Code Online (Sandbox Code Playgroud)

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

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