Zsh

自定義腳本的 zsh 完成規則

  • May 18, 2022

我有自定義腳本的 zsh 完成文件foo

它應該在以下位置完成正常文件$HOME/foo

#compdef foo

_arguments -S : \
   '-i' \
   '1:thing:_path_files -W $HOME/foo -g "*(.)"'

我需要修改完成如下:

添加可選參數--dir

當我鍵入foo --dir<TAB>時,它應該為目錄提供補全$HOME/foo

foo --dir=<TAB>

此外,文件完成路徑($HOME/foo預設情況下)應更改為$HOME/foo/my_dir,其中my_dir提供的名稱為--dir=my_dir.

更新:

基本上,完成規則應該有兩種操作模式:

  1. 當我鍵入時foo -<TAB>,它應該為我提供可選參數 ( -d -w -l -i)。然後,根據選擇的可選參數:

1a)foo -d <TAB>僅完成路徑中的目錄

1b)foo -w / -l / -i <TAB>完成路徑中的正常文件

這可以按需要工作。

  1. 當我鍵入時foo <TAB>,完成規則應該在路徑中提供正常文件。目前,這不能按預期工作。它仍然為我提供了可選參數,我必須選擇一個,然後才能完成目錄/文件。

當我鍵入foo <TAB>(不帶-)時,它只為我提供選項參數。只有在我選擇了一個可選參數之後,我的完成規則才會在路徑中提供目錄/文件。

如何修復我的腳本,使其在沒有任何可選參數的情況下工作,並且在這種情況下只需完成路徑中的正常文件?

這是完成規則:

#compdef foo

local -A opt_args

_arguments -S -C \
   '-i[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
   '-l[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
   '-w[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
   '-d[select directory]:directory_file:_path_files -/ -W $HOME/manuals' \
    && return 0

最後一個小問題。完成規則只需要(完成)一個可選參數。

當我鍵入foo -i -<TAB>時,它不提供其他剩餘的可選參數。這些參數不應相互排斥。應該可以使用:

foo -i -l -w <TAB>

像那樣:

#compdef foo

local -A opt_args

_arguments -S -C \
   '-i[select file]:thing_file:_path_files -W $HOME/foo/${opt_args[-d]} -g "*(.)"' \
   '-d[select directory]:directory_file:_path_files -/ -W $HOME/foo' \
    && return 0

解釋它如何在功能上工作:

創建〜/ foo:

mkdir ~/foo

在 ~/foo 中創建 10 個目錄:

mkdir ~/foo/DIR{1..10}

在第 4 個目錄中創建一個文件:

$ touch ~/foo/DIR4/FILE4

在 ~/foo 中有一個文件:

touch ~/foo/FILE-IN-FOO

類型

食物

並按Tab。表明:

$foo -d DIR1/
DIR1/   DIR10/  DIR2/   DIR3/   DIR4/   DIR5/   DIR6/   DIR7/   DIR8/   DIR9/

僅顯示目錄,因此沒有 FILE-IN-FOO。

選擇 DIR4 並添加 -i:

foo -d DIR4 -i

並按Tab。表明:

foo -d DIR4 -i FILE4

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