From c725d48ada5d60fecf8a04cb05c4522d9aeca922 Mon Sep 17 00:00:00 2001 From: Salvydas Lukosius Date: Fri, 6 Jan 2023 09:09:55 +0000 Subject: [PATCH 1/5] [WIP] --- .editorconfig | 300 +------ .github/workflows/zsh-n.yml | 57 ++ .github/workflows/zunit.yml | 4 +- .trunk/.gitignore | 6 +- .../configs}/.markdownlint.yaml | 1 - .trunk/configs/.shellcheckrc | 7 + .trunk/trunk.yaml | 39 +- .vscode/settings.json | 13 +- F-Sy-H.plugin.zsh | 42 +- docs/CHANGELOG.md | 4 +- docs/CODE_OF_CONDUCT.md | 132 ---- docs/CONTRIBUTING.md | 29 - docs/GOVERNANCE.md | 45 -- docs/MAINTAINERS.md | 11 - docs/README.md | 2 +- docs/THEME_GUIDE.md | 11 +- docs/images/array-assign.png | Bin 2022 -> 1557 bytes docs/images/assign.png | Bin 15333 -> 14569 bytes docs/images/cmdsubst.png | Bin 8086 -> 7542 bytes docs/images/cplx_cond.png | Bin 3428 -> 2566 bytes docs/images/eval_cmp.png | Bin 7750 -> 7357 bytes docs/images/execfd.png | Bin 2354 -> 2286 bytes docs/images/execfd_cmp.png | Bin 3846 -> 3714 bytes docs/images/for-loop-cmp.png | Bin 8045 -> 6699 bytes docs/images/for-loop.png | Bin 3041 -> 2554 bytes docs/images/function.png | Bin 6268 -> 5160 bytes docs/images/git_chroma.png | Bin 13195 -> 12346 bytes docs/images/global-alias.png | Bin 5499 -> 4983 bytes docs/images/heredoc.png | Bin 5060 -> 4986 bytes docs/images/herestring.png | Bin 5085 -> 5031 bytes docs/images/highlight-less.png | Bin 4419 -> 3769 bytes docs/images/highlight-much.png | Bin 6294 -> 5675 bytes docs/images/ideal-string.png | Bin 9813 -> 8794 bytes docs/images/in_string.png | Bin 5623 -> 4571 bytes docs/images/parameter.png | Bin 3235 -> 2390 bytes docs/images/theme.png | Bin 36511 -> 34485 bytes docs/images/typeset.png | Bin 4790 -> 4283 bytes docs/images/zcalc.png | Bin 4865 -> 4326 bytes fast-string-highlight | 80 -- functions/.fast-make-targets | 147 ++-- functions/.fast-read-ini-file | 23 +- functions/.fast-run-command | 25 +- functions/.fast-run-git-command | 52 +- functions/.fast-zts-read-all | 9 +- _fast-theme => functions/_fast-theme | 30 +- fast-highlight => functions/fast-highlight | 116 ++- functions/fast-string-highlight | 79 ++ functions/fast-theme | 291 +++---- share/test/parse.zsh | 28 +- tests/main.zunit | 2 +- "\342\206\222chroma/-alias.ch" | 0 "\342\206\222chroma/-autoload.ch" | 3 +- "\342\206\222chroma/-autorandr.ch" | 5 +- "\342\206\222chroma/-awk.ch" | 0 "\342\206\222chroma/-docker.ch" | 3 +- "\342\206\222chroma/-example.ch" | 0 "\342\206\222chroma/-fast-theme.ch" | 36 +- "\342\206\222chroma/-fpath_peq.ch" | 3 +- "\342\206\222chroma/-git.ch" | 746 +++++++++--------- "\342\206\222chroma/-grep.ch" | 0 "\342\206\222chroma/-hub.ch" | 0 "\342\206\222chroma/-ionice.ch" | 0 "\342\206\222chroma/-lab.ch" | 0 "\342\206\222chroma/-make.ch" | 0 "\342\206\222chroma/-nice.ch" | 0 "\342\206\222chroma/-nmcli.ch" | 0 "\342\206\222chroma/-node.ch" | 0 "\342\206\222chroma/-ogit.ch" | 0 "\342\206\222chroma/-perl.ch" | 0 "\342\206\222chroma/-precommand.ch" | 0 "\342\206\222chroma/-printf.ch" | 0 "\342\206\222chroma/-ruby.ch" | 0 "\342\206\222chroma/-scp.ch" | 0 "\342\206\222chroma/-sh.ch" | 0 "\342\206\222chroma/-source.ch" | 57 +- "\342\206\222chroma/-ssh.ch" | 7 +- "\342\206\222chroma/-subcommand.ch" | 5 +- "\342\206\222chroma/-subversion.ch" | 3 +- "\342\206\222chroma/-vim.ch" | 3 +- "\342\206\222chroma/-whatis.ch" | 0 "\342\206\222chroma/-which.ch" | 3 +- "\342\206\222chroma/-zi.ch" | 3 +- "\342\206\222chroma/-zinit.ch" | 377 --------- "\342\206\222chroma/main-chroma.ch" | 0 84 files changed, 993 insertions(+), 1846 deletions(-) create mode 100644 .github/workflows/zsh-n.yml rename {.github => .trunk/configs}/.markdownlint.yaml (94%) create mode 100644 .trunk/configs/.shellcheckrc delete mode 100644 docs/CODE_OF_CONDUCT.md delete mode 100644 docs/CONTRIBUTING.md delete mode 100644 docs/GOVERNANCE.md delete mode 100644 docs/MAINTAINERS.md delete mode 100644 fast-string-highlight rename _fast-theme => functions/_fast-theme (76%) mode change 100644 => 100755 rename fast-highlight => functions/fast-highlight (96%) mode change 100644 => 100755 create mode 100755 functions/fast-string-highlight mode change 100644 => 100755 functions/fast-theme mode change 100644 => 100755 "\342\206\222chroma/-alias.ch" mode change 100644 => 100755 "\342\206\222chroma/-autoload.ch" mode change 100644 => 100755 "\342\206\222chroma/-autorandr.ch" mode change 100644 => 100755 "\342\206\222chroma/-awk.ch" mode change 100644 => 100755 "\342\206\222chroma/-docker.ch" mode change 100644 => 100755 "\342\206\222chroma/-example.ch" mode change 100644 => 100755 "\342\206\222chroma/-fast-theme.ch" mode change 100644 => 100755 "\342\206\222chroma/-fpath_peq.ch" mode change 100644 => 100755 "\342\206\222chroma/-git.ch" mode change 100644 => 100755 "\342\206\222chroma/-grep.ch" mode change 100644 => 100755 "\342\206\222chroma/-hub.ch" mode change 100644 => 100755 "\342\206\222chroma/-ionice.ch" mode change 100644 => 100755 "\342\206\222chroma/-lab.ch" mode change 100644 => 100755 "\342\206\222chroma/-make.ch" mode change 100644 => 100755 "\342\206\222chroma/-nice.ch" mode change 100644 => 100755 "\342\206\222chroma/-nmcli.ch" mode change 100644 => 100755 "\342\206\222chroma/-node.ch" mode change 100644 => 100755 "\342\206\222chroma/-ogit.ch" mode change 100644 => 100755 "\342\206\222chroma/-perl.ch" mode change 100644 => 100755 "\342\206\222chroma/-precommand.ch" mode change 100644 => 100755 "\342\206\222chroma/-printf.ch" mode change 100644 => 100755 "\342\206\222chroma/-ruby.ch" mode change 100644 => 100755 "\342\206\222chroma/-scp.ch" mode change 100644 => 100755 "\342\206\222chroma/-sh.ch" mode change 100644 => 100755 "\342\206\222chroma/-source.ch" mode change 100644 => 100755 "\342\206\222chroma/-ssh.ch" mode change 100644 => 100755 "\342\206\222chroma/-subcommand.ch" mode change 100644 => 100755 "\342\206\222chroma/-subversion.ch" mode change 100644 => 100755 "\342\206\222chroma/-vim.ch" mode change 100644 => 100755 "\342\206\222chroma/-whatis.ch" mode change 100644 => 100755 "\342\206\222chroma/-which.ch" mode change 100644 => 100755 "\342\206\222chroma/-zi.ch" delete mode 100644 "\342\206\222chroma/-zinit.ch" mode change 100644 => 100755 "\342\206\222chroma/main-chroma.ch" diff --git a/.editorconfig b/.editorconfig index 9e9506e..c25c645 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,7 @@ # Space or Tabs? # https://stackoverflow.com/questions/35649847/objective-reasons-for-using-spaces-instead-of-tabs-for-indentation # https://stackoverflow.com/questions/12093748/how-to-use-tabs-instead-of-spaces-in-a-shell-script +# https://github.com/editorconfig/editorconfig-defaults/blob/master/editorconfig-defaults.json # # 1. What happens when I press the Tab key in my text editor? # 2. What happens when I request my editor to indent one or more lines? @@ -57,302 +58,3 @@ indent_size = 4 [*.{cs,csx,cake,vb,vbx}] # Default Severity for all .NET Code Style rules below dotnet_analyzer_diagnostic.severity = warning - -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules#net-style-rules -[*.{cs,csx,cake,vb,vbx}] -# "this." and "Me." qualifiers -dotnet_style_qualification_for_field = true:warning -dotnet_style_qualification_for_property = true:warning -dotnet_style_qualification_for_method = true:warning -dotnet_style_qualification_for_event = true:warning -# Language keywords instead of framework type names for type references -dotnet_style_predefined_type_for_locals_parameters_members = true:warning -dotnet_style_predefined_type_for_member_access = true:warning -# Modifier preferences -dotnet_style_require_accessibility_modifiers = always:warning -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning -visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:warning -dotnet_style_readonly_field = true:warning -# Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning -# Expression-level preferences -dotnet_style_object_initializer = true:warning -dotnet_style_collection_initializer = true:warning -dotnet_style_explicit_tuple_names = true:warning -dotnet_style_prefer_inferred_tuple_names = true:warning -dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning -dotnet_style_prefer_auto_properties = true:warning -dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion -dotnet_diagnostic.IDE0045.severity = suggestion -dotnet_style_prefer_conditional_expression_over_return = false:suggestion -dotnet_diagnostic.IDE0046.severity = suggestion -dotnet_style_prefer_compound_assignment = true:warning -dotnet_style_prefer_simplified_interpolation = true:warning -dotnet_style_prefer_simplified_boolean_expressions = true:warning -# Null-checking preferences -dotnet_style_coalesce_expression = true:warning -dotnet_style_null_propagation = true:warning -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning -# File header preferences -# file_header_template = \n© PROJECT-AUTHOR\n -# If you use StyleCop, you'll need to disable SA1636: File header copyright text should match. -# dotnet_diagnostic.SA1636.severity = none -# Undocumented -dotnet_style_operator_placement_when_wrapping = end_of_line:warning -csharp_style_prefer_null_check_over_type_check = true:warning - -# C# Style Rules -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules#c-style-rules -[*.{cs,csx,cake}] -# 'var' preferences -csharp_style_var_for_built_in_types = true:warning -csharp_style_var_when_type_is_apparent = true:warning -csharp_style_var_elsewhere = true:warning -# Expression-bodied members -csharp_style_expression_bodied_methods = true:warning -csharp_style_expression_bodied_constructors = true:warning -csharp_style_expression_bodied_operators = true:warning -csharp_style_expression_bodied_properties = true:warning -csharp_style_expression_bodied_indexers = true:warning -csharp_style_expression_bodied_accessors = true:warning -csharp_style_expression_bodied_lambdas = true:warning -csharp_style_expression_bodied_local_functions = true:warning -# Pattern matching preferences -csharp_style_pattern_matching_over_is_with_cast_check = true:warning -csharp_style_pattern_matching_over_as_with_null_check = true:warning -csharp_style_prefer_switch_expression = true:warning -csharp_style_prefer_pattern_matching = true:warning -csharp_style_prefer_not_pattern = true:warning -# Expression-level preferences -csharp_style_inlined_variable_declaration = true:warning -csharp_prefer_simple_default_expression = true:warning -csharp_style_pattern_local_over_anonymous_function = true:warning -csharp_style_deconstructed_variable_declaration = true:warning -csharp_style_prefer_index_operator = true:warning -csharp_style_prefer_range_operator = true:warning -csharp_style_implicit_object_creation_when_type_is_apparent = true:warning -# "Null" checking preferences -csharp_style_throw_expression = true:warning -csharp_style_conditional_delegate_call = true:warning -# Code block preferences -csharp_prefer_braces = true:warning -csharp_prefer_simple_using_statement = true:suggestion -dotnet_diagnostic.IDE0063.severity = suggestion -# 'using' directive preferences -csharp_using_directive_placement = inside_namespace:warning -# Modifier preferences -csharp_prefer_static_local_function = true:warning - -# .NET Unnecessary code rules -[*.{cs,csx,cake,vb,vbx}] -dotnet_code_quality_unused_parameters = all:warning -dotnet_remove_unnecessary_suppression_exclusions = none:warning - -# C# Unnecessary code rules -[*.{cs,csx,cake}] -csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion -dotnet_diagnostic.IDE0058.severity = suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -dotnet_diagnostic.IDE0059.severity = suggestion - -# .NET formatting rules -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#net-formatting-rules -[*.{cs,csx,cake,vb,vbx}] -# Organize using directives -dotnet_sort_system_directives_first = true -dotnet_separate_import_directive_groups = false -# Dotnet namespace options -dotnet_style_namespace_match_folder = true:suggestion -dotnet_diagnostic.IDE0130.severity = suggestion - -# C# formatting rules -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#c-formatting-rules -[*.{cs,csx,cake}] -# Newline options -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#new-line-options -csharp_new_line_before_open_brace = all -csharp_new_line_before_else = true -csharp_new_line_before_catch = true -csharp_new_line_before_finally = true -csharp_new_line_before_members_in_object_initializers = true -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_between_query_expression_clauses = true -# Indentation options -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#indentation-options -csharp_indent_case_contents = true -csharp_indent_switch_labels = true -csharp_indent_labels = no_change -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents_when_block = false -# Spacing options -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#spacing-options -csharp_space_after_cast = false -csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_between_parentheses = false -csharp_space_before_colon_in_inheritance_clause = true -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_around_binary_operators = before_and_after -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_declaration_name_and_open_parenthesis = false -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_after_comma = true -csharp_space_before_comma = false -csharp_space_after_dot = false -csharp_space_before_dot = false -csharp_space_after_semicolon_in_for_statement = true -csharp_space_before_semicolon_in_for_statement = false -csharp_space_around_declaration_statements = false -csharp_space_before_open_square_brackets = false -csharp_space_between_empty_square_brackets = false -csharp_space_between_square_brackets = false -# Wrap options -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#wrap-options -csharp_preserve_single_line_statements = false -csharp_preserve_single_line_blocks = true -# Namespace options -# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#namespace-options -csharp_style_namespace_declarations = file_scoped:warning - -[*.{cs,csx,cake,vb,vbx}] - -# camel_case_style - Define the camelCase style -dotnet_naming_style.camel_case_style.capitalization = camel_case -# pascal_case_style - Define the PascalCase style -dotnet_naming_style.pascal_case_style.capitalization = pascal_case -# first_upper_style - The first character must start with an upper-case character -dotnet_naming_style.first_upper_style.capitalization = first_word_upper -# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I' -dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case -dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I -# prefix_type_parameters_with_t_style - Generic Type Parameters must be PascalCase and the first character must be a 'T' -dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case -dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T -# disallowed_style - Anything that has this style applied is marked as disallowed -dotnet_naming_style.disallowed_style.capitalization = pascal_case -dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____ -dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____ -# internal_error_style - This style should never occur... if it does, it indicates a bug in file or in the parser using the file -dotnet_naming_style.internal_error_style.capitalization = pascal_case -dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____ -dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____ - -# All public/protected/protected_internal constant fields must be PascalCase -# https://docs.microsoft.com/dotnet/standard/design-guidelines/field -dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal -dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const -dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field -dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group -dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style -dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning - -# All public/protected/protected_internal static readonly fields must be PascalCase -# https://docs.microsoft.com/dotnet/standard/design-guidelines/field -dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal -dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly -dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field -dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group -dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style -dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning - -# No other public/protected/protected_internal fields are allowed -# https://docs.microsoft.com/dotnet/standard/design-guidelines/field -dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal -dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field -dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group -dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style -dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = error - -# All constant fields must be PascalCase -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1303.md -dotnet_naming_symbols.stylecop_constant_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private -dotnet_naming_symbols.stylecop_constant_fields_group.required_modifiers = const -dotnet_naming_symbols.stylecop_constant_fields_group.applicable_kinds = field -dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.symbols = stylecop_constant_fields_group -dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.style = pascal_case_style -dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.severity = warning - -# All static readonly fields must be PascalCase -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1311.md -dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private -dotnet_naming_symbols.stylecop_static_readonly_fields_group.required_modifiers = static, readonly -dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_kinds = field -dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.symbols = stylecop_static_readonly_fields_group -dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style -dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.severity = warning - -# No non-private instance fields are allowed -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1401.md -dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected -dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_kinds = field -dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.symbols = stylecop_fields_must_be_private_group -dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.style = disallowed_style -dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.severity = error - -# Private fields must be camelCase -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1306.md -dotnet_naming_symbols.stylecop_private_fields_group.applicable_accessibilities = private -dotnet_naming_symbols.stylecop_private_fields_group.applicable_kinds = field -dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.symbols = stylecop_private_fields_group -dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.style = camel_case_style -dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.severity = warning - -# Local variables must be camelCase -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1312.md -dotnet_naming_symbols.stylecop_local_fields_group.applicable_accessibilities = local -dotnet_naming_symbols.stylecop_local_fields_group.applicable_kinds = local -dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.symbols = stylecop_local_fields_group -dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.style = camel_case_style -dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.severity = silent - -# This rule should never fire. However, it's included for at least two purposes: -# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers. -# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#). -dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = * -dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field -dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group -dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style -dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error - -# All of the following must be PascalCase: -# - Namespaces -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md -# - Classes and Enumerations -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces -# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md -# - Delegates -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types -# - Constructors, Properties, Events, Methods -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members -dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property -dotnet_naming_rule.element_rule.symbols = element_group -dotnet_naming_rule.element_rule.style = pascal_case_style -dotnet_naming_rule.element_rule.severity = warning - -# Interfaces use PascalCase and are prefixed with uppercase 'I' -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces -dotnet_naming_symbols.interface_group.applicable_kinds = interface -dotnet_naming_rule.interface_rule.symbols = interface_group -dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style -dotnet_naming_rule.interface_rule.severity = warning - -# Generics Type Parameters use PascalCase and are prefixed with uppercase 'T' -# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces -dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter -dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group -dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style -dotnet_naming_rule.type_parameter_rule.severity = warning - -# Function parameters use camelCase -# https://docs.microsoft.com/dotnet/standard/design-guidelines/naming-parameters -dotnet_naming_symbols.parameters_group.applicable_kinds = parameter -dotnet_naming_rule.parameters_rule.symbols = parameters_group -dotnet_naming_rule.parameters_rule.style = camel_case_style -dotnet_naming_rule.parameters_rule.severity = warning diff --git a/.github/workflows/zsh-n.yml b/.github/workflows/zsh-n.yml new file mode 100644 index 0000000..3c0a053 --- /dev/null +++ b/.github/workflows/zsh-n.yml @@ -0,0 +1,57 @@ +--- +name: "✅ Zsh" +on: + push: + paths: + - "**/*.ch" + - "**/*.zsh" + - "tests/*" + - "share/*" + - "themes/*" + - "functions/*" + pull_request: + paths: + - "**/*.ch" + - "**/*.zsh" + - "tests/*" + - "share/*" + - "themes/*" + - "functions/*" + workflow_dispatch: {} + +jobs: + zsh-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v3 + - name: "⚡ Set matrix output" + id: set-matrix + run: | + MATRIX="$(find . -type d -name 'doc' -prune -o -type f \( -iname '*.zsh' -o -iname 'fast-*' \) -print | jq -ncR '{"include": [{"file": inputs}]}')" + echo "MATRIX=${MATRIX}" >&2 + echo "matrix=${MATRIX}" >> $GITHUB_OUTPUT + zsh-n: + runs-on: ubuntu-latest + needs: zsh-matrix + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.zsh-matrix.outputs.matrix) }} + steps: + - name: ⤵️ Check out code from GitHub + uses: actions/checkout@v3 + - name: "⚡ Install dependencies" + run: sudo apt update && sudo apt-get install -yq zsh + - name: "⚡ zsh -n: ${{ matrix.file }}" + env: + ZSH_FILE: ${{ matrix.file }} + run: | + zsh -n "${ZSH_FILE}" + - name: "⚡ zcompile ${{ matrix.file }}" + env: + ZSH_FILE: ${{ matrix.file }} + run: | + zsh -fc "zcompile ${ZSH_FILE}"; rc=$? + ls -al "${ZSH_FILE}.zwc"; exit "$rc" diff --git a/.github/workflows/zunit.yml b/.github/workflows/zunit.yml index 4c8304c..5f21877 100644 --- a/.github/workflows/zunit.yml +++ b/.github/workflows/zunit.yml @@ -4,9 +4,9 @@ name: 🛡️ ZUnit on: workflow_dispatch: push: - branches: ["main", "develop"] + branches: ["main", "next"] pull_request_target: - branches: ["main", "develop"] + branches: ["main", "next"] jobs: build-macos: diff --git a/.trunk/.gitignore b/.trunk/.gitignore index 507283d..cf2f254 100644 --- a/.trunk/.gitignore +++ b/.trunk/.gitignore @@ -1,3 +1,7 @@ *out *logs -external +*actions +*notifications +plugins +user_trunk.yaml +user.yaml diff --git a/.github/.markdownlint.yaml b/.trunk/configs/.markdownlint.yaml similarity index 94% rename from .github/.markdownlint.yaml rename to .trunk/configs/.markdownlint.yaml index 465a928..fb94039 100644 --- a/.github/.markdownlint.yaml +++ b/.trunk/configs/.markdownlint.yaml @@ -8,4 +8,3 @@ line_length: false spaces: false url: false whitespace: false -MD041: false diff --git a/.trunk/configs/.shellcheckrc b/.trunk/configs/.shellcheckrc new file mode 100644 index 0000000..8c7b1ad --- /dev/null +++ b/.trunk/configs/.shellcheckrc @@ -0,0 +1,7 @@ +enable=all +source-path=SCRIPTDIR +disable=SC2154 + +# If you're having issues with shellcheck following source, disable the errors via: +# disable=SC1090 +# disable=SC1091 diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index f256861..55bbe5e 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -1,25 +1,32 @@ version: 0.1 cli: - version: 0.15.1-beta -repo: - repo: - host: github.com - owner: z-shell - name: F-Sy-H + version: 1.3.1 +plugins: + sources: + - id: trunk + ref: v0.0.8 + uri: https://github.com/trunk-io/plugins lint: - linters: - - name: markdownlint - command: - [markdownlint, -q, --config, .github/.markdownlint.yaml, "${target}"] - direct_configs: [.github/.markdownlint.yaml] enabled: - - git-diff-check@SYSTEM - - actionlint@1.6.15 - - gitleaks@8.9.0 - - markdownlint@0.32.1 - - prettier@2.7.1 + - gitleaks@8.15.2 + - shellcheck@0.9.0 + - git-diff-check + - actionlint@1.6.22 - shfmt@3.5.0 + - markdownlint@0.32.2 + - oxipng@8.0.0 + - prettier@2.8.1 ignore: - linters: [ALL] paths: - "share/test/**" +runtimes: + enabled: + - go@1.18.3 + - node@18.12.1 +actions: + enabled: + - trunk-announce + - trunk-check-pre-push + - trunk-fmt-pre-commit + - trunk-upgrade-available diff --git a/.vscode/settings.json b/.vscode/settings.json index 5081fb3..dad4de1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,8 @@ { - "conventionalCommits.scopes": [ - "maintenance", - "workspace", - "general", - "theme" - ], - "markdownlint.config": { - "extends": ".github/.markdownlint.yaml" + "files.associations": { + "*za-*": "shellscript", + ".ch": "shellscript", + "fast-*": "shellscript", + ".fast-*": "shellscript" } } diff --git a/F-Sy-H.plugin.zsh b/F-Sy-H.plugin.zsh index 3acb789..74ba566 100644 --- a/F-Sy-H.plugin.zsh +++ b/F-Sy-H.plugin.zsh @@ -34,7 +34,7 @@ # the plugin directory (i.e. set ZERO parameter) # # Standardized $0 Handling -# https://z.digitalclouds.dev/community/zsh_plugin_standard#zero-handling +# https://wiki.zshell.dev/community/zsh_plugin_standard#zero-handling 0="${ZERO:-${${0:#$ZSH_ARGZERO}:-${(%):-%N}}}" 0="${${(M)0:#/*}:-$PWD/$0}" @@ -46,15 +46,15 @@ typeset -ga _FAST_MAIN_CACHE typeset -ga _FAST_COMPLEX_BRACKETS # Functions Directory -# https://z.digitalclouds.dev/community/zsh_plugin_standard#funtions-directory +# https://wiki.zshell.dev/community/zsh_plugin_standard#funtions-directory if [[ $PMSPEC != *f* ]]; then fpath+=( "${0:h}/functions" ) fi # Check if Zsh's cache directory exist. -if [[ -d $ZSH_CACHE_DIR ]]; then +if [[ -n ${ZI[CACHE_DIR]} ]]; then # Use Zsh's default cache directory. - typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${ZSH_CACHE_DIR}/fsh} + typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${ZI[CACHE_DIR]}/fsh} else # Use common values to set default working directory. typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/fsh} @@ -69,8 +69,7 @@ FAST_WORK_DIR=${~FAST_WORK_DIR} # Invokes each highlighter that needs updating. # This function is supposed to be called whenever the ZLE state changes. -_zsh_highlight() -{ +_zsh_highlight() { # Store the previous command return code to restore it whatever happens. local ret=$? @@ -81,8 +80,8 @@ _zsh_highlight() return $ret fi - emulate -LR zsh - setopt extendedglob warncreateglobal typesetsilent noshortloops + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local REPLY # don't leak $REPLY into global scope local -a reply @@ -202,16 +201,14 @@ _zsh_highlight_apply_zle_highlight() { # Whether the command line buffer has been modified or not. # # Returns 0 if the buffer has changed since _zsh_highlight was last called. -_zsh_highlight_buffer_modified() -{ +_zsh_highlight_buffer_modified() { [[ "${_ZSH_HIGHLIGHT_PRIOR_BUFFER:-}" != "$BUFFER" ]] || [[ "$REGION_ACTIVE" != "$_ZSH_HIGHLIGHT_PRIOR_RACTIVE" ]] || { _zsh_highlight_cursor_moved && [[ "$REGION_ACTIVE" = 1 || "$REGION_ACTIVE" = 2 ]] } } # Whether the cursor has moved or not. # # Returns 0 if the cursor has moved since _zsh_highlight was last called. -_zsh_highlight_cursor_moved() -{ +_zsh_highlight_cursor_moved() { [[ -n $CURSOR ]] && [[ -n ${_ZSH_HIGHLIGHT_PRIOR_CURSOR-} ]] && (($_ZSH_HIGHLIGHT_PRIOR_CURSOR != $CURSOR)) } @@ -221,8 +218,7 @@ _zsh_highlight_cursor_moved() # Helper for _zsh_highlight_bind_widgets # $1 is name of widget to call -_zsh_highlight_call_widget() -{ +_zsh_highlight_call_widget() { integer ret builtin zle "$@" ret=$? @@ -231,8 +227,7 @@ _zsh_highlight_call_widget() } # Rebind all ZLE widgets to make them invoke _zsh_highlights. -_zsh_highlight_bind_widgets() -{ +_zsh_highlight_bind_widgets() { setopt localoptions noksharrays local -F2 SECONDS local prefix=orig-s${SECONDS/./}-r$(( RANDOM % 1000 )) # unique each time, in case we're sourced more than once @@ -307,8 +302,7 @@ _zsh_highlight_bind_widgets || { } # Reset scratch variables when commandline is done. -_zsh_highlight_preexec_hook() -{ +_zsh_highlight_preexec_hook() { typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER= typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=0 typeset -ga _FAST_MAIN_CACHE @@ -331,7 +325,7 @@ zmodload zsh/parameter 2>/dev/null zmodload zsh/system 2>/dev/null autoload -Uz -- is-at-least fast-theme \ - .fast-read-ini-file .fast-run-git-command \ + _fast-theme .fast-read-ini-file .fast-run-git-command \ .fast-make-targets .fast-run-command .fast-zts-read-all autoload -Uz -- →chroma/-git.ch →chroma/-hub.ch →chroma/-lab.ch →chroma/-example.ch \ @@ -344,8 +338,8 @@ autoload -Uz -- →chroma/-git.ch →chroma/-hub.ch →chroma/-lab.ch →chroma/ →chroma/-precommand.ch →chroma/-subversion.ch →chroma/-ionice.ch \ →chroma/-nice.ch →chroma/main-chroma.ch →chroma/-ogit.ch →chroma/-zi.ch -source "${0:h}/fast-highlight" -source "${0:h}/fast-string-highlight" +source "${0:h}/functions/fast-highlight" +source "${0:h}/functions/fast-string-highlight" local __fsyh_theme zstyle -s :plugin:fast-syntax-highlighting theme __fsyh_theme @@ -367,8 +361,6 @@ zstyle -s :plugin:fast-syntax-highlighting theme __fsyh_theme unset __fsyh_theme -alias fsh-alias=fast-theme - -fast-highlight-fill-option-variables if [[ ! -e $FAST_WORK_DIR/secondary_theme.zsh ]] { if { type curl &>/dev/null } { @@ -383,9 +375,9 @@ if [[ ! -e $FAST_WORK_DIR/secondary_theme.zsh ]] { touch "$FAST_WORK_DIR/secondary_theme.zsh" } -if [[ $(uname -a) = (#i)*darwin* ]] { +if [[ $(uname -a) = (#i)*darwin* ]]; then typeset -gA FAST_HIGHLIGHT FAST_HIGHLIGHT[chroma-man]= -} +fi [[ $COLORTERM == (24bit|truecolor) || ${terminfo[colors]} -eq 16777216 ]] || zmodload zsh/nearcolor &>/dev/null || true diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6274b14..ac7d048 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -29,7 +29,7 @@ set_fast_theme() { If you have set theme before an update of styles (e.g. recent addition of bracket highlighting) then please repeat `fast-theme {theme}` call to regenerate theme files. (**2018-08-09**: FSH -now has full user-theme support, refer to [appropriate section of README](#customization)). +now has full user-theme support, refer to [appropriate section of README](README.md#customization)). ## 2018-07-30 @@ -137,7 +137,7 @@ Assignments are no more one-colour default-white. When used in assignment, highl Math mode is highlighted – expressions `(( ... ))` and `$(( ... ))`. Empty variables are colorized as red. There are 3 style names (fields of -[FAST_HIGHLIGHT_STYLES](https://github.com/zdharma/fast-syntax-highlighting/blob/main/fast-highlight#L34) +[FAST_HIGHLIGHT_STYLES](https://github.com/zdharma/fast-syntax-highlighting/blob/main/functions/fast-highlight#L34) hash) for math-variable, number and empty variable (error): `mathvar`, `mathnum`, `matherr`. You can set them (like the animation below shows) to change colors. diff --git a/docs/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md deleted file mode 100644 index 8b9cefc..0000000 --- a/docs/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,132 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or - advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email - address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -*team@zshell.dev*. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][mozilla coc]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][faq]. Translations are available -at [https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[mozilla coc]: https://github.com/mozilla/diversity -[faq]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md deleted file mode 100644 index 87ad095..0000000 --- a/docs/CONTRIBUTING.md +++ /dev/null @@ -1,29 +0,0 @@ -# Contributing - -This Project welcomes contributions, suggestions, and feedback. All contributions, suggestions, and feedback you submitted are accepted under the [Project's license](../LICENSE). - -You represent that if you do not own copyright in the code that you have the authority to submit it under the [Project's license](../LICENSE). All feedback, suggestions, or contributions are not confidential. - -[Should be further filled in by the project - including defining the requirements to reach maintainer status] - -The Project abides by the Organization's [code of conduct](CODE-OF-CONDUCT.md) and [trademark policy](TRADEMARKS.md). - -## Community membership - -### New contributors - -New contributors should be welcomed to the community by existing members, helped with PR workflow, and directed to relevant documentation and communication channels. - -### Member - -Members are continuously active contributors in the community. They can have issues and PRs assigned to them, and pre-submit tests are automatically run for their PRs. Members are expected to remain active contributors to the community. - -### Established community members - -Established community members are expected to demonstrate their adherence to the principles in this document. -Familiarity with project organization, roles, policies, procedures, conventions, etc., and technical and/or writing ability. -Role-specific expectations, responsibilities. - ---- - -Licensed under the [CC-BY 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/docs/GOVERNANCE.md b/docs/GOVERNANCE.md deleted file mode 100644 index 2a57933..0000000 --- a/docs/GOVERNANCE.md +++ /dev/null @@ -1,45 +0,0 @@ -# Governance Policy - -This document provides the governance policy for the Project. Maintainers agree to this policy and to abide by all Project polices, including the [code of conduct](CODE-OF-CONDUCT.md), [trademark policy](TRADEMARKS.md), and [antitrust policy](ANTITRUST.md) by adding their name to the [maintainers.md file](MAINTAINERS.md). - -## 1. Roles - -This project may include the following roles. Additional roles may be adopted and documented by the Project. - -**1.1. Maintainers**. Maintainers are responsible for organizing activities around developing, maintaining, and updating the Project. Maintainers are also responsible for determining consensus. This Project may add or remove Maintainers with the approval of the current Maintainers. - -**1.2. Contributors**. Contributors are those that have made contributions to the Project. - -## 2. Decisions - -**2.1. Consensus-Based Decision Making**. Projects make decisions through consensus of the Maintainers. While explicit agreement of all Maintainers is preferred, it is not required for consensus. Rather, the Maintainers will determine consensus based on their good faith consideration of a number of factors, including the dominant view of the Contributors and nature of support and objections. The Maintainers will document evidence of consensus in accordance with these requirements. - -**2.2. Appeal Process**. Decisions may be appealed by opening an issue and that appeal will be considered by the Maintainers in good faith, who will respond in writing within a reasonable time. If the Maintainers deny the appeal, the appeal my be brought before the Organization Steering Committee, who will also respond in writing in a reasonable time. - -## 3. How We Work - -**3.1. Openness**. Participation is open to anyone who is directly and materially affected by the activity in question. There shall be no undue financial barriers to participation. - -**3.2. Balance**. The development process should balance the interests of Contributors and other stakeholders. Contributors from diverse interest categories shall be sought with the objective of achieving balance. - -**3.3. Coordination and Harmonization**. Good faith efforts shall be made to resolve potential conflicts or incompatibility between releases in this Project. - -**3.4. Consideration of Views and Objections**. Prompt consideration shall be given to the written views and objections of all Contributors. - -**3.5. Written procedures**. This governance document and other materials documenting this project's development process shall be available to any interested person. - -## 4. No Confidentiality - -Information disclosed in connection with any Project activity, including but not limited to meetings, contributions, and submissions, is not confidential, regardless of any markings or statements to the contrary. - -## 5. Trademarks - -Any names, trademarks, logos, or goodwill developed by and associated with the Project (the "Marks") are controlled by the Organization. Maintainers may only use these Marks in accordance with the Organization's trademark policy. If a Maintainer resigns or is removed, any rights the Maintainer may have in the Marks revert to the Organization. - -## 6. Amendments - -Amendments to this governance policy may be made by affirmative vote of 2/3 of all Maintainers, with approval by the Organization's Steering Committee. - ---- - -Licensed under the [CC-BY 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/docs/MAINTAINERS.md b/docs/MAINTAINERS.md deleted file mode 100644 index e1642bc..0000000 --- a/docs/MAINTAINERS.md +++ /dev/null @@ -1,11 +0,0 @@ -# Maintainers - -This document lists the Maintainers of the Project. Maintainers may be added once approved by the existing maintainers as described in the [Governance document](GOVERNANCE.md). By adding your name to this list you are agreeing to abide by the Project governance documents and to abide by all of the Organization's polices, including the [code of conduct](https://github.com/z-shell/.github/blob/main/governance/organization/CODE-OF-CONDUCT.md), [trademark policy](https://github.com/z-shell/.github/blob/main/governance/organization/TRADEMARKS.md), and [antitrust policy](https://github.com/z-shell/.github/blob/main/governance/organization/ANTITRUST.md). If you are participating because of your affiliation with another organization (designated below), you represent that you have the authority to bind that organization to these policies. - -| **NAME** | **Organization** | -| :---------------- | :--------------: | -| Salvydas Lukosius | Z-Shell | - ---- - -Licensed under the [CC-BY 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/docs/README.md b/docs/README.md index 6056232..fc755b1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -340,7 +340,7 @@ alt="image could not be loaded" style="color: red; background-color: black; font-weight: bold" /> -

The chromas that are enabled by default can be found here.

+

The chromas that are enabled by default can be found here.


Math-mode highlighting

diff --git a/docs/THEME_GUIDE.md b/docs/THEME_GUIDE.md index d411e14..db340cc 100644 --- a/docs/THEME_GUIDE.md +++ b/docs/THEME_GUIDE.md @@ -25,14 +25,15 @@ File name `overlay.ini` is treated specially. When specifing path, following short-hands can be used: -``` -XDG: = ~/.config/fsh (respects $XDG_CONFIG_HOME env var) +```ini +CONFIG: = ~/.config/fsh (respects $XDG_CONFIG_HOME env var) +CACHE: = ~/.cache/zi/fsh (respects $XDG_CACHE_HOME env var) LOCAL: = /usr/local/share/fsh/ HOME: = ~/.fsh/ OPT: = /opt/local/share/fsh/ ``` -So for example, issue `fast-theme XDG:overlay` to load `~/.config/fsh/overlay.ini` as overlay. The `.ini` +So for example, issue `fast-theme CONFIG:overlay` to load `~/.config/fsh/overlay.ini` as overlay. The `.ini` extension is optional. ## Secondary Theme @@ -71,6 +72,6 @@ load, in Zsh format, not INI) kept under specified location. This is handy if e. Fast-Syntax-Highlighting system-wide (e.g. from AUR on ArchLinux) and want to have per-user theme setup. -You can use "~" in the path, e.g. `FAST_WORK_DIR=~/.fsh` and also the `XDG:`, `LOCAL:`, `OPT:`, -etc. short-hands, so e.g. `FAST_WORK_DIR=XDG` or `FAST_WORK_DIR=XDG:` is allowed (in this case +You can use "~" in the path, e.g. `FAST_WORK_DIR=~/.fsh` and also the `CONFIG:`, `CACHE:`, `LOCAL:`, `OPT:`, +etc. short-hands, so e.g. `FAST_WORK_DIR=CONFIG` or `FAST_WORK_DIR=CONFIG:` is allowed (in this case it will be changed to `$HOME/.config/fsh` by default by F-Sy-H loader). diff --git a/docs/images/array-assign.png b/docs/images/array-assign.png index 9d35e90102a014df0c5ad488b6b59f85d3170b98..bae5cffc6b395fbbf62c2d91c7bbe1c63e8eaf8a 100644 GIT binary patch delta 1146 zcmV-=1cm$N50wnCs{wxmR7pfZRCwC$*}-ewHXH|V`Q`uE!G|1r35NADbP2_$@E8nT ziVFjeVaPBAr69^oK!JH+%7gl#g9q;B;t(@a%)I*GVXE7phr;`hYWX#>lR#}N^o6AQ z91=hDES`S;N>BC!ilQirq9}@@D2k#eilW>_i#OWh5ZrItGi`t8jiv!*n#Gy6^PjfZ z19KslhM|viFpq9xx{8w|W-DyLIVVDg(2zy#sZkiX2!dH2iDB;irGhbm=69KR1ZFX9 zFRgf|CJ;;q?V#??%Co#`#8Kv3Q_sZ-=e#QNEX(?HXZf*9#&e*2)?Qbp0L+3Tk%&5F zOhlu?b7EmwG-iLE0XAS*aL!BD0F&stK6v404d=P7&s-X#ZW`!d3zmMAmUY8Bb(wm@ zwb5|%I(Gmt@v7|JQe`31M_NaF))6h6IwDIjV9}(hGsl=*qfpdH1M@(~qmJ1gIINF_ z9Eju1dLzMMWf!R}%mmrN| z#&!ED9F)b3YR-#b`b-c7iZme0jcytXlO(dSfMMAUUv4k;cH(4s_~hu-*>A62e!maS z?LOGwf3Pd@fl0%8Ld=T`U-DM&!t-jzZF{;LX&vtw`65j8;;qQ%oX2?63PnV&sbhR) z3$}O)ZY6&f{f8{)Tv{CkA!95q!~|eVAVYiJ4g5PW>dA`_>(ll7KiA?fIegfqg1la@ zPsH&=hABXZXe};JAB&3fWKcYWgNOyl7;7Ex*%cFpxj@(~>6vv=KihGg%Ust+u&>V3 zt~!rzEfy{-yIAXBI>SkdR#`P&$bCm97KhVf@hyMJPuJ^T_Qj%c^zZxj_yzm@=3IT0k0QeCTp4`fE8b(mLL=;H3@c84`!fl=C{mv#YarJF#$9Ip;hQW07S0si+27 zO2*;ymceez-y)+Edp;06C zB_h%DaO2rFWj+EkE&kDV{?@=ux@i;7!tj zdGmwB!-i{`*qrpeQ_7s%Pm*2{2S{SZKkkP7GuRRXnkF=WEcu=xE;o0cQWkIT&<}D* zx&fgmhIF09QgMgIE6-%5m^uBEO{v+la{|5wi{R4_K=+nm`*~4pes&6M1Kfai(iZFM z_+kCt57V${nx$+-5d=54I2Jc-_uPTDcm@$=H2?qr M07*qoM6N<$f;HPd`2YX_ delta 1615 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 B)sO%H delta 7727 zcmaiZWl&w+vTcF~f|ch>}WcP9k*4I9|F1$QU-P0n}j zJ-6Pgdar-Y)!n0ej!|>1S+)9_FIlL%>?QCr(^6H#Nkd+a&)Cj}+0ew!$duX5#{R`$ z<9Flxv$QdFGNf>`v9@*Oa}%KaR|emo^l^e2VM z(cRX`(2dE~k?Nl+|6NGT)Y15>rM;7-oh`-R!iGk6&Q1c9lz%(@kNvYzQ#Z^1w6b;l zH?KboS^h>?*qB*a{;3W81LXhf=2NtEGqu(bv$Qd_b^Oyrke7><|6hRrEApR~{|l-4 zA0#{H{|5fAz`ud~EPo07Aq4z4qkr`Jm-~-kf~fo~|0BL2>RSqHycaLtGD(YlQgvH6 z(w$Hs-XpmYI#tCWqke}?j9yqgeLP$l!Dt;MZj;9K4lE@`RTx-o@m97-evPD}brz|% z0I60=Q7+6{L?y)~D&MRrENZN=Tb4xtI4lV1ILt{Q^Ekb4?|A`wn9Z$NzDX#_0bPuL z1fATsPwYIlPuzp$(UJat*1v;bn4zo@qYwW#v!6CtE+;nZ)au8NA3TV$m{qhD0mB=# z#ojTE?OcdHDn)2thMTSifil5y#s#UF)RgvhZt&77l}kg`U@ zWWA0XzfXkl7{uXeUF9F7!ROW%19?@=W~4g)9sc7-!+T(K*+91Yx1H#;U6DYiFdg2h zM{;Ijkj)D*4-XeZE=;t#`frOv5=C1_y5L|(64YB~9a17Bo0yzjM>6OZGVJg`+QZxK>+M9z)n>l9 zJNr_M%n#8cYo+i6d2I}?6RKt>#!c)9wbI;s({ZjkWO@!)- z1;yKm88jQgIeY~MEz02#)yg0rr9O4$@Xod$8Q;I)bNa8~dw7$aWlI#W-XtHzdRq^9 zd4!A1JKwHN-Pr2Tg0f>nLetBb(&{JI=!%e&ej^s`mII_KUny8dr4>TD4N|6z(!OD2 zzw;}-G&hO;mE3_sRK=#JLxw6h$x zHex3;%zE`=T6&d1a9v1WvcC;h9!@c~c$nu%%ex>tE?9ik^B*-vPR)k2TIa83D$ap0`YmJGhEh}SSO#)4Ufm`NUP9O zo|6kjgb{3)x0)b0(@iuUq3|2SpS~Z*1TT!X^ymZ6g*)fSbC`<-E8II1*R_%ewns5x zeBJFB%DO&KRc&bQ9rF03%ec8?siQaSQGuRGrV@~yE^y&~cGw#Zkxf}8f%sg)+w>xL zgo_qh4Rp#E9o;*0iBFGu2ZGQU2s~Fol0uhPPm9p|ap88Gl8-B;AaLh0i8mubWJOe` z>=d%}-Ez23B&@QrnLP4oq7?N5iakP6q)!7|S|s5VNh**Q0-a;K8STGOmm;#6M3@TL zIQyM9IJM4^9dF4bJ6W;oFDK@f=OAGj-t*#oeUC9zyCrx}JS#=>_}dFsKS|lo+2ybO zm~kSMEjv*&sw{*@;tqnFO*i~F2k~s}2>>HcxB6_=Wjco;+nzdzQ}5KzWnK=pb9xIB zJCi49u{46@K#ndbVM656C)MYeD{ek)lIa`KL0vZdb!K10RI+{!^=i8Ko3}o z0z5Iy2C;pzZLSKIlXBX7XVS)oC_Xas9<3f8Y;l01rY-DA^rD;~LM`Fo)bsLsn7Z3m zydd7bdGFA)^zI=dUeRFBx8?#u;878!U&5iy$}^nT5EYK~R^7I%#?l;Wi;0QjAJb)S z9WW#2@KI(JBwcvqy052NhGUMiaD4kd>Q`PYee=Agex7p<)S9~=B#lV_Wq0Mf^}<$a zr~3HuiC(78GD+>Jj`o1qD7IJb7siwm2RI4Y?mJw;)@O_Dv0Y&YYMQG&;H4{hQQla( zYwH$8CI#dB%)4~aR9EaQU!7prdaK>!GM%;$G+8Xh-8T5Gj3r3^i}wR*nF2zBX416= zw^KIXHbV_YuV-TOTJ^4ihf0ESo1=X;F_)|FFMbS#{?Imem?xjPSD7tz^PSUep>hwOBD zyxv@dT)={^qtNtibbJNIh;jkaf{us60?YFCa_yObbDI$knV+Wx49G~!l650#@^y|2}&8)S? zs1-3oePn^c(6?srs;K9UjA{Pe8zRv{_KGf@h|3aAl6+^TFY?SdPAONk!NZ4g3cOhy z^7oJ*r6=}E;_sn_K>6!OG^Tk*E(Mc_n%bVwYj*9-GstbN6PFJX_T{vO{q*@6JluP{ z-S7)}>|K8XUXf*kCF>&OhK@Yk`hF?P52}#2T8gc^ zl9^nm{#JQf!yvYG+;}9EB>y7KxHRUdilT=PM5of3o3g4abxb{-PxtvZG38()rz!}($p0PKd zwnx4u1X1U~7ocm|;T)O7(0nD|y6=*Ms7S6xus#mk)VfGZ=VI1`R4?1j?3Y$k;8==J zTS8f-oN;~uS|ho8{Wh--bOx%x&G-H7Yrdo-n6GEWd**UqUK2uX8=}b2tuyFY#~qR^ zC&LdNn^>SO98=H(Pti(R;W*@ei>SUB!neN!hxJ=bZ1hB+oEu;`LTmoMe1(V*0e4w8 z0pBJ;#P_(NafJ?J6|_)DX0)m1*8yD)&OSc3iVjae5frcsNff_1yNR@^4o7G$CS@ZO zyCzwh#xe0^;p|o9?C}315E$7Nx!+bas%CZhTWiylt1(F?-Mw6?crp6rSJjxqo9j^W z&+JqqIYjf*U6iBP$|vrKrWX}~%HVSTR80rRyTuKOg4!BNR4^-*kU>}+VyQ+FqgmkV zE<>R29bB4S>UPFWa!BL+;kBk6!dJJ=26Y$HdJy?MbiXPJVd}1TxepF3Cr^tS`XzGZ z0X=pBa|deqWr9Yy`E%9?%Fu{_)PT1qGt=rfsPD={A**?@_RF!~$h>LqA;gf#j5e&A zr<=Ej)=v@5=baVN2}+KRXa01=Ki_?RLdyg+(%<*Ooaw4euQ9p+WbUOzr9AB$P#PJ? zPh$TZcPeRe&F|%a22%OuB4#`ka7gc5Plf+|Xo}k$(UM9zC%lX&N)E(;u~kxbY-Tk zc>KeurBw+>6pu%BKxg41%u@<0iV`S{3@z{u=Ezr~XChT{%y!m9b8J!**!_&jG*y1_ z4ZcIBIym!=dP+7*^nQKsx#252J8Cqm7r&1c&cm78^%)-y9Sf6Z2uQ`gXEySg4bz6Rmq6`=o9pbso zDVTjIL@vhSe;Sw5GFXhTJh##D%X0y*yDq^iDTIRiNqe?oes_0tVN;&N2}M5%3v3G2Tiawc^S3qShXnCTUw5d zc^N!%KMl?-f@qa5`A16!onr8$%mp8-Nde6Ux|0nU&UqgV7KL zH+NKR?Z@(y0~4Do{TAysoDNfz*eGtEzPyeqZ9Y%ErBZ7=jrcRrXq)K3J2)cP*5}e- zJKkMfmb6LkZ81K}Fl8Od6J--;1dyZE9OT4iRb#U<+iCrvHYb@ytyeJU`M z`(vc`>MJr=Ar6n#C8hlM+(4p~%sODz8((>dB&fRk+r3Z#Ay>X}7WWDECY{OxRCiCr zjHyukJQyZbz|{qG_r9aQf=Nssp4$8}U~|{!#bZ1o-ck+%mnzD%#$|Kz{}DvdfGV>D z^C)2DT}o3&%{fELb&jlMND8^cRg3#SM;D6`w4}z$e=A#u7{ zty!44_?5WMnqOqK_w{>P?BrBhH##ylS#+AV&Z{~Jq}AsR#3@)Gcb|x#9EBk(z!DU~ zM3MaHP&`A~q^l}&dFaiYKFHdNnPDcV#c}`0*E32^IH;<19|=)Q;M(VMC(twf8VJ=j z(NG84=NJpn_$X?t#4SH?ixxupdB(!f9G1{lpR-;WfoQVOgwBqHug-LJ*r z;#?+YJ)<93ced9`LA##|ddK1ak}^cin90(QSF~_sQ(FQ|MK^pT17khQ7HSO7-(4n2 zJeHb~!yFMk3fz-%+L)Irl^uJMuUN0c&vo0b7{pi*JlCKH*#&XyQ3O&Q*8w}P-{+5r za=%t1)JQnhAYjpni~x;I`1$&HHWt3YUb5zq)P!5k547|m@3bN<+Zvon!nH`2fJHSp z@tebmKW&lI7YOT5l~2!d6yfb&_Me|D)Wv*yIBpxou@ar=y!`!(dl<`tE4!ts8cr8_ z|HGlWgq)1rqsvOmWf8+g{sMpv0xHT*l`4Elh^?%CW(3CZiHg}>tZ-S|Rdj*I$yi(M zuA95R4AE$XP%GXN6hGC*QYI2uE#vQus78v-yeYwRb^B`h(%hicdYNv7FA{$3;X#1Y zXj7+7bjUQT>FSN#yRQgiM@G@AYAqLL1>NT1u1)kNX3R$v*6XP;l2Kn0mEsX6TZ z)VFhBD3n%^NCU|hM$WstBmN}g2ezBJ6+>(6-p{7?Gh-ZlUyP0BE>2hZK{k6)Ipy=4 z&)I%PgfQPX2_2kpiSz);xDw530%E#P3X0NJR4kEhct}SzpC{@mm2aU+wUz$nC^ooa zJE4hMb3Hh3)l3q;T}Lso;`<4cQs`nOQiskm3QK0@Obz9@(PPazxdBteNe@A*5LU;l z6`eL^g!ESh&6oV1ofbXzZg5%BXeKwgnVY)gG}vz_AY*g}0doKgj!nq}2K7$F2(7-7 z4EApNK?Vg=jNqo=@&XtHz-U|iD$J3hF)0Ct0ID&W-#XDkWxmnHF=J;Jvni?toiluUP`Y` zZ`d8w)7+J znpp;SNW@HZvueRSUQeFQem6VrH?W5W45q4=pQfChJ93d=Ei~+TY*d!F13SvtuNEA2 zN!=Ugm#Jm2e{7>I+pC|j_&g6ZWyRpH^0z}em#BgL$7uxO?U!>6$UT#K~UuCDJ8+&b3w43tF_|J$m=Ur@CGVFGY`c)64qzgdS!4wq-# zPBgIPRSeniR?Wo=C&mAO;wY3O0a?skL4Yz3VkFpE!g<%XP9BJNH-VZy5^pgXPnKMD zOm3yjZ!oKH)BDaC?w~)Z75cDsr>l_Vim%X-l9PHkr>+~jH*H6Yi@QiCRfw2Mjx4=i z`f;g4P}OnKJUQ)y0#R+02|Wgf$C_O-Q3F=}FnYlNqRa;-Xa^kb&A44Cb&p4^U*|ngg1yk}_si?ER<{up$%nCaT^aoZZ!!tG_g-3^V@x-Eo+uGLE*GkrB_;47B=Ov z&UCPM4ibTA`BM+c=t1=pS57}NA45ztZ}1M<<>A|RhhmqFM@I^3K=BxmCCrQ9cxRel z;7|gfC0Vl}`<@;Ws@`2<-X+()(O~Vhqq8~?lZq;D)lSzxQ=}f{4pg?DEhzFyrEiZn zAltnE^Si&k$`wm(hHzbhl2JN4Lcb-EV&Nnptyz;hJv7MsT2Aq4=h#qTL0OS!fGkFM zhocmAxcMPo9Z@GSU+eETs}yT@%7vQK{iv*6W7AL7#8C;ZBO`25SxE^Qb{)n~ySy#J zY3E#*ckUHKN*MKCI923{W57I02izZ$pKYC&tSRP3jSVB2NcZ$`QuC zX{ha$&>-0GS^gQzT#$c?W5G6yVVFi0KTBauNTT=sDJjkl5J5NSWZpAnRS{n?81;23 zyKlBCRVC8N;6E0XkesWPR9=Oq4U@bd#we++Nz`DLxJy>l(`U5`tNcv4^Zvy5y`4VO znVRtP>XItH`Xt<*axO$#CYTj9cAT1Ed$|rP2_pGHp|4VhxbcVDB=ed1p`nn1?5C}& zM7#(e!Nz2AV9{X4HyAVfcMMJtqeLU1iu)Am^{kCWl9HfOc@{tQf*37&^cond%CSW> z0z0jqzKQ$@oC#=!YT37bAC1iY-c&3?A0SfE1hLo^!geu|{k{8C#~WP8KM#iKfTc_)3NC47iQ+w`LgjGN&ces1B`*<+|UxYx}4Y5R$+w^&>-rokBWrU`04fk g%V__PU}Wj~b5EcXn0e0{>+c9yS{y7^DPrLNUo;5P1^@s6 diff --git a/docs/images/cplx_cond.png b/docs/images/cplx_cond.png index 3c0d3ce13d5fc68b8dbc9c7850c0fbdccd7685c6..575629c63d30c018da45556a194c3e6bf0f6538c 100644 GIT binary patch delta 2157 zcmV-z2$J{Y8io{*Ba`6)6|p0L0e=WMNkl>3bhJD#*-xNVEBP>E3 z3f^|`u;$?0p<9!7)qoD{UGN(AHh6@xxszN87%<00jJrX@g&GXqtb;=xJK=%8yZ64i z*9-STC@d_?BB$;=lX-Ti^>M0WZFGMh9>O!<3=dDHpFDjgO@AN=f*=TjAb$vgAP9mW z2!eRquoU#PY$;_wPc;Bp645W;I>AsmJ6oY%DB3`}8<);8A|@huK5e#<9owoIQb%4`!a^7ayBPcRP-n zV%y~rZb?_>@#to`TCJ2UO@Ep10r!9w-X&W1(funJgBC33Oqs_}yb)^JzQ0}5r5f&e z7;>x+uw>%3$5Epf+nl%cm^_Bf#gV3y-wRErAh|aChsXKFXQC~9H+uv=2ai9^FMc1L z6FZI?#xz~iG^UxAKx<_lgHdug=bp=b`gJWf2Y#ixE38uFv6=?&lYjo-5%OghLl-Me zq5JiYc)Xy!;yCf>1%>W~*U^0|TDfuURMr>$(cGNx_m2ywMc`52q(paJ#`kD-SvEq@FhFhpEvVrb(F3#Nrt zPxMnzu=l#Fxiy#bh2EO~#NWwmM0@w+PlD~u4|B(F8NdHY^cOY{A^}Nt2QqD!dxM_C z`JiDb^H{3DgTT~T;Ew2roC*53f%D>=$oRWKe=W#w2YrTUoLZ3IlerST;c(usA|%)6 zyjRYMUd``%&3|&<$mE*??#DR@jAF;n>&2X5nC0M!YKD!0?qIkoSMk*rvN~RXC7wO2 zjiK(qfz8vxc)vY4^U3D)6y)muBzp`a4hDy(kL{=K%xpVc(61@;SXkiY-=ZK|u-8P3 zxF{FwyNL31aQ>_ur;d={NcGhirH=S5q=z3caPAZ|fPdxt;$4tINZ#hWRnP%gO}}dw z4U91J<~XeGl9^JlY4OD4k|7uPGQR5IP9JNI%*Rc4N$P|z^ho+gvxmaX%kb?)=vmr0 z=zh7582|+g-AH#~KgSn3LJDK6yKR2FnF285`~95m|DT^m$dR9dyV8BpU4Gu`6c_@m z0r#?;IyMY$1kBh5K^1dcM1+yoI&>gGvTF&@!e5iCOhH@05&v z*MB{Odt8Wqy(@$kpT2v@YN75|3lJh%{yF2S`{Aw8E$Kqme|#GB|2sV?Z&eo_{`PPo zb@aP4BL7bc`?k89H6e1VZ0MO%qsIf!*P=xkz7<%BF*S9r#?SyPzw_ zVRFn_#G%!LccjxSKvHVEoV)dc$pAf9?tk08VBODjIrqBtoS`vIx2hd+t7@{{>fZjN zGEa<#%T0V6Y+e4{#7PY!R=R!?w$;9P{F6SGo0-WCbMEoE(XHy-#)p%Tx2jw7^L{vL z|C>FGgs_6tTAiyY)O$R{saY9eiCx!}`AfM4Jdmxm<3pS1vqgpOpCP0hogamWy?Y

NTXh*3rpU+mYf8c24m*Z2A72csRIU6% zDZ^fzkMqS(j#2Ko{br@!5qtM?2E@x@hE=IpOp(9Ws=N>A`AW}rT-R<@@*oI;AP9mW z2!bF8f*=TjAPC~!feLTD4om}MZ|vgB#uPdIrED8ic;gicZzP|8D)`3o<$qlA`4?|& zyU3-qDyPC55mb2NRSIt;pa0RKI9$?^eEtktT3li6<4|iwPK7r@sPIPIHzMEo{8Li* z#Pg3x!4+Doaw@zLLWMWtbbr(H4|V^tjBiKt?;{&C|HQge;SDOhkwEuE^AB_vZKa3{ z6|8eH|D#ZoTz4wGL4`LG=zpGI{!;gUSpcG~{8ei&b*I7`RCptS?n&k!>K^^Kp^kNq zuZnxAI~Crb!W#*6Pcr}g(47izP~nXvx+kCil{`YsU~f~{OWmpP1{K~&qI>fB4{e;y zU?zuESDZ70z0{owZ&2Zl1iB}gf1taID{c7_Tr6df5Eg2!$f@uK6<*#*pnJ0UOIXsE zkpBl98+LG!xzJjbQ{fFNyzw3s-Z(F=ZAG>Wdr>~#7vF~pZ@dmvc;nXz72Y5Sf*=Tj jAP9mW2!bF8;@#$FB)@)+Csjpu00000NkvXXu0mjfVp2pD delta 3024 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 delta 7380 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 X^{^hW)EncV00000NkvXXu0mjf368bd diff --git a/docs/images/for-loop-cmp.png b/docs/images/for-loop-cmp.png index f0284b8d7fe478a8fc3d7803f5ffd22eb739fce7..8ebc2591e1a0897d9ccf3196b0514e8bf0b7a512 100644 GIT binary patch delta 6323 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 delta 7677 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 diff --git a/docs/images/for-loop.png b/docs/images/for-loop.png index 7f779ac111431e2d0b6c692ff742c03a640da15e..0b661e54c7dea11df26bd1a56a9f1f4c456b1fcf 100644 GIT binary patch delta 2151 zcmV-t2$=Wb7y1*hs{wxqIY~r8RCwC$o6l<_=NZS}s(*k_y9Xb%Fi^+HWbtf9O?NY8 z(F!G~j;e0*>L6t1pb0x6LR6LyL)U{q1Cp^(Z6ek}Xke^b)mtyoLB-3&2&+5P2QP+Q zP!73t54q&fLob11N)O7+#9qlivad%g30eDocn@QJHLu?1eP@5Z^S;kJ1_T0uKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZgfWKkFC;`|X{oRn6B#f}=DoqAd$U1| zYLiGZEyV*Eb&MFlc&}ocM{NY1?&tS|&zu-_z&Pjl*fM0NK)>MSrwFxBdB3O}Aha(G z&#rFX`M3>3FK2(QV^n*vVpBJ0h%81OGX6h1QvY!H-vv0vB;Lz0E^Qvc5xh|hgxb*m z6-FH>j9fvjoG=Iaf-_h^sI|VxgP}A1+wWoM=+`$es(k|anx<7(S&TY7*py@aKfgr( zGmC(EMvgrVFzTRiifSL-${F59=#X<> zBzeWm#y&zVqo~EY5OjAmm$*^h3j@INic+z@kl*y%Sp?5|e}JLyrZK8b=y z>?h3NV&+NNvW2pGfGoGdxC*91zm$?UQ%j1RGtPf}u`X{er8ZMW5hWL}@aD=!jm4V4 zErhw{oMP54zN*?KmC<2F-ZjpZ6A~vVs(C@@z-4*xQK)_Y!y-nt3l$L4X-SewbzN_k zd>D1uaL<0$t={2RB!rB@LDxvd8y0sFYHg%M&^KV!^pa{i8IMMVq?pdHNi43-C!&ze zX48Kbl9b-kOs|tVmK3R)A5@c32qST`23-?)DFNQfuly{Ha3garT#RU~b-7glOD(VZ<{~TPaqXIObU9R*ZU{crTm(tA2kPYWv=s$Edv`lr&>>S&VA$GDYZ2!C#tq zx9Y%rnpyumC0rj`ym;J;>xV{|G7tOM8&qUX*Y%P>^&XK0E#!@QR58#wCBLKV^{$E| zHN(5qWdHivEt`HMV$@-eARg-dmoRj6YtpXDrc2eWyhs5X@R>ASeI{do2a=ho2>gNj?x!`w!%P{%gH!##@r*C4^UWu0)ozcarc&7Yt zfeSB$y9*~mzo$31!Z7%F@i1SkDCW~h@J{u)H>jv#B6_p7nvBrBMg&+<({-(s?Ec6& zLw}q#>ZC1E>S_P@ zYDOAYw=!U0!Adb~dI!@R6bqBt!j5HGN!CW2rLBf>N}L7;XXaK7Ripq#pMnAyhP@IT zzFS@E%$_jno8sj2XWgo^62yPFO7Ct3_;u7m8(*HeMmsA^yj$V-DSmf5fl)_hB^cx+ zftUF1BFJ3OM);jQ!MhjldT@E=kD0`ck-F9y(aMMsQ-jZ9nkH^4ObPz;S}!Vy z=Ifnxw;h~}hh^M&SGht=On(iH{L}}3!l>iUJFM3mlOH1Va6JJC=OF#uGc#sR>WH~v zTV;I#K`JzLy;)5I!cRFLfN&nt&pqOFe`DP~^Y&Hi zf18MBoGJ$0)apv5C{YUfj}T!EvAB; d^-l<+&5wsRU(F7tpLPHM002ovPDHLkV1kn^Fg*YO delta 2642 zcmaJ@c{tnI8n%?FoiVMgNTZz?MWU8ggw{@wv4$#Q%ebgm5`>0dE0&H@`;<#5K@g#a zqFQ??wG*P2R)4~;2I7OC+dPfcfb$hqcju@`rJbB*9ALS zS%VA%L$DxCRSi`bSdSkB0wF@Ye}dZ@nfwVqJn4e}MIZ#hq0sQ~aMf^iRUk0L2dbv6 ztqp~phn_#La@eARkH8T;h$=X|!WWjmh>Wm!uMpoLf^Q%WbVTgo85l~?1%r>2{$5`$ ziY5B~BZb5N>FdxT^r!+=Q-wjla06d}h@&*z+LwsE=49j>fW_etMfB9QwGp2I|5N!# z@+;((uaK~>fnOE=1R|hE1`Z7Ye>wUxug~ejf$8xhpnnfvkAJ}nMdsi*PBb^twe^PB(rFr>*-@KHg^)D3}eu zZd(Ss^OQGG!ra*3UWv#LM_fo~cZW#|@{<4Gmg8#1icHGT(t2tXs{q}ERzKRSUUy+D zlt=M(*^w9tr7g+*Zh%kV9aVrASgVp??+&e+RrpS_&Zk*jR>_$FDIn)RV=a+x)usirYiQ3}+vSYXVwZymm(yG}{vW)XZFgM#$&TS}GNR5a> za^Ir2=1vpNH97A4h2xijW^qmP%DmoB((l5TC!h_E2;q*hn`y=ATk$h3OtWuEvwPyl zcON7bZ*@u0wWK#AU2QTcraGCY$D7`y*L0n4y#bAZ?9D#sY)Q2c`J*Fw`5n}lMe_$i z;FbcKosUB3FAA$#8*Z{KYaT_~IZP{>nj&3$jYC=BHWU?GqVx=iiq)Pc4f-_^(KElL zF?t6;Ax?9G@`}kORvK!*7yTq)EOqj3(~Ms#?L)wDA0%#XA^wc_YY1kYe@CWw z@63~n`y`vDT39S?fu`InSA3y1eG1NQ^8H5eeLgh~^1jv}iF(BxEkOud5S~3y9ByKJ z$eFK+yq>rHA%6)F2AcW(LrcV>5A)VW%L$n5cNXum$^M_ttn2O3TZwi!Y!Iup`vkO(5w66)g|=Z z8qbH@EGqP*P=&n2qhKzni`wI00uIoeblC3Rx}3g{LE0}r(`s*p zisZ*EZ9r^Mqv-}r6S;|5k0v(-AaTVF?m8*6l!=4q1w79A>npZbl2>}{rcduVFjHyenD8U#;sxD84jLb zB&nt=62PTg@>6V_v&Eg<3xlfqn+n3__j&}wx_9?j9(*6Wi)^xx zC!T+!eFtXGHtTd>`MEXx`-}Y!qU!o|t$L!m~q189gEn-(*pz)l<6t!&C_I(DNhOLA*=B8gZ3 zCeZ{js(cP5)#$U&5jk%2!PC988yzZDsuEi((DB5h9wuJLpjQbdW85%` zjWKlP8KEy`yEYzUw=^}Hgoe^;}>$*?bEu{ z7Zyv!mx{d{sebf~JhWPrLB?W=2?T}If2@Sh7h_2kGmzV;lqP85Vw6yX*%{4=i&w3& zt=}~`x9nAOru^{1fiLws!Cs{}i7}~pclcht+OoK7R#Z0ae$#lKWAgBv$8c#bLA&Rn z(Uv{!C3GO?H#B}06c%J$;&^L)Jhx>v(`ak6PMhguA7&O}?m%P&iv6I1kXd>Mww+ue?!= z3gUGfpZ(DLDyhPVNWEt%QN&9c9g;Pqn3+l@a6hd_o$Hz>EhpOu24{`Ttkn73kzJ@L zVHQR&`*KyTjE$(tZ-a3i8Mh|rn8LCs|LS|{j=IU*xbMc{Jqh(&cB`&T;M%N3o7l{` zc2`0{VQF=%g;?Y2A3*vKLszvao@}A<^OZhN<+`xgpcKT&nlr`X1aw^^GdNmTxc!zS zg)<#qBbA3i%R9B=2LfF}agO67ne*{TfcEq37=A2OxEU6y)G^=qSmDw0N#!(#YdYb| zgWF6*LH&)^U>@Up`Z&l&kOZCc*-&Av^V|8ter2U)>4bnzpojkB{3Tkj-j8;>2aPdB zgK_wWdJ*ggq!^bH-kkW*Do?46zE_tq2Or6oz-6^hbuy=A#pLXjM8drAl8C{@nxctf zw=_o~8qC}$Ld*o69Kv6nhl*p7q%?v;*!0 WEzAJRB0~1)muPN`GO99gkNFR@uiS$G diff --git a/docs/images/function.png b/docs/images/function.png index f09a08bb4b2c533139ef9401356ffd7d30faa515..b46b509328a91d67cab10f94480c344aca992bc2 100644 GIT binary patch delta 4772 zcmY*bbyU<{yQM=BMp95Z1|+3xBpgs$K|ll?K)QP*f09Fow4{W9^w1z72m>!A1Jcb% z4j`QaSHJgL>)w0*IL}(=oM-R->=Wx;iIngra3(F|)75ak#|Nlit3j1szMH{jEo$7? zxR2@p!r!zk5GgG{6A0}RW|CAM>6epBcF2z^g5pA>9wc&7R}+U3(F$-SxDwnUq6lYd z5zji~sb0!9TsZnHwWsxof%I0GZsDr{I8SSa>bzyaBUHnoxsWwDX+2{e3t!8a9(v!s z>?-|$67e?x4=9WIAa`r|=4Od0i}lC|1PG*WD9!grja=8VK96NYipYMyopvg}k>oo{ zKS7-^;2H$dUShkQ_TIqAH(ZlxbG$2#n)*4VDod-7N zE6tA$cZCp%LHSL}FtSsw+guu|v{NVB-g?tE8$%5=UGTvGx7VXNFXgbRt<7+ztaIs^ z5Mxf@D(i~EfpVOk%`jX*DU_WEEMd{Zy<37!;>P3#neiZDqGdMBLmz0!Z#79a5chOZ z@%wqtJ1dIolzY)uZCuH&1%2UP1` zDRxECNC;?Kp8nimL*?IRp1%D`r}_*SDrF@9#LNCbvGSS1LvzmYDdF0rS=G-*U)xet zgu+vtj`@vmmn<8rB+|2BYAg|5S01zt_2C&thyKCCUSlA~RiROW?&l87X#ww!9wkoH z;rjN9GnSFY{Y{)vgS7gC+RDEc7=T}6{rDRe7YMSHA}UI~`l|wTy!3@cWE`*T)iX*h z)-Mw4bBKH#D|+v&Ow401YyS z!LGV;h_Vk)2H~K+k-e0cUzEPpC1%v7d2=AjUyDtTG?!rv>){@s#e>>f3VSa>mcksUR^6FHaoL)fL-K7=EZ*aWRYsDlOP>UY&8Q?FbT` z_lPzSlz&cEyn}xcXeXB>ku7(puboV$s{VT=E}7t#6}qD&Jrbv^xsz$q>FeMQ#7WL2utFH^UMD^-3rFjJ{gsM_<)>)y09)gvYI#Hu%22V`**tq1m(t zGPDPpm32H`Lq84&CfKH|q}VP)pr$wsfk05Swv>BG;k4J(7hjVwmrMF5`%Tb-LZXjo z{OJNsj&+pzmAiVq8{u?jWh!p4ujgPP94VzBFU9NUcA>063FuiWLH->(exdNkk*{L>?HOQEHeTj4I`(~@@ zs<9>cTvbn+`0+UY#!w+yQ}wcgVO~0e#I)*mwZNeiBKHy3+a*p@ zufuIs^<>%oC_dafOIk#+^wjhENw$d2Z~c=)d;`?R@2);10gq&oo)0edj|)F%Jky+$ zNN%Gajosdqv2Zjp&IHBXPYZxPU1%k-0;VY;nt#p%!OrFiyZ%CRg!b>OkRQKwr-b_6 zF-lM}^}ksZ{wY|y3N2EZ*6R@0b5SrhD66p9;DFHwr;N++vbVpVWy^YR5{mc46MC}2 zE(SOuORP~6mLmdZ@g%K3Rtw2Vx0FaAN1zLMaWiJV$$ zgX1r@l0u$uNcIfk{PY$M^WYnru^A+{qNlGH^GANNdv zkg)pQPmo&m`By~mxk0tnITz&UM`R~!3xEV$O2`FUkGW}0SIL>zSOjKZ_-FX43df0E z@vD6j7N4d!jMaas>~1axLHbe>c(q1~W5~BipgZIOHV% z1Yu$6v}iv#v%lTl=%iCMRp`#c6XNpX5-o(}uL<8!&(Wm<#z#W^$m9nuPTaYIK%6HT z&t)`YR73UY#EjLelWX7UC;D<)Fl+e>4?iA-$jYfQyWJYgN}oNMlgs*e|3ZHJE=sAg z@~M{`J}E(`_y*U3o_OyoVX@h`vc-oUDjP$~c1kBg_tuDClz#k>Mt?pnCc`{^LzyB_ zHgYSrOV!XwqnXIj3@V1@|>DcgUZv-_74oSda$ z=R~(iR4*-7w$#39r%o>#l|;8q+OO*dM_7}6Gf_$X6+&kmT@b*?u}l4-Shfu;68jTu zpp;hGw}i)xh#h;l|?zfUEfyC>+z7Gs0T9ZS^2{aKbOP56HR0q0J~w)U7}@D8nDN8ZQf1yI4JP30E?v|I8y6qJ%dNX+jh@#{1q@cfd5ap3OxOKcI0+;N21FMxaNt!a9bv} z2!&Rnm#hooa{G3Qxnw`Zw6b~O@AOX1uKk(5k1aag8Q7|{>cjqCb6@d0m`{Y9D|hBJ zNR8<^Wg^I!C1FWAjB0EPgD>kYyc*~z%+sbz#WIVI8>e7TKVsP%%XaCG0q@~F?jV4T zqI=P0pQ`VTl?xKQNo|@R0=^p~k{`hlEW|A9xlxS>&Qs)#_;bURei#4L7W>+N(qe5< z)<)%#{@JPHyHEDCer|c&z1}hJ10qVP^Xuu{2 z8I0?cXN`@s%xgoTwyGQ8rdL~g9(`(=(yuL7Tj4Z2t0Fg7U)WV>=zfsW-H)jA^kD8D zW}HrkVVfUBq1qo?VKa>5CjLn7=+}wcf0r>9*SW$4hLLCa_tdyF1x6)qT8tPL`zm20 zp9uX(7d;sie7gNlQCcmabY5+5f%}p8S@}0a3 zxsyAa>FKmsL@ARHz8_>nSfyv{Y@;#fURP=2>zL+uvt}T;QpX91{PlHU1=BjX#;Dl) z!xb-xY}p!@G&3^q?!I|9a0k8G`Nz6Nr1W{*T-Yz-g-X-`TGSz~QOlScgQoE?C(riR zsPv3PJWAFc=zTGWJl=|LeYYMSS3jD`KWsfaY&oaXZ7l#>wMmYp3YH0~0Bld(Fh%VRvjEsMi4+@ZHc#!foGwCEyGLhTmiyLLOb{Kialx%J zNfk_bKmW0GNh`|`lKY`>`28-dT-bE4WVcbne1-~JOOBE!gi|{KzSCgOmH5!mZhBNP zMF>GtkDUxM@1B{#(cHc!$dBhr8^O^ z7pzpC-_PG>gieZabOlFj3B*M2w%rYFUU+WGGXZ%~Yr#1XUZO2;t>P%F!rAfyYB33W z_$8n3wKi9zI?&J!2UujZ}(!N+i8L2^WJU{r!R>jLAN(7NyTB~NS zDc}WMMs&=jx*{RD641IK8ii-}YEZ4t468R}wG!YO*06>zp&Py=qsK83)m&d7rnwAn zpPX)7HMyy9!I!-j%1&YQliIH~($WWndIN3i9lkBNjrDVP9mbUm0I||C>I7-Azn_0l z|K41RveI$w;NF_JzV>`NzSjPiK(L0@1*YVQQ-MxW#k4&P8!oWhxYCsK&lE%$Ai3?) z+xDc4kq&Q#qg@vlY3M$g$!{DHcdb20q#sL=j%!=3+T2iYw|}Nzqe0{5M%R zybnh>ddzUwv{uGqwDrq1yX=mlD4-o0G7JAQh%FFc=!i{aPo%p|t=L$az@eJ{E ze4&otag$g0t$;jwv&l|IR{IU8jjUu1{XN#QU4)Gqx9MO7SrbN7;^X~q6TV~OyJTbv zA3+YI2+|hzcF=DJfw!ZcXT5g&ph@N|f8k9`h{m42iSOkT=RE@p#!b2`|Ei6@W5g!D zh@0~EGv`smxqD#g^T)IOq-iWBzKzXCn!~7z+WMv=z;VhH?s^c=kVGW}X*zQD+DuuD z8|27TaMG5$ZSWU9cjpfjl~7xziLa`KL_j-nD+bMfF-Gd>R4FHYZtZ&Tt%x*jL952) z=50T0&luKyrcylLd2l~^VeoFpqqNyVL)U|$)qgRJqy0}2J{^+9*~G?KOPEYlKky$x zhHmzmObW;^b<#W7fAzHgt7kW+?es0RhEbL`z2jfH$BX|~VEDGey)4&v5-GhS@ak^? zkjQ@%%C%bu?){amv+^HGh%2kkUoZYt=gQ!E@PCcP!&{QQrXyX*_a}8G4ix+AxSEPK Kv{KnD_>+{qcOC@9+Ej{$8Iy?!BLL-{;(W&b{ZHd&>Seluo{0dmBlm3KDeHzi$Ep zh2H>ykWWFNeb8yU0s;j|gFvg!Adqq<2*mA|(`>GKN}vN9-PHx1oPBTGO4CxVaRVUw zKm(II^ovZ?EUXuZGgpN`Aga1>3+ur9E+K+`{&1)#%uO&b%+F2G)72FOx}8w@z^7_P zkoj;}G@J%->3+n{Q515*q)OfAi)u;VFSmWc;Oe@5IjwzWyxPT3q)S@XTweMfeHMeq zcz4eqX_*(bB%78JKp(>X+WQUu3<5&qCsPaSY9BktF#q^@;oHJDb2dj!S1&8K^7{y% z^fpL6HiRm@@}X*IJUd>}Sfe${r4KJY4#Go znYhg=?&~sWd(0b}@M|BvTGzmym~qN2zQ)@&8HNmo6LKh*zFc%4xt2<|E3?Ffw_Z!W zeZ}L+JOBPGH$JFAs`YFqbV?UdfyI3XP znui||C6Ja`6vy+?U$M)8>s-<{Dl;&mR|ZJ7dDMM`}|B_@;0 zCX!$Jh)Qy4Vfo8S%LA=6*5X|8pTV{NG%>^;FAuSREgmO^Zv_Ua7hnIDHP*jOK|5G_ zRv6k@s*6p@#!dnoY13dkla-t32X;{$kZaKV(HjH2;CJ}@7$@_|w`zK!t)=_yWiN?n ztgaC?vhML}9f`jvBgH{4m=?n+ly4pu%mjHXo=ioVhl70hb|<@=`}Q0gM=vGnjKB2} zlG`iJJ|+xQl}FgO)-inO5Aac_RoYPfkyK3RVB#i66#(co9|g~ZZt`d4UhPMiT5sXR z656_C)`Vd0u|Lc0?qbOpiDmL6Y8Ds5drBC=1{>QMlN1kQ1kJ9KK_8E7X76fRqV_gB zW$YV|uL?|+02KM8%CX`ROXS#NlbNIg? zgO1_sb!hT~O<&3?(L!a{SCr!Ny+1qj6Tr{b+7i(mU@>lW+(dfGsV?qlLxX&;0T*fe z-hHOFoL~1}0+w!8mg*9NyDvra?DHE>AbY`w4I!#Of=Sj^YuUGk3f*W;u3!Hu$b^|k zInf3qug)vZ$G}fm=9>;CV}{9YZ&x-t7H$FfSqk%CJa3b5+TKhcF}j!NtGH#LMCB;g zx8T725E`-Hq|ESBk}N?C}zVkAtepa#=-vhAz(os;=$mdFH4GA;Itt(Sg_ zquTD>GS;t+MhX*CDG0)$0nvB4qKBG?t2Y{>8B7NnOB#(J@LQJ!gfbfV&9$+}v z5FMavBR=^}5%rZ~0!!|5!fAkyB}E$OveidTKC?7FdM`$@n`)Cjs4kEAD@xCPeB#9Z z9X7uM>QiCXW|iLI?%YS~EXTdz_syv`_Hf$|Bv)-6z;V&mn8^6m3^Nh!&s6!3)+p zO{rv)0{hL673wrLWtBQ6N@}LI+Tg22*O{MgMvM1qhGH;0nM?0kgbJayyb>XAu`ak% z72NptczeslePJt_lt1awS}9g-hB4@hNKV=Qv6$^+88!=8!rqeL=qvAHsv0a82Sq{X zx!H%<#$~SA4yXLKa>SF>1-X{;EwTl^gu59A9M0Ueq;P61yV2xZEG~RfdeqVlfK+1W zWdfGWM_A9X*H9n+z%9`JT<#3OA0vE0CxeXu?=%&3Hr#OIcymT_zTRik*vY`d+JUjs zx4?gj2yn05x%ugCMoQl0Yki91uU;#Q><(6WUxz8ujB9`1rr3jUd~ahA!g3pCq6MBx zNAZ#S&Ciya#}z*#KdP-{KMtHCGSC^$d7x|u{R3Ya`R;jpt*xIbhh7v4mNQv~Q2y)6H?5kF{>8Ak=F3 zijwlH7;q&1`rRoQ2p5|ZSj%~VOg-HmNqe}oA4dNh)9_2JYr1{LXA|M;HLrmx?F7)y z2lkgFSTbW=9-~}Vqyu@RG`YNP4gKMa#P4I(Uw`_-#Tz8gceMp8f{>~%b2z#36oH8a zuyZr(VoptKMPkQ#Q>z}Hxoh|8>>`jo@2HJGe^u^{t_>50UAUD6t5B5tJ$yG`k?eNx z{upH?xx1mEG(s+@AR$p1%ZNn6u9@LMsnMt4HV>yur5i?%3nS$d`kP1CfKa0>J8 z^X&&sE8E-iqH5LFUP+`A6@Hu*%0(3jCR+&zHAWv&FQ;Wb`m~^rlJXE_Vqy6lYmJz$ zt#GId(bk>Wh=O%Y+RY`d9_!V=aosGZB~kGzpTD3LMEKMEWLHzwLqNxq)_=ugn%}+p z^b~DEgy!$tJK;j^OpQ#EopCsW-<1Nxdp`5)yTP5pCxl`LON!ru#zx2R;Q}D9*h>!9 zyV*ZdSfN$gK%#Py|BGZrOOE25CL`7`n5m~gBdJ&<`I&!zZ3zDI;0vm9rc$;~YN$q^ z)-h3M*80ekU>)hh-GKsyLQ?K&w`Hx`#E%lF=lBI8>5;T8Qi7x$Omzn=`SQZMU2Sh)<; zIxJ%MF`IY^k+~zkbD%`C%2-p4mfGou-1*N;tMinXAiGAVA@z83D{C8Vc2XsbE8jY> zVfL7^3&mNpyMrg$9#%%15-lSZD7SykuweHb)=a4%&0qRi4@{FmUcPFncFXJPK2DiB zp}fRPnOwFTqRXfpMnA^5p3%_91M;9A{@dGrwVu6?CK?MWK}h+86=sW;>Kv^=E|%0!CSkkYCVg|%zs(_uvq{Y#SC z0df1+P+=!2JG|HXs0RlbI}-b~v@Qe6!qA?a|FmH?C$^BKk)eEW(i%}>MjoA&L?&<_ z<%`8vMvHSUT%T6wI&=^HA=$e7bVUIl1vl}nCIM{>z|h8~1(pf~6(oxVd^2&ODAU{Wwe!VWK_p!PWw=>dn41vsaf z&Xe62e62Qe_lDe5Iv?<*+QQjVvf^LzkSe=FlONF#A0a|F`N56onc+c~3*Y(e)DT}1 zfNrWF@a}rn&vUm+O{??O+IU(qHXp?^XVVl@ID0kld;{cXDbbY# zR^q``_GpcB(rwj(8vT#@<>Geup7qx!mp%!W9JSFclKIG&#W=GvzgjvQL6De{yPsIpteNG7-N;9fb@rBLvbKMR3rjr_zc+h1$NifY z*UQRLJ*Qx-jY?c>fX!VinZY8c0n3C|Pl0Dy2gqiq#$&7h(2vwjB2>LOT>H`l|2f5k zHm^_)vs#k*7-{@HCK+JxVM-7B8SjFBL3mkm=^T0MyOIa5Saz?(uV=1*=ZV07@k zWDmwSyOpa(F0(Rea3@1X{@W@ZN9S63?VPqrbvvL*C{f~i3v*CJW@BXiMrNO)^<8A& zUTzXy$`;%8FJ(8Qr+SS#heBb);%X-x4NxCd{ST2k)tPfD6H=$cB7p$&JQ|@=lWeo1b$A?+dwo^NvJ05!XpXp-Z&&3gHwFnU3t;~K4ZYEX>5ia|O`q*Kx|Jrl#pYdIpmodVz=?DA>(lxNfowV( zi3h{7HLGie!t?6)=p2ItlHw$8dS%#z=aJePM_TttpN&;gbU&y-x2{s%z+c@{-`)y< z4-cz58;MQ#QcOF*Lbwi^yru)GeJr~SVZN}Wgg!5>1LB0rDRY1ln+)3NYwI>Q8R%+v z#PmA2VRt?NXRH`cSt;tzZTqbM_U%##5h8icn?jUpNQg|o5IR{xD_9Grfs~kPoZYB> z2t@LUt95G!Fi|Y!QCcjDt`}uU$e!7u0U-EtlUr{pPxxo!_Um1Q?HPagFkM7eKGhg7fKAeN!g;tQ(gd>!PINSGYg!p!WlQ*>`Fu$J&N?%Ofuz; z#qfh;aza%97Jn0^R=*QovQz$=?@f<*89Q|5bA_H0Z_;Uu-+=tSPfol9zsiq0^g8sXovX={O*J?U?&+zhG~{4Iz3$IfuG*LJfTG>U9SW)|sj zL1^Q47mhX#_pNkf#_V>V3PN3qdP0u9HnSJR0eOmqZL+f

b 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 bMfMK2^7Ifp#?2-C;U6**isDtG#=-vwi?^2C delta 12876 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 diff --git a/docs/images/global-alias.png b/docs/images/global-alias.png index 8722681cea5e22b2dfc100cee9a17d4f51e473c0..6c6c597ece14e68b1d4d1d73c8bc0e0446864627 100644 GIT binary patch delta 4599 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 delta 5119 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 M%Gyfh3O1qt2S@Y6Z~y=R diff --git a/docs/images/heredoc.png b/docs/images/heredoc.png index d88d55b3a80bd622ccd3c2a148f9b53a657dbe7c..7ab3b8e27f571b23438885b2e7fe6a64af27ff76 100644 GIT binary patch delta 4612 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 delta 4669 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 S^2mSZAvI+!r3wYBkpBUAnBt%S diff --git a/docs/images/herestring.png b/docs/images/herestring.png index 4cd871620bc5ebadce1bf16bb0175049185540bb..5db8cab489546cf058fff2768ca97f597ff529c8 100644 GIT binary patch delta 4642 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 delta 4695 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 LBh7lK^NarhEB3#q diff --git a/docs/images/highlight-less.png b/docs/images/highlight-less.png index 54bad7292d8713cdc6956edaec24ab28178cef14..9a638a7a9416953d2838e2bbdd99e277634c3d96 100644 GIT binary patch delta 3376 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 Sionm4+(6Grw_N*X)c*l>0-Nms diff --git a/docs/images/highlight-much.png b/docs/images/highlight-much.png index 73d483fcd8086b4c4fb0bc09794ad5de121f0592..0c935962bde9ab00b1207469d86dbae316f97521 100644 GIT binary patch delta 5297 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 jMg14N|E2yTaI|-LpF delta 5921 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 LOR@HmRoMRkn)xIT diff --git a/docs/images/ideal-string.png b/docs/images/ideal-string.png index d7d526da7a447ffb60501f15d03fac5dd8a31268..f6439869aacb1a79e97044a535e25558c004e587 100644 GIT binary patch delta 8039 zcmZvgbyQSc*!JmeBvcqWl$5Rkq#Fe34ha!y2ZlIEBOQ`5)X*T(2n;PL(lrRuFo1*% zA^Gt<&-ecGuJ`kuwifzS4(<2M&8!&Z-QXI`*fCO$Lz?pM=*8&{eu$uUAQpID^9{q9a;3@I5 zLvEossgLo$6974|OB4%6iswHf%7!EpKLC89@jJl1hVYI9rghf4qSo;sgeF zcmJ(3J=eokYWSwhr%E`4ur4!lVa^)3S!rcvWt@h)5Wxt#$wkCbY91FQ(9T( zO3a`S^ago?2mHxt1vI8eySBzn*$}bCQ}`pp!%9q^$so7qzdXqkZzXeTmwTe5DxDK7zj%^|e*Fj3#~$CS=o}~!cyTAhbo_T`Vn`|L z@L#xP`)GB#$8F=yB6-Zb04RC67*LVSzEXm^1o=PC??Cd6`A_m>S)2xVv|m|t3f$n> zw|ScwdK4tVjy}A;O4Fi9dVBXSrLiR3x=YTv4$Li zC}-PBY!qW+BD!lgEPN)|ViLRB^3L~BE$R56wvb`6YC9}Dnib3@g)sSb7|WIo-HYn( zzWzBOQkT2vqqNzDF~U(L@I`FiJd?$*qh|kM{Iku~)ACmp{PQ0wvc!D*WlsZBWn<@0 zQj6v^z-9LE#Z+ye?>0@ZW{>3g`^FL?K*k{NNC~RA8|h@k5{L1D+Tq=JwgF=Aa>sccKa8XCZKWlQ?PZ-`kIGS5u`lfP-X1DJD}*LQ)ehZeei zeYB0*jU%G@r>P~}LLGB7uC{66rm*c;R6AAc0JLz-RM#I9B&_^H+6CEcl&!`l`n23Mp*Fe$xZoR&50tJ-z5fbO$_1E+THR9UtT ztvz@OXgco9{>}7E`{a|wOu36AZDViY*KK^sy~e9DFiAZZ1O6#Gud6`3JVcZbDbV7M z0W`>DZ5u)X*9Y65o7bi7`#E_I#DWP3gONn1$RE$%EtKRvbL!`^?*9;i+^==EF;-Gf zMOzJD@N>=5&_R;XeRoYg5E1l7RjC~vz^7)8idTu3eKS_Gu%KpB#_OUxIq&10+uMkr zIoLQ#@BZ_2cRDplok@EoLhqHaG$jE(@SC+DVqsXK+hFGS1wr8OP50^Vz|_(>K>^*S zaQ(d(+;9x{rYU}Y*ba&~49oZU3_n!(p^sQz;( zkFV@pM{Y`SC|i)jdewDB-x3JG2!&3p4yCMVUOL~Bl*xA@)qnpb;%ZA{SIA*5N`Xx> zt$?Dt(0jc?%5>VUroutdvktLxrld-hGsU2^XZpVh9bMy^n^)w;1+l_)^EZd&$DT|t zb}YG+2jt}ovCBPoF8+=;`Iy%^q^pjhUywWP=gC$SS~(BC#DAw5UKf0M!qe@T&c%oQ2s^>-=nV%P-@@@dGdO3}NKqmR?sVq_ z{vfqmKL1UXc+#k6DW?^HYeN@KE~>C9@Y(5?6dkO4CSFFXbRq+o`@MD!gO^J&I5;K^ zuENe-#eM2<(hK-oXHy)rPYXLEPHyN^KxZNL?288YjJp%E@6$`M5yOfIb(%eLx5jNx ze5E0a5Ot3LXh8@f={?-3#;I$vfBiBvp0uUr8y}DF)1Z&VC-9lDgpDqff*msWwWoi0I!Viv)=Q$msmVGO%(gGXM)kNyQhYUHP1=zinxFw;BCkGjFMUL@xB$rucxOUshE-KhOIJz_=hC!;m!^U~Rdj`7Ie`t^ zF5H3V`?<{bX%QKY>tZj4hTI&uF{tUDakz;b3yJ*kY9bETB7>Krqxv|lnVv&6c=XA$ zPxBdWF;L}To3IoxqatD}4r7(t+5hP{_V;OQgg%dK?2<8HAxsP7&2MycNqcr&u%=G2r8Y|c#wc$wpqSJ5F`Qh(JqGjb|0Hm=yhGq^_n(V!D3J-%-SY9_XpXnsQI0=9Lk^Zr0 z`5cWghOUrIf^BI^WPgT7HQxl~y1Uzpp;qf6mze^^{wI|nHC+_u7qa^ zK3#mM6`jYqnh1U+O`>$t^2jD}8x>^t$SXkF#k}PzD|wl3(;P4)T3v++clp)Ro?#qZ zF?-^Y7;4}zuFg8NrNHQWpQKB_FnDJcu-t1qtnrGU+BK{R2 z3;rr}9+iafsEy$S8&c(=R-5G55n$kYCXnW+_4zv1WYCo+u4>{B zPd4y;j!b7)#SwuwCcVHgez%>Th}1U=40rrg;5OK#1;PO~|3jY4E&8h9S%4t|Qa4>< z#>wW`dA)9EGCH+pKo+2iuj;2SW`G%Rd{$f|m*$H9>S~K#U;)Q>P%!3;2&2}45;U7V z3B-%1SbGdpfXY|&8#&rR5@KO>mVr&oZXE1jODb0CR9{+ZuzXjtL+$c*YgE3#P!S5y zf!3mAHs8LR%LxoDHaCK@=V&97t=j13TOuY17|J_{Wx?Nus7xYTcgzBq!C&!n(c`cX zoeTB^vQy_g`4Q^(Rx=8Sc~?6^#j0g1BI1YgE?Zs)1y+@*G?VuDTF+TJ{*V9x#Pb_E zP?zS&URU#9!N0-=q9aJo9F{zGBNu^Rq)}~Ca$Qw!2R#iPbv0TWxpK~zVkC*usM@=2 znfehy*j(tRx-Y#QCqcb?iEj#JB8`X9kns4R29!9k2E|{=ZXX%sYzNpkJ2$SOk3GXGPY#OjSm5xFk+ZWTZ{p_r>{l#Pj(J-}F&Z zwF;NpC}u(ts-Vb|sC?LNTNf<-bz-ECrp?3MLYLp~(HkJ2NyPvp*O$z|3e_tdGZ+C{ zCJK6CZyqxGilfFRGOzsn_I9hRLW@fLC#7rwTy7?|XHppu^Q! z@xbwmT?fmVp@J*EG^1+h~H!V5IN$Mx#I`#kV&_fK@oeC#v*)oOg5`9hk{u{smA^*%> zTJ+vab_M-t)pdHIYKdl(s{CuCq3@phc^k~uc_&}39(Sp7U7<>nT5f`znAK^P)pN8< z_SzsEHFF<)0fviyVq58)o8W#Z7Ga3FeMBSa_db_p^MNpB0GIWsO`VXnWJJnjGKL1# zsSm~Jj;s7dQqapAEu*AIFy|r=( z4?o>cTzoc2n@gYh9si6iKX3N`dD1fDfM#yIcUe(2GT^`Q+uu zVHz3p_HoZ!nx1b!n!C}1{7DpqPYR8<6J%hSN#q&_#*c$SCWxz%%}8vX7= z-HbUjkj%WKS$5tr>j0cz@ICW!CR_DAUX_Fi3DvD`MfkLA_Re2=C_4+!5bx(T9F8uX z{xBvcdRh$sxHlWL$I@H74TUWENJQ-<9yx@M!J|+pjG4`VYKeH- zP#^F#(rL2j>I7EV8GpJP0H~288*GW>ByEGql69t~SAuL9fg=Kh&av8I7hz+dt`hyO zpU_MRxqYm$Qcv5ck3fj@)alivZdaxIphO%eSoieExBl2qs0Ww~+vv31Rrb5%x7=Og zrpCUGa<5G-w$Xe^dwQXMC{YxWqLia_UmkK_zUci^QmPEr;DgI15a zsat~{`4tdH4t!(Rkr2vOHDYX578U5*zuX=H|wA%++hj-)#upE&iJo+i390qheHQi-)uCxY75GfNobXl zwusi#oi!UPOnCTr$l}tOklZNcPfx&b=r7h2VKo3}$=}9bsJMuA>@VHfWKS7{E4xRM>dw`tKGLnlihvJ~= z9Y9HzBB5m|tk#sZhAVG)&$`8m%C%t{dlol}>v)-(5Hd=diOW4Sf4x8O&74C$3oSFV z*rC%N$!otS^?u3=Eb&w}B1NBPQnZgWV}Ea2o5^tre{#>C(!&FZHg(s;(ohLzjcuiy z?5*1J;_>42Gu3}Pr3hAc1;kX+B6u8TtMpevvVChe{c$%c-lqDTV1ZMk$289TbEzC3jehV)@9#Z8t^#CdL2vtidd+CJ{-RQhAsRqXB;uxG;P1+P4xWd3*p92@q-{| z!rOSJU&;PY>JW+^LOo_-~(#J$?1YGCz)To>qdldR%4z&-k&8hDrPE z8*>R?3hGQmc-_K#pCSoJ5H5=5@nc=4PaoVn`o+2Ug{{Q_bJpSPy%aSlXt&#Zu=UZy zJO;`OgoSSUOEXFH{Q8;zR>W&^C1gZj+8zd6)nQ|GrdgM7_%c({r*4wv3xVQo*Ms-^R;80gl!v}~Mvpj>y^cs@womTSmD+T7X-+f=e7Hez9Z{Qwodk*%ta{<^O5ccy zGg|prQWkYDt-~Z$7$d@&2Zn}#MhISk=Sy3LJchOJ46NBnEgLp`n#^uwMhhEMJm`3f3*K%lv|S6zdX$N=vPvfAO#N z^8^b_J5a#IH_DqF(^g~tyhg%pSJuCbniE6fk18$#iLvug=V+YDD@7s%mOMP-F^hCN565v_f(wfB+~lR9mf}IkZx^hFh1LG!tXTE!`aykxl>x{U?g@ zUeuz(n7>&Tv)6Xc?b(ip_(6c@ONcUw;f$f)vj?izUY97K&OMMgIg!}>P%3L zUHW50P!AdD9ox;3h~?Gfj3w}yq$GN!qAmm$mn=j4S)&-jcnKKYw*PJnw>p36Ikta} z1KqKIiw|yG2-ecYSR1_aYabWRU6DlleL_E4I_XZ%^FwKJ_%1C+4GkRdY;}5Z6kjxoxZRuAOJCk`wqj(w-fYPo9VK&z0s1z`VUd~7V#;(rzQ|F?M6zs1G9X2(9_BN&_C zl5A~uuxxN>f{Axlk2#6NAnvt)HlNoNDgW*@-QF1Qt<*^5qfVIcnn?Fm0#}!oH)+0g zco6$kv?rSd{ka5~CNmR6H$2~|xg>mm1(`>Lp*g9Lv z25`Zip1r6Z)Cz$=o1*LNSVRbj zL02xG$4;1vM>qd`YTRgh>9V)}^a^j^+iPdluoxIfC+sh4eqz2q+ZmznpW*AuNo z6#7D-lq$u~PqE?Qm5JE_#E38*TRP^48&M+}!>I*ieZS zp4ceuq|ZJHaxi_(U$jh=`Q3q2I$ZIuj}yU8_pyF_@YzB^L89(kW?`W(e=xZH#tLU{ zep)tjWq*=*>SfqHkGFUBOk;D?1$=`XcCtUYbzr%I?d~Kfl&k4FPCMI;D&0(4{`m#dBWPL46pF%R}O42-Y}nj`M@wv;JaZvcHW z40X}eGEHfpXg%j$JzwCf-rC%EE+v1%P%6{56*jZ9rm-sx)LrXfTeI<>;&%f(rB#Fa z0yyX+KjKU7-p7M+Bvseqk$bYTkzVT@bC%-o_>^>n2Ro2CUJEZ%>A{60& zdLj_JIW5;Iw4LFDzG9l`jVIMycV|541-WoN76Sy|OSGovQFO>gP1CFhTu z&FvFu|77;?gJ^=2`U4~(Y{0PgAi`ViZA9ZCNrOygBq5ls_1j^t5 delta 9064 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 NRF$+IS1MRX{2%s{kbnRH diff --git a/docs/images/in_string.png b/docs/images/in_string.png index c6ae217d5b00db8070ecbbee929154d906ee9f0e..c923173178ea1976553fef770cfa956f93cab68a 100644 GIT binary patch delta 4178 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 Y0eRxWu_4(JF8}}l07*qoM6N<$g5lJQ8UO$Q diff --git a/docs/images/theme.png b/docs/images/theme.png index 285e4e4ff8da9b8c027910febf3482f91ad15a4d..5b2012cb2a0018f9eed00b4ccb096d3c0f7bffc5 100644 GIT binary patch delta 34069 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

tEU^p`8C1>QGM=YmzPWM*lJG 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 diff --git a/docs/images/typeset.png b/docs/images/typeset.png index 06881fc069a9a4b928a22edd0e5f539a60c484aa..6c1745dcec0c551858a482092cff2fd530f2b922 100644 GIT binary patch delta 3894 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 Ef`qb)7XSbN delta 4405 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 delta 4480 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 mw^qjOQ!efO|Nk+V1+ud6Yw4?D6#gQo6 diff --git a/fast-string-highlight b/fast-string-highlight deleted file mode 100644 index ca579e0..0000000 --- a/fast-string-highlight +++ /dev/null @@ -1,80 +0,0 @@ -#---------------------------------------------------------------------------------------------------------------------- -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# vim: ft=zsh sw=2 ts=2 et -#---------------------------------------------------------------------------------------------------------------------- -# -# $1 - PREBUFFER -# $2 - BUFFER -# -function -fast-highlight-string-process { -emulate -L zsh -setopt extended_glob warn_create_global typeset_silent \ - no_short_loops rc_quotes no_auto_pushd - - local -A pos_to_level level_to_pos pair_map final_pairs - local input=$1$2 _mybuf=$1$2 __style __quoting - integer __idx=0 __pair_idx __level=0 __start __end - local -a match mbegin mend - - pair_map=( "(" ")" "{" "}" "[" "]" ) - - while [[ $_mybuf = (#b)([^"{}()[]\\\"'"]#)((["({[]})\"'"])|[\\](*))(*) ]]; do - if [[ -n ${match[4]} ]] { - __idx+=${mbegin[2]} - - [[ $__quoting = \' ]] && _mybuf=${match[4]} || { _mybuf=${match[4]:1}; (( ++ __idx )); } - } else { - __idx+=${mbegin[2]} - [[ -z $__quoting && -z ${_FAST_COMPLEX_BRACKETS[(r)$((__idx-${#PREBUFFER}-1))]} ]] && { - if [[ ${match[2]} = ["({["] ]]; then - pos_to_level[$__idx]=$(( ++__level )) - level_to_pos[$__level]=$__idx - elif [[ ${match[2]} = ["]})"] ]]; then - if (( __level > 0 )); then - __pair_idx=${level_to_pos[$__level]} - pos_to_level[$__idx]=$(( __level -- )) - [[ ${pair_map[${input[__pair_idx]}]} = ${input[__idx]} ]] && { - final_pairs[$__idx]=$__pair_idx - final_pairs[$__pair_idx]=$__idx - } - else - pos_to_level[$__idx]=-1 - fi - fi - } - - if [[ ${match[2]} = \" && $__quoting != \' ]] { - [[ $__quoting = '"' ]] && __quoting="" || __quoting='"'; - } - if [[ ${match[2]} = \' && $__quoting != \" ]] { - if [[ $__quoting = ("'"|"$'") ]] { - __quoting="" - } else { - if [[ $match[1] = *\$ ]] { - __quoting="\$'"; - } else { - __quoting="'"; - } - } - } - _mybuf=${match[5]} - } - done - - for __idx in ${(k)pos_to_level}; do - (( ${+final_pairs[$__idx]} )) && __style=${FAST_THEME_NAME}bracket-level-$(( ( (pos_to_level[$__idx]-1) % 3 ) + 1 )) || __style=${FAST_THEME_NAME}unknown-token - (( __start=__idx-${#PREBUFFER}-1, __end=__idx-${#PREBUFFER}, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") - done - - # If cursor is on a bracket, then highlight corresponding bracket, if any. - if [[ $WIDGET != zle-line-finish ]]; then - __idx=$(( CURSOR + 1 )) - if (( ${+pos_to_level[$__idx]} )) && (( ${+final_pairs[$__idx]} )); then - (( __start=final_pairs[$__idx]-${#PREBUFFER}-1, __end=final_pairs[$__idx]-${#PREBUFFER}, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") && \ - reply+=("$CURSOR $__idx ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") - fi - fi - return 0 -} diff --git a/functions/.fast-make-targets b/functions/.fast-make-targets index e2cbd32..934c80b 100644 --- a/functions/.fast-make-targets +++ b/functions/.fast-make-targets @@ -1,4 +1,6 @@ -# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# # Almost all code borrowed from Zshell's _make function # # Copyright (c) 2018 Sebastian Gniazdowski @@ -6,93 +8,90 @@ local -a TARGETS .make-expandVars() { - local open close var val front='' rest=$1 + local open close var val front='' rest=$1 - while [[ $rest == (#b)[^$]#($)* ]]; do - front=$front${rest[1,$mbegin[1]-1]} - rest=${rest[$mbegin[1],-1]} + while [[ $rest == (#b)[^$]#($)* ]]; do + front=$front${rest[1,$mbegin[1]-1]} + rest=${rest[$mbegin[1],-1]} + case $rest[2] in + ($) # '$$'. may not appear in target and variable's value + front=$front\$\$ + rest=${rest[3,-1]} + continue + ;; + (\() # Variable of the form $(foobar) + open='(' + close=')' + ;; + ({) # ${foobar} + open='{' + close='}' + ;; + ([[:alpha:]]) # $foobar. This is exactly $(f)oobar. + open='' + close='' + var=$rest[2] + ;; + (*) # bad parameter name + print -- $front$rest + return 1 + ;; + esac - case $rest[2] in - ($) # '$$'. may not appear in target and variable's value - front=$front\$\$ - rest=${rest[3,-1]} - continue - ;; - (\() # Variable of the form $(foobar) - open='(' - close=')' - ;; - ({) # ${foobar} - open='{' - close='}' - ;; - ([[:alpha:]]) # $foobar. This is exactly $(f)oobar. - open='' - close='' - var=$rest[2] - ;; - (*) # bad parameter name - print -- $front$rest - return 1 - ;; - esac + if [[ -n $open ]]; then + if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then + var=$match + else # unmatched () or {}, or bad parameter name + print -- $front$rest + return 1 + fi + fi - if [[ -n $open ]]; then - if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then - var=$match - else # unmatched () or {}, or bad parameter name - print -- $front$rest - return 1 - fi + val='' + if [[ -n ${VAR_ARGS[(i)$var]} ]]; then + val=${VAR_ARGS[$var]} + else + if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then + if [[ $parameters[$var] == scalar-export* ]]; then + val=${(P)var} + elif [[ -n ${VARIABLES[(i)$var]} ]]; then + val=${VARIABLES[$var]} fi - - val='' - if [[ -n ${VAR_ARGS[(i)$var]} ]]; then - val=${VAR_ARGS[$var]} - else - if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then - if [[ $parameters[$var] == scalar-export* ]]; then - val=${(P)var} - elif [[ -n ${VARIABLES[(i)$var]} ]]; then - val=${VARIABLES[$var]} - fi - else - if [[ -n ${VARIABLES[(i)$var]} ]]; then - val=${VARIABLES[$var]} - elif [[ $parameters[$var] == scalar-export* ]]; then - val=${(P)var} - fi - fi + else + if [[ -n ${VARIABLES[(i)$var]} ]]; then + val=${VARIABLES[$var]} + elif [[ $parameters[$var] == scalar-export* ]]; then + val=${(P)var} fi - rest=${rest//\$$open$var$close/$val} - done + fi + fi + rest=${rest//\$$open$var$close/$val} + done - print -- ${front}${rest} + print -- ${front}${rest} } .make-parseMakefile () { - local input var val target dep TAB=$'\t' tmp IFS= + local input var val target dep TAB=$'\t' tmp IFS= - while read input - do - case "$input " in - # TARGET: dependencies - # TARGET1 TARGET2 TARGET3: dependencies - ([[*?[:alnum:]$][^$TAB:=%]#:[^=]*) - target=$(.make-expandVars ${input%%:*}) - TARGETS+=( ${(z)target} ) - ;; - esac - done + while read input + do + case "$input " in + # TARGET: dependencies + # TARGET1 TARGET2 TARGET3: dependencies + ([[*?[:alnum:]$][^$TAB:=%]#:[^=]*) + target=$(.make-expandVars ${input%%:*}) + TARGETS+=( ${(z)target} ) + ;; + esac + done } if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then - .make-parseMakefile - FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS" - FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}" + .make-parseMakefile + FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS" + FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}" fi reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" ) - -# vim:ft=zsh:et diff --git a/functions/.fast-read-ini-file b/functions/.fast-read-ini-file index 2e57d10..71b6c23 100644 --- a/functions/.fast-read-ini-file +++ b/functions/.fast-read-ini-file @@ -1,3 +1,6 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# # Copyright (c) 2018 Sebastian Gniazdowski # # $1 - path to the ini file to parse @@ -14,17 +17,15 @@ local -a match mbegin mend [[ ! -r "$__ini_file" ]] && { builtin print -r "fast-syntax-highlighting: an ini file is unreadable ($__ini_file)"; return 1; } while read -r -t 1 __line; do - if [[ "$__line" = [[:blank:]]#\;* ]]; then - continue - elif [[ "$__line" = (#b)[[:blank:]]#\[([^\]]##)\][[:blank:]]# ]]; then - __cur_section="${match[1]}" - elif [[ "$__line" = (#b)[[:blank:]]#([^[:blank:]=]##)[[:blank:]]#[=][[:blank:]]#(*) ]]; then - match[2]="${match[2]%"${match[2]##*[! $'\t']}"}" # remove trailing whitespace - __access_string="${__out_hash}[${__key_prefix}<$__cur_section>_${match[1]}]" - : "${(P)__access_string::=${match[2]}}" - fi + if [[ "$__line" = [[:blank:]]#\;* ]]; then + continue + elif [[ "$__line" = (#b)[[:blank:]]#\[([^\]]##)\][[:blank:]]# ]]; then + __cur_section="${match[1]}" + elif [[ "$__line" = (#b)[[:blank:]]#([^[:blank:]=]##)[[:blank:]]#[=][[:blank:]]#(*) ]]; then + match[2]="${match[2]%"${match[2]##*[! $'\t']}"}" # remove trailing whitespace + __access_string="${__out_hash}[${__key_prefix}<$__cur_section>_${match[1]}]" + : "${(P)__access_string::=${match[2]}}" + fi done < "$__ini_file" return 0 - -# vim:ft=zsh:sw=4:sts=4:et diff --git a/functions/.fast-run-command b/functions/.fast-run-command index e251bcc..f0c6b91 100644 --- a/functions/.fast-run-command +++ b/functions/.fast-run-command @@ -1,4 +1,6 @@ -# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# # Copyright (c) 2018 Sebastian Gniazdowski # # FAST_HIGHLIGHT hash serves as container for variables that @@ -21,17 +23,14 @@ typeset -ga __lines_list local -a __response if [[ -z "${FAST_HIGHLIGHT[$2-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-cache-born-at] )) -gt ${4:-5} ]]; then - FAST_HIGHLIGHT[$2-cache-born-at]="$EPOCHSECONDS" - __response=( ${${(f)"$(command ${(Qz)1#+} 2>/dev/null)"}#${~3}} ) - [[ "$1" = "+"* ]] && __lines_list+=( "${__response[@]}" ) || __lines_list=( "${__response[@]}" ) - FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" + FAST_HIGHLIGHT[$2-cache-born-at]="$EPOCHSECONDS" + __response=( ${${(f)"$(command ${(Qz)1#+} 2>/dev/null)"}#${~3}} ) + [[ "$1" = "+"* ]] && __lines_list+=( "${__response[@]}" ) || __lines_list=( "${__response[@]}" ) + FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" else - # Quoted (s:;:) flag without @ will skip empty elements. It - # still produces array output, interesingly. All this is for - # the trailing ";" above, to skip last, empty element. - [[ "$1" = "+"* ]] && \ - __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \ - __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) + # Quoted (s:;:) flag without @ will skip empty elements. It + # still produces array output, interesingly. All this is for + # the trailing ";" above, to skip last, empty element. + [[ "$1" = "+"* ]] && \ + __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) fi - -# vim:ft=zsh:et:sw=4 diff --git a/functions/.fast-run-git-command b/functions/.fast-run-git-command index 4a42b97..55abca6 100644 --- a/functions/.fast-run-git-command +++ b/functions/.fast-run-git-command @@ -1,4 +1,6 @@ -# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# # Copyright (c) 2018 Sebastian Gniazdowski # # It runs given command, which in general will be a git command, @@ -27,34 +29,32 @@ typeset -ga __lines_list local -a __response if [[ $1 == --status ]] { - integer __status=1 - shift + integer __status=1 + shift } if [[ -z ${FAST_HIGHLIGHT[$2-cache]} || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-cache-born-at] )) -gt ${4:-5} ]]; then - FAST_HIGHLIGHT[$2-cache-born-at]=$EPOCHSECONDS - if [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" = true ]]; then - __response=( ${${(f)"$(command ${(Qz)${1#+}} 2>/dev/null)"}#$3} ) - integer retval=$? - if (( __status )) { - __response=( $retval ) - __lines_list=( $retval ) - } else { - [[ "$1" = "+"* ]] && \ - __lines_list+=( "${__response[@]}" ) || \ - __lines_list=( "${__response[@]}" ) - } - else - __lines_list=() - fi - FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" + FAST_HIGHLIGHT[$2-cache-born-at]=$EPOCHSECONDS + if [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" = true ]]; then + __response=( ${${(f)"$(command ${(Qz)${1#+}} 2>/dev/null)"}#$3} ) + integer retval=$? + if (( __status )) { + __response=( $retval ) + __lines_list=( $retval ) + } else { + [[ "$1" = "+"* ]] && \ + __lines_list+=( "${__response[@]}" ) || __lines_list=( "${__response[@]}" ) + } + else + __lines_list=() + fi + FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" else - # Quoted (s:;:) flag without @ will skip empty elements. It - # still produces array output, interesingly. All this is for - # the trailing ";" above, to skip last, empty element. - [[ "$1" = "+"* ]] && \ - __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \ - __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) + # Quoted (s:;:) flag without @ will skip empty elements. It + # still produces array output, interesingly. All this is for + # the trailing ";" above, to skip last, empty element. + [[ "$1" = "+"* ]] && __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \ + __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) fi -# vim:ft=zsh:et:sw=4 +return 0 diff --git a/functions/.fast-zts-read-all b/functions/.fast-zts-read-all index 96c52ab..1b1fd53 100644 --- a/functions/.fast-zts-read-all +++ b/functions/.fast-zts-read-all @@ -1,3 +1,6 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# # $1 - file-descriptor to be read from # $2 - name of output variable (default: REPLY) @@ -6,12 +9,10 @@ local -a __tmp integer __ret=1 __repeat=10 __tmp_size=0 while sysread -s 65535 -i "$__in_fd" '__tmp[__tmp_size + 1]'; do - (( ( __ret=$? ) == 0 )) && (( ++ __tmp_size )) - (( __ret == 5 )) && { __ret=0; (( --__repeat == 0 )) && break; } + (( ( __ret=$? ) == 0 )) && (( ++ __tmp_size )) + (( __ret == 5 )) && { __ret=0; (( --__repeat == 0 )) && break; } done : ${(P)__out_var::="${(j::)__tmp}"} return __ret - -# vim: ft=zsh:et:sw=4:sts=4 diff --git a/_fast-theme b/functions/_fast-theme old mode 100644 new mode 100755 similarity index 76% rename from _fast-theme rename to functions/_fast-theme index 14f2d08..2be95bd --- a/_fast-theme +++ b/functions/_fast-theme @@ -10,33 +10,35 @@ # Completion for theme-switching function, fast-theme, # part of z-shell/F-Sy-H, zdharma/fast-syntax-highlighting. # +builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} +builtin setopt extended_glob local_options warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd integer ret=1 -local -a arguments +typeset -a themes themes2 themes3 arguments expl +themes=( "$FAST_WORK_DIR"/themes/*.ini(:t:r) ) arguments=( - {-h,--help}'[display help text]' - {-l,--list}'[list available themes]' - {-r,--reset}'[unset any theme (revert to default highlighting)]' + {-w,--workdir}'[cd into $FAST_WORK_DIR (if not set, then into the plugin directory)]' {-R,--ov-reset}'[unset overlay, use styles only from main-theme (requires restart)]' - {-q,--quiet}'[no default messages]' + {-p,--palette}'[just print all 256 colors and exit (useful when creating a theme)]' + {-r,--reset}'[unset any theme (revert to default highlighting)]' + {-t,--test}'[test theme after setting it (show example code)]' {-s,--show}'[get and display the theme currently being set]' {-v,--verbose}'[more messages during operation]' - {-t,--test}'[test theme after setting it (show example code)]' - {-p,--palette}'[just print all 256 colors and exit (useful when creating a theme)]' - {-w,--workdir}'[cd into $FAST_WORK_DIR (if not set, then into the plugin directory)]' + {-i,--info}'[additional information]' + {-l,--list}'[list available themes]' + {-q,--quiet}'[no default messages]' + {-h,--help}'[display help text]' ) -typeset -a themes -themes=( "$FAST_WORK_DIR"/themes/*.ini(:t:r) ) - if [[ -d ${XDG_CONFIG_HOME:-$HOME/.config}/fsh ]]; then - typeset -a themes2 themes2=( "${XDG_CONFIG_HOME:-$HOME/.config}"/fsh/*.ini(:t:r) ) - themes+=( XDG:${^themes2[@]} ) + themes+=( CONFIG:${^themes2[@]} ) +elif [[ -d ${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh ]]; then + themes3=( "${XDG_CACHE_HOME:-$HOME/.cache}"/zi/fsh/*.ini(:t:r) ) + themes+=( CACHE:${^themes3[@]} ) fi - _wanted themes expl "Themes" compadd "$@" -a - themes && ret=0 _arguments -s $arguments && ret=0 diff --git a/fast-highlight b/functions/fast-highlight old mode 100644 new mode 100755 similarity index 96% rename from fast-highlight rename to functions/fast-highlight index fb5a0dc..17e68fa --- a/fast-highlight +++ b/functions/fast-highlight @@ -33,20 +33,22 @@ typeset -gA __fast_highlight_main__command_type_cache FAST_BLIST_PATTERNS typeset -g FAST_WORK_DIR + : ${FAST_WORK_DIR:=$FAST_BASE_DIR} FAST_WORK_DIR=${~FAST_WORK_DIR} + () { - # emulate -L zsh -o extendedglob - # Zsh < v5.0 do not support -o - emulate -L zsh - setopt extendedglob + # Emulate zsh options in the current shell. + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local -A map - map=( "XDG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" + map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" + "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" "LOCAL:" "/usr/local/share/fsh/" - "HOME:" "$HOME/.fsh/" - "OPT:" "/opt/local/share/fsh/" + "HOME:" "$HOME/.fsh/" + "OPT:" "/opt/local/share/fsh/" ) - FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(XDG|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} + FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(CONFIG|CACHE|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} } # Define default styles. You can set this after loading the plugin in @@ -248,7 +250,6 @@ FAST_HIGHLIGHT+=( chroma-asciinema →chroma/-subcommand.ch chroma-ipfs →chroma/-subcommand.ch chroma-zi →chroma/main-chroma.ch%zi - chroma-zinit →chroma/-zinit.ch chroma-aspell →chroma/-subcommand.ch chroma-bspc →chroma/-subcommand.ch chroma-cryptsetup →chroma/-subcommand.ch @@ -298,46 +299,44 @@ typeset -ga ZLAST_COMMANDS REPLY=$__fast_highlight_main__command_type_cache[(e)$1] [[ -z $REPLY ]] && { - if zmodload -e zsh/parameter; then - if (( $+aliases[(e)$1] )); then - REPLY=alias - elif (( ${+galiases[(e)$1]} )); then - REPLY="global alias" - elif (( $+functions[(e)$1] )); then - REPLY=function - elif (( $+builtins[(e)$1] )); then - REPLY=builtin - elif (( $+commands[(e)$1] )); then - REPLY=command - elif (( $+saliases[(e)${1##*.}] )); then - REPLY='suffix alias' - elif (( $reswords[(Ie)$1] )); then - REPLY=reserved - # zsh 5.2 and older have a bug whereby running 'type -w ./sudo' implicitly - # runs 'hash ./sudo=/usr/local/bin/./sudo' (assuming /usr/local/bin/sudo - # exists and is in $PATH). Avoid triggering the bug, at the expense of - # falling through to the $() below, incurring a fork. (Issue #354.) - # - # The second disjunct mimics the isrelative() C call from the zsh bug. - elif [[ $1 != */* || ${+ZSH_ARGZERO} = "1" ]] && ! builtin type -w -- $1 >/dev/null 2>&1; then - REPLY=none + if zmodload -e zsh/parameter; then + if (( $+aliases[(e)$1] )); then + REPLY=alias + elif (( ${+galiases[(e)$1]} )); then + REPLY="global alias" + elif (( $+functions[(e)$1] )); then + REPLY=function + elif (( $+builtins[(e)$1] )); then + REPLY=builtin + elif (( $+commands[(e)$1] )); then + REPLY=command + elif (( $+saliases[(e)${1##*.}] )); then + REPLY='suffix alias' + elif (( $reswords[(Ie)$1] )); then + REPLY=reserved + # zsh 5.2 and older have a bug whereby running 'type -w ./sudo' implicitly + # runs 'hash ./sudo=/usr/local/bin/./sudo' (assuming /usr/local/bin/sudo + # exists and is in $PATH). Avoid triggering the bug, at the expense of + # falling through to the $() below, incurring a fork. (Issue #354.) + # + # The second disjunct mimics the isrelative() C call from the zsh bug. + elif [[ $1 != */* || ${+ZSH_ARGZERO} = "1" ]] && ! builtin type -w -- $1 >/dev/null 2>&1; then + REPLY=none + fi fi - fi - [[ -z $REPLY ]] && REPLY="${$(LC_ALL=C builtin type -w -- $1 2>/dev/null)##*: }" + [[ -z $REPLY ]] && REPLY="${$(LC_ALL=C builtin type -w -- $1 2>/dev/null)##*: }" - [[ $REPLY = "none" ]] && { - [[ -n ${FAST_BLIST_PATTERNS[(k)${${(M)1:#/*}:-$PWD/$1}]} ]] || { - [[ -d $1 ]] && REPLY="dirpath" || { - for cdpath_dir in $cdpath; do - [[ -d $cdpath_dir/$1 ]] && { REPLY="dirpath"; break; } - done + [[ $REPLY = "none" ]] && { + [[ -n ${FAST_BLIST_PATTERNS[(k)${${(M)1:#/*}:-$PWD/$1}]} ]] || { + [[ -d $1 ]] && REPLY="dirpath" || { + for cdpath_dir in $cdpath; do + [[ -d $cdpath_dir/$1 ]] && { REPLY="dirpath"; break; } + done + } } } - } - - __fast_highlight_main__command_type_cache[(e)$1]=$REPLY - + __fast_highlight_main__command_type_cache[(e)$1]=$REPLY } } @@ -370,10 +369,9 @@ typeset -ga ZLAST_COMMANDS } # Main syntax highlighting function. --fast-highlight-process() -{ - emulate -L zsh - setopt extendedglob bareglobqual nonomatch typesetsilent +-fast-highlight-process() { + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt extended_glob warn_create_global bare_glob_qual no_nomatch typeset_silent [[ $CONTEXT == "select" ]] && return 0 @@ -459,8 +457,7 @@ typeset -ga ZLAST_COMMANDS # Processing buffer local proc_buf=$__buf needle - for __arg in ${interactive_comments-${(z)__buf}} \ - ${interactive_comments+${(zZ+c+)__buf}}; do + for __arg in ${interactive_comments-${(z)__buf}} ${interactive_comments+${(zZ+c+)__buf}}; do # Initialize $next_word to its default value? (( in_redirection = in_redirection > 0 ? in_redirection - 1 : in_redirection )); @@ -894,7 +891,7 @@ typeset -ga ZLAST_COMMANDS if [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]} ]]; then __idx=1 _mybuf=$FAST_THEME_NAME - FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(XDG|LOCAL|HOME|OPT):} + FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(CONFIG|CACHE|LOCAL|HOME|OPT):} (( ${+FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}default]} )) || source $FAST_WORK_DIR/secondary_theme.zsh else __idx=0 @@ -973,7 +970,7 @@ typeset -ga ZLAST_COMMANDS if [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]} ]]; then __idx=1 _mybuf=$FAST_THEME_NAME - FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(XDG|LOCAL|HOME|OPT):} + FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(CONFIG|CACHE|LOCAL|HOME|OPT):} (( ${+FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}default]} )) || source $FAST_WORK_DIR/secondary_theme.zsh else __idx=0 @@ -1246,7 +1243,7 @@ typeset -ga ZLAST_COMMANDS if [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]} ]]; then __idx=1 __tmp=$FAST_THEME_NAME - FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(XDG|LOCAL|HOME|OPT):} + FAST_THEME_NAME=${${${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}secondary]}:t:r}#(CONFIG|CACHE|LOCAL|HOME|OPT):} (( ${+FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}default]} )) || source $FAST_WORK_DIR/secondary_theme.zsh else __idx=0 @@ -1264,8 +1261,7 @@ typeset -ga ZLAST_COMMANDS return 0 } --fast-highlight-check-path() -{ +-fast-highlight-check-path() { (( _start_pos-__PBUFLEN >= 0 )) || \ { [[ $1 != "noasync" ]] && print -r -- "- $_start_pos $_end_pos"; return 1; } [[ $1 != "noasync" ]] && { @@ -1338,8 +1334,7 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler # backslash-something (not ['"$]) is occured. # # $1 - additional style to glue-in to added style --fast-highlight-string() -{ +-fast-highlight-string() { (( _start_pos-__PBUFLEN >= 0 )) || return 0 _mybuf=$__arg __idx=_start_pos @@ -1374,13 +1369,11 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler # - D matches words [a-zA-Z]## (variables) # # Parameters used: _mybuf, __idx, _end_idx, __style --fast-highlight-math-string() -{ +-fast-highlight-math-string() { (( _start_pos-__PBUFLEN >= 0 )) || return 0 _mybuf=$__arg __idx=_start_pos - # 7 while [[ $_mybuf = (#b)[^\$_a-zA-Z0-9]#((\$(#B)(+|)(#B)([a-zA-Z_:][a-zA-Z0-9_:]#|[0-9]##)(#b)(\[[^\]]##\])(#c0,1))|(\$[{](#B)(+|)(#b)(\([a-zA-Z0-9_:@%#]##\))(#c0,1)[a-zA-Z0-9_:#]##(\[[^\]]##\])(#c0,1)[}])|\$|[a-zA-Z_][a-zA-Z0-9_]#|[0-9]##)(*) ]]; do __idx+=${mbegin[1]}-1 _end_idx=__idx+${mend[1]}-${mbegin[1]}+1 @@ -1412,8 +1405,7 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler } # Highlight special chars inside dollar-quoted strings --fast-highlight-dollar-string() -{ +-fast-highlight-dollar-string() { (( _start_pos-__PBUFLEN >= 0 )) || return 0 local i j k __style local AA diff --git a/functions/fast-string-highlight b/functions/fast-string-highlight new file mode 100755 index 0000000..ff76b76 --- /dev/null +++ b/functions/fast-string-highlight @@ -0,0 +1,79 @@ +#---------------------------------------------------------------------------------------------------------------------- +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +#---------------------------------------------------------------------------------------------------------------------- +# +# $1 - PREBUFFER +# $2 - BUFFER +# +-fast-highlight-string-process() { + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd + + local -A pos_to_level level_to_pos pair_map final_pairs + local input=$1$2 _mybuf=$1$2 __style __quoting + integer __idx=0 __pair_idx __level=0 __start __end + local -a match mbegin mend + + pair_map=( "(" ")" "{" "}" "[" "]" ) + + while [[ $_mybuf = (#b)([^"{}()[]\\\"'"]#)((["({[]})\"'"])|[\\](*))(*) ]]; do + if [[ -n ${match[4]} ]] { + __idx+=${mbegin[2]} + [[ $__quoting = \' ]] && _mybuf=${match[4]} || { _mybuf=${match[4]:1}; (( ++ __idx )); } + } else { + __idx+=${mbegin[2]} + [[ -z $__quoting && -z ${_FAST_COMPLEX_BRACKETS[(r)$((__idx-${#PREBUFFER}-1))]} ]] && { + if [[ ${match[2]} = ["({["] ]]; then + pos_to_level[$__idx]=$(( ++__level )) + level_to_pos[$__level]=$__idx + elif [[ ${match[2]} = ["]})"] ]]; then + if (( __level > 0 )); then + __pair_idx=${level_to_pos[$__level]} + pos_to_level[$__idx]=$(( __level -- )) + [[ ${pair_map[${input[__pair_idx]}]} = ${input[__idx]} ]] && { + final_pairs[$__idx]=$__pair_idx + final_pairs[$__pair_idx]=$__idx + } + else + pos_to_level[$__idx]=-1 + fi + fi + } + if [[ ${match[2]} = \" && $__quoting != \' ]] { + [[ $__quoting = '"' ]] && __quoting="" || __quoting='"'; + } + if [[ ${match[2]} = \' && $__quoting != \" ]] { + if [[ $__quoting = ("'"|"$'") ]] { + __quoting="" + } else { + if [[ $match[1] = *\$ ]] { + __quoting="\$'"; + } else { + __quoting="'"; + } + } + } + _mybuf=${match[5]} + } + done + + for __idx in ${(k)pos_to_level}; do + (( ${+final_pairs[$__idx]} )) && \ + __style=${FAST_THEME_NAME}bracket-level-$(( ( (pos_to_level[$__idx]-1) % 3 ) + 1 )) || \ + __style=${FAST_THEME_NAME}unknown-token + (( __start=__idx-${#PREBUFFER}-1, __end=__idx-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + done + + # If cursor is on a bracket, then highlight corresponding bracket, if any. + if [[ $WIDGET != zle-line-finish ]]; then + __idx=$(( CURSOR + 1 )) + if (( ${+pos_to_level[$__idx]} )) && (( ${+final_pairs[$__idx]} )); then + (( __start=final_pairs[$__idx]-${#PREBUFFER}-1, __end=final_pairs[$__idx]-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") && \ + reply+=("$CURSOR $__idx ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}paired-bracket]}") + fi + fi + return 0 +} diff --git a/functions/fast-theme b/functions/fast-theme old mode 100644 new mode 100755 index af5c2ec..ff811cd --- a/functions/fast-theme +++ b/functions/fast-theme @@ -11,9 +11,10 @@ zmodload zsh/zutil 2>/dev/null # Standard Recommended Options -# https://z.digitalclouds.dev/community/zsh_plugin_standard/#standard-recommended-options -emulate -L zsh -setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd +# https://wiki.zshell.dev/community/zsh_plugin_standard/#standard-recommended-options + +builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} +builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd autoload colors; colors typeset -g FAST_WORK_DIR @@ -21,22 +22,23 @@ typeset -g FAST_WORK_DIR FAST_WORK_DIR=${~FAST_WORK_DIR} local -A map -map=( "XDG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" +map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" + "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" "LOCAL:" "/usr/local/share/fsh/" - "HOME:" "$HOME/.fsh/" - "OPT:" "/opt/local/share/fsh/" + "HOME:" "$HOME/.fsh/" + "OPT:" "/opt/local/share/fsh/" ) -FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(XDG|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} +FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(CONFIG|CACHE|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} -local OPT_HELP OPT_VERBOSE OPT_QUIET OPT_RESET OPT_LIST OPT_TEST OPT_SECONDARY OPT_SHOW OPT_COPY OPT_OV_RESET +local OPT_HELP OPT_INFO OPT_VERBOSE OPT_QUIET OPT_RESET OPT_LIST OPT_TEST OPT_SECONDARY OPT_SHOW OPT_COPY OPT_OV_RESET local OPT_PALETTE OPT_CDWD OPT_XCHG OPT_OV_XCHG local -A opthash -zparseopts -E -D -A opthash h -help v -verbose q -quiet r -reset l -list t -test -secondary \ -s -show -copy-shipped-theme: R -ov-reset p -palette w -workdir x -xchg y -ov-xchg || \ -{ echo "Improper options given, see help (-h/--help)"; return 1; } +zparseopts -E -D -A opthash h -help v -verbose q -quiet i -info r -reset l -list t -test -secondary s -show \ +-copy-shipped-theme: R -ov-reset p -palette w -workdir x -xchg y -ov-xchg || return 1 (( ${+opthash[-h]} + ${+opthash[--help]} )) && OPT_HELP="-h" +(( ${+opthash[-i]} + ${+opthash[--info]} )) && OPT_INFO="-i" (( ${+opthash[-v]} + ${+opthash[--verbose]} )) && OPT_VERBOSE="-v" (( ${+opthash[-q]} + ${+opthash[--quiet]} )) && OPT_QUIET="-q" (( ${+opthash[-r]} + ${+opthash[--reset]} )) && OPT_RESET="-r" @@ -54,12 +56,37 @@ s -show -copy-shipped-theme: R -ov-reset p -palette w -workdir x -xchg y -ov-xch local -a match mbegin mend local MATCH; integer MBEGIN MEND -[[ -n "$OPT_CDWD" ]] && { +if [[ -n "$OPT_CDWD" ]]; then builtin cd $FAST_WORK_DIR return 0 -} +fi + +if [[ -n "$OPT_INFO" ]]; then + print -r -- "The default ${fg[green]}fast-theme$reset_color command can be used to switch current and future sessions to a new different theme." + print -r -- "" + print -r -- "The theme path can use one of the shorthands below to point ~/.config/fsh/.ini." + print -r -- "If the INI file pointed in the path is \"*overlay*\", then it is not a full theme," + print -r -- "but an additional theme-snippet that overwrites only selected styles of the main theme." + print -r -- "" + print -r -- "${fg[yellow]}Shorthands$reset_color:" + print -r -- "" + print -r -- "CONFIG: = ${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" + print -r -- "CACHE: = ${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" + print -r -- "LOCAL: = /usr/local/share/fsh/" + print -r -- "HOME: = $HOME/.fsh/" + print -r -- "OPT: = /opt/local/share/fsh/" + print -r -- "" + print -r -- "${fg[yellow]}Example$reset_color:" + print -r -- "" + print -r -- "${fg[green]}fast-theme ${fg[cyan]}-w$reset_color" + print -r -- "${fg[green]}fast-theme ${fg[cyan]}--copy-shipped-theme$reset_color clean z-shell" + print -r -- "" + print -r -- "This allows easy copying of one of the shipped themes into set directory." + print -r -- "The shipped themes are located in ${fg_bold[green]}$FAST_BASE_DIR/themes$reset_color." + return 0 +fi -[[ -n "$OPT_PALETTE" ]] && { +if [[ -n "$OPT_PALETTE" ]]; then local n local -a __colors for n in {000..255} @@ -68,71 +95,59 @@ local MATCH; integer MBEGIN MEND done print -cP $__colors return -} +fi -[[ -n "$OPT_SHOW" ]] && { - print -r -- "Currently active theme: ${fg_bold[yellow]}$FAST_THEME_NAME$reset_color" +if [[ -n "$OPT_SHOW" ]]; then + print -r -- "Currently active theme: ${fg_bold[green]}$FAST_THEME_NAME$reset_color" ( source "$FAST_WORK_DIR"/current_theme.zsh 2>/dev/null && print "Main theme (loaded at startup of a session): ${fg_bold[yellow]}$FAST_THEME_NAME$reset_color" || print "No main theme is set"; ) return 0 -} - -[[ -n "$OPT_COPY" ]] && { - [[ ! -f "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' doesn't exist in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } - [[ ! -r "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' isn't readable in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } - [[ -n "$1" ]] && { - [[ ! -e "$1" && ! -e ${1:h} ]] && { print "Destination path doesn't exist, aborting"; return 1; } - } - command cp -vf "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" "${${1:-.}%.ini}.ini" || return 1 - return 0 -} - -[[ -n "$OPT_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/{current_theme.zsh,secondary_theme.zsh}; [[ -z "$OPT_QUIET" ]] && print "Reset done (no theme is now set, restart is required)"; return 0; } +fi -[[ -n "$OPT_OV_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/theme_overlay.zsh; [[ -z "$OPT_QUIET" ]] && print "Overlay-reset done, it is inactive (restart is required)"; return 0; } +if [[ -n "$OPT_COPY" ]]; then + [[ ! -f "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' doesn't exist in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } + [[ ! -r "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' isn't readable in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } + [[ -n "$1" ]] && { + [[ ! -e "$1" && ! -e ${1:h} ]] && { print "Destination path doesn't exist, aborting"; return 1; } + } + command cp -vf "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" "${${1:-.}%.ini}.ini" || return 1 + return 0 +fi -[[ -n "$OPT_LIST" ]] && { - [[ -z "$OPT_QUIET" ]] && print -r -- "Available themes:" - print -rl -- "$FAST_BASE_DIR"/themes/*.ini(:t:r) - return 0 -} +[[ -n "$OPT_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/{current_theme.zsh,secondary_theme.zsh}; [[ -z "$OPT_QUIET" ]] && print -r -- "${fg[yellow]}Reset done$reset_color (${fg[red]}restart is required$reset_color)"; return 0; } +[[ -n "$OPT_OV_RESET" ]] && { command rm -f "$FAST_WORK_DIR"/theme_overlay.zsh; [[ -z "$OPT_QUIET" ]] && print -r -- "${fg[yellow]}Overlay-reset done$reset_color (${fg[red]}restart is required$reset_color)"; return 0; } -[[ -n "$OPT_HELP" ]] && { - print -r -- "Usage: fast-theme [-h/--help] [-v/--verbose] [-q/--quiet] [-t/--test] " - print -r -- " fast-theme [-r/--reset] [-l/--list] [-s/--show] [-p/--palette] [-w/--workdir]" - print -r -- " fast-theme --copy-shipped-theme {theme-name} [destination-path]" - print -r -- "" - print -r -- "Default action (after providing or ) is to switch" - print -r -- "current session and any future sessions to the new theme. Using ," - print -r -- "i.e.: a path to an ini file means using custom, own theme. The path can use an" - print -r -- "\"XDG:\" shorthand (e.g.: \"XDG:mytheme\") that will point to ~/.config/fsh/.ini" - print -r -- "(or \$XDG_CONFIG_HOME/fsh/.ini in general if the variable is set in the" - print -r -- "environment). If the INI file pointed in the path is \"*overlay*\", then it is" - print -r -- "not a full theme, but an additional theme-snippet that overwrites only selected" - print -r -- "styles of the main theme." +if [[ -n "$OPT_LIST" ]]; then + if [[ -z "$OPT_QUIET" ]]; then + print -r -- "${fg_bold[yellow]}Available themes$reset_color:" print -r -- "" - print -r -- "Other path-shorthands:" - print -r -- "LOCAL: = /usr/local/share/fsh/" - print -r -- "HOME: = $HOME/.fsh/" - print -r -- "OPT: = /opt/local/share/fsh/" - print -r -- "" - print -r -- "-r/--reset - unset any theme, use default highlighting (requires restart)" - print -r -- "-R/--ov-reset - unset overlay, use styles only from main-theme (requires restart)" - print -r -- "-l/--list - list names of available themes" - print -r -- "-t/--test - show test block of code after switching theme" - print -r -- "-s/--show - get and display the theme currently being set" - print -r -- "-p/--palette - just print all 256 colors and exit (useful when creating a theme)" - print -r -- "-w/--workdir - cd into \$FAST_WORK_DIR (if not set, then into the plugin directory)" - print -r -- "-v/--verbose - more messages during operation" - print -r -- "-q/--quiet - no default messages" + print -rl -- "$FAST_BASE_DIR"/themes/*.ini(:t:r) print -r -- "" - print -r -- "The option --copy-shipped-theme allows easy copying of one of the 6 shipped" - print -r -- "themes into given destination path. Normal use means changing directory to" - print -r -- "e.g.: ~/.config/fsh, and then issuing e.g.: \`fast-theme --copy-shipped-theme" - print -r -- "clean mytheme', to obtain a template for own new theme." - return 0 -} + fi + return 0 +fi + +if [[ -n "$OPT_HELP" ]]; then + print -r -- "${fg_bold[yellow]}Usage$reset_color:" + print -r -- "" + print -r -- " ${fg[green]}fast-theme$reset_color [-h/--help] [-v/--verbose] [-q/--quiet] [-t/--test] " + print -r -- " ${fg[green]}fast-theme$reset_color [-r/--reset] [-l/--list] [-s/--show] [-p/--palette] [-w/--workdir]" + print -r -- " ${fg[green]}fast-theme$reset_color --copy-shipped-theme {theme-name} [destination-path]" + print -r -- "" + print -r -- "${fg[cyan]}-w/--workdir$reset_color - cd into \$FAST_WORK_DIR (if not set, then into the plugin directory)" + print -r -- "${fg[cyan]}-R/--ov-reset$reset_color - unset overlay, use styles only from main-theme (requires restart)" + print -r -- "${fg[cyan]}-p/--palette$reset_color - just print all 256 colors and exit (useful when creating a theme)" + print -r -- "${fg[cyan]}-r/--reset$reset_color - unset any theme, use default highlighting (requires restart)" + print -r -- "${fg[cyan]}-t/--test$reset_color - show test block of code after switching theme" + print -r -- "${fg[cyan]}-s/--show$reset_color - get and display the theme currently being set" + print -r -- "${fg[cyan]}-l/--list$reset_color - list names of available themes" + print -r -- "${fg[cyan]}-v/--verbose$reset_color - more messages during operation" + print -r -- "${fg[cyan]}-i/--info$reset_color - additional usage information" + print -r -- "${fg[cyan]}-q/--quiet$reset_color - no default messages" + print -r -- "${fg[cyan]}-h/--help$reset_color - this help message" + return 0 +fi -[[ -z "$1" ]] && { print -u2 "Provide a theme (its name or path to its file) to switch to, aborting (see -h/--help)"; return 1; } +[[ -z "$1" ]] && { print -u2 "${fg[yellow]}Show help$reset_color: ${fg[cyan]}-h, --help$reset_color"; return 1; } # FAST_HIGHLIGHT_STYLES key onto ini-file key map=( @@ -202,17 +217,17 @@ map=( # In which order to generate entries local -a order order=( - default unknown-token reserved-word alias suffix-alias builtin function command precommand - commandseparator hashed-command path path_pathseparator globbing globbing-ext history-expansion - single-hyphen-option double-hyphen-option back-quoted-argument single-quoted-argument - double-quoted-argument dollar-quoted-argument back-or-dollar-double-quoted-argument - back-dollar-quoted-argument assign redirection comment variable mathvar - mathnum matherr assign-array-bracket for-loop-variable for-loop-number for-loop-operator - for-loop-separator exec-descriptor here-string-tri here-string-text here-string-var secondary - case-input case-parentheses case-condition correct-subtle incorrect-subtle subtle-separator subtle-bg - path-to-dir paired-bracket bracket-level-1 bracket-level-2 bracket-level-3 - global-alias subcommand single-sq-bracket double-sq-bracket double-paren - optarg-string optarg-number recursive-base + default unknown-token reserved-word alias suffix-alias builtin function command precommand + commandseparator hashed-command path path_pathseparator globbing globbing-ext history-expansion + single-hyphen-option double-hyphen-option back-quoted-argument single-quoted-argument + double-quoted-argument dollar-quoted-argument back-or-dollar-double-quoted-argument + back-dollar-quoted-argument assign redirection comment variable mathvar + mathnum matherr assign-array-bracket for-loop-variable for-loop-number for-loop-operator + for-loop-separator exec-descriptor here-string-tri here-string-text here-string-var secondary + case-input case-parentheses case-condition correct-subtle incorrect-subtle subtle-separator subtle-bg + path-to-dir paired-bracket bracket-level-1 bracket-level-2 bracket-level-3 + global-alias subcommand single-sq-bracket double-sq-bracket double-paren + optarg-string optarg-number recursive-base ) [[ -n "$OPT_VERBOSE" ]] && print "Number of styles available for customization: ${#order}" @@ -227,24 +242,25 @@ color=( red green blue yellow cyan magenta black white default ) local -A out local THEME_NAME THEME_PATH="$1" -if [[ "$1" = */* || "$1" = (XDG|LOCAL|HOME|OPT):* ]]; then - 1="${${1/(#s)XDG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" - 1="${${1/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" - 1="${${1/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" - 1="${${1/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" - 1=${~1} # allow user to quote ~ - - [[ ! -f "$1" ]] && { print -u2 "No such theme \`$1', aborting"; return 1; } - [[ ! -r "$1" ]] && { print -u2 "Theme \`$1' unreadable, aborting"; return 1; } - - THEME_NAME="${1:t:r}" - .fast-read-ini-file "$1" out "" +if [[ "$1" = */* || "$1" = (CONFIG|CACHE|LOCAL|HOME|OPT):* ]]; then + 1="${${1/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" + 1="${${1/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/zi/fsh/}%.ini}.ini" + 1="${${1/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" + 1="${${1/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" + 1="${${1/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" + 1=${~1} # allow user to quote ~ + + [[ ! -f "$1" ]] && { print -u2 "${fg[yellow]}No such theme$reset_color \`$1'${fg[yellow]}, aborting$reset_color"; return 1; } + [[ ! -r "$1" ]] && { print -u2 "${fg[yellow]}Theme$reset_color \`$1' ${fg[yellow]}unreadable, aborting$reset_color"; return 1; } + + THEME_NAME="${1:t:r}" + .fast-read-ini-file "$1" out "" else - [[ ! -f "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "No such theme \`$1', aborting"; return 1; } - [[ ! -r "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "Theme \`$1' unreadable, aborting"; return 1; } + [[ ! -f "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "${fg[yellow]}No such theme$reset_color \`$1'${fg[yellow]}, aborting$reset_color"; return 1; } + [[ ! -r "$FAST_BASE_DIR/themes/$1.ini" ]] && { print -u2 "${fg[yellow]}Theme$reset_color \`$1' ${fg[yellow]}unreadable, aborting$reset_color"; return 1; } - THEME_NAME="$1" - .fast-read-ini-file "$FAST_BASE_DIR/themes/$1.ini" out "" + THEME_NAME="$1" + .fast-read-ini-file "$FAST_BASE_DIR/themes/$1.ini" out "" fi [[ -z "$OPT_SECONDARY" ]] && { [[ "$THEME_NAME" = *"overlay"* ]] && local outfile="theme_overlay.zsh" || local outfile="current_theme.zsh"; } || local outfile="secondary_theme.zsh" @@ -252,14 +268,14 @@ fi # Set a zstyle and a parameter to carry theme name if [[ -z "$OPT_SECONDARY" && -z "$OPT_XCHG" && -z "$OPT_OV_XCHG" ]]; then - [[ "$THEME_NAME" != *"overlay"* ]] && { - print -r -- 'zstyle :plugin:fast-syntax-highlighting theme "'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile" - print -r -- 'typeset -g FAST_THEME_NAME="'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile" - zstyle :plugin:fast-syntax-highlighting theme "$THEME_NAME" - typeset -g FAST_THEME_NAME="$THEME_NAME" - } + [[ "$THEME_NAME" != *"overlay"* ]] && { + print -r -- 'zstyle :plugin:fast-syntax-highlighting theme "'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile" + print -r -- 'typeset -g FAST_THEME_NAME="'"$THEME_NAME"'"' >>! "$FAST_WORK_DIR"/"$outfile" + zstyle :plugin:fast-syntax-highlighting theme "$THEME_NAME" + typeset -g FAST_THEME_NAME="$THEME_NAME" + } elif [[ -z "$OPT_XCHG" && -z "$OPT_OV_XCHG" ]]; then - local FAST_THEME_NAME="$THEME_NAME" + local FAST_THEME_NAME="$THEME_NAME" fi # Store from which file the theme or overlay is being loaded @@ -269,6 +285,7 @@ fi local k kk local inikey inival result result2 first_val isbg integer ov_counter=0 first + for k in "${order[@]}"; do first=1 for kk in ${(s. .)map[$k]} default; do @@ -343,46 +360,46 @@ done zcompile $FAST_WORK_DIR/$outfile 2>/dev/null -[[ -z "$OPT_QUIET" ]] && { +if [[ -z "$OPT_QUIET" ]]; then if [[ "$THEME_NAME" != *"overlay"* ]]; then print "Switched to theme \`$THEME_NAME' (current session, and future sessions)" || \ else print "Processed the overlay ($ov_counter keys found), it is now active (for current session, and future sessions)" fi -} +fi -[[ -n "$OPT_TEST" ]] && { +if [[ -n "$OPT_TEST" ]]; then print -zr ' -# Subshell, assignments, math-mode -echo $(cat /etc/hosts |& grep -i "hello337") -local param1="text ${+variable[test]} text ${var} text"; typeset param2='"'"'other $variable'"'"' -math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 )) - -# Programming-like usage, bracket matching - through distinct colors; note the backslash quoting -for (( ii = 1; ii <= size; ++ ii )); do - if [[ "${cmds[ii]} string" = "| string" ]] - then - sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening cmd-subst - (( sidx <= len + 100 )) && { - eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing cmd-subst - } - fi -done + # Subshell, assignments, math-mode + echo $(cat /etc/hosts |& grep -i "hello337") + local param1="text ${+variable[test]} text ${var} text"; typeset param2='"'"'other $variable'"'"' + math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 )) + + # Programming-like usage, bracket matching - through distinct colors; note the backslash quoting + for (( ii = 1; ii <= size; ++ ii )); do + if [[ "${cmds[ii]} string" = "| string" ]] + then + sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening cmd-subst + (( sidx <= len + 100 )) && { + eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing cmd-subst + } + fi + done -# Regular command-line usage -repeat 0 { - zsh -i -c "cat /etc/shells* | grep -x --line-buffered -i '"'/bin/zsh'"'" - builtin exit $return_value - fast-theme -tq default - fsh-alias -tq default-X # alias '"'"'fsh-alias=fast-theme'"'"' works just like the previous line - command -v git | grep ".+git" && echo $'"'"'Git is installed'"'"' - git checkout -m --ours /etc/shells && git status-X - gem install asciidoctor - cat <<<$PATH | tr : \\n > /dev/null 2>/usr/local - man -a fopen fopen-X - CFLAGS="-g -Wall -O0" ./configure -} -' -} + # Regular command-line usage + repeat 0 { + zsh -i -c "cat /etc/shells* | grep -x --line-buffered -i '"'/bin/zsh'"'" + builtin exit $return_value + fast-theme -tq default + fsh-alias -tq default-X # alias '"'"'fsh-alias=fast-theme'"'"' works just like the previous line + command -v git | grep ".+git" && echo $'"'"'Git is installed'"'"' + git checkout -m --ours /etc/shells && git status-X + gem install asciidoctor + cat <<<$PATH | tr : \\n > /dev/null 2>/usr/local + man -a fopen fopen-X + CFLAGS="-g -Wall -O0" ./configure + } + ' +fi return 0 diff --git a/share/test/parse.zsh b/share/test/parse.zsh index d125f52..e2f72ac 100755 --- a/share/test/parse.zsh +++ b/share/test/parse.zsh @@ -14,21 +14,21 @@ ZERO="${(%):-%N}" -if [[ -e "${ZERO}/../fast-highlight" ]]; then - source "${ZERO}/../fast-highlight" - source "${ZERO}/../fast-string-highlight" +if [[ -e "${ZERO}/../functions/fast-highlight" ]]; then + source "${ZERO}/../functions/fast-highlight" + source "${ZERO}/../functions/fast-string-highlight" fpath+=( "${ZERO}/.." ) -elif [[ -e "../fast-highlight" ]]; then - source "../fast-highlight" - source "../fast-string-highlight" +elif [[ -e "../functions/fast-highlight" ]]; then + source "../functions/fast-highlight" + source "../functions/fast-string-highlight" fpath+=( "$PWD/.." ) -elif [[ -e "${ZERO}/fast-highlight" ]]; then - source "${ZERO}/fast-highlight" - source "${ZERO}/fast-string-highlight" +elif [[ -e "${ZERO}/functions/fast-highlight" ]]; then + source "${ZERO}/functions/fast-highlight" + source "${ZERO}/functions/fast-string-highlight" fpath+=( "${ZERO}" ) -elif [[ -e "./fast-highlight" ]]; then - source "./fast-highlight" - source "./fast-string-highlight" +elif [[ -e "./functions/fast-highlight" ]]; then + source "./functions/fast-highlight" + source "./functions/fast-string-highlight" fpath+=( "./" ) else print -u2 "Could not find fast-highlight, aborting" @@ -45,9 +45,9 @@ if [[ "$1" = "-o" || "$1" = "-oo" || "$1" = "-ooo" || "$1" = "-git" || "$1" = "- typeset -a input input=() if [[ "$1" = "-o" ]]; then - input+=( "./parse.zsh ../fast-highlight parse2.out" ) + input+=( "./parse.zsh ../functions/fast-highlight parse2.out" ) input+=( "rm -f parse*.out" ) - input+=( "./mh-parse.zsh ../fast-highlight > out" ) + input+=( "./mh-parse.zsh ../functions/fast-highlight > out" ) input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" ) input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" ) input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' ) diff --git a/tests/main.zunit b/tests/main.zunit index 8c187cd..75c91ce 100644 --- a/tests/main.zunit +++ b/tests/main.zunit @@ -1,6 +1,6 @@ #!/usr/bin/env zunit @setup { - load "../fast-highlight" + load "../functions/fast-highlight" setopt interactive_comments -fast-highlight-fill-option-variables } diff --git "a/\342\206\222chroma/-alias.ch" "b/\342\206\222chroma/-alias.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-autoload.ch" "b/\342\206\222chroma/-autoload.ch" old mode 100644 new mode 100755 index d41e5de..4769cae --- "a/\342\206\222chroma/-autoload.ch" +++ "b/\342\206\222chroma/-autoload.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Tracks autoload command - highlights function names if they exist somewhere # in $fpath. Also warns that the autoloaded function is already defined. @@ -99,5 +100,3 @@ local -a __results __deserialized __noshsplit _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-autorandr.ch" "b/\342\206\222chroma/-autorandr.ch" old mode 100644 new mode 100755 index c7217bd..6759bd0 --- "a/\342\206\222chroma/-autorandr.ch" +++ "b/\342\206\222chroma/-autorandr.ch" @@ -1,5 +1,6 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 @@ -21,5 +22,3 @@ fi _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-awk.ch" "b/\342\206\222chroma/-awk.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-docker.ch" "b/\342\206\222chroma/-docker.ch" old mode 100644 new mode 100755 index 25994b4..17ffbdb --- "a/\342\206\222chroma/-docker.ch" +++ "b/\342\206\222chroma/-docker.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Chroma function for command `docker'. It verifies command line, by denoting # wrong and good arguments by color. Currently implemented: verification of @@ -85,5 +86,3 @@ local -a __lines_list _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-example.ch" "b/\342\206\222chroma/-example.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-fast-theme.ch" "b/\342\206\222chroma/-fast-theme.ch" old mode 100644 new mode 100755 index 20c8abd..99516de --- "a/\342\206\222chroma/-fast-theme.ch" +++ "b/\342\206\222chroma/-fast-theme.ch" @@ -1,5 +1,6 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 @@ -7,37 +8,36 @@ local __first_call="$1" __wrd="${(Q)2}" __start_pos="$3" __end_pos="$4" local __style if (( __first_call )); then - FAST_HIGHLIGHT[chroma-fast-theme-first]=0 - return 1 + FAST_HIGHLIGHT[chroma-fast-theme-first]=0 + return 1 elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 + return 1 elif (( ${FAST_HIGHLIGHT[chroma-fast-theme-first]} )) || [[ $__wrd = -* ]]; then - return 1 + return 1 else - FAST_HIGHLIGHT[chroma-fast-theme-first]=1 + FAST_HIGHLIGHT[chroma-fast-theme-first]=1 fi -if [[ "$__wrd" = */* || "$__wrd" = (XDG|LOCAL|HOME|OPT):* ]]; then - __wrd="${${__wrd/(#s)XDG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" - __wrd=${~__wrd} # allow user to quote ~ +if [[ "$__wrd" = */* || "$__wrd" = (CONFIG|CACHE|LOCAL|HOME|OPT):* ]]; then + __wrd="${${__wrd/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" + __wrd="${${__wrd/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/zi/fsh/}%.ini}.ini" + __wrd="${${__wrd/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" + __wrd="${${__wrd/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" + __wrd="${${__wrd/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" + __wrd=${~__wrd} # allow user to quote ~ else - __wrd="$FAST_BASE_DIR/themes/$__wrd.ini" + __wrd="$FAST_BASE_DIR/themes/$__wrd.ini" fi if [[ -f $__wrd ]]; then - __style=${FAST_THEME_NAME}path + __style=${FAST_THEME_NAME}path else - __style=${FAST_THEME_NAME}incorrect-subtle + __style=${FAST_THEME_NAME}incorrect-subtle fi (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") (( this_word = next_word )) _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-fpath_peq.ch" "b/\342\206\222chroma/-fpath_peq.ch" old mode 100644 new mode 100755 index 149df8c..a8f65eb --- "a/\342\206\222chroma/-fpath_peq.ch" +++ "b/\342\206\222chroma/-fpath_peq.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # This chroma does a narrow, obscure but prestigious parsing of fpath+=( elem1 # elem2 ... ) construct to provide *the* *future* contents of $fpath to @@ -56,5 +57,3 @@ local -a deserialized _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-git.ch" "b/\342\206\222chroma/-git.ch" old mode 100644 new mode 100755 index 8df5088..d59967e --- "a/\342\206\222chroma/-git.ch" +++ "b/\342\206\222chroma/-git.ch" @@ -1,7 +1,7 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # -# Chroma function for command `git'. It colorizes the part of command -# line that holds `git' invocation. +# Chroma function for command `git'. It colorizes the part of command line that holds `git' invocation. (( FAST_HIGHLIGHT[-git.ch-chroma-def] )) && return 1 @@ -15,22 +15,20 @@ fsh__git__chroma__def=( ## {{{ subcmd:NULL "NULL_0_opt" - NULL_0_opt "(-C|--exec-path=|--git-dir=|--work-tree=|--namespace=|--super-prefix=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || -c + NULL_0_opt " + (-C|--exec-path=|--git-dir=|--work-tree=|--namespace=|--super-prefix=|--config-env=| + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || -c <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP <<>> __style=\${FAST_THEME_NAME}optarg-string // NO-OP - || (--version|--help|--html-path|--man-path|--info-path|-p|--paginate| - -P|--no-pager|--no-replace-objects|--bare) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - + || (-v|--version|-h|--help|--html-path|--man-path|--info-path|-p|--paginate| + -P|--no-pager|--no-replace-objects|--bare) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" "subcommands" "::→chroma/-git-get-subcommands" # run a function (the :: causes this) and use `reply' #"subcommands" "(fetch|pull)" # run a function (the :: causes this) and use `reply' - "subcmd-hook" "→chroma/-git-check-if-alias" - "subcommands-blacklist" "mv,other" ## }}} @@ -45,15 +43,15 @@ fsh__git__chroma__def=( # Special options (^ - has directives, currently - an :add and :del directive) "FETCH_MULTIPLE_0_opt^" " - --multiple - <<>> __style=\${FAST_THEME_NAME}double-hyphen-option // NO-OP - || --multiple:add - <<>> REMOTE_GR_#_arg - || --multiple:del - <<>> REMOTE_GR_1_arg // REF_#_arg" # when --multiple is passed, then - # there is no refspec argument, only remotes-ids - # follow unlimited # of them, hence the # in the - # REMOTE_GR_#_arg + --multiple + <<>> __style=\${FAST_THEME_NAME}double-hyphen-option // NO-OP + || --multiple:add + <<>> REMOTE_GR_#_arg + || --multiple:del + <<>> REMOTE_GR_1_arg // REF_#_arg" # when --multiple is passed, then + # there is no refspec argument, only remotes-ids + # follow unlimited # of them, hence the # in the + # REMOTE_GR_#_arg # Special options (^ - has directives - an :del-directive) "FETCH_ALL_0_opt^" " @@ -65,18 +63,16 @@ fsh__git__chroma__def=( # FETCH_0_opt. FETCH-options (FETCH is an identifier) at position 0 -> # -> before any argument FETCH_0_opt " - (--depth=|--deepen=|--shallow-exclude=|--shallow-since=|--receive-pack=| - --refmap=|--recurse-submodules=|-j|--jobs=|--submodule-prefix=| - --recurse-submodules-default=|-o|--server-option=|--upload-pack| - --negotiation-tip=|--set-upstream=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (--help|--all|-a|--append|--unshallow|--atomic|--auto-maintenance|--update-shallow|--dry-run|-f|--force| - -k|--keep|--multiple|-p|--prune|-n|--no-tags|-t|--tags|--prefetch |--no-recurse-submodules|--negotiation-tip| - --auto-gc|--filter|--write-fetch-head|--write-commit-graph|--show-forced-updates|--prune-tags| - -u|--update-head-ok|-q|--quiet|-v|--verbose|--progress| - -4|--ipv4|-6|--ipv6) - <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" + (--depth=|--deepen=|--shallow-exclude=|--shallow-since=|--receive-pack=|--filter=| + --refmap=|--recurse-submodules=|-j|--jobs=|--submodule-prefix=|--recurse-submodules-default=| + -o|--server-option=|--upload-pack=|--negotiation-tip=|--set-upstream=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|--all|-a|--append|--unshallow|--atomic|--auto-maintenance|--update-shallow|--dry-run|-f|--force| + -k|--keep|-m|--multiple|-p|--prune|-n|--no-tags|-t|--tags|--prefetch |--no-recurse-submodules|--negotiation-tip| + --auto-gc|--filter|--write-fetch-head|--write-commit-graph|--show-forced-updates|-P|--prune-tags|--negotiate-only| + -u|--update-head-ok|-q|--quiet|-v|--verbose|--progress|--refetch|-4|--ipv4|-6|--ipv6|--stdin) + <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" # Above: note the two <<>>-separated blocks for options that have # some arguments – the second pair of action/handler is being # run when an option argument is occurred (first one: the option @@ -105,18 +101,16 @@ fsh__git__chroma__def=( subcmd:push "PUSH_0_opt // REMOTE_1_arg // REF_#_arg // NO_MATCH_#_opt" PUSH_0_opt " - (--receive-pack=|--exec=|--repo=|--push-option=|--signed=| - --force-with-lease=|--signed=|--recurse-submodules=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (--help|--all|--mirror|--tags|--follow-tags|--atomic|-n|--dry-run| - --porcelain|--delete|--tags|--follow-tags|--signed|--no-signed| - --atomic|--no-atomic|-o|--push-option|--force-with-lease| - --no-force-with-lease|-f|--force|-u|--set-upstream|--thin| - --no-thin|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules| - --verify|--no-verify|-4|--ipv4|-6|--ipv6) - <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" - + (--receive-pack=|--exec=|--repo=|--push-option=|--signed=| + --force-with-lease=|--recurse-submodules=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|--all|--mirror|--tags|--follow-tags|-n|--dry-run|--porcelain| + -d|--delete|--signed|--no-signed|--atomic|--no-atomic| + -o|--push-option|--prune|--force-with-lease|--no-force-with-lease|-f|--force| + --force-if-includes|-u|--set-upstream|--thin|--no-thin|-q|--quiet|-v|--verbose| + --progress|--no-recurse-submodules|--verify|--no-verify|-4|--ipv4|-6|--ipv6) + <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" REMOTE_1_arg "NO-OP // ::→chroma/-git-verify-remote" # This definition is generic, reused later ### }}} @@ -129,21 +123,20 @@ fsh__git__chroma__def=( subcmd:pull "PULL_0_opt // REMOTE_1_arg // REF_#_arg // NO_MATCH_#_opt" PULL_0_opt " - (--recurse-submodules=|-S|--gpg-sign=|--log=|-s|--strategy=|-X| - --strategy-option=|--rebase=|--depth=|--deepen=|--shallow-exclude=| - --shallow-since=|--negotiation-tip|--upload-pack|-o|--server-option=| - --no-recurse-submodules=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (--help|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules| - --commit|--no-commit|--edit|--no-edit|--ff|--no-ff|--ff-only| - --log|--no-log|--signoff|--no-signoff|--stat|-n|--no-stat|--squash| - --no-squash|--verify-signatures|--no-verify-signatures|--summary| - --no-summary|--allow-unrelated-histories|-r|--rebase|--no-rebase| - --autostash|--no-autostash|--all|-a|--append|--unshallow| - --update-shallow|-f|--force|-k|--keep|--no-tags|-u|--update-head-ok| - --progress|-4|--ipv4|-6|--ipv6|--recurse-submodules) - <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" + (--recurse-submodules=|-S|--gpg-sign=|--log=|-s|--strategy=|-X|-j|--jobs=| + --strategy-option=|--rebase=|--depth=|--deepen=|--shallow-exclude=| + --shallow-since=|--signoff=|--negotiation-tip=|--upload-pack|-o|--server-option=| + --no-recurse-submodules=|--refmap=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules|--dry-run| + --commit|--no-commit|--cleanup|--edit|--no-edit|--ff|--no-ff|--ff-only|--log|--no-log| + --signoff|--no-signoff|--stat|-n|--no-stat|--squash|--show-forced-updates|--no-squash| + --verify|--verify-signatures|--no-verify-signatures|--summary|--set-upstream|--no-summary| + --allow-unrelated-histories|-r|--rebase|--no-rebase|--autostash|--no-autostash|--all| + -a|--append|--unshallow|--update-shallow|-f|--force|-p|--prune|-k|--keep|-t|--tags|--no-tags| + -u|--update-head-ok|--progress|-4|--ipv4|-6|--ipv6) + <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" ## }}} @@ -158,7 +151,7 @@ fsh__git__chroma__def=( (-m|--message=|-am) <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action - || (--help|-a|--all|-p|--patch|--reset-author|--short|--branch| + || (-h|--help|-a|--all|-p|--patch|--reset-author|--short|--branch| --porcelain|--long|-z|--null|-s|--signoff|-n|--no-verify| --allow-empty|--allow-empty-message|-e|--edit|--no-edit| --amend|--no-post-rewrite|-i|--include|-o|--only|--untracked-files| @@ -181,21 +174,21 @@ fsh__git__chroma__def=( ## {{{ subcmd:merge "MERGE_0_opt // COMMIT_#_arg" - MERGE_0_opt - "(-m) - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action - (-S|--gpg-sign=|--log=|-e|--strategy=|-X|--strategy-option=|-F| - --file) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (--help|--commit|--no-commit|-e|--edit|--no-edit|--ff|--no-ff|--ff-only| - --log|--no-log|--signoff|--no-signoff|-n|--stat|--no-stat|--squash| - --no-squash|--verify-signatures|--no-verify-signatures|--summary| - --no-summary|-q|--quiet|-v|--verbose|--progress|--no-progress| - --allow-unrelated-histories|--rerere-autoupdate|--no-rerere-autoupdate| - --abort|--continue) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + MERGE_0_opt " + (-m) + <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action + <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action + (-S|--gpg-sign=|--log=|-e|--strategy=|-X|--strategy-option=|-F|--file|--cleanup=| + --into-name=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|--commit|--no-commit|-e|--edit|--no-edit|--ff|--no-ff|--ff-only|--autostash| + --log|--no-log|--signoff|--no-signoff|-n|--stat|--no-stat|--squash|--overwrite-ignore| + --no-squash|--verify-signatures|--no-verify|--no-verify-signatures|--summary|--no-summary| + -q|--quiet|-v|--verbose|--progress|--no-progress|--allow-unrelated-histories| + --rerere-autoupdate|--no-rerere-autoupdate|--abort|--quit|--continue) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + COMMIT_\#_arg "NO-OP // ::→chroma/-git-verify-commit" ## }}} @@ -207,18 +200,19 @@ fsh__git__chroma__def=( subcmd:reset "RESET_0_opt^ // RESET_0_opt // RESET_#_arg // NO_MATCH_#_opt" "RESET_0_opt^" " - (--soft|--mixed|--hard|--merge|--keep) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - || (--soft|--mixed|--hard|--merge|--keep):del - <<>> RESET_0_opt // RESET_#_arg - || (--soft|--mixed|--hard|--merge|--keep):add - <<>> RESET_1_arg // NO_MATCH_#_arg - " + (--soft|--mixed|--hard|--merge|--keep) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + || (--soft|--mixed|--hard|--merge|--keep):del + <<>> RESET_0_opt // RESET_#_arg + || (--soft|--mixed|--hard|--merge|--keep):add + <<>> RESET_1_arg // NO_MATCH_#_arg" RESET_0_opt " - (-q|-p|--patch) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - + (--recurse-submodules=|--pathspec-from-file=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|-q|--quiet|-p|--patch|-N|--intent-to-add|--pathspec-file-nul) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" RESET_1_arg "NO-OP // ::→chroma/-git-verify-commit" "RESET_#_arg" "NO-OP // ::→chroma/-git-RESET-verify-commit-or-file" @@ -233,19 +227,19 @@ fsh__git__chroma__def=( subcmd:revert "REVERT_SEQUENCER_0_opt^ // REVERT_0_opt // REVERT_#_arg // NO_MATCH_#_opt" REVERT_0_opt " - (-m|--mainline|-S|--gpg-sign=|--strategy=|-X|--strategy-option=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (-e|--edit|--no-edit|-n|--no-commit|-s|--signoff) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + (-m|--mainline|-S|--gpg-sign=|--strategy=|-X|--strategy-option=|--cleanup=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|-e|--edit|--no-edit|-n|--no-commit|-s|--signoff|--reference|--rerere-autoupdate) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" "REVERT_SEQUENCER_0_opt^" " - (--continue|--quit|--abort) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - || (--continue|--quit|--abort):del - <<>> REVERT_0_opt // REVERT_#_arg - || (--continue|--quit|--abort):add - <<>> NO_MATCH_#_arg" + (--continue|--quit|--abort|--skip) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + || (--continue|--quit|--abort|--skip):del + <<>> REVERT_0_opt // REVERT_#_arg + || (--continue|--quit|--abort|--skip):add + <<>> NO_MATCH_#_arg" "REVERT_#_arg" "NO-OP // ::→chroma/-git-verify-commit" @@ -268,27 +262,27 @@ fsh__git__chroma__def=( || --no-index:add <<>> FILE_1_arg // FILE_2_arg // NO_MATCH_#_arg" DIFF_0_opt " - (-U|--unified=|--anchored=|--diff-algorithm=|--stat=|--dirstat| - --submodule=|--color=|--color-moved=|--color-moved-ws=|--word-diff=| - --word-diff-regex=|--color-words=|--ws-error-highlight=|--abbrev=| - -B|--break-rewrites=|-M|--find-renames=|-C|--find-copies=|-l| - --diff-filter=|-S|-G|--find-object=|--relative=|-O|--relative=| - --inter-hunk-context=|--ignore-submodules=|--src-prefix=|--dst-prefix=| - --line-prefix=) + (-U|--unified=|--anchored=|--diff-algorithm=|--stat=|--stat-width=|--stat-name-width=| + --stat-graph-width|-X|--dirstat|--dirstat-by-file=|--stat-count=|--submodule=|--color=| + --color-moved=|--color-moved-ws=|--word-diff=|--word-diff-regex=|--color-words=| + --ws-error-highlight=|--abbrev=|-B|--break-rewrites=|-M|--find-renames=|-C|--find-copies=|-l| + --diff-filter=|-S|-G|--find-object=|--relative=|-O|--relative=|--inter-hunk-context=|--output=| + --output-indicator-new=|--output-indicator-old=|--output-indicator-context=|--ignore-submodules=| + --src-prefix=|--dst-prefix=|--line-prefix=|-I|--ignore-matching-lines=|--rotate-to=|--skip-to=) <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (-p|--patch|-u|-s|--no-patch|--raw|--patch-with-raw|--indent-heuristic| - --no-indent-heuristic|--minimal|--patience|--histogram|--stat| + || (-h|--help|-p|--patch|-u|-s|--no-patch|--raw|--patch-with-raw|--indent-heuristic| + --no-indent-heuristic|--minimal|--patience|--histogram|--stat|--cumulative| --compact-summary|--numstat|--shortstat|--dirstat|--summary| --patch-with-stat|-z|--name-only|--name-status|--submodule|--no-color| --color-moved|--word-diff|--color-words|--no-renames|--check| - --full-index|--binary|--abbrev|--break-rewrites|--find-renames| - --find-copies|--find-copies-harder|-D|--pickaxe-all|--pickaxe-regex| + --full-index|--binary|--abbrev|--break-rewrites|--find-renames|--rename-empty| + --find-copies|--find-copies-harder|-D|--pickaxe-all|--pickaxe-regex|--follow| --irreversible-delete|-R|--relative|-a|--text|--ignore-cr-at-eol| --ignore-space-at-eol|-b|--ignore-space-change|-w|--ignore-all-space| --ignore-blank-lines|-W|--function-context|--exit-code|--quiet| --ext-diff|--no-ext-diff|--textconv|--no-textconv|--ignore-submodules| - --no-prefix|--ita-invisible-in-index|-1|--base|-2|--ours|-3|--theirs| + --no-prefix|--ita-invisible-in-index|--ita-visible-in-index|-1|--base|-2|--ours|-3|--theirs| -0|--cached) <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" @@ -311,15 +305,14 @@ fsh__git__chroma__def=( subcmd:add "ADD_0_opt // FILE_OR_DIR_#_arg // NO_MATCH_#_opt" ADD_0_opt " - --chmod= - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (-v|--verbose|-f|--force|-i|--interactive|-n|--dry-run| - -p|--patch|-e|--edit|--all|--no-all|-A|--all|--no-all| - --ignore-removal|--no-ignore-removal|-u|--update|-N| - --intent-to-add|--refresh|--ignore-errors|--ignore-missing| - --renormalize|--no-warn-embedded-repo) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + (--chmod=|--pathspec-from-file=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|-v|--verbose|-f|--force|-i|--interactive|-n|--dry-run|-p|--patch|-e|--edit| + --all|--no-all|-A|--ignore-removal|--no-ignore-removal|-u|--update|-N|--sparse| + --intent-to-add|--refresh|--ignore-errors|--ignore-missing|--renormalize| + --no-warn-embedded-repo|--pathspec-file-nul) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" FILE_OR_DIR_#_arg "NO-OP // ::→chroma/-git-verify-file-or-dir" @@ -347,13 +340,13 @@ fsh__git__chroma__def=( COMMIT_2_arg "NO-OP // ::→chroma/-git-verify-commit" CHECKOUT_0_opt " - --conflict= - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (-q|--quiet|--progress|--no-progress|-f|--force|--ours|--theirs| - -b|-B|-t|--track|--no-track|-l|--detach|--orphan| - --ignore-skip-worktree-bits|-m|--merge|-p|--patch| - --ignore-other-worktrees|--no-ignore-other-worktrees) + (--conflict=|--recurse-submodules=|--track=|--pathspec-from-file=) + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + || (-h|--help|-q|--quiet|--progress|--no-progress|-f|--force|-2|--ours|-3|--theirs|--guess|--overlay| + -b|-B|-t|--track|--no-track|-l|-d|--detach|--orphan|--ignore-skip-worktree-bits| + -m|--merge|-p|--patch|--ignore-other-worktrees|--no-ignore-other-worktrees|--overwrite-ignore| + --pathspec-file-nul) <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" # A generic action @@ -375,7 +368,7 @@ fsh__git__chroma__def=( REMOTE_GET_URL_1_arg // REMOTE_SET_URL_1_arg // REMOTE_SHOW_1_arg // REMOTE_PRUNE_1_arg // REMOTE_UPDATE_1_arg" - REMOTE_0_opt "(-v|--verbose) + REMOTE_0_opt "(-h|--help|-v|--verbose) <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" REMOTE_ADD_1_arg "add ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>> @@ -488,7 +481,7 @@ fsh__git__chroma__def=( <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action - || (--follow|--decorate|--no-decorate|--source|--use-mailmap|--full-diff| + || (-h|--help|--follow|--decorate|--no-decorate|--source|--use-mailmap|--full-diff| --log-size|--all-match|--invert-grep|-i|--regexp-ignore-case|--basic-regexp| -E|--extended-regexp|-F|--fixed-strings|-P|--perl-regexp|--remove-empty| --merges|--no-merges|--no-min-parents|--no-max-parents|--first-parent| @@ -534,7 +527,7 @@ fsh__git__chroma__def=( <<>> NO-OP // ::→chroma/-git-verify-file || (-a|--annotate|-s|--sign|-f|-e|--edit) <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - || (-u|--local-user=|--cleanup=|-m|-F|--file|-a|--annotate|-s|--sign| + || (-h|--help|-u|--local-user=|--cleanup=|-m|-F|--file|-a|--annotate|-s|--sign| -f|-e|--edit):add <<>> TAG_NEW_1_arg // COMMIT_2_arg // NO_MATCH_#_arg // NO_MATCH_#_opt" @@ -597,358 +590,341 @@ fsh__git__chroma__def=( # Called after entering just "git" on the command line →chroma/-git-first-call() { - # Called for the first time - new command - # FAST_HIGHLIGHT is used because it survives between calls, and - # allows to use a single global hash only, instead of multiple - # global variables - FAST_HIGHLIGHT[chroma-git-counter]=0 - FAST_HIGHLIGHT[chroma-git-got-subcommand]=0 - FAST_HIGHLIGHT[chroma-git-subcommand]="" - FAST_HIGHLIGHT[chrome-git-got-msg1]=0 - FAST_HIGHLIGHT[chrome-git-got-anymsg]=0 - FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]=0 - FAST_HIGHLIGHT[chroma-git-checkout-new]=0 - FAST_HIGHLIGHT[chroma-git-fetch-multiple]=0 - FAST_HIGHLIGHT[chroma-git-branch-change]=0 - FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0 - FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=0 - FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=0 - return 1 + # Called for the first time - new command FAST_HIGHLIGHT is used because it survives between calls, + # and allows to use a single global hash only, instead of multiple global variables + FAST_HIGHLIGHT[chroma-git-counter]=0 + FAST_HIGHLIGHT[chroma-git-got-subcommand]=0 + FAST_HIGHLIGHT[chroma-git-subcommand]="" + FAST_HIGHLIGHT[chrome-git-got-msg1]=0 + FAST_HIGHLIGHT[chrome-git-got-anymsg]=0 + FAST_HIGHLIGHT[chrome-git-occurred-double-hyphen]=0 + FAST_HIGHLIGHT[chroma-git-checkout-new]=0 + FAST_HIGHLIGHT[chroma-git-fetch-multiple]=0 + FAST_HIGHLIGHT[chroma-git-branch-change]=0 + FAST_HIGHLIGHT[chroma-git-option-with-argument-active]=0 + FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=0 + FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=0 + return 1 } →chroma/-git-check-if-alias() { - local _wrd="$1" - local -a _result - - typeset -ga fsh__chroma__git__aliases - _result=( ${(M)fsh__chroma__git__aliases[@]:#${_wrd}[[:space:]]##*} ) - →chroma/main-chroma-print "Got is-alias-_result: $_result" - [[ -n "$_result" ]] && \ - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="${${${_result#* }## ##}%% *}" + local _wrd="$1" + local -a _result + + typeset -ga fsh__chroma__git__aliases + _result=( ${(M)fsh__chroma__git__aliases[@]:#${_wrd}[[:space:]]##*} ) + →chroma/main-chroma-print "Got is-alias-_result: $_result" + [[ -n "$_result" ]] && \ + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="${${${_result#* }## ##}%% *}" } # A hook that returns the list of git's # available subcommands in $reply →chroma/-git-get-subcommands() { - local __svalue - integer __ivalue - LANG=C .fast-run-command "git help -a" chroma-${FAST_HIGHLIGHT[chroma-current]}-subcmd-list "" $(( 15 * 60 )) - if [[ "${__lines_list[1]}" = See* ]]; then - # (**) - # git >= v2.20, the aliases in the `git help -a' command - __lines_list=( ${${${${(M)__lines_list[@]:#([[:space:]](#c3,3)[a-zA-Z0-9_]*|Command aliases)}##[[:space:]]##}//(#s)Command\ aliases(#e)/Command_aliases}} ) - __svalue="+${__lines_list[(I)Command_aliases]}" - __lines_list[1,__svalue-1]=( ${(@)__lines_list[1,__svalue-1]%%[[:space:]]##*} ) - else - # (**) - # git < v2.20, add aliases through extra code - __lines_list=( ${(s: :)${(M)__lines_list[@]:# [a-z]*}} ) - - __svalue=${#__lines_list} - # This allows to check if the command is an alias - we want to - # highlight the aliased command just like the target command of - # the alias - .fast-run-command "+git config --get-regexp 'alias.*'" chroma-${FAST_HIGHLIGHT[chroma-current]}-alias-list "[[:space:]]#alias." $(( 15 * 60 )) - fi - - __tmp=${#__lines_list} - typeset -ga fsh__chroma__git__aliases - fsh__chroma__git__aliases=( ${__lines_list[__svalue+1,__tmp]} ) - [[ ${__lines_list[__svalue]} != "Command_aliases" ]] && (( ++ __svalue, __ivalue=0, 1 )) || (( __ivalue=1 )) - __lines_list[__svalue,__tmp]=( ${(@)__lines_list[__svalue+__ivalue,__tmp]%%[[:space:]]##*} ) - reply=( "${__lines_list[@]}" ) + local __svalue + integer __ivalue + LANG=C .fast-run-command "git help -a" chroma-${FAST_HIGHLIGHT[chroma-current]}-subcmd-list "" $(( 15 * 60 )) + + if [[ "${__lines_list[1]}" = See* ]]; then + # (**) + # git >= v2.20, the aliases in the `git help -a' command + __lines_list=( ${${${${(M)__lines_list[@]:#([[:space:]](#c3,3)[a-zA-Z0-9_]*|Command aliases)}##[[:space:]]##}//(#s)Command\ aliases(#e)/Command_aliases}} ) + __svalue="+${__lines_list[(I)Command_aliases]}" + __lines_list[1,__svalue-1]=( ${(@)__lines_list[1,__svalue-1]%%[[:space:]]##*} ) + else + # (**) + # git < v2.20, add aliases through extra code + __lines_list=( ${(s: :)${(M)__lines_list[@]:# [a-z]*}} ) + __svalue=${#__lines_list} + # This allows to check if the command is an alias - we want to + # highlight the aliased command just like the target command of the alias + .fast-run-command "+git config --get-regexp 'alias.*'" chroma-${FAST_HIGHLIGHT[chroma-current]}-alias-list "[[:space:]]#alias." $(( 15 * 60 )) + fi + + __tmp=${#__lines_list} + typeset -ga fsh__chroma__git__aliases + fsh__chroma__git__aliases=( ${__lines_list[__svalue+1,__tmp]} ) + [[ ${__lines_list[__svalue]} != "Command_aliases" ]] && (( ++ __svalue, __ivalue=0, 1 )) || (( __ivalue=1 )) + __lines_list[__svalue,__tmp]=( ${(@)__lines_list[__svalue+__ivalue,__tmp]%%[[:space:]]##*} ) + reply=( "${__lines_list[@]}" ) } # A generic handler →chroma/-git-verify-remote() { - local _wrd="$4" - .fast-run-git-command "git remote" "chroma-git-remotes-$PWD" "" 10 - [[ -n ${__lines_list[(r)$_wrd]} ]] && { - __style=${FAST_THEME_NAME}correct-subtle; return 0 - } || { - [[ $_wrd != *:* ]] && { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } - } + local _wrd="$4" + .fast-run-git-command "git remote" "chroma-git-remotes-$PWD" "" 10 + [[ -n ${__lines_list[(r)$_wrd]} ]] && { + __style=${FAST_THEME_NAME}correct-subtle; return 0 + } || { + [[ $_wrd != *:* ]] && { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } + } } # A generic handler - checks if given ref is correct →chroma/-git-verify-ref() { - local _wrd="$4" - _wrd="${_wrd%%:*}" - .fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-refs-$PWD" "refs/heads" 10 - [[ -n ${__lines_list[(r)$_wrd]} ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } + local _wrd="$4" + _wrd="${_wrd%%:*}" + .fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-refs-$PWD" "refs/heads" 10 + [[ -n ${__lines_list[(r)$_wrd]} ]] && \ + { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ + { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } } # A generic handler - checks if given remote or group is correct →chroma/-git-verify-remote-or-group() { - →chroma/-git-verify-remote "$@" && return 0 - # The check for a group is to follow below - integer _start="$2" _end="$3" - local _scmd="$1" _wrd="$4" + →chroma/-git-verify-remote "$@" && return 0 + # The check for a group is to follow below + integer _start="$2" _end="$3" + local _scmd="$1" _wrd="$4" } # A generic handler - checks whether the file exists →chroma/-git-verify-file() { - integer _start="$2" _end="$3" __pos __start __end - local _wrd="$4" bg - - [[ -f $_wrd ]] && { - (( __start=_start, __end=_end, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") - bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*} + integer _start="$2" _end="$3" __pos __start __end + local _wrd="$4" bg + + [[ -f $_wrd ]] && { + (( __start=_start, __end=_end, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") + bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*} + ((1)) + } || { + (( __start=_start, __end=_end, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*} + } + + [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \ + ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \ + ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} + ]] && \ + for (( __pos = 1; __pos <= (_end-_start); __pos++ )) { + [[ ${_wrd[__pos]} == "/" ]] && { + [[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && { + (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ + reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}") ((1)) - } || { - (( __start=_start, __end=_end, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*} + } || { + (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ + reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}") + } } - - [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \ - ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \ - ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} - ]] && \ - for (( __pos = 1; __pos <= (_end-_start); __pos++ )) { - [[ ${_wrd[__pos]} == "/" ]] && { - [[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && { - (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ - reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}") - ((1)) - } || { - (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ - reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}") - } - } - } + } } # A generic handler - checks whether the file exists →chroma/-git-verify-file-or-dir() { - integer _start="$2" _end="$3" __pos __start __end retval - local _wrd="$4" bg - - __style= - [[ -f $_wrd || -d $_wrd ]] && { - (( __start=_start, __end=_end, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") - bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*} + integer _start="$2" _end="$3" __pos __start __end retval + local _wrd="$4" bg + + __style= + [[ -f $_wrd || -d $_wrd ]] && { + (( __start=_start, __end=_end, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") + bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]%bg=*} + ((1)) + } || { + (( __start=_start, __end=_end, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*} + retval=1 + } + + [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \ + ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \ + ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} + ]] && \ + for (( __pos = 1; __pos <= (_end-_start); __pos++ )) { + [[ ${_wrd[__pos]} == "/" ]] && { + [[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && { + (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ + reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}") ((1)) - } || { - (( __start=_start, __end=_end, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - bg=${(M)FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]%bg=*} - retval=1 + } || { + (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ + reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}") + } } - - [[ -n ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} && \ - ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path]} != \ - ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} - ]] && \ - for (( __pos = 1; __pos <= (_end-_start); __pos++ )) { - [[ ${_wrd[__pos]} == "/" ]] && { - [[ ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]} = *bg=* ]] && { - (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ - reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}") - ((1)) - } || { - (( __start=_start+__pos-__PBUFLEN, __start >= 0 )) && \ - reply+=("$(( __start - 1 )) $__start ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}path_pathseparator]}${bg:+,$bg}") - } - } - } - return $retval + } + return $retval } →chroma/-git-verify-branch() { - local _wrd="$4" - .fast-run-git-command "git for-each-ref --format='%(refname:short)'" "chroma-git-branches-$PWD" "refs/heads" 10 - if [[ -n ${__lines_list[(r)$_wrd]} ]] { - __style=${FAST_THEME_NAME}correct-subtle; return 0 - } elif [[ -n ${__lines_list[(r)origin/$_wrd]} ]] { - __style=${FAST_THEME_NAME}correct-subtle; return 0 - } else { - __style=${FAST_THEME_NAME}incorrect-subtle; return 1 - } + local _wrd="$4" + .fast-run-git-command "git for-each-ref --format='%(refname:short)'" "chroma-git-branches-$PWD" "refs/heads" 10 + if [[ -n ${__lines_list[(r)$_wrd]} ]] { + __style=${FAST_THEME_NAME}correct-subtle; return 0 + } elif [[ -n ${__lines_list[(r)origin/$_wrd]} ]] { + __style=${FAST_THEME_NAME}correct-subtle; return 0 + } else { + __style=${FAST_THEME_NAME}incorrect-subtle; return 1 + } } →chroma/-git-verify-also-unfetched-ref() { - local _wrd="$4" - .fast-run-git-command "git config --get checkout.defaultRemote" \ - "chroma-git-defaultRemote-$PWD" "" 10 - local remote="${__lines_list[1]:-origin}" - .fast-run-git-command "git rev-list --count --no-walk - --glob=\"refs/remotes/$remote/$_wrd\"" \ - "chroma-git-unfetched-ref-$PWD" "" 10 - - (( __lines_list[1] )) && { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } + local _wrd="$4" + .fast-run-git-command "git config --get checkout.defaultRemote" "chroma-git-defaultRemote-$PWD" "" 10 + local remote="${__lines_list[1]:-origin}" + .fast-run-git-command "git rev-list --count --no-walk --glob=\"refs/remotes/$remote/$_wrd\"" \ + "chroma-git-unfetched-ref-$PWD" "" 10 + + (( __lines_list[1] )) && { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ + { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } } # A generic handler →chroma/-git-file-or-ubranch-or-commit-verify() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file "$@" && return - →chroma/-git-verify-branch "$@" && return - →chroma/-git-verify-also-unfetched-ref "$@" + →chroma/-git-verify-commit "$@" && return + →chroma/-git-verify-file "$@" && return + →chroma/-git-verify-branch "$@" && return + →chroma/-git-verify-also-unfetched-ref "$@" } # A generic handler →chroma/-git-file-or-dir-or-ubranch-or-commit-verify() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file-or-dir "$@" && return - →chroma/-git-verify-branch "$@" && return - →chroma/-git-verify-also-unfetched-ref "$@" + →chroma/-git-verify-commit "$@" && return + →chroma/-git-verify-file-or-dir "$@" && return + →chroma/-git-verify-branch "$@" && return + →chroma/-git-verify-also-unfetched-ref "$@" } # A generic handler →chroma/-git-verify-correct-branch-name() { - local _wrd="$4" - →chroma/-git-verify-commit "$@" && \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } + local _wrd="$4" + →chroma/-git-verify-commit "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } - →chroma/-git-verify-remote "$@" && \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } + →chroma/-git-verify-remote "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } - [[ "$_wrd" != ./* && "$_wrd" != *..* && "$_wrd" != *[~\^\ $'\t']* && - "$_wrd" != */ && "$_wrd" != *.lock && "$_wrd" != *\\* ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } + [[ "$_wrd" != ./* && "$_wrd" != *..* && "$_wrd" != *[~\^\ $'\t']* && \ + "$_wrd" != */ && "$_wrd" != *.lock && "$_wrd" != *\\* ]] && \ + { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ + { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } } # A generic handler that checks if given commit reference is correct →chroma/-git-verify-commit() { - local _wrd="$4" - __lines_list=() - .fast-run-git-command --status "git rev-parse --verify --quiet \"$_wrd\"" \ - "chroma-git-commits-$PWD-$_wrd" "" $(( 1.5 * 60 )) - if (( __lines_list[1] == 0 )); then - __style=${FAST_THEME_NAME}correct-subtle - return 0 - fi - __style=${FAST_THEME_NAME}incorrect-subtle - return 1 + local _wrd="$4" + __lines_list=() + .fast-run-git-command --status "git rev-parse --verify --quiet \"$_wrd\"" \ + "chroma-git-commits-$PWD-$_wrd" "" $(( 1.5 * 60 )) + if (( __lines_list[1] == 0 )); then + __style=${FAST_THEME_NAME}correct-subtle + return 0 + fi + __style=${FAST_THEME_NAME}incorrect-subtle + return 1 } # A generic handler that checks if given commit reference # is correct or if it's a file that exists →chroma/-git-verify-commit-or-file() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file "$@" + →chroma/-git-verify-commit "$@" && return + →chroma/-git-verify-file "$@" } # A generic handler that checks if given commit reference # is correct or if it's a file or directives that exists →chroma/-git-verify-commit-or-file-or-dir() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file-or-dir "$@" + →chroma/-git-verify-commit "$@" && return + →chroma/-git-verify-file-or-dir "$@" } # A generic handler that checks if given revision range # is correct or if a file of that name exists →chroma/-git-verify-rev-range-or-file() { - local _wrd="$4" - - →chroma/-git-verify-commit "$@" && return 0 - - if [[ "$_wrd" = *..* ]]; then - (( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] )) && { - →chroma/-git-verify-file "$@" && return 0 - __style=${FAST_THEME_NAME}unknown-token - return 1 - } - - __style="" - return 0 - fi + local _wrd="$4" + →chroma/-git-verify-commit "$@" && return 0 + + if [[ "$_wrd" = *..* ]]; then + (( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] )) && { + →chroma/-git-verify-file "$@" && return 0 + __style=${FAST_THEME_NAME}unknown-token + return 1 + } + __style="" + return 0 + fi - →chroma/-git-verify-file "$@" && \ - { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } + →chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } - __style="" - return 1 + __style="" + return 1 } →chroma/-git-verify-tag-name() { - local _wrd="$4" - .fast-run-git-command "git tag" "chroma-git-tags-$PWD" "" $(( 2*60 )) - [[ -n ${__lines_list[(r)$_wrd]} ]] && \ - __style=${FAST_THEME_NAME}correct-subtle || \ - __style=${FAST_THEME_NAME}incorrect-subtle + local _wrd="$4" + .fast-run-git-command "git tag" "chroma-git-tags-$PWD" "" $(( 2*60 )) + [[ -n ${__lines_list[(r)$_wrd]} ]] && \ + __style=${FAST_THEME_NAME}correct-subtle || __style=${FAST_THEME_NAME}incorrect-subtle } # A handler for the commit's -m/--message options.Currently # does the same what →chroma/main-chroma-std-aopt-action does →chroma/-git-commit-msg-opt-action() { - →chroma/main-chroma-std-aopt-action "$@" + →chroma/main-chroma-std-aopt-action "$@" } # A handler for the commit's -m/--message options' argument →chroma/-git-commit-msg-opt-ARG-action() { - integer _start="$2" _end="$3" - local _scmd="$1" _wrd="$4" - - (( __start >= 0 )) || return - - # Match the message body in case of an --message= option - if [[ "$_wrd" = (#b)(--message=)(*) && -n "${match[2]}" ]]; then - _wrd="${(Q)${match[2]//\`/x}}" - # highlight --message=>>something<< - reply+=("$(( __start+10 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") - elif [[ "$_wrd" != --message ]]; then - # highlight the message's body - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") - fi - - integer length=${FAST_HIGHLIGHT[git-cmsg-len]:-50} - - if (( ${#_wrd} > length )); then - for (( __idx1 = 1, __idx2 = 1; __idx1 <= length; ++ __idx1, ++ __idx2 )); do - # Use __arg from the fast-highlight-process's scope - while [[ "${__arg[__idx2]}" != "${_wrd[__idx1]}" ]]; do - (( ++ __idx2 )) - (( __idx2 > __asize )) && { __idx2=-1; break; } - done - (( __idx2 == -1 )) && break - done - if (( __idx2 != -1 )); then - if [[ -n "${match[1]}" ]]; then - reply+=("$(( __start+__idx2 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - else - reply+=("$(( __start+__idx2-1 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - fi - fi + integer _start="$2" _end="$3" + local _scmd="$1" _wrd="$4" + + (( __start >= 0 )) || return + + # Match the message body in case of an --message= option + if [[ "$_wrd" = (#b)(--message=)(*) && -n "${match[2]}" ]]; then + _wrd="${(Q)${match[2]//\`/x}}" + # highlight --message=>>something<< + reply+=("$(( __start+10 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") + elif [[ "$_wrd" != --message ]]; then + # highlight the message's body + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") + fi + + integer length=${FAST_HIGHLIGHT[git-cmsg-len]:-70} + + if (( ${#_wrd} > length )); then + for (( __idx1 = 1, __idx2 = 1; __idx1 <= length; ++ __idx1, ++ __idx2 )); do + # Use __arg from the fast-highlight-process's scope + while [[ "${__arg[__idx2]}" != "${_wrd[__idx1]}" ]]; do + (( ++ __idx2 )) + (( __idx2 > __asize )) && { __idx2=-1; break; } + done + (( __idx2 == -1 )) && break + done + if (( __idx2 != -1 )); then + if [[ -n "${match[1]}" ]]; then + reply+=("$(( __start+__idx2 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + else + reply+=("$(( __start+__idx2-1 )) $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + fi fi + fi } # A RESET handler # TODO: differentiate tree-ish from commit →chroma/-git-RESET-verify-commit-or-file() { - →chroma/-git-verify-commit "$@" && { - →chroma/-git-verify-file "$@" && { - # TODO: with -p/--patch, the are optional, - # and this argument will be taken as a commit in a - # specific circumstances - FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1 - return 0 - } - - (( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] || - FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit] )) && \ - { __style=${FAST_THEME_NAME}unknown-token; return 1; } - - FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=1 + →chroma/-git-verify-commit "$@" && { + →chroma/-git-verify-file "$@" && { + # TODO: with -p/--patch, the are optional, + # and this argument will be taken as a commit in a + # specific circumstances + FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1 + return 0 + } - __style=${FAST_THEME_NAME}correct-subtle + (( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] || FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit] )) && \ + { __style=${FAST_THEME_NAME}unknown-token; return 1; } - return 0 - } + FAST_HIGHLIGHT[chroma-git-reset-etc-saw-commit]=1 + __style=${FAST_THEME_NAME}correct-subtle + return 0 + } - →chroma/-git-verify-file "$@" && \ - { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } + →chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } - return 1 + return 1 } return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-grep.ch" "b/\342\206\222chroma/-grep.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-hub.ch" "b/\342\206\222chroma/-hub.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-ionice.ch" "b/\342\206\222chroma/-ionice.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-lab.ch" "b/\342\206\222chroma/-lab.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-make.ch" "b/\342\206\222chroma/-make.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-nice.ch" "b/\342\206\222chroma/-nice.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-nmcli.ch" "b/\342\206\222chroma/-nmcli.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-node.ch" "b/\342\206\222chroma/-node.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-ogit.ch" "b/\342\206\222chroma/-ogit.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-perl.ch" "b/\342\206\222chroma/-perl.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-precommand.ch" "b/\342\206\222chroma/-precommand.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-printf.ch" "b/\342\206\222chroma/-printf.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-ruby.ch" "b/\342\206\222chroma/-ruby.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-scp.ch" "b/\342\206\222chroma/-scp.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-sh.ch" "b/\342\206\222chroma/-sh.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-source.ch" "b/\342\206\222chroma/-source.ch" old mode 100644 new mode 100755 index fb6614f..2ab8c08 --- "a/\342\206\222chroma/-source.ch" +++ "b/\342\206\222chroma/-source.ch" @@ -24,39 +24,38 @@ integer __idx1 __idx2 # First call, i.e. command starts, i.e. "grep" token etc. (( __first_call )) && { - FAST_HIGHLIGHT[chroma-src-counter]=0 - __style=${FAST_THEME_NAME}builtin + FAST_HIGHLIGHT[chroma-src-counter]=0 + __style=${FAST_THEME_NAME}builtin -} || { - # Following call, i.e. not the first one. + } || { - # Check if chroma should end – test if token is of type - # "starts new command", if so pass-through – chroma ends - [[ "$__arg_type" = 3 ]] && return 2 + # Following call, i.e. not the first one. + # Check if chroma should end – test if token is of type + # "starts new command", if so pass-through – chroma ends + [[ "$__arg_type" = 3 ]] && return 2 - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - fi - - if [[ "$__wrd" = -* ]]; then - # Detected option, add style for it. - [[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ - __style=${FAST_THEME_NAME}single-hyphen-option - else - # Count non-option tokens. - (( FAST_HIGHLIGHT[chroma-src-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-src-counter] )) + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + fi - if (( FAST_HIGHLIGHT[chroma-src-counter] == 1 )); then - command mkdir -p "$__home" - command cp -f "${__wrd}" "$__home" 2>/dev/null && { - zcompile "$__home"/"${__wrd:t}" 2>/dev/null 1>&2 && __style=${FAST_THEME_NAME}correct-subtle || __style=${FAST_THEME_NAME}incorrect-subtle - } - elif (( FAST_HIGHLIGHT[chroma-src-counter] == 2 )); then - # Handle paths, etc. normally - just pass-through to the big - # highlighter (the main FSH highlighter, used before chromas). - return 1 - fi + if [[ "$__wrd" = -* ]]; then + # Detected option, add style for it. + [[ "$__wrd" = --* ]] && \ + __style=${FAST_THEME_NAME}double-hyphen-option || __style=${FAST_THEME_NAME}single-hyphen-option + else + # Count non-option tokens. + (( FAST_HIGHLIGHT[chroma-src-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-src-counter] )) + if (( FAST_HIGHLIGHT[chroma-src-counter] == 1 )); then + command mkdir -p "$__home" + command cp -f "${__wrd}" "$__home" 2>/dev/null && { + zcompile "$__home"/"${__wrd:t}" 2>/dev/null 1>&2 && \ + __style=${FAST_THEME_NAME}correct-subtle || __style=${FAST_THEME_NAME}incorrect-subtle + } + elif (( FAST_HIGHLIGHT[chroma-src-counter] == 2 )); then + # Handle paths, etc. normally - just pass-through to the big highlighter (the main FSH highlighter, used before chromas). + return 1 fi + fi } # Add region_highlight entry (via `reply' array). @@ -70,4 +69,4 @@ integer __idx1 __idx2 (( this_word = next_word )) _start_pos=$_end_pos -return 0 \ No newline at end of file +return 0 diff --git "a/\342\206\222chroma/-ssh.ch" "b/\342\206\222chroma/-ssh.ch" old mode 100644 new mode 100755 index 6be459f..cec0d65 --- "a/\342\206\222chroma/-ssh.ch" +++ "b/\342\206\222chroma/-ssh.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Copyright (C) 2019 by Philippe Troin (F-i-f on GitHub) # @@ -16,8 +17,8 @@ # $4 - a private copy of $_end_pos from the above scope # -emulate -LR zsh -setopt extended_glob warn_create_global typeset_silent +builtin emulate -LR zsh ${=${options[xtrace]:#off}:+-o xtrace} +builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd # This chroma guards that port number isn't passed in hostname (no :{port} occurs). @@ -155,5 +156,3 @@ local -a match mbegin mend completions_users completions_host _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-subcommand.ch" "b/\342\206\222chroma/-subcommand.ch" old mode 100644 new mode 100755 index 2e64851..36602bb --- "a/\342\206\222chroma/-subcommand.ch" +++ "b/\342\206\222chroma/-subcommand.ch" @@ -1,5 +1,6 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 @@ -24,5 +25,3 @@ fi _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-subversion.ch" "b/\342\206\222chroma/-subversion.ch" old mode 100644 new mode 100755 index fc5ee47..40559c8 --- "a/\342\206\222chroma/-subversion.ch" +++ "b/\342\206\222chroma/-subversion.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # ------------------------------------------------------------------------------------------------- # Copyright (c) 2018 Sebastian Gniazdowski @@ -247,5 +248,3 @@ integer __idx1 __idx2 _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-vim.ch" "b/\342\206\222chroma/-vim.ch" old mode 100644 new mode 100755 index 9627043..0a35cc7 --- "a/\342\206\222chroma/-vim.ch" +++ "b/\342\206\222chroma/-vim.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Chroma for vim, shows last opened files under prompt. # @@ -46,5 +47,3 @@ local -a __viminfo _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-whatis.ch" "b/\342\206\222chroma/-whatis.ch" old mode 100644 new mode 100755 diff --git "a/\342\206\222chroma/-which.ch" "b/\342\206\222chroma/-which.ch" old mode 100644 new mode 100755 index a7209c0..b0dc082 --- "a/\342\206\222chroma/-which.ch" +++ "b/\342\206\222chroma/-which.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Outputs (under prompt) result of query done with `which', `type -w', # `whence -v', `whereis', `whatis'. @@ -91,5 +92,3 @@ local -a __results _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-zi.ch" "b/\342\206\222chroma/-zi.ch" old mode 100644 new mode 100755 index 4af0adb..3f77240 --- "a/\342\206\222chroma/-zi.ch" +++ "b/\342\206\222chroma/-zi.ch" @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Chroma function for command `zi'. It colorizes the part of command line that holds `zi' invocation. @@ -346,5 +347,3 @@ fsh__zi__chroma__def=( } return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-zinit.ch" "b/\342\206\222chroma/-zinit.ch" deleted file mode 100644 index 73e0005..0000000 --- "a/\342\206\222chroma/-zinit.ch" +++ /dev/null @@ -1,377 +0,0 @@ -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# -# Chroma function for command `git'. It colorizes the part of command -# line that holds `git' invocation. - -(( FAST_HIGHLIGHT[-zinit.ch-chroma-def] )) && return 1 - -FAST_HIGHLIGHT[-zinit.ch-chroma-def]=1 - -typeset -gA fsh__zinit__chroma__def -fsh__zinit__chroma__def=( - ## - ## No subcommand - ## - ## {{{ - - subcmd:NULL "NULL_0_opt" - NULL_0_opt "(-help|--help|-h) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - "subcommands" "(help|man|self-update|cd|times|zstatus|load|light|unload|snippet|ls|ice||update|status|report|delete|loaded|list|cd|create|edit|glance|stress|changes|recently|clist|completions|cdisable|cname|cenable|cname|creinstall|cuninstall|csearch|compinit|dtrace|dstart|dstop|dunload|dreport|dclear|compile|uncompile|compiled|cdlist|cdreplay|cdclear|srv|recall|env-whitelist|bindkeys|module)" - - ## }}} - - # Generic actions - NO_MATCH_\#_opt "* <<>> __style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP" - NO_MATCH_\#_arg "__style=\${FAST_THEME_NAME}incorrect-subtle // NO-OP" - - - ## - ## `ice' - ## - ## {{{ - - subcmd:ice "ICE_#_arg // NO_MATCH_#_opt" - - "ICE_#_arg" "NO-OP // ::→chroma/-zinit-check-ice-mod" - - ## }}} - - ## - ## `snippet' - ## - ## {{{ - - subcmd:snippet "SNIPPET_0_opt // SNIPPET_1_arg // NO_MATCH_#_opt // - NO_MATCH_#_arg" - - SNIPPET_0_opt "(-f|--command) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - SNIPPET_1_arg "NO-OP // ::→chroma/-zinit-verify-snippet" - - ## }}} - - ## - ## `load' - ## - ## {{{ - - "subcmd:load" - "LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - LOAD_1_arg "NO-OP // ::→chroma/-zinit-verify-plugin" - - LOAD_2_arg "NO-OP // ::→chroma/-zinit-verify-plugin" - - ## }}} - - ## - ## `compile|uncompile|stress|edit|glance|recall|status|cd|changes` - ## - ## {{{ - - "subcmd:(compile|uncompile|stress|edit|glance|recall|status|cd|changes)" - "PLGSNP_1_arg // PLGSNP_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - PLGSNP_1_arg "NO-OP // ::→chroma/-zinit-verify-plugin-or-snippet" - - PLGSNP_2_arg "NO-OP // ::→chroma/-zinit-verify-plugin-or-snippet" - - ## }}} - - ## - ## `update' - ## - ## {{{ - - subcmd:update "UPDATE_0_opt // PLGSNP_1_arg // PLGSNP_2_arg // - NO_MATCH_#_opt // NO_MATCH_#_arg" - - UPDATE_0_opt " - (--all|-r|--reset|-q|--quiet|-p|--parallel) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - ## }}} - - ## - ## `light' - ## - ## {{{ - - subcmd:light "LIGHT_0_opt // LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt // - NO_MATCH_#_arg" - - LIGHT_0_opt "-b - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - ## }}} - - ## - ## `unload' - ## - ## {{{ - - subcmd:unload "UNLOAD_0_opt // UNLOAD_1_arg // UNLOAD_2_arg // NO_MATCH_#_opt // - NO_MATCH_#_arg" - - UNLOAD_0_opt "-q - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - UNLOAD_1_arg "NO-OP // ::→chroma/-zinit-verify-loaded-plugin" - - UNLOAD_2_arg "NO-OP // ::→chroma/-zinit-verify-loaded-plugin" - - ## }}} - - ## - ## `report' - ## - ## {{{ - - subcmd:report "REPORT_0_opt // UNLOAD_1_arg // UNLOAD_2_arg // NO_MATCH_#_opt // - NO_MATCH_#_arg" - - REPORT_0_opt "--all - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - ## }}} - - ## - ## `delete' - ## - ## {{{ - - "subcmd:delete" - "DELETE_0_opt // PLGSNP_1_arg // PLGSNP_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - DELETE_0_opt " - (--all|--clean|-y|--yes|-q|--quiet) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - - ## }}} - - ## - ## `cenable' - ## - ## {{{ - - subcmd:cenable "COMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - COMPLETION_1_arg "NO-OP // ::→chroma/-zinit-verify-disabled-completion" - - ## }}} - - ## - ## `cdisable' - ## - ## {{{ - - subcmd:cdisable "DISCOMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - DISCOMPLETION_1_arg "NO-OP // ::→chroma/-zinit-verify-completion" - - ## }}} - - - ## - ## `light' - ## - ## {{{ - - subcmd:uncompile "UNCOMPILE_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - - UNCOMPILE_1_arg "NO-OP // ::→chroma/-zinit-verify-compiled-plugin" - - ## }}} - - ## - ## `*' - ## - ## {{{ - - "subcmd:*" "CATCH_ALL_#_opt" - "CATCH_ALL_#_opt" "* <<>> NO-OP // ::→chroma/main-chroma-std-aopt-SEMI-action" - - ## }}} -) - -#→chroma/-zinit-first-call() { - # This is being done in the proper place - in -fast-highlight-process - #FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]=0 -#} - -→chroma/-zinit-verify-plugin() { - local _scmd="$1" _wrd="$4" - - [[ -d "$_wrd" ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } - - typeset -a plugins - plugins=( "${ZINIT[PLUGINS_DIR]}"/*(N:t) ) - plugins=( "${plugins[@]//---//}" ) - plugins=( "${plugins[@]:#_local/zinit}" ) - plugins=( "${plugins[@]:#custom}" ) - - [[ -n "${plugins[(r)$_wrd]}" ]] && \ - __style=${FAST_THEME_NAME}correct-subtle || \ - return 1 - #__style=${FAST_THEME_NAME}incorrect-subtle - return 0 -} - -→chroma/-zinit-verify-plugin-or-snippet() { - →chroma/-zinit-verify-plugin "$1" "" "" "$4" || \ - →chroma/-zinit-verify-snippet "$1" "" "" "$4" - return $? -} - -→chroma/-zinit-verify-loaded-plugin() { - local _scmd="$1" _wrd="$4" - typeset -a plugins absolute1 absolute2 absolute3 normal - plugins=( "${ZINIT_REGISTERED_PLUGINS[@]:#_local/zinit}" ) - normal=( "${plugins[@]:#%*}" ) - absolute1=( "${(M)plugins[@]:#%*}" ) - absolute1=( "${absolute1[@]/\%\/\//%/}" ) - local hm="${HOME%/}" - absolute2=( "${absolute1[@]/$hm/HOME}" ) - absolute3=( "${absolute1[@]/\%/}" ) - plugins=( $absolute1 $absolute2 $absolute3 $normal ) - - [[ -n "${plugins[(r)$_wrd]}" ]] && \ - __style=${FAST_THEME_NAME}correct-subtle || \ - return 1 - #__style=${FAST_THEME_NAME}incorrect-subtle - - return 0 -} - -→chroma/-zinit-verify-completion() { - local _scmd="$1" _wrd="$4" - # Find enabled completions - typeset -a completions - completions=( "${ZINIT[COMPLETIONS_DIR]}"/_*(N:t) ) - completions=( "${completions[@]#_}" ) - - [[ -n "${completions[(r)${_wrd#_}]}" ]] && \ - __style=${FAST_THEME_NAME}correct-subtle || \ - return 1 - - return 0 -} - -→chroma/-zinit-verify-disabled-completion() { - local _scmd="$1" _wrd="$4" - # Find enabled completions - typeset -a completions - completions=( "${ZINIT[COMPLETIONS_DIR]}"/[^_]*(N:t) ) - - [[ -n "${completions[(r)${_wrd#_}]}" ]] && \ - __style=${FAST_THEME_NAME}correct-subtle || \ - return 1 - - return 0 -} - -→chroma/-zinit-verify-compiled-plugin() { - local _scmd="$1" _wrd="$4" - - typeset -a plugins - plugins=( "${ZINIT[PLUGINS_DIR]}"/*(N) ) - - typeset -a show_plugins p matches - for p in "${plugins[@]}"; do - matches=( $p/*.zwc(N) ) - if [ "$#matches" -ne "0" ]; then - p="${p:t}" - [[ "$p" = (_local---zinit|custom) ]] && continue - p="${p//---//}" - show_plugins+=( "$p" ) - fi - done - - [[ -n "${show_plugins[(r)$_wrd]}" ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - return 1 -} - -→chroma/-zinit-verify-snippet() { - local _scmd="$1" url="$4" dirname local_dir - url="${${url#"${url%%[! $'\t']*}"}%/}" - id_as="${FAST_HIGHLIGHT[chroma-zinit-ice-elements-id-as]:-${ZINIT_ICE[id-as]:-$url}}" - - filename="${${id_as%%\?*}:t}" - dirname="${${id_as%%\?*}:t}" - local_dir="${${${id_as%%\?*}:h}/:\/\//--}" - [[ "$local_dir" = "." ]] && local_dir="" || local_dir="${${${${${local_dir#/}//\//--}//=/--EQ--}//\?/--QM--}//\&/--AMP--}" - local_dir="${ZINIT[SNIPPETS_DIR]}${local_dir:+/$local_dir}" - - (( ${+ZINIT_ICE[svn]} || ${FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]} )) && { - # TODO: handle the SVN path's specifics - [[ -d "$local_dir/$dirname" ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - return 1 - } || { - # TODO: handle the non-SVN path's specifics - [[ -d "$local_dir/$dirname" ]] && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - return 1 - } -} - -→chroma/-zinit-check-ice-mod() { - local _scmd="$1" _wrd="$4" - [[ "$_wrd" = (svn(\'|\")*|svn) ]] && \ - FAST_HIGHLIGHT[chroma-zinit-ice-elements-svn]=1 - [[ "$_wrd" = (#b)(id-as(:|)(\'|\")(*)(\'|\")|id-as:(*)|id-as(*)) ]] && \ - FAST_HIGHLIGHT[chroma-zinit-ice-elements-id-as]="${match[4]}${match[6]}${match[7]}" - - # Copy from zinit-autoload.zsh / -zplg-recall - local -a ice_order nval_ices ext_val_ices - ext_val_ices=( ${(@)${(@Ms.|.)ZINIT_EXTS[ice-mods]:#*\'\'*}//\'\'/} ) - - ice_order=( - svn proto from teleid bindmap cloneopts id-as depth if wait load - unload blockf pick bpick src as ver silent lucid notify mv cp - atinit atclone atload atpull nocd run-atpull has cloneonly make - service trackbinds multisrc compile nocompile nocompletions - reset-prompt wrap-track reset sh \!sh bash \!bash ksh \!ksh csh - \!csh aliases countdown ps-on-unload ps-on-update trigger-load - light-mode is-snippet atdelete pack git verbose on-update-of - subscribe param extract - # Include all additional ices – after - # stripping them from the possible: '' - ${(@s.|.)${ZINIT_EXTS[ice-mods]//\'\'/}} - ) - nval_ices=( - blockf silent lucid trackbinds cloneonly nocd run-atpull - nocompletions sh \!sh bash \!bash ksh \!ksh csh \!csh - aliases countdown light-mode is-snippet git verbose - - # Include only those additional ices, - # don't have the '' in their name, i.e. - # aren't designed to hold value - ${(@)${(@s.|.)ZINIT_EXTS[ice-mods]}:#*\'\'*} - - # Must be last - svn - ) - - if [[ "$_wrd" = (#b)(${(~j:|:)${ice_order[@]:#(${(~j:|:)nval_ices[@]:#(${(~j:|:)ext_val_ices[@]})})}})(*) ]]; then - reply+=("$(( __start )) $(( __start+${mend[1]} )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}") - reply+=("$(( __start+${mbegin[2]} )) $(( __end )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-string]}") - -fast-highlight-string - return 0 - elif [[ "$_wrd" = (#b)(${(~j:|:)nval_ices[@]}) ]]; then - __style=${FAST_THEME_NAME}single-hyphen-option - return 0 - else - __style=${FAST_THEME_NAME}incorrect-subtle - return 1 - fi -} - -return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/main-chroma.ch" "b/\342\206\222chroma/main-chroma.ch" old mode 100644 new mode 100755 From ba108447b0113f9e88ed411adec2cc7a406753a7 Mon Sep 17 00:00:00 2001 From: Salvydas Lukosius Date: Sat, 7 Jan 2023 10:06:57 +0000 Subject: [PATCH 2/5] modified: .zunit.yml --- .github/workflows/zsh-n.yml | 2 +- .github/workflows/zunit.yml | 16 +- .gitignore | 1 + .trunk/trunk.yaml | 2 +- .zunit.yml | 2 - F-Sy-H.plugin.zsh | 84 +- .../-alias.ch" => chroma/-alias.ch | 4 +- chroma/-autoload.ch | 103 + chroma/-autorandr.ch | 24 + chroma/-awk.ch | 106 + .../-docker.ch" => chroma/-docker.ch | 0 .../-example.ch" => chroma/-example.ch | 10 +- .../-fast-theme.ch" => chroma/-fast-theme.ch | 10 +- .../-fpath_peq.ch" => chroma/-fpath_peq.ch | 4 +- .../-git.ch" => chroma/-git.ch | 294 +-- .../-grep.ch" => chroma/-grep.ch | 4 +- .../-hub.ch" => chroma/-hub.ch | 0 .../-ionice.ch" => chroma/-ionice.ch | 0 .../-lab.ch" => chroma/-lab.ch | 0 .../-make.ch" => chroma/-make.ch | 0 .../-nice.ch" => chroma/-nice.ch | 0 .../-nmcli.ch" => chroma/-nmcli.ch | 0 .../-node.ch" => chroma/-node.ch | 0 .../-ogit.ch" => chroma/-ogit.ch | 0 chroma/-perl.ch | 78 + .../-precommand.ch" => chroma/-precommand.ch | 12 +- .../-printf.ch" => chroma/-printf.ch | 0 .../-ruby.ch" => chroma/-ruby.ch | 0 .../-scp.ch" => chroma/-scp.ch | 0 "\342\206\222chroma/-sh.ch" => chroma/-sh.ch | 0 .../-source.ch" => chroma/-source.ch | 4 +- .../-ssh.ch" => chroma/-ssh.ch | 0 .../-subcommand.ch" => chroma/-subcommand.ch | 0 .../-subversion.ch" => chroma/-subversion.ch | 20 +- .../-vim.ch" => chroma/-vim.ch | 0 .../-whatis.ch" => chroma/-whatis.ch | 0 .../-which.ch" => chroma/-which.ch | 0 "\342\206\222chroma/-zi.ch" => chroma/-zi.ch | 58 +- .../main-chroma.ch" => chroma/main-chroma.ch | 151 +- docs/CHANGELOG.md | 10 +- docs/CHROMA_GUIDE.adoc | 2 +- docs/README.md | 4 +- docs/THEME_GUIDE.md | 16 +- functions/.fast-make-targets | 0 functions/.fast-read-ini-file | 0 functions/.fast-run-command | 2 +- functions/.fast-run-git-command | 2 +- functions/.fast-zts-read-all | 0 functions/_fast-theme | 20 +- functions/fast-highlight | 600 +++--- functions/fast-string-highlight | 2 +- functions/fast-theme | 125 +- share/free_theme.zsh | 94 +- share/test/out.parse | 1920 ----------------- share/test/parse.zsh | 279 ++- share/test/to-parse.zsh | 2 +- tests/_output/.gitkeep | 0 tests/_support/.gitkeep | 0 tests/_support/bootstrap | 2 - themes/base16.ini | 82 + themes/z-shell.ini | 6 +- "\342\206\222chroma/-autoload.ch" | 102 - "\342\206\222chroma/-autorandr.ch" | 24 - "\342\206\222chroma/-awk.ch" | 107 - "\342\206\222chroma/-perl.ch" | 79 - 65 files changed, 1308 insertions(+), 3161 deletions(-) mode change 100644 => 100755 F-Sy-H.plugin.zsh rename "\342\206\222chroma/-alias.ch" => chroma/-alias.ch (100%) create mode 100755 chroma/-autoload.ch create mode 100755 chroma/-autorandr.ch create mode 100755 chroma/-awk.ch rename "\342\206\222chroma/-docker.ch" => chroma/-docker.ch (100%) rename "\342\206\222chroma/-example.ch" => chroma/-example.ch (92%) rename "\342\206\222chroma/-fast-theme.ch" => chroma/-fast-theme.ch (83%) rename "\342\206\222chroma/-fpath_peq.ch" => chroma/-fpath_peq.ch (93%) rename "\342\206\222chroma/-git.ch" => chroma/-git.ch (76%) rename "\342\206\222chroma/-grep.ch" => chroma/-grep.ch (95%) rename "\342\206\222chroma/-hub.ch" => chroma/-hub.ch (100%) rename "\342\206\222chroma/-ionice.ch" => chroma/-ionice.ch (100%) rename "\342\206\222chroma/-lab.ch" => chroma/-lab.ch (100%) rename "\342\206\222chroma/-make.ch" => chroma/-make.ch (100%) rename "\342\206\222chroma/-nice.ch" => chroma/-nice.ch (100%) rename "\342\206\222chroma/-nmcli.ch" => chroma/-nmcli.ch (100%) rename "\342\206\222chroma/-node.ch" => chroma/-node.ch (100%) rename "\342\206\222chroma/-ogit.ch" => chroma/-ogit.ch (100%) create mode 100755 chroma/-perl.ch rename "\342\206\222chroma/-precommand.ch" => chroma/-precommand.ch (54%) rename "\342\206\222chroma/-printf.ch" => chroma/-printf.ch (100%) rename "\342\206\222chroma/-ruby.ch" => chroma/-ruby.ch (100%) rename "\342\206\222chroma/-scp.ch" => chroma/-scp.ch (100%) rename "\342\206\222chroma/-sh.ch" => chroma/-sh.ch (100%) rename "\342\206\222chroma/-source.ch" => chroma/-source.ch (94%) rename "\342\206\222chroma/-ssh.ch" => chroma/-ssh.ch (100%) rename "\342\206\222chroma/-subcommand.ch" => chroma/-subcommand.ch (100%) rename "\342\206\222chroma/-subversion.ch" => chroma/-subversion.ch (93%) rename "\342\206\222chroma/-vim.ch" => chroma/-vim.ch (100%) rename "\342\206\222chroma/-whatis.ch" => chroma/-whatis.ch (100%) rename "\342\206\222chroma/-which.ch" => chroma/-which.ch (100%) rename "\342\206\222chroma/-zi.ch" => chroma/-zi.ch (82%) rename "\342\206\222chroma/main-chroma.ch" => chroma/main-chroma.ch (64%) mode change 100644 => 100755 functions/.fast-make-targets mode change 100644 => 100755 functions/.fast-read-ini-file mode change 100644 => 100755 functions/.fast-run-command mode change 100644 => 100755 functions/.fast-run-git-command mode change 100644 => 100755 functions/.fast-zts-read-all mode change 100644 => 100755 share/free_theme.zsh delete mode 100644 share/test/out.parse mode change 100644 => 100755 share/test/to-parse.zsh delete mode 100644 tests/_output/.gitkeep delete mode 100644 tests/_support/.gitkeep delete mode 100644 tests/_support/bootstrap create mode 100644 themes/base16.ini delete mode 100755 "\342\206\222chroma/-autoload.ch" delete mode 100755 "\342\206\222chroma/-autorandr.ch" delete mode 100755 "\342\206\222chroma/-awk.ch" delete mode 100755 "\342\206\222chroma/-perl.ch" diff --git a/.github/workflows/zsh-n.yml b/.github/workflows/zsh-n.yml index 3c0a053..72c2666 100644 --- a/.github/workflows/zsh-n.yml +++ b/.github/workflows/zsh-n.yml @@ -30,7 +30,7 @@ jobs: - name: "⚡ Set matrix output" id: set-matrix run: | - MATRIX="$(find . -type d -name 'doc' -prune -o -type f \( -iname '*.zsh' -o -iname 'fast-*' \) -print | jq -ncR '{"include": [{"file": inputs}]}')" + MATRIX="$(find . -type d -name 'doc' -prune -o -type f \( -iname '*.zsh' -o -iname '*.ch' -o -iname 'fast-*' \) -print | jq -ncR '{"include": [{"file": inputs}]}')" echo "MATRIX=${MATRIX}" >&2 echo "matrix=${MATRIX}" >> $GITHUB_OUTPUT zsh-n: diff --git a/.github/workflows/zunit.yml b/.github/workflows/zunit.yml index 5f21877..78d107d 100644 --- a/.github/workflows/zunit.yml +++ b/.github/workflows/zunit.yml @@ -4,9 +4,21 @@ name: 🛡️ ZUnit on: workflow_dispatch: push: - branches: ["main", "next"] + paths: + - "**/*.ch" + - "**/*.zsh" + - "tests/*" + - "share/*" + - "themes/*" + - "functions/*" pull_request_target: - branches: ["main", "next"] + paths: + - "**/*.ch" + - "**/*.zsh" + - "tests/*" + - "share/*" + - "themes/*" + - "functions/*" jobs: build-macos: diff --git a/.gitignore b/.gitignore index 7fda70a..6711d38 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ test/res hold/* *.zwc ._zi +out.parse ### Vim # Swap diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 55bbe5e..7501d46 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -13,7 +13,7 @@ lint: - git-diff-check - actionlint@1.6.22 - shfmt@3.5.0 - - markdownlint@0.32.2 + - markdownlint@0.33.0 - oxipng@8.0.0 - prettier@2.8.1 ignore: diff --git a/.zunit.yml b/.zunit.yml index e4fd57f..984fc97 100644 --- a/.zunit.yml +++ b/.zunit.yml @@ -1,8 +1,6 @@ tap: false directories: tests: tests - output: tests/_output - support: tests/_support time_limit: 0 fail_fast: false allow_risky: false diff --git a/F-Sy-H.plugin.zsh b/F-Sy-H.plugin.zsh old mode 100644 new mode 100755 index 74ba566..aa5e438 --- a/F-Sy-H.plugin.zsh +++ b/F-Sy-H.plugin.zsh @@ -26,9 +26,8 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- # vim: ft=zsh sw=2 ts=2 et # ------------------------------------------------------------------------------------------------- - - -# Standarized way of handling finding plugin dir, +# +# Standardized way of handling finding plugin dir, # regardless of functionargzero and posixargzero, # and with an option for a plugin manager to alter # the plugin directory (i.e. set ZERO parameter) @@ -38,30 +37,23 @@ 0="${ZERO:-${${0:#$ZSH_ARGZERO}:-${(%):-%N}}}" 0="${${(M)0:#/*}:-$PWD/$0}" -typeset -g FAST_HIGHLIGHT_VERSION=1.66 -typeset -g FAST_BASE_DIR="${0:h}" -typeset -ga _FAST_MAIN_CACHE -# Holds list of indices pointing at brackets that -# are complex, i.e. e.g. part of "[[" in [[ ... ]] -typeset -ga _FAST_COMPLEX_BRACKETS - # Functions Directory # https://wiki.zshell.dev/community/zsh_plugin_standard#funtions-directory if [[ $PMSPEC != *f* ]]; then fpath+=( "${0:h}/functions" ) fi -# Check if Zsh's cache directory exist. -if [[ -n ${ZI[CACHE_DIR]} ]]; then - # Use Zsh's default cache directory. - typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${ZI[CACHE_DIR]}/fsh} -else - # Use common values to set default working directory. - typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/fsh} -fi +typeset -g FAST_HIGHLIGHT_VERSION=1.66 +typeset -g FAST_BASE_DIR="${0:h}" +typeset -ga _FAST_MAIN_CACHE +# Holds list of indices pointing at brackets that are complex, i.e. e.g. part of "[[" in [[ ... ]] +typeset -ga _FAST_COMPLEX_BRACKETS + +# Allow user to override the working directory, +# but default to $XDG_CACHE_HOME/f-sy-h and fall back to $FAST_BASE_DIR. +typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${XDG_CACHE_HOME:-~/.cache}/f-sy-h} : ${FAST_WORK_DIR:=$FAST_BASE_DIR} -# Expand any tilde in the (supposed) path. FAST_WORK_DIR=${~FAST_WORK_DIR} # Create working directory if it doesn't exist. @@ -81,7 +73,7 @@ _zsh_highlight() { fi builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd + builtin setopt extended_glob typeset_silent no_short_loops rc_quotes no_auto_pushd local REPLY # don't leak $REPLY into global scope local -a reply @@ -140,13 +132,16 @@ _zsh_highlight() { fi # yank / paste (zsh-5.1.1 and newer) - (( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END" + (( $+YANK_ACTIVE )) && (( YANK_ACTIVE )) && \ + _zsh_highlight_apply_zle_highlight paste standout "$YANK_START" "$YANK_END" # isearch - (( $+ISEARCHMATCH_ACTIVE )) && (( ISEARCHMATCH_ACTIVE )) && _zsh_highlight_apply_zle_highlight isearch underline "$ISEARCHMATCH_START" "$ISEARCHMATCH_END" + (( $+ISEARCHMATCH_ACTIVE )) && (( ISEARCHMATCH_ACTIVE )) && \ + _zsh_highlight_apply_zle_highlight isearch underline "$ISEARCHMATCH_START" "$ISEARCHMATCH_END" # suffix - (( $+SUFFIX_ACTIVE )) && (( SUFFIX_ACTIVE )) && _zsh_highlight_apply_zle_highlight suffix bold "$SUFFIX_START" "$SUFFIX_END" + (( $+SUFFIX_ACTIVE )) && (( SUFFIX_ACTIVE )) && \ + _zsh_highlight_apply_zle_highlight suffix bold "$SUFFIX_START" "$SUFFIX_END" return $ret @@ -202,7 +197,9 @@ _zsh_highlight_apply_zle_highlight() { # # Returns 0 if the buffer has changed since _zsh_highlight was last called. _zsh_highlight_buffer_modified() { - [[ "${_ZSH_HIGHLIGHT_PRIOR_BUFFER:-}" != "$BUFFER" ]] || [[ "$REGION_ACTIVE" != "$_ZSH_HIGHLIGHT_PRIOR_RACTIVE" ]] || { _zsh_highlight_cursor_moved && [[ "$REGION_ACTIVE" = 1 || "$REGION_ACTIVE" = 2 ]] } + [[ "${_ZSH_HIGHLIGHT_PRIOR_BUFFER:-}" != "$BUFFER" ]] || \ + [[ "$REGION_ACTIVE" != "$_ZSH_HIGHLIGHT_PRIOR_RACTIVE" ]] || \ + { _zsh_highlight_cursor_moved && [[ "$REGION_ACTIVE" = 1 || "$REGION_ACTIVE" = 2 ]] } } # Whether the cursor has moved or not. @@ -228,7 +225,7 @@ _zsh_highlight_call_widget() { # Rebind all ZLE widgets to make them invoke _zsh_highlights. _zsh_highlight_bind_widgets() { - setopt localoptions noksharrays + builtin setopt local_options no_ksh_arrays local -F2 SECONDS local prefix=orig-s${SECONDS/./}-r$(( RANDOM % 1000 )) # unique each time, in case we're sourced more than once @@ -301,7 +298,7 @@ _zsh_highlight_bind_widgets || { return 1 } -# Reset scratch variables when commandline is done. +# Reset scratch variables when command line is done. _zsh_highlight_preexec_hook() { typeset -g _ZSH_HIGHLIGHT_PRIOR_BUFFER= typeset -gi _ZSH_HIGHLIGHT_PRIOR_CURSOR=0 @@ -314,29 +311,28 @@ add-zsh-hook preexec _zsh_highlight_preexec_hook 2>/dev/null || { print -r -- >&2 'zsh-syntax-highlighting: failed loading add-zsh-hook.' } -/fshdbg() { +/f-sy-h-debug() { print -r -- "$@" >>! /tmp/reply } -ZSH_HIGHLIGHT_MAXLENGTH=10000 +typeset -g ZSH_HIGHLIGHT_MAXLENGTH=10000 # Load zsh/parameter module if available zmodload zsh/parameter 2>/dev/null zmodload zsh/system 2>/dev/null autoload -Uz -- is-at-least fast-theme \ - _fast-theme .fast-read-ini-file .fast-run-git-command \ + .fast-read-ini-file .fast-run-git-command \ .fast-make-targets .fast-run-command .fast-zts-read-all -autoload -Uz -- →chroma/-git.ch →chroma/-hub.ch →chroma/-lab.ch →chroma/-example.ch \ - →chroma/-grep.ch →chroma/-perl.ch →chroma/-make.ch →chroma/-awk.ch \ - →chroma/-vim.ch →chroma/-source.ch →chroma/-sh.ch →chroma/-docker.ch \ - →chroma/-autoload.ch →chroma/-ssh.ch →chroma/-scp.ch →chroma/-which.ch \ - →chroma/-printf.ch →chroma/-ruby.ch →chroma/-whatis.ch →chroma/-alias.ch \ - →chroma/-subcommand.ch →chroma/-autorandr.ch →chroma/-nmcli.ch \ - →chroma/-fast-theme.ch →chroma/-node.ch →chroma/-fpath_peq.ch \ - →chroma/-precommand.ch →chroma/-subversion.ch →chroma/-ionice.ch \ - →chroma/-nice.ch →chroma/main-chroma.ch →chroma/-ogit.ch →chroma/-zi.ch +autoload -Uz -- chroma/-git.ch chroma/-hub.ch chroma/-lab.ch \ + chroma/-example.ch chroma/-grep.ch chroma/-perl.ch chroma/-make.ch \ + chroma/-awk.ch chroma/-vim.ch chroma/-source.ch chroma/-sh.ch chroma/-docker.ch \ + chroma/-autoload.ch chroma/-ssh.ch chroma/-scp.ch chroma/-which.ch \ + chroma/-printf.ch chroma/-ruby.ch chroma/-whatis.ch chroma/-alias.ch \ + chroma/-subcommand.ch chroma/-autorandr.ch chroma/-nmcli.ch chroma/-fast-theme.ch \ + chroma/-node.ch chroma/-fpath_peq.ch chroma/-precommand.ch chroma/-subversion.ch \ + chroma/-ionice.ch chroma/-nice.ch chroma/main-chroma.ch chroma/-ogit.ch chroma/-zi.ch source "${0:h}/functions/fast-highlight" source "${0:h}/functions/fast-string-highlight" @@ -360,19 +356,19 @@ zstyle -s :plugin:fast-syntax-highlighting theme __fsyh_theme } unset __fsyh_theme +alias f-sy-h=fast-theme -fast-highlight-fill-option-variables + if [[ ! -e $FAST_WORK_DIR/secondary_theme.zsh ]] { + local theme_link=https://raw.githubusercontent.com/z-shell/F-Sy-H/main/share/free_theme.zsh if { type curl &>/dev/null } { - curl -fsSL -o "$FAST_WORK_DIR/secondary_theme.zsh" \ - https://raw.githubusercontent.com/z-shell/F-Sy-H/main/share/free_theme.zsh \ - &>/dev/null + command curl -fsSL -o "$FAST_WORK_DIR/secondary_theme.zsh" $theme_link &>/dev/null } elif { type wget &>/dev/null } { - wget -O "$FAST_WORK_DIR/secondary_theme.zsh" \ - https://raw.githubusercontent.com/z-shell/F-Sy-H/main/share/free_theme.zsh \ - &>/dev/null + command wget -O "$FAST_WORK_DIR/secondary_theme.zsh" $theme_link &>/dev/null } touch "$FAST_WORK_DIR/secondary_theme.zsh" + unset theme_link } if [[ $(uname -a) = (#i)*darwin* ]]; then diff --git "a/\342\206\222chroma/-alias.ch" b/chroma/-alias.ch similarity index 100% rename from "\342\206\222chroma/-alias.ch" rename to chroma/-alias.ch index 91462d0..e10edc5 100755 --- "a/\342\206\222chroma/-alias.ch" +++ b/chroma/-alias.ch @@ -1,5 +1,7 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 @@ -28,5 +30,3 @@ fi _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-autoload.ch b/chroma/-autoload.ch new file mode 100755 index 0000000..fccb74d --- /dev/null +++ b/chroma/-autoload.ch @@ -0,0 +1,103 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# +# Tracks autoload command - highlights function names if they exist somewhere +# in $fpath. Also warns that the autoload function is already defined. +# +# $1 - 0 or 1, denoting if it's first call to the chroma, or following one +# +# $2 - the current token, also accessible by $__arg from the above scope - +# basically a private copy of $__arg; the token can be eg.: "grep" +# +# $3 - a private copy of $_start_pos, i.e. the position of the token in the +# command line buffer, used to add region_highlight entry (see man), +# because Zsh colorizes by *ranges* in command line buffer +# +# $4 - a private copy of $_end_pos from the above scope +# + +(( next_word = 2 | 8192 )) + +local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" +local __style __chars +integer __idx1 __idx2 +local -a __results __deserialized __noshsplit + +# First call, i.e. command starts, i.e. "grep" token etc. +(( __first_call )) && { + FAST_HIGHLIGHT[chroma-autoload-counter]=0 + FAST_HIGHLIGHT[chroma-autoload-counter-all]=1 + FAST_HIGHLIGHT[chroma-autoload-message]="" + #FAST_HIGHLIGHT[chroma-autoload-message-shown]="" + [[ -z ${FAST_HIGHLIGHT[chroma-autoload-message-shown-at]} ]] && FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=0 + FAST_HIGHLIGHT[chroma-autoload-elements]="" + __style=${FAST_THEME_NAME}command + +} || { + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + fi + (( FAST_HIGHLIGHT[chroma-autoload-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-autoload-counter-all] )) + + # Following call, i.e. not the first one. + + # Check if chroma should end – test if token is of type + # "starts new command", if so pass-through – chroma ends + [[ "$__arg_type" = 3 ]] && return 2 + + if [[ "$__wrd" = [-+]* ]]; then + # Detected option, add style for it. + [[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ + __style=${FAST_THEME_NAME}single-hyphen-option + else + # Count non-option tokens. + (( FAST_HIGHLIGHT[chroma-autoload-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-autoload-counter] )) + + if [[ $__wrd != (\$|\"\$)* && $__wrd != (/|\"/|\'/)* && $__wrd != \`* ]]; then + __results=( ${^fpath}/$__wrd(N) ) + __deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-fpath_peq-elements]}}" ) + __results+=( ${^__deserialized}/$__wrd(N) ) + [[ "${#__results}" -gt 0 ]] && { + __style=${FAST_THEME_NAME}correct-subtle + __deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-autoload-elements]}}" ) + [[ -z "${__deserialized[1]}" && ${#__deserialized} -eq 1 ]] && __deserialized=() + # Cannot use ${abc:+"$abc"} trick with ${~...}, so handle most + # cases of the possible shwordsplit through an additional array + __noshsplit=( ${~__wrd} ) + __deserialized+=( "${(j: :)__noshsplit}" ) + FAST_HIGHLIGHT[chroma-autoload-elements]="${(j: :)${(q@)__deserialized}}" + # Make the function defined for big-loop's *main-type mechanism + __fast_highlight_main__command_type_cache[${(j: :)__noshsplit}]="function" + } || __style=${FAST_THEME_NAME}incorrect-subtle + fi + + if (( ${+functions[${(Q)__wrd}]} )); then + FAST_HIGHLIGHT[chroma-autoload-message]+="Warning: Function ${(Q)__wrd} already defined (e.g. loaded)"$'\n' + fi + fi + + # Display only when processing last autoload argument + if (( ${#${(z)BUFFER}} == FAST_HIGHLIGHT[chroma-autoload-counter-all] )); then + # Display only if already shown message differs or when it timeouts + if [[ ${FAST_HIGHLIGHT[chroma-autoload-message]} != ${FAST_HIGHLIGHT[chroma-autoload-message-shown]} || \ + $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-autoload-message-shown-at] )) -gt 7 ]]; then + FAST_HIGHLIGHT[chroma-autoload-message-shown]=${FAST_HIGHLIGHT[chroma-autoload-message]} + FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=$EPOCHSECONDS + zle -M "${FAST_HIGHLIGHT[chroma-autoload-message]}" + fi + fi +} + +# Add region_highlight entry (via `reply' array). +# +# This is a common place of adding such entry, but any above code +# can do it itself and skip setting __style to disable this code. +[[ -n "$__style" ]] && \ + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + +# We aren't passing-through (no return 1 occurred), do obligatory things ourselves. +(( this_word = next_word )) +_start_pos=$_end_pos + +return 0 diff --git a/chroma/-autorandr.ch b/chroma/-autorandr.ch new file mode 100755 index 0000000..4ba4e0b --- /dev/null +++ b/chroma/-autorandr.ch @@ -0,0 +1,24 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et + +(( next_word = 2 | 8192 )) +[[ "$__arg_type" = 3 ]] && return 2 + +local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" + +if (( __first_call )) || [[ "$__wrd" = -* ]]; then + return 1 +else + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + fi + if [[ -d "${XDG_CONFIG_HOME:-$HOME/.config}/autorandr/$__wrd" ]] then + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") + fi +fi + +(( this_word = next_word )) +_start_pos=$_end_pos + +return 0 diff --git a/chroma/-awk.ch b/chroma/-awk.ch new file mode 100755 index 0000000..afcfd89 --- /dev/null +++ b/chroma/-awk.ch @@ -0,0 +1,106 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# +# $1 - 0 or 1, denoting if it's first call to the chroma, or following one +# +# $2 - the current token, also accessible by $__arg from the above scope - +# basically a private copy of $__arg; the token can be eg.: "grep" +# +# $3 - a private copy of $_start_pos, i.e. the position of the token in the +# command line buffer, used to add region_highlight entry (see man), +# because Zsh colorizes by *ranges* in command line buffer +# +# $4 - a private copy of $_end_pos from the above scope +# + +(( next_word = 2 | 8192 )) + +local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" +local __style __chars __val __style2 +integer __idx1 __idx2 + +# First call, i.e. command starts, i.e. "grep" token etc. +(( __first_call )) && { + FAST_HIGHLIGHT[chroma-awk-counter]=0 + FAST_HIGHLIGHT[chroma-awk-f-seen]=0 + return 1 +} || { + # Following call, i.e. not the first one. + + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + fi + + # Check if chroma should end – test if token is of type + # "starts new command", if so pass-through – chroma ends + [[ "$__arg_type" = 3 ]] && return 2 + + if [[ "$__wrd" = -* ]]; then + # Detected option, add style for it. + [[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ + __style=${FAST_THEME_NAME}single-hyphen-option + [[ "$__wrd" = "-f" ]] && FAST_HIGHLIGHT[chroma-awk-f-seen]=1 + else + # Count non-option tokens. + (( FAST_HIGHLIGHT[chroma-awk-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-awk-counter] )) + + # First non-option token is the pattern (regex), we will + # highlight it. + if (( FAST_HIGHLIGHT[chroma-awk-counter] == 1 && FAST_HIGHLIGHT[chroma-awk-f-seen] == 0 )); then + if print -r -- "${(Q)__wrd}" | gawk --source 'BEGIN { exit } END { exit 0 }' -f - >/dev/null 2>&1; then + __style2="${FAST_THEME_NAME}subtle-bg" + else + __style2="${FAST_THEME_NAME}incorrect-subtle" + fi + + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style2]}") + + # Highlight keywords + FSH_LIST=() + : "${__wrd//(#m)(BEGIN|END|FIELDWIDTHS|RS|ARGC|ARGV|ENVIRON|NF|NR|IGNORECASE|FILENAME|if|then|else|while|toupper|tolower|function|print|sub)/$(( fsh_sy_h_append($MBEGIN, $MEND) ))}"; + for __val in "${FSH_LIST[@]}" ; do + [[ ${__wrd[${__val%%;;*}]} = [a-zA-Z0-9_] || ${__wrd[${__val##*;;}+1]} = [a-zA-Z0-9_] ]] && continue + __idx1=$(( __start_pos + ${__val%%;;*} )) + __idx2=__idx1+${__val##*;;}-${__val%%;;*}+1 + (( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}-1, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}reserved-word]},${FAST_HIGHLIGHT_STYLES[$__style2]}") + done + + # Highlight regex characters + __chars="*+\\)(\{\}[]^" + __idx1=__start_pos + __idx2=__start_pos + while [[ "$__wrd" = (#b)[^$__chars]#([\\][\\])#((+|\*|\[|\]|\)|\(|\^|\}|\{)|[\\](+|\*|\[|\]|\)|\(|\^|\{|\}))(*) ]]; do + if [[ -n "${match[3]}" ]]; then + __idx1+=${mbegin[3]}-1 + __idx2=__idx1+${mend[3]}-${mbegin[3]}+1 + (( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]},${FAST_HIGHLIGHT_STYLES[$__style2]}") + __idx1=__idx2 + else + __idx1+=${mbegin[5]}-1 + fi + __wrd="${match[5]}" + done + elif (( FAST_HIGHLIGHT[chroma-awk-counter] >= 2 || FAST_HIGHLIGHT[chroma-awk-f-seen] == 1 )); then + FAST_HIGHLIGHT[chroma-awk-f-seen]=0 + # Handle paths, etc. normally - just pass-through to the big + # highlighter (the main f-sy-h highlighter, used before chromas). + return 1 + fi +fi +} + +# Add region_highlight entry (via `reply' array). +# +# This is a common place of adding such entry, but any above +# code can do it itself (and it does) and skip setting __style +# to disable this code. +[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + +# We aren't passing-through (no return 1 occurred), do obligatory things ourselves. +(( this_word = next_word )) +_start_pos=$_end_pos + +return 0 diff --git "a/\342\206\222chroma/-docker.ch" b/chroma/-docker.ch similarity index 100% rename from "\342\206\222chroma/-docker.ch" rename to chroma/-docker.ch diff --git "a/\342\206\222chroma/-example.ch" b/chroma/-example.ch similarity index 92% rename from "\342\206\222chroma/-example.ch" rename to chroma/-example.ch index e171fe8..aa17e14 100755 --- "a/\342\206\222chroma/-example.ch" +++ b/chroma/-example.ch @@ -2,7 +2,7 @@ # # Example chroma function. It colorizes first two arguments as `builtin' style, # third and following arguments as `globbing' style. First two arguments may -# be "strings", they will be passed through to normal higlighter (by returning 1). +# be "strings", they will be passed through to normal highlighter (by returning 1). # # $1 - 0 or 1, denoting if it's first call to the chroma, or following one # @@ -16,10 +16,10 @@ # $4 - a private copy of $_end_pos from the above scope # # -# Overall functioning is: when command "example" is occured, this function +# Overall functioning is: when command "example" is occurred, this function # is called with $1 == 1, it ("example") is the first token ($2), then for any # following token, this function is called with $1 == 0, until end of command -# is occured (i.e. till enter is pressed or ";" is put into source, or the +# is occurred (i.e. till enter is pressed or ";" is put into source, or the # command line simply ends). # # Other tips are: @@ -38,7 +38,7 @@ # Remember to reset the hash and others at __first_call == 1, so that you have # a fresh state for new command. -# Keep chroma-takever state meaning: until ;, handle highlighting via chroma. +# Keep chroma-takeover state meaning: until ;, handle highlighting via chroma. # So the below 8192 assignment takes care that next token will be routed to chroma. (( next_word = 2 | 8192 )) @@ -83,7 +83,7 @@ integer __idx1 __idx2 # Colorize 1..2 as builtin, 3.. as glob if (( FAST_HIGHLIGHT[chroma-example-counter] <= 2 )); then if [[ "$__wrd" = \"* ]]; then - # Pass through, fsh main code will do the highlight! + # Pass through, f-sy-h main code will do the highlight! return 1 else __style=${FAST_THEME_NAME}builtin diff --git "a/\342\206\222chroma/-fast-theme.ch" b/chroma/-fast-theme.ch similarity index 83% rename from "\342\206\222chroma/-fast-theme.ch" rename to chroma/-fast-theme.ch index 99516de..1cc918b 100755 --- "a/\342\206\222chroma/-fast-theme.ch" +++ b/chroma/-fast-theme.ch @@ -19,11 +19,11 @@ else fi if [[ "$__wrd" = */* || "$__wrd" = (CONFIG|CACHE|LOCAL|HOME|OPT):* ]]; then - __wrd="${${__wrd/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/zi/fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" - __wrd="${${__wrd/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" + __wrd="${${__wrd/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/f-sy-h/}%.ini}.ini" + __wrd="${${__wrd/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/f-sy-h/}%.ini}.ini" + __wrd="${${__wrd/(#s)LOCAL://usr/local/share/f-sy-h/}%.ini}.ini" + __wrd="${${__wrd/(#s)HOME:/$HOME/.f-sy-h/}%.ini}.ini" + __wrd="${${__wrd/(#s)OPT://opt/local/share/f-sy-h/}%.ini}.ini" __wrd=${~__wrd} # allow user to quote ~ else __wrd="$FAST_BASE_DIR/themes/$__wrd.ini" diff --git "a/\342\206\222chroma/-fpath_peq.ch" b/chroma/-fpath_peq.ch similarity index 93% rename from "\342\206\222chroma/-fpath_peq.ch" rename to chroma/-fpath_peq.ch index a8f65eb..de08465 100755 --- "a/\342\206\222chroma/-fpath_peq.ch" +++ b/chroma/-fpath_peq.ch @@ -5,11 +5,11 @@ # elem2 ... ) construct to provide *the* *future* contents of $fpath to # -autoload.ch, so that it can detect functions in those provided directories # `elem1', `elem2', etc. and highlight the functions with `correct-subtle' -# instead of `incorrect-subtle'. Basically all thit is for command-lines like: +# instead of `incorrect-subtle'. Basically all this is for command-lines like: # # % fpath+=( `pwd` ); autoload my-fun-from-PWD -# Keep chroma-takever state meaning: until ; or similar (see $__arg_type below) +# Keep chroma-takeover state meaning: until ; or similar (see $__arg_type below) # The 8192 sum takes care that the next token will be routed to this chroma (( next_word = 2 | 8192 )) diff --git "a/\342\206\222chroma/-git.ch" b/chroma/-git.ch similarity index 76% rename from "\342\206\222chroma/-git.ch" rename to chroma/-git.ch index d59967e..e5a8a6e 100755 --- "a/\342\206\222chroma/-git.ch" +++ b/chroma/-git.ch @@ -17,18 +17,18 @@ fsh__git__chroma__def=( subcmd:NULL "NULL_0_opt" NULL_0_opt " (-C|--exec-path=|--git-dir=|--work-tree=|--namespace=|--super-prefix=|--config-env=| - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || -c <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP <<>> __style=\${FAST_THEME_NAME}optarg-string // NO-OP || (-v|--version|-h|--help|--html-path|--man-path|--info-path|-p|--paginate| -P|--no-pager|--no-replace-objects|--bare) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - "subcommands" "::→chroma/-git-get-subcommands" # run a function (the :: causes this) and use `reply' + "subcommands" "::chroma/-git-get-subcommands" # run a function (the :: causes this) and use `reply' #"subcommands" "(fetch|pull)" # run a function (the :: causes this) and use `reply' - "subcmd-hook" "→chroma/-git-check-if-alias" + "subcmd-hook" "chroma/-git-check-if-alias" "subcommands-blacklist" "mv,other" ## }}} @@ -66,8 +66,8 @@ fsh__git__chroma__def=( (--depth=|--deepen=|--shallow-exclude=|--shallow-since=|--receive-pack=|--filter=| --refmap=|--recurse-submodules=|-j|--jobs=|--submodule-prefix=|--recurse-submodules-default=| -o|--server-option=|--upload-pack=|--negotiation-tip=|--set-upstream=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|--all|-a|--append|--unshallow|--atomic|--auto-maintenance|--update-shallow|--dry-run|-f|--force| -k|--keep|-m|--multiple|-p|--prune|-n|--no-tags|-t|--tags|--prefetch |--no-recurse-submodules|--negotiation-tip| --auto-gc|--filter|--write-fetch-head|--write-commit-graph|--show-forced-updates|-P|--prune-tags|--negotiate-only| @@ -80,9 +80,9 @@ fsh__git__chroma__def=( # is set to be argument-less. The argument is a) -o/--option argument # and b) -o/--option=argument. - REMOTE_GR_1_arg "NO-OP // ::→chroma/-git-verify-remote-or-group" # This definition is generic, reused later - "REF_#_arg" "NO-OP // ::→chroma/-git-verify-ref" # This too - "REMOTE_GR_#_arg" "NO-OP // ::→chroma/-git-verify-remote-or-group" # and this too + REMOTE_GR_1_arg "NO-OP // ::chroma/-git-verify-remote-or-group" # This definition is generic, reused later + "REF_#_arg" "NO-OP // ::chroma/-git-verify-ref" # This too + "REMOTE_GR_#_arg" "NO-OP // ::chroma/-git-verify-remote-or-group" # and this too # The hash `#' above denotes: an argument at any position # It will nicely match any following (above the first explicitly # numbered ones) arguments passed when using --multiple @@ -103,15 +103,15 @@ fsh__git__chroma__def=( PUSH_0_opt " (--receive-pack=|--exec=|--repo=|--push-option=|--signed=| --force-with-lease=|--recurse-submodules=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|--all|--mirror|--tags|--follow-tags|-n|--dry-run|--porcelain| -d|--delete|--signed|--no-signed|--atomic|--no-atomic| -o|--push-option|--prune|--force-with-lease|--no-force-with-lease|-f|--force| --force-if-includes|-u|--set-upstream|--thin|--no-thin|-q|--quiet|-v|--verbose| --progress|--no-recurse-submodules|--verify|--no-verify|-4|--ipv4|-6|--ipv6) <<>> __style=\${FAST_THEME_NAME}single-hyphen-option // NO-OP" - REMOTE_1_arg "NO-OP // ::→chroma/-git-verify-remote" # This definition is generic, reused later + REMOTE_1_arg "NO-OP // ::chroma/-git-verify-remote" # This definition is generic, reused later ### }}} @@ -127,8 +127,8 @@ fsh__git__chroma__def=( --strategy-option=|--rebase=|--depth=|--deepen=|--shallow-exclude=| --shallow-since=|--signoff=|--negotiation-tip=|--upload-pack|-o|--server-option=| --no-recurse-submodules=|--refmap=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-q|--quiet|-v|--verbose|--progress|--no-recurse-submodules|--dry-run| --commit|--no-commit|--cleanup|--edit|--no-edit|--ff|--no-ff|--ff-only|--log|--no-log| --signoff|--no-signoff|--stat|-n|--no-stat|--squash|--show-forced-updates|--no-squash| @@ -149,22 +149,22 @@ fsh__git__chroma__def=( "COMMIT_#_opt" " (-m|--message=|-am) - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-ARG-action || (-h|--help|-a|--all|-p|--patch|--reset-author|--short|--branch| --porcelain|--long|-z|--null|-s|--signoff|-n|--no-verify| --allow-empty|--allow-empty-message|-e|--edit|--no-edit| --amend|--no-post-rewrite|-i|--include|-o|--only|--untracked-files| -v|--verbose|-q|--quiet|--dry-run|--status|--no-status|--no-gpg-sign) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (-C|--reuse-message=|-c|--reedit-message=|--fixup=|--squash=| -F|--file=|--author=|--date=|-t|--template=|--cleanup=| -u|--untracked-files=|-S|--gpg-sign=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action" # A generic action - "FILE_#_arg" "NO-OP // ::→chroma/-git-verify-file" + "FILE_#_arg" "NO-OP // ::chroma/-git-verify-file" ## }}} @@ -176,20 +176,20 @@ fsh__git__chroma__def=( subcmd:merge "MERGE_0_opt // COMMIT_#_arg" MERGE_0_opt " (-m) - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-ARG-action (-S|--gpg-sign=|--log=|-e|--strategy=|-X|--strategy-option=|-F|--file|--cleanup=| --into-name=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|--commit|--no-commit|-e|--edit|--no-edit|--ff|--no-ff|--ff-only|--autostash| --log|--no-log|--signoff|--no-signoff|-n|--stat|--no-stat|--squash|--overwrite-ignore| --no-squash|--verify-signatures|--no-verify|--no-verify-signatures|--summary|--no-summary| -q|--quiet|-v|--verbose|--progress|--no-progress|--allow-unrelated-histories| --rerere-autoupdate|--no-rerere-autoupdate|--abort|--quit|--continue) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - COMMIT_\#_arg "NO-OP // ::→chroma/-git-verify-commit" + COMMIT_\#_arg "NO-OP // ::chroma/-git-verify-commit" ## }}} @@ -201,7 +201,7 @@ fsh__git__chroma__def=( subcmd:reset "RESET_0_opt^ // RESET_0_opt // RESET_#_arg // NO_MATCH_#_opt" "RESET_0_opt^" " (--soft|--mixed|--hard|--merge|--keep) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (--soft|--mixed|--hard|--merge|--keep):del <<>> RESET_0_opt // RESET_#_arg || (--soft|--mixed|--hard|--merge|--keep):add @@ -209,13 +209,13 @@ fsh__git__chroma__def=( RESET_0_opt " (--recurse-submodules=|--pathspec-from-file=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-q|--quiet|-p|--patch|-N|--intent-to-add|--pathspec-file-nul) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" - RESET_1_arg "NO-OP // ::→chroma/-git-verify-commit" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" + RESET_1_arg "NO-OP // ::chroma/-git-verify-commit" - "RESET_#_arg" "NO-OP // ::→chroma/-git-RESET-verify-commit-or-file" + "RESET_#_arg" "NO-OP // ::chroma/-git-RESET-verify-commit-or-file" ## }}} @@ -228,20 +228,20 @@ fsh__git__chroma__def=( subcmd:revert "REVERT_SEQUENCER_0_opt^ // REVERT_0_opt // REVERT_#_arg // NO_MATCH_#_opt" REVERT_0_opt " (-m|--mainline|-S|--gpg-sign=|--strategy=|-X|--strategy-option=|--cleanup=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-e|--edit|--no-edit|-n|--no-commit|-s|--signoff|--reference|--rerere-autoupdate) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" "REVERT_SEQUENCER_0_opt^" " (--continue|--quit|--abort|--skip) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (--continue|--quit|--abort|--skip):del <<>> REVERT_0_opt // REVERT_#_arg || (--continue|--quit|--abort|--skip):add <<>> NO_MATCH_#_arg" - "REVERT_#_arg" "NO-OP // ::→chroma/-git-verify-commit" + "REVERT_#_arg" "NO-OP // ::chroma/-git-verify-commit" ## }}} @@ -256,7 +256,7 @@ fsh__git__chroma__def=( "DIFF_NO_INDEX_0_opt^" " --no-index - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || --no-index:del <<>> COMMIT_FILE_DIR_#_arg || --no-index:add @@ -269,8 +269,8 @@ fsh__git__chroma__def=( --diff-filter=|-S|-G|--find-object=|--relative=|-O|--relative=|--inter-hunk-context=|--output=| --output-indicator-new=|--output-indicator-old=|--output-indicator-context=|--ignore-submodules=| --src-prefix=|--dst-prefix=|--line-prefix=|-I|--ignore-matching-lines=|--rotate-to=|--skip-to=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-p|--patch|-u|-s|--no-patch|--raw|--patch-with-raw|--indent-heuristic| --no-indent-heuristic|--minimal|--patience|--histogram|--stat|--cumulative| --compact-summary|--numstat|--shortstat|--dirstat|--summary| @@ -284,16 +284,16 @@ fsh__git__chroma__def=( --ext-diff|--no-ext-diff|--textconv|--no-textconv|--ignore-submodules| --no-prefix|--ita-invisible-in-index|--ita-visible-in-index|-1|--base|-2|--ours|-3|--theirs| -0|--cached) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" # A generic action - "COMMIT_FILE_DIR_#_arg" "NO-OP // ::→chroma/-git-verify-commit-or-file-or-dir" + "COMMIT_FILE_DIR_#_arg" "NO-OP // ::chroma/-git-verify-commit-or-file-or-dir" # A generic action - "FILE_1_arg" "NO-OP // ::→chroma/-git-verify-file" + "FILE_1_arg" "NO-OP // ::chroma/-git-verify-file" # A generic action - "FILE_2_arg" "NO-OP // ::→chroma/-git-verify-file" + "FILE_2_arg" "NO-OP // ::chroma/-git-verify-file" ## }}} @@ -306,15 +306,15 @@ fsh__git__chroma__def=( ADD_0_opt " (--chmod=|--pathspec-from-file=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-v|--verbose|-f|--force|-i|--interactive|-n|--dry-run|-p|--patch|-e|--edit| --all|--no-all|-A|--ignore-removal|--no-ignore-removal|-u|--update|-N|--sparse| --intent-to-add|--refresh|--ignore-errors|--ignore-missing|--renormalize| --no-warn-embedded-repo|--pathspec-file-nul) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - FILE_OR_DIR_#_arg "NO-OP // ::→chroma/-git-verify-file-or-dir" + FILE_OR_DIR_#_arg "NO-OP // ::chroma/-git-verify-file-or-dir" ## }}} @@ -329,32 +329,32 @@ fsh__git__chroma__def=( "CHECKOUT_BRANCH_0_opt^" " (-b|-B|--orphan) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (-b|-B|--orphan):del <<>> FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg // FILE_#_arg // FILE_#_arg || (-b|-B|--orphan):add <<>> NEW_BRANCH_1_arg // COMMIT_2_arg // NO_MATCH_#_arg" - NEW_BRANCH_1_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name" + NEW_BRANCH_1_arg "NO-OP // ::chroma/-git-verify-correct-branch-name" - COMMIT_2_arg "NO-OP // ::→chroma/-git-verify-commit" + COMMIT_2_arg "NO-OP // ::chroma/-git-verify-commit" CHECKOUT_0_opt " (--conflict=|--recurse-submodules=|--track=|--pathspec-from-file=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|-q|--quiet|--progress|--no-progress|-f|--force|-2|--ours|-3|--theirs|--guess|--overlay| -b|-B|-t|--track|--no-track|-l|-d|--detach|--orphan|--ignore-skip-worktree-bits| -m|--merge|-p|--patch|--ignore-other-worktrees|--no-ignore-other-worktrees|--overwrite-ignore| --pathspec-file-nul) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" # A generic action - COMMIT_1_arg "NO-OP // ::→chroma/-git-verify-commit" + COMMIT_1_arg "NO-OP // ::chroma/-git-verify-commit" # Unused - FILE_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::→chroma/-git-file-or-ubranch-or-commit-verify" - FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::→chroma/-git-file-or-dir-or-ubranch-or-commit-verify" + FILE_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::chroma/-git-file-or-ubranch-or-commit-verify" + FILE_OR_DIR_OR_BRANCH_OR_COMMIT_1_arg "NO-OP // ::chroma/-git-file-or-dir-or-ubranch-or-commit-verify" ## }}} @@ -369,7 +369,7 @@ fsh__git__chroma__def=( REMOTE_PRUNE_1_arg // REMOTE_UPDATE_1_arg" REMOTE_0_opt "(-h|--help|-v|--verbose) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_ADD_1_arg "add ::::: __style=${FAST_THEME_NAME}subcommand // NO-OP <<>> add:REMOTE_ADD_OPTS_1_opt // REMOTE_A_NAME_2_arg // @@ -410,53 +410,53 @@ fsh__git__chroma__def=( REMOTE_ADD_OPTS_1_opt " (-t|-m|--mirror=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-f|--tags|--no-tags) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_SET_HEAD_OPTS_1_opt " (-a|--auto|-d|--delete) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_SET_HEAD_OPTS_2_opt " (-a|--auto|-d|--delete) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_SET_BRANCHES_OPTS_1_opt " --add - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_GET_URL_OPTS_1_opt " (--push|--all) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" "REMOTE_SET_URL_OPTS_1_opt^" " --push|--add|--delete - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (--add|--delete):del <<>> REMOTE_A_URL_4_arg" REMOTE_SHOW_OPTS_1_opt " -n - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_PRUNE_OPTS_1_opt " (-n|--dry-run) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" REMOTE_UPDATE_OPTS_1_opt " (-p|--prune) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - REMOTE_A_NAME_2_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name" - REMOTE_A_NAME_3_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name" - REMOTE_A_URL_3_arg "NO-OP // ::→chroma/main-chroma-std-verify-url" - REMOTE_A_URL_4_arg "NO-OP // ::→chroma/main-chroma-std-verify-url" - BRANCH_3_arg "NO-OP // ::→chroma/-git-verify-branch" - BRANCH_\#_arg "NO-OP // ::→chroma/-git-verify-branch" - REMOTE_2_arg "NO-OP // ::→chroma/-git-verify-remote" - REMOTE_\#_arg "NO-OP // ::→chroma/-git-verify-remote" + REMOTE_A_NAME_2_arg "NO-OP // ::chroma/-git-verify-correct-branch-name" + REMOTE_A_NAME_3_arg "NO-OP // ::chroma/-git-verify-correct-branch-name" + REMOTE_A_URL_3_arg "NO-OP // ::chroma/main-chroma-std-verify-url" + REMOTE_A_URL_4_arg "NO-OP // ::chroma/main-chroma-std-verify-url" + BRANCH_3_arg "NO-OP // ::chroma/-git-verify-branch" + BRANCH_\#_arg "NO-OP // ::chroma/-git-verify-branch" + REMOTE_2_arg "NO-OP // ::chroma/-git-verify-remote" + REMOTE_\#_arg "NO-OP // ::chroma/-git-verify-remote" ## }}} @@ -478,8 +478,8 @@ fsh__git__chroma__def=( --find-renames=|-C|--find-copies=|-l|--diff-filter=|-S|-G|--find-object=| --relative=|-O|--relative=|--inter-hunk-context=|--ignore-submodules=| --src-prefix=|--dst-prefix=|--line-prefix=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (-h|--help|--follow|--decorate|--no-decorate|--source|--use-mailmap|--full-diff| --log-size|--all-match|--invert-grep|-i|--regexp-ignore-case|--basic-regexp| @@ -505,9 +505,9 @@ fsh__git__chroma__def=( --ignore-blank-lines|-W|--function-context|--ext-diff|--no-ext-diff| --textconv|--no-textconv|--ignore-submodules|--no-prefix| --ita-invisible-in-index) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - LOG_1_arg "NO-OP // ::→chroma/-git-verify-rev-range-or-file" + LOG_1_arg "NO-OP // ::chroma/-git-verify-rev-range-or-file" ## ## TAG @@ -517,38 +517,38 @@ fsh__git__chroma__def=( "TAG_0_opt^" " (-u|--local-user=|--cleanup=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || -m - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-action - <<>> NO-OP // ::→chroma/-git-commit-msg-opt-ARG-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-action + <<>> NO-OP // ::chroma/-git-commit-msg-opt-ARG-action || (-F|--file) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/-git-verify-file + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/-git-verify-file || (-a|--annotate|-s|--sign|-f|-e|--edit) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || (-h|--help|-u|--local-user=|--cleanup=|-m|-F|--file|-a|--annotate|-s|--sign| -f|-e|--edit):add <<>> TAG_NEW_1_arg // COMMIT_2_arg // NO_MATCH_#_arg // NO_MATCH_#_opt" - TAG_NEW_1_arg "NO-OP // ::→chroma/-git-verify-correct-branch-name" + TAG_NEW_1_arg "NO-OP // ::chroma/-git-verify-correct-branch-name" - TAG_1_arg "NO-OP // ::→chroma/-git-verify-tag-name" + TAG_1_arg "NO-OP // ::chroma/-git-verify-tag-name" "TAG_D_0_opt^" " (-d) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || -d:add <<>> TAG_#_arg // NO_MATCH_#_opt || -d:del <<>> TAG_0_opt // TAG_NEW_1_arg // COMMIT_2_arg" - "TAG_#_arg" "NO-OP // ::→chroma/-git-verify-tag-name" + "TAG_#_arg" "NO-OP // ::chroma/-git-verify-tag-name" "TAG_L_0_opt^" " (-l) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || -l:add <<>> TAG_L_0_opt // TAG_PAT_#_arg // NO_MATCH_#_opt || -l:del @@ -557,16 +557,16 @@ fsh__git__chroma__def=( TAG_L_0_opt " (-n|--contains|--no-contains|--points-at|--column=|--sort=|--format=| --color=) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action || (--column|--no-column|--create-reflog|--merged|--no-merged|--color|-i) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - "TAG_PAT_#_arg" "NO-OP // ::→chroma/main-chroma-std-verify-pattern" + "TAG_PAT_#_arg" "NO-OP // ::chroma/main-chroma-std-verify-pattern" "TAG_V_0_opt^" " (-v) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action || -v:add <<>> TAG_V_0_opt // TAG_#_arg // NO_MATCH_#_opt || -v:del @@ -574,8 +574,8 @@ fsh__git__chroma__def=( TAG_V_0_opt " --format= - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-ARG-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action + <<>> NO-OP // ::chroma/main-chroma-std-aopt-ARG-action" ## ## All remaining subcommands @@ -583,13 +583,13 @@ fsh__git__chroma__def=( ## {{{ "subcmd:*" "CATCH_ALL_#_opt" - "CATCH_ALL_#_opt" "* <<>> NO-OP // ::→chroma/main-chroma-std-aopt-SEMI-action" + "CATCH_ALL_#_opt" "* <<>> NO-OP // ::chroma/main-chroma-std-aopt-SEMI-action" ## }}} ) # Called after entering just "git" on the command line -→chroma/-git-first-call() { +chroma/-git-first-call() { # Called for the first time - new command FAST_HIGHLIGHT is used because it survives between calls, # and allows to use a single global hash only, instead of multiple global variables FAST_HIGHLIGHT[chroma-git-counter]=0 @@ -607,20 +607,20 @@ fsh__git__chroma__def=( return 1 } -→chroma/-git-check-if-alias() { +chroma/-git-check-if-alias() { local _wrd="$1" local -a _result typeset -ga fsh__chroma__git__aliases _result=( ${(M)fsh__chroma__git__aliases[@]:#${_wrd}[[:space:]]##*} ) - →chroma/main-chroma-print "Got is-alias-_result: $_result" + chroma/main-chroma-print "Got is-alias-_result: $_result" [[ -n "$_result" ]] && \ FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="${${${_result#* }## ##}%% *}" } # A hook that returns the list of git's # available subcommands in $reply -→chroma/-git-get-subcommands() { +chroma/-git-get-subcommands() { local __svalue integer __ivalue LANG=C .fast-run-command "git help -a" chroma-${FAST_HIGHLIGHT[chroma-current]}-subcmd-list "" $(( 15 * 60 )) @@ -650,7 +650,7 @@ fsh__git__chroma__def=( } # A generic handler -→chroma/-git-verify-remote() { +chroma/-git-verify-remote() { local _wrd="$4" .fast-run-git-command "git remote" "chroma-git-remotes-$PWD" "" 10 [[ -n ${__lines_list[(r)$_wrd]} ]] && { @@ -661,7 +661,7 @@ fsh__git__chroma__def=( } # A generic handler - checks if given ref is correct -→chroma/-git-verify-ref() { +chroma/-git-verify-ref() { local _wrd="$4" _wrd="${_wrd%%:*}" .fast-run-git-command "git for-each-ref --format='%(refname:short)' refs/heads" "chroma-git-refs-$PWD" "refs/heads" 10 @@ -671,15 +671,15 @@ fsh__git__chroma__def=( } # A generic handler - checks if given remote or group is correct -→chroma/-git-verify-remote-or-group() { - →chroma/-git-verify-remote "$@" && return 0 +chroma/-git-verify-remote-or-group() { + chroma/-git-verify-remote "$@" && return 0 # The check for a group is to follow below integer _start="$2" _end="$3" local _scmd="$1" _wrd="$4" } # A generic handler - checks whether the file exists -→chroma/-git-verify-file() { +chroma/-git-verify-file() { integer _start="$2" _end="$3" __pos __start __end local _wrd="$4" bg @@ -713,7 +713,7 @@ fsh__git__chroma__def=( } # A generic handler - checks whether the file exists -→chroma/-git-verify-file-or-dir() { +chroma/-git-verify-file-or-dir() { integer _start="$2" _end="$3" __pos __start __end retval local _wrd="$4" bg @@ -749,7 +749,7 @@ fsh__git__chroma__def=( return $retval } -→chroma/-git-verify-branch() { +chroma/-git-verify-branch() { local _wrd="$4" .fast-run-git-command "git for-each-ref --format='%(refname:short)'" "chroma-git-branches-$PWD" "refs/heads" 10 if [[ -n ${__lines_list[(r)$_wrd]} ]] { @@ -761,7 +761,7 @@ fsh__git__chroma__def=( } } -→chroma/-git-verify-also-unfetched-ref() { +chroma/-git-verify-also-unfetched-ref() { local _wrd="$4" .fast-run-git-command "git config --get checkout.defaultRemote" "chroma-git-defaultRemote-$PWD" "" 10 local remote="${__lines_list[1]:-origin}" @@ -773,27 +773,27 @@ fsh__git__chroma__def=( } # A generic handler -→chroma/-git-file-or-ubranch-or-commit-verify() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file "$@" && return - →chroma/-git-verify-branch "$@" && return - →chroma/-git-verify-also-unfetched-ref "$@" +chroma/-git-file-or-ubranch-or-commit-verify() { + chroma/-git-verify-commit "$@" && return + chroma/-git-verify-file "$@" && return + chroma/-git-verify-branch "$@" && return + chroma/-git-verify-also-unfetched-ref "$@" } # A generic handler -→chroma/-git-file-or-dir-or-ubranch-or-commit-verify() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file-or-dir "$@" && return - →chroma/-git-verify-branch "$@" && return - →chroma/-git-verify-also-unfetched-ref "$@" +chroma/-git-file-or-dir-or-ubranch-or-commit-verify() { + chroma/-git-verify-commit "$@" && return + chroma/-git-verify-file-or-dir "$@" && return + chroma/-git-verify-branch "$@" && return + chroma/-git-verify-also-unfetched-ref "$@" } # A generic handler -→chroma/-git-verify-correct-branch-name() { +chroma/-git-verify-correct-branch-name() { local _wrd="$4" - →chroma/-git-verify-commit "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } + chroma/-git-verify-commit "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } - →chroma/-git-verify-remote "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } + chroma/-git-verify-remote "$@" && { __style=${FAST_THEME_NAME}incorrect-subtle; return 0; } [[ "$_wrd" != ./* && "$_wrd" != *..* && "$_wrd" != *[~\^\ $'\t']* && \ "$_wrd" != */ && "$_wrd" != *.lock && "$_wrd" != *\\* ]] && \ @@ -802,7 +802,7 @@ fsh__git__chroma__def=( } # A generic handler that checks if given commit reference is correct -→chroma/-git-verify-commit() { +chroma/-git-verify-commit() { local _wrd="$4" __lines_list=() .fast-run-git-command --status "git rev-parse --verify --quiet \"$_wrd\"" \ @@ -817,27 +817,27 @@ fsh__git__chroma__def=( # A generic handler that checks if given commit reference # is correct or if it's a file that exists -→chroma/-git-verify-commit-or-file() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file "$@" +chroma/-git-verify-commit-or-file() { + chroma/-git-verify-commit "$@" && return + chroma/-git-verify-file "$@" } # A generic handler that checks if given commit reference # is correct or if it's a file or directives that exists -→chroma/-git-verify-commit-or-file-or-dir() { - →chroma/-git-verify-commit "$@" && return - →chroma/-git-verify-file-or-dir "$@" +chroma/-git-verify-commit-or-file-or-dir() { + chroma/-git-verify-commit "$@" && return + chroma/-git-verify-file-or-dir "$@" } # A generic handler that checks if given revision range # is correct or if a file of that name exists -→chroma/-git-verify-rev-range-or-file() { +chroma/-git-verify-rev-range-or-file() { local _wrd="$4" - →chroma/-git-verify-commit "$@" && return 0 + chroma/-git-verify-commit "$@" && return 0 if [[ "$_wrd" = *..* ]]; then (( FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file] )) && { - →chroma/-git-verify-file "$@" && return 0 + chroma/-git-verify-file "$@" && return 0 __style=${FAST_THEME_NAME}unknown-token return 1 } @@ -845,13 +845,13 @@ fsh__git__chroma__def=( return 0 fi - →chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } + chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } __style="" return 1 } -→chroma/-git-verify-tag-name() { +chroma/-git-verify-tag-name() { local _wrd="$4" .fast-run-git-command "git tag" "chroma-git-tags-$PWD" "" $(( 2*60 )) [[ -n ${__lines_list[(r)$_wrd]} ]] && \ @@ -859,13 +859,13 @@ fsh__git__chroma__def=( } # A handler for the commit's -m/--message options.Currently -# does the same what →chroma/main-chroma-std-aopt-action does -→chroma/-git-commit-msg-opt-action() { - →chroma/main-chroma-std-aopt-action "$@" +# does the same what chroma/main-chroma-std-aopt-action does +chroma/-git-commit-msg-opt-action() { + chroma/main-chroma-std-aopt-action "$@" } # A handler for the commit's -m/--message options' argument -→chroma/-git-commit-msg-opt-ARG-action() { +chroma/-git-commit-msg-opt-ARG-action() { integer _start="$2" _end="$3" local _scmd="$1" _wrd="$4" @@ -904,9 +904,9 @@ fsh__git__chroma__def=( # A RESET handler # TODO: differentiate tree-ish from commit -→chroma/-git-RESET-verify-commit-or-file() { - →chroma/-git-verify-commit "$@" && { - →chroma/-git-verify-file "$@" && { +chroma/-git-RESET-verify-commit-or-file() { + chroma/-git-verify-commit "$@" && { + chroma/-git-verify-file "$@" && { # TODO: with -p/--patch, the are optional, # and this argument will be taken as a commit in a # specific circumstances @@ -922,7 +922,7 @@ fsh__git__chroma__def=( return 0 } - →chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } + chroma/-git-verify-file "$@" && { FAST_HIGHLIGHT[chroma-git-reset-etc-saw-file]=1; return 0; } return 1 } diff --git "a/\342\206\222chroma/-grep.ch" b/chroma/-grep.ch similarity index 95% rename from "\342\206\222chroma/-grep.ch" rename to chroma/-grep.ch index 3713e43..e0b0433 100755 --- "a/\342\206\222chroma/-grep.ch" +++ b/chroma/-grep.ch @@ -66,7 +66,7 @@ integer __idx1 __idx2 done elif (( FAST_HIGHLIGHT[chroma-grep-counter] == 2 )); then # Handle paths, etc. normally - just pass-through to the big - # highlighter (the main FSH highlighter, used before chromas). + # highlighter (the main f-sy-h highlighter, used before chromas). return 1 fi fi @@ -79,7 +79,7 @@ integer __idx1 __idx2 # to disable this code. [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") -# We aren't passing-through (no return 1 occured), do obligatory things ourselves. +# We aren't passing-through (no return 1 occurred), do obligatory things ourselves. (( this_word = next_word )) _start_pos=$_end_pos diff --git "a/\342\206\222chroma/-hub.ch" b/chroma/-hub.ch similarity index 100% rename from "\342\206\222chroma/-hub.ch" rename to chroma/-hub.ch diff --git "a/\342\206\222chroma/-ionice.ch" b/chroma/-ionice.ch similarity index 100% rename from "\342\206\222chroma/-ionice.ch" rename to chroma/-ionice.ch diff --git "a/\342\206\222chroma/-lab.ch" b/chroma/-lab.ch similarity index 100% rename from "\342\206\222chroma/-lab.ch" rename to chroma/-lab.ch diff --git "a/\342\206\222chroma/-make.ch" b/chroma/-make.ch similarity index 100% rename from "\342\206\222chroma/-make.ch" rename to chroma/-make.ch diff --git "a/\342\206\222chroma/-nice.ch" b/chroma/-nice.ch similarity index 100% rename from "\342\206\222chroma/-nice.ch" rename to chroma/-nice.ch diff --git "a/\342\206\222chroma/-nmcli.ch" b/chroma/-nmcli.ch similarity index 100% rename from "\342\206\222chroma/-nmcli.ch" rename to chroma/-nmcli.ch diff --git "a/\342\206\222chroma/-node.ch" b/chroma/-node.ch similarity index 100% rename from "\342\206\222chroma/-node.ch" rename to chroma/-node.ch diff --git "a/\342\206\222chroma/-ogit.ch" b/chroma/-ogit.ch similarity index 100% rename from "\342\206\222chroma/-ogit.ch" rename to chroma/-ogit.ch diff --git a/chroma/-perl.ch b/chroma/-perl.ch new file mode 100755 index 0000000..139bd18 --- /dev/null +++ b/chroma/-perl.ch @@ -0,0 +1,78 @@ +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et +# +# Chroma function for command `perl'. It highlights code passed to perl +# with -e option - does syntax check by calling `perl -ce', then highlights +# as correct or incorrect code. +# +# $1 - 0 or 1, denoting if it's first call to the chroma, or following one +# $2 - the current token, also accessible by $__arg from the above scope - +# basically a private copy of $__arg +# $3 - a private copy of $_start_pos, i.e. the position of the token in the +# command line buffer, used to add region_highlight entry (see man), +# because Zsh colorizes by *ranges* in command line buffer +# $4 - a private copy of $_end_pos from the above scope +# + +(( next_word = 2 | 8192 )) + +local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" +local __style +integer __idx1 __idx2 + +(( __first_call )) && { + # Called for the first time - new command. + # FAST_HIGHLIGHT is used because it survives between calls, and + # allows to use a single global hash only, instead of multiple + # global variables. + FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0 + return 1 +} || { + # Following call, i.e. not the first one. + + # Check if chroma should end – test if token is of type + # "starts new command", if so pass-through – chroma ends + [[ "$__arg_type" = 3 ]] && return 2 + + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + fi + + if [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-perl-got-subcommand]} -eq 0 ]]; then + __style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option} + + if [[ "$__wrd" = "-e" || ("$__wrd" = -*e* && "$__wrd" != --*) ]]; then + FAST_HIGHLIGHT[chrome-perl-got-eswitch]=1 + fi + else + __wrd="${__wrd//\`/x}" + __arg="${__arg//\`/x}" + __wrd="${(Q)__wrd}" + if (( FAST_HIGHLIGHT[chrome-perl-got-eswitch] == 1 )); then + FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0 + if perl -ce "$__wrd" >/dev/null 2>&1; then + # Add correct-subtle style + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") + else + # Add incorrect-subtle style + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + fi + else + # Pass-through to the big-loop outside + return 1 + fi + fi +} + +# Add region_highlight entry (via `reply' array) +# +# This is a common place of adding such entry, but any above +# code can do it itself (and it does) and skip setting __style +# to disable this code. +[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + +# We aren't passing-through, do obligatory things ourselves +(( this_word = next_word )) +_start_pos=$_end_pos + +return 0 diff --git "a/\342\206\222chroma/-precommand.ch" b/chroma/-precommand.ch similarity index 54% rename from "\342\206\222chroma/-precommand.ch" rename to chroma/-precommand.ch index 0a9211d..449801e 100755 --- "a/\342\206\222chroma/-precommand.ch" +++ b/chroma/-precommand.ch @@ -1,19 +1,19 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et + local __first_call="$1" __start_pos="$3" __end_pos="$4" [[ "$__arg_type" = 3 ]] && return 2 (( __first_call )) && { - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}precommand]}") - (( next_word = (next_word & ~2) | 4 | 1 )) + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}precommand]}") + (( next_word = (next_word & ~2) | 4 | 1 )) } || { - return 1 + return 1 } (( this_word = next_word )) _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-printf.ch" b/chroma/-printf.ch similarity index 100% rename from "\342\206\222chroma/-printf.ch" rename to chroma/-printf.ch diff --git "a/\342\206\222chroma/-ruby.ch" b/chroma/-ruby.ch similarity index 100% rename from "\342\206\222chroma/-ruby.ch" rename to chroma/-ruby.ch diff --git "a/\342\206\222chroma/-scp.ch" b/chroma/-scp.ch similarity index 100% rename from "\342\206\222chroma/-scp.ch" rename to chroma/-scp.ch diff --git "a/\342\206\222chroma/-sh.ch" b/chroma/-sh.ch similarity index 100% rename from "\342\206\222chroma/-sh.ch" rename to chroma/-sh.ch diff --git "a/\342\206\222chroma/-source.ch" b/chroma/-source.ch similarity index 94% rename from "\342\206\222chroma/-source.ch" rename to chroma/-source.ch index 2ab8c08..ee7a529 100755 --- "a/\342\206\222chroma/-source.ch" +++ b/chroma/-source.ch @@ -52,7 +52,7 @@ integer __idx1 __idx2 __style=${FAST_THEME_NAME}correct-subtle || __style=${FAST_THEME_NAME}incorrect-subtle } elif (( FAST_HIGHLIGHT[chroma-src-counter] == 2 )); then - # Handle paths, etc. normally - just pass-through to the big highlighter (the main FSH highlighter, used before chromas). + # Handle paths, etc. normally - just pass-through to the big highlighter (the main f-sy-h highlighter, used before chromas). return 1 fi fi @@ -65,7 +65,7 @@ integer __idx1 __idx2 # to disable this code. [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") -# We aren't passing-through (no return 1 occured), do obligatory things ourselves. +# We aren't passing-through (no return 1 occurred), do obligatory things ourselves. (( this_word = next_word )) _start_pos=$_end_pos diff --git "a/\342\206\222chroma/-ssh.ch" b/chroma/-ssh.ch similarity index 100% rename from "\342\206\222chroma/-ssh.ch" rename to chroma/-ssh.ch diff --git "a/\342\206\222chroma/-subcommand.ch" b/chroma/-subcommand.ch similarity index 100% rename from "\342\206\222chroma/-subcommand.ch" rename to chroma/-subcommand.ch diff --git "a/\342\206\222chroma/-subversion.ch" b/chroma/-subversion.ch similarity index 93% rename from "\342\206\222chroma/-subversion.ch" rename to chroma/-subversion.ch index 40559c8..474f188 100755 --- "a/\342\206\222chroma/-subversion.ch" +++ b/chroma/-subversion.ch @@ -30,7 +30,7 @@ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ------------------------------------------------------------------------------------------------- -→chroma/-subversion.ch/parse-revision() { +chroma/-subversion.ch/parse-revision() { setopt local_options extendedglob warn_create_global typeset_silent local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end case $__wrd in @@ -42,7 +42,7 @@ (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") } -→chroma/-subversion.ch/parse-target() { +chroma/-subversion.ch/parse-target() { setopt local_options extendedglob warn_create_global typeset_silent local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end if [[ $__wrd == *@[^/]# ]] @@ -57,7 +57,7 @@ fi (( __start=__start_pos-${#PREBUFFER}+$#place, __end=__end_pos-${#PREBUFFER}-$#rev, __start >= 0 )) \ && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}for-loop-separator]}") - →chroma/-subversion.ch/parse-revision $rev $((__start_pos+$#place+1)) $__end_pos + chroma/-subversion.ch/parse-revision $rev $((__start_pos+$#place+1)) $__end_pos else return 1 fi @@ -181,21 +181,21 @@ integer __idx1 __idx2 || __style=${FAST_THEME_NAME}incorrect-subtle ;; revision) - →chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos + chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos ;; revision-pair) local -a match mbegin mend if [[ $__wrd = (#b)(\{[^}]##\}|[^:]##)(:)(*) ]]; then - →chroma/-subversion.ch/parse-revision $match[1] $__start_pos $(( __end_pos - ( mend[3]-mend[2] ) - 1 )) - →chroma/-subversion.ch/parse-revision $match[3] $(( __start_pos + ( mbegin[3]-mbegin[1] ) )) $__end_pos + chroma/-subversion.ch/parse-revision $match[1] $__start_pos $(( __end_pos - ( mend[3]-mend[2] ) - 1 )) + chroma/-subversion.ch/parse-revision $match[3] $(( __start_pos + ( mbegin[3]-mbegin[1] ) )) $__end_pos (( __start=__start_pos-${#PREBUFFER}+(mbegin[2]-mbegin[1]), __end=__end_pos-${#PREBUFFER}-(mend[3]-mend[2]), __start >= 0 )) \ && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}for-loop-separator]}") else - →chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos + chroma/-subversion.ch/parse-revision $__wrd $__start_pos $__end_pos fi ;; target) - →chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $? + chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $? ;; cmd) this_word=1 @@ -220,7 +220,7 @@ integer __idx1 __idx2 (( FAST_HIGHLIGHT[subversion-subcommand-arguments]+=1 )) if [[ ( $FAST_HIGHLIGHT[subversion-subcommand] == (checkout|co|export|log|merge|switch|sw) && $FAST_HIGHLIGHT[subversion-subcommand-arguments] -eq 1 ) \ || $FAST_HIGHLIGHT[subversion-subcommand] == (blame|praise|annotate|ann|cat|copy|cp|diff|info|list|ls|mergeinfo) ]]; then - →chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $? + chroma/-subversion.ch/parse-target $__wrd $__start_pos $__end_pos || return $? else return 1 fi @@ -239,7 +239,7 @@ integer __idx1 __idx2 [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") # We aren't passing-through, do obligatory things ourselves. -# _start_pos=$_end_pos advainces pointers in command line buffer. +# _start_pos=$_end_pos advances pointers in command line buffer. # # To pass through means to `return 1'. The highlighting of # this single token is then done by fast-syntax-highlighting's diff --git "a/\342\206\222chroma/-vim.ch" b/chroma/-vim.ch similarity index 100% rename from "\342\206\222chroma/-vim.ch" rename to chroma/-vim.ch diff --git "a/\342\206\222chroma/-whatis.ch" b/chroma/-whatis.ch similarity index 100% rename from "\342\206\222chroma/-whatis.ch" rename to chroma/-whatis.ch diff --git "a/\342\206\222chroma/-which.ch" b/chroma/-which.ch similarity index 100% rename from "\342\206\222chroma/-which.ch" rename to chroma/-which.ch diff --git "a/\342\206\222chroma/-zi.ch" b/chroma/-zi.ch similarity index 82% rename from "\342\206\222chroma/-zi.ch" rename to chroma/-zi.ch index 3f77240..7019664 100755 --- "a/\342\206\222chroma/-zi.ch" +++ b/chroma/-zi.ch @@ -16,7 +16,7 @@ fsh__zi__chroma__def=( subcmd:NULL "NULL_0_opt" NULL_0_opt "(-help|--help|-h) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" "subcommands" "(help|subcmds|icemods|analytics|man|self-update|times|zstatus|load|light|unload|snippet|ls|ice||update|status|report|delete|loaded|list|cd|create|edit|glance|stress|changes|recently|clist|completions|cclear|cdisable|cenable|creinstall|cuninstall|csearch|compinit|dtrace|dstart|dstop|dunload|dreport|dclear|compile|uncompile|compiled|cdlist|cdreplay|cdclear|srv|recall|env-whitelist|bindkeys|module|add-fpath|run)" ## }}} @@ -33,7 +33,7 @@ fsh__zi__chroma__def=( subcmd:ice "ICE_#_arg // NO_MATCH_#_opt" - "ICE_#_arg" "NO-OP // ::→chroma/-zi-check-ice-mod" + "ICE_#_arg" "NO-OP // ::chroma/-zi-check-ice-mod" ## ## `snippet' @@ -43,9 +43,9 @@ fsh__zi__chroma__def=( subcmd:snippet "SNIPPET_0_opt // SNIPPET_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" SNIPPET_0_opt "(-h|--help|-f|--force|--command|-x) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - SNIPPET_1_arg "NO-OP // ::→chroma/-zi-verify-snippet" + SNIPPET_1_arg "NO-OP // ::chroma/-zi-verify-snippet" ## }}} @@ -56,9 +56,9 @@ fsh__zi__chroma__def=( "subcmd:load" "LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - LOAD_1_arg "NO-OP // ::→chroma/-zi-verify-plugin" + LOAD_1_arg "NO-OP // ::chroma/-zi-verify-plugin" - LOAD_2_arg "NO-OP // ::→chroma/-zi-verify-plugin" + LOAD_2_arg "NO-OP // ::chroma/-zi-verify-plugin" ## }}} @@ -70,9 +70,9 @@ fsh__zi__chroma__def=( "subcmd:(compile|uncompile|stress|edit|glance|recall|status|cd|changes)" "PLGSNP_1_arg // PLGSNP_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - PLGSNP_1_arg "NO-OP // ::→chroma/-zi-verify-plugin-or-snippet" + PLGSNP_1_arg "NO-OP // ::chroma/-zi-verify-plugin-or-snippet" - PLGSNP_2_arg "NO-OP // ::→chroma/-zi-verify-plugin-or-snippet" + PLGSNP_2_arg "NO-OP // ::chroma/-zi-verify-plugin-or-snippet" ## }}} @@ -85,7 +85,7 @@ fsh__zi__chroma__def=( UPDATE_0_opt " (-L|--plugins|-s|--snippets|-p|--parallel|-a|--all|-q|--quiet|-r|--reset|-u|--urge|-n|--no-pager|-v|--verbose|-h|--help) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" ## }}} @@ -97,7 +97,7 @@ fsh__zi__chroma__def=( subcmd:light "LIGHT_0_opt // LOAD_1_arg // LOAD_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" LIGHT_0_opt "-h|--help|-b - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" ## }}} @@ -109,11 +109,11 @@ fsh__zi__chroma__def=( subcmd:unload "UNLOAD_0_opt // UNLOAD_1_arg // UNLOAD_2_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" UNLOAD_0_opt "-h|--help|-q|--quiet - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" - UNLOAD_1_arg "NO-OP // ::→chroma/-zi-verify-loaded-plugin" + UNLOAD_1_arg "NO-OP // ::chroma/-zi-verify-loaded-plugin" - UNLOAD_2_arg "NO-OP // ::→chroma/-zi-verify-loaded-plugin" + UNLOAD_2_arg "NO-OP // ::chroma/-zi-verify-loaded-plugin" ## }}} @@ -126,7 +126,7 @@ fsh__zi__chroma__def=( NO_MATCH_#_arg" REPORT_0_opt "--all - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" ## }}} @@ -140,7 +140,7 @@ fsh__zi__chroma__def=( DELETE_0_opt " (-a|--all|-c|--clean|-y|--yes|-q|--quiet|-h|--help) - <<>> NO-OP // ::→chroma/main-chroma-std-aopt-action" + <<>> NO-OP // ::chroma/main-chroma-std-aopt-action" ## }}} @@ -151,7 +151,7 @@ fsh__zi__chroma__def=( subcmd:cenable "COMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - COMPLETION_1_arg "NO-OP // ::→chroma/-zi-verify-disabled-completion" + COMPLETION_1_arg "NO-OP // ::chroma/-zi-verify-disabled-completion" ## }}} @@ -162,7 +162,7 @@ fsh__zi__chroma__def=( subcmd:cdisable "DISCOMPLETION_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - DISCOMPLETION_1_arg "NO-OP // ::→chroma/-zi-verify-completion" + DISCOMPLETION_1_arg "NO-OP // ::chroma/-zi-verify-completion" ## }}} @@ -174,7 +174,7 @@ fsh__zi__chroma__def=( subcmd:uncompile "UNCOMPILE_1_arg // NO_MATCH_#_opt // NO_MATCH_#_arg" - UNCOMPILE_1_arg "NO-OP // ::→chroma/-zi-verify-compiled-plugin" + UNCOMPILE_1_arg "NO-OP // ::chroma/-zi-verify-compiled-plugin" ## }}} @@ -184,17 +184,17 @@ fsh__zi__chroma__def=( ## {{{ "subcmd:*" "CATCH_ALL_#_opt" - "CATCH_ALL_#_opt" "* <<>> NO-OP // ::→chroma/main-chroma-std-aopt-SEMI-action" + "CATCH_ALL_#_opt" "* <<>> NO-OP // ::chroma/main-chroma-std-aopt-SEMI-action" ## }}} ) -#→chroma/-zi-first-call() { +#chroma/-zi-first-call() { # This is being done in the proper place - in -fast-highlight-process #FAST_HIGHLIGHT[chroma-zi-ice-elements-svn]=0 #} -→chroma/-zi-verify-plugin() { +chroma/-zi-verify-plugin() { local _scmd="$1" _wrd="$4" [[ -d "$_wrd" ]] && { __style=${FAST_THEME_NAME}correct-subtle; return 0; } @@ -210,12 +210,12 @@ fsh__zi__chroma__def=( return 0 } -→chroma/-zi-verify-plugin-or-snippet() { - →chroma/-zi-verify-plugin "$1" "" "" "$4" || →chroma/-zi-verify-snippet "$1" "" "" "$4" +chroma/-zi-verify-plugin-or-snippet() { + chroma/-zi-verify-plugin "$1" "" "" "$4" || chroma/-zi-verify-snippet "$1" "" "" "$4" return $? } -→chroma/-zi-verify-loaded-plugin() { +chroma/-zi-verify-loaded-plugin() { local _scmd="$1" _wrd="$4" typeset -a plugins absolute1 absolute2 absolute3 normal plugins=( "${ZI_REGISTERED_PLUGINS[@]:#_local/zi}" ) @@ -235,7 +235,7 @@ fsh__zi__chroma__def=( return 0 } -→chroma/-zi-verify-completion() { +chroma/-zi-verify-completion() { local _scmd="$1" _wrd="$4" # Find enabled completions typeset -a completions @@ -249,7 +249,7 @@ fsh__zi__chroma__def=( return 0 } -→chroma/-zi-verify-disabled-completion() { +chroma/-zi-verify-disabled-completion() { local _scmd="$1" _wrd="$4" # Find enabled completions typeset -a completions @@ -262,7 +262,7 @@ fsh__zi__chroma__def=( return 0 } -→chroma/-zi-verify-compiled-plugin() { +chroma/-zi-verify-compiled-plugin() { local _scmd="$1" _wrd="$4" typeset -a plugins @@ -284,7 +284,7 @@ fsh__zi__chroma__def=( return 1 } -→chroma/-zi-verify-snippet() { +chroma/-zi-verify-snippet() { local _scmd="$1" url="$4" dirname local_dir url="${${url#"${url%%[! $'\t']*}"}%/}" id_as="${FAST_HIGHLIGHT[chroma-zi-ice-elements-id-as]:-${ZI_ICE[id-as]:-$url}}" @@ -308,7 +308,7 @@ fsh__zi__chroma__def=( } } -→chroma/-zi-check-ice-mod() { +chroma/-zi-check-ice-mod() { local _scmd="$1" _wrd="$4" [[ "$_wrd" = (svn(\'|\")*|svn) ]] && FAST_HIGHLIGHT[chroma-zi-ice-elements-svn]=1 [[ "$_wrd" = (#b)(id-as(:|)(\'|\")(*)(\'|\")|id-as:(*)|id-as(*)) ]] && \ diff --git "a/\342\206\222chroma/main-chroma.ch" b/chroma/main-chroma.ch similarity index 64% rename from "\342\206\222chroma/main-chroma.ch" rename to chroma/main-chroma.ch index 3224ec1..2691e2a 100755 --- "a/\342\206\222chroma/main-chroma.ch" +++ b/chroma/main-chroma.ch @@ -15,7 +15,7 @@ (( next_word = 2 | 8192 )) -→chroma/main-chroma-print() { +chroma/main-chroma-print() { (( FAST_HIGHLIGHT[DEBUG] )) && print "$@" >> /tmp/fsh-dbg } @@ -25,10 +25,10 @@ local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __en [[ -z "$__chroma_name" ]] && return 1 # Load the fsh_{name-of-the-chroma}_chroma_def array -(( !FAST_HIGHLIGHT[-${__chroma_name}.ch-chroma-def] )) && →chroma/-${__chroma_name}.ch +(( !FAST_HIGHLIGHT[-${__chroma_name}.ch-chroma-def] )) && chroma/-${__chroma_name}.ch -→chroma/main-chroma-print -r -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -→chroma/main-chroma-print -r -- @@@@@@@ local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __end_pos="$5" @@@@@@@ +chroma/main-chroma-print -r -- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +chroma/main-chroma-print -r -- @@@@@@@ local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __end_pos="$5" @@@@@@@ local __style __entry __value __action __handler __tmp __svalue __hspaces=$'\t ' __nl=$'\n' __ch_def_name integer __idx1 __idx2 __start __end __ivalue __have_value=0 local -a __lines_list __avalue @@ -38,7 +38,7 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) (( __start=_start_pos-__PBUFLEN, __end=_end_pos-__PBUFLEN )) # Handler that highlights the options -→chroma/main-chroma-std-aopt-action() { +chroma/main-chroma-std-aopt-action() { integer _start="$2" _end="$3" local _scmd="$1" _wrd="$4" @@ -51,7 +51,7 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) } # Handler that highlights the options' arguments -→chroma/main-chroma-std-aopt-ARG-action() { +chroma/main-chroma-std-aopt-ARG-action() { integer _start="$2" _end="$3" local _scmd="$1" _wrd="$4" @@ -61,7 +61,7 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) } # This handler also highlights explicit arguments, i.e. --opt=the-explicit-arg -→chroma/main-chroma-std-aopt-SEMI-action() { +chroma/main-chroma-std-aopt-SEMI-action() { integer _start="$2" _end="$3" local _scmd="$1" _wrd="$4" @@ -75,7 +75,7 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) } # A handler which verifies the token as an GIT url -→chroma/main-chroma-std-verify-url() { +chroma/main-chroma-std-verify-url() { setopt localoptions extendedglob local _wrd="$4" integer url_correct=0 @@ -99,21 +99,21 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) } # A handler which verifies the token as a shell wildcard -→chroma/main-chroma-std-verify-pattern() { +chroma/main-chroma-std-verify-pattern() { setopt localoptions extendedglob local _wrd="$4" __style=${FAST_THEME_NAME}globbing-ext } # Creates a hash table for given option set (an *_opt field in the chroma def.) -→chroma/main-create-OPTION-hash.ch() { +chroma/main-create-OPTION-hash.ch() { local __subcmd="$1" __option_set_id="$2" __the_hash_name="$3" __ __e __el __the_hash_name __var_name local -a __split __sp __s - →chroma/main-chroma-print -rl "======================" " **## STARTING ##** →chroma/main-##CREATE##-option-HASH.ch // subcmd:$__subcmd // option_set_id:$__option_set_id // h-nam:$__the_hash_name" - →chroma/main-chroma-print "[D] Got option-set: ${(j:,:)__option_set_id}" + chroma/main-chroma-print -rl "======================" " **## STARTING ##** chroma/main-##CREATE##-option-HASH.ch // subcmd:$__subcmd // option_set_id:$__option_set_id // h-nam:$__the_hash_name" + chroma/main-chroma-print "[D] Got option-set: ${(j:,:)__option_set_id}" typeset -gA "$__the_hash_name" - →chroma/main-chroma-print "[E] __the_hash_name ${__the_hash_name}:[$__option_set_id]" + chroma/main-chroma-print "[E] __the_hash_name ${__the_hash_name}:[$__option_set_id]" # Split on || __ch_def_name="fsh__${__chroma_name}__chroma__def[${__option_set_id}]" @@ -122,13 +122,13 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) # Remove only leading and trailing whitespace __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - →chroma/main-chroma-print -rl "[F] Got ||-__split: _________" ${${(@)${${__split[@]##[[:space:]]##}[@]//[${__hspaces}]##/ }[@]//[${__nl}]##/$__nl}[@]//(#s)/:::} "_________" + chroma/main-chroma-print -rl "[F] Got ||-__split: _________" ${${(@)${${__split[@]##[[:space:]]##}[@]//[${__hspaces}]##/ }[@]//[${__nl}]##/$__nl}[@]//(#s)/:::} "_________" for __el in $__split; do __sp=( "${(@s:<<>>:)__el}" ) [[ ${#__sp} -eq 1 && -z "${__sp[1]}" ]] && __sp=() __sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - →chroma/main-chroma-print -l -- "Processing an ||-part - got <<>>-split: _________" "${${__sp[@]}[@]/(#s)/-\\t}" "_________" + chroma/main-chroma-print -l -- "Processing an ||-part - got <<>>-split: _________" "${${__sp[@]}[@]/(#s)/-\\t}" "_________" __e="${__sp[1]}" local __e1=${${__e#\(}%\)(:add|:del|)} local __e2=${(M)__e##\(*\)(:add|:del)} @@ -145,12 +145,12 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) for __ in $__s; do __=${__%\^} [[ "$__" = -*:(add|del) ]] && __var_name="${__the_hash_name}[${__}-directive]" || __var_name="${__the_hash_name}[${__}-opt-action]" - →chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[1]}${${${#__sp}:#(0|1)}:+ +}<<" + chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[1]}${${${#__sp}:#(0|1)}:+ +}<<" : ${(P)__var_name::=${__sp[1]}${${${#__sp}:#(0|1)}:+ +}} if (( ${#__sp} >= 2 )); then __var_name="${__the_hash_name}[${__}-opt-arg-action]" - →chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[2]}<<}" + chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[2]}<<}" : ${(P)__var_name::=$__sp[2]} fi done @@ -158,18 +158,18 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) } # Processes given token -→chroma/main-process-token.ch() { +chroma/main-process-token.ch() { local __subcmd="$1" __wrd="$2" __val __var_name __main_hash_name __the_hash_name __i __size local -a __splitted __split __added - →chroma/main-chroma-print "\n******************* Starting →chroma/main-process-token <<$__wrd>>// subcmd:${(qq)__subcmd}" + chroma/main-chroma-print "\n******************* Starting chroma/main-process-token <<$__wrd>>// subcmd:${(qq)__subcmd}" __main_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^\*])/${map[${match[1]}]}}" __var_name="${__main_hash_name}[subcmd:$__subcmd]" __splitted=( "${(@s://:P)__var_name}" ) [[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=() __splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - →chroma/main-chroma-print -rl -- "[B] MAIN-PROCESS-TOKEN: got [OPTION/ARG-**S-E-T-S**] //-splitted from subcmd:$__subcmd: ${${(j:, :)__splitted}:-EMPTY-SET!}" "----- __splitted\\Deleted: -----" ${${(j:, :)${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (deleted)!} "----- Added\\Deleted: -----" ${${(j:, :)${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (added)!} -----\ Deleted:\ ----- ${(j:, :)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}} >> /tmp/reply + chroma/main-chroma-print -rl -- "[B] MAIN-PROCESS-TOKEN: got [OPTION/ARG-**S-E-T-S**] //-splitted from subcmd:$__subcmd: ${${(j:, :)__splitted}:-EMPTY-SET!}" "----- __splitted\\Deleted: -----" ${${(j:, :)${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (deleted)!} "----- Added\\Deleted: -----" ${${(j:, :)${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (added)!} -----\ Deleted:\ ----- ${(j:, :)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}} >> /tmp/reply (( ! ${#__splitted} )) && { __var_name="${__main_hash_name}[subcmd:*]" @@ -179,24 +179,24 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) (( ! ${#__splitted} )) && return 1 } - →chroma/main-chroma-print -rl -- "---NO-HASH-CREATE-FROM-NOW-ON---" + chroma/main-chroma-print -rl -- "---NO-HASH-CREATE-FROM-NOW-ON---" if [[ -z "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" ]]; then - →chroma/main-chroma-print -rl -- "-z OPT-WITH-ARG-ACTIVE == true" + chroma/main-chroma-print -rl -- "-z OPT-WITH-ARG-ACTIVE == true" if [[ "$__wrd" = -* ]]; then - →chroma/main-chroma-print "1st-PATH (-z opt-with-arg-active, non-opt-arg branch, i.e. OPTION BRANCH) [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]" + chroma/main-chroma-print "1st-PATH (-z opt-with-arg-active, non-opt-arg branch, i.e. OPTION BRANCH) [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]" for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do - [[ "${__val}" != "${__val%%_([0-9]##|\#)##*}"_${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}_opt(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_opt(\*|\^|) ]] && { →chroma/main-chroma-print "DIDN'T MATCH $__val / arg counter:${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue; } || →chroma/main-chroma-print "Got candidate: $__val" + [[ "${__val}" != "${__val%%_([0-9]##|\#)##*}"_${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}_opt(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_opt(\*|\^|) ]] && { chroma/main-chroma-print "DIDN'T MATCH $__val / arg counter:${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue; } || chroma/main-chroma-print "Got candidate: $__val" # Create the hash cache-parameter if needed __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//(#b)([\#\^\*])/${map[${match[1]}]}}//[^a-zA-Z0-9_]/_}" - [[ "$__val" = *_opt(\*|\^|) && "${(P)+__the_hash_name}" -eq 0 ]] && →chroma/main-create-OPTION-hash.ch "$__subcmd" "$__val" "$__the_hash_name" || →chroma/main-chroma-print "Not creating, the hash already exists..." + [[ "$__val" = *_opt(\*|\^|) && "${(P)+__the_hash_name}" -eq 0 ]] && chroma/main-create-OPTION-hash.ch "$__subcmd" "$__val" "$__the_hash_name" || chroma/main-chroma-print "Not creating, the hash already exists..." # Try dedicated-entry for the option __var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action]" __split=( "${(@s://:P)__var_name}" ) [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() # If no result, then try with catch-all entry (( ! ${#__split} )) && { - →chroma/main-chroma-print "% no ${(q-)${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action, retrying with *-opt-action" "|__var_name|:$__var_name" + chroma/main-chroma-print "% no ${(q-)${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action, retrying with *-opt-action" "|__var_name|:$__var_name" __var_name="${__the_hash_name}[*-opt-action]" __split=( "${(@s://:P)__var_name}" ) [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() @@ -204,19 +204,19 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) __svalue="$__var_name" # Remove whitespace __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - →chroma/main-chroma-print -l -- "\`$__val' // ${#__split} // $__wrd: (ch.run #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]}), deref. of \`$__var_name'" + chroma/main-chroma-print -l -- "\`$__val' // ${#__split} // $__wrd: (ch.run #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]}), deref. of \`$__var_name'" if (( ${#__split} )); then - →chroma/main-chroma-print -l -- "Got split of {\$#__split:$#__split} ${__wrd}-opt-action or *-opt-action" "${${(q-)__split[@]}[@]/(#s)/->\\t}" + chroma/main-chroma-print -l -- "Got split of {\$#__split:$#__split} ${__wrd}-opt-action or *-opt-action" "${${(q-)__split[@]}[@]/(#s)/->\\t}" if [[ "${__split[2]}" = *[[:blank:]]+ ]]; then - →chroma/main-chroma-print "YES handling the value (the OPT.ARGUMENT)! [${__split[2]}]" + chroma/main-chroma-print "YES handling the value (the OPT.ARGUMENT)! [${__split[2]}]" if [[ "$__wrd" = *=* ]]; then - →chroma/main-chroma-print "The-immediate Arg-Acquiring, of option" + chroma/main-chroma-print "The-immediate Arg-Acquiring, of option" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="${__wrd#*=}" __have_value=2 else - →chroma/main-chroma-print "Enable Arg-Awaiting, of option" - →chroma/main-chroma-print "FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=\"${__svalue%-opt-action\]}-opt-arg-action]\"" + chroma/main-chroma-print "Enable Arg-Awaiting, of option" + chroma/main-chroma-print "FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=\"${__svalue%-opt-action\]}-opt-arg-action]\"" __have_value=0 FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" fi @@ -240,27 +240,27 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) # First: del-directive FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${(j: :)__split[__ivalue+1,__tmp]} " - →chroma/main-chroma-print -rl ":add / :del directives: __ivalue:$__ivalue, THE __SPLIT[#$__tmp]: " "${__split[@]}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]} >> /tmp/reply + chroma/main-chroma-print -rl ":add / :del directives: __ivalue:$__ivalue, THE __SPLIT[#$__tmp]: " "${__split[@]}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]} >> /tmp/reply # Second: add-directive FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${(j: :)__split[1,__ivalue]} " fi [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" || __handler="" - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(1): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ "$__have_value" -ne 2 && -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl "Running action (1): $__action" ; eval "() { $__action; }"; } + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(1): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ "$__have_value" -ne 2 && -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl "Running action (1): $__action" ; eval "() { $__action; }"; } [[ "$__val" != *\* ]] && break else - →chroma/main-chroma-print -rl -- "NO-MATCH ROUTE TAKEN" + chroma/main-chroma-print -rl -- "NO-MATCH ROUTE TAKEN" fi done else - →chroma/main-chroma-print "1st-PATH-B (-z opt-with-arg-active, non-opt-arg branch, ARGUMENT BRANCH [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]) //// added-nodes: ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}" + chroma/main-chroma-print "1st-PATH-B (-z opt-with-arg-active, non-opt-arg branch, ARGUMENT BRANCH [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]) //// added-nodes: ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}" for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do - [[ "${__val}" != "${__val%%_([0-9]##|\#)*}"_"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"_arg(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_arg(\*|\^|) ]] && { →chroma/main-chroma-print "Continuing for $__val / arg counter ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue } + [[ "${__val}" != "${__val%%_([0-9]##|\#)*}"_"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"_arg(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_arg(\*|\^|) ]] && { chroma/main-chroma-print "Continuing for $__val / arg counter ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue } # Create the hash cache-parameter if needed __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//\#/H}//[^a-zA-Z0-9_]/_}" __action="" __handler="" - →chroma/main-chroma-print "A hit, chosen __val:$__val!" + chroma/main-chroma-print "A hit, chosen __val:$__val!" __ch_def_name="fsh__${__chroma_name}__chroma__def[$__val]" __split=( "${(P@s:<<>>:)__ch_def_name}" ) __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) @@ -271,13 +271,13 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) # Verify if it's the expected argument [[ "${__sp[1]}" = *:::::* && "$__wrd" != ${~${__sp[1]%% ##:::::*}} ]] && \ - { →chroma/main-chroma-print -r "mismatch ${__sp[1]%% ##:::::*} != $__wrd, continuing" ; continue; } + { chroma/main-chroma-print -r "mismatch ${__sp[1]%% ##:::::*} != $__wrd, continuing" ; continue; } - →chroma/main-chroma-print -l -- "Got action record for $__val, i.e. the split:" "${__sp[@]//(#s)/-\t}" "_________" + chroma/main-chroma-print -l -- "Got action record for $__val, i.e. the split:" "${__sp[@]//(#s)/-\t}" "_________" - [[ "${__sp[2]}" = ::[^[:space:]]* ]] && __handler="${__sp[2]#::}" || { [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && →chroma/main-chroma-print "=== Error === In chroma definition: a handler entry ${(q)__sp[2]} without leading \`::'" ; } - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(3): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running action(3): $__action" ; eval "() { $__action; } \"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}\" \"$__start\" \"$__end\" \"$__wrd\""; } + [[ "${__sp[2]}" = ::[^[:space:]]* ]] && __handler="${__sp[2]#::}" || { [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && chroma/main-chroma-print "=== Error === In chroma definition: a handler entry ${(q)__sp[2]} without leading \`::'" ; } + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(3): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running action(3): $__action" ; eval "() { $__action; } \"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}\" \"$__start\" \"$__end\" \"$__wrd\""; } # Check for argument directives (like :add) if (( ${#__split} >= 2 )); then @@ -289,54 +289,57 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${__splitted[1]#del:} ${(j: :)__splitted[2,-1]} " fi done - →chroma/main-chroma-print -l "ARGUMENT :add / :del directives: THE __SPLIT[#${#__split}]: " "${__split[@]//(#s)/-\\t}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}//(#s)/-\\t} "The FAST_HIGHLIGHT[chroma-*added-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}//(#s)/-\\t} + chroma/main-chroma-print -l "ARGUMENT :add / :del directives: THE __SPLIT[#${#__split}]: " "${__split[@]//(#s)/-\\t}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}//(#s)/-\\t} "The FAST_HIGHLIGHT[chroma-*added-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}//(#s)/-\\t} fi [[ "$__val" != *\* ]] && break done fi else - →chroma/main-chroma-print -- "2nd-PATH (-n opt-with-arg-active) NON-EMPTY arg-active:\nThe actual opt-val <<< \$__wrd:$__wrd >>> store (after the \`Arg-Awaiting' in the chroma-run: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]-1 )) [current: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))])" + chroma/main-chroma-print -- "2nd-PATH (-n opt-with-arg-active) NON-EMPTY arg-active:\nThe actual opt-val <<< \$__wrd:$__wrd >>> store (after the \`Arg-Awaiting' in the chroma-run: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]-1 )) [current: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))])" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="$__wrd" __have_value=1 fi # Execute the action if not during simulated opt-argument (--opt=...) - →chroma/main-chroma-print "** BEFORE: \`if (( __have_value ))'" + chroma/main-chroma-print "** BEFORE: \`if (( __have_value ))'" if (( __have_value )); then - →chroma/main-chroma-print "In the \`if (( __have_value ))' [have_value: $__have_value]" + chroma/main-chroma-print "In the \`if (( __have_value ))' [have_value: $__have_value]" # Split __var_name="${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="" __split=( "${(@s://:P)__var_name}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && { →chroma/main-chroma-print -rl "NULL at __var_name:$__var_name" ; __split=(); } + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && { chroma/main-chroma-print -rl "NULL at __var_name:$__var_name" ; __split=(); } __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) # Remember 1st level action (( __have_value == 2 )) && __value="$__action" || __value="" if (( ${#__split} )); then - →chroma/main-chroma-print -l -- "Got //-split (3, for opt-ARG-action, from [$__var_name]):" "${${(q-)__split[@]}[@]/(#s)/+\\t}" + chroma/main-chroma-print -l -- "Got //-split (3, for opt-ARG-action, from [$__var_name]):" "${${(q-)__split[@]}[@]/(#s)/+\\t}" __action="${__split[1]}" __handler="${__split[2]}" [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running handler(2): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ -n "$__action" && "$__action" != "NO-OP" ]] && { →chroma/main-chroma-print -rl -- "Running action(2): $__action" ; eval "$__action"; } - →chroma/main-chroma-print -rl -- "The __action value: [$__value]" - [[ "$__have_value" -eq 2 && -n "$__value" && "$__value" != "NO-OP" ]] && { →chroma/main-chroma-print -rl "Running action (of 1, at 2): $__value" ; eval "$__value"; } + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && \ + {chroma/main-chroma-print -rl -- "Running handler(2): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ -n "$__action" && "$__action" != "NO-OP" ]] && \ + { chroma/main-chroma-print -rl -- "Running action(2): $__action" ; eval "$__action"; } + chroma/main-chroma-print -rl -- "The __action value: [$__value]" + [[ "$__have_value" -eq 2 && -n "$__value" && "$__value" != "NO-OP" ]] && \ + { chroma/main-chroma-print -rl "Running action (of 1, at 2): $__value" ; eval "$__value"; } fi fi - →chroma/main-chroma-print -- "_________ Exiting →chroma/main-process-token.ch $__subcmd / $__wrd _________" + chroma/main-chroma-print -- "_________ Exiting chroma/main-process-token.ch $__subcmd / $__wrd _________" } # Iterates over the chroma def. fields and creates initial # fields in the fsh__${__chroma_name}__chroma__def hash -→chroma/-pre_process_chroma_def.ch() { +chroma/-pre_process_chroma_def.ch() { local __key __value __ke _val __the_hash_name="$1" __var_name local -a __split - →chroma/main-chroma-print -rl -- "Starting PRE_PROCESS for __the_hash_name:$__the_hash_name" + chroma/main-chroma-print -rl -- "Starting PRE_PROCESS for __the_hash_name:$__the_hash_name" __ch_def_name="fsh__${__chroma_name}__chroma__def[subcommands]" local __subcmds="${(P)__ch_def_name}" @@ -348,7 +351,7 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) __var_name="${__the_hash_name}[subcommands]" : ${(P)__var_name::=$__subcmds} fi - →chroma/main-chroma-print "Got SUBCOMMANDS: ${(P)__var_name}" + chroma/main-chroma-print "Got SUBCOMMANDS: ${(P)__var_name}" __ch_def_name="fsh__${__chroma_name}__chroma__def[subcmd-hook]" local __subcmd_hook="${(P)__ch_def_name}" @@ -366,13 +369,13 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) __var_name="${__the_hash_name}[subcmd:$__ke]" __ch_def_name="fsh__${__chroma_name}__chroma__def[$__key]" : ${(P)__var_name::=${(P)__ch_def_name}} - →chroma/main-chroma-print -rl -- "Storred ${__var_name}=chroma_def[$__key], i.e. = ${(P)__ch_def_name}" + chroma/main-chroma-print -rl -- "Storred ${__var_name}=chroma_def[$__key], i.e. = ${(P)__ch_def_name}" done done } if (( __first_call )); then - →chroma/-${__chroma_name}-first-call + chroma/-${__chroma_name}-first-call FAST_HIGHLIGHT[chroma-current]="$__wrd" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]=0 FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=0 @@ -386,8 +389,8 @@ if (( __first_call )); then __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" (( 0 == ${(P)+__the_hash_name} )) && { typeset -gA "$__the_hash_name" - →chroma/-pre_process_chroma_def.ch "$__the_hash_name" - } || →chroma/main-chroma-print "...No... [\${+$__the_hash_name} ${(P)+__the_hash_name}]" + chroma/-pre_process_chroma_def.ch "$__the_hash_name" + } || chroma/main-chroma-print "...No... [\${+$__the_hash_name} ${(P)+__the_hash_name}]" return 1 else (( ++ FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] )) @@ -397,11 +400,11 @@ else # "starts new command", if so pass-through – chroma ends [[ "$__arg_type" = 3 ]] && return 2 - →chroma/main-chroma-print "== @@ Starting @@ #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]} Main-Chroma-call == // << __WORD:$__wrd >> ## Subcommand: ${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL} //@@// -n option-with-arg-active:${(q-)FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" + chroma/main-chroma-print "== @@ Starting @@ #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]} Main-Chroma-call == // << __WORD:$__wrd >> ## Subcommand: ${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL} //@@// -n option-with-arg-active:${(q-)FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" if [[ "$__wrd" = -* || -n "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" ]]; then - →chroma/main-chroma-print "## The \`if -*' i.e. \`IF OPTION' MAIN branch" - →chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" + chroma/main-chroma-print "## The \`if -*' i.e. \`IF OPTION' MAIN branch" + chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" else # If at e.g. '>' or destination/source spec (of the redirection) if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then @@ -410,17 +413,17 @@ else __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" __var_name="${__the_hash_name}[subcommands]" if [[ "$__wrd" = ${(P)~__var_name} ]]; then - →chroma/main-chroma-print "GOT-SUBCOMMAND := $__wrd, subcmd verification / OK" + chroma/main-chroma-print "GOT-SUBCOMMAND := $__wrd, subcmd verification / OK" FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=1 FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="$__wrd" __var_name="${__the_hash_name}[subcmd-hook]" - (( ${(P)+__var_name} )) && { →chroma/main-chroma-print -r -- "Running subcmd-hook: ${(P)__var_name}" ; "${(P)__var_name}" "$__wrd"; } + (( ${(P)+__var_name} )) && { chroma/main-chroma-print -r -- "Running subcmd-hook: ${(P)__var_name}" ; "${(P)__var_name}" "$__wrd"; } __style="${FAST_THEME_NAME}subcommand" else - →chroma/main-chroma-print "subcmd verif / NOT OK; Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" >> /tmp/fsh-dbg + chroma/main-chroma-print "subcmd verif / NOT OK; Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" >> /tmp/fsh-dbg (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) - →chroma/main-chroma-print "UNRECOGNIZED ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" - →chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" + chroma/main-chroma-print "UNRECOGNIZED ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" + chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" fi } else { __wrd="${__wrd//\`/x}" @@ -434,12 +437,12 @@ else return 1 } - →chroma/main-chroma-print "Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" + chroma/main-chroma-print "Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) - →chroma/main-chroma-print "ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" + chroma/main-chroma-print "ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" - →chroma/main-chroma-print "ELSE *-got-subcommand == 1 is TRUE" - →chroma/main-process-token.ch "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}" "$__wrd" + chroma/main-chroma-print "ELSE *-got-subcommand == 1 is TRUE" + chroma/main-process-token.ch "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}" "$__wrd" } fi fi diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ac7d048..474c1cb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,7 +2,7 @@ ## 2018-08-09 -Added ideal string highlighting – FSH now handles any legal quoting and combination of `"`,`'` and `\` when +Added ideal string highlighting – f-sy-h now handles any legal quoting and combination of `"`,`'` and `\` when highlighting program arguments. See the introduction for an example (item #14). ## 2018-08-02 @@ -28,7 +28,7 @@ set_fast_theme() { ``` If you have set theme before an update of styles (e.g. recent addition of bracket highlighting) -then please repeat `fast-theme {theme}` call to regenerate theme files. (**2018-08-09**: FSH +then please repeat `fast-theme {theme}` call to regenerate theme files. (**2018-08-09**: f-sy-h now has full user-theme support, refer to [appropriate section of README](README.md#customization)). ## 2018-07-30 @@ -46,7 +46,7 @@ will be invoked everything will work as expected (Git chroma will be ran). ## 2018-07-11 -There were problems with Ctrl-C not working when using FSH. After many days I've found a fix +There were problems with Ctrl-C not working when using f-sy-h. After many days I've found a fix for this, it's pushed to main. Second, asynchronous path checking (useful on e.g. slow network drives, or when there are many files in directory) @@ -61,7 +61,7 @@ it shows functionality of `awk` – compiling of code and NOT running it. Perl c ## 2018-06-06 -FSH gained a new architecture – "chroma functions". They are similar to "completion functions", i.e. they +f-sy-h gained a new architecture – "chroma functions". They are similar to "completion functions", i.e. they are defined **per-command**, but instead of completing that command, they colorize it. Two chroma exist, for `Git` ([video](https://asciinema.org/a/185707), [video](https://asciinema.org/a/185811)) and for `grep` ([video](https://asciinema.org/a/185942)). Checkout @@ -91,7 +91,7 @@ For-loop is highlighted, it has separate settings in [theme file](https://github ## 2018-05-27 -Added support for 256-color themes. There are six themes shipped with FSH. The command to +Added support for 256-color themes. There are six themes shipped with f-sy-h. The command to switch theme is `fast-theme {theme-name}`, it has a completion which lists available themes and options. Checkout [asciinema recording](https://asciinema.org/a/183814) that presents the themes. diff --git a/docs/CHROMA_GUIDE.adoc b/docs/CHROMA_GUIDE.adoc index efb3614..0d2757e 100644 --- a/docs/CHROMA_GUIDE.adoc +++ b/docs/CHROMA_GUIDE.adoc @@ -134,7 +134,7 @@ integer __idx1 __idx2 # Colorize 1..2 as builtin, 3.. as glob if (( FAST_HIGHLIGHT[chroma-example-counter] <= 2 )); then if [[ "$__wrd" = \"* ]]; then - # Pass through, fsh main code will do the highlight! + # Pass through, f-sy-h main code will do the highlight! return 1 else __style=${FAST_THEME_NAME}builtin diff --git a/docs/README.md b/docs/README.md index fc755b1..55b9564 100644 --- a/docs/README.md +++ b/docs/README.md @@ -41,11 +41,11 @@ src="https://raw.githubusercontent.com/z-shell/.github/main/metrics/plugin/metri

Clone the Repository.

-
git clone https://github.com/z-shell/F-Sy-H ~/path/to/fsh
+
git clone https://github.com/z-shell/F-Sy-H ~/path/to/f-sy-h

And add the following to your `zshrc` file.

-
source ~/path/to/fsh/F-Sy-H.plugin.zsh
+
source ~/path/to/f-sy-h/F-Sy-H.plugin.zsh

Zi

diff --git a/docs/THEME_GUIDE.md b/docs/THEME_GUIDE.md index db340cc..a1b4c19 100644 --- a/docs/THEME_GUIDE.md +++ b/docs/THEME_GUIDE.md @@ -26,14 +26,14 @@ File name `overlay.ini` is treated specially. When specifing path, following short-hands can be used: ```ini -CONFIG: = ~/.config/fsh (respects $XDG_CONFIG_HOME env var) -CACHE: = ~/.cache/zi/fsh (respects $XDG_CACHE_HOME env var) -LOCAL: = /usr/local/share/fsh/ -HOME: = ~/.fsh/ -OPT: = /opt/local/share/fsh/ +CONFIG: = ~/.config/f-sy-h (respects $XDG_CONFIG_HOME env var) +CACHE: = ~/.cache/zi/f-sy-h (respects $XDG_CACHE_HOME env var) +LOCAL: = /usr/local/share/f-sy-h/ +HOME: = ~/.f-sy-h/ +OPT: = /opt/local/share/f-sy-h/ ``` -So for example, issue `fast-theme CONFIG:overlay` to load `~/.config/fsh/overlay.ini` as overlay. The `.ini` +So for example, issue `fast-theme CONFIG:overlay` to load `~/.config/f-sy-h/overlay.ini` as overlay. The `.ini` extension is optional. ## Secondary Theme @@ -72,6 +72,6 @@ load, in Zsh format, not INI) kept under specified location. This is handy if e. Fast-Syntax-Highlighting system-wide (e.g. from AUR on ArchLinux) and want to have per-user theme setup. -You can use "~" in the path, e.g. `FAST_WORK_DIR=~/.fsh` and also the `CONFIG:`, `CACHE:`, `LOCAL:`, `OPT:`, +You can use "~" in the path, e.g. `FAST_WORK_DIR=~/.f-sy-h` and also the `CONFIG:`, `CACHE:`, `LOCAL:`, `OPT:`, etc. short-hands, so e.g. `FAST_WORK_DIR=CONFIG` or `FAST_WORK_DIR=CONFIG:` is allowed (in this case -it will be changed to `$HOME/.config/fsh` by default by F-Sy-H loader). +it will be changed to `$HOME/.config/f-sy-h` by default by F-Sy-H loader). diff --git a/functions/.fast-make-targets b/functions/.fast-make-targets old mode 100644 new mode 100755 diff --git a/functions/.fast-read-ini-file b/functions/.fast-read-ini-file old mode 100644 new mode 100755 diff --git a/functions/.fast-run-command b/functions/.fast-run-command old mode 100644 new mode 100755 index f0c6b91..6539ba4 --- a/functions/.fast-run-command +++ b/functions/.fast-run-command @@ -29,7 +29,7 @@ if [[ -z "${FAST_HIGHLIGHT[$2-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-c FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" else # Quoted (s:;:) flag without @ will skip empty elements. It - # still produces array output, interesingly. All this is for + # still produces array output, interestingly. All this is for # the trailing ";" above, to skip last, empty element. [[ "$1" = "+"* ]] && \ __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) diff --git a/functions/.fast-run-git-command b/functions/.fast-run-git-command old mode 100644 new mode 100755 index 55abca6..92bc060 --- a/functions/.fast-run-git-command +++ b/functions/.fast-run-git-command @@ -51,7 +51,7 @@ if [[ -z ${FAST_HIGHLIGHT[$2-cache]} || $(( EPOCHSECONDS - FAST_HIGHLIGHT[$2-cac FAST_HIGHLIGHT[$2-cache]="${(j:;:)__response}" else # Quoted (s:;:) flag without @ will skip empty elements. It - # still produces array output, interesingly. All this is for + # still produces array output, interestingly. All this is for # the trailing ";" above, to skip last, empty element. [[ "$1" = "+"* ]] && __lines_list+=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) || \ __lines_list=( "${(@s:;:)FAST_HIGHLIGHT[$2-cache]}" ) diff --git a/functions/.fast-zts-read-all b/functions/.fast-zts-read-all old mode 100644 new mode 100755 diff --git a/functions/_fast-theme b/functions/_fast-theme index 2be95bd..208a07a 100755 --- a/functions/_fast-theme +++ b/functions/_fast-theme @@ -9,13 +9,11 @@ # # Completion for theme-switching function, fast-theme, # part of z-shell/F-Sy-H, zdharma/fast-syntax-highlighting. -# + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} -builtin setopt extended_glob local_options warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd +builtin setopt extended_glob local_options typeset_silent no_short_loops rc_quotes no_auto_pushd -integer ret=1 -typeset -a themes themes2 themes3 arguments expl -themes=( "$FAST_WORK_DIR"/themes/*.ini(:t:r) ) +typeset -a themes themes2 arguments expl arguments=( {-w,--workdir}'[cd into $FAST_WORK_DIR (if not set, then into the plugin directory)]' @@ -31,15 +29,15 @@ arguments=( {-h,--help}'[display help text]' ) -if [[ -d ${XDG_CONFIG_HOME:-$HOME/.config}/fsh ]]; then - themes2=( "${XDG_CONFIG_HOME:-$HOME/.config}"/fsh/*.ini(:t:r) ) +integer ret=1 +themes=( "$FAST_BASE_DIR"/themes/*.ini(:t:r) ) + +if [[ -d ${XDG_CONFIG_HOME:-$HOME/.config}/f-sy-h ]]; then + themes2=( "${XDG_CONFIG_HOME:-$HOME/.config}"/f-sy-h/*.ini(:t:r) ) themes+=( CONFIG:${^themes2[@]} ) -elif [[ -d ${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh ]]; then - themes3=( "${XDG_CACHE_HOME:-$HOME/.cache}"/zi/fsh/*.ini(:t:r) ) - themes+=( CACHE:${^themes3[@]} ) fi -_wanted themes expl "Themes" compadd "$@" -a - themes && ret=0 +_wanted themes expl "themes" compadd "$@" -a - themes && ret=0 _arguments -s $arguments && ret=0 return $ret diff --git a/functions/fast-highlight b/functions/fast-highlight index 17e68fa..ddfb29f 100755 --- a/functions/fast-highlight +++ b/functions/fast-highlight @@ -40,13 +40,13 @@ FAST_WORK_DIR=${~FAST_WORK_DIR} () { # Emulate zsh options in the current shell. builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd + builtin setopt extended_glob no_short_loops rc_quotes no_auto_pushd local -A map - map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" - "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" - "LOCAL:" "/usr/local/share/fsh/" - "HOME:" "$HOME/.fsh/" - "OPT:" "/opt/local/share/fsh/" + map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/f-sy-h/" + "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/zi/f-sy-h/" + "LOCAL:" "/usr/local/share/f-sy-h/" + "HOME:" "$HOME/.f-sy-h/" + "OPT:" "/opt/local/share/f-sy-h/" ) FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(CONFIG|CACHE|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} } @@ -172,108 +172,109 @@ typeset -gA FAST_HIGHLIGHT # Brackets highlighter active by default : ${FAST_HIGHLIGHT[use_brackets]:=1} FAST_HIGHLIGHT+=( - chroma-fast-theme →chroma/-fast-theme.ch - chroma-alias →chroma/-alias.ch - chroma-autoload →chroma/-autoload.ch - chroma-autorandr →chroma/-autorandr.ch - chroma-docker →chroma/-docker.ch - chroma-example →chroma/-example.ch - chroma-ionice →chroma/-ionice.ch - chroma-make →chroma/-make.ch - chroma-nice →chroma/-nice.ch - chroma-nmcli →chroma/-nmcli.ch - chroma-node →chroma/-node.ch - chroma-perl →chroma/-perl.ch - chroma-printf →chroma/-printf.ch - chroma-ruby →chroma/-ruby.ch - chroma-scp →chroma/-scp.ch - chroma-ssh →chroma/-ssh.ch - - chroma-git →chroma/main-chroma.ch%git - chroma-hub →chroma/-hub.ch - chroma-lab →chroma/-lab.ch - chroma-svn →chroma/-subversion.ch - chroma-svnadmin →chroma/-subversion.ch - chroma-svndumpfilter →chroma/-subversion.ch - - chroma-egrep →chroma/-grep.ch - chroma-fgrep →chroma/-grep.ch - chroma-grep →chroma/-grep.ch - - chroma-awk →chroma/-awk.ch - chroma-gawk →chroma/-awk.ch - chroma-mawk →chroma/-awk.ch - - chroma-source →chroma/-source.ch - chroma-. →chroma/-source.ch - - chroma-bash →chroma/-sh.ch - chroma-fish →chroma/-sh.ch - chroma-sh →chroma/-sh.ch - chroma-zsh →chroma/-sh.ch - - chroma-whatis →chroma/-whatis.ch - chroma-man →chroma/-whatis.ch - - chroma-- →chroma/-precommand.ch - chroma-xargs →chroma/-precommand.ch - chroma-nohup →chroma/-precommand.ch - chroma-strace →chroma/-precommand.ch - chroma-ltrace →chroma/-precommand.ch - - chroma-hg →chroma/-subcommand.ch - chroma-cvs →chroma/-subcommand.ch - chroma-pip →chroma/-subcommand.ch - chroma-pip2 →chroma/-subcommand.ch - chroma-pip3 →chroma/-subcommand.ch - chroma-gem →chroma/-subcommand.ch - chroma-bundle →chroma/-subcommand.ch - chroma-yard →chroma/-subcommand.ch - chroma-cabal →chroma/-subcommand.ch - chroma-npm →chroma/-subcommand.ch - chroma-pnpm →chroma/-subcommand.ch - chroma-nvm →chroma/-subcommand.ch - chroma-yarn →chroma/-subcommand.ch - chroma-brew →chroma/-subcommand.ch - chroma-port →chroma/-subcommand.ch - chroma-yum →chroma/-subcommand.ch - chroma-dnf →chroma/-subcommand.ch - chroma-tmux →chroma/-subcommand.ch - chroma-pass →chroma/-subcommand.ch - chroma-aws →chroma/-subcommand.ch - chroma-apt →chroma/-subcommand.ch - chroma-apt-get →chroma/-subcommand.ch - chroma-apt-cache →chroma/-subcommand.ch - chroma-aptitude →chroma/-subcommand.ch - chroma-keyctl →chroma/-subcommand.ch - chroma-systemctl →chroma/-subcommand.ch - chroma-asciinema →chroma/-subcommand.ch - chroma-ipfs →chroma/-subcommand.ch - chroma-zi →chroma/main-chroma.ch%zi - chroma-aspell →chroma/-subcommand.ch - chroma-bspc →chroma/-subcommand.ch - chroma-cryptsetup →chroma/-subcommand.ch - chroma-diskutil →chroma/-subcommand.ch - chroma-exercism →chroma/-subcommand.ch - chroma-gulp →chroma/-subcommand.ch - chroma-i3-msg →chroma/-subcommand.ch - chroma-openssl →chroma/-subcommand.ch - chroma-solargraph →chroma/-subcommand.ch - chroma-subliminal →chroma/-subcommand.ch - chroma-svnadmin →chroma/-subcommand.ch - chroma-travis →chroma/-subcommand.ch - chroma-udisksctl →chroma/-subcommand.ch - chroma-xdotool →chroma/-subcommand.ch - chroma-zmanage →chroma/-subcommand.ch - chroma-zsystem →chroma/-subcommand.ch - chroma-zypper →chroma/-subcommand.ch - - chroma-fpath+=\( →chroma/-fpath_peq.ch - chroma-fpath=\( →chroma/-fpath_peq.ch - chroma-FPATH+= →chroma/-fpath_peq.ch - chroma-FPATH= →chroma/-fpath_peq.ch - #chroma-which →chroma/-which.ch - #chroma-vim →chroma/-vim.ch + chroma-fast-theme chroma/-fast-theme.ch + chroma-alias chroma/-alias.ch + chroma-autoload chroma/-autoload.ch + chroma-autorandr chroma/-autorandr.ch + chroma-docker chroma/-docker.ch + chroma-example chroma/-example.ch + chroma-ionice chroma/-ionice.ch + chroma-make chroma/-make.ch + chroma-nice chroma/-nice.ch + chroma-nmcli chroma/-nmcli.ch + chroma-node chroma/-node.ch + chroma-perl chroma/-perl.ch + chroma-printf chroma/-printf.ch + chroma-ruby chroma/-ruby.ch + chroma-scp chroma/-scp.ch + chroma-ssh chroma/-ssh.ch + + chroma-git chroma/main-chroma.ch%git + chroma-hub chroma/-hub.ch + chroma-lab chroma/-lab.ch + chroma-svn chroma/-subversion.ch + chroma-svnadmin chroma/-subversion.ch + chroma-svndumpfilter chroma/-subversion.ch + + chroma-egrep chroma/-grep.ch + chroma-fgrep chroma/-grep.ch + chroma-grep chroma/-grep.ch + + chroma-awk chroma/-awk.ch + chroma-gawk chroma/-awk.ch + chroma-mawk chroma/-awk.ch + + chroma-source chroma/-source.ch + chroma-. chroma/-source.ch + + chroma-bash chroma/-sh.ch + chroma-fish chroma/-sh.ch + chroma-sh chroma/-sh.ch + chroma-zsh chroma/-sh.ch + + chroma-whatis chroma/-whatis.ch + chroma-man chroma/-whatis.ch + + chroma-- chroma/-precommand.ch + chroma-xargs chroma/-precommand.ch + chroma-nohup chroma/-precommand.ch + chroma-strace chroma/-precommand.ch + chroma-ltrace chroma/-precommand.ch + + chroma-hg chroma/-subcommand.ch + chroma-cvs chroma/-subcommand.ch + chroma-pip chroma/-subcommand.ch + chroma-pip2 chroma/-subcommand.ch + chroma-pip3 chroma/-subcommand.ch + chroma-gem chroma/-subcommand.ch + chroma-bundle chroma/-subcommand.ch + chroma-yard chroma/-subcommand.ch + chroma-cabal chroma/-subcommand.ch + chroma-npm chroma/-subcommand.ch + chroma-pnpm chroma/-subcommand.ch + chroma-nvm chroma/-subcommand.ch + chroma-yarn chroma/-subcommand.ch + chroma-brew chroma/-subcommand.ch + chroma-port chroma/-subcommand.ch + chroma-yum chroma/-subcommand.ch + chroma-dnf chroma/-subcommand.ch + chroma-tmux chroma/-subcommand.ch + chroma-pass chroma/-subcommand.ch + chroma-aws chroma/-subcommand.ch + chroma-apt chroma/-subcommand.ch + chroma-apt-get chroma/-subcommand.ch + chroma-apt-cache chroma/-subcommand.ch + chroma-aptitude chroma/-subcommand.ch + chroma-keyctl chroma/-subcommand.ch + chroma-systemctl chroma/-subcommand.ch + chroma-asciinema chroma/-subcommand.ch + chroma-ipfs chroma/-subcommand.ch + chroma-aspell chroma/-subcommand.ch + chroma-bspc chroma/-subcommand.ch + chroma-cryptsetup chroma/-subcommand.ch + chroma-diskutil chroma/-subcommand.ch + chroma-exercism chroma/-subcommand.ch + chroma-gulp chroma/-subcommand.ch + chroma-i3-msg chroma/-subcommand.ch + chroma-openssl chroma/-subcommand.ch + chroma-solargraph chroma/-subcommand.ch + chroma-subliminal chroma/-subcommand.ch + chroma-svnadmin chroma/-subcommand.ch + chroma-travis chroma/-subcommand.ch + chroma-udisksctl chroma/-subcommand.ch + chroma-xdotool chroma/-subcommand.ch + chroma-zmanage chroma/-subcommand.ch + chroma-zsystem chroma/-subcommand.ch + chroma-zypper chroma/-subcommand.ch + + chroma-zi chroma/main-chroma.ch%zi + + chroma-fpath+=\( chroma/-fpath_peq.ch + chroma-fpath=\( chroma/-fpath_peq.ch + chroma-FPATH+= chroma/-fpath_peq.ch + chroma-FPATH= chroma/-fpath_peq.ch + #chroma-which chroma/-which.ch + #chroma-vim chroma/-vim.ch ) if [[ $OSTYPE == darwin* ]] { @@ -298,11 +299,10 @@ typeset -ga ZLAST_COMMANDS -fast-highlight-main-type() { REPLY=$__fast_highlight_main__command_type_cache[(e)$1] [[ -z $REPLY ]] && { - if zmodload -e zsh/parameter; then if (( $+aliases[(e)$1] )); then REPLY=alias - elif (( ${+galiases[(e)$1]} )); then + elif (( ${+galiases[(e)${(Q)1}]} )); then REPLY="global alias" elif (( $+functions[(e)$1] )); then REPLY=function @@ -324,9 +324,7 @@ typeset -ga ZLAST_COMMANDS REPLY=none fi fi - [[ -z $REPLY ]] && REPLY="${$(LC_ALL=C builtin type -w -- $1 2>/dev/null)##*: }" - [[ $REPLY = "none" ]] && { [[ -n ${FAST_BLIST_PATTERNS[(k)${${(M)1:#/*}:-$PWD/$1}]} ]] || { [[ -d $1 ]] && REPLY="dirpath" || { @@ -368,10 +366,12 @@ typeset -ga ZLAST_COMMANDS fi } + + # Main syntax highlighting function. -fast-highlight-process() { builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt extended_glob warn_create_global bare_glob_qual no_nomatch typeset_silent + builtin setopt extended_glob bare_glob_qual no_nomatch typeset_silent [[ $CONTEXT == "select" ]] && return 0 @@ -421,7 +421,7 @@ typeset -ga ZLAST_COMMANDS # word delimiters (an improvised array); [[ $x == *:foo:* ]] and x=${x//:foo:/} # will DTRT regardless of how many elements or repetitions $x has.. # - # Handling of redirections: upon seeing a redirection token, we must stall + # Handling of redirection: upon seeing a redirection token, we must stall # the current state --- that is, the value of $this_word --- for two iterations # (one for the redirection operator, one for the word following it representing # the redirection target). Therefore, we set $in_redirection to 2 upon seeing a @@ -603,215 +603,201 @@ typeset -ga ZLAST_COMMANDS ${${FAST_HIGHLIGHT[chroma-${__list[1]}]}%\%*} ${(M)FAST_HIGHLIGHT[chroma-${__list[1]}]%\%*} 1 "$__arg" $_start_pos $_end_pos 2>/dev/null && continue fi } || (( 1 )) - } + } - expanded_path="" + expanded_path="" - # The Great Fork: is this a command word? Is this a non-command word? - if (( this_word & 16 )) && [[ $__arg == 'always' ]]; then - # try-always construct - __style=${FAST_THEME_NAME}reserved-word # de facto a reserved word, although not de jure - (( next_word = 1 | (this_word & BIT_case_code) )) - elif (( (this_word & 1) && (in_redirection == 0) )) || [[ $braces_stack = T* ]]; then # T - typedef, etc. - if (( __arg_type == 1 )); then + # The Great Fork: is this a command word? Is this a non-command word? + if (( this_word & 16 )) && [[ $__arg == 'always' ]]; then + # try-always construct + __style=${FAST_THEME_NAME}reserved-word # de facto a reserved word, although not de jure + (( next_word = 1 | (this_word & BIT_case_code) )) + elif (( (this_word & 1) && (in_redirection == 0) )) || [[ $braces_stack = T* ]]; then # T - typedef, etc. + if (( __arg_type == 1 )); then __style=${FAST_THEME_NAME}precommand [[ $__arg = "command" || $__arg = "exec" ]] && (( next_word = next_word | 64 )) - elif [[ $__arg = (sudo|doas) ]]; then + elif [[ $__arg = (sudo|doas) ]]; then __style=${FAST_THEME_NAME}precommand (( next_word = (next_word & ~2) | 4 | 1 )) - else - _mybuf=${${(Q)__arg}#\"} - if (( ${+parameters} )) && \ + else + _mybuf=${${(Q)__arg}#\"} + if (( ${+parameters} )) && \ [[ $_mybuf = (#b)(*)(*)\$([a-zA-Z_][a-zA-Z0-9_]#|[0-9]##)(*) || \ - $_mybuf = (#b)(*)(*)\$\{([a-zA-Z_][a-zA-Z0-9_:-]#|[0-9]##)(*) ]] && \ - (( ${+parameters[${match[3]%%:-*}]} )) - then - -fast-highlight-main-type ${match[1]}${match[2]}${(P)match[3]%%:-*}${match[4]#\}} - elif [[ $braces_stack = T* ]]; then # T - typedef, etc. - REPLY=none - else - : ${expanded_path::=${~_mybuf}} - -fast-highlight-main-type $expanded_path - fi + $_mybuf = (#b)(*)(*)\$\{([a-zA-Z_][a-zA-Z0-9_:-]#|[0-9]##)(*) ]] && \ + (( ${+parameters[${match[3]%%:-*}]} )) + then + -fast-highlight-main-type ${match[1]}${match[2]}${(P)match[3]%%:-*}${match[4]#\}} + elif [[ $braces_stack = T* ]]; then # T - typedef, etc. + REPLY=none + else + : ${expanded_path::=${~_mybuf}} + -fast-highlight-main-type $expanded_path + fi case $REPLY in reserved) # reserved word - [[ $__arg = "[[" ]] && __style=${FAST_THEME_NAME}double-sq-bracket || __style=${FAST_THEME_NAME}reserved-word - if [[ $__arg == $'\x7b' ]]; then # Y - '{' - braces_stack='Y'$braces_stack - - elif [[ $__arg == $'\x7d' && $braces_stack = Y* ]]; then # Y - '}' - # We're at command word, so no need to check right_brace_is_recognised_everywhere - braces_stack=${braces_stack#Y} - __style=${FAST_THEME_NAME}reserved-word - (( next_word = next_word | 16 )) - - elif [[ $__arg == "[[" ]]; then # A - [[ - braces_stack='A'$braces_stack - - # Counting complex brackets (for brackets-highlighter): 1. [[ as command - _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) $(( _start_pos-__PBUFLEN + 1 )) ) - elif [[ $__arg == "for" ]]; then - (( next_word = next_word | 32 )) # BIT_for - - elif [[ $__arg == "case" ]]; then - (( next_word = BIT_case_preamble )) - - elif [[ $__arg = (typeset|declare|local|float|integer|export|readonly) ]]; then - braces_stack='T'$braces_stack - fi - ;; + [[ $__arg = "[[" ]] && __style=${FAST_THEME_NAME}double-sq-bracket || __style=${FAST_THEME_NAME}reserved-word + if [[ $__arg == $'\x7b' ]]; then # Y - '{' + braces_stack='Y'$braces_stack + + elif [[ $__arg == $'\x7d' && $braces_stack = Y* ]]; then # Y - '}' + # We're at command word, so no need to check right_brace_is_recognised_everywhere + braces_stack=${braces_stack#Y} + __style=${FAST_THEME_NAME}reserved-word + (( next_word = next_word | 16 )) + + elif [[ $__arg == "[[" ]]; then # A - [[ + braces_stack='A'$braces_stack + + # Counting complex brackets (for brackets-highlighter): 1. [[ as command + _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) $(( _start_pos-__PBUFLEN + 1 )) ) + elif [[ $__arg == "for" ]]; then + (( next_word = next_word | 32 )) # BIT_for + + elif [[ $__arg == "case" ]]; then + (( next_word = BIT_case_preamble )) + + elif [[ $__arg = (typeset|declare|local|float|integer|export|readonly) ]]; then + braces_stack='T'$braces_stack + fi + ;; 'suffix alias') __style=${FAST_THEME_NAME}suffix-alias;; 'global alias') __style=${FAST_THEME_NAME}global-alias;; - alias) - if [[ $__arg = ?*'='* ]]; then - # The so called (by old code) "insane_alias" - __style=${FAST_THEME_NAME}unknown-token - else - __style=${FAST_THEME_NAME}alias - (( ${+aliases} )) && alias_target=${aliases[$__arg]} || alias_target="${"$(alias -- $__arg)"#*=}" - [[ ${__FAST_HIGHLIGHT_TOKEN_TYPES[$alias_target]} = "1" && $__arg_type != "1" ]] && __FAST_HIGHLIGHT_TOKEN_TYPES[$__arg]="1" - fi - ;; - - builtin) [[ $__arg = "[" ]] && { - __style=${FAST_THEME_NAME}single-sq-bracket - _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) ) - } || __style=${FAST_THEME_NAME}builtin - # T - typeset, etc. mode - [[ $__arg = (typeset|declare|local|float|integer|export|readonly) ]] && braces_stack='T'$braces_stack - [[ $__arg = eval ]] && (( next_word = next_word | 256 )) - ;; - + if [[ $__arg = ?*'='* ]]; then + # The so called (by old code) "insane_alias" + __style=${FAST_THEME_NAME}unknown-token + else + __style=${FAST_THEME_NAME}alias + (( ${+aliases} )) && alias_target=${aliases[$__arg]} || alias_target="${"$(alias -- $__arg)"#*=}" + [[ ${__FAST_HIGHLIGHT_TOKEN_TYPES[$alias_target]} = "1" && $__arg_type != "1" ]] && __FAST_HIGHLIGHT_TOKEN_TYPES[$__arg]="1" + fi + ;; + builtin) + [[ $__arg = "[" ]] && { + __style=${FAST_THEME_NAME}single-sq-bracket + _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) ) + } || __style=${FAST_THEME_NAME}builtin + # T - typeset, etc. mode + [[ $__arg = (typeset|declare|local|float|integer|export|readonly) ]] && braces_stack='T'$braces_stack + [[ $__arg = eval ]] && (( next_word = next_word | 256 )) + ;; function) __style=${FAST_THEME_NAME}function;; - command) __style=${FAST_THEME_NAME}command;; - hashed) __style=${FAST_THEME_NAME}hashed-command;; - dirpath) __style=${FAST_THEME_NAME}path-to-dir;; - none) # Assign? - if [[ $__arg == [a-zA-Z_][a-zA-Z0-9_]#(|\[[^\]]#\])(|[^\]]#\])(|[+])=* || $__arg == [0-9]##(|[+])=* || ( $braces_stack = T* && ${__arg_type} != 3 ) ]] { - __style=${FAST_THEME_NAME}assign - FAST_ASSIGNS_SEEN[${__arg%%=*}]=1 - - # Handle array assignment - [[ $__arg = (#b)*=(\()*(\))* || $__arg = (#b)*=(\()* ]] && { - (( __start=_start_pos-__PBUFLEN+${mbegin[1]}-1, __end=__start+1, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}assign-array-bracket]}") - # Counting complex brackets (for brackets-highlighter): 2. ( in array assign - _FAST_COMPLEX_BRACKETS+=( $__start ) - (( mbegin[2] >= 1 )) && { - (( __start=_start_pos-__PBUFLEN+${mbegin[2]}-1, __end=__start+1, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}assign-array-bracket]}") - # Counting complex brackets (for brackets-highlighter): 3a. ) in array assign - _FAST_COMPLEX_BRACKETS+=( $__start ) - } || in_array_assignment=1 - } || { [[ ${braces_stack[1]} != 'T' ]] && (( next_word = (next_word | 1) & ~2 )); } - - # Handle no-string highlight, string "/' highlight, math mode highlight - local ctmp="\"" dtmp="'" - itmp=${__arg[(i)$ctmp]}-1 iitmp=${__arg[(i)$dtmp]}-1 - integer jtmp=${__arg[(b:itmp+2:i)$ctmp]} jjtmp=${__arg[(b:iitmp+2:i)$dtmp]} - (( itmp < iitmp && itmp <= __asize - 1 )) && (( jtmp > __asize && (jtmp = __asize), 1 > 0 )) && \ - (( __start=_start_pos-__PBUFLEN+itmp, __end=_start_pos-__PBUFLEN+jtmp, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") && \ - { itmp=${__arg[(i)=]}; __arg=${__arg[itmp,__asize]}; (( _start_pos += itmp - 1 )); - -fast-highlight-string; (( _start_pos = _start_pos - itmp + 1, 1 > 0 )); } || \ - { - (( iitmp <= __asize - 1 )) && (( jjtmp > __asize && (jjtmp = __asize), 1 > 0 )) && \ - (( __start=_start_pos-__PBUFLEN+iitmp, __end=_start_pos-__PBUFLEN+jjtmp, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}single-quoted-argument]}") - } || \ - { - itmp=${__arg[(i)=]}; __arg=${__arg[itmp,__asize]}; (( _start_pos += itmp - 1 )); - [[ ${__arg[2,4]} = '$((' ]] && { -fast-highlight-math-string; - (( __start=_start_pos-__PBUFLEN+2, __end=__start+2, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") - # Counting complex brackets (for brackets-highlighter): 4. $(( in assign argument - _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) - (( jtmp = ${__arg[(I)\)\)]}-1, jtmp > 0 )) && { - (( __start=_start_pos-__PBUFLEN+jtmp, __end=__start+2, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") - # Counting complex brackets (for brackets-highlighter): 5. )) in assign argument - _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) - } - } || -fast-highlight-string; - (( _start_pos = _start_pos - itmp + 1, 1 > 0 )) - } - - } elif [[ $__arg = ${histchars[1]}* && -n ${__arg[2]} ]] { - __style=${FAST_THEME_NAME}history-expansion - - } elif [[ $__arg == ${histchars[2]}* ]] { - __style=${FAST_THEME_NAME}history-expansion - - } elif (( __arg_type == 3 )) { - # This highlights empty commands (semicolon follows nothing) as an error. - # Zsh accepts them, though. - (( this_word & 3 )) && __style=${FAST_THEME_NAME}commandseparator - - } elif [[ $__arg[1,2] == '((' ]] { - # Arithmetic evaluation. - # - # Note: prior to zsh-5.1.1-52-g4bed2cf (workers/36669), the ${(z)...} - # splitter would only output the '((' token if the matching '))' had - # been typed. Therefore, under those versions of zsh, BUFFER="(( 42" - # would be highlighted as an error until the matching "))" are typed. - # - # We highlight just the opening parentheses, as a reserved word; this - # is how [[ ... ]] is highlighted, too. - - # ADD - (( __start=_start_pos-__PBUFLEN, __end=__start+2, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") - already_added=1 - - # Counting complex brackets (for brackets-highlighter): 6. (( as command - _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) - - -fast-highlight-math-string - - # ADD - [[ $__arg[-2,-1] == '))' ]] && { - (( __start=_end_pos-__PBUFLEN-2, __end=__start+2, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") - (( __delimited = __delimited ? 2 : __delimited )) - - # Counting complex brackets (for brackets-highlighter): 7. )) for as-command (( - _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) - } - - } elif [[ $__arg == '()' ]] { - _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) $(( _start_pos-__PBUFLEN + 1 )) ) - # anonymous function - __style=${FAST_THEME_NAME}reserved-word - } elif [[ $__arg == $'\x28' ]] { - # subshell '(', stack: letter 'R' - __style=${FAST_THEME_NAME}reserved-word - braces_stack='R'$braces_stack - - } elif [[ $__arg == $'\x29' ]] { - # ')', stack: letter 'R' for subshell - [[ $braces_stack = R* ]] && { braces_stack=${braces_stack#R}; __style=${FAST_THEME_NAME}reserved-word; } - - } elif (( this_word & 14 )) { - __style=${FAST_THEME_NAME}default - - } elif [[ $__arg = (';;'|';&'|';|') ]] && (( this_word & BIT_case_code )) { - (( next_word = (next_word | BIT_case_item) & ~(BIT_case_code+3) )) - __style=${FAST_THEME_NAME}default - - } elif [[ $__arg = \$\([^\(]* ]] { - already_added=1 - } - ;; + if [[ $__arg == [a-zA-Z_][a-zA-Z0-9_]#(|\[[^\]]#\])(|[^\]]#\])(|[+])=* || $__arg == [0-9]##(|[+])=* || ( $braces_stack = T* && ${__arg_type} != 3 ) ]] { + __style=${FAST_THEME_NAME}assign + FAST_ASSIGNS_SEEN[${__arg%%=*}]=1 + + # Handle array assignment + [[ $__arg = (#b)*=(\()*(\))* || $__arg = (#b)*=(\()* ]] && { + (( __start=_start_pos-__PBUFLEN+${mbegin[1]}-1, __end=__start+1, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}assign-array-bracket]}") + # Counting complex brackets (for brackets-highlighter): 2. ( in array assign + _FAST_COMPLEX_BRACKETS+=( $__start ) + (( mbegin[2] >= 1 )) && { + (( __start=_start_pos-__PBUFLEN+${mbegin[2]}-1, __end=__start+1, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}assign-array-bracket]}") + # Counting complex brackets (for brackets-highlighter): 3a. ) in array assign + _FAST_COMPLEX_BRACKETS+=( $__start ) + } || in_array_assignment=1 + } || { [[ ${braces_stack[1]} != 'T' ]] && (( next_word = (next_word | 1) & ~2 )); } + + # Handle no-string highlight, string "/' highlight, math mode highlight + local ctmp="\"" dtmp="'" + itmp=${__arg[(i)$ctmp]}-1 iitmp=${__arg[(i)$dtmp]}-1 + integer jtmp=${__arg[(b:itmp+2:i)$ctmp]} jjtmp=${__arg[(b:iitmp+2:i)$dtmp]} + (( itmp < iitmp && itmp <= __asize - 1 )) && (( jtmp > __asize && (jtmp = __asize), 1 > 0 )) && \ + (( __start=_start_pos-__PBUFLEN+itmp, __end=_start_pos-__PBUFLEN+jtmp, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-quoted-argument]}") && \ + { itmp=${__arg[(i)=]}; __arg=${__arg[itmp,__asize]}; (( _start_pos += itmp - 1 )); -fast-highlight-string; \ + (( _start_pos = _start_pos - itmp + 1, 1 > 0 )); } || \ + { (( iitmp <= __asize - 1 )) && (( jjtmp > __asize && (jjtmp = __asize), 1 > 0 )) && \ + (( __start=_start_pos-__PBUFLEN+iitmp, __end=_start_pos-__PBUFLEN+jjtmp, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}single-quoted-argument]}") + } || { + itmp=${__arg[(i)=]}; __arg=${__arg[itmp,__asize]}; (( _start_pos += itmp - 1 )); + [[ ${__arg[2,4]} = '$((' ]] && { + -fast-highlight-math-string; (( __start=_start_pos-__PBUFLEN+2, __end=__start+2, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") + # Counting complex brackets (for brackets-highlighter): 4. $(( in assign argument + _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) + (( jtmp = ${__arg[(I)\)\)]}-1, jtmp > 0 )) && { + (( __start=_start_pos-__PBUFLEN+jtmp, __end=__start+2, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") + # Counting complex brackets (for brackets-highlighter): 5. )) in assign argument + _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) + } + } || -fast-highlight-string; (( _start_pos = _start_pos - itmp + 1, 1 > 0 )) + } + } elif [[ $__arg = ${histchars[1]}* && -n ${__arg[2]} ]] { + __style=${FAST_THEME_NAME}history-expansion + + } elif [[ $__arg == ${histchars[2]}* ]] { + __style=${FAST_THEME_NAME}history-expansion + + } elif (( __arg_type == 3 )) { + # This highlights empty commands (semicolon follows nothing) as an error. + # Zsh accepts them, though. + (( this_word & 3 )) && __style=${FAST_THEME_NAME}commandseparator + + } elif [[ $__arg[1,2] == '((' ]] { + # Arithmetic evaluation. + # + # Note: prior to zsh-5.1.1-52-g4bed2cf (workers/36669), the ${(z)...} + # splitter would only output the '((' token if the matching '))' had + # been typed. Therefore, under those versions of zsh, BUFFER="(( 42" + # would be highlighted as an error until the matching "))" are typed. + # + # We highlight just the opening parentheses, as a reserved word; this + # is how [[ ... ]] is highlighted, too. + + # ADD + (( __start=_start_pos-__PBUFLEN, __end=__start+2, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") + already_added=1 + + # Counting complex brackets (for brackets-highlighter): 6. (( as command + _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) + -fast-highlight-math-string + + # ADD + [[ $__arg[-2,-1] == '))' ]] && { + (( __start=_end_pos-__PBUFLEN-2, __end=__start+2, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-paren]}") + (( __delimited = __delimited ? 2 : __delimited )) + # Counting complex brackets (for brackets-highlighter): 7. )) for as-command (( + _FAST_COMPLEX_BRACKETS+=( $__start $(( __start + 1 )) ) + } + } elif [[ $__arg == '()' ]] { + _FAST_COMPLEX_BRACKETS+=( $(( _start_pos-__PBUFLEN )) $(( _start_pos-__PBUFLEN + 1 )) ) + # anonymous function + __style=${FAST_THEME_NAME}reserved-word + } elif [[ $__arg == $'\x28' ]] { + # subshell '(', stack: letter 'R' + __style=${FAST_THEME_NAME}reserved-word + braces_stack='R'$braces_stack + } elif [[ $__arg == $'\x29' ]] { + # ')', stack: letter 'R' for subshell + [[ $braces_stack = R* ]] && { braces_stack=${braces_stack#R}; __style=${FAST_THEME_NAME}reserved-word; } + } elif (( this_word & 14 )) { + __style=${FAST_THEME_NAME}default + } elif [[ $__arg = (';;'|';&'|';|') ]] && (( this_word & BIT_case_code )) { + (( next_word = (next_word | BIT_case_item) & ~(BIT_case_code+3) )) + __style=${FAST_THEME_NAME}default + } elif [[ $__arg = \$\([^\(]* ]] { + already_added=1 + } + ;; *) - # ADD - # (( __start=_start_pos-__PBUFLEN, __end=_end_pos-__PBUFLEN, __start >= 0 )) && reply+=("$__start $__end commandtypefromthefuture-$REPLY") - already_added=1 - ;; + # ADD + # (( __start=_start_pos-__PBUFLEN, __end=_end_pos-__PBUFLEN, __start >= 0 )) && reply+=("$__start $__end commandtypefromthefuture-$REPLY") + already_added=1 + ;; esac - fi - # in_redirection || BIT_regular || BIT_sudo_opt || BIT_sudo_arg - elif (( in_redirection + this_word & 14 )) - then # $__arg is a non-command word + fi + # in_redirection || BIT_regular || BIT_sudo_opt || BIT_sudo_arg + elif (( in_redirection + this_word & 14 )) + then # $__arg is a non-command word case $__arg in ']]') # A - [[ @@ -1065,7 +1051,7 @@ typeset -ga ZLAST_COMMANDS __style=${FAST_THEME_NAME}commandseparator elif (( in_redirection == 2 )); then __style=${FAST_THEME_NAME}redirection - elif (( ${+galiases[(e)$__arg]} )); then + elif (( ${+galiases[(e)${(Q)__arg}]} )); then __style=${FAST_THEME_NAME}global-alias else if [[ ${FAST_HIGHLIGHT[no_check_paths]} != 1 ]]; then @@ -1331,7 +1317,7 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler # - E matches \* # # and the first condition -n ${match[7] uses D to continue searching when -# backslash-something (not ['"$]) is occured. +# backslash-something (not ['"$]) is occurred. # # $1 - additional style to glue-in to added style -fast-highlight-string() { @@ -1427,7 +1413,7 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler || "$AA" == (#m)(#s)[0-7](#c1,3) || "$AA" == (#m)(#s)u[0-9a-fA-F](#c1,4) || "$AA" == (#m)(#s)U[0-9a-fA-F](#c1,8) - ]]; then + ]]; then (( k += MEND )) (( i += MEND )) else @@ -1454,7 +1440,7 @@ zle -N -- fast-highlight-check-path-handler -fast-highlight-check-path-handler typeset -ga FSH_LIST -fsh_sy_h_shappend() { - FSH_LIST+=( "$(( $1 - 1 ));;$(( $2 ))" ) + FSH_LIST+=( "$(( $1 - 1 ));;$(( $2 ))" ) } functions -M fsh_sy_h_append 2 2 -fsh_sy_h_shappend 2>/dev/null diff --git a/functions/fast-string-highlight b/functions/fast-string-highlight index ff76b76..0e63219 100755 --- a/functions/fast-string-highlight +++ b/functions/fast-string-highlight @@ -8,7 +8,7 @@ # -fast-highlight-string-process() { builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} - builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd + builtin setopt extended_glob typeset_silent no_short_loops rc_quotes no_auto_pushd local -A pos_to_level level_to_pos pair_map final_pairs local input=$1$2 _mybuf=$1$2 __style __quoting diff --git a/functions/fast-theme b/functions/fast-theme index ff811cd..5cc9f5e 100755 --- a/functions/fast-theme +++ b/functions/fast-theme @@ -14,7 +14,7 @@ zmodload zsh/zutil 2>/dev/null # https://wiki.zshell.dev/community/zsh_plugin_standard/#standard-recommended-options builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} -builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd +builtin setopt extended_glob typeset_silent no_short_loops rc_quotes no_auto_pushd autoload colors; colors typeset -g FAST_WORK_DIR @@ -22,11 +22,11 @@ typeset -g FAST_WORK_DIR FAST_WORK_DIR=${~FAST_WORK_DIR} local -A map -map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" - "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" - "LOCAL:" "/usr/local/share/fsh/" - "HOME:" "$HOME/.fsh/" - "OPT:" "/opt/local/share/fsh/" +map=( "CONFIG:" "${XDG_CONFIG_HOME:-$HOME/.config}/f-sy-h/" + "CACHE:" "${XDG_CACHE_HOME:-$HOME/.cache}/f-sy-h/" + "LOCAL:" "/usr/local/share/f-sy-h/" + "HOME:" "$HOME/.f-sy-h/" + "OPT:" "/opt/local/share/f-sy-h/" ) FAST_WORK_DIR=${${FAST_WORK_DIR/(#m)(#s)(CONFIG|CACHE|LOCAL|HOME|OPT):(#c0,1)/${map[${MATCH%:}:]}}%/} @@ -64,17 +64,17 @@ fi if [[ -n "$OPT_INFO" ]]; then print -r -- "The default ${fg[green]}fast-theme$reset_color command can be used to switch current and future sessions to a new different theme." print -r -- "" - print -r -- "The theme path can use one of the shorthands below to point ~/.config/fsh/.ini." + print -r -- "The theme path can use one of the shorthands below to point ~/.config/f-sy-h/.ini." print -r -- "If the INI file pointed in the path is \"*overlay*\", then it is not a full theme," print -r -- "but an additional theme-snippet that overwrites only selected styles of the main theme." print -r -- "" print -r -- "${fg[yellow]}Shorthands$reset_color:" print -r -- "" - print -r -- "CONFIG: = ${XDG_CONFIG_HOME:-$HOME/.config}/fsh/" - print -r -- "CACHE: = ${XDG_CACHE_HOME:-$HOME/.cache}/zi/fsh/" - print -r -- "LOCAL: = /usr/local/share/fsh/" - print -r -- "HOME: = $HOME/.fsh/" - print -r -- "OPT: = /opt/local/share/fsh/" + print -r -- "CONFIG: = ${XDG_CONFIG_HOME:-$HOME/.config}/f-sy-h/" + print -r -- "CACHE: = ${XDG_CACHE_HOME:-$HOME/.cache}/f-sy-h/" + print -r -- "LOCAL: = /usr/local/share/f-sy-h/" + print -r -- "HOME: = $HOME/.f-sy-h/" + print -r -- "OPT: = /opt/local/share/f-sy-h/" print -r -- "" print -r -- "${fg[yellow]}Example$reset_color:" print -r -- "" @@ -99,13 +99,13 @@ fi if [[ -n "$OPT_SHOW" ]]; then print -r -- "Currently active theme: ${fg_bold[green]}$FAST_THEME_NAME$reset_color" - ( source "$FAST_WORK_DIR"/current_theme.zsh 2>/dev/null && print "Main theme (loaded at startup of a session): ${fg_bold[yellow]}$FAST_THEME_NAME$reset_color" || print "No main theme is set"; ) + ( source "$FAST_WORK_DIR"/current_theme.zsh 2>/dev/null && print -r -- "Main theme (session startup): ${fg_bold[green]}$FAST_THEME_NAME$reset_color" || print "No main theme is set"; ) return 0 fi if [[ -n "$OPT_COPY" ]]; then - [[ ! -f "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' doesn't exist in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } - [[ ! -r "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print "Theme \`$OPT_COPY' isn't readable in FSH plugin dir ($FAST_BASE_DIR/themes)"; return 1; } + [[ ! -f "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print -r -- "Theme ${fg_bold[green]}\`$OPT_COPY'$reset_color doesn't exist in F-Sy-H plugin dir ($FAST_BASE_DIR/themes)"; return 1; } + [[ ! -r "$FAST_BASE_DIR"/themes/"${OPT_COPY%.ini}.ini" ]] && { print -r -- "Theme ${fg_bold[green]}\`$OPT_COPY'$reset_color isn't readable in F-Sy-H plugin dir ($FAST_BASE_DIR/themes)"; return 1; } [[ -n "$1" ]] && { [[ ! -e "$1" && ! -e ${1:h} ]] && { print "Destination path doesn't exist, aborting"; return 1; } } @@ -128,22 +128,23 @@ fi if [[ -n "$OPT_HELP" ]]; then print -r -- "${fg_bold[yellow]}Usage$reset_color:" + print -r -- " ${fg[green]}fast-theme$reset_color [-h/--help] [-v/--verbose] [-q/--quiet] [-t/--test] " + print -r -- " ${fg[green]}fast-theme$reset_color [-r/--reset] [-l/--list] [-s/--show] [-p/--palette] [-w/--workdir]" + print -r -- " ${fg[green]}fast-theme$reset_color --copy-shipped-theme {theme-name} [destination-path]" print -r -- "" - print -r -- " ${fg[green]}fast-theme$reset_color [-h/--help] [-v/--verbose] [-q/--quiet] [-t/--test] " - print -r -- " ${fg[green]}fast-theme$reset_color [-r/--reset] [-l/--list] [-s/--show] [-p/--palette] [-w/--workdir]" - print -r -- " ${fg[green]}fast-theme$reset_color --copy-shipped-theme {theme-name} [destination-path]" + print -r -- "${fg_bold[yellow]}Flags$reset_color:" + print -r -- " ${fg[cyan]}-R, --ov-reset$reset_color - unset overlay, use styles only from main-theme (requires restart)" + print -r -- " ${fg[cyan]}-p, --palette$reset_color - just print all 256 colors and exit (useful when creating a theme)" + print -r -- " ${fg[cyan]}-r, --reset$reset_color - unset any theme, use default highlighting (requires restart)" + print -r -- " ${fg[cyan]}-t, --test$reset_color - show test block of code after switching theme" + print -r -- " ${fg[cyan]}-s, --show$reset_color - get and display the theme currently being set" + print -r -- " ${fg[cyan]}-w, --workdir$reset_color - cd into $FAST_WORK_DIR (\$FAST_WORK_DIR)" + print -r -- " ${fg[cyan]}-l, --list$reset_color - list names of available themes" + print -r -- " ${fg[cyan]}-v, --verbose$reset_color - more messages during operation" + print -r -- " ${fg[cyan]}-i, --info$reset_color - additional usage information" + print -r -- " ${fg[cyan]}-q, --quiet$reset_color - no default messages" + print -r -- " ${fg[cyan]}-h, --help$reset_color - this help message" print -r -- "" - print -r -- "${fg[cyan]}-w/--workdir$reset_color - cd into \$FAST_WORK_DIR (if not set, then into the plugin directory)" - print -r -- "${fg[cyan]}-R/--ov-reset$reset_color - unset overlay, use styles only from main-theme (requires restart)" - print -r -- "${fg[cyan]}-p/--palette$reset_color - just print all 256 colors and exit (useful when creating a theme)" - print -r -- "${fg[cyan]}-r/--reset$reset_color - unset any theme, use default highlighting (requires restart)" - print -r -- "${fg[cyan]}-t/--test$reset_color - show test block of code after switching theme" - print -r -- "${fg[cyan]}-s/--show$reset_color - get and display the theme currently being set" - print -r -- "${fg[cyan]}-l/--list$reset_color - list names of available themes" - print -r -- "${fg[cyan]}-v/--verbose$reset_color - more messages during operation" - print -r -- "${fg[cyan]}-i/--info$reset_color - additional usage information" - print -r -- "${fg[cyan]}-q/--quiet$reset_color - no default messages" - print -r -- "${fg[cyan]}-h/--help$reset_color - this help message" return 0 fi @@ -243,11 +244,11 @@ color=( red green blue yellow cyan magenta black white default ) local -A out local THEME_NAME THEME_PATH="$1" if [[ "$1" = */* || "$1" = (CONFIG|CACHE|LOCAL|HOME|OPT):* ]]; then - 1="${${1/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/fsh/}%.ini}.ini" - 1="${${1/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/zi/fsh/}%.ini}.ini" - 1="${${1/(#s)LOCAL://usr/local/share/fsh/}%.ini}.ini" - 1="${${1/(#s)HOME:/$HOME/.fsh/}%.ini}.ini" - 1="${${1/(#s)OPT://opt/local/share/fsh/}%.ini}.ini" + 1="${${1/(#s)CONFIG:/${${XDG_CONFIG_HOME:-$HOME/.config}%/}/f-sy-h/}%.ini}.ini" + 1="${${1/(#s)CACHE:/${${XDG_CACHE_HOME:-$HOME/.cache}%/}/f-sy-h/}%.ini}.ini" + 1="${${1/(#s)LOCAL://usr/local/share/f-sy-h/}%.ini}.ini" + 1="${${1/(#s)HOME:/$HOME/.f-sy-h/}%.ini}.ini" + 1="${${1/(#s)OPT://opt/local/share/f-sy-h/}%.ini}.ini" 1=${~1} # allow user to quote ~ [[ ! -f "$1" ]] && { print -u2 "${fg[yellow]}No such theme$reset_color \`$1'${fg[yellow]}, aborting$reset_color"; return 1; } @@ -370,35 +371,35 @@ fi if [[ -n "$OPT_TEST" ]]; then print -zr ' - # Subshell, assignments, math-mode - echo $(cat /etc/hosts |& grep -i "hello337") - local param1="text ${+variable[test]} text ${var} text"; typeset param2='"'"'other $variable'"'"' - math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 )) - - # Programming-like usage, bracket matching - through distinct colors; note the backslash quoting - for (( ii = 1; ii <= size; ++ ii )); do - if [[ "${cmds[ii]} string" = "| string" ]] - then - sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening cmd-subst - (( sidx <= len + 100 )) && { - eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing cmd-subst - } - fi - done + # Sub-shell, assignments, math-mode + echo $(cat /etc/hosts |& grep -i "hello337") + local param1="text ${+variable[test]} text ${var} text"; typeset param2='"'"'other $variable'"'"' + math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 )) + + # Programming-like usage, bracket matching - through distinct colors; note the backslash quoting + for (( ii = 1; ii <= size; ++ ii )); do + if [[ "${cmds[ii]} string" = "| string" ]] + then + sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening cmd-subst + (( sidx <= len + 100 )) && { + eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing cmd-subst + } + fi + done - # Regular command-line usage - repeat 0 { - zsh -i -c "cat /etc/shells* | grep -x --line-buffered -i '"'/bin/zsh'"'" - builtin exit $return_value - fast-theme -tq default - fsh-alias -tq default-X # alias '"'"'fsh-alias=fast-theme'"'"' works just like the previous line - command -v git | grep ".+git" && echo $'"'"'Git is installed'"'"' - git checkout -m --ours /etc/shells && git status-X - gem install asciidoctor - cat <<<$PATH | tr : \\n > /dev/null 2>/usr/local - man -a fopen fopen-X - CFLAGS="-g -Wall -O0" ./configure - } + # Regular command-line usage + repeat 0 { + zsh -i -c "cat /etc/shells* | grep -x --line-buffered -i '"'/bin/zsh'"'" + builtin exit $return_value + fast-theme -tq default + f-sy-h -tq default-X # alias '"'"'f-sy-h=fast-theme'"'"' works just like the previous line + command -v git | grep ".+git" && echo $'"'"'Git is installed'"'"' + git checkout -m --ours /etc/shells && git status-X + gem install asciidoctor + cat <<<$PATH | tr : \\n > /dev/null 2>/usr/local + man -a fopen fopen-X + CFLAGS="-g -Wall -O0" ./configure + } ' fi diff --git a/share/free_theme.zsh b/share/free_theme.zsh old mode 100644 new mode 100755 index 0f32d66..c1874f7 --- a/share/free_theme.zsh +++ b/share/free_theme.zsh @@ -1,61 +1,61 @@ -: ${FAST_HIGHLIGHT_STYLES[freedefault]:=none} -: ${FAST_HIGHLIGHT_STYLES[freeunknown-token]:=fg=red,bold} -: ${FAST_HIGHLIGHT_STYLES[freereserved-word]:=fg=150} : ${FAST_HIGHLIGHT_STYLES[freealias]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freesuffix-alias]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freeassign-array-bracket]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freeassign]:=none} +: ${FAST_HIGHLIGHT_STYLES[freeback-dollar-quoted-argument]:=fg=110} +: ${FAST_HIGHLIGHT_STYLES[freeback-or-dollar-double-quoted-argument]:=fg=110} +: ${FAST_HIGHLIGHT_STYLES[freeback-quoted-argument]:=none} +: ${FAST_HIGHLIGHT_STYLES[freebracket-level-1]:=fg=130} +: ${FAST_HIGHLIGHT_STYLES[freebracket-level-2]:=fg=70} +: ${FAST_HIGHLIGHT_STYLES[freebracket-level-3]:=fg=69} : ${FAST_HIGHLIGHT_STYLES[freebuiltin]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freefunction]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freecase-condition]:=bg=19} +: ${FAST_HIGHLIGHT_STYLES[freecase-input]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freecase-parentheses]:=fg=116} : ${FAST_HIGHLIGHT_STYLES[freecommand]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freeprecommand]:=fg=180} : ${FAST_HIGHLIGHT_STYLES[freecommandseparator]:=none} -: ${FAST_HIGHLIGHT_STYLES[freehashed-command]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freepath]:=fg=166} -: ${FAST_HIGHLIGHT_STYLES[freepath_pathseparator]:=} -: ${FAST_HIGHLIGHT_STYLES[freeglobbing]:=fg=112} -: ${FAST_HIGHLIGHT_STYLES[freeglobbing-ext]:=fg=118} -: ${FAST_HIGHLIGHT_STYLES[freehistory-expansion]:=fg=blue,bold} -: ${FAST_HIGHLIGHT_STYLES[freesingle-hyphen-option]:=fg=110} +: ${FAST_HIGHLIGHT_STYLES[freecomment]:=fg=black,bold} +: ${FAST_HIGHLIGHT_STYLES[freecorrect-subtle]:=bg=55} +: ${FAST_HIGHLIGHT_STYLES[freedefault]:=none} +: ${FAST_HIGHLIGHT_STYLES[freedollar-quoted-argument]:=fg=150} : ${FAST_HIGHLIGHT_STYLES[freedouble-hyphen-option]:=fg=110} -: ${FAST_HIGHLIGHT_STYLES[freeback-quoted-argument]:=none} -: ${FAST_HIGHLIGHT_STYLES[freesingle-quoted-argument]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freedouble-paren]:=fg=150} : ${FAST_HIGHLIGHT_STYLES[freedouble-quoted-argument]:=fg=150} -: ${FAST_HIGHLIGHT_STYLES[freedollar-quoted-argument]:=fg=150} -: ${FAST_HIGHLIGHT_STYLES[freeback-or-dollar-double-quoted-argument]:=fg=110} -: ${FAST_HIGHLIGHT_STYLES[freeback-dollar-quoted-argument]:=fg=110} -: ${FAST_HIGHLIGHT_STYLES[freeassign]:=none} -: ${FAST_HIGHLIGHT_STYLES[freeredirection]:=none} -: ${FAST_HIGHLIGHT_STYLES[freecomment]:=fg=black,bold} -: ${FAST_HIGHLIGHT_STYLES[freevariable]:=none} -: ${FAST_HIGHLIGHT_STYLES[freemathvar]:=fg=blue,bold} -: ${FAST_HIGHLIGHT_STYLES[freemathnum]:=fg=166} -: ${FAST_HIGHLIGHT_STYLES[freematherr]:=fg=red} -: ${FAST_HIGHLIGHT_STYLES[freeassign-array-bracket]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freefor-loop-variable]:=none} +: ${FAST_HIGHLIGHT_STYLES[freedouble-sq-bracket]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freeexec-descriptor]:=fg=yellow,bold} : ${FAST_HIGHLIGHT_STYLES[freefor-loop-number]:=fg=150} : ${FAST_HIGHLIGHT_STYLES[freefor-loop-operator]:=fg=150} : ${FAST_HIGHLIGHT_STYLES[freefor-loop-separator]:=fg=109} -: ${FAST_HIGHLIGHT_STYLES[freeexec-descriptor]:=fg=yellow,bold} -: ${FAST_HIGHLIGHT_STYLES[freehere-string-tri]:=fg=yellow} +: ${FAST_HIGHLIGHT_STYLES[freefor-loop-variable]:=none} +: ${FAST_HIGHLIGHT_STYLES[freefunction]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freeglobal-alias]:=bg=19} +: ${FAST_HIGHLIGHT_STYLES[freeglobbing-ext]:=fg=118} +: ${FAST_HIGHLIGHT_STYLES[freeglobbing]:=fg=112} +: ${FAST_HIGHLIGHT_STYLES[freehashed-command]:=fg=180} : ${FAST_HIGHLIGHT_STYLES[freehere-string-text]:=bg=19} +: ${FAST_HIGHLIGHT_STYLES[freehere-string-tri]:=fg=yellow} : ${FAST_HIGHLIGHT_STYLES[freehere-string-var]:=fg=110,bg=19} -: ${FAST_HIGHLIGHT_STYLES[freesecondary]:=zdharma} -: ${FAST_HIGHLIGHT_STYLES[freecase-input]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freecase-parentheses]:=fg=116} -: ${FAST_HIGHLIGHT_STYLES[freecase-condition]:=bg=19} -: ${FAST_HIGHLIGHT_STYLES[freecorrect-subtle]:=bg=55} +: ${FAST_HIGHLIGHT_STYLES[freehistory-expansion]:=fg=blue,bold} : ${FAST_HIGHLIGHT_STYLES[freeincorrect-subtle]:=bg=52} -: ${FAST_HIGHLIGHT_STYLES[freesubtle-separator]:=none} -: ${FAST_HIGHLIGHT_STYLES[freesubtle-bg]:=bg=18} -: ${FAST_HIGHLIGHT_STYLES[freepath-to-dir]:=fg=166,underline} -: ${FAST_HIGHLIGHT_STYLES[freepaired-bracket]:=bg=blue} -: ${FAST_HIGHLIGHT_STYLES[freebracket-level-1]:=fg=130} -: ${FAST_HIGHLIGHT_STYLES[freebracket-level-2]:=fg=70} -: ${FAST_HIGHLIGHT_STYLES[freebracket-level-3]:=fg=69} -: ${FAST_HIGHLIGHT_STYLES[freeglobal-alias]:=bg=19} -: ${FAST_HIGHLIGHT_STYLES[freesubcommand]:=fg=150} -: ${FAST_HIGHLIGHT_STYLES[freesingle-sq-bracket]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freedouble-sq-bracket]:=fg=180} -: ${FAST_HIGHLIGHT_STYLES[freedouble-paren]:=fg=150} -: ${FAST_HIGHLIGHT_STYLES[freeoptarg-string]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freematherr]:=fg=red} +: ${FAST_HIGHLIGHT_STYLES[freemathnum]:=fg=166} +: ${FAST_HIGHLIGHT_STYLES[freemathvar]:=fg=blue,bold} : ${FAST_HIGHLIGHT_STYLES[freeoptarg-number]:=fg=166} +: ${FAST_HIGHLIGHT_STYLES[freeoptarg-string]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freepaired-bracket]:=bg=blue} +: ${FAST_HIGHLIGHT_STYLES[freepath_pathseparator]:=} +: ${FAST_HIGHLIGHT_STYLES[freepath-to-dir]:=fg=166,underline} +: ${FAST_HIGHLIGHT_STYLES[freepath]:=fg=166} +: ${FAST_HIGHLIGHT_STYLES[freeprecommand]:=fg=180} : ${FAST_HIGHLIGHT_STYLES[freerecursive-base]:=fg=183} +: ${FAST_HIGHLIGHT_STYLES[freeredirection]:=none} +: ${FAST_HIGHLIGHT_STYLES[freereserved-word]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freesecondary]:=zdharma} +: ${FAST_HIGHLIGHT_STYLES[freesingle-hyphen-option]:=fg=110} +: ${FAST_HIGHLIGHT_STYLES[freesingle-quoted-argument]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freesingle-sq-bracket]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freesubcommand]:=fg=150} +: ${FAST_HIGHLIGHT_STYLES[freesubtle-bg]:=bg=18} +: ${FAST_HIGHLIGHT_STYLES[freesubtle-separator]:=none} +: ${FAST_HIGHLIGHT_STYLES[freesuffix-alias]:=fg=180} +: ${FAST_HIGHLIGHT_STYLES[freeunknown-token]:=fg=red,bold} +: ${FAST_HIGHLIGHT_STYLES[freevariable]:=none} diff --git a/share/test/out.parse b/share/test/out.parse deleted file mode 100644 index 9075bec..0000000 --- a/share/test/out.parse +++ /dev/null @@ -1,1920 +0,0 @@ -0 99 fg=black,bold -100 162 fg=black,bold -163 185 fg=black,bold -186 187 fg=black,bold -188 284 fg=black,bold -285 334 fg=black,bold -335 336 fg=black,bold -337 436 fg=black,bold -437 471 fg=black,bold -472 563 fg=black,bold -564 661 fg=black,bold -662 689 fg=black,bold -690 789 fg=black,bold -790 887 fg=black,bold -888 912 fg=black,bold -913 914 fg=black,bold -915 1011 fg=black,bold -1012 1110 fg=black,bold -1111 1203 fg=black,bold -1204 1303 fg=black,bold -1304 1403 fg=black,bold -1404 1504 fg=black,bold -1505 1604 fg=black,bold -1605 1686 fg=black,bold -1687 1786 fg=black,bold -1787 1869 fg=black,bold -1870 1896 fg=black,bold -1897 1996 fg=black,bold -1998 2005 fg=green -2053 2077 fg=black,bold -2078 2085 fg=green -2112 2113 fg=green -2114 2153 fg=113 -2154 2155 fg=green -2156 2208 fg=113 -2209 2210 fg=green -2211 2261 fg=113 -2262 2263 fg=green -2264 2305 fg=113 -2306 2307 fg=green -2308 2356 fg=113 -2357 2358 fg=green -2359 2402 fg=113 -2403 2404 fg=green -2405 2449 fg=113 -2450 2451 fg=green -2452 2495 fg=113 -2496 2497 fg=green -2498 2544 fg=113 -2545 2546 fg=green -2547 2595 fg=113 -2596 2597 fg=green -2598 2648 fg=113 -2649 2650 fg=green -2651 2693 fg=113 -2694 2695 fg=green -2696 2742 fg=113 -2743 2744 fg=green -2745 2794 fg=113 -2795 2796 fg=green -2797 2850 fg=113 -2851 2852 fg=green -2853 2901 fg=113 -2902 2903 fg=green -2904 2961 fg=113 -2962 2963 fg=green -2964 3016 fg=113 -3017 3018 fg=green -3019 3071 fg=113 -3072 3073 fg=green -3074 3126 fg=113 -3127 3128 fg=green -3129 3188 fg=113 -3189 3190 fg=green -3191 3250 fg=113 -3251 3252 fg=green -3253 3312 fg=113 -3313 3314 fg=green -3315 3379 fg=113 -3380 3381 fg=green -3382 3444 fg=113 -3445 3446 fg=green -3447 3509 fg=113 -3510 3511 fg=green -3512 3550 fg=113 -3551 3552 fg=green -3553 3596 fg=113 -3597 3598 fg=green -3599 3647 fg=113 -3649 3677 fg=black,bold -3678 3679 fg=black,bold -3680 3746 fg=black,bold -3747 3786 fg=black,bold -3787 3788 fg=black,bold -3789 3815 fg=black,bold -3816 3817 fg=black,bold -3818 3855 fg=black,bold -3881 3883 fg=yellow -3884 3885 fg=yellow -3888 3890 fg=yellow -3891 3893 fg=yellow -3894 3937 fg=cyan -3938 3940 fg=yellow -3942 3946 fg=yellow -3957 4006 fg=cyan -4011 4013 fg=yellow -4014 4016 fg=green -4017 4019 fg=cyan -4020 4028 fg=yellow -4021 4027 fg=cyan -4029 4031 fg=green -4033 4037 fg=yellow -4044 4050 fg=green -4055 4057 fg=yellow -4060 4062 fg=yellow -4065 4067 fg=yellow -4068 4070 fg=yellow -4071 4072 fg=cyan -4073 4087 fg=red -4088 4090 fg=yellow -4092 4096 fg=yellow -4101 4107 fg=green -4121 4136 fg=113 -4140 4142 fg=yellow -4145 4150 fg=green -4159 4161 fg=yellow -4162 4170 fg=green -4171 4173 fg=cyan -4189 4193 fg=yellow -4198 4200 fg=yellow -4201 4203 fg=yellow -4204 4220 fg=red -4221 4223 fg=yellow -4225 4229 fg=yellow -4252 4256 fg=yellow -4257 4259 fg=yellow -4260 4283 fg=red -4284 4286 fg=yellow -4288 4292 fg=yellow -4305 4319 fg=yellow -4324 4328 fg=yellow -4329 4331 fg=yellow -4332 4349 fg=cyan -4350 4352 fg=yellow -4354 4358 fg=yellow -4384 4388 fg=yellow -4389 4391 fg=yellow -4392 4410 fg=red -4411 4413 fg=yellow -4415 4419 fg=yellow -4445 4449 fg=yellow -4450 4452 fg=yellow -4453 4470 fg=red -4471 4473 fg=yellow -4475 4479 fg=yellow -4504 4508 fg=yellow -4509 4511 fg=yellow -4512 4529 fg=red -4530 4532 fg=yellow -4534 4538 fg=yellow -4563 4637 fg=black,bold -4642 4714 fg=black,bold -4719 4790 fg=black,bold -4795 4864 fg=black,bold -4869 4870 fg=black,bold -4875 4945 fg=black,bold -4950 4954 fg=yellow -4955 4956 fg=yellow -4958 4960 fg=green -4961 4963 fg=113 -4964 4966 fg=blue,bold -4967 4970 fg=blue,bold -4971 4973 fg=green -4977 4988 fg=green -4993 4994 fg=yellow -5007 5008 fg=yellow -5009 5016 fg=green -5017 5021 fg=green -5022 5024 fg=cyan -5025 5027 fg=cyan -5028 5030 fg=113 -5032 5041 fg=magenta -5048 5052 fg=yellow -5074 5076 fg=yellow -5079 5081 fg=yellow -5084 5086 fg=yellow -5087 5088 fg=yellow -5089 5091 fg=yellow -5092 5099 fg=cyan -5100 5102 fg=yellow -5104 5108 fg=yellow -5119 5173 fg=yellow -5120 5121 fg=cyan -5122 5123 fg=cyan -5152 5154 fg=cyan -5176 5178 fg=yellow -5181 5183 fg=yellow -5184 5186 fg=yellow -5187 5230 fg=cyan -5231 5233 fg=yellow -5235 5239 fg=yellow -5293 5299 fg=cyan -5302 5304 fg=yellow -5305 5306 fg=yellow -5308 5375 fg=black,bold -5376 5410 fg=black,bold -5441 5443 fg=yellow -5444 5445 fg=yellow -5448 5479 fg=black,bold -5482 5530 fg=black,bold -5533 5570 fg=black,bold -5573 5626 fg=black,bold -5629 5631 fg=green -5632 5634 fg=113 -5638 5654 fg=blue,bold -5655 5657 fg=green -5661 5663 fg=green -5664 5666 fg=113 -5667 5669 fg=blue,bold -5670 5685 fg=blue,bold -5686 5688 fg=green -5689 5690 fg=yellow -5692 5708 fg=black,bold -5709 5710 fg=black,bold -5711 5737 fg=black,bold -5738 5739 fg=black,bold -5740 5777 fg=black,bold -5807 5809 fg=yellow -5810 5811 fg=yellow -5814 5816 fg=yellow -5817 5825 fg=green -5844 5848 fg=yellow -5859 5875 fg=cyan -5878 5882 fg=yellow -5893 5897 fg=yellow -5894 5895 fg=cyan -5897 5898 fg=cyan -5908 5912 fg=cyan -5922 5924 fg=yellow -5925 5926 fg=yellow -5928 6006 fg=black,bold -6007 6071 fg=black,bold -6072 6073 fg=black,bold -6074 6132 fg=black,bold -6133 6174 fg=black,bold -6200 6202 fg=yellow -6203 6204 fg=yellow -6207 6209 fg=yellow -6210 6212 fg=green -6213 6229 fg=113 -6233 6235 fg=113 -6236 6238 fg=green -6240 6244 fg=yellow -6262 6279 fg=cyan -6284 6288 fg=green -6289 6293 -6290 6292 -6296 6300 fg=yellow -6327 6329 fg=yellow -6330 6331 fg=yellow -6333 6369 fg=black,bold -6393 6395 fg=yellow -6396 6397 fg=yellow -6400 6476 fg=black,bold -6479 6481 fg=yellow -6482 6484 fg=green -6509 6511 fg=green -6513 6517 fg=yellow -6522 6527 fg=green -6550 6564 fg=black,bold -6567 6569 fg=yellow -6572 6574 fg=yellow -6575 6577 fg=green -6595 6597 fg=green -6601 6605 fg=green -6606 6648 -6607 6609 -6610 6612 -6613 6632 -6633 6635 -6636 6638 -6638 6647 -6650 6654 fg=yellow -6659 6664 fg=green -6710 6714 fg=yellow -6719 6724 fg=green -6769 6771 fg=yellow -6774 6776 fg=yellow -6777 6779 fg=green -6793 6795 fg=green -6797 6801 fg=yellow -6806 6813 fg=green -6836 6840 fg=yellow -6845 6852 fg=green -6875 6877 fg=yellow -6880 6882 fg=yellow -6883 6885 fg=green -6904 6906 fg=green -6908 6912 fg=yellow -6917 6924 fg=green -6944 6948 fg=yellow -6953 6960 fg=green -6980 6982 fg=yellow -6985 6992 fg=green -7002 7008 fg=green -7051 7095 fg=black,bold -7098 7103 fg=green -7156 7161 fg=green -7188 7229 fg=black,bold -7232 7239 fg=green -7286 7293 fg=green -7335 7342 fg=green -7385 7390 fg=green -7409 7426 fg=black,bold -7429 7434 fg=green -7439 7443 fg=yellow -7440 7442 fg=cyan -7446 7453 fg=green -7458 7467 fg=yellow -7459 7466 fg=cyan -7470 7477 fg=green -7497 7579 fg=black,bold -7583 7588 fg=green -7602 7648 fg=black,bold -7652 7654 fg=yellow -7655 7657 fg=yellow -7658 7675 fg=blue,bold -7676 7678 fg=yellow -7680 7684 fg=yellow -7705 7706 fg=green -7717 7718 fg=green -7721 7723 fg=yellow -7726 7731 fg=green -7794 7795 fg=green -7800 7803 fg=yellow -7804 7808 fg=yellow -7809 7812 fg=yellow -7813 7816 fg=yellow -7817 7821 fg=yellow -7826 7830 fg=yellow -7835 7839 fg=yellow -7840 7844 fg=yellow -7849 7913 fg=black,bold -7918 7934 fg=black,bold -7937 7938 fg=green -7977 7978 fg=green -7983 7992 fg=yellow -7993 8002 fg=yellow -8003 8009 fg=yellow -8010 8021 fg=yellow -8022 8030 fg=yellow -8035 8043 fg=yellow -8044 8107 fg=black,bold -8110 8111 fg=green -8115 8189 fg=black,bold -8192 8255 fg=black,bold -8295 8296 fg=green -8301 8308 fg=yellow -8303 8307 fg=cyan -8309 8316 fg=black,bold -8321 8328 fg=yellow -8323 8327 fg=cyan -8329 8339 fg=black,bold -8344 8348 fg=yellow -8349 8369 fg=black,bold -8374 8381 fg=yellow -8386 8393 fg=yellow -8398 8402 fg=yellow -8407 8413 fg=yellow -8418 8424 fg=yellow -8429 8435 fg=yellow -8440 8444 fg=yellow -8449 8455 fg=yellow -8460 8468 fg=yellow -8473 8476 fg=yellow -8477 8520 fg=black,bold -8523 8524 fg=green -8528 8533 fg=green -8558 8573 fg=black,bold -8576 8577 fg=black,bold -8580 8597 fg=black,bold -8600 8629 fg=black,bold -8632 8701 fg=black,bold -8704 8779 fg=black,bold -8782 8858 fg=black,bold -8861 8915 fg=black,bold -8918 8994 fg=black,bold -8997 9070 fg=black,bold -9073 9147 fg=black,bold -9150 9151 fg=black,bold -9154 9233 fg=black,bold -9236 9313 fg=black,bold -9316 9394 fg=black,bold -9397 9414 fg=black,bold -9417 9418 fg=black,bold -9421 9500 fg=black,bold -9503 9582 fg=black,bold -9585 9652 fg=black,bold -9655 9656 fg=black,bold -9659 9733 fg=black,bold -9736 9815 fg=black,bold -9818 9897 fg=black,bold -9900 9980 fg=black,bold -9983 10063 fg=black,bold -10066 10145 fg=black,bold -10148 10224 fg=black,bold -10227 10302 fg=black,bold -10305 10328 fg=black,bold -10331 10332 fg=black,bold -10335 10413 fg=black,bold -10416 10483 fg=black,bold -10486 10563 fg=black,bold -10566 10594 fg=black,bold -10597 10598 fg=black,bold -10601 10606 fg=green -10617 10626 fg=yellow -10639 10646 fg=green -10664 10683 fg=black,bold -10686 10691 fg=green -10701 10707 fg=yellow -10702 10706 fg=cyan -10710 10713 fg=yellow -10721 10754 fg=113 -10770 10807 fg=113 -10809 10811 fg=yellow -10816 10840 fg=black,bold -10845 10847 fg=yellow -10848 10850 fg=yellow -10851 10865 fg=blue,bold -10866 10868 fg=yellow -10870 10874 fg=yellow -10881 10883 fg=yellow -10886 10900 fg=blue,bold -10901 10903 fg=yellow -10908 10910 fg=yellow -10915 10917 fg=yellow -10918 10920 fg=yellow -10921 10935 fg=blue,bold -10939 10940 fg=magenta -10941 10943 fg=yellow -10945 10949 fg=yellow -10956 11001 fg=black,bold -11018 11029 fg=yellow -11034 11038 fg=yellow -11045 11064 fg=black,bold -11069 11071 fg=yellow -11077 11134 fg=black,bold -11139 11140 fg=black,bold -11145 11190 fg=black,bold -11195 11241 fg=black,bold -11246 11329 fg=black,bold -11334 11399 fg=black,bold -11404 11405 fg=black,bold -11410 11485 fg=black,bold -11490 11560 fg=black,bold -11565 11639 fg=black,bold -11644 11665 fg=black,bold -11670 11677 fg=green -11722 11724 fg=yellow -11725 11727 fg=green -11728 11738 fg=113 -11743 11752 fg=yellow -11754 11756 fg=green -11758 11762 fg=yellow -11801 11803 fg=yellow -11804 11806 fg=green -11807 11811 fg=113 -11815 11823 fg=yellow -11824 11826 fg=green -11828 11832 fg=yellow -11868 11870 fg=yellow -11875 11877 fg=yellow -11883 11959 fg=black,bold -11964 11966 fg=yellow -11967 11969 fg=green -11970 11974 fg=113 -11978 11981 fg=yellow -11982 11984 fg=green -11987 11991 fg=yellow -11998 12066 fg=black,bold -12073 12142 fg=black,bold -12149 12156 fg=black,bold -12163 12164 fg=black,bold -12171 12240 fg=black,bold -12247 12313 fg=black,bold -12320 12388 fg=black,bold -12395 12418 fg=black,bold -12425 12430 fg=green -12439 12446 fg=yellow -12453 12460 fg=green -12468 12469 fg=cyan -12472 12495 fg=cyan -12498 12499 fg=magenta -12469 12471 fg=yellow -12500 12502 fg=yellow -12461 12502 -12509 12511 fg=yellow -12512 12521 fg=blue,bold -12525 12531 fg=blue,bold -12532 12534 fg=yellow -12541 12543 fg=yellow -12544 12551 fg=blue,bold -12554 12563 fg=blue,bold -12566 12567 fg=cyan -12568 12571 fg=blue,bold -12572 12574 fg=yellow -12579 12583 fg=yellow -12590 12605 fg=black,bold -12612 12613 fg=black,bold -12620 12703 fg=black,bold -12710 12711 fg=black,bold -12718 12804 fg=black,bold -12811 12897 fg=black,bold -12904 12983 fg=black,bold -12990 13077 fg=black,bold -13084 13154 fg=black,bold -13161 13207 fg=black,bold -13214 13216 fg=yellow -13217 13219 fg=green -13220 13231 fg=yellow -13221 13230 fg=cyan -13234 13274 fg=13 -13275 13277 fg=green -13279 13283 fg=yellow -13294 13324 fg=black,bold -13335 13342 fg=green -13350 13364 fg=yellow -13351 13363 fg=cyan -13371 13375 fg=yellow -13386 13393 fg=green -13409 13411 fg=yellow -13418 13420 fg=yellow -13420 13429 fg=blue,bold -13431 13437 fg=blue,bold -13437 13439 fg=yellow -13446 13448 fg=yellow -13448 13455 fg=blue,bold -13456 13466 fg=cyan -13467 13474 fg=cyan -13474 13476 fg=yellow -13481 13483 fg=yellow -13489 13531 fg=black,bold -13536 13578 fg=black,bold -13583 13627 fg=black,bold -13632 13677 fg=black,bold -13682 13683 fg=black,bold -13688 13737 fg=black,bold -13742 13787 fg=black,bold -13792 13800 fg=black,bold -13805 13806 fg=black,bold -13811 13868 fg=black,bold -13873 13926 fg=black,bold -13931 13983 fg=black,bold -13988 14040 fg=black,bold -14045 14099 fg=black,bold -14104 14153 fg=black,bold -14158 14159 fg=black,bold -14164 14213 fg=black,bold -14227 14264 fg=yellow -14228 14263 fg=cyan -14270 14311 fg=black,bold -14316 14317 fg=black,bold -14322 14403 fg=black,bold -14408 14410 fg=yellow -14411 14413 fg=green -14440 14445 fg=yellow -14450 14457 fg=113 -14461 14474 fg=113 -14475 14477 fg=green -14479 14483 fg=yellow -14490 14492 fg=yellow -14493 14495 fg=green -14496 14506 fg=113 -14512 14523 fg=yellow -14524 14533 fg=yellow -14536 14538 fg=green -14540 14544 fg=yellow -14573 14577 fg=yellow -14606 14630 fg=black,bold -14637 14639 fg=yellow -14646 14665 fg=red,bold -14666 14676 fg=113 -14677 14685 fg=113 -14686 14692 fg=113 -14721 14729 fg=green -14734 14736 fg=yellow -14742 14769 fg=black,bold -14774 14776 fg=yellow -14777 14807 fg=green -14808 14812 fg=113 -14815 14819 fg=yellow -14826 14870 fg=black,bold -14898 14900 fg=yellow -14906 14949 fg=black,bold -14954 14956 fg=yellow -14957 14959 fg=yellow -14962 14976 fg=blue,bold -14977 14979 fg=yellow -14981 14985 fg=yellow -14992 14994 fg=yellow -14995 14997 fg=green -14998 15008 fg=113 -15013 15025 fg=yellow -15027 15029 fg=green -15033 15035 fg=green -15036 15040 fg=113 -15041 15043 fg=blue,bold -15047 15049 fg=green -15051 15055 fg=yellow -15074 15075 fg=cyan -15106 15108 fg=yellow -15113 15115 fg=yellow -15121 15150 fg=black,bold -15155 15157 fg=yellow -15158 15160 fg=yellow -15163 15177 fg=blue,bold -15178 15180 fg=yellow -15182 15186 fg=yellow -15193 15195 fg=yellow -15196 15198 fg=green -15199 15209 fg=113 -15214 15226 fg=yellow -15228 15230 fg=green -15232 15236 fg=yellow -15245 15249 fg=yellow -15250 15256 fg=green -15257 15259 fg=yellow -15270 15302 fg=red,bold -15313 15324 bg=blue -15324 15325 fg=yellow -15336 15337 fg=cyan -15393 15405 fg=yellow -15418 15473 fg=red,bold -15484 15488 bg=blue -15488 15489 fg=yellow -15507 15508 fg=cyan -15565 15574 fg=yellow -15610 15622 fg=yellow -15635 15636 bg=blue -15636 15637 fg=yellow -15659 15663 fg=yellow -15670 15674 fg=yellow -15675 15677 fg=green -15678 15688 fg=113 -15693 15705 fg=yellow -15707 15709 fg=green -15711 15715 fg=yellow -15735 15747 fg=yellow -15767 15776 fg=yellow -15783 15785 fg=yellow -15789 15791 fg=yellow -15796 15866 fg=black,bold -15870 15872 fg=yellow -15873 15875 fg=green -15876 15886 fg=113 -15891 15901 fg=yellow -15906 15910 fg=113 -15914 15922 fg=yellow -15923 15925 fg=green -15927 15931 fg=yellow -15937 15959 fg=black,bold -15985 16033 fg=black,bold -16049 16058 fg=yellow -16062 16066 fg=yellow -16067 16069 fg=green -16070 16080 fg=113 -16085 16094 fg=yellow -16096 16098 fg=green -16102 16104 fg=yellow -16105 16119 fg=blue,bold -16123 16124 fg=magenta -16125 16127 fg=yellow -16129 16133 fg=yellow -16134 16160 fg=black,bold -16166 16168 fg=yellow -16169 16171 fg=green -16217 16223 fg=yellow -16218 16222 fg=cyan -16225 16227 fg=green -16229 16233 fg=yellow -16262 16266 fg=yellow -16267 16269 fg=green -16270 16276 fg=yellow -16271 16275 fg=cyan -16279 16285 fg=yellow -16286 16288 fg=green -16290 16294 fg=yellow -16334 16335 fg=cyan -16376 16388 fg=yellow -16406 16415 fg=yellow -16421 16425 fg=yellow -16432 16459 fg=red,bold -16460 16464 fg=113 -16471 16476 fg=green -16490 16498 fg=yellow -16491 16497 fg=cyan -16505 16530 fg=green -16531 16546 fg=113 -16553 16558 fg=green -16563 16571 fg=yellow -16564 16570 fg=cyan -16578 16580 fg=yellow -16581 16582 fg=yellow -16591 16669 fg=black,bold -16678 16679 fg=black,bold -16688 16771 fg=black,bold -16780 16863 fg=black,bold -16872 16955 fg=black,bold -16964 17025 fg=black,bold -17034 17039 fg=green -17069 17074 fg=green -17082 17089 fg=green -17110 17112 fg=yellow -17113 17115 fg=green -17116 17120 fg=113 -17129 17131 fg=green -17135 17137 fg=yellow -17138 17152 fg=cyan -17153 17155 fg=yellow -17170 17172 fg=green -17173 17182 fg=113 -17189 17191 fg=green -17195 17197 fg=green -17198 17206 fg=113 -17209 17250 fg=13 -17251 17253 fg=green -17268 17270 fg=yellow -17271 17295 fg=red -17296 17298 fg=yellow -17310 17314 fg=yellow -17325 17350 fg=green -17351 17362 fg=113 -17377 17383 fg=cyan -17392 17394 fg=yellow -17401 17402 fg=yellow -17409 17413 fg=yellow -17414 17418 fg=green -17419 17421 fg=yellow -17430 17438 bg=blue -17438 17439 fg=yellow -17446 17461 fg=black,bold -17530 17532 fg=yellow -17533 17535 fg=green -17536 17540 fg=113 -17544 17551 fg=yellow -17546 17550 fg=cyan -17552 17554 fg=green -17556 17560 fg=yellow -17600 17603 fg=yellow -17643 17647 fg=yellow -17648 17650 fg=green -17651 17655 fg=113 -17659 17666 fg=yellow -17661 17665 fg=cyan -17667 17669 fg=green -17671 17675 fg=yellow -17702 17784 fg=black,bold -17811 17836 fg=green -17837 17840 fg=yellow -17887 17889 fg=yellow -17890 17892 fg=green -17893 17899 fg=113 -17917 17919 fg=green -17921 17925 fg=yellow -17965 17975 fg=yellow -18002 18004 fg=yellow -18029 18031 fg=yellow -18067 18081 bg=blue -18081 18082 fg=yellow -18112 18117 bg=blue -18117 18118 fg=yellow -18128 18130 fg=yellow -18131 18132 fg=yellow -18159 18166 fg=green -18206 18210 fg=yellow -18211 18215 fg=green -18216 18218 fg=yellow -18247 18291 fg=red,bold -18320 18321 fg=red,bold -18350 18374 fg=red,bold -18403 18404 fg=red,bold -18433 18490 fg=red,bold -18519 18520 fg=yellow -18520 18524 bg=blue -18524 18525 fg=yellow -18526 18527 fg=green -18558 18589 fg=red,bold -18618 18619 fg=yellow -18619 18624 bg=blue -18624 18625 fg=yellow -18671 18691 fg=red,bold -18720 18721 fg=yellow -18721 18722 bg=blue -18722 18723 fg=yellow -18724 18725 fg=green -18754 18758 fg=yellow -18785 18787 fg=yellow -18788 18790 fg=yellow -18791 18803 fg=blue,bold -18804 18806 fg=yellow -18808 18812 fg=yellow -18887 18891 fg=yellow -18960 18989 fg=green -18990 18994 fg=113 -19023 19028 fg=green -19042 19050 fg=yellow -19043 19049 fg=cyan -19079 19081 fg=green -19127 19142 fg=yellow -19128 19141 fg=cyan -19192 19198 fg=yellow -19193 19197 fg=cyan -19200 19202 fg=green -19243 19244 fg=green -19244 19248 fg=113 -19248 19249 fg=green -19276 19278 fg=yellow -19303 19304 fg=yellow -19329 19331 fg=red,bold -19340 19347 fg=green -19347 19348 fg=red,bold -19380 19388 fg=yellow -19388 19389 fg=red,bold -19421 19428 fg=green -19428 19429 fg=red,bold -19461 19467 fg=red,bold -19467 19468 fg=red,bold -19508 19512 fg=red,bold -19512 19513 fg=red,bold -19557 19561 fg=yellow -19627 19629 fg=yellow -19630 19632 fg=green -19633 19641 fg=113 -19645 19648 fg=yellow -19649 19651 fg=green -19653 19657 fg=yellow -19737 19741 fg=yellow -19770 19805 fg=black,bold -19834 19907 fg=black,bold -19947 19956 fg=yellow -19983 19985 fg=yellow -20010 20014 fg=yellow -20015 20017 fg=green -20018 20027 fg=113 -20030 20045 fg=113 -20046 20048 fg=green -20052 20054 fg=yellow -20055 20056 fg=cyan -20057 20060 fg=blue,bold -20061 20062 fg=magenta -20063 20064 fg=magenta -20069 20070 fg=magenta -20071 20073 fg=yellow -20075 20079 fg=yellow -20154 20158 fg=yellow -20159 20161 fg=green -20162 20171 fg=113 -20175 20190 fg=113 -20191 20193 fg=green -20195 20199 fg=yellow -20274 20278 fg=yellow -20279 20281 fg=green -20332 20338 fg=yellow -20333 20337 fg=cyan -20340 20342 fg=green -20344 20348 fg=yellow -20375 20377 fg=yellow -20378 20380 fg=green -20381 20391 fg=113 -20396 20407 fg=yellow -20409 20411 fg=green -20413 20417 fg=yellow -20446 20519 fg=black,bold -20548 20575 fg=black,bold -20653 20657 fg=yellow -20732 20734 fg=yellow -20759 20763 fg=yellow -20764 20766 fg=yellow -20767 20781 fg=blue,bold -20785 20786 fg=magenta -20787 20789 fg=yellow -20791 20795 fg=yellow -20864 20868 fg=yellow -20869 20871 fg=green -20872 20881 fg=113 -20885 20889 fg=yellow -20890 20892 fg=green -20894 20898 fg=yellow -20925 20949 fg=black,bold -20976 20977 fg=black,bold -21004 21073 fg=black,bold -21100 21168 fg=black,bold -21195 21264 fg=black,bold -21291 21360 fg=black,bold -21387 21388 fg=black,bold -21415 21484 fg=black,bold -21511 21550 fg=black,bold -21623 21642 fg=red,bold -21643 21653 fg=113 -21654 21655 fg=cyan -21657 21666 fg=blue,bold -21669 21670 fg=magenta -21655 21657 fg=yellow -21670 21672 fg=yellow -21673 21679 fg=113 -21748 21750 fg=yellow -21751 21753 fg=green -21754 21765 fg=113 -21769 21773 fg=yellow -21774 21776 fg=green -21778 21782 fg=yellow -21811 21830 fg=red,bold -21831 21832 fg=cyan -21834 21841 fg=blue,bold -21844 21845 fg=magenta -21832 21834 fg=yellow -21845 21847 fg=yellow -21848 21856 fg=113 -21857 21863 fg=113 -21934 21936 fg=yellow -21961 21965 fg=yellow -21966 21968 fg=green -21969 21973 fg=113 -21977 21981 fg=yellow -21982 21984 fg=green -21986 21990 fg=yellow -22017 22037 fg=black,bold -22108 22112 fg=yellow -22113 22115 fg=green -22116 22120 fg=113 -22124 22131 fg=yellow -22126 22130 fg=cyan -22132 22134 fg=green -22136 22140 fg=yellow -22167 22177 fg=black,bold -22263 22266 fg=yellow -22306 22310 fg=yellow -22337 22339 fg=yellow -22340 22366 fg=red,bold -22368 22372 fg=yellow -22407 22413 fg=cyan -22440 22444 fg=yellow -22519 22521 fg=yellow -22546 22548 fg=yellow -22573 22575 fg=red,bold -22584 22585 fg=red,bold -22585 22586 fg=red,bold -22620 22630 fg=113 -22631 22639 fg=113 -22734 22736 fg=red,bold -22743 22747 fg=yellow -22753 22755 fg=yellow -22759 22761 fg=yellow -22765 22767 fg=yellow -22768 22770 fg=yellow -22773 22786 fg=blue,bold -22787 22789 fg=yellow -22793 22795 fg=green -22796 22802 fg=113 -22820 22822 fg=green -22826 22870 fg=black,bold -22877 22878 fg=yellow -22879 22881 fg=yellow -22882 22896 fg=blue,bold -22897 22899 fg=yellow -22903 22905 fg=green -22906 22916 fg=113 -22921 22932 fg=yellow -22934 22936 fg=green -22940 22942 fg=green -22943 22953 fg=113 -22958 22970 fg=yellow -22972 22974 fg=green -22978 22980 fg=green -22981 22991 fg=113 -22996 23008 fg=yellow -23010 23012 fg=green -23013 23014 fg=yellow -23018 23022 fg=yellow -23023 23051 fg=black,bold -23058 23062 fg=yellow -23063 23067 fg=green -23068 23070 fg=yellow -23079 23086 bg=blue -23086 23087 fg=yellow -23088 23125 fg=black,bold -23143 23145 fg=yellow -23146 23166 fg=red,bold -23168 23172 fg=yellow -23280 23289 fg=yellow -23307 23311 fg=yellow -23331 23356 fg=green -23357 23360 fg=yellow -23398 23400 fg=yellow -23411 23422 bg=blue -23422 23423 fg=yellow -23424 23456 fg=black,bold -23474 23476 fg=yellow -23477 23479 fg=yellow -23480 23494 fg=blue,bold -23495 23497 fg=yellow -23501 23506 fg=green -23507 23561 fg=black,bold -23579 23583 fg=yellow -23614 23623 fg=yellow -23641 23643 fg=yellow -23709 23716 bg=blue -23716 23717 fg=yellow -23718 23731 fg=black,bold -23749 23750 fg=black,bold -23768 23787 fg=black,bold -23805 23806 fg=black,bold -23824 23896 fg=black,bold -23914 23994 fg=black,bold -24012 24014 fg=yellow -24015 24052 fg=red,bold -24054 24058 fg=yellow -24078 24103 fg=green -24104 24107 fg=yellow -24147 24149 fg=yellow -24150 24152 fg=green -24153 24159 fg=113 -24177 24179 fg=green -24181 24185 fg=yellow -24218 24228 fg=yellow -24248 24250 fg=yellow -24268 24272 fg=yellow -24292 24339 fg=black,bold -24357 24359 fg=yellow -24388 24393 bg=blue -24393 24394 fg=yellow -24434 24438 bg=blue -24438 24439 fg=yellow -24480 24484 bg=blue -24484 24485 fg=yellow -24528 24532 bg=blue -24532 24533 fg=yellow -24583 24602 fg=red,bold -24603 24613 fg=113 -24614 24622 fg=113 -24623 24629 fg=113 -24647 24669 fg=red,bold -24731 24736 bg=blue -24736 24737 fg=yellow -24786 24805 fg=red,bold -24806 24816 fg=113 -24817 24825 fg=113 -24826 24832 fg=113 -24850 24879 fg=red,bold -24941 24945 bg=blue -24945 24946 fg=yellow -24987 24992 bg=blue -24992 24993 bg=blue -24993 25004 bg=blue -25004 25005 fg=yellow -25023 25038 fg=red,bold -25084 25085 bg=blue -25085 25086 fg=yellow -25093 25095 fg=yellow -25096 25101 fg=green -25103 25107 fg=yellow -25125 25129 fg=yellow -25130 25132 fg=green -25133 25137 fg=113 -25140 25147 fg=yellow -25142 25146 fg=cyan -25148 25150 fg=green -25154 25191 fg=red,bold -25193 25197 fg=yellow -25217 25256 fg=black,bold -25274 25278 fg=yellow -25279 25281 fg=green -25282 25291 fg=113 -25294 25309 fg=113 -25310 25312 fg=green -25316 25318 fg=yellow -25319 25320 fg=cyan -25321 25324 fg=blue,bold -25325 25326 fg=magenta -25327 25328 fg=magenta -25333 25334 fg=magenta -25335 25337 fg=yellow -25339 25343 fg=yellow -25404 25408 fg=yellow -25409 25411 fg=green -25462 25468 fg=yellow -25463 25467 fg=cyan -25470 25472 fg=green -25474 25478 fg=yellow -25498 25500 fg=yellow -25501 25503 fg=green -25504 25514 fg=113 -25519 25530 fg=yellow -25532 25534 fg=green -25536 25540 fg=yellow -25604 25608 fg=yellow -25669 25671 fg=yellow -25689 25693 fg=yellow -25694 25696 fg=yellow -25697 25711 fg=blue,bold -25715 25716 fg=magenta -25717 25719 fg=yellow -25721 25725 fg=yellow -25780 25784 fg=yellow -25804 25806 fg=yellow -25807 25833 fg=red,bold -25835 25839 fg=yellow -25867 25873 fg=cyan -25893 25897 fg=yellow -25952 25954 fg=yellow -25972 25974 fg=yellow -26001 26005 fg=yellow -26010 26012 fg=yellow -26017 26019 fg=yellow -26020 26021 fg=yellow -26022 26024 fg=yellow -26025 26038 fg=blue,bold -26039 26041 fg=yellow -26043 26047 fg=yellow -26054 26073 fg=red,bold -26074 26084 fg=113 -26085 26093 fg=113 -26094 26100 fg=113 -26107 26109 fg=green -26110 26116 fg=113 -26128 26134 fg=113 -26150 26152 fg=green -26156 26187 fg=red,bold -26192 26194 fg=yellow -26199 26201 fg=yellow -26202 26204 fg=green -26255 26261 fg=yellow -26256 26260 fg=cyan -26263 26265 fg=green -26267 26271 fg=yellow -26278 26280 fg=yellow -26281 26283 fg=green -26284 26288 fg=113 -26292 26295 fg=yellow -26296 26298 fg=green -26302 26322 fg=red,bold -26324 26328 fg=yellow -26337 26381 fg=black,bold -26400 26411 fg=yellow -26418 26422 fg=yellow -26441 26450 fg=yellow -26485 26487 fg=yellow -26492 26496 fg=yellow -26504 26506 fg=green -26553 26559 fg=yellow -26554 26558 fg=cyan -26564 26574 fg=113 -26579 26588 fg=yellow -26590 26592 fg=green -26603 26605 fg=green -26651 26657 fg=yellow -26652 26656 fg=cyan -26662 26672 fg=113 -26677 26686 fg=yellow -26688 26690 fg=green -26692 26696 fg=yellow -26713 26722 fg=yellow -26727 26731 fg=yellow -26732 26734 fg=green -26735 26739 fg=113 -26743 26751 fg=yellow -26755 26765 fg=113 -26770 26779 fg=yellow -26781 26783 fg=green -26785 26789 fg=yellow -26796 26824 fg=black,bold -26854 26919 fg=black,bold -26926 26967 fg=black,bold -26974 26975 fg=black,bold -26982 27047 fg=black,bold -27054 27123 fg=black,bold -27130 27131 fg=black,bold -27138 27204 fg=black,bold -27221 27239 fg=yellow -27244 27246 fg=yellow -27261 27269 fg=cyan -27274 27276 fg=yellow -27277 27279 fg=yellow -27280 27294 fg=blue,bold -27298 27299 fg=magenta -27300 27302 fg=yellow -27304 27308 fg=yellow -27315 27353 fg=black,bold -27370 27380 fg=cyan -27385 27389 fg=yellow -27396 27415 fg=black,bold -27420 27422 fg=yellow -27425 27429 fg=yellow -27430 27431 fg=yellow -27433 27471 fg=black,bold -27500 27502 fg=yellow -27503 27504 fg=yellow -27509 27515 fg=green -27547 27549 fg=green -27550 27554 fg=113 -27558 27599 fg=blue,bold -27600 27602 fg=green -27612 27614 fg=green -27615 27619 fg=113 -27623 27638 fg=13 -27639 27641 fg=green -27642 27643 fg=yellow -27676 27678 fg=yellow -27679 27680 fg=yellow -27683 27688 fg=green -27723 27731 fg=cyan -27748 27750 fg=green -27754 27794 fg=yellow -27755 27793 fg=cyan -27798 27830 fg=yellow -27799 27829 fg=cyan -27834 27874 fg=yellow -27835 27873 fg=cyan -27875 27877 fg=green -27881 27887 fg=green -27892 27895 fg=yellow -27896 27898 fg=yellow -27899 27902 none -27905 27910 none -27911 27914 none -27903 27904 fg=yellow -27914 27915 fg=yellow,bold -27916 27920 fg=cyan -27921 27923 fg=yellow -27931 27932 fg=yellow,bold -27933 27936 none -27936 27938 fg=yellow -27939 27941 fg=yellow -27944 27946 fg=yellow -27951 27953 fg=yellow -27954 27956 fg=green -27957 27968 fg=113 -27972 27975 fg=yellow -27976 27978 fg=green -27980 27984 fg=yellow -27991 28010 fg=red,bold -28011 28012 fg=cyan -28014 28017 fg=blue,bold -28020 28021 fg=magenta -28012 28014 fg=yellow -28021 28023 fg=yellow -28024 28028 fg=113 -28029 28043 fg=113 -28048 28050 fg=yellow -28053 28057 fg=yellow -28058 28059 fg=yellow -28061 28087 fg=black,bold -28088 28138 fg=black,bold -28139 28205 fg=black,bold -28232 28234 fg=yellow -28235 28236 fg=yellow -28239 28266 fg=red,bold -28267 28271 fg=113 -28275 28280 fg=green -28295 28303 fg=yellow -28296 28302 fg=cyan -28321 28323 fg=green -28327 28341 fg=113 -28342 28344 fg=green -28348 28354 fg=green -28359 28361 fg=green -28365 28379 fg=113 -28380 28382 fg=green -28386 28392 fg=green -28397 28399 fg=green -28403 28417 fg=113 -28418 28420 fg=green -28424 28430 fg=green -28436 28463 fg=black,bold -28466 28471 fg=green -28485 28488 fg=yellow -28503 28510 fg=113 -28513 28515 fg=yellow -28520 28522 fg=green -28526 28554 fg=yellow -28527 28538 fg=cyan -28539 28553 fg=cyan -28555 28557 fg=green -28561 28567 fg=green -28572 28576 fg=yellow -28580 28632 fg=black,bold -28635 28637 fg=green -28643 28661 fg=113 -28662 28664 fg=green -28668 28674 fg=green -28680 28753 fg=black,bold -28756 28758 fg=yellow -28759 28761 fg=green -28762 28771 fg=113 -28772 28774 fg=blue,bold -28775 28778 fg=yellow -28782 28795 fg=113 -28799 28807 fg=113 -28808 28810 fg=green -28812 28816 fg=yellow -28821 28826 fg=green -28842 28843 fg=green -28844 28864 fg=blue,bold -28865 28866 fg=green -28871 28873 fg=yellow -28874 28875 fg=cyan -28876 28879 fg=blue,bold -28882 28883 fg=magenta -28884 28886 fg=yellow -28911 28917 fg=green -28922 28924 fg=yellow -28928 28946 fg=black,bold -28949 28955 fg=green -28958 28959 fg=yellow -28961 29015 fg=black,bold -29038 29040 fg=yellow -29041 29042 fg=yellow -29045 29051 fg=green -29079 29084 fg=green -29108 29113 fg=green -29121 29128 fg=green -29143 29148 fg=green -29163 29232 fg=black,bold -29235 29238 fg=yellow -29239 29241 fg=yellow -29242 29243 none -29244 29245 fg=yellow -29246 29247 fg=magenta -29248 29249 fg=yellow,bold -29250 29251 none -29254 29257 none -29258 29261 none -29264 29269 none -29270 29273 none -29252 29253 fg=yellow -29262 29263 fg=yellow -29274 29275 fg=yellow,bold -29276 29277 none -29278 29280 fg=yellow -29281 29282 fg=magenta -29283 29285 fg=yellow -29288 29290 fg=yellow -29295 29297 fg=yellow -29298 29299 fg=blue,bold -29302 29303 fg=blue,bold -29306 29315 fg=blue,bold -29318 29319 fg=magenta -29320 29322 fg=yellow -29327 29329 fg=yellow -29330 29331 fg=blue,bold -29334 29335 fg=blue,bold -29338 29339 fg=magenta -29340 29342 fg=yellow -29347 29351 fg=yellow -29352 29362 fg=green -29363 29365 fg=yellow -29372 29375 bg=blue -29376 29377 fg=yellow -29426 29468 fg=black,bold -29481 29483 fg=yellow -29484 29486 fg=green -29487 29496 fg=113 -29499 29540 fg=13 -29541 29543 fg=green -29546 29550 fg=yellow -29565 29567 fg=yellow -29568 29569 fg=blue,bold -29573 29574 fg=cyan -29575 29580 fg=blue,bold -29581 29583 fg=yellow -29584 29614 fg=black,bold -29629 29631 fg=yellow -29632 29633 fg=blue,bold -29637 29638 fg=cyan -29639 29644 fg=blue,bold -29645 29647 fg=yellow -29648 29662 fg=black,bold -29675 29679 fg=yellow -29680 29682 fg=green -29683 29692 fg=113 -29695 29743 fg=13 -29744 29746 fg=green -29749 29753 fg=yellow -29768 29770 fg=yellow -29771 29772 fg=blue,bold -29776 29777 fg=cyan -29778 29783 fg=blue,bold -29784 29786 fg=yellow -29787 29828 fg=black,bold -29843 29845 fg=yellow -29846 29847 fg=blue,bold -29851 29852 fg=cyan -29853 29858 fg=blue,bold -29859 29861 fg=yellow -29862 29876 fg=black,bold -29889 29893 fg=yellow -29908 29916 fg=green -29929 29931 fg=yellow -29953 29957 bg=blue -29957 29958 fg=yellow -30005 30007 fg=yellow -30008 30010 fg=green -30023 30035 fg=blue,bold -30036 30038 fg=green -30040 30044 fg=yellow -30059 30061 fg=yellow -30062 30063 fg=blue,bold -30067 30068 fg=magenta -30069 30071 fg=yellow -30072 30099 fg=black,bold -30114 30116 fg=yellow -30117 30118 fg=blue,bold -30122 30123 fg=magenta -30124 30126 fg=yellow -30127 30159 fg=black,bold -30172 30176 fg=yellow -30191 30199 fg=green -30212 30214 fg=yellow -30236 30237 bg=blue -30237 30238 fg=yellow -30239 30247 fg=green -30256 30260 fg=yellow -30265 30284 fg=red,bold -30285 30287 fg=113 -30288 30290 fg=113 -30291 30297 fg=113 -30300 30304 fg=yellow -30305 30306 fg=yellow -30308 30362 fg=black,bold -30392 30394 fg=yellow -30395 30396 fg=yellow -30399 30405 fg=green -30433 30438 fg=green -30462 30467 fg=green -30475 30482 fg=green -30497 30502 fg=green -30517 30522 fg=green -30528 30535 fg=green -30540 30618 fg=black,bold -30621 30624 fg=yellow -30625 30627 fg=yellow -30628 30629 none -30630 30631 fg=yellow -30632 30633 fg=magenta -30634 30635 fg=yellow,bold -30636 30637 none -30640 30643 none -30644 30647 none -30650 30655 none -30656 30659 none -30638 30639 fg=yellow -30648 30649 fg=yellow -30660 30661 fg=yellow,bold -30662 30663 none -30664 30666 fg=yellow -30667 30668 fg=magenta -30669 30671 fg=yellow -30674 30676 fg=yellow -30681 30683 fg=yellow -30684 30685 fg=blue,bold -30688 30689 fg=blue,bold -30692 30701 fg=blue,bold -30704 30705 fg=magenta -30706 30708 fg=yellow -30713 30715 fg=yellow -30716 30717 fg=blue,bold -30720 30721 fg=blue,bold -30724 30725 fg=magenta -30726 30728 fg=yellow -30733 30737 fg=yellow -30738 30748 fg=green -30749 30751 fg=yellow -30758 30762 bg=blue -30762 30763 fg=yellow -30810 30813 fg=yellow -30814 30816 fg=yellow -30817 30818 none -30821 30822 none -30819 30820 fg=yellow -30823 30824 fg=yellow -30825 30826 fg=magenta -30827 30828 fg=yellow,bold -30829 30830 none -30834 30837 none -30838 30841 none -30844 30849 none -30850 30853 none -30831 30833 fg=yellow -30842 30843 fg=yellow -30854 30855 fg=yellow,bold -30856 30857 none -30858 30860 fg=yellow -30861 30862 fg=magenta -30863 30865 fg=yellow -30867 30869 fg=yellow -30884 30886 fg=green -30887 30897 fg=yellow -30888 30896 fg=cyan -30898 30900 fg=blue,bold -30919 30921 fg=green -30925 30930 fg=green -30943 30947 fg=yellow -30963 30978 fg=cyan -30991 31049 fg=black,bold -31062 31064 fg=yellow -31065 31067 fg=green -31071 31076 fg=yellow -31072 31075 fg=cyan -31080 31104 fg=yellow -31126 31131 fg=yellow -31127 31130 fg=cyan -31135 31148 fg=yellow -31170 31175 fg=yellow -31171 31174 fg=cyan -31179 31199 fg=yellow -31221 31226 fg=yellow -31222 31225 fg=cyan -31230 31250 fg=yellow -31266 31268 fg=red,bold -31270 31274 fg=yellow -31289 31291 fg=yellow -31292 31293 fg=blue,bold -31297 31298 fg=cyan -31299 31304 fg=blue,bold -31305 31307 fg=yellow -31322 31324 fg=yellow -31325 31326 fg=blue,bold -31330 31331 fg=cyan -31332 31337 fg=blue,bold -31338 31340 fg=yellow -31353 31357 fg=yellow -31372 31374 fg=yellow -31375 31377 fg=yellow -31378 31379 fg=cyan -31380 31383 fg=blue,bold -31386 31388 fg=cyan -31389 31390 fg=magenta -31391 31393 fg=yellow -31400 31410 fg=113 -31421 31423 fg=green -31425 31429 fg=yellow -31446 31498 fg=black,bold -31549 31551 fg=yellow -31566 31568 fg=yellow -31569 31570 fg=blue,bold -31574 31575 fg=magenta -31576 31578 fg=yellow -31579 31606 fg=black,bold -31621 31623 fg=yellow -31624 31625 fg=blue,bold -31629 31630 fg=magenta -31631 31633 fg=yellow -31634 31666 fg=black,bold -31679 31681 fg=yellow -31703 31704 bg=blue -31704 31705 fg=yellow -31706 31714 fg=green -31723 31727 fg=yellow -31732 31751 fg=red,bold -31752 31754 fg=113 -31755 31757 fg=113 -31758 31764 fg=113 -31767 31771 fg=yellow -31772 31773 fg=yellow -31775 31818 fg=black,bold -31819 31919 fg=black,bold -31920 31970 fg=black,bold -31998 32000 fg=yellow -32001 32002 fg=yellow -32005 32007 fg=yellow -32008 32009 fg=cyan -32014 32015 fg=magenta -32016 32018 fg=yellow -32022 32027 fg=green -32031 32033 fg=cyan -32038 32113 fg=yellow -32117 32225 fg=black,bold -32228 32234 fg=green -32260 32265 fg=green -32274 32275 fg=green -32276 32294 fg=113 -32295 32296 fg=yellow -32298 32397 fg=black,bold -32398 32431 fg=black,bold -32432 32531 fg=black,bold -32553 32555 fg=yellow -32556 32557 fg=yellow -32602 32603 fg=green -32603 32604 fg=green -32605 32606 fg=yellow -32627 32629 fg=yellow -32630 32631 fg=yellow -32634 32639 fg=green -32655 32660 fg=green -32679 32681 fg=cyan -32688 32690 fg=cyan -32693 32698 fg=green -32703 32706 fg=yellow -32718 32720 fg=yellow -32725 32727 fg=yellow -32728 32730 fg=yellow -32731 32766 fg=red -32767 32769 fg=yellow -32771 32775 fg=yellow -32789 32790 fg=green -32790 32838 fg=yellow -32791 32797 fg=cyan -32798 32802 fg=cyan -32803 32837 fg=cyan -32838 32839 fg=green -32846 32851 fg=green -32856 32858 fg=yellow -32861 32865 fg=yellow -32866 32867 fg=yellow -32890 32902 fg=black,bold -2265 2266 fg=green,bold -6226 6227 fg=yellow,bold -4345 4346 fg=cyan,bold -2960 2961 fg=green,bold -3554 3555 fg=green,bold -6228 6229 fg=yellow,bold -4743 4744 fg=yellow,bold -4348 4349 fg=yellow,bold -29360 29361 fg=yellow,bold -5638 5639 fg=yellow,bold -2965 2966 fg=green,bold -2768 2769 fg=yellow,bold -21161 21162 fg=yellow,bold -19467 19468 fg=red,bold -21162 21163 fg=green,bold -12654 12655 fg=green,bold -12657 12658 fg=green,bold -12958 12959 fg=cyan,bold -6330 6331 fg=green,bold -3063 3064 fg=yellow,bold -1580 1581 fg=green,bold -2570 2571 fg=yellow,bold -5444 5445 fg=green,bold -4851 4852 fg=yellow,bold -2475 2476 fg=yellow,bold -2674 2675 fg=yellow,bold -5645 5646 fg=yellow,bold -3368 3369 fg=yellow,bold -5646 5647 fg=yellow,bold -4955 4956 fg=yellow,bold -2876 2877 fg=yellow,bold -27792 27793 fg=yellow,bold -12660 12661 fg=yellow,bold -21770 21771 fg=cyan,bold -12365 12366 fg=yellow,bold -21771 21772 fg=yellow,bold -23955 23956 fg=yellow,bold -20886 20887 fg=yellow,bold -20887 20888 fg=cyan,bold -2179 2180 fg=yellow,bold -3070 3071 fg=green,bold -21978 21979 fg=yellow,bold -3470 3471 fg=yellow,bold -2382 2383 fg=yellow,bold -2679 2680 fg=yellow,bold -3075 3076 fg=green,bold -3175 3176 fg=yellow,bold -4463 4464 fg=yellow,bold -2483 2484 fg=yellow,bold -2780 2781 fg=yellow,bold -5652 5653 fg=yellow,bold -4464 4465 fg=cyan,bold -3276 3277 fg=yellow,bold -2287 2288 fg=yellow,bold -4466 4467 fg=cyan,bold -4863 4864 fg=yellow,bold -3378 3379 fg=green,bold -3576 3577 fg=yellow,bold -2499 2500 fg=green,bold -2587 2588 fg=yellow,bold -2401 2402 fg=green,bold -2599 2600 fg=green,bold -2885 2886 fg=yellow,bold -19086 19087 fg=cyan,bold -19087 19088 fg=green,bold -2304 2305 fg=green,bold -1314 1315 fg=green,bold -2987 2988 fg=yellow,bold -2207 2208 fg=green,bold -2900 2901 fg=green,bold -2406 2407 fg=green,bold -19388 19389 fg=red,bold -31082 31083 fg=yellow,bold -31182 31183 fg=yellow,bold -19303 19304 fg=yellow,bold -2905 2906 fg=green,bold -12869 12870 fg=yellow,bold -12671 12672 fg=cyan,bold -12473 12474 fg=yellow,bold -31086 31087 fg=yellow,bold -12672 12673 fg=green,bold -31087 31088 fg=yellow,bold -21979 21980 fg=yellow,bold -12673 12674 fg=yellow,bold -27821 27822 fg=yellow,bold -112 113 fg=green,bold -30892 30893 fg=yellow,bold -114 115 fg=green,bold -31102 31103 fg=yellow,bold -30895 30896 fg=yellow,bold -27828 27829 fg=yellow,bold -11306 11307 fg=yellow,bold -4270 4271 fg=yellow,bold -4469 4470 fg=yellow,bold -2390 2391 fg=yellow,bold -4271 4272 fg=cyan,bold -2193 2194 fg=yellow,bold -2293 2294 fg=yellow,bold -4273 4274 fg=cyan,bold -3383 3384 fg=green,bold -19089 19090 fg=green,bold -4275 4276 fg=cyan,bold -5860 5861 fg=yellow,bold -2494 2495 fg=green,bold -2692 2693 fg=green,bold -3187 3188 fg=green,bold -2594 2595 fg=green,bold -2309 2310 fg=green,bold -2793 2794 fg=green,bold -3299 3300 fg=yellow,bold -2212 2213 fg=green,bold -3884 3885 fg=green,bold -2697 2698 fg=green,bold -3588 3589 fg=yellow,bold -2115 2116 fg=green,bold -3600 3601 fg=green,bold -2798 2799 fg=green,bold -5868 5869 fg=cyan,bold -3008 3009 fg=yellow,bold -19198 19199 fg=cyan,bold -3405 3406 fg=yellow,bold -31192 31193 fg=yellow,bold -3508 3509 fg=green,bold -31193 31194 fg=yellow,bold -12482 12483 fg=cyan,bold -19512 19513 fg=red,bold -12681 12682 fg=yellow,bold -12483 12484 fg=green,bold -12682 12683 fg=green,bold -31097 31098 fg=yellow,bold -12485 12486 fg=green,bold -31197 31198 fg=yellow,bold -31098 31099 fg=yellow,bold -11298 11299 fg=yellow,bold -12982 12983 fg=yellow,bold -12686 12687 fg=green,bold -12687 12688 fg=yellow,bold -12699 12700 fg=yellow,bold -23975 23976 fg=yellow,bold -12700 12701 fg=green,bold -12304 12305 fg=yellow,bold -12701 12702 fg=cyan,bold -12702 12703 fg=yellow,bold -3192 3193 fg=green,bold -4281 4282 fg=cyan,bold -4282 4283 fg=yellow,bold -6263 6264 fg=yellow,bold -5670 5671 fg=yellow,bold -3097 3098 fg=yellow,bold -3999 4000 fg=yellow,bold -8345 8346 fg=yellow,bold -4000 4001 fg=cyan,bold -8346 8347 fg=yellow,bold -3595 3596 fg=green,bold -4002 4003 fg=cyan,bold -5873 5874 fg=cyan,bold -4685 4686 fg=yellow,bold -5874 5875 fg=yellow,bold -5676 5677 fg=yellow,bold -3311 3312 fg=green,bold -3498 3499 fg=yellow,bold -3015 3016 fg=green,bold -4005 4006 fg=yellow,bold -2521 2522 fg=yellow,bold -2719 2720 fg=yellow,bold -3214 3215 fg=yellow,bold -4403 4404 fg=yellow,bold -2621 2622 fg=yellow,bold -4404 4405 fg=cyan,bold -2820 2821 fg=yellow,bold -3513 3514 fg=green,bold -14170 14171 fg=yellow,bold -12190 12191 fg=yellow,bold -3118 3119 fg=yellow,bold -3316 3317 fg=green,bold -18131 18132 fg=yellow,bold -4406 4407 fg=cyan,bold -12291 12292 fg=yellow,bold -2428 2429 fg=yellow,bold -14174 14175 fg=yellow,bold -12195 12196 fg=yellow,bold -12493 12494 fg=cyan,bold -12494 12495 fg=yellow,bold -2927 2928 fg=yellow,bold -12695 12696 fg=yellow,bold -19428 19429 fg=red,bold -12696 12697 fg=green,bold -12697 12698 fg=cyan,bold -12416 12417 fg=yellow,bold -5285 5286 fg=yellow,bold -5286 5287 fg=cyan,bold -3020 3021 fg=green,bold -6278 6279 fg=yellow,bold -5288 5289 fg=cyan,bold -4409 4410 fg=yellow,bold -4993 4994 fg=yellow,bold -2331 2332 fg=yellow,bold -4213 4214 fg=yellow,bold -2234 2235 fg=yellow,bold -3125 3126 fg=green,bold -4214 4215 fg=cyan,bold -2532 2533 fg=yellow,bold -5305 5306 fg=green,bold -2137 2138 fg=yellow,bold -3622 3623 fg=yellow,bold -4216 4217 fg=cyan,bold -2437 2438 fg=yellow,bold -1546 1547 fg=green,bold -1448 1449 fg=green,bold -2636 2637 fg=yellow,bold -5607 5608 fg=yellow,bold -2738 2739 fg=yellow,bold -14199 14200 fg=yellow,bold -4918 4919 fg=yellow,bold -19637 19638 fg=green,bold -21134 21135 fg=green,bold -19836 19837 fg=red,bold -31233 31234 fg=yellow,bold -21135 21136 fg=yellow,bold -27857 27858 fg=yellow,bold -31137 31138 fg=yellow,bold -30743 30744 fg=yellow,bold -5291 5292 fg=yellow,bold -5689 5690 fg=green,bold -32825 32826 fg=yellow,bold -30746 30747 fg=yellow,bold -3130 3131 fg=green,bold -4219 4220 fg=yellow,bold -6203 6204 fg=green,bold -5609 5610 fg=cyan,bold -2145 2146 fg=yellow,bold -3630 3631 fg=yellow,bold -4522 4523 fg=yellow,bold -2344 2345 fg=yellow,bold -3433 3434 fg=yellow,bold -5898 5899 fg=yellow,bold -5810 5811 fg=green,bold -4919 4920 fg=yellow,bold -4523 4524 fg=cyan,bold -2543 2544 fg=green,bold -2741 2742 fg=green,bold -5613 5614 fg=cyan,bold -4821 4822 fg=yellow,bold -3237 3238 fg=yellow,bold -14191 14192 fg=yellow,bold -4525 4526 fg=cyan,bold -2248 2249 fg=yellow,bold -3535 3536 fg=yellow,bold -19142 19143 fg=cyan,bold -5912 5913 fg=yellow,bold -4823 4824 fg=yellow,bold -3338 3339 fg=yellow,bold -2448 2449 fg=green,bold -4528 4529 fg=yellow,bold -2548 2549 fg=green,bold -2647 2648 fg=green,bold -2746 2747 fg=green,bold -19640 19641 fg=green,bold -2846 2847 fg=yellow,bold -2945 2946 fg=yellow,bold -19347 19348 fg=red,bold -31141 31142 fg=yellow,bold -31142 31143 fg=yellow,bold -31243 31244 fg=yellow,bold -31244 31245 fg=yellow,bold -31146 31147 fg=yellow,bold -31248 31249 fg=yellow,bold -23922 23923 fg=yellow,bold -12638 12639 fg=yellow,bold -32836 32837 fg=yellow,bold -6396 6397 fg=red,bold -3042 3043 fg=yellow,bold -2152 2153 fg=green,bold -5619 5620 fg=cyan,bold -2453 2454 fg=green,bold -2849 2850 fg=green,bold -3443 3444 fg=green,bold -3542 3543 fg=yellow,bold -2355 2356 fg=green,bold -2157 2158 fg=green,bold -2652 2653 fg=green,bold -5623 5624 fg=cyan,bold -19151 19152 fg=cyan,bold -5624 5625 fg=yellow,bold -19152 19153 fg=green,bold -2854 2855 fg=green,bold -3448 3449 fg=green,bold -3646 3647 fg=green,bold -19154 19155 fg=green,bold -5925 5926 fg=green,bold -29357 29358 fg=yellow,bold -27872 27873 fg=yellow,bold -12639 12640 fg=cyan,bold -12640 12641 fg=green,bold -27777 27778 fg=yellow,bold -12941 12942 fg=cyan,bold -23936 23937 fg=yellow,bold -3249 3250 fg=green,bold -2260 2261 fg=green,bold -2360 2361 fg=green,bold -3152 3153 fg=yellow,bold -4341 4342 fg=yellow,bold -3549 3550 fg=green,bold -4342 4343 fg=cyan,bold -3254 3255 fg=green,bold diff --git a/share/test/parse.zsh b/share/test/parse.zsh index e2f72ac..27d2698 100755 --- a/share/test/parse.zsh +++ b/share/test/parse.zsh @@ -1,5 +1,6 @@ -#!/bin/sh - +#!/usr/bin/env zsh +# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # This file runs the highlighter on a specified file # i.e. parses the file with the highlighter. Outputs @@ -8,81 +9,75 @@ # # Can be also run in line-wise mode on own input (-o # option in $1), no region_highlight file then. -# -[[ -z "$ZSH_VERSION" ]] && exec /usr/bin/env /usr/local/bin/zsh -f -c "source \"$0\" \"$1\" \"$2\" \"$3\"" - -ZERO="${(%):-%N}" - -if [[ -e "${ZERO}/../functions/fast-highlight" ]]; then - source "${ZERO}/../functions/fast-highlight" - source "${ZERO}/../functions/fast-string-highlight" - fpath+=( "${ZERO}/.." ) -elif [[ -e "../functions/fast-highlight" ]]; then - source "../functions/fast-highlight" - source "../functions/fast-string-highlight" - fpath+=( "$PWD/.." ) -elif [[ -e "${ZERO}/functions/fast-highlight" ]]; then - source "${ZERO}/functions/fast-highlight" - source "${ZERO}/functions/fast-string-highlight" - fpath+=( "${ZERO}" ) -elif [[ -e "./functions/fast-highlight" ]]; then - source "./functions/fast-highlight" - source "./functions/fast-string-highlight" - fpath+=( "./" ) +0="${ZERO:-${${0:#$ZSH_ARGZERO}:-${(%):-%N}}}" +0="${${(M)0:#/*}:-$PWD/$0}" + +ZSH_BIN="$(which zsh)" +SET_FPATH="${0:h}/../../functions" +[[ -z "$FAST_WORK_DIR" ]] && FAST_WORK_DIR="${0:h}" +[[ -z "$ZSH_VERSION" ]] && exec $ZSH_BIN zsh -f -c "source \"$0\" \"$1\" \"$2\" \"$3\"" + +if [[ ! -e "$FAST_WORK_DIR/secondary_theme.zsh" ]]; then + cp -f "${0:h}/../free_theme.zsh" "$FAST_WORK_DIR/secondary_theme.zsh" +fi + +if [[ -e "$SET_FPATH/fast-highlight" ]]; then + source "$SET_FPATH/fast-highlight" + source "$SET_FPATH/fast-string-highlight" + fpath+=( "$SET_FPATH" ) else - print -u2 "Could not find fast-highlight, aborting" - exit 1 + print -u2 "Could not find fast-highlight, aborting" + exit 1 fi zmodload zsh/zprof autoload is-at-least chroma/-git.ch - -setopt interactive_comments extendedglob +builtin setopt interactive_comments extended_glob typeset_silent no_short_loops rc_quotes no_auto_pushd # Own input? if [[ "$1" = "-o" || "$1" = "-oo" || "$1" = "-ooo" || "$1" = "-git" || "$1" = "-hue" || "$1" = "-hol" ]]; then - typeset -a input - input=() - if [[ "$1" = "-o" ]]; then - input+=( "./parse.zsh ../functions/fast-highlight parse2.out" ) - input+=( "rm -f parse*.out" ) - input+=( "./mh-parse.zsh ../functions/fast-highlight > out" ) - input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" ) - input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" ) - input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' ) - input+=( 'func() { echo "a" >! phist2.db; echo "b" >>! phist2.db; fc -Rap "phist2.db"; list=( ${history[@]} ); echo "${history[1]}"; }' ) - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; } - elif [[ "$1" = "-oo" ]]; then - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; } - elif [[ "$1" = "-ooo" ]]; then - local in=' + typeset -a input + input=() + if [[ "$1" = "-o" ]]; then + input+=( "./parse.zsh ../functions/fast-highlight parse2.out" ) + input+=( "rm -f parse*.out" ) + input+=( "./mh-parse.zsh ../functions/fast-highlight > out" ) + input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" ) + input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" ) + input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' ) + input+=( 'func() { echo "a" >! phist2.db; echo "b" >>! phist2.db; fc -Rap "phist2.db"; list=( ${history[@]} ); echo "${history[1]}"; }' ) + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; } + elif [[ "$1" = "-oo" ]]; then + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' ) + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; } + elif [[ "$1" = "-ooo" ]]; then + local in=' # This is an example code that is diverse and allows to test a theme text="An example quite long string $with variable in it" local param1="text $variable" param2='"'"'other $variable'"'"' math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 )) for (( ii = 1; ii <= size; ++ ii )); do - if [[ "${cmds[ii]} string" = "| string" ]] - then - sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening $( - (( sidx <= len )) && { - eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing ) - } - fi + if [[ "${cmds[ii]} string" = "| string" ]] + then + sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening $( + (( sidx <= len )) && { + eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing ) + } + fi done' - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } - input+=( "$in" ) - input+=( "$in" ) - elif [[ "$1" = "-git" ]]; then - local in="git lp + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } + input+=( "$in" ) + input+=( "$in" ) + elif [[ "$1" = "-git" ]]; then + local in="git lp git push origin main git commit git add safari.ini zdharma.ini @@ -96,25 +91,25 @@ git tag -a 'v1.18' -m 'Here-string is highlighted, descriptor-variables passed t git tag -l -n9 git checkout cb66b11 " - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } - input+=( "$in" ) - input+=( "$in" ) - elif [[ "$1" = "-hue" ]]; then - local in="var=\$other; local var=\$other - () { eval \"\$var\"; } - case \$other in - \$var) - ( echo OK; ) - ;; - esac - sudo -i -s ls -1 /var/log - () { ( eval \"command ls -1\" ); } argument" - - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } - - input+=( "$in" "$in" ) - elif [[ "$1" = "-hol" ]]; then - local in="var=\$( other ) + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } + input+=( "$in" ) + input+=( "$in" ) + elif [[ "$1" = "-hue" ]]; then + local in="var=\$other; local var=\$other + () { eval \"\$var\"; } + case \$other in + \$var) + ( echo OK; ) + ;; + esac + sudo -i -s ls -1 /var/log + () { ( eval \"command ls -1\" ); } argument" + + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } + + input+=( "$in" "$in" ) + elif [[ "$1" = "-hol" ]]; then + local in="var=\$( other ) local var2=\$(( other + 1 )) () { eval \"\$var\"; } sudo -i -s ls -1 >/tmp/ls-log.txt /var/log @@ -123,98 +118,96 @@ var3=\$(( HISTSIZE + 10 + \$var )) local var4=\$( other command ) touch \$(( HISTSIZE + \$SAVEHIST + 10 )) case \$other in - \$var) - ( echo OK; ) - ;; - \$var3) - ( if { true } { noglob echo yes } ) + \$var) + ( echo OK; ) + ;; + \$var3) + ( if { true } { noglob echo yes } ) esac ( builtin cd /var/log; ls -1; noglob cd \"/var/log\" 'log' ) noglob cat <<<\"\$PATH\" | tr : \"\\n\" if [[ \"\$var\" -gt 10 ]]; then - (( var = HISTSIZE + \$SAVEHIST )) + (( var = HISTSIZE + \$SAVEHIST )) fi /var/log sidx=\${buffer[(in:ii:)\\\$\\(?#[^\\\\\\\\]\\)]} # find opening cmd-subst { - exec {MYFD}<&0 {MYFD2}>&1 - ( read <&\$MYFD line; echo \$line >&\$MYFD2 && { builtin print \${match[1]}Written. } ) + exec {MYFD}<&0 {MYFD2}>&1 + ( read <&\$MYFD line; echo \$line >&\$MYFD2 && { builtin print \${match[1]}Written. } ) } always { - (( MYFD > 0 )) && { print -rl -- -myfd:\$MYFD >&\$MYFD2 && print \"Sent.\" '(to filedescriptor)'; } + (( MYFD > 0 )) && { print -rl -- -myfd:\$MYFD >&\$MYFD2 && print \"Sent.\" '(to filedescriptor)'; } } command sleep \"\$(( \$a + b + \${cde} + \${(s::)fgh[ijk]} + \\\$l + \\m + \\\" ))\" for (( i = 0; i <= 2; ++ i )) { print \$i; } " - (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } + (( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; } - input+=( "$in" ) - fi + input+=( "$in" ) + fi - typeset -a long_input - integer i - for (( i=1; i<= 50; i ++ )); do - long_input+=( "${input[@]}" ) - done + typeset -a long_input + integer i + for (( i=1; i<= 50; i ++ )); do + long_input+=( "${input[@]}" ) + done - typeset -F SECONDS - SECONDS=0 + typeset -F SECONDS + SECONDS=0 - local right_brace_is_recognised_everywhere - integer path_dirs_was_set multi_func_def ointeractive_comments - -fast-highlight-fill-option-variables + local right_brace_is_recognised_everywhere + integer path_dirs_was_set multi_func_def ointeractive_comments + -fast-highlight-fill-option-variables - local BUFFER - for BUFFER in "${long_input[@]}"; do - reply=( ) - () { - -fast-highlight-init - -fast-highlight-process "" "$BUFFER" "0" - -fast-highlight-string-process "" "$BUFFER" - } - done + local BUFFER + for BUFFER in "${long_input[@]}"; do + reply=( ) + () { + -fast-highlight-init + -fast-highlight-process "" "$BUFFER" "0" + -fast-highlight-string-process "" "$BUFFER" + } + done - print "Running time: $SECONDS" - zprof | head + print "Running time: $SECONDS" + zprof | head # File input? elif [[ -r "$1" ]]; then - # Load from given file - local BUFFER="$(<$1)" + # Load from given file + local BUFFER="$(<$1)" - typeset -F SECONDS - SECONDS=0 + typeset -F SECONDS + SECONDS=0 - reply=( ) - -fast-highlight-init + reply=( ) + -fast-highlight-init - local right_brace_is_recognised_everywhere - integer path_dirs_was_set multi_func_def ointeractive_comments - -fast-highlight-fill-option-variables + local right_brace_is_recognised_everywhere + integer path_dirs_was_set multi_func_def ointeractive_comments + -fast-highlight-fill-option-variables - () { - -fast-highlight-process "" "$BUFFER" "0" - -fast-highlight-string-process "" "$BUFFER" - } + () { + -fast-highlight-process "" "$BUFFER" "0" + -fast-highlight-string-process "" "$BUFFER" + } - print "Running time: $SECONDS" - zprof | head + print "Running time: $SECONDS" + zprof | head - # This output can be diffed to detect changes in operation - if [[ -z "$2" ]]; then - print -rl -- "${reply[@]}" >! out.parse - else - print -rl -- "${reply[@]}" >! "$2" - fi + # This output can be diffed to detect changes in operation + if [[ -z "$2" ]]; then + print -rl -- "${reply[@]}" >! out.parse + else + print -rl -- "${reply[@]}" >! "$2" + fi else - if [[ -z "$1" ]]; then - print -u2 "Usage: ./parse.zsh {to-parse file} [region_highlight output file]" - exit 2 - else - print -u2 "Unreadable to-parse file \`$1', aborting" - exit 3 - fi + if [[ -z "$1" ]]; then + print -u2 "Usage: fast-parse {to-parse file} [region_highlight output file]" + exit 2 + else + print -u2 "Unreadable to-parse file \`$1', aborting" + exit 3 + fi fi exit 0 - -# vim:ft=zsh diff --git a/share/test/to-parse.zsh b/share/test/to-parse.zsh old mode 100644 new mode 100755 index 5ed22b6..4b6feda --- a/share/test/to-parse.zsh +++ b/share/test/to-parse.zsh @@ -245,7 +245,7 @@ typeset -gA HSMW_HIGHLIGHT_STYLES # word delimiters (an improvised array); [[ $x == *:foo:* ]] and x=${x//:foo:/} # will DTRT regardless of how many elements or repetitions $x has.. # - # Handling of redirections: upon seeing a redirection token, we must stall + # Handling of redirection: upon seeing a redirection token, we must stall # the current state --- that is, the value of $this_word --- for two iterations # (one for the redirection operator, one for the word following it representing # the redirection target). Therefore, we set $in_redirection to 2 upon seeing a diff --git a/tests/_output/.gitkeep b/tests/_output/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/_support/.gitkeep b/tests/_support/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/_support/bootstrap b/tests/_support/bootstrap deleted file mode 100644 index 0107661..0000000 --- a/tests/_support/bootstrap +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env zsh -# Write your bootstrap code here diff --git a/themes/base16.ini b/themes/base16.ini new file mode 100644 index 0000000..8c82598 --- /dev/null +++ b/themes/base16.ini @@ -0,0 +1,82 @@ +[base] +default = none +unknown-token = 1,bold +commandseparator = none +redirection = none +here-string-tri = 14 +here-string-text = bg:11 +here-string-var = 1,bg:11 +exec-descriptor = 9,bold +comment = 8 +correct-subtle = 12 +incorrect-subtle = 1 +subtle-separator = 12 +subtle-bg = bg:10 +; secondary = +; recursive-base = + +[command-point] +reserved-word = 5 +subcommand = 6 +alias = 4 +suffix-alias = 4 +global-alias = 4,bg:11 +builtin = 4 +function = 4 +command = 4 +precommand = 6 +hashed-command = 4 +single-sq-bracket = 4 +double-sq-bracket = 4 +double-paren = 5 + +[paths] +path = 9 +pathseparator = +path-to-dir = 9,underline +globbing = 6 +globbing-ext = 6,bold + +[brackets] +paired-bracket = bg:8 +bracket-level-1 = 3,bold +bracket-level-2 = 6,bold +bracket-level-3 = 2,bold + +[arguments] +single-hyphen-option = 3 +double-hyphen-option = 3 +back-quoted-argument = none +single-quoted-argument = 2 +double-quoted-argument = 2 +dollar-quoted-argument = 2 + +[in-string] +; backslash in $'...' +back-dollar-quoted-argument = 6 +; backslash or $... in "..." +back-or-dollar-double-quoted-argument = 1 + +[other] +variable = 1 +assign = none +assign-array-bracket = 5 +history-expansion = 6,bold + +[math] +mathvar = 1 +mathnum = 9 +matherr = 1,bold + +[for-loop] +forvar = 1 +fornum = 9 +; operator +foroper = none +; separator +forsep = none + +[case] +case-input = 1 +case-parentheses = 5 +case-condition = bg:10 diff --git a/themes/z-shell.ini b/themes/z-shell.ini index 60e9799..c6c1690 100644 --- a/themes/z-shell.ini +++ b/themes/z-shell.ini @@ -1,6 +1,6 @@ [base] default = none -unknown-token = red,bold +unknown-token = 196,bold commandseparator = none redirection = none here-string-tri = 141 @@ -11,8 +11,8 @@ comment = black,bold correct-subtle = bg:55 incorrect-subtle = bg:52 subtle-bg = bg:17 -secondary = safari -recursive-base = 184 +secondary = base16 +recursive-base = 190 [command-point] reserved-word = 48 diff --git "a/\342\206\222chroma/-autoload.ch" "b/\342\206\222chroma/-autoload.ch" deleted file mode 100755 index 4769cae..0000000 --- "a/\342\206\222chroma/-autoload.ch" +++ /dev/null @@ -1,102 +0,0 @@ -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# vim: ft=zsh sw=2 ts=2 et -# -# Tracks autoload command - highlights function names if they exist somewhere -# in $fpath. Also warns that the autoloaded function is already defined. -# -# $1 - 0 or 1, denoting if it's first call to the chroma, or following one -# -# $2 - the current token, also accessible by $__arg from the above scope - -# basically a private copy of $__arg; the token can be eg.: "grep" -# -# $3 - a private copy of $_start_pos, i.e. the position of the token in the -# command line buffer, used to add region_highlight entry (see man), -# because Zsh colorizes by *ranges* in command line buffer -# -# $4 - a private copy of $_end_pos from the above scope -# - -(( next_word = 2 | 8192 )) - -local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" -local __style __chars -integer __idx1 __idx2 -local -a __results __deserialized __noshsplit - -# First call, i.e. command starts, i.e. "grep" token etc. -(( __first_call )) && { - FAST_HIGHLIGHT[chroma-autoload-counter]=0 - FAST_HIGHLIGHT[chroma-autoload-counter-all]=1 - FAST_HIGHLIGHT[chroma-autoload-message]="" - #FAST_HIGHLIGHT[chroma-autoload-message-shown]="" - [[ -z ${FAST_HIGHLIGHT[chroma-autoload-message-shown-at]} ]] && FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=0 - FAST_HIGHLIGHT[chroma-autoload-elements]="" - __style=${FAST_THEME_NAME}command - -} || { - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - fi - (( FAST_HIGHLIGHT[chroma-autoload-counter-all] += 1, __idx2 = FAST_HIGHLIGHT[chroma-autoload-counter-all] )) - - # Following call, i.e. not the first one. - - # Check if chroma should end – test if token is of type - # "starts new command", if so pass-through – chroma ends - [[ "$__arg_type" = 3 ]] && return 2 - - if [[ "$__wrd" = [-+]* ]]; then - # Detected option, add style for it. - [[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ - __style=${FAST_THEME_NAME}single-hyphen-option - else - # Count non-option tokens. - (( FAST_HIGHLIGHT[chroma-autoload-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-autoload-counter] )) - - if [[ $__wrd != (\$|\"\$)* && $__wrd != (/|\"/|\'/)* && $__wrd != \`* ]]; then - __results=( ${^fpath}/$__wrd(N) ) - __deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-fpath_peq-elements]}}" ) - __results+=( ${^__deserialized}/$__wrd(N) ) - [[ "${#__results}" -gt 0 ]] && { - __style=${FAST_THEME_NAME}correct-subtle - __deserialized=( "${(Q@)${(z@)FAST_HIGHLIGHT[chroma-autoload-elements]}}" ) - [[ -z "${__deserialized[1]}" && ${#__deserialized} -eq 1 ]] && __deserialized=() - # Cannot use ${abc:+"$abc"} trick with ${~...}, so handle most - # cases of the possible shwordsplit through an additional array - __noshsplit=( ${~__wrd} ) - __deserialized+=( "${(j: :)__noshsplit}" ) - FAST_HIGHLIGHT[chroma-autoload-elements]="${(j: :)${(q@)__deserialized}}" - # Make the function defined for big-loop's *main-type mechanism - __fast_highlight_main__command_type_cache[${(j: :)__noshsplit}]="function" - } || __style=${FAST_THEME_NAME}incorrect-subtle - fi - - if (( ${+functions[${(Q)__wrd}]} )); then - FAST_HIGHLIGHT[chroma-autoload-message]+="Warning: Function ${(Q)__wrd} already defined (e.g. loaded)"$'\n' - fi - fi - - # Display only when processing last autoload argument - if (( ${#${(z)BUFFER}} == FAST_HIGHLIGHT[chroma-autoload-counter-all] )); then - # Display only if already shown message differs or when it timeouts - if [[ ${FAST_HIGHLIGHT[chroma-autoload-message]} != ${FAST_HIGHLIGHT[chroma-autoload-message-shown]} || - $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-autoload-message-shown-at] )) -gt 7 - ]]; then - FAST_HIGHLIGHT[chroma-autoload-message-shown]=${FAST_HIGHLIGHT[chroma-autoload-message]} - FAST_HIGHLIGHT[chroma-autoload-message-shown-at]=$EPOCHSECONDS - zle -M "${FAST_HIGHLIGHT[chroma-autoload-message]}" - fi - fi -} - -# Add region_highlight entry (via `reply' array). -# -# This is a common place of adding such entry, but any above code -# can do it itself and skip setting __style to disable this code. -[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") - -# We aren't passing-through (no return 1 occured), do obligatory things ourselves. -(( this_word = next_word )) -_start_pos=$_end_pos - -return 0 diff --git "a/\342\206\222chroma/-autorandr.ch" "b/\342\206\222chroma/-autorandr.ch" deleted file mode 100755 index 6759bd0..0000000 --- "a/\342\206\222chroma/-autorandr.ch" +++ /dev/null @@ -1,24 +0,0 @@ -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# vim: ft=zsh sw=2 ts=2 et - -(( next_word = 2 | 8192 )) -[[ "$__arg_type" = 3 ]] && return 2 - -local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" - -if (( __first_call )) || [[ "$__wrd" = -* ]]; then - return 1 -else - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - fi - if [[ -d "${XDG_CONFIG_HOME:-$HOME/.config}/autorandr/$__wrd" ]] then - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") - fi -fi - -(( this_word = next_word )) -_start_pos=$_end_pos - -return 0 diff --git "a/\342\206\222chroma/-awk.ch" "b/\342\206\222chroma/-awk.ch" deleted file mode 100755 index 9175f06..0000000 --- "a/\342\206\222chroma/-awk.ch" +++ /dev/null @@ -1,107 +0,0 @@ -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# -# $1 - 0 or 1, denoting if it's first call to the chroma, or following one -# -# $2 - the current token, also accessible by $__arg from the above scope - -# basically a private copy of $__arg; the token can be eg.: "grep" -# -# $3 - a private copy of $_start_pos, i.e. the position of the token in the -# command line buffer, used to add region_highlight entry (see man), -# because Zsh colorizes by *ranges* in command line buffer -# -# $4 - a private copy of $_end_pos from the above scope -# - -(( next_word = 2 | 8192 )) - -local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" -local __style __chars __val __style2 -integer __idx1 __idx2 - -# First call, i.e. command starts, i.e. "grep" token etc. -(( __first_call )) && { - FAST_HIGHLIGHT[chroma-awk-counter]=0 - FAST_HIGHLIGHT[chroma-awk-f-seen]=0 - return 1 -} || { - # Following call, i.e. not the first one. - - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - fi - - # Check if chroma should end – test if token is of type - # "starts new command", if so pass-through – chroma ends - [[ "$__arg_type" = 3 ]] && return 2 - - if [[ "$__wrd" = -* ]]; then - # Detected option, add style for it. - [[ "$__wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ - __style=${FAST_THEME_NAME}single-hyphen-option - [[ "$__wrd" = "-f" ]] && FAST_HIGHLIGHT[chroma-awk-f-seen]=1 - else - # Count non-option tokens. - (( FAST_HIGHLIGHT[chroma-awk-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-awk-counter] )) - - # First non-option token is the pattern (regex), we will - # highlight it. - if (( FAST_HIGHLIGHT[chroma-awk-counter] == 1 && FAST_HIGHLIGHT[chroma-awk-f-seen] == 0 )); then - if print -r -- "${(Q)__wrd}" | gawk --source 'BEGIN { exit } END { exit 0 }' -f - >/dev/null 2>&1; then - __style2="${FAST_THEME_NAME}subtle-bg" - else - __style2="${FAST_THEME_NAME}incorrect-subtle" - fi - - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style2]}") - - # Highlight keywords - FSH_LIST=() - : "${__wrd//(#m)(BEGIN|END|FIELDWIDTHS|RS|ARGC|ARGV|ENVIRON|NF|NR|IGNORECASE|FILENAME|if|then|else|while|toupper|tolower|function|print|sub)/$(( fsh_sy_h_append($MBEGIN, $MEND) ))}"; - for __val in "${FSH_LIST[@]}" ; do - [[ ${__wrd[${__val%%;;*}]} = [a-zA-Z0-9_] || ${__wrd[${__val##*;;}+1]} = [a-zA-Z0-9_] ]] && continue - __idx1=$(( __start_pos + ${__val%%;;*} )) - __idx2=__idx1+${__val##*;;}-${__val%%;;*}+1 - (( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}-1, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}reserved-word]},${FAST_HIGHLIGHT_STYLES[$__style2]}") - done - - # Highlight regex characters - __chars="*+\\)(\{\}[]^" - __idx1=__start_pos - __idx2=__start_pos - while [[ "$__wrd" = (#b)[^$__chars]#([\\][\\])#((+|\*|\[|\]|\)|\(|\^|\}|\{)|[\\](+|\*|\[|\]|\)|\(|\^|\{|\}))(*) ]]; do - if [[ -n "${match[3]}" ]]; then - __idx1+=${mbegin[3]}-1 - __idx2=__idx1+${mend[3]}-${mbegin[3]}+1 - (( __start=__idx1-${#PREBUFFER}, __end=__idx2-${#PREBUFFER}, __start >= 0 )) && \ - reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}mathnum]},${FAST_HIGHLIGHT_STYLES[$__style2]}") - __idx1=__idx2 - else - __idx1+=${mbegin[5]}-1 - fi - __wrd="${match[5]}" - done - elif (( FAST_HIGHLIGHT[chroma-awk-counter] >= 2 || FAST_HIGHLIGHT[chroma-awk-f-seen] == 1 )); then - FAST_HIGHLIGHT[chroma-awk-f-seen]=0 - # Handle paths, etc. normally - just pass-through to the big - # highlighter (the main FSH highlighter, used before chromas). - return 1 - fi - fi -} - -# Add region_highlight entry (via `reply' array). -# -# This is a common place of adding such entry, but any above -# code can do it itself (and it does) and skip setting __style -# to disable this code. -[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") - -# We aren't passing-through (no return 1 occured), do obligatory things ourselves. -(( this_word = next_word )) -_start_pos=$_end_pos - -return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git "a/\342\206\222chroma/-perl.ch" "b/\342\206\222chroma/-perl.ch" deleted file mode 100755 index 26efb76..0000000 --- "a/\342\206\222chroma/-perl.ch" +++ /dev/null @@ -1,79 +0,0 @@ -# -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# -# Chroma function for command `perl'. It highlights code passed to perl -# with -e option - does syntax check by calling `perl -ce', then highlights -# as correct or incorrect code. -# -# $1 - 0 or 1, denoting if it's first call to the chroma, or following one -# $2 - the current token, also accessible by $__arg from the above scope - -# basically a private copy of $__arg -# $3 - a private copy of $_start_pos, i.e. the position of the token in the -# command line buffer, used to add region_highlight entry (see man), -# because Zsh colorizes by *ranges* in command line buffer -# $4 - a private copy of $_end_pos from the above scope -# - -(( next_word = 2 | 8192 )) - -local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" -local __style -integer __idx1 __idx2 - -(( __first_call )) && { - # Called for the first time - new command. - # FAST_HIGHLIGHT is used because it survives between calls, and - # allows to use a single global hash only, instead of multiple - # global variables. - FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0 - return 1 -} || { - # Following call, i.e. not the first one. - - # Check if chroma should end – test if token is of type - # "starts new command", if so pass-through – chroma ends - [[ "$__arg_type" = 3 ]] && return 2 - - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - fi - - if [[ "$__wrd" = -* && ${FAST_HIGHLIGHT[chroma-perl-got-subcommand]} -eq 0 ]]; then - __style=${FAST_THEME_NAME}${${${__wrd:#--*}:+single-hyphen-option}:-double-hyphen-option} - - if [[ "$__wrd" = "-e" || ("$__wrd" = -*e* && "$__wrd" != --*) ]]; then - FAST_HIGHLIGHT[chrome-perl-got-eswitch]=1 - fi - else - __wrd="${__wrd//\`/x}" - __arg="${__arg//\`/x}" - __wrd="${(Q)__wrd}" - if (( FAST_HIGHLIGHT[chrome-perl-got-eswitch] == 1 )); then - FAST_HIGHLIGHT[chrome-perl-got-eswitch]=0 - if perl -ce "$__wrd" >/dev/null 2>&1; then - # Add correct-subtle style - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}correct-subtle]}") - else - # Add incorrect-subtle style - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - fi - else - # Pass-through to the big-loop outside - return 1 - fi - fi -} - -# Add region_highlight entry (via `reply' array) -# -# This is a common place of adding such entry, but any above -# code can do it itself (and it does) and skip setting __style -# to disable this code. -[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") - -# We aren't passing-through, do obligatory things ourselves -(( this_word = next_word )) -_start_pos=$_end_pos - -return 0 - -# vim: ft=zsh sw=2 ts=2 et From fec419273d0942b8b2acc945dd04ca62471474e0 Mon Sep 17 00:00:00 2001 From: Salvydas Lukosius Date: Wed, 25 Jan 2023 06:21:39 +0000 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=E2=9A=A1=EF=B8=8F=20allow=20op?= =?UTF-8?q?tional=20|=20rm=20dups/err?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Salvydas Lukosius --- F-Sy-H.plugin.zsh | 75 +++++++++++++++++++++--------- chroma/main-chroma.ch | 2 +- share/{test => parse}/parse.zsh | 0 share/{test => parse}/to-parse.zsh | 0 4 files changed, 53 insertions(+), 24 deletions(-) rename share/{test => parse}/parse.zsh (100%) rename share/{test => parse}/to-parse.zsh (100%) diff --git a/F-Sy-H.plugin.zsh b/F-Sy-H.plugin.zsh index aa5e438..1b1415c 100755 --- a/F-Sy-H.plugin.zsh +++ b/F-Sy-H.plugin.zsh @@ -43,10 +43,11 @@ if [[ $PMSPEC != *f* ]]; then fpath+=( "${0:h}/functions" ) fi -typeset -g FAST_HIGHLIGHT_VERSION=1.66 - +# Default global variables +typeset -g FAST_HIGHLIGHT_VERSION=1.67 typeset -g FAST_BASE_DIR="${0:h}" typeset -ga _FAST_MAIN_CACHE + # Holds list of indices pointing at brackets that are complex, i.e. e.g. part of "[[" in [[ ... ]] typeset -ga _FAST_COMPLEX_BRACKETS @@ -57,7 +58,10 @@ typeset -g FAST_WORK_DIR=${FAST_WORK_DIR:-${XDG_CACHE_HOME:-~/.cache}/f-sy-h} FAST_WORK_DIR=${~FAST_WORK_DIR} # Create working directory if it doesn't exist. -[[ -w $FAST_WORK_DIR ]] || command mkdir -p "$FAST_WORK_DIR" +[[ -w $FAST_WORK_DIR ]] || command mkdir -p "$FAST_WORK_DIR" || { + print -u2 "f-sy-h: cannot create working directory $FAST_WORK_DIR" + return 1 +} # Invokes each highlighter that needs updating. # This function is supposed to be called whenever the ZLE state changes. @@ -231,7 +235,7 @@ _zsh_highlight_bind_widgets() { # Load ZSH module zsh/zleparameter, needed to override user defined widgets. zmodload zsh/zleparameter 2>/dev/null || { - print -r -- >&2 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' + builtin print -r -- >&2 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' return 1 } @@ -282,7 +286,7 @@ _zsh_highlight_bind_widgets() { zle -N -- $cur_widget _zsh_highlight_widget_$cur_widget else # Default: unhandled case. - print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget ${(qq)cur_widget}" + builtin print -r -- >&2 "zsh-syntax-highlighting: unhandled ZLE widget ${(qq)cur_widget}" fi esac done @@ -294,7 +298,7 @@ _zsh_highlight_bind_widgets() { # Try binding widgets. _zsh_highlight_bind_widgets || { - print -r -- >&2 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.' + builtin print -r -- >&2 'zsh-syntax-highlighting: failed binding ZLE widgets, exiting.' return 1 } @@ -308,11 +312,11 @@ _zsh_highlight_preexec_hook() { autoload -Uz add-zsh-hook add-zsh-hook preexec _zsh_highlight_preexec_hook 2>/dev/null || { - print -r -- >&2 'zsh-syntax-highlighting: failed loading add-zsh-hook.' + builtin print -r -- >&2 'zsh-syntax-highlighting: failed loading add-zsh-hook.' } /f-sy-h-debug() { - print -r -- "$@" >>! /tmp/reply + builtin print -r -- "$@" >>! /tmp/reply } typeset -g ZSH_HIGHLIGHT_MAXLENGTH=10000 @@ -321,18 +325,49 @@ typeset -g ZSH_HIGHLIGHT_MAXLENGTH=10000 zmodload zsh/parameter 2>/dev/null zmodload zsh/system 2>/dev/null -autoload -Uz -- is-at-least fast-theme \ +autoload -Uz -- is-at-least \ .fast-read-ini-file .fast-run-git-command \ .fast-make-targets .fast-run-command .fast-zts-read-all -autoload -Uz -- chroma/-git.ch chroma/-hub.ch chroma/-lab.ch \ - chroma/-example.ch chroma/-grep.ch chroma/-perl.ch chroma/-make.ch \ - chroma/-awk.ch chroma/-vim.ch chroma/-source.ch chroma/-sh.ch chroma/-docker.ch \ - chroma/-autoload.ch chroma/-ssh.ch chroma/-scp.ch chroma/-which.ch \ - chroma/-printf.ch chroma/-ruby.ch chroma/-whatis.ch chroma/-alias.ch \ - chroma/-subcommand.ch chroma/-autorandr.ch chroma/-nmcli.ch chroma/-fast-theme.ch \ - chroma/-node.ch chroma/-fpath_peq.ch chroma/-precommand.ch chroma/-subversion.ch \ - chroma/-ionice.ch chroma/-nice.ch chroma/main-chroma.ch chroma/-ogit.ch chroma/-zi.ch +# Disabled: chroma/-vim.ch chroma/-which.ch +autoload -Uz -- \ + chroma/-alias.ch \ + chroma/-autoload.ch \ + chroma/-autorandr.ch \ + chroma/-awk.ch \ + chroma/-docker.ch \ + chroma/-fpath_peq.ch \ + chroma/-git.ch \ + chroma/-grep.ch \ + chroma/-hub.ch \ + chroma/-ionice.ch \ + chroma/-lab.ch \ + chroma/-make.ch \ + chroma/-nice.ch \ + chroma/-nmcli.ch \ + chroma/-node.ch \ + chroma/-ogit.ch \ + chroma/-perl.ch \ + chroma/-precommand.ch \ + chroma/-printf.ch \ + chroma/-ruby.ch \ + chroma/-scp.ch \ + chroma/-sh.ch \ + chroma/-source.ch \ + chroma/-ssh.ch \ + chroma/-subcommand.ch \ + chroma/-subversion.ch \ + chroma/-whatis.ch \ + chroma/-zi.ch \ + chroma/main-chroma.ch + +if (( FAST_THEME_MANAGER_DISABLED )) { + unset '_comps[fast-theme]' 2>/dev/null + unset -f chroma/-fast-theme.ch 2>/dev/null +} else { + autoload -Uz -- fast-theme chroma/-fast-theme.ch chroma/-example.ch + alias f-sy-h=fast-theme +} source "${0:h}/functions/fast-highlight" source "${0:h}/functions/fast-string-highlight" @@ -356,7 +391,6 @@ zstyle -s :plugin:fast-syntax-highlighting theme __fsyh_theme } unset __fsyh_theme -alias f-sy-h=fast-theme -fast-highlight-fill-option-variables @@ -371,9 +405,4 @@ if [[ ! -e $FAST_WORK_DIR/secondary_theme.zsh ]] { unset theme_link } -if [[ $(uname -a) = (#i)*darwin* ]]; then - typeset -gA FAST_HIGHLIGHT - FAST_HIGHLIGHT[chroma-man]= -fi - [[ $COLORTERM == (24bit|truecolor) || ${terminfo[colors]} -eq 16777216 ]] || zmodload zsh/nearcolor &>/dev/null || true diff --git a/chroma/main-chroma.ch b/chroma/main-chroma.ch index 2691e2a..e10a9f6 100755 --- a/chroma/main-chroma.ch +++ b/chroma/main-chroma.ch @@ -16,7 +16,7 @@ (( next_word = 2 | 8192 )) chroma/main-chroma-print() { - (( FAST_HIGHLIGHT[DEBUG] )) && print "$@" >> /tmp/fsh-dbg + (( FAST_HIGHLIGHT[DEBUG] )) && print "$@" >> /tmp/fsh-dbg } local __chroma_name="${1#\%}" __first_call="$2" __wrd="$3" __start_pos="$4" __end_pos="$5" diff --git a/share/test/parse.zsh b/share/parse/parse.zsh similarity index 100% rename from share/test/parse.zsh rename to share/parse/parse.zsh diff --git a/share/test/to-parse.zsh b/share/parse/to-parse.zsh similarity index 100% rename from share/test/to-parse.zsh rename to share/parse/to-parse.zsh From 3c9ff861c1ad26118aac6ba05a88ce22093d8637 Mon Sep 17 00:00:00 2001 From: Salvydas Lukosius Date: Wed, 25 Jan 2023 06:32:05 +0000 Subject: [PATCH 4/5] [maintenance]: Upgrade trunk & Update README --- .trunk/trunk.yaml | 8 +++---- docs/README.md | 58 ++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml index 7501d46..60c6f16 100644 --- a/.trunk/trunk.yaml +++ b/.trunk/trunk.yaml @@ -1,6 +1,6 @@ version: 0.1 cli: - version: 1.3.1 + version: 1.3.2 plugins: sources: - id: trunk @@ -8,14 +8,14 @@ plugins: uri: https://github.com/trunk-io/plugins lint: enabled: - - gitleaks@8.15.2 + - gitleaks@8.15.3 - shellcheck@0.9.0 - git-diff-check - - actionlint@1.6.22 + - actionlint@1.6.23 - shfmt@3.5.0 - markdownlint@0.33.0 - oxipng@8.0.0 - - prettier@2.8.1 + - prettier@2.8.3 ignore: - linters: [ALL] paths: diff --git a/docs/README.md b/docs/README.md index 55b9564..0c347f5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,33 +1,35 @@ + Logo + ❮ Zi ❯ - F-Sy-H

Feature-rich Syntax Highlighting for Zsh

- 《❔》Ask a Question - 《💡》Search Wiki -《💜》Join -《🌐》Localize

+ 《❔ Ask a Question 》 + 《💡 Search Wiki 》 + 《💜 Join 》 + 《🌐 Localize 》 +

- - - + - -VIM + + ✅ ZUnit + + + ✅ Zsh Parse + + + ⭕ Trunk + + + VIM -Visual Studio Code


+ Visual Studio Code


- - + +


Related

  • License
  • @@ -392,16 +394,16 @@ style="color: red; background-color: black; font-weight: bold" />


    Credits

    -Trunk + + Trunk - + Crowdin | Agile localization for tech companie + -DigitalOcean Referral Badge + DigitalOcean Referral Badge + -Cloudflare + Cloudflare +

    From 57e0b71b3d234ee6e37612758ff5ab0d67b292fb Mon Sep 17 00:00:00 2001 From: Salvydas Lukosius Date: Wed, 25 Jan 2023 13:16:38 +0000 Subject: [PATCH 5/5] =?UTF-8?q?chore:=20=F0=9F=9A=80=20chromas=20tab=20 --- chroma/-docker.ch | 1 - chroma/-example.ch | 2 +- chroma/-hub.ch | 5 +- chroma/-ionice.ch | 11 +- chroma/-lab.ch | 3 +- chroma/-nice.ch | 7 +- chroma/-nmcli.ch | 79 +++-- chroma/-node.ch | 5 +- chroma/-subversion.ch | 6 +- chroma/-vim.ch | 2 +- chroma/-whatis.ch | 23 +- chroma/main-chroma.ch | 698 ++++++++++++++++++++---------------------- 12 files changed, 406 insertions(+), 436 deletions(-) diff --git a/chroma/-docker.ch b/chroma/-docker.ch index 17ffbdb..c418a6b 100755 --- a/chroma/-docker.ch +++ b/chroma/-docker.ch @@ -57,7 +57,6 @@ local -a __lines_list if [[ "${FAST_HIGHLIGHT[chroma-docker-subcommand]}" = "image" ]]; then [[ "$__wrd" != -* ]] && { (( FAST_HIGHLIGHT[chroma-docker-counter] += 1, __idx1 = FAST_HIGHLIGHT[chroma-docker-counter] )) - if (( __idx1 == 2 )); then __style=${FAST_THEME_NAME}subcommand elif (( __idx1 == 3 )); then diff --git a/chroma/-example.ch b/chroma/-example.ch index aa17e14..50e0c36 100755 --- a/chroma/-example.ch +++ b/chroma/-example.ch @@ -106,7 +106,7 @@ integer __idx1 __idx2 [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") # We aren't passing-through, do obligatory things ourselves. -# _start_pos=$_end_pos advainces pointers in command line buffer. +# _start_pos=$_end_pos advances pointers in command line buffer. # # To pass through means to `return 1'. The highlighting of # this single token is then done by fast-syntax-highlighting's diff --git a/chroma/-hub.ch b/chroma/-hub.ch index 84864c6..e9f720c 100755 --- a/chroma/-hub.ch +++ b/chroma/-hub.ch @@ -1,5 +1,6 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" @@ -50,5 +51,3 @@ if [[ "$__wrd" != -* ]] && (( FAST_HIGHLIGHT[chroma-git-got-subcommand] == 0 )); fi chroma/-git.ch $* - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-ionice.ch b/chroma/-ionice.ch index e78c7b0..4ed4a98 100755 --- a/chroma/-ionice.ch +++ b/chroma/-ionice.ch @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # ------------------------------------------------------------------------------------------------- # Copyright (c) 2018 Sebastian Gniazdowski @@ -29,7 +30,7 @@ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ------------------------------------------------------------------------------------------------- -setopt local_options extendedglob warn_create_global typeset_silent +builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local_options # Keep chroma-takever state meaning: until ;, handle highlighting via chroma. # So the below 8192 assignment takes care that next token will be routed to chroma. @@ -102,10 +103,12 @@ local -a match mbegin mend # This is a common place of adding such entry, but any above code can do # it itself (and it does in other chromas) and skip setting __style to # this way disable this code. -[[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") +[[ -n "$__style" ]] && \ + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && \ + reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") # We aren't passing-through, do obligatory things ourselves. -# _start_pos=$_end_pos advainces pointers in command line buffer. +# _start_pos=$_end_pos advances pointers in command line buffer. # # To pass through means to `return 1'. The highlighting of # this single token is then done by fast-syntax-highlighting's @@ -114,5 +117,3 @@ local -a match mbegin mend _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-lab.ch b/chroma/-lab.ch index 8dacad8..6e8cb79 100755 --- a/chroma/-lab.ch +++ b/chroma/-lab.ch @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # The `lab' tool after which this chroma is modeled after: # https://github.com/zaquestion/lab @@ -57,5 +58,3 @@ if [[ "$__wrd" != -* ]] && (( FAST_HIGHLIGHT[chroma-git-got-subcommand] == 0 )); fi chroma/-git.ch $* - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-nice.ch b/chroma/-nice.ch index 164c095..83de3d4 100755 --- a/chroma/-nice.ch +++ b/chroma/-nice.ch @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # ------------------------------------------------------------------------------------------------- # Copyright (c) 2018 Sebastian Gniazdowski @@ -29,7 +30,7 @@ # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ------------------------------------------------------------------------------------------------- -setopt local_options extendedglob warn_create_global typeset_silent +builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd # Keep chroma-takever state meaning: until ;, handle highlighting via chroma. # So the below 8192 assignment takes care that next token will be routed to chroma. @@ -126,7 +127,7 @@ local -a match mbegin mend [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") # We aren't passing-through, do obligatory things ourselves. -# _start_pos=$_end_pos advainces pointers in command line buffer. +# _start_pos=$_end_pos advances pointers in command line buffer. # # To pass through means to `return 1'. The highlighting of # this single token is then done by fast-syntax-highlighting's @@ -135,5 +136,3 @@ local -a match mbegin mend _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-nmcli.ch b/chroma/-nmcli.ch index e0df88c..cfd3ea7 100755 --- a/chroma/-nmcli.ch +++ b/chroma/-nmcli.ch @@ -1,61 +1,60 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 typeset -A subcommands local __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" subcommand subcommands=( - help "_" - general "help status hostname permissions logging _" - networking "help on off connectivity _" - radio "help all wifi wwan _" - connection "help show up down add modify clone edit delete monitor reload load import export _" - device "help status show set connect reapply modify disconnect delete monitor wifi lldp _" - agent "help secret polkit all _" - monitor "help _" - _ "_" + help "_" + general "help status hostname permissions logging _" + networking "help on off connectivity _" + radio "help all wifi wwan _" + connection "help show up down add modify clone edit delete monitor reload load import export _" + device "help status show set connect reapply modify disconnect delete monitor wifi lldp _" + agent "help secret polkit all _" + monitor "help _" + _ "_" ) if (( __first_call )); then - FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]="" - FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]="" - return 1 + FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]="" + FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]="" + return 1 elif (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 + return 1 elif [[ "$2" = -* ]]; then - return 1 + return 1 elif [[ -z ${FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]} ]]; then - for subcommand in ${(@k)subcommands}; do - [[ $subcommand = $__wrd* ]] && break || subcommand="_" - done - if [[ $subcommand = _ ]]; then - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - else - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}") - fi - FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]="$subcommand" + for subcommand in ${(@k)subcommands}; do + [[ $subcommand = $__wrd* ]] && break || subcommand="_" + done + if [[ $subcommand = _ ]]; then + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + else + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}") + fi + FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]="$subcommand" elif [[ -z ${FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]} ]]; then - for subcommand in ${(s. .)subcommands[${FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]}]}; do - [[ "$subcommand" = $__wrd* ]] && break || subcommand="_" - done - if [[ $subcommand = _ ]]; then - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") - else - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}") - fi - FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]="$subcommand" + for subcommand in ${(s. .)subcommands[${FAST_HIGHLIGHT[chroma-nmcli-subcommand-a]}]}; do + [[ "$subcommand" = $__wrd* ]] && break || subcommand="_" + done + if [[ $subcommand = _ ]]; then + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}incorrect-subtle]}") + else + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}subcommand]}") + fi + FAST_HIGHLIGHT[chroma-nmcli-subcommand-b]="$subcommand" else - return 1 + return 1 fi (( this_word = next_word )) _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-node.ch b/chroma/-node.ch index f7d2f13..07d6f2a 100755 --- a/chroma/-node.ch +++ b/chroma/-node.ch @@ -1,5 +1,6 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) [[ "$__arg_type" = 3 ]] && return 2 @@ -36,5 +37,3 @@ elif (( FAST_HIGHLIGHT[chroma-node-file] )); then fi return 1 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/-subversion.ch b/chroma/-subversion.ch index 474f188..6f38de7 100755 --- a/chroma/-subversion.ch +++ b/chroma/-subversion.ch @@ -31,7 +31,7 @@ # ------------------------------------------------------------------------------------------------- chroma/-subversion.ch/parse-revision() { - setopt local_options extendedglob warn_create_global typeset_silent + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local_options local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end case $__wrd in (r|)[0-9]##) __style=${FAST_THEME_NAME}mathnum ;; @@ -43,7 +43,7 @@ chroma/-subversion.ch/parse-revision() { } chroma/-subversion.ch/parse-target() { - setopt local_options extendedglob warn_create_global typeset_silent + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local_options local __wrd="$1" __start_pos="$2" __end_pos="$3" __style __start __end if [[ $__wrd == *@[^/]# ]] then @@ -63,7 +63,7 @@ chroma/-subversion.ch/parse-target() { fi } -setopt local_options extendedglob warn_create_global + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd local_options # Keep chroma-takever state meaning: until ;, handle highlighting via chroma. # So the below 8192 assignment takes care that next token will be routed to chroma. diff --git a/chroma/-vim.ch b/chroma/-vim.ch index 0a35cc7..134fa03 100755 --- a/chroma/-vim.ch +++ b/chroma/-vim.ch @@ -42,7 +42,7 @@ local -a __viminfo # skip setting __style to disable this code. [[ -n "$__style" ]] && (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") -# We aren't passing-through (no return 1 occured), do obligatory things ourselves. +# We aren't passing-through (no return 1 occurred), do obligatory things ourselves. (( this_word = next_word )) _start_pos=$_end_pos diff --git a/chroma/-whatis.ch b/chroma/-whatis.ch index bfe7363..e2795a3 100755 --- a/chroma/-whatis.ch +++ b/chroma/-whatis.ch @@ -1,27 +1,28 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- -# +# vim: ft=zsh sw=2 ts=2 et + (( next_word = 2 | 8192 )) local THEFD check __first_call="$1" __wrd="$2" __start_pos="$3" __end_pos="$4" local __style (( ! ${+FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]} )) && \ - FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]=0 + FAST_HIGHLIGHT[whatis_chroma_callback_was_ran]=0 (( ! ${+FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]} )) && { - is-at-least 5.0.6 && local __res=1 || local __res=0 - FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]="$__res" + is-at-least 5.0.6 && local __res=1 || local __res=0 + FAST_HIGHLIGHT[whatis_chroma_zle_-F_have_-w_opt]="$__res" } -fast-whatis-chroma-callback() { - emulate -L zsh - setopt extendedglob warncreateglobal typesetsilent + builtin emulate -L zsh ${=${options[xtrace]:#off}:+-o xtrace} + builtin setopt extended_glob warn_create_global typeset_silent no_short_loops rc_quotes no_auto_pushd - local THEFD="$1" input check=2 nl=$'\n' __wrd __style + local THEFD="$1" input check=2 nl=$'\n' __wrd __style - .fast-zts-read-all "$THEFD" input + .fast-zts-read-all "$THEFD" input - zle -F "$THEFD" - exec {THEFD}<&- + zle -F "$THEFD" + exec {THEFD}<&- __wrd="${${input#[^$nl]#$nl}%%$nl*}" if [[ "$input" = test* ]]; then @@ -133,5 +134,3 @@ fi _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et diff --git a/chroma/main-chroma.ch b/chroma/main-chroma.ch index e10a9f6..90da55d 100755 --- a/chroma/main-chroma.ch +++ b/chroma/main-chroma.ch @@ -1,4 +1,5 @@ # -*- mode: zsh; sh-indentation: 2; indent-tabs-mode: nil; sh-basic-offset: 2; -*- +# vim: ft=zsh sw=2 ts=2 et # # Main chroma function. It allows to create the command-dedicated chromas # (like -git.ch) through a definition provided by `chroma_def' array (read @@ -39,419 +40,396 @@ map=( "#" "_H" "^" "_D" "*" "_S" ) # Handler that highlights the options chroma/main-chroma-std-aopt-action() { - integer _start="$2" _end="$3" - local _scmd="$1" _wrd="$4" - - [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { - reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}") - } || { - [[ "$_wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ - __style=${FAST_THEME_NAME}single-hyphen-option - } + integer _start="$2" _end="$3" + local _scmd="$1" _wrd="$4" + + [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { + reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}") + } || { +[[ "$_wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ + __style=${FAST_THEME_NAME}single-hyphen-option + } } # Handler that highlights the options' arguments chroma/main-chroma-std-aopt-ARG-action() { - integer _start="$2" _end="$3" - local _scmd="$1" _wrd="$4" + integer _start="$2" _end="$3" + local _scmd="$1" _wrd="$4" - [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { - reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}") - } || __style=${FAST_THEME_NAME}optarg-${${${(M)_wrd:#(-|)<->}:+number}:-string} + [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { + reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}") + } || __style=${FAST_THEME_NAME}optarg-${${${(M)_wrd:#(-|)<->}:+number}:-string} } # This handler also highlights explicit arguments, i.e. --opt=the-explicit-arg chroma/main-chroma-std-aopt-SEMI-action() { - integer _start="$2" _end="$3" - local _scmd="$1" _wrd="$4" + integer _start="$2" _end="$3" + local _scmd="$1" _wrd="$4" - [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { - reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}") - reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}") - } || { + [[ "$_wrd" = (#b)(--[a-zA-Z0-9_-]##)=(*) ]] && { + reply+=("$_start $(( _end - mend[2] + mbegin[2] - 1 )) ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}double-hyphen-option]}") + reply+=("$(( _start + 1 + mend[1] )) $_end ${FAST_HIGHLIGHT_STYLES[${FAST_THEME_NAME}optarg-${${${(M)match[2]:#<->}:+number}:-string}]}") + } || { [[ "$_wrd" = --* ]] && __style=${FAST_THEME_NAME}double-hyphen-option || \ - __style=${FAST_THEME_NAME}single-hyphen-option - } + __style=${FAST_THEME_NAME}single-hyphen-option + } } # A handler which verifies the token as an GIT url chroma/main-chroma-std-verify-url() { - setopt localoptions extendedglob - local _wrd="$4" - integer url_correct=0 - # Correct matches - # Correct matches - if [[ "$_wrd" = (#b)(git|http|https|ftp|ftps|file)://([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then - url_correct=1 - elif [[ "$_wrd" = (#b)rsync://([a-zA-Z0-9._~-]##)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then - url_correct=1 - elif [[ "$_wrd" = (#b)ssh://([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then - url_correct=1 - elif [[ "$_wrd" = (#b)([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##):([a-zA-Z0-9./_~:-](#c0,1)[a-zA-Z0-9._~:-][a-zA-Z0-9./_~:-]#)(#c0,1) ]]; then - url_correct=1 - elif [[ "$_wrd" = (#b)[[:alnum:]/_~:.-]## ]]; then - url_correct=1 - fi - - (( url_correct )) && \ - { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ - { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } + setopt localoptions extendedglob + local _wrd="$4" + integer url_correct=0 + # Correct matches + # Correct matches + if [[ "$_wrd" = (#b)(git|http|https|ftp|ftps|file)://([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then + url_correct=1 + elif [[ "$_wrd" = (#b)rsync://([a-zA-Z0-9._~-]##)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then + url_correct=1 + elif [[ "$_wrd" = (#b)ssh://([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##)(:[0-9]##)(#c0,1)(/([a-zA-Z0-9./_~:-]##))(#c0,1) ]]; then + url_correct=1 + elif [[ "$_wrd" = (#b)([a-zA-Z0-9._~-]##@)(#c0,1)([a-zA-Z0-9._~-]##):([a-zA-Z0-9./_~:-](#c0,1)[a-zA-Z0-9._~:-][a-zA-Z0-9./_~:-]#)(#c0,1) ]]; then + url_correct=1 + elif [[ "$_wrd" = (#b)[[:alnum:]/_~:.-]## ]]; then + url_correct=1 + fi + + (( url_correct )) && \ + { __style=${FAST_THEME_NAME}correct-subtle; return 0; } || \ + { __style=${FAST_THEME_NAME}incorrect-subtle; return 1; } } # A handler which verifies the token as a shell wildcard chroma/main-chroma-std-verify-pattern() { - setopt localoptions extendedglob - local _wrd="$4" - __style=${FAST_THEME_NAME}globbing-ext + setopt localoptions extendedglob + local _wrd="$4" + __style=${FAST_THEME_NAME}globbing-ext } # Creates a hash table for given option set (an *_opt field in the chroma def.) chroma/main-create-OPTION-hash.ch() { - local __subcmd="$1" __option_set_id="$2" __the_hash_name="$3" __ __e __el __the_hash_name __var_name - local -a __split __sp __s - - chroma/main-chroma-print -rl "======================" " **## STARTING ##** chroma/main-##CREATE##-option-HASH.ch // subcmd:$__subcmd // option_set_id:$__option_set_id // h-nam:$__the_hash_name" - chroma/main-chroma-print "[D] Got option-set: ${(j:,:)__option_set_id}" - typeset -gA "$__the_hash_name" - chroma/main-chroma-print "[E] __the_hash_name ${__the_hash_name}:[$__option_set_id]" - - # Split on || - __ch_def_name="fsh__${__chroma_name}__chroma__def[${__option_set_id}]" - __split=( "${(P@s:||:)__ch_def_name}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() - # Remove only leading and trailing whitespace - __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - - chroma/main-chroma-print -rl "[F] Got ||-__split: _________" ${${(@)${${__split[@]##[[:space:]]##}[@]//[${__hspaces}]##/ }[@]//[${__nl}]##/$__nl}[@]//(#s)/:::} "_________" - for __el in $__split; do - __sp=( "${(@s:<<>>:)__el}" ) - [[ ${#__sp} -eq 1 && -z "${__sp[1]}" ]] && __sp=() - __sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - - chroma/main-chroma-print -l -- "Processing an ||-part - got <<>>-split: _________" "${${__sp[@]}[@]/(#s)/-\\t}" "_________" - __e="${__sp[1]}" - local __e1=${${__e#\(}%\)(:add|:del|)} - local __e2=${(M)__e##\(*\)(:add|:del)} - # Split on | with the ( and ) and :add/:del stripped and then append - # the :add or :del depending on what's on the input line - __s=() - for __ in ${(@s:|:)__e1}; do - __s+=( $__${__e2:+${(M)__e%(:add|:del)}} ) - done - [[ ${#__s} -eq 1 && -z "${__s[1]}" ]] && __s=() - __s=( "${__s[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - shift __sp - - for __ in $__s; do - __=${__%\^} - [[ "$__" = -*:(add|del) ]] && __var_name="${__the_hash_name}[${__}-directive]" || __var_name="${__the_hash_name}[${__}-opt-action]" - chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[1]}${${${#__sp}:#(0|1)}:+ +}<<" - : ${(P)__var_name::=${__sp[1]}${${${#__sp}:#(0|1)}:+ +}} - - if (( ${#__sp} >= 2 )); then - __var_name="${__the_hash_name}[${__}-opt-arg-action]" - chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[2]}<<}" - : ${(P)__var_name::=$__sp[2]} - fi - done + local __subcmd="$1" __option_set_id="$2" __the_hash_name="$3" __ __e __el __the_hash_name __var_name + local -a __split __sp __s + + chroma/main-chroma-print -rl "======================" " **## STARTING ##** chroma/main-##CREATE##-option-HASH.ch // subcmd:$__subcmd // option_set_id:$__option_set_id // h-nam:$__the_hash_name" + chroma/main-chroma-print "[D] Got option-set: ${(j:,:)__option_set_id}" + typeset -gA "$__the_hash_name" + chroma/main-chroma-print "[E] __the_hash_name ${__the_hash_name}:[$__option_set_id]" + + # Split on || + __ch_def_name="fsh__${__chroma_name}__chroma__def[${__option_set_id}]" + __split=( "${(P@s:||:)__ch_def_name}" ) + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() + # Remove only leading and trailing whitespace + __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + + chroma/main-chroma-print -rl "[F] Got ||-__split: _________" ${${(@)${${__split[@]##[[:space:]]##}[@]//[${__hspaces}]##/ }[@]//[${__nl}]##/$__nl}[@]//(#s)/:::} "_________" + for __el in $__split; do + __sp=( "${(@s:<<>>:)__el}" ) + [[ ${#__sp} -eq 1 && -z "${__sp[1]}" ]] && __sp=() + __sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + chroma/main-chroma-print -l -- "Processing an ||-part - got <<>>-split: _________" "${${__sp[@]}[@]/(#s)/-\\t}" "_________" + __e="${__sp[1]}" + local __e1=${${__e#\(}%\)(:add|:del|)} + local __e2=${(M)__e##\(*\)(:add|:del)} + # Split on | with the ( and ) and :add/:del stripped and then append + # the :add or :del depending on what's on the input line + __s=() + for __ in ${(@s:|:)__e1}; do + __s+=( $__${__e2:+${(M)__e%(:add|:del)}} ) + done + [[ ${#__s} -eq 1 && -z "${__s[1]}" ]] && __s=() + __s=( "${__s[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + shift __sp + for __ in $__s; do + __=${__%\^} + [[ "$__" = -*:(add|del) ]] && __var_name="${__the_hash_name}[${__}-directive]" || __var_name="${__the_hash_name}[${__}-opt-action]" + chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[1]}${${${#__sp}:#(0|1)}:+ +}<<" + : ${(P)__var_name::=${__sp[1]}${${${#__sp}:#(0|1)}:+ +}} + if (( ${#__sp} >= 2 )); then + __var_name="${__the_hash_name}[${__}-opt-arg-action]" + chroma/main-chroma-print "${(r:70:: :):-${__var_name}} := >>${__sp[2]}<<}" + : ${(P)__var_name::=$__sp[2]} + fi done + done } # Processes given token chroma/main-process-token.ch() { - local __subcmd="$1" __wrd="$2" __val __var_name __main_hash_name __the_hash_name __i __size - local -a __splitted __split __added + local __subcmd="$1" __wrd="$2" __val __var_name __main_hash_name __the_hash_name __i __size + local -a __splitted __split __added - chroma/main-chroma-print "\n******************* Starting chroma/main-process-token <<$__wrd>>// subcmd:${(qq)__subcmd}" - __main_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^\*])/${map[${match[1]}]}}" - __var_name="${__main_hash_name}[subcmd:$__subcmd]" + chroma/main-chroma-print "\n******************* Starting chroma/main-process-token <<$__wrd>>// subcmd:${(qq)__subcmd}" + __main_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^\*])/${map[${match[1]}]}}" + __var_name="${__main_hash_name}[subcmd:$__subcmd]" + __splitted=( "${(@s://:P)__var_name}" ) + [[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=() + __splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + + chroma/main-chroma-print -rl -- "[B] MAIN-PROCESS-TOKEN: got [OPTION/ARG-**S-E-T-S**] //-splitted from subcmd:$__subcmd: ${${(j:, :)__splitted}:-EMPTY-SET!}" "----- __splitted\\Deleted: -----" ${${(j:, :)${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (deleted)!} "----- Added\\Deleted: -----" ${${(j:, :)${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (added)!} -----\ Deleted:\ ----- ${(j:, :)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}} >> /tmp/reply + + (( ! ${#__splitted} )) && { + __var_name="${__main_hash_name}[subcmd:*]" __splitted=( "${(@s://:P)__var_name}" ) [[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=() __splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - - chroma/main-chroma-print -rl -- "[B] MAIN-PROCESS-TOKEN: got [OPTION/ARG-**S-E-T-S**] //-splitted from subcmd:$__subcmd: ${${(j:, :)__splitted}:-EMPTY-SET!}" "----- __splitted\\Deleted: -----" ${${(j:, :)${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (deleted)!} "----- Added\\Deleted: -----" ${${(j:, :)${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}}:-EMPTY-SET (added)!} -----\ Deleted:\ ----- ${(j:, :)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}} >> /tmp/reply - - (( ! ${#__splitted} )) && { - __var_name="${__main_hash_name}[subcmd:*]" - __splitted=( "${(@s://:P)__var_name}" ) - [[ ${#__splitted} -eq 1 && -z "${__splitted[1]}" ]] && __splitted=() - __splitted=( "${__splitted[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - (( ! ${#__splitted} )) && return 1 - } - - chroma/main-chroma-print -rl -- "---NO-HASH-CREATE-FROM-NOW-ON---" - - if [[ -z "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" ]]; then - chroma/main-chroma-print -rl -- "-z OPT-WITH-ARG-ACTIVE == true" - if [[ "$__wrd" = -* ]]; then - chroma/main-chroma-print "1st-PATH (-z opt-with-arg-active, non-opt-arg branch, i.e. OPTION BRANCH) [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]" - for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do - [[ "${__val}" != "${__val%%_([0-9]##|\#)##*}"_${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}_opt(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_opt(\*|\^|) ]] && { chroma/main-chroma-print "DIDN'T MATCH $__val / arg counter:${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue; } || chroma/main-chroma-print "Got candidate: $__val" - # Create the hash cache-parameter if needed - __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//(#b)([\#\^\*])/${map[${match[1]}]}}//[^a-zA-Z0-9_]/_}" - [[ "$__val" = *_opt(\*|\^|) && "${(P)+__the_hash_name}" -eq 0 ]] && chroma/main-create-OPTION-hash.ch "$__subcmd" "$__val" "$__the_hash_name" || chroma/main-chroma-print "Not creating, the hash already exists..." - # Try dedicated-entry for the option - __var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action]" - __split=( "${(@s://:P)__var_name}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() - # If no result, then try with catch-all entry - (( ! ${#__split} )) && { - chroma/main-chroma-print "% no ${(q-)${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action, retrying with *-opt-action" "|__var_name|:$__var_name" - __var_name="${__the_hash_name}[*-opt-action]" - __split=( "${(@s://:P)__var_name}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() - } - __svalue="$__var_name" - # Remove whitespace - __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - chroma/main-chroma-print -l -- "\`$__val' // ${#__split} // $__wrd: (ch.run #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]}), deref. of \`$__var_name'" - if (( ${#__split} )); then - chroma/main-chroma-print -l -- "Got split of {\$#__split:$#__split} ${__wrd}-opt-action or *-opt-action" "${${(q-)__split[@]}[@]/(#s)/->\\t}" - if [[ "${__split[2]}" = *[[:blank:]]+ ]]; then - chroma/main-chroma-print "YES handling the value (the OPT.ARGUMENT)! [${__split[2]}]" - if [[ "$__wrd" = *=* ]]; then - chroma/main-chroma-print "The-immediate Arg-Acquiring, of option" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="${__wrd#*=}" - __have_value=2 - else - chroma/main-chroma-print "Enable Arg-Awaiting, of option" - chroma/main-chroma-print "FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=\"${__svalue%-opt-action\]}-opt-arg-action]\"" - __have_value=0 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" - fi - fi - - __action="${__split[1]}" - __handler="${__split[2]%[[:blank:]]+}" - - # Check for directives (like :add) - if [[ "$__val" = *_opt\^ ]]; then - __var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}:add-directive]" - (( ${(P)+__var_name} )) && __split=( "${(@s://:P)__var_name}" ) || __split=() - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split[1]=() - __ivalue=${#__split} - __var_name="${__var_name%:add-*}:del-directive]" - (( ${(P)+__var_name} )) && __split+=( "${(@s://:P)__var_name}" ) - [[ ${#__split} -eq $(( __ivalue + 1 )) && -z "${__split[__ivalue+1]}" ]] && __split[__ivalue+1]=() - __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - __tmp=${#__split} - - # First: del-directive - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${(j: :)__split[__ivalue+1,__tmp]} " - - chroma/main-chroma-print -rl ":add / :del directives: __ivalue:$__ivalue, THE __SPLIT[#$__tmp]: " "${__split[@]}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]} >> /tmp/reply - - # Second: add-directive - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${(j: :)__split[1,__ivalue]} " - fi - [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" || __handler="" - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(1): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ "$__have_value" -ne 2 && -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl "Running action (1): $__action" ; eval "() { $__action; }"; } - [[ "$__val" != *\* ]] && break - else - chroma/main-chroma-print -rl -- "NO-MATCH ROUTE TAKEN" - fi - done + (( ! ${#__splitted} )) && return 1 + } + + chroma/main-chroma-print -rl -- "---NO-HASH-CREATE-FROM-NOW-ON---" + + if [[ -z "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" ]]; then + chroma/main-chroma-print -rl -- "-z OPT-WITH-ARG-ACTIVE == true" + if [[ "$__wrd" = -* ]]; then + chroma/main-chroma-print "1st-PATH (-z opt-with-arg-active, non-opt-arg branch, i.e. OPTION BRANCH) [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]" + for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do + [[ "${__val}" != "${__val%%_([0-9]##|\#)##*}"_${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}_opt(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_opt(\*|\^|) ]] && { chroma/main-chroma-print "DIDN'T MATCH $__val / arg counter:${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue; } || chroma/main-chroma-print "Got candidate: $__val" + # Create the hash cache-parameter if needed + __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//(#b)([\#\^\*])/${map[${match[1]}]}}//[^a-zA-Z0-9_]/_}" + [[ "$__val" = *_opt(\*|\^|) && "${(P)+__the_hash_name}" -eq 0 ]] && chroma/main-create-OPTION-hash.ch "$__subcmd" "$__val" "$__the_hash_name" || chroma/main-chroma-print "Not creating, the hash already exists..." + # Try dedicated-entry for the option + __var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action]" + __split=( "${(@s://:P)__var_name}" ) + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() + # If no result, then try with catch-all entry + (( ! ${#__split} )) && { + chroma/main-chroma-print "% no ${(q-)${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}-opt-action, retrying with *-opt-action" "|__var_name|:$__var_name" + __var_name="${__the_hash_name}[*-opt-action]" + __split=( "${(@s://:P)__var_name}" ) + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() + } + __svalue="$__var_name" + # Remove whitespace + __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + chroma/main-chroma-print -l -- "\`$__val' // ${#__split} // $__wrd: (ch.run #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]}), deref. of \`$__var_name'" + if (( ${#__split} )); then + chroma/main-chroma-print -l -- "Got split of {\$#__split:$#__split} ${__wrd}-opt-action or *-opt-action" "${${(q-)__split[@]}[@]/(#s)/->\\t}" + if [[ "${__split[2]}" = *[[:blank:]]+ ]]; then + chroma/main-chroma-print "YES handling the value (the OPT.ARGUMENT)! [${__split[2]}]" + if [[ "$__wrd" = *=* ]]; then + chroma/main-chroma-print "The-immediate Arg-Acquiring, of option" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="${__wrd#*=}" + __have_value=2 + else + chroma/main-chroma-print "Enable Arg-Awaiting, of option" + chroma/main-chroma-print "FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]=\"${__svalue%-opt-action\]}-opt-arg-action]\"" + __have_value=0 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="${__svalue%-opt-action\]}-opt-arg-action]" + fi + fi + __action="${__split[1]}" + __handler="${__split[2]%[[:blank:]]+}" + # Check for directives (like :add) + if [[ "$__val" = *_opt\^ ]]; then + __var_name="${__the_hash_name}[${${${${(M)__wrd#?*=}:+${__wrd%=*}=}:-$__wrd}}:add-directive]" + (( ${(P)+__var_name} )) && __split=( "${(@s://:P)__var_name}" ) || __split=() + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split[1]=() + __ivalue=${#__split} + __var_name="${__var_name%:add-*}:del-directive]" + (( ${(P)+__var_name} )) && __split+=( "${(@s://:P)__var_name}" ) + [[ ${#__split} -eq $(( __ivalue + 1 )) && -z "${__split[__ivalue+1]}" ]] && __split[__ivalue+1]=() + __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + __tmp=${#__split} + # First: del-directive + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${(j: :)__split[__ivalue+1,__tmp]} " + chroma/main-chroma-print -rl ":add / :del directives: __ivalue:$__ivalue, THE __SPLIT[#$__tmp]: " "${__split[@]}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]} >> /tmp/reply + # Second: add-directive + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${(j: :)__split[1,__ivalue]} " + fi + [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" || __handler="" + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(1): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ "$__have_value" -ne 2 && -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl "Running action (1): $__action" ; eval "() { $__action; }"; } + [[ "$__val" != *\* ]] && break else - chroma/main-chroma-print "1st-PATH-B (-z opt-with-arg-active, non-opt-arg branch, ARGUMENT BRANCH [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]) //// added-nodes: ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}" - for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do - [[ "${__val}" != "${__val%%_([0-9]##|\#)*}"_"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"_arg(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_arg(\*|\^|) ]] && { chroma/main-chroma-print "Continuing for $__val / arg counter ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue } - # Create the hash cache-parameter if needed - __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//\#/H}//[^a-zA-Z0-9_]/_}" - __action="" __handler="" - chroma/main-chroma-print "A hit, chosen __val:$__val!" - __ch_def_name="fsh__${__chroma_name}__chroma__def[$__val]" - __split=( "${(P@s:<<>>:)__ch_def_name}" ) - __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - - __sp=( "${(@s://:)__split[1]}" ) - __sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - __action="${__sp[1]#*::::: ##}" - - # Verify if it's the expected argument - [[ "${__sp[1]}" = *:::::* && "$__wrd" != ${~${__sp[1]%% ##:::::*}} ]] && \ - { chroma/main-chroma-print -r "mismatch ${__sp[1]%% ##:::::*} != $__wrd, continuing" ; continue; } - - chroma/main-chroma-print -l -- "Got action record for $__val, i.e. the split:" "${__sp[@]//(#s)/-\t}" "_________" - - [[ "${__sp[2]}" = ::[^[:space:]]* ]] && __handler="${__sp[2]#::}" || { [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && chroma/main-chroma-print "=== Error === In chroma definition: a handler entry ${(q)__sp[2]} without leading \`::'" ; } - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(3): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running action(3): $__action" ; eval "() { $__action; } \"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}\" \"$__start\" \"$__end\" \"$__wrd\""; } - - # Check for argument directives (like :add) - if (( ${#__split} >= 2 )); then - for __ in "${(@)__split[2,-1]}"; do - __splitted=( "${(@s://:)__}" ) - if [[ "${__splitted[1]}" = add:* ]]; then - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${__splitted[1]#add:} ${(j: :)__splitted[2,-1]} " - elif [[ "${__splitted[1]}" = del:* ]]; then - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${__splitted[1]#del:} ${(j: :)__splitted[2,-1]} " - fi - done - chroma/main-chroma-print -l "ARGUMENT :add / :del directives: THE __SPLIT[#${#__split}]: " "${__split[@]//(#s)/-\\t}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}//(#s)/-\\t} "The FAST_HIGHLIGHT[chroma-*added-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}//(#s)/-\\t} - fi - - [[ "$__val" != *\* ]] && break - done + chroma/main-chroma-print -rl -- "NO-MATCH ROUTE TAKEN" fi + done else - chroma/main-chroma-print -- "2nd-PATH (-n opt-with-arg-active) NON-EMPTY arg-active:\nThe actual opt-val <<< \$__wrd:$__wrd >>> store (after the \`Arg-Awaiting' in the chroma-run: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]-1 )) [current: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))])" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="$__wrd" - __have_value=1 - fi - - # Execute the action if not during simulated opt-argument (--opt=...) - chroma/main-chroma-print "** BEFORE: \`if (( __have_value ))'" - if (( __have_value )); then - chroma/main-chroma-print "In the \`if (( __have_value ))' [have_value: $__have_value]" - # Split - __var_name="${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="" - __split=( "${(@s://:P)__var_name}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && { chroma/main-chroma-print -rl "NULL at __var_name:$__var_name" ; __split=(); } + chroma/main-chroma-print "1st-PATH-B (-z opt-with-arg-active, non-opt-arg branch, ARGUMENT BRANCH [#${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}]) //// added-nodes: ${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}" + for __val in ${__splitted[@]:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})} ${${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}:#(${(~j:|:)${(@)=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}})}; do + [[ "${__val}" != "${__val%%_([0-9]##|\#)*}"_"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}"_arg(\*|\^|) && "${__val}" != "${__val%%_([0-9]##|\#)*}"_"#"_arg(\*|\^|) ]] && { chroma/main-chroma-print "Continuing for $__val / arg counter ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" ; continue } + # Create the hash cache-parameter if needed + __the_hash_name="fsh__chroma__${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}__${__subcmd//[^a-zA-Z0-9_]/_}__${${__val//\#/H}//[^a-zA-Z0-9_]/_}" + __action="" __handler="" + chroma/main-chroma-print "A hit, chosen __val:$__val!" + __ch_def_name="fsh__${__chroma_name}__chroma__def[$__val]" + __split=( "${(P@s:<<>>:)__ch_def_name}" ) __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - - # Remember 1st level action - (( __have_value == 2 )) && __value="$__action" || __value="" - - if (( ${#__split} )); then - chroma/main-chroma-print -l -- "Got //-split (3, for opt-ARG-action, from [$__var_name]):" "${${(q-)__split[@]}[@]/(#s)/+\\t}" - __action="${__split[1]}" - __handler="${__split[2]}" - [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" - - [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && \ - {chroma/main-chroma-print -rl -- "Running handler(2): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } - [[ -n "$__action" && "$__action" != "NO-OP" ]] && \ - { chroma/main-chroma-print -rl -- "Running action(2): $__action" ; eval "$__action"; } - chroma/main-chroma-print -rl -- "The __action value: [$__value]" - [[ "$__have_value" -eq 2 && -n "$__value" && "$__value" != "NO-OP" ]] && \ - { chroma/main-chroma-print -rl "Running action (of 1, at 2): $__value" ; eval "$__value"; } + __sp=( "${(@s://:)__split[1]}" ) + __sp=( "${__sp[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + __action="${__sp[1]#*::::: ##}" + # Verify if it's the expected argument + [[ "${__sp[1]}" = *:::::* && "$__wrd" != ${~${__sp[1]%% ##:::::*}} ]] && \ + { chroma/main-chroma-print -r "mismatch ${__sp[1]%% ##:::::*} != $__wrd, continuing" ; continue; } + chroma/main-chroma-print -l -- "Got action record for $__val, i.e. the split:" "${__sp[@]//(#s)/-\t}" "_________" + [[ "${__sp[2]}" = ::[^[:space:]]* ]] && __handler="${__sp[2]#::}" || { [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && chroma/main-chroma-print "=== Error === In chroma definition: a handler entry ${(q)__sp[2]} without leading \`::'" ; } + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running handler(3): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ -n "$__action" && "$__action" != "NO-OP" ]] && { chroma/main-chroma-print -rl -- "Running action(3): $__action" ; eval "() { $__action; } \"${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}\" \"$__start\" \"$__end\" \"$__wrd\""; } + # Check for argument directives (like :add) + if (( ${#__split} >= 2 )); then + for __ in "${(@)__split[2,-1]}"; do + __splitted=( "${(@s://:)__}" ) + if [[ "${__splitted[1]}" = add:* ]]; then + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]+="${__splitted[1]#add:} ${(j: :)__splitted[2,-1]} " + elif [[ "${__splitted[1]}" = del:* ]]; then + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]+="${__splitted[1]#del:} ${(j: :)__splitted[2,-1]} " + fi + done + chroma/main-chroma-print -l "ARGUMENT :add / :del directives: THE __SPLIT[#${#__split}]: " "${__split[@]//(#s)/-\\t}" "//" "The FAST_HIGHLIGHT[chroma-*deleted-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]}//(#s)/-\\t} "The FAST_HIGHLIGHT[chroma-*added-nodes]: " ${(@)${=FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]}//(#s)/-\\t} fi + [[ "$__val" != *\* ]] && break + done fi - chroma/main-chroma-print -- "_________ Exiting chroma/main-process-token.ch $__subcmd / $__wrd _________" + else + chroma/main-chroma-print -- "2nd-PATH (-n opt-with-arg-active) NON-EMPTY arg-active:\nThe actual opt-val <<< \$__wrd:$__wrd >>> store (after the \`Arg-Awaiting' in the chroma-run: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]-1 )) [current: #$(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] ))])" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="$__wrd" + __have_value=1 + fi + # Execute the action if not during simulated opt-argument (--opt=...) + chroma/main-chroma-print "** BEFORE: \`if (( __have_value ))'" + if (( __have_value )); then + chroma/main-chroma-print "In the \`if (( __have_value ))' [have_value: $__have_value]" + # Split + __var_name="${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="" + __split=( "${(@s://:P)__var_name}" ) + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && { chroma/main-chroma-print -rl "NULL at __var_name:$__var_name" ; __split=(); } + __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + # Remember 1st level action + (( __have_value == 2 )) && __value="$__action" || __value="" + if (( ${#__split} )); then + chroma/main-chroma-print -l -- "Got //-split (3, for opt-ARG-action, from [$__var_name]):" "${${(q-)__split[@]}[@]/(#s)/+\\t}" + __action="${__split[1]}" + __handler="${__split[2]}" + [[ "$__handler" = ::[^[:space:]]* ]] && __handler="${__handler#::}" + [[ -n "$__handler" && "$__handler" != "NO-OP" ]] && \ + {chroma/main-chroma-print -rl -- "Running handler(2): $__handler" ; "$__handler" "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]:-NULL}" "$__start" "$__end" "$__wrd"; } + [[ -n "$__action" && "$__action" != "NO-OP" ]] && \ + { chroma/main-chroma-print -rl -- "Running action(2): $__action" ; eval "$__action"; } + chroma/main-chroma-print -rl -- "The __action value: [$__value]" + [[ "$__have_value" -eq 2 && -n "$__value" && "$__value" != "NO-OP" ]] && \ + { chroma/main-chroma-print -rl "Running action (of 1, at 2): $__value" ; eval "$__value"; } + fi + fi + chroma/main-chroma-print -- "_________ Exiting chroma/main-process-token.ch $__subcmd / $__wrd _________" } # Iterates over the chroma def. fields and creates initial # fields in the fsh__${__chroma_name}__chroma__def hash chroma/-pre_process_chroma_def.ch() { - local __key __value __ke _val __the_hash_name="$1" __var_name - local -a __split - - chroma/main-chroma-print -rl -- "Starting PRE_PROCESS for __the_hash_name:$__the_hash_name" - - __ch_def_name="fsh__${__chroma_name}__chroma__def[subcommands]" - local __subcmds="${(P)__ch_def_name}" - if [[ "$__subcmds" = "::"* ]]; then - ${__subcmds#::} - __var_name="${__the_hash_name}[subcommands]" - : ${(P)__var_name::=(${(j:|:)reply})} - else - __var_name="${__the_hash_name}[subcommands]" - : ${(P)__var_name::=$__subcmds} - fi - chroma/main-chroma-print "Got SUBCOMMANDS: ${(P)__var_name}" - - __ch_def_name="fsh__${__chroma_name}__chroma__def[subcmd-hook]" - local __subcmd_hook="${(P)__ch_def_name}" - if [[ -n "$__subcmd_hook" ]]; then - __var_name="${__the_hash_name}[subcmd-hook]" - : ${(P)__var_name::=$__subcmd_hook} - fi - - __ch_def_name="fsh__${__chroma_name}__chroma__def[(I)subcmd:*]" - for __key in "${(P@)__ch_def_name}"; do - __split=( "${(@s:|:)${${__key##subcmd:\((#c0,1)}%\)}}" ) - [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() - __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) - for __ke in "${__split[@]}"; do - __var_name="${__the_hash_name}[subcmd:$__ke]" - __ch_def_name="fsh__${__chroma_name}__chroma__def[$__key]" - : ${(P)__var_name::=${(P)__ch_def_name}} - chroma/main-chroma-print -rl -- "Storred ${__var_name}=chroma_def[$__key], i.e. = ${(P)__ch_def_name}" - done + local __key __value __ke _val __the_hash_name="$1" __var_name + local -a __split + + chroma/main-chroma-print -rl -- "Starting PRE_PROCESS for __the_hash_name:$__the_hash_name" + + __ch_def_name="fsh__${__chroma_name}__chroma__def[subcommands]" + local __subcmds="${(P)__ch_def_name}" + if [[ "$__subcmds" = "::"* ]]; then + ${__subcmds#::} + __var_name="${__the_hash_name}[subcommands]" + : ${(P)__var_name::=(${(j:|:)reply})} + else + __var_name="${__the_hash_name}[subcommands]" + : ${(P)__var_name::=$__subcmds} + fi + chroma/main-chroma-print "Got SUBCOMMANDS: ${(P)__var_name}" + + __ch_def_name="fsh__${__chroma_name}__chroma__def[subcmd-hook]" + local __subcmd_hook="${(P)__ch_def_name}" + if [[ -n "$__subcmd_hook" ]]; then + __var_name="${__the_hash_name}[subcmd-hook]" + : ${(P)__var_name::=$__subcmd_hook} + fi + + __ch_def_name="fsh__${__chroma_name}__chroma__def[(I)subcmd:*]" + for __key in "${(P@)__ch_def_name}"; do + __split=( "${(@s:|:)${${__key##subcmd:\((#c0,1)}%\)}}" ) + [[ ${#__split} -eq 1 && -z "${__split[1]}" ]] && __split=() + __split=( "${__split[@]//((#s)[[:space:]]##|[[:space:]]##(#e))/}" ) + for __ke in "${__split[@]}"; do + __var_name="${__the_hash_name}[subcmd:$__ke]" + __ch_def_name="fsh__${__chroma_name}__chroma__def[$__key]" + : ${(P)__var_name::=${(P)__ch_def_name}} + chroma/main-chroma-print -rl -- "Stored ${__var_name}=chroma_def[$__key], i.e. = ${(P)__ch_def_name}" done + done } if (( __first_call )); then - chroma/-${__chroma_name}-first-call - FAST_HIGHLIGHT[chroma-current]="$__wrd" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]=0 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=0 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="" - FAST_HIGHLIGHT[chrome-${FAST_HIGHLIGHT[chroma-current]}-occurred-double-hyphen]=0 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]=1 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]="" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]="" - __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" - (( 0 == ${(P)+__the_hash_name} )) && { - typeset -gA "$__the_hash_name" - chroma/-pre_process_chroma_def.ch "$__the_hash_name" - } || chroma/main-chroma-print "...No... [\${+$__the_hash_name} ${(P)+__the_hash_name}]" - return 1 + chroma/-${__chroma_name}-first-call + FAST_HIGHLIGHT[chroma-current]="$__wrd" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]=0 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=0 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="" + FAST_HIGHLIGHT[chrome-${FAST_HIGHLIGHT[chroma-current]}-occurred-double-hyphen]=0 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]="" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-arg]="" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]=1 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-added-nodes]="" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-deleted-nodes]="" + __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" + (( 0 == ${(P)+__the_hash_name} )) && { + typeset -gA "$__the_hash_name" + chroma/-pre_process_chroma_def.ch "$__the_hash_name" + } || chroma/main-chroma-print "...No... [\${+$__the_hash_name} ${(P)+__the_hash_name}]" + return 1 else - (( ++ FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] )) - # Following call, i.e. not the first one - - # Check if chroma should end – test if token is of type - # "starts new command", if so pass-through – chroma ends - [[ "$__arg_type" = 3 ]] && return 2 - - chroma/main-chroma-print "== @@ Starting @@ #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]} Main-Chroma-call == // << __WORD:$__wrd >> ## Subcommand: ${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL} //@@// -n option-with-arg-active:${(q-)FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" - if [[ "$__wrd" = -* || -n "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" - ]]; then - chroma/main-chroma-print "## The \`if -*' i.e. \`IF OPTION' MAIN branch" + (( ++ FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr] )) + # Following call, i.e. not the first one + # Check if chroma should end – test if token is of type + # "starts new command", if so pass-through – chroma ends + [[ "$__arg_type" = 3 ]] && return 2 + chroma/main-chroma-print "== @@ Starting @@ #${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-call-nr]} Main-Chroma-call == // << __WORD:$__wrd >> ## Subcommand: ${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL} //@@// -n option-with-arg-active:${(q-)FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" + if [[ "$__wrd" = -* || -n "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-option-with-arg-active]}" + ]]; then + chroma/main-chroma-print "## The \`if -*' i.e. \`IF OPTION' MAIN branch" + chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" + else + # If at e.g. '>' or destination/source spec (of the redirection) + if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then + return 1 + elif (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand] == 0 )) { + __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" + __var_name="${__the_hash_name}[subcommands]" + if [[ "$__wrd" = ${(P)~__var_name} ]]; then + chroma/main-chroma-print "GOT-SUBCOMMAND := $__wrd, subcmd verification / OK" + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=1 + FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="$__wrd" + __var_name="${__the_hash_name}[subcmd-hook]" + (( ${(P)+__var_name} )) && { chroma/main-chroma-print -r -- "Running subcmd-hook: ${(P)__var_name}" ; "${(P)__var_name}" "$__wrd"; } + __style="${FAST_THEME_NAME}subcommand" + else + chroma/main-chroma-print "subcmd verif / NOT OK; Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" >> /tmp/fsh-dbg + (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) + chroma/main-chroma-print "UNRECOGNIZED ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" - else - # If at e.g. '>' or destination/source spec (of the redirection) - if (( in_redirection > 0 || this_word & 128 )) || [[ $__wrd == "<<<" ]]; then - return 1 - elif (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand] == 0 )) { - __the_hash_name="fsh__chroma__main__${${FAST_HIGHLIGHT[chroma-current]//[^a-zA-Z0-9_]/_}//(#b)([\#\^])/${map[${match[1]}]}}" - __var_name="${__the_hash_name}[subcommands]" - if [[ "$__wrd" = ${(P)~__var_name} ]]; then - chroma/main-chroma-print "GOT-SUBCOMMAND := $__wrd, subcmd verification / OK" - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-got-subcommand]=1 - FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]="$__wrd" - __var_name="${__the_hash_name}[subcmd-hook]" - (( ${(P)+__var_name} )) && { chroma/main-chroma-print -r -- "Running subcmd-hook: ${(P)__var_name}" ; "${(P)__var_name}" "$__wrd"; } - __style="${FAST_THEME_NAME}subcommand" - else - chroma/main-chroma-print "subcmd verif / NOT OK; Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" >> /tmp/fsh-dbg - (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) - chroma/main-chroma-print "UNRECOGNIZED ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" - chroma/main-process-token.ch "${${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}:-NULL}" "$__wrd" - fi - } else { - __wrd="${__wrd//\`/x}" - __arg="${__arg//\`/x}" - __wrd="${(Q)__wrd}" - - local __tmp_def_name="fsh__${__chroma_name}__chroma__def[subcommands-blacklist]" - if [[ ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]} = \ - (${(~j:|:)${(@s:,:)${(PA)__tmp_def_name}}}) - ]] { - return 1 - } - - chroma/main-chroma-print "Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" - (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) - chroma/main-chroma-print "ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" - - chroma/main-chroma-print "ELSE *-got-subcommand == 1 is TRUE" - chroma/main-process-token.ch "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}" "$__wrd" - } - fi + fi + } else { + __wrd="${__wrd//\`/x}" + __arg="${__arg//\`/x}" + __wrd="${(Q)__wrd}" + local __tmp_def_name="fsh__${__chroma_name}__chroma__def[subcommands-blacklist]" + if [[ ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]} = \ + (${(~j:|:)${(@s:,:)${(PA)__tmp_def_name}}}) + ]] { + return 1 + } + chroma/main-chroma-print "Incrementing the COUNTER-ARG ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]} -> $(( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] + 1 ))" + (( FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg] += 1 )) + chroma/main-chroma-print "ARGUMENT ${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-counter-arg]}" + chroma/main-chroma-print "ELSE *-got-subcommand == 1 is TRUE" + chroma/main-process-token.ch "${FAST_HIGHLIGHT[chroma-${FAST_HIGHLIGHT[chroma-current]}-subcommand]}" "$__wrd" + } + fi fi # Add region_highlight entry (via `reply' array) if [[ -n "$__style" ]]; then - (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ - && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") + (( __start=__start_pos-${#PREBUFFER}, __end=__end_pos-${#PREBUFFER}, __start >= 0 )) \ + && reply+=("$__start $__end ${FAST_HIGHLIGHT_STYLES[$__style]}") fi # We aren't passing-through, do obligatory things ourselves @@ -459,5 +437,3 @@ fi _start_pos=$_end_pos return 0 - -# vim: ft=zsh sw=2 ts=2 et

- - ❮ Zi ❯ - F-Sy-H -