5

问题:

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

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

建议的解决方案:

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

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

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

到目前为止我所拥有的:

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

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

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

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

4

1 回答 1

1

我这样做的方式(用difffrom 替换默认命令git)非常简单。

将此添加到您的~/.zshrc

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

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

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

于 2015-10-17T20:39:04.507 回答