Postanowiłem pisać swoje skrypty systemowe w Ruby zamiast jak do tej pory w Bashu… Zacząłem od nauki “optparse” do handlowania parametrów, ale apetyt rośnie w miarę pisania i zachciało mi się autouzupełniania (completion) zsh… Niby w dokumentacji optparse jest wzmianka
http://ruby-doc.org/stdlib-2.3.0/libdoc/optparse/rdoc/OptionParser.html#class-OptionParser-label-Shell+Completion
For modern shells (e.g. bash, zsh, etc.), you can use shell completion for command line options.
Ale jak to ugryźć to nie mam pojęcia, jeśli ktoś umiałby mi pomóc - stawiam piwo.
Zadowolę się dowolnym rozwiązaniem tworzącym autouzupełnianie w zsh (albo nawet w bash’u) byle było prostsze niż pisanie natywnych funkcji do autouzupeniania, które są strasznie magiczne, jak zresztą cały bash/zsh, od którego właśnie chciałem uciec…
szmer
March 11, 2016, 10:29am
2
Musisz najpierw dodać skrypty opt_parse.bash
do ~/.bashrc
(lub analogicznie *.zsh
).
#! /bin/bash
# Completion for bash:
#
# (1) install this file,
#
# (2) load the script, and
# . ~/.profile.d/rb_optparse.bash
#
# (3) define completions in your .bashrc,
# rb_optparse command_using_optparse_1
# rb_optparse command_using_optparse_2
_rb_optparse() {
COMPREPLY=($("${COMP_WORDS[0]}" "--*-completion-bash=${COMP_WORDS[COMP_CWORD]}"))
return 0
}
rb_optparse () {
[ $# = 0 ] || complete -o default -F _rb_optparse "$@"
}
Potem definiujesz rb_completion skrypt.rb
(w bashrc lub w shellu do testów).
Przykład wykorzystania masz w testach:
require 'test/unit'
require 'optparse'
class TestOptionParser < Test::Unit::TestCase
end
class TestOptionParser::BashCompletion < Test::Unit::TestCase
def setup
@opt = OptionParser.new
@opt.define("-z", "zzz") {}
@opt.define("--foo") {}
@opt.define("--bar=BAR") {}
@opt.define("--for=TYPE", [:hello, :help, :zot]) {}
end
def test_compsys
compsys = @opt.compsys("", "zshcompsys")
assert_match(/\"-z\[zzz\]\"/, compsys)
assert_match(/\"--foo\[\]\"/, compsys)
assert_match(/\"--bar\[\]\"/, compsys)
assert_match(/\"--for\[\]\"/, compsys)
This file has been truncated. show original
Super wielkie dzięki! Wreszcie mogę pisać sensowne skrypty…