Zsh
自定義腳本的 zsh 完成規則
我有自定義腳本的 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
.更新:
基本上,完成規則應該有兩種操作模式:
- 當我鍵入時
foo -<TAB>
,它應該為我提供可選參數 (-d
-w
-l
-i
)。然後,根據選擇的可選參數:1a)
foo -d <TAB>
僅完成路徑中的目錄1b)
foo -w / -l / -i <TAB>
完成路徑中的正常文件這可以按需要工作。
- 當我鍵入時
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