Игра с функцией add_main_option
В этом посте я рассмотрю возможности, предлагаемые методом add_main_option Gio.Application. Сначала давайте посмотрим на аргументы метода:
Gio.Application.add_main_option(long_name,
short_name,
flags,
arg,
description,
arg_description)
long_name the long name of an option used to specify it
in a commandline
short_name the short name of an option
flags flags from GLib.OptionFlags
arg the type of the option, as a GLib.OptionArg
description the description for the option in --help
output
arg_description the placeholder to use for the extra argument
parsed by the option in --help output
long_name, short_name и description говорят сами за себя, но как насчет флагов, arg и arg_description? Давайте изучим их.
GLib.OptionFlags
Установка этого флага добавляет дополнительное поведение к опции (вы можете увидеть все значения здесь), поэтому давайте посмотрим на одно: GLib.OptionFlags.HIDDEN
Если для этого флага установлено значение GLib.OptionFlags.HIDDEN, аргумент не появится в выводе --help
, но его можно будет использовать. Например, если у вас есть один параметр, определенный, как показано ниже:
this.add_main_option(‘One’, ‘1’.charCodeAt(0), GLib.OptionFlags.HIDDEN, GLib.OptionArg.NONE, “One”, null);
Затем в консоли:
$ ./handling4.js --help Usage: gjs [OPTION…] Help Options: -h, --help Show help options --help-all Show all help options --help-gapplication Show GApplication options Application Options: -v, --version Shows program version -2, --Two Two $ ./handling4.js -1 One was specified
Как видите, первый вариант не отображается в выводе --help
, но его можно использовать.
GLib.OptionArg
Это довольно интересно и позволяет нам определить дополнительные аргументы для опции, например: --user=USER
. GLib.OptionArg ‘enum’ определяет тип данных аргумента, который будет передан опции (все их можно посмотреть здесь). Давайте посмотрим полный пример:
#!/usr/bin/gjs // handling5.js const System = imports.system; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const Handling = new Lang.Class({ Name: 'Handling', Extends: Gio.Application, _version: '0.1', _init: function() { this.parent({ application_id: 'handling.example.com', flags: Gio.ApplicationFlags.HANDLES_OPEN }); this.add_main_option('version', 'v'.charCodeAt(0), GLib.OptionFlags.NONE, GLib.OptionArg.NONE, "Shows program version", null); this.add_main_option('user', 'U'.charCodeAt(0), GLib.OptionFlags.NONE, GLib.OptionArg.STRING, "User Name", "USER"); GLib.set_application_name("Handling"); }, vfunc_activate: function() { this.parent(); }, vfunc_startup: function() { this.parent(); }, vfunc_handle_local_options: function(options) { if (options.contains('version')) { print(this._version); return 0; } if (options.contains('user')) { print('Value of user: ' + options.lookup_value('user', null).get_string()[0]); } return -1; }, vfunc_open: function(files, hint) { files.forEach( Lang.bind(this, function(element, index, array) { print (element.get_uri()) })); }, vfunc_shutdown: function() { this.parent(); } }); (new Handling()).run([System.programInvocationName].concat(ARGV));
Давайте посмотрим, как это работает:
$ ./handling5.js --user=miguel http://www.google.com Value of user: miguel http://www.google.com $ ./handling5.js -U miguel /home/miguel/doc Value of user: miguel file:///home/miguel/doc ./handling5.js -U Missing argument for -U $ ./handling5.js -h Usage: gjs [OPTION...] Help Options: -h, --help Show help options --help-all Show all help options --help-gapplication Show GApplication options Application Options: -v, --version Shows program version -U, --user=USER User Name
Удивительно, теперь у нас есть много возможностей с очень небольшими изменениями в нашем коде и, кроме того, бесплатно (если у вас есть «ванильный GNOME», вам не нужно устанавливать какую-либо другую библиотеку) .
В методе add_main_option есть еще много опций, я только что показал некоторые из них, поэтому я призываю вас более подробно изучить, что еще — этот метод — может предложить.
Надеюсь, вам понравилась эта серия.