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

时间:2014-08-08 18:52:52

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

问题:

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

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

    可以简单地编辑源控件上下文以完成所有文件名,无论其源控件状态如何。但是有一些限制:

    1. 我不知道该怎么做。
    2. 有一个“逃生舱”可能会很好,我可以强制文件完成,无论上下文如何。
    3. 所以,我决定绑定一个关键快捷方式来强制正常,无上下文的文件完成。

      到目前为止我有什么:

      Zsh显然有一种简单的方法可以做到这一点,详见this question。所以我在.zshrc添加了以下几行:

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

      这会导致 shift-tab 启动文件完成。它在标准zsh中工作得很漂亮!但是boo-hoo,由于某种原因,当我采购oh-my-zsh时它不起作用。 : - (

      那么有没有办法让这个与哦-my-zsh一起使用,或者是否有一个我可能觉得令人满意的替代解决方案?

1 个答案:

答案 0 :(得分:1)

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

将此添加到您的~/.zshrc

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

在我使用别名之前,但是因为zsh可以解决"然后,他们使用git diff中的自动完成功能,这无意中导致了与您相同的问题。

使用函数可以解决此问题,因为zsh仅恢复为经典"文件"完成。