Zsh

git的ZSH完成不會自動完成絕對路徑?

  • July 6, 2020

我有 git 儲存庫/.git,即我的文件系統的根目錄。

當我在/etc/foo/do時git status,git 告訴我文件../fstab已更改。

當我想zsh對命令使用完成時git(仍在 /etc/foo/ 中),即:

git diff ../fs<TAB>

這樣可行。但是當我使用絕對路徑時,即:

git diff /etc/fs<TAB>

然後zsh不完成絕對路徑。

我怎樣才能告訴zsh完整的絕對路徑,以及相對路徑?

我在 Debian Buster 上使用zsh版本。5.7.1-1

ZSH 完成:

Zsh 補全是使用通常位於/usr/share/zsh/5.5/functions/Completion/Unix(可能因發行版而異)的腳本完成的,每個命令補全的腳本都被命名_commandName,Zsh 包含/處理那些具有$fpath類似於變數的環境變數的腳本$PATH,在這種情況下,使用的腳本是_git,位置順序on$fpath很重要,因為 Zsh 使用_git它找到的第一個腳本並忽略其他腳本(如果存在)(也類似於$PATH)。

腳本:

就像在這個QA中解釋的那樣,作為一個例子,以下函式在$PWD/將其傳遞給之前添加到任何相對路徑_files,這是文件的正常完成函式。

_absolute_files () {
 local expansion=$PREFIX$SUFFIX; expansion=${(e)expansion}
 if [[ "${expansion%%/#}" != "${expansion:a}" ]]; then
   PREFIX="\$PWD/$PREFIX"
 fi
 _files "$@";
}

~/這適用於許多常見情況,包括辨識以絕對…開頭的路徑

解決方案:

預設補全git行為不包括相對路徑,我們可以編輯它的腳本並添加一個類似於上面解釋中的函式以添加對相對路徑的支持,或者我們可以簡單地用 ohmyzsh 的補全外掛替換預設補git,步驟如下:gitfast

將 ohmyzsh複製到某個位置(比如說/location):

git clone https://github.com/ohmyzsh/ohmyzsh.git

編輯~/.zshrc並在配置文件底部添加以下內容以包括gitfast

fpath=( /location/ohmyzsh/plugins/gitfast $fpath ) 

正如之前和這裡所解釋的,順序很重要。

~/.zcompdump*通過刪除任何then run來更新完成記憶體compinit

替代解決方案:

/usr/share/zsh/5.5/functions/Completion/Unix/_git通過在函式上應用以下更新檔進行編輯_git-diff

--- _git
+++ _git
@@ -766,6 +766,12 @@

  case $state in
    (from-to-file)
+  
+      if [[ $line[1] == *\/* ]]; then
+        _alternative 'files::_files' && ret=0
+        return ret
+      fi
+      
      # If "--" is part of $opt_args, this means it was specified before any
      # $words arguments. This means that no heads are specified in front, so
      # we need to complete *changed* files only.

引用自:https://unix.stackexchange.com/questions/590186