![Скрипт Ruby для создания временного файла для использования с greenletters](https://rvso.com/image/170307/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20Ruby%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D1%81%20greenletters.png)
Я использую expect
для тестирования автодополнений в zsh (на самом деле использую гем Ruby greenletters
, с использованием Ruby's 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/
------------------------------------------------------------
Вот SSCCE, написанный на Ruby (у меня возникли проблемы с созданием того же примера в простом 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 в целом? Они все так работают?