나는 expect
자동 완성을 테스트하기 위해 zsh를 사용하고 있습니다(실제로 Ruby gem을 사용하고 greenletters
이를 호출하기 위해 뒤에서 Ruby를 사용합니다). 문서와 오래된 아카이브를 파헤친 후(이것은 나에게 다음 코드를 제공한 마지막 코멘트였습니다.PTY
expect
https://narkive.com/jbOlxniA:5.2481.94) "깨끗한" 시스템에서 완성을 쉽게 로드할 수 있는 다음 방법이 있습니다.
PROMPT='>' zsh -f
fpath+=($PWD/Completion)
autoload -Uz compinit
_compdir=$PWD/Completion compinit -D
이제 수동으로 파일을 생성하고 이 방법으로 로드하면 작동합니다.완전히 괜찮아. 그러나 greenletters
라이브러리를 사용하여 로드하려고 하면 완성 항목이 로드되지 않습니다.
>options Completion/
------------------------------------------------------------
Ruby로 작성된 SSCCE입니다( 간단한 스크립트 expect
로 동일한 예제를 작성하는데 어려움을 겪었습니다 ). gem install greenletters
이 스크립트를 실행하려면 다음을 실행해야 합니다 .
require 'tempfile'
require 'greenletters'
require 'tmpdir'
@tempdir = Dir.mktmpdir
completions_folder = @tempdir + '/Completion'
FileUtils.mkdir_p(completions_folder)
@completion_script = Tempfile.create('_completion', completions_folder)
@completion_script.write(DATA)
puts @tempdir
@adv = Greenletters::Process.new("PROMPT='>' zsh -f", transcript: $stdout, timeout: 3)
@adv.start!
@adv.wait_for(:output, />/i)
@adv << "cd #{@tempdir}\r"
@adv.wait_for(:output, />/i)
@adv << "fpath+=($PWD/Completion)\r"
@adv.wait_for(:output, />/i)
@adv << "autoload -Uz compinit\r"
@adv.wait_for(:output, />/i)
@adv << "_compdir=$PWD/Completion compinit -D\r"
@adv.wait_for(:output, />/i)
@adv << "options \t"
@adv.wait_for(:output, />/i)
__END__
#compdef _options options
function _options_help {
_arguments \
"-h[Show help information]" \
"--help[Show help information]"
}
function _options_desc {
_arguments \
"--test=[desc]" \
"-h[Show help information]" \
"--help[Show help information]"
}
function _options {
local line
local -a commands
commands=(
'desc:use description flag for description'
'help:Describe available commands or one specific command'
)
_arguments \
"-h[Show help information]" \
"--help[Show help information]" \
"1: : _describe 'command' commands" \
"*::arg:->args"
case $state in
args)
case $line[1] in
desc)
_options_desc
;;
help)
_options_help
;;
esac
;;
esac
}
_options "$@"
zsh는 PTY에서 일반 로딩과 다르게 동작합니까? 이것이 PTY에 대한 나의 일반적인 오해입니까? 이게 다들 일하는 방식인가요?