Заполните файлы в другой каталог в Zsh - PullRequest
1 голос
/ 04 ноября 2019

Не поддерживает ли команда compadd для ZSH завершение при вводе некоторых символов?

У меня есть исполняемый файл с именем 'index_for_test.js', и я добавляю скрипт оболочки в .zshrc.

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

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_for_test.js
#! /usr/bin/env node

const fs =require('fs')
const path=require('path')
const files=fs.readdirSync(path.join(process.cwd()))
console.log(files.join('\n'))

сценарий будет добавлен в .zshrc:

_index_for_test_completion() {
    local abc=(`index_for_test.js`)
    echo '\nabc:\n'
    echo $abc'\n'
    compadd -- $abc
}
compdef _index_for_test_completion index_for_test.js

Когда после ввода index_for_test.js следует ввод пробела, а затем нажмите tab, это сработает. Но при вводе index_for_test.js ../ нажмите tab, список завершения не отображается, даже если compadd принятьаргументы.

Изображение:

нормально: index_for_test.js

ошибка: index_for_test.js ../

Ожидайте

Если это моя ошибка, пожалуйста, дайте мне знать причину, спасибо.

Кроме того, если поведение правильное, мне интересно, как добиться завершения, как cd команда; поведение кд

1 Ответ

0 голосов
/ 04 ноября 2019

index_for_test.js печатает только имена файлов в каталоге current . Имя файла в текущем каталоге не может начинаться с ../, поэтому нет завершения с ../.

Если вы хотите завершить файлы в каталоге, вам нужно передать этот каталог в ваше завершениесценарий, и он должен работать в этом каталоге.

Кроме того, вы должны заполнить имена каталогов внутри zsh, если все каталоги могут содержать интересные файлы. Если вы хотите разрешить только определенные каталоги, подготовьте в вашем каталоге полные каталоги.

Кроме того, ваш сценарий не работает, если имена файлов содержат пробелы. Используйте нулевой байт в качестве разделителя: имена файлов не могут содержать нулевые байты.

Непроверенный код. Может понадобиться немного подправить.

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const files = fs.readdirSync(process.argv[2]);
console.log(files.join('\0'))
_index_for_test_completion() {
    local dir=$words[CURRENT] files
    if [[ ! -d $dir ]]; then dir=$dir:h; fi
    files=(${(ps:\0:)$(index_for_test.js $dir))
    print -lr '' abc: $files
    if [[ $dir != $words[CURRENT] ]]; then dir+="/"; fi
    compadd -- $^dir$files
}
compdef _index_for_test_completion index_for_test.js
...