Autocomplete 在zsh中的不同目录中完成文件

Autocomplete 在zsh中的不同目录中完成文件,autocomplete,zsh,tab-completion,Autocomplete,Zsh,Tab Completion,输入某些字符时,ZSH的compadd命令是否不支持完成 我有一个名为“index_for_test.js”的可执行文件,我向.zshrc添加了一个shell脚本 $PATH: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/hanqing/Development/compadd test ./ ├── dir1 │ ├── a.js │ └── b.js ├── dir2 │ ├── a.ts │ └── b.ts └──

输入某些字符时,ZSH的compadd命令是否不支持完成

我有一个名为“index_for_test.js”的可执行文件,我向.zshrc添加了一个shell脚本

$PATH:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/hanqing/Development/compadd test

./
├── dir1
│   ├── a.js
│   └── b.js
├── dir2
│   ├── a.ts
│   └── b.ts
└── index_for_test.js

total 24
drwxr-xr-x   6 hanqing  staff   192 11  4 13:45 .
drwxr-xr-x  10 hanqing  staff   320 11  4 13:42 ..
-rw-r--r--@  1 hanqing  staff  6148 11  4 14:04 .DS_Store
drwxr-xr-x   4 hanqing  staff   128 11  4 13:43 dir1
drwxr-xr-x   4 hanqing  staff   128 11  4 13:43 dir2
-rwxr-xr-x   1 hanqing  staff   155 11  4 13:50 index_for_test.js
/Users/hanqing/Development/compadd test

./
├── dir1
│   ├── a.js
│   └── b.js
├── dir2
│   ├── a.ts
│   └── b.ts
└── index_for_test.js

total 24
drwxr-xr-x   6 hanqing  staff   192 11  4 13:45 .
drwxr-xr-x  10 hanqing  staff   320 11  4 13:42 ..
-rw-r--r--@  1 hanqing  staff  6148 11  4 14:04 .DS_Store
drwxr-xr-x   4 hanqing  staff   128 11  4 13:43 dir1
drwxr-xr-x   4 hanqing  staff   128 11  4 13:43 dir2
-rwxr-xr-x   1 hanqing  staff   155 11  4 13:50 index_for_test.js
//index\u for\u test.js
#! /usr/bin/env节点
常量fs=require('fs')
const path=require('路径')
const files=fs.readdirSync(path.join(process.cwd()))
console.log(files.join('\n'))
将脚本添加到.zshrc:

\u测试的索引\u完成(){
本地abc=(`index\u for_test.js`)
回显'\nabc:\n'
echo$abc'\n'
康帕德--$abc
}
compdef_index_for_test_completion index_for_test.js
当输入
index\u for_test.js
后再输入空格,然后按
tab
,它可以工作查找。但当输入
index\u for_test.js../
后按
tab
时,即使
compadd
接受参数,它也不会显示完成列表

图片:

期待 如果这是我的错误,请告诉我原因,谢谢

另外,如果行为是正确的,我想知道如何实现像
cd
命令这样的完成;
index\u for_test.js
仅打印当前目录中的文件名。当前目录中的文件名不能以
。/
开头,因此不能以
。/
开头

如果要完成目录中的文件,需要将此目录传递给完成脚本,并使其在该目录中工作

此外,如果所有目录都可能包含感兴趣的文件,则应在zsh中填写目录名。如果只允许某些目录,请让脚本完成目录

此外,当文件名包含空格时,脚本将被破坏。使用空字节作为分隔符:文件名不能包含空字节

未经测试的代码。可能需要一些调整

#/usr/bin/env节点
常数fs=要求('fs');
const path=require('path');
const files=fs.readdirSync(process.argv[2]);
console.log(files.join('\0'))
\u测试的索引\u完成(){
本地目录=$words[当前]文件
如果[[!-d$dir]];那么dir=$dir:h;fi
文件=(${(ps:\0:)$(索引\u for_test.js$dir))
打印-lr''abc:$文件
如果[[$dir!=$words[CURRENT]]];则dir+=“/”fi
compadd--$^dir$文件
}
compdef_index_for_test_completion index_for_test.js

index\u for_test.js
仅打印当前目录中的文件名。当前目录中的文件名不能以
。/
开头,因此不能以
开头完成

如果要完成目录中的文件,需要将此目录传递给完成脚本,并使其在该目录中工作

此外,如果所有目录都可能包含感兴趣的文件,则应在zsh中填写目录名。如果只允许某些目录,请让脚本填写完整的目录

此外,当文件名包含空格时,脚本将被破坏。请使用空字节作为分隔符:文件名不能包含空字节

未测试的代码。可能需要一些调整

#!/usr/bin/env节点
常数fs=要求('fs');
const path=require('path');
const files=fs.readdirSync(process.argv[2]);
console.log(files.join('\0'))
\u测试的索引\u完成(){
本地目录=$words[当前]文件
如果[[!-d$dir]];那么dir=$dir:h;fi
文件=(${(ps:\0:)$(索引\u for_test.js$dir))
打印-lr''abc:$文件
如果[[$dir!=$words[CURRENT]]];则dir+=“/”fi
compadd--$^dir$文件
}
compdef_index_for_test_completion index_for_test.js

谢谢你的回答。我是zsh编程新手,我错误地认为
compadd
只是显示了我提供的单词列表。否则,我只理解你给出的shell脚本的一部分,但从中得到了一些注意点,所以我尝试了很长时间,然后将
-d
-S
参数组合在一起使用
compadd
nodejs
来实现它。请冒昧地问一下,您能介绍一个可以系统地学习shell的地方或网站吗?谢谢您的回答。我是zsh编程新手,我错误地认为
compadd
只是显示了我提供的单词列表。否则,我就不知道了Derstain是您给出的shell脚本的一部分,但从中获得了一些值得注意的要点,因此我尝试了很长时间,然后将
-d
-S
compadd
参数与
nodejs
结合起来实现它。请冒昧询问,您能介绍一个可以学习shell sys的地方或网站吗临时地?